@better-media/adapter-db 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,4 +18,4 @@ const db = new Kysely({ dialect: new PostgresDialect({ pool }) });
18
18
  const database = new KyselyDatabaseAdapter(db);
19
19
  ```
20
20
 
21
- For more, visit [better-media.dev/docs/adapters/db](https://better-media.dev/docs/adapters/db).
21
+ For more, visit [better-media-platform.vercel.app/docs/adapters/db](https://better-media-platform.vercel.app/docs/adapters/db).
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/memory/memory-db.adapter.ts","../src/adapters/kysely/kysely-db.adapter.ts","../src/index.ts"],"names":["runHooks","serializeData","deserializeData","sql","getColumnType"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n DatabaseAdapter,\n DatabaseTransactionAdapter,\n WhereClause,\n CreateOptions,\n FindOptions,\n UpdateOptions,\n DeleteOptions,\n CountOptions,\n} from \"@better-media/core\";\nimport type {\n DbHooks,\n BmSchema,\n FieldType,\n ModelDefinition,\n DatabaseHookContext,\n TableMetadata,\n MigrationOperation,\n} from \"@better-media/core\";\nimport { runHooks, serializeData, deserializeData } from \"@better-media/core\";\n\nexport interface MemoryDbOptions {\n schema?: BmSchema;\n hooks?: DbHooks;\n}\n\n/**\n * In-memory database adapter for development and testing.\n */\nexport class MemoryDbAdapter implements DatabaseAdapter {\n private readonly store = new Map<string, Map<string, Record<string, unknown>>>();\n private readonly schema?: BmSchema;\n private readonly hooks?: DbHooks;\n\n constructor(options?: MemoryDbOptions) {\n this.schema = options?.schema;\n this.hooks = options?.hooks;\n }\n\n private getTable(model: string): Map<string, Record<string, unknown>> {\n let table = this.store.get(model);\n if (!table) {\n table = new Map();\n this.store.set(model, table);\n }\n return table;\n }\n\n private getModelFields(model: string): Record<string, { type: FieldType }> {\n return this.schema?.[model]?.fields ?? {};\n }\n\n private getModelDefinition(model: string): ModelDefinition | undefined {\n return this.schema?.[model];\n }\n\n private getHookContext(model: string, trx?: DatabaseTransactionAdapter): DatabaseHookContext {\n return {\n model,\n adapter: this,\n transaction: trx,\n };\n }\n\n private matchCondition(record: Record<string, unknown>, condition: WhereClause[number]): boolean {\n const recordValue = record[condition.field];\n const targetValue = condition.value;\n\n switch (condition.operator) {\n case \"!=\":\n return recordValue !== targetValue;\n case \"<\":\n return Number(recordValue) < Number(targetValue);\n case \"<=\":\n return Number(recordValue) <= Number(targetValue);\n case \">\":\n return Number(recordValue) > Number(targetValue);\n case \">=\":\n return Number(recordValue) >= Number(targetValue);\n case \"in\":\n return Array.isArray(targetValue) && targetValue.includes(recordValue);\n case \"not_in\":\n return Array.isArray(targetValue) && !targetValue.includes(recordValue);\n case \"contains\":\n return typeof recordValue === \"string\" && recordValue.includes(String(targetValue));\n case \"starts_with\":\n return String(recordValue).toLowerCase().startsWith(String(targetValue).toLowerCase());\n case \"ends_with\":\n return String(recordValue).toLowerCase().endsWith(String(targetValue).toLowerCase());\n case \"like\":\n return (\n typeof recordValue === \"string\" &&\n recordValue.toLowerCase().includes(String(targetValue).toLowerCase())\n );\n case \"=\":\n default:\n return recordValue === targetValue;\n }\n }\n\n private matchesWhere(\n record: Record<string, unknown>,\n where?: WhereClause,\n model?: string,\n options?: { withDeleted?: boolean }\n ): boolean {\n const definition = model ? this.getModelDefinition(model) : undefined;\n\n // Soft delete filtering\n if (definition?.softDelete && !options?.withDeleted) {\n if (record.deletedAt !== null && record.deletedAt !== undefined) return false;\n }\n\n if (!where || where.length === 0) return true;\n\n let isMatch = true;\n for (let i = 0; i < where.length; i++) {\n const condition = where[i]!;\n const connector = i > 0 ? (where[i - 1]?.connector ?? \"AND\") : \"AND\";\n const conditionMatches = this.matchCondition(record, condition);\n\n if (connector === \"OR\") {\n isMatch = isMatch || conditionMatches;\n } else {\n isMatch = isMatch && conditionMatches;\n }\n }\n\n return isMatch;\n }\n\n async create<T extends Record<string, unknown>>(options: CreateOptions<T>): Promise<T> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n let dataToInsert = options.data as Record<string, unknown>;\n dataToInsert = await runHooks.beforeCreate(this.hooks, dataToInsert, context);\n\n if (!dataToInsert.id) {\n throw new Error(\"MemoryDbAdapter requires 'id' in data for create operations\");\n }\n\n const serializedData = serializeData(fields, dataToInsert);\n const clonedData = JSON.parse(JSON.stringify(serializedData));\n table.set(String(clonedData.id), clonedData);\n\n const resultRecord = deserializeData(fields, clonedData) as T;\n await runHooks.afterCreate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n private populateRecord(\n record: Record<string, unknown>,\n model: string,\n populate: string[]\n ): Record<string, unknown> {\n const result = JSON.parse(JSON.stringify(record));\n const sortedPopulate = [...populate].sort((a, b) => a.split(\".\").length - b.split(\".\").length);\n\n for (const path of sortedPopulate) {\n const parts = path.split(\".\");\n let currentObj = result;\n let currentModel = model;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n const fieldDef = this.schema?.[currentModel]?.fields[part];\n\n if (fieldDef?.references) {\n const relatedTable = this.getTable(fieldDef.references.model);\n const localValue = currentObj[part];\n if (localValue === undefined || localValue === null) break;\n\n // If already populated (e.g. by a previous path segment), use that\n const relatedId = typeof localValue === \"object\" ? localValue.id : localValue;\n const relatedRecord = relatedTable.get(String(relatedId));\n\n if (relatedRecord) {\n currentObj[part] = JSON.parse(JSON.stringify(relatedRecord));\n currentModel = fieldDef.references.model;\n currentObj = currentObj[part];\n } else {\n break;\n }\n } else {\n break;\n }\n }\n }\n return result;\n }\n\n async findOne<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T | null> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n\n for (const record of table.values()) {\n if (\n this.matchesWhere(record, options.where, options.model, {\n withDeleted: options.withDeleted,\n })\n ) {\n let result = record;\n if (options.populate) {\n result = this.populateRecord(record, options.model, options.populate);\n }\n return deserializeData(fields, JSON.parse(JSON.stringify(result))) as T;\n }\n }\n return null;\n }\n\n async findMany<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T[]> {\n const table = this.getTable(options.model);\n let results: T[] = [];\n\n for (const record of table.values()) {\n if (\n this.matchesWhere(record, options.where, options.model, {\n withDeleted: options.withDeleted,\n })\n ) {\n results.push(JSON.parse(JSON.stringify(record)) as T);\n }\n }\n\n if (options.sortBy) {\n const { field, direction } = options.sortBy;\n results.sort((a, b) => {\n const valA = a[field] as string | number;\n const valB = b[field] as string | number;\n if (valA < valB) return direction === \"asc\" ? -1 : 1;\n if (valA > valB) return direction === \"asc\" ? 1 : -1;\n return 0;\n });\n }\n\n if (options.offset) results = results.slice(options.offset);\n if (options.limit) results = results.slice(0, options.limit);\n\n return results;\n }\n\n async update<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<T | null> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n const target = await this.findOne({ model: options.model, where: options.where });\n if (!target) return null;\n\n let updatedData = { ...target, ...(options.update as Record<string, unknown>) };\n updatedData = await runHooks.beforeUpdate(this.hooks, updatedData, context);\n\n const serializedUpdate = serializeData(fields, updatedData);\n const mergedData = { ...target, ...serializedUpdate };\n\n const clonedData = JSON.parse(JSON.stringify(mergedData));\n table.set(String(target.id), clonedData);\n\n const resultRecord = deserializeData(fields, clonedData) as T;\n await runHooks.afterUpdate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async updateMany<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<number> {\n const targets = await this.findMany({ model: options.model, where: options.where });\n for (const target of targets) {\n await this.update({\n model: options.model,\n where: [{ field: \"id\", value: target.id }],\n update: options.update,\n });\n }\n return targets.length;\n }\n\n async delete(options: DeleteOptions): Promise<void> {\n const context = this.getHookContext(options.model);\n const definition = this.getModelDefinition(options.model);\n\n await runHooks.beforeDelete(this.hooks, options.where, context);\n\n if (definition?.softDelete) {\n await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n } else {\n const table = this.getTable(options.model);\n const targets = await this.findMany({ model: options.model, where: options.where });\n for (const target of targets) {\n table.delete(String(target.id));\n }\n }\n\n await runHooks.afterDelete(this.hooks, options.where, context);\n }\n\n async deleteMany(options: DeleteOptions): Promise<number> {\n const targets = await this.findMany({ model: options.model, where: options.where });\n await this.delete(options);\n return targets.length;\n }\n\n async count(options: CountOptions): Promise<number> {\n const results = await this.findMany({ ...options, limit: undefined, offset: undefined });\n return results.length;\n }\n\n clear(): void {\n this.store.clear();\n }\n\n async raw<T = unknown>(query: string): Promise<T> {\n if (query === \"clear\") {\n this.clear();\n return true as unknown as T;\n }\n throw new Error(\"MemoryDbAdapter only supports 'clear' as raw query.\");\n }\n\n async transaction<R>(callback: (trx: DatabaseTransactionAdapter) => Promise<R>): Promise<R> {\n return await callback(this as unknown as DatabaseTransactionAdapter);\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __getMetadata(): Promise<TableMetadata[]> {\n const metadata: TableMetadata[] = [];\n for (const [tableName, table] of this.store.entries()) {\n const columns = new Set<string>();\n for (const record of table.values()) {\n Object.keys(record).forEach((k) => columns.add(k));\n }\n metadata.push({\n name: tableName,\n columns: Array.from(columns).map((name) => ({\n name,\n dataType: \"text\",\n isNullable: true,\n })),\n });\n }\n return metadata;\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __executeMigration(operation: MigrationOperation): Promise<void> {\n if (operation.type === \"createTable\") {\n this.getTable(operation.table);\n }\n // Other operations are implicitly handled by the schemaless nature of MemoryDbAdapter\n }\n}\n","import { Kysely, sql } from \"kysely\";\nimport type {\n DatabaseAdapter,\n DatabaseTransactionAdapter,\n WhereClause,\n CreateOptions,\n FindOptions,\n UpdateOptions,\n DeleteOptions,\n CountOptions,\n} from \"@better-media/core\";\nimport type {\n FieldType,\n FieldDefinition,\n BmSchema,\n DbHooks,\n DatabaseHookContext,\n ModelDefinition,\n MigrationOperation,\n SqlDialect,\n TableMetadata,\n} from \"@better-media/core\";\nimport { serializeData, deserializeData, runHooks, getColumnType } from \"@better-media/core\";\nimport type { KyselyDbConfig } from \"./kysely-db-config.interface\";\n\nexport interface KyselyDbOptions {\n config: KyselyDbConfig;\n schema: BmSchema;\n hooks?: DbHooks;\n}\n\nexport type DbSchema = Record<string, Record<string, unknown>>;\n\ntype AnyFunction = (...args: unknown[]) => unknown;\n\ntype KyselyBuilder = {\n where: (field: string, op: string, value: unknown) => KyselyBuilder;\n orWhere: (field: string, op: string, value: unknown) => KyselyBuilder;\n select: (fields: unknown) => KyselyBuilder;\n selectAll: () => KyselyBuilder;\n leftJoin: (table: string, left: string, right: string) => KyselyBuilder;\n orderBy: (field: string, direction: string) => KyselyBuilder;\n limit: (n: number) => KyselyBuilder;\n offset: (n: number) => KyselyBuilder;\n set: (data: Record<string, unknown>) => KyselyBuilder;\n values: (data: Record<string, unknown>) => KyselyBuilder;\n returningAll: () => KyselyBuilder;\n execute: () => Promise<unknown[] & { numUpdatedRows?: number; numDeletedRows?: number }>;\n executeTakeFirst: () => Promise<unknown>;\n};\n\n/**\n * SQL database adapter using Kysely.\n */\nexport class KyselyDbAdapter implements DatabaseAdapter {\n private readonly db: Kysely<DbSchema>;\n private readonly config: KyselyDbConfig;\n private readonly schema: BmSchema;\n private readonly hooks?: DbHooks;\n\n constructor(db: Kysely<DbSchema>, options: KyselyDbOptions) {\n this.db = db;\n this.config = options.config;\n this.schema = options.schema;\n this.hooks = options.hooks;\n }\n\n private getModelFields(model: string): Record<string, { type: FieldType }> {\n return this.schema[model]?.fields ?? {};\n }\n\n private getModelDefinition(model: string): ModelDefinition | undefined {\n return this.schema[model];\n }\n\n private getHookContext(model: string, trx?: DatabaseTransactionAdapter): DatabaseHookContext {\n return {\n model,\n adapter: this,\n transaction: trx,\n };\n }\n\n private applyWhere(\n qb: KyselyBuilder,\n where?: WhereClause,\n model?: string,\n options?: { withDeleted?: boolean }\n ): KyselyBuilder {\n let currentQb = qb;\n const definition = model ? this.getModelDefinition(model) : undefined;\n\n // Soft delete filtering\n if (definition?.softDelete && !options?.withDeleted) {\n currentQb = currentQb.where(\"deletedAt\", \"is\", null);\n }\n\n if (!where || where.length === 0) return currentQb;\n\n for (let i = 0; i < where.length; i++) {\n const condition = where[i];\n if (!condition) continue;\n\n const connector = i > 0 ? (where[i - 1]?.connector ?? \"AND\") : \"AND\";\n const field = condition.field;\n let operator = condition.operator ?? \"=\";\n let value = condition.value;\n\n if (operator === \"contains\") {\n operator = \"like\";\n value = `%${value}%`;\n } else if (operator === \"starts_with\") {\n operator = \"like\";\n value = `${value}%`;\n } else if (operator === \"ends_with\") {\n operator = \"like\";\n value = `%${value}`;\n } else if (operator === \"not_in\") {\n operator = \"not in\" as \"in\";\n }\n\n const method = (connector === \"OR\" ? \"orWhere\" : \"where\") as keyof KyselyBuilder;\n currentQb = (currentQb[method] as AnyFunction)(field, operator, value) as KyselyBuilder;\n }\n\n return currentQb;\n }\n\n async create<T extends Record<string, unknown>>(options: CreateOptions<T>): Promise<T> {\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n let dataToInsert = options.data as Record<string, unknown>;\n dataToInsert = await runHooks.beforeCreate(this.hooks, dataToInsert, context);\n\n const serializedData = serializeData(fields, dataToInsert);\n let resultRecord: T;\n\n if (this.config.provider === \"sqlite\") {\n await (this.db.insertInto(options.model) as unknown as KyselyBuilder)\n .values(serializedData)\n .execute();\n\n const refetched = await (this.db.selectFrom(options.model) as unknown as KyselyBuilder)\n .selectAll()\n .where(\"id\", \"=\", serializedData.id)\n .executeTakeFirst();\n\n resultRecord = deserializeData(\n fields,\n (refetched as Record<string, unknown>) || serializedData\n ) as T;\n } else {\n const result =\n (await (this.db.insertInto(options.model) as unknown as KyselyBuilder)\n .values(serializedData)\n .returningAll()\n .executeTakeFirst()) || serializedData;\n\n resultRecord = deserializeData(fields, result as Record<string, unknown>) as T;\n }\n\n await runHooks.afterCreate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async findOne<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T | null> {\n const fields = this.getModelFields(options.model);\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n\n if (options.select) {\n qb = qb.select(options.select);\n } else {\n qb = qb.selectAll();\n }\n\n qb = this.applyWhere(qb, options.where, options.model, { withDeleted: options.withDeleted });\n\n if (options.populate) {\n // Basic population via left joins if references exist\n for (const relation of options.populate) {\n const fieldDef = this.schema[options.model]?.fields[relation];\n if (fieldDef?.references) {\n qb = qb.leftJoin(\n fieldDef.references.model,\n `${options.model}.${relation}`,\n `${fieldDef.references.model}.${fieldDef.references.field}`\n );\n }\n }\n }\n\n const result = await qb.executeTakeFirst();\n if (!result) return null;\n\n return deserializeData(fields, result as Record<string, unknown>) as T;\n }\n\n async findMany<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T[]> {\n const fields = this.getModelFields(options.model);\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n\n if (options.select) {\n qb = qb.select(options.select);\n } else {\n qb = qb.selectAll();\n }\n\n qb = this.applyWhere(qb, options.where, options.model, { withDeleted: options.withDeleted });\n\n if (options.sortBy) {\n qb = qb.orderBy(options.sortBy.field, options.sortBy.direction);\n }\n\n if (options.limit !== undefined) qb = qb.limit(options.limit);\n if (options.offset !== undefined) qb = qb.offset(options.offset);\n\n const results = await (qb as { execute: AnyFunction }).execute();\n return (results as Record<string, unknown>[]).map((row) => deserializeData(fields, row)) as T[];\n }\n\n async update<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<T | null> {\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n // We still need the current record for hooks (merging data)\n const target = await this.findOne({ model: options.model, where: options.where });\n if (!target) return null;\n\n let updatedData = { ...target, ...(options.update as Record<string, unknown>) };\n updatedData = await runHooks.beforeUpdate(this.hooks, updatedData, context);\n\n const updatePayload = serializeData(fields, options.update as Record<string, unknown>);\n\n let qb = (this.db.updateTable(options.model) as unknown as KyselyBuilder).set(updatePayload);\n qb = this.applyWhere(qb, options.where, options.model);\n\n let resultRecord: T;\n if (this.config.provider === \"sqlite\") {\n await qb.execute();\n resultRecord = deserializeData(fields, serializeData(fields, updatedData)) as T;\n } else {\n const result = await (qb as unknown as KyselyBuilder).returningAll().executeTakeFirst();\n resultRecord = deserializeData(\n fields,\n (result as Record<string, unknown>) || serializeData(fields, updatedData)\n ) as T;\n }\n\n await runHooks.afterUpdate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async updateMany<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<number> {\n const fields = this.getModelFields(options.model);\n const updatePayload = serializeData(fields, options.update as Record<string, unknown>);\n\n let qb = (this.db.updateTable(options.model) as unknown as KyselyBuilder).set(updatePayload);\n qb = this.applyWhere(\n qb as unknown as KyselyBuilder,\n options.where,\n options.model\n ) as KyselyBuilder;\n\n const results = (await qb.execute()) as unknown as { numUpdatedRows: bigint | number }[];\n return Number(results[0]?.numUpdatedRows || 0);\n }\n\n async delete(options: DeleteOptions): Promise<void> {\n const context = this.getHookContext(options.model);\n const definition = this.getModelDefinition(options.model);\n\n await runHooks.beforeDelete(this.hooks, options.where, context);\n\n if (definition?.softDelete) {\n await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n } else {\n let qb = this.db.deleteFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n await qb.execute();\n }\n\n await runHooks.afterDelete(this.hooks, options.where, context);\n }\n\n async deleteMany(options: DeleteOptions): Promise<number> {\n const definition = this.getModelDefinition(options.model);\n\n if (definition?.softDelete) {\n return await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n }\n\n let qb = this.db.deleteFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n\n const results = (await qb.execute()) as unknown as { numDeletedRows: bigint | number }[];\n return Number(results[0]?.numDeletedRows || 0);\n }\n\n async count(options: CountOptions): Promise<number> {\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n\n const { count } = this.db.fn as unknown as {\n count: (f: string) => { as: (a: string) => unknown };\n };\n qb = qb.select(count(\"id\").as(\"c\"));\n\n const result = (await qb.executeTakeFirst()) as { c: string | number } | undefined;\n return Number(result?.c || 0);\n }\n\n async raw<T = unknown>(query: string, params?: unknown[]): Promise<T> {\n const result = await (\n sql as unknown as {\n raw: (q: string, p: unknown) => { execute: (db: unknown) => Promise<{ rows: T }> };\n }\n )\n .raw(query, params)\n .execute(this.db);\n return result.rows;\n }\n\n async transaction<R>(callback: (trx: DatabaseTransactionAdapter) => Promise<R>): Promise<R> {\n return (await (\n this.db.transaction() as unknown as {\n execute: (cb: (trx: Kysely<DbSchema>) => Promise<R>) => Promise<R>;\n }\n ).execute(async (trx) => {\n const trxAdapter = new KyselyDbAdapter(trx, {\n config: this.config,\n schema: this.schema,\n hooks: this.hooks,\n });\n return await callback(trxAdapter);\n })) as R;\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __getMetadata(): Promise<TableMetadata[]> {\n const tables = await this.db.introspection.getTables();\n const dialect = this.__getDialect();\n\n let filtered = tables;\n if (dialect === \"postgres\") {\n const currentSchema = await this.getPostgresSchema();\n filtered = tables.filter((table) => {\n const schema = (table as unknown as { schema?: string }).schema;\n return !schema || schema === currentSchema;\n });\n }\n\n return filtered.map((table) => ({\n name: table.name,\n columns: table.columns.map((col) => ({\n name: col.name,\n dataType: col.dataType,\n isNullable: col.isNullable ?? true,\n })),\n }));\n }\n\n private async getPostgresSchema(): Promise<string> {\n try {\n const result = await sql<{\n search_path?: string;\n searchPath?: string;\n }>`SHOW search_path`.execute(this.db);\n const searchPath = result.rows[0]?.search_path ?? result.rows[0]?.searchPath;\n if (!searchPath) return \"public\";\n const schemas = searchPath\n .split(\",\")\n .map((s) => s.trim())\n .map((s) => s.replace(/^[\"']|[\"']$/g, \"\"))\n .filter((s) => !s.startsWith(\"$\") && !s.startsWith(\"\\\\$\"));\n return schemas[0] || \"public\";\n } catch {\n return \"public\";\n }\n }\n\n /** @internal Used by runMigrations to auto-detect the SQL dialect. */\n __getDialect(): SqlDialect {\n switch (this.config.provider) {\n case \"pg\":\n return \"postgres\";\n case \"mysql\":\n return \"mysql\";\n case \"sqlite\":\n return \"sqlite\";\n default:\n return \"postgres\";\n }\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __executeMigration(operation: MigrationOperation): Promise<void> {\n const dialect = this.__getDialect();\n\n if (operation.type === \"createTable\") {\n let builder = this.db.schema.createTable(operation.table).ifNotExists();\n\n for (const [name, field] of Object.entries(operation.definition.fields) as [\n string,\n FieldDefinition,\n ][]) {\n const type = getColumnType(field, dialect);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n builder = builder.addColumn(name, type as any, (col: any) => {\n if (field.primaryKey) col = col.primaryKey();\n if (field.required) col = col.notNull();\n if (field.unique) col = col.unique();\n if (field.references) {\n col = col\n .references(`${field.references.model}.${field.references.field}`)\n .onDelete(field.references.onDelete || \"cascade\");\n }\n return col;\n });\n }\n await builder.execute();\n\n // Create indexes\n if (operation.definition.indexes) {\n for (const index of operation.definition.indexes) {\n const indexName = `idx_${operation.table}_${index.fields.join(\"_\")}`;\n let indexBuilder = this.db.schema\n .createIndex(indexName)\n .on(operation.table)\n .columns(index.fields);\n if (index.unique) {\n indexBuilder = indexBuilder.unique();\n }\n await indexBuilder.execute();\n }\n }\n } else if (operation.type === \"addColumn\") {\n const type = getColumnType(operation.definition, dialect);\n await this.db.schema\n .alterTable(operation.table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .addColumn(operation.field, type as any, (col: any) => {\n if (operation.definition.required) col = col.notNull();\n if (operation.definition.unique) col = col.unique();\n if (operation.definition.references) {\n col = col\n .references(\n `${operation.definition.references.model}.${operation.definition.references.field}`\n )\n .onDelete(operation.definition.references.onDelete || \"cascade\");\n }\n return col;\n })\n .execute();\n } else if (operation.type === \"createIndex\") {\n let builder = this.db.schema\n .createIndex(operation.name)\n .on(operation.table)\n .columns(operation.fields);\n if (operation.unique) {\n builder = builder.unique();\n }\n await builder.execute();\n }\n }\n}\n","// Types and schemas are now exported from \"better-media\" directly.\nexport * from \"./adapters/memory/memory-db.adapter\";\nexport * from \"./adapters/kysely/kysely-db.adapter\";\n// MongoDB implementation lives in @better-media/mongodb-adapter; re-exported here for convenience.\nexport * from \"./adapters/mongodb/index\";\nexport type { KyselyDbConfig } from \"./adapters/kysely/kysely-db-config.interface\";\n\n// Backwards compatibility for the old memoryDatabase export\nimport { MemoryDbAdapter } from \"./adapters/memory/memory-db.adapter\";\nimport type { DatabaseAdapter } from \"@better-media/core\";\n\nexport function memoryDatabase(): DatabaseAdapter {\n // Return a proxy that supports the new DatabaseAdapter interface + the old get/put methods\n // for the legacy adapters that haven't been migrated to the new schema-driven architecture yet.\n const adapter = new MemoryDbAdapter();\n return new Proxy(adapter, {\n get(target, prop, receiver) {\n if (prop === \"get\") {\n return async (key: string) => {\n const res = await adapter.findOne({\n model: \"legacy\",\n where: [{ field: \"id\", value: key }],\n });\n return res;\n };\n }\n if (prop === \"put\") {\n return async (key: string, data: Record<string, unknown>) => {\n await adapter.create({ model: \"legacy\", data: { id: key, ...data } });\n };\n }\n if (prop === \"delete\") {\n return async (key: string) => {\n await adapter.delete({ model: \"legacy\", where: [{ field: \"id\", value: key }] });\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/memory/memory-db.adapter.ts","../src/adapters/kysely/kysely-db.adapter.ts","../src/index.ts"],"names":["runHooks","serializeData","deserializeData","sql","getColumnType"],"mappings":";;;;;;;AA6BO,IAAM,kBAAN,MAAiD;AAAA,EACrC,KAAA,uBAAY,GAAA,EAAkD;AAAA,EAC9D,MAAA;AAAA,EACA,KAAA;AAAA,EAEjB,YAAY,OAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,SAAS,OAAA,EAAS,MAAA;AACvB,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAS,KAAA;AAAA,EACxB;AAAA,EAEQ,SAAS,KAAA,EAAqD;AACpE,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAA;AAChC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,uBAAY,GAAA,EAAI;AAChB,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,eAAe,KAAA,EAAoD;AACzE,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,KAAK,CAAA,EAAG,UAAU,EAAC;AAAA,EAC1C;AAAA,EAEQ,mBAAmB,KAAA,EAA4C;AACrE,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC5B;AAAA,EAEQ,cAAA,CAAe,OAAe,GAAA,EAAuD;AAC3F,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEQ,cAAA,CAAe,QAAiC,SAAA,EAAyC;AAC/F,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA;AAC1C,IAAA,MAAM,cAAc,SAAA,CAAU,KAAA;AAE9B,IAAA,QAAQ,UAAU,QAAA;AAAU,MAC1B,KAAK,IAAA;AACH,QAAA,OAAO,WAAA,KAAgB,WAAA;AAAA,MACzB,KAAK,GAAA;AACH,QAAA,OAAO,MAAA,CAAO,WAAW,CAAA,GAAI,MAAA,CAAO,WAAW,CAAA;AAAA,MACjD,KAAK,IAAA;AACH,QAAA,OAAO,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA;AAAA,MAClD,KAAK,GAAA;AACH,QAAA,OAAO,MAAA,CAAO,WAAW,CAAA,GAAI,MAAA,CAAO,WAAW,CAAA;AAAA,MACjD,KAAK,IAAA;AACH,QAAA,OAAO,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA;AAAA,MAClD,KAAK,IAAA;AACH,QAAA,OAAO,MAAM,OAAA,CAAQ,WAAW,CAAA,IAAK,WAAA,CAAY,SAAS,WAAW,CAAA;AAAA,MACvE,KAAK,QAAA;AACH,QAAA,OAAO,MAAM,OAAA,CAAQ,WAAW,KAAK,CAAC,WAAA,CAAY,SAAS,WAAW,CAAA;AAAA,MACxE,KAAK,UAAA;AACH,QAAA,OAAO,OAAO,WAAA,KAAgB,QAAA,IAAY,YAAY,QAAA,CAAS,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,MACpF,KAAK,aAAA;AACH,QAAA,OAAO,MAAA,CAAO,WAAW,CAAA,CAAE,WAAA,EAAY,CAAE,WAAW,MAAA,CAAO,WAAW,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,MACvF,KAAK,WAAA;AACH,QAAA,OAAO,MAAA,CAAO,WAAW,CAAA,CAAE,WAAA,EAAY,CAAE,SAAS,MAAA,CAAO,WAAW,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,MACrF,KAAK,MAAA;AACH,QAAA,OACE,OAAO,WAAA,KAAgB,QAAA,IACvB,WAAA,CAAY,WAAA,EAAY,CAAE,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA,CAAE,WAAA,EAAa,CAAA;AAAA,MAExE,KAAK,GAAA;AAAA,MACL;AACE,QAAA,OAAO,WAAA,KAAgB,WAAA;AAAA;AAC3B,EACF;AAAA,EAEQ,YAAA,CACN,MAAA,EACA,KAAA,EACA,KAAA,EACA,OAAA,EACS;AACT,IAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA,GAAI,MAAA;AAG5D,IAAA,IAAI,UAAA,EAAY,UAAA,IAAc,CAAC,OAAA,EAAS,WAAA,EAAa;AACnD,MAAA,IAAI,OAAO,SAAA,KAAc,IAAA,IAAQ,MAAA,CAAO,SAAA,KAAc,QAAW,OAAO,KAAA;AAAA,IAC1E;AAEA,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,IAAA;AAEzC,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,MAAM,SAAA,GAAY,IAAI,CAAA,GAAK,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,aAAa,KAAA,GAAS,KAAA;AAC/D,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,SAAS,CAAA;AAE9D,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,OAAA,GAAU,OAAA,IAAW,gBAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,OAAA,GAAU,OAAA,IAAW,gBAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAA0C,OAAA,EAAuC;AACrF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAEjD,IAAA,IAAI,eAAe,OAAA,CAAQ,IAAA;AAC3B,IAAA,YAAA,GAAe,MAAMA,aAAA,CAAS,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,cAAc,OAAO,CAAA;AAE5E,IAAA,IAAI,CAAC,aAAa,EAAA,EAAI;AACpB,MAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,IAC/E;AAEA,IAAA,MAAM,cAAA,GAAiBC,kBAAA,CAAc,MAAA,EAAQ,YAAY,CAAA;AACzD,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,cAAc,CAAC,CAAA;AAC5D,IAAA,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,UAAA,CAAW,EAAE,GAAG,UAAU,CAAA;AAE3C,IAAA,MAAM,YAAA,GAAeC,oBAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA;AACvD,IAAA,MAAMF,aAAA,CAAS,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,cAAyC,OAAO,CAAA;AACvF,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEQ,cAAA,CACN,MAAA,EACA,KAAA,EACA,QAAA,EACyB;AACzB,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAChD,IAAA,MAAM,iBAAiB,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,EAAE,KAAA,CAAM,GAAG,EAAE,MAAM,CAAA;AAE7F,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,MAAA,IAAI,UAAA,GAAa,MAAA;AACjB,MAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,MAAM,WAAW,IAAA,CAAK,MAAA,GAAS,YAAY,CAAA,EAAG,OAAO,IAAI,CAAA;AAEzD,QAAA,IAAI,UAAU,UAAA,EAAY;AACxB,UAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,WAAW,KAAK,CAAA;AAC5D,UAAA,MAAM,UAAA,GAAa,WAAW,IAAI,CAAA;AAClC,UAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,KAAe,IAAA,EAAM;AAGrD,UAAA,MAAM,SAAA,GAAY,OAAO,UAAA,KAAe,QAAA,GAAW,WAAW,EAAA,GAAK,UAAA;AACnE,UAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA;AAExD,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,UAAA,CAAW,IAAI,CAAA,GAAI,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA;AAC3D,YAAA,YAAA,GAAe,SAAS,UAAA,CAAW,KAAA;AACnC,YAAA,UAAA,GAAa,WAAW,IAAI,CAAA;AAAA,UAC9B,CAAA,MAAO;AACL,YAAA;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAA2C,OAAA,EAA4C;AAC3F,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAEhD,IAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,MAAA,EAAO,EAAG;AACnC,MAAA,IACE,KAAK,YAAA,CAAa,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAO,QAAQ,KAAA,EAAO;AAAA,QACtD,aAAa,OAAA,CAAQ;AAAA,OACtB,CAAA,EACD;AACA,QAAA,IAAI,MAAA,GAAS,MAAA;AACb,QAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,UAAA,MAAA,GAAS,KAAK,cAAA,CAAe,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAAA,QACtE;AACA,QAAA,OAAOE,oBAAA,CAAgB,QAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAU,MAAM,CAAC,CAAC,CAAA;AAAA,MACnE;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAA4C,OAAA,EAAuC;AACvF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,IAAI,UAAe,EAAC;AAEpB,IAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,MAAA,EAAO,EAAG;AACnC,MAAA,IACE,KAAK,YAAA,CAAa,MAAA,EAAQ,OAAA,CAAQ,KAAA,EAAO,QAAQ,KAAA,EAAO;AAAA,QACtD,aAAa,OAAA,CAAQ;AAAA,OACtB,CAAA,EACD;AACA,QAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAU,MAAM,CAAC,CAAM,CAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,OAAA,CAAQ,MAAA;AACrC,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,QAAA,MAAM,IAAA,GAAO,EAAE,KAAK,CAAA;AACpB,QAAA,MAAM,IAAA,GAAO,EAAE,KAAK,CAAA;AACpB,QAAA,IAAI,IAAA,GAAO,IAAA,EAAM,OAAO,SAAA,KAAc,QAAQ,EAAA,GAAK,CAAA;AACnD,QAAA,IAAI,IAAA,GAAO,IAAA,EAAM,OAAO,SAAA,KAAc,QAAQ,CAAA,GAAI,EAAA;AAClD,QAAA,OAAO,CAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,QAAQ,MAAM,CAAA;AAC1D,IAAA,IAAI,QAAQ,KAAA,EAAO,OAAA,GAAU,QAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,KAAK,CAAA;AAE3D,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAA0C,OAAA,EAA8C;AAC5F,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAEjD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAChF,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,IAAI,cAAc,EAAE,GAAG,MAAA,EAAQ,GAAI,QAAQ,MAAA,EAAmC;AAC9E,IAAA,WAAA,GAAc,MAAMF,aAAA,CAAS,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,aAAa,OAAO,CAAA;AAE1E,IAAA,MAAM,gBAAA,GAAmBC,kBAAA,CAAc,MAAA,EAAQ,WAAW,CAAA;AAC1D,IAAA,MAAM,UAAA,GAAa,EAAE,GAAG,MAAA,EAAQ,GAAG,gBAAA,EAAiB;AAEpD,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AACxD,IAAA,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,EAAE,GAAG,UAAU,CAAA;AAEvC,IAAA,MAAM,YAAA,GAAeC,oBAAA,CAAgB,MAAA,EAAQ,UAAU,CAAA;AACvD,IAAA,MAAMF,aAAA,CAAS,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,cAAyC,OAAO,CAAA;AACvF,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAA8C,OAAA,EAA4C;AAC9F,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAClF,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,KAAK,MAAA,CAAO;AAAA,QAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,MAAA,CAAO,IAAI,CAAA;AAAA,QACzC,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEA,MAAM,OAAO,OAAA,EAAuC;AAClD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA;AAExD,IAAA,MAAMA,cAAS,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,OAAO,OAAO,CAAA;AAE9D,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,MAAM,KAAK,UAAA,CAAW;AAAA,QACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,MAAA,EAAQ,EAAE,SAAA,kBAAW,IAAI,MAAK;AAAE,OACjC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAClF,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,MAAMA,cAAS,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,WAAW,OAAA,EAAyC;AACxD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAClF,IAAA,MAAM,IAAA,CAAK,OAAO,OAAO,CAAA;AACzB,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEA,MAAM,MAAM,OAAA,EAAwC;AAClD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,MAAA,EAAW,MAAA,EAAQ,MAAA,EAAW,CAAA;AACvF,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAAA,EACnB;AAAA,EAEA,MAAM,IAAiB,KAAA,EAA2B;AAChD,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AAAA,EAEA,MAAM,YAAe,QAAA,EAAuE;AAC1F,IAAA,OAAO,MAAM,SAAS,IAA6C,CAAA;AAAA,EACrE;AAAA;AAAA,EAGA,MAAM,aAAA,GAA0C;AAC9C,IAAA,MAAM,WAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,IAAA,CAAK,KAAA,CAAM,SAAQ,EAAG;AACrD,MAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,MAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,MAAA,EAAO,EAAG;AACnC,QAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,MACnD;AACA,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,SAAA;AAAA,QACN,SAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,UAC1C,IAAA;AAAA,UACA,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,mBAAmB,SAAA,EAA8C;AACrE,IAAA,IAAI,SAAA,CAAU,SAAS,aAAA,EAAe;AACpC,MAAA,IAAA,CAAK,QAAA,CAAS,UAAU,KAAK,CAAA;AAAA,IAC/B;AAAA,EAEF;AACF;AC7SO,IAAM,eAAA,GAAN,MAAM,gBAAA,CAA2C;AAAA,EACrC,EAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EAEjB,WAAA,CAAY,IAAsB,OAAA,EAA0B;AAC1D,IAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AACV,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AAAA,EACvB;AAAA,EAEQ,eAAe,KAAA,EAAoD;AACzE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAG,UAAU,EAAC;AAAA,EACxC;AAAA,EAEQ,mBAAmB,KAAA,EAA4C;AACrE,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEQ,cAAA,CAAe,OAAe,GAAA,EAAuD;AAC3F,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEQ,UAAA,CACN,EAAA,EACA,KAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA,GAAI,MAAA;AAG5D,IAAA,IAAI,UAAA,EAAY,UAAA,IAAc,CAAC,OAAA,EAAS,WAAA,EAAa;AACnD,MAAA,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,WAAA,EAAa,IAAA,EAAM,IAAI,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,SAAA;AAEzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,MAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,MAAA,MAAM,SAAA,GAAY,IAAI,CAAA,GAAK,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,aAAa,KAAA,GAAS,KAAA;AAC/D,MAAA,MAAM,QAAQ,SAAA,CAAU,KAAA;AACxB,MAAA,IAAI,QAAA,GAAW,UAAU,QAAA,IAAY,GAAA;AACrC,MAAA,IAAI,QAAQ,SAAA,CAAU,KAAA;AAEtB,MAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,QAAA,QAAA,GAAW,MAAA;AACX,QAAA,KAAA,GAAQ,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACnB,CAAA,MAAA,IAAW,aAAa,aAAA,EAAe;AACrC,QAAA,QAAA,GAAW,MAAA;AACX,QAAA,KAAA,GAAQ,GAAG,KAAK,CAAA,CAAA,CAAA;AAAA,MAClB,CAAA,MAAA,IAAW,aAAa,WAAA,EAAa;AACnC,QAAA,QAAA,GAAW,MAAA;AACX,QAAA,KAAA,GAAQ,IAAI,KAAK,CAAA,CAAA;AAAA,MACnB,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,QAAA,QAAA,GAAW,QAAA;AAAA,MACb;AAEA,MAAA,MAAM,MAAA,GAAU,SAAA,KAAc,IAAA,GAAO,SAAA,GAAY,OAAA;AACjD,MAAA,SAAA,GAAa,SAAA,CAAU,MAAM,CAAA,CAAkB,KAAA,EAAO,UAAU,KAAK,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAA0C,OAAA,EAAuC;AACrF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAEjD,IAAA,IAAI,eAAe,OAAA,CAAQ,IAAA;AAC3B,IAAA,YAAA,GAAe,MAAMA,aAAAA,CAAS,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,cAAc,OAAO,CAAA;AAE5E,IAAA,MAAM,cAAA,GAAiBC,kBAAAA,CAAc,MAAA,EAAQ,YAAY,CAAA;AACzD,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACrC,MAAA,MAAO,IAAA,CAAK,GAAG,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA,CACpC,MAAA,CAAO,cAAc,CAAA,CACrB,OAAA,EAAQ;AAEX,MAAA,MAAM,YAAY,MAAO,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,QAAQ,KAAK,CAAA,CACtD,SAAA,EAAU,CACV,MAAM,IAAA,EAAM,GAAA,EAAK,cAAA,CAAe,EAAE,EAClC,gBAAA,EAAiB;AAEpB,MAAA,YAAA,GAAeC,oBAAAA;AAAA,QACb,MAAA;AAAA,QACC,SAAA,IAAyC;AAAA,OAC5C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GACH,MAAO,IAAA,CAAK,EAAA,CAAG,WAAW,OAAA,CAAQ,KAAK,CAAA,CACrC,MAAA,CAAO,cAAc,CAAA,CACrB,YAAA,EAAa,CACb,kBAAiB,IAAM,cAAA;AAE5B,MAAA,YAAA,GAAeA,oBAAAA,CAAgB,QAAQ,MAAiC,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAMF,aAAAA,CAAS,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,cAAyC,OAAO,CAAA;AACvF,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAA2C,OAAA,EAA4C;AAC3F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,QAAQ,KAAK,CAAA;AAEzC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,GAAG,SAAA,EAAU;AAAA,IACpB;AAEA,IAAA,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,CAAA;AAE3F,IAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,MAAA,KAAA,MAAW,QAAA,IAAY,QAAQ,QAAA,EAAU;AACvC,QAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA,EAAG,OAAO,QAAQ,CAAA;AAC5D,QAAA,IAAI,UAAU,UAAA,EAAY;AACxB,UAAA,EAAA,GAAK,EAAA,CAAG,QAAA;AAAA,YACN,SAAS,UAAA,CAAW,KAAA;AAAA,YACpB,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,YAC5B,GAAG,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,QAAA,CAAS,WAAW,KAAK,CAAA;AAAA,WAC3D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,EAAA,CAAG,gBAAA,EAAiB;AACzC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,OAAOE,oBAAAA,CAAgB,QAAQ,MAAiC,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,SAA4C,OAAA,EAAuC;AACvF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,QAAQ,KAAK,CAAA;AAEzC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,EAAA,GAAK,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,EAAA,GAAK,GAAG,SAAA,EAAU;AAAA,IACpB;AAEA,IAAA,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,CAAA;AAE3F,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,EAAA,GAAK,GAAG,OAAA,CAAQ,OAAA,CAAQ,OAAO,KAAA,EAAO,OAAA,CAAQ,OAAO,SAAS,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,QAAQ,KAAA,KAAU,MAAA,OAAgB,EAAA,CAAG,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5D,IAAA,IAAI,QAAQ,MAAA,KAAW,MAAA,OAAgB,EAAA,CAAG,MAAA,CAAO,QAAQ,MAAM,CAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,MAAO,EAAA,CAAgC,OAAA,EAAQ;AAC/D,IAAA,OAAQ,QAAsC,GAAA,CAAI,CAAC,QAAQA,oBAAAA,CAAgB,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,OAA0C,OAAA,EAA8C;AAC5F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAGjD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAChF,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,IAAI,cAAc,EAAE,GAAG,MAAA,EAAQ,GAAI,QAAQ,MAAA,EAAmC;AAC9E,IAAA,WAAA,GAAc,MAAMF,aAAAA,CAAS,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,aAAa,OAAO,CAAA;AAE1E,IAAA,MAAM,aAAA,GAAgBC,kBAAAA,CAAc,MAAA,EAAQ,OAAA,CAAQ,MAAiC,CAAA;AAErF,IAAA,IAAI,EAAA,GAAM,KAAK,EAAA,CAAG,WAAA,CAAY,QAAQ,KAAK,CAAA,CAA+B,IAAI,aAAa,CAAA;AAC3F,IAAA,EAAA,GAAK,KAAK,UAAA,CAAW,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,QAAQ,KAAK,CAAA;AAErD,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACrC,MAAA,MAAM,GAAG,OAAA,EAAQ;AACjB,MAAA,YAAA,GAAeC,oBAAAA,CAAgB,MAAA,EAAQD,kBAAAA,CAAc,MAAA,EAAQ,WAAW,CAAC,CAAA;AAAA,IAC3E,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,MAAO,EAAA,CAAgC,YAAA,GAAe,gBAAA,EAAiB;AACtF,MAAA,YAAA,GAAeC,oBAAAA;AAAA,QACb,MAAA;AAAA,QACC,MAAA,IAAsCD,kBAAAA,CAAc,MAAA,EAAQ,WAAW;AAAA,OAC1E;AAAA,IACF;AAEA,IAAA,MAAMD,aAAAA,CAAS,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,cAAyC,OAAO,CAAA;AACvF,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAA8C,OAAA,EAA4C;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AAChD,IAAA,MAAM,aAAA,GAAgBC,kBAAAA,CAAc,MAAA,EAAQ,OAAA,CAAQ,MAAiC,CAAA;AAErF,IAAA,IAAI,EAAA,GAAM,KAAK,EAAA,CAAG,WAAA,CAAY,QAAQ,KAAK,CAAA,CAA+B,IAAI,aAAa,CAAA;AAC3F,IAAA,EAAA,GAAK,IAAA,CAAK,UAAA;AAAA,MACR,EAAA;AAAA,MACA,OAAA,CAAQ,KAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,MAAM,OAAA,GAAW,MAAM,EAAA,CAAG,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,OAAO,OAAA,EAAuC;AAClD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,CAAA;AACjD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA;AAExD,IAAA,MAAMD,cAAS,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,OAAO,OAAO,CAAA;AAE9D,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,MAAM,KAAK,UAAA,CAAW;AAAA,QACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,MAAA,EAAQ,EAAE,SAAA,kBAAW,IAAI,MAAK;AAAE,OACjC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,IAAI,EAAA,GAAK,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,QAAQ,KAAK,CAAA;AACzC,MAAA,EAAA,GAAK,KAAK,UAAA,CAAW,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,QAAQ,KAAK,CAAA;AACrD,MAAA,MAAM,GAAG,OAAA,EAAQ;AAAA,IACnB;AAEA,IAAA,MAAMA,cAAS,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,OAAO,OAAO,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,WAAW,OAAA,EAAyC;AACxD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA;AAExD,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,OAAO,MAAM,KAAK,UAAA,CAAW;AAAA,QAC3B,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,MAAA,EAAQ,EAAE,SAAA,kBAAW,IAAI,MAAK;AAAE,OACjC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,QAAQ,KAAK,CAAA;AACzC,IAAA,EAAA,GAAK,KAAK,UAAA,CAAW,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,QAAQ,KAAK,CAAA;AAErD,IAAA,MAAM,OAAA,GAAW,MAAM,EAAA,CAAG,OAAA,EAAQ;AAClC,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,MAAM,OAAA,EAAwC;AAClD,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,QAAQ,KAAK,CAAA;AACzC,IAAA,EAAA,GAAK,KAAK,UAAA,CAAW,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,QAAQ,KAAK,CAAA;AAErD,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,EAAA,CAAG,EAAA;AAG1B,IAAA,EAAA,GAAK,GAAG,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,EAAA,CAAG,GAAG,CAAC,CAAA;AAElC,IAAA,MAAM,MAAA,GAAU,MAAM,EAAA,CAAG,gBAAA,EAAiB;AAC1C,IAAA,OAAO,MAAA,CAAO,MAAA,EAAQ,CAAA,IAAK,CAAC,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,GAAA,CAAiB,KAAA,EAAe,MAAA,EAAgC;AACpE,IAAA,MAAM,MAAA,GAAS,MACbG,UAAA,CAIC,GAAA,CAAI,OAAO,MAAM,CAAA,CACjB,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA;AAClB,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAAA,EAEA,MAAM,YAAe,QAAA,EAAuE;AAC1F,IAAA,OAAQ,MACN,IAAA,CAAK,EAAA,CAAG,aAAY,CAGpB,OAAA,CAAQ,OAAO,GAAA,KAAQ;AACvB,MAAA,MAAM,UAAA,GAAa,IAAI,gBAAA,CAAgB,GAAA,EAAK;AAAA,QAC1C,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAO,IAAA,CAAK;AAAA,OACb,CAAA;AACD,MAAA,OAAO,MAAM,SAAS,UAAU,CAAA;AAAA,IAClC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,aAAA,GAA0C;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,cAAc,SAAA,EAAU;AACrD,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,EAAa;AAElC,IAAA,IAAI,QAAA,GAAW,MAAA;AACf,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,iBAAA,EAAkB;AACnD,MAAA,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,CAAC,KAAA,KAAU;AAClC,QAAA,MAAM,SAAU,KAAA,CAAyC,MAAA;AACzD,QAAA,OAAO,CAAC,UAAU,MAAA,KAAW,aAAA;AAAA,MAC/B,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC9B,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACnC,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,UAAA,EAAY,IAAI,UAAA,IAAc;AAAA,OAChC,CAAE;AAAA,KACJ,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAc,iBAAA,GAAqC;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAMA,UAAA,CAAA,gBAAA,CAAA,CAGA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACpC,MAAA,MAAM,UAAA,GAAa,OAAO,IAAA,CAAK,CAAC,GAAG,WAAA,IAAe,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,UAAA;AAClE,MAAA,IAAI,CAAC,YAAY,OAAO,QAAA;AACxB,MAAA,MAAM,OAAA,GAAU,UAAA,CACb,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAC,CAAA,CACxC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,CAAA,CAAE,UAAA,CAAW,KAAK,CAAC,CAAA;AAC3D,MAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,QAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,YAAA,GAA2B;AACzB,IAAA,QAAQ,IAAA,CAAK,OAAO,QAAA;AAAU,MAC5B,KAAK,IAAA;AACH,QAAA,OAAO,UAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,OAAO,OAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,QAAA;AAAA,MACT;AACE,QAAA,OAAO,UAAA;AAAA;AACX,EACF;AAAA;AAAA,EAGA,MAAM,mBAAmB,SAAA,EAA8C;AACrE,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,EAAa;AAElC,IAAA,IAAI,SAAA,CAAU,SAAS,aAAA,EAAe;AACpC,MAAA,IAAI,OAAA,GAAU,KAAK,EAAA,CAAG,MAAA,CAAO,YAAY,SAAA,CAAU,KAAK,EAAE,WAAA,EAAY;AAEtE,MAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA,EAGjE;AACH,QAAA,MAAM,IAAA,GAAOC,kBAAA,CAAc,KAAA,EAAO,OAAO,CAAA;AAEzC,QAAA,OAAA,GAAU,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAM,IAAA,EAAa,CAAC,GAAA,KAAa;AAC3D,UAAA,IAAI,KAAA,CAAM,UAAA,EAAY,GAAA,GAAM,GAAA,CAAI,UAAA,EAAW;AAC3C,UAAA,IAAI,KAAA,CAAM,QAAA,EAAU,GAAA,GAAM,GAAA,CAAI,OAAA,EAAQ;AACtC,UAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,GAAA,GAAM,GAAA,CAAI,MAAA,EAAO;AACnC,UAAA,IAAI,MAAM,UAAA,EAAY;AACpB,YAAA,GAAA,GAAM,IACH,UAAA,CAAW,CAAA,EAAG,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,UAAA,CAAW,KAAK,EAAE,CAAA,CAChE,QAAA,CAAS,KAAA,CAAM,UAAA,CAAW,YAAY,SAAS,CAAA;AAAA,UACpD;AACA,UAAA,OAAO,GAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AACA,MAAA,MAAM,QAAQ,OAAA,EAAQ;AAGtB,MAAA,IAAI,SAAA,CAAU,WAAW,OAAA,EAAS;AAChC,QAAA,KAAA,MAAW,KAAA,IAAS,SAAA,CAAU,UAAA,CAAW,OAAA,EAAS;AAChD,UAAA,MAAM,SAAA,GAAY,OAAO,SAAA,CAAU,KAAK,IAAI,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAClE,UAAA,IAAI,YAAA,GAAe,IAAA,CAAK,EAAA,CAAG,MAAA,CACxB,WAAA,CAAY,SAAS,CAAA,CACrB,EAAA,CAAG,SAAA,CAAU,KAAK,CAAA,CAClB,OAAA,CAAQ,MAAM,MAAM,CAAA;AACvB,UAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,YAAA,YAAA,GAAe,aAAa,MAAA,EAAO;AAAA,UACrC;AACA,UAAA,MAAM,aAAa,OAAA,EAAQ;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,SAAA,CAAU,IAAA,KAAS,WAAA,EAAa;AACzC,MAAA,MAAM,IAAA,GAAOA,kBAAA,CAAc,SAAA,CAAU,UAAA,EAAY,OAAO,CAAA;AACxD,MAAA,MAAM,IAAA,CAAK,EAAA,CAAG,MAAA,CACX,UAAA,CAAW,SAAA,CAAU,KAAK,CAAA,CAE1B,SAAA,CAAU,SAAA,CAAU,KAAA,EAAO,IAAA,EAAa,CAAC,GAAA,KAAa;AACrD,QAAA,IAAI,SAAA,CAAU,UAAA,CAAW,QAAA,EAAU,GAAA,GAAM,IAAI,OAAA,EAAQ;AACrD,QAAA,IAAI,SAAA,CAAU,UAAA,CAAW,MAAA,EAAQ,GAAA,GAAM,IAAI,MAAA,EAAO;AAClD,QAAA,IAAI,SAAA,CAAU,WAAW,UAAA,EAAY;AACnC,UAAA,GAAA,GAAM,GAAA,CACH,UAAA;AAAA,YACC,CAAA,EAAG,UAAU,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,SAAA,CAAU,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AAAA,YAElF,QAAA,CAAS,SAAA,CAAU,UAAA,CAAW,UAAA,CAAW,YAAY,SAAS,CAAA;AAAA,QACnE;AACA,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,EACA,OAAA,EAAQ;AAAA,IACb,CAAA,MAAA,IAAW,SAAA,CAAU,IAAA,KAAS,aAAA,EAAe;AAC3C,MAAA,IAAI,OAAA,GAAU,IAAA,CAAK,EAAA,CAAG,MAAA,CACnB,YAAY,SAAA,CAAU,IAAI,CAAA,CAC1B,EAAA,CAAG,SAAA,CAAU,KAAK,CAAA,CAClB,OAAA,CAAQ,UAAU,MAAM,CAAA;AAC3B,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,OAAA,GAAU,QAAQ,MAAA,EAAO;AAAA,MAC3B;AACA,MAAA,MAAM,QAAQ,OAAA,EAAQ;AAAA,IACxB;AAAA,EACF;AACF;;;AC9cO,SAAS,cAAA,GAAkC;AAGhD,EAAA,MAAM,OAAA,GAAU,IAAI,eAAA,EAAgB;AACpC,EAAA,OAAO,IAAI,MAAM,OAAA,EAAS;AAAA,IACxB,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU;AAC1B,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,OAAO,OAAO,GAAA,KAAgB;AAC5B,UAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,OAAA,CAAQ;AAAA,YAChC,KAAA,EAAO,QAAA;AAAA,YACP,OAAO,CAAC,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,KAAK;AAAA,WACpC,CAAA;AACD,UAAA,OAAO,GAAA;AAAA,QACT,CAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,OAAO,OAAO,KAAa,IAAA,KAAkC;AAC3D,UAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,EAAE,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,EAAE,EAAA,EAAI,GAAA,EAAK,GAAG,IAAA,EAAK,EAAG,CAAA;AAAA,QACtE,CAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,OAAO,OAAO,GAAA,KAAgB;AAC5B,UAAA,MAAM,OAAA,CAAQ,MAAA,CAAO,EAAE,KAAA,EAAO,UAAU,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA;AAAA,QAChF,CAAA;AAAA,MACF;AACA,MAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,IAC3C;AAAA,GACD,CAAA;AACH","file":"index.js","sourcesContent":["import type {\n DatabaseAdapter,\n DatabaseTransactionAdapter,\n WhereClause,\n CreateOptions,\n FindOptions,\n UpdateOptions,\n DeleteOptions,\n CountOptions,\n} from \"@better-media/core\";\nimport type {\n DbHooks,\n BmSchema,\n FieldType,\n ModelDefinition,\n DatabaseHookContext,\n TableMetadata,\n MigrationOperation,\n} from \"@better-media/core\";\nimport { runHooks, serializeData, deserializeData } from \"@better-media/core\";\n\nexport interface MemoryDbOptions {\n schema?: BmSchema;\n hooks?: DbHooks;\n}\n\n/**\n * In-memory database adapter for development and testing.\n */\nexport class MemoryDbAdapter implements DatabaseAdapter {\n private readonly store = new Map<string, Map<string, Record<string, unknown>>>();\n private readonly schema?: BmSchema;\n private readonly hooks?: DbHooks;\n\n constructor(options?: MemoryDbOptions) {\n this.schema = options?.schema;\n this.hooks = options?.hooks;\n }\n\n private getTable(model: string): Map<string, Record<string, unknown>> {\n let table = this.store.get(model);\n if (!table) {\n table = new Map();\n this.store.set(model, table);\n }\n return table;\n }\n\n private getModelFields(model: string): Record<string, { type: FieldType }> {\n return this.schema?.[model]?.fields ?? {};\n }\n\n private getModelDefinition(model: string): ModelDefinition | undefined {\n return this.schema?.[model];\n }\n\n private getHookContext(model: string, trx?: DatabaseTransactionAdapter): DatabaseHookContext {\n return {\n model,\n adapter: this,\n transaction: trx,\n };\n }\n\n private matchCondition(record: Record<string, unknown>, condition: WhereClause[number]): boolean {\n const recordValue = record[condition.field];\n const targetValue = condition.value;\n\n switch (condition.operator) {\n case \"!=\":\n return recordValue !== targetValue;\n case \"<\":\n return Number(recordValue) < Number(targetValue);\n case \"<=\":\n return Number(recordValue) <= Number(targetValue);\n case \">\":\n return Number(recordValue) > Number(targetValue);\n case \">=\":\n return Number(recordValue) >= Number(targetValue);\n case \"in\":\n return Array.isArray(targetValue) && targetValue.includes(recordValue);\n case \"not_in\":\n return Array.isArray(targetValue) && !targetValue.includes(recordValue);\n case \"contains\":\n return typeof recordValue === \"string\" && recordValue.includes(String(targetValue));\n case \"starts_with\":\n return String(recordValue).toLowerCase().startsWith(String(targetValue).toLowerCase());\n case \"ends_with\":\n return String(recordValue).toLowerCase().endsWith(String(targetValue).toLowerCase());\n case \"like\":\n return (\n typeof recordValue === \"string\" &&\n recordValue.toLowerCase().includes(String(targetValue).toLowerCase())\n );\n case \"=\":\n default:\n return recordValue === targetValue;\n }\n }\n\n private matchesWhere(\n record: Record<string, unknown>,\n where?: WhereClause,\n model?: string,\n options?: { withDeleted?: boolean }\n ): boolean {\n const definition = model ? this.getModelDefinition(model) : undefined;\n\n // Soft delete filtering\n if (definition?.softDelete && !options?.withDeleted) {\n if (record.deletedAt !== null && record.deletedAt !== undefined) return false;\n }\n\n if (!where || where.length === 0) return true;\n\n let isMatch = true;\n for (let i = 0; i < where.length; i++) {\n const condition = where[i]!;\n const connector = i > 0 ? (where[i - 1]?.connector ?? \"AND\") : \"AND\";\n const conditionMatches = this.matchCondition(record, condition);\n\n if (connector === \"OR\") {\n isMatch = isMatch || conditionMatches;\n } else {\n isMatch = isMatch && conditionMatches;\n }\n }\n\n return isMatch;\n }\n\n async create<T extends Record<string, unknown>>(options: CreateOptions<T>): Promise<T> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n let dataToInsert = options.data as Record<string, unknown>;\n dataToInsert = await runHooks.beforeCreate(this.hooks, dataToInsert, context);\n\n if (!dataToInsert.id) {\n throw new Error(\"MemoryDbAdapter requires 'id' in data for create operations\");\n }\n\n const serializedData = serializeData(fields, dataToInsert);\n const clonedData = JSON.parse(JSON.stringify(serializedData));\n table.set(String(clonedData.id), clonedData);\n\n const resultRecord = deserializeData(fields, clonedData) as T;\n await runHooks.afterCreate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n private populateRecord(\n record: Record<string, unknown>,\n model: string,\n populate: string[]\n ): Record<string, unknown> {\n const result = JSON.parse(JSON.stringify(record));\n const sortedPopulate = [...populate].sort((a, b) => a.split(\".\").length - b.split(\".\").length);\n\n for (const path of sortedPopulate) {\n const parts = path.split(\".\");\n let currentObj = result;\n let currentModel = model;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n const fieldDef = this.schema?.[currentModel]?.fields[part];\n\n if (fieldDef?.references) {\n const relatedTable = this.getTable(fieldDef.references.model);\n const localValue = currentObj[part];\n if (localValue === undefined || localValue === null) break;\n\n // If already populated (e.g. by a previous path segment), use that\n const relatedId = typeof localValue === \"object\" ? localValue.id : localValue;\n const relatedRecord = relatedTable.get(String(relatedId));\n\n if (relatedRecord) {\n currentObj[part] = JSON.parse(JSON.stringify(relatedRecord));\n currentModel = fieldDef.references.model;\n currentObj = currentObj[part];\n } else {\n break;\n }\n } else {\n break;\n }\n }\n }\n return result;\n }\n\n async findOne<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T | null> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n\n for (const record of table.values()) {\n if (\n this.matchesWhere(record, options.where, options.model, {\n withDeleted: options.withDeleted,\n })\n ) {\n let result = record;\n if (options.populate) {\n result = this.populateRecord(record, options.model, options.populate);\n }\n return deserializeData(fields, JSON.parse(JSON.stringify(result))) as T;\n }\n }\n return null;\n }\n\n async findMany<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T[]> {\n const table = this.getTable(options.model);\n let results: T[] = [];\n\n for (const record of table.values()) {\n if (\n this.matchesWhere(record, options.where, options.model, {\n withDeleted: options.withDeleted,\n })\n ) {\n results.push(JSON.parse(JSON.stringify(record)) as T);\n }\n }\n\n if (options.sortBy) {\n const { field, direction } = options.sortBy;\n results.sort((a, b) => {\n const valA = a[field] as string | number;\n const valB = b[field] as string | number;\n if (valA < valB) return direction === \"asc\" ? -1 : 1;\n if (valA > valB) return direction === \"asc\" ? 1 : -1;\n return 0;\n });\n }\n\n if (options.offset) results = results.slice(options.offset);\n if (options.limit) results = results.slice(0, options.limit);\n\n return results;\n }\n\n async update<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<T | null> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n const target = await this.findOne({ model: options.model, where: options.where });\n if (!target) return null;\n\n let updatedData = { ...target, ...(options.update as Record<string, unknown>) };\n updatedData = await runHooks.beforeUpdate(this.hooks, updatedData, context);\n\n const serializedUpdate = serializeData(fields, updatedData);\n const mergedData = { ...target, ...serializedUpdate };\n\n const clonedData = JSON.parse(JSON.stringify(mergedData));\n table.set(String(target.id), clonedData);\n\n const resultRecord = deserializeData(fields, clonedData) as T;\n await runHooks.afterUpdate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async updateMany<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<number> {\n const targets = await this.findMany({ model: options.model, where: options.where });\n for (const target of targets) {\n await this.update({\n model: options.model,\n where: [{ field: \"id\", value: target.id }],\n update: options.update,\n });\n }\n return targets.length;\n }\n\n async delete(options: DeleteOptions): Promise<void> {\n const context = this.getHookContext(options.model);\n const definition = this.getModelDefinition(options.model);\n\n await runHooks.beforeDelete(this.hooks, options.where, context);\n\n if (definition?.softDelete) {\n await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n } else {\n const table = this.getTable(options.model);\n const targets = await this.findMany({ model: options.model, where: options.where });\n for (const target of targets) {\n table.delete(String(target.id));\n }\n }\n\n await runHooks.afterDelete(this.hooks, options.where, context);\n }\n\n async deleteMany(options: DeleteOptions): Promise<number> {\n const targets = await this.findMany({ model: options.model, where: options.where });\n await this.delete(options);\n return targets.length;\n }\n\n async count(options: CountOptions): Promise<number> {\n const results = await this.findMany({ ...options, limit: undefined, offset: undefined });\n return results.length;\n }\n\n clear(): void {\n this.store.clear();\n }\n\n async raw<T = unknown>(query: string): Promise<T> {\n if (query === \"clear\") {\n this.clear();\n return true as unknown as T;\n }\n throw new Error(\"MemoryDbAdapter only supports 'clear' as raw query.\");\n }\n\n async transaction<R>(callback: (trx: DatabaseTransactionAdapter) => Promise<R>): Promise<R> {\n return await callback(this as unknown as DatabaseTransactionAdapter);\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __getMetadata(): Promise<TableMetadata[]> {\n const metadata: TableMetadata[] = [];\n for (const [tableName, table] of this.store.entries()) {\n const columns = new Set<string>();\n for (const record of table.values()) {\n Object.keys(record).forEach((k) => columns.add(k));\n }\n metadata.push({\n name: tableName,\n columns: Array.from(columns).map((name) => ({\n name,\n dataType: \"text\",\n isNullable: true,\n })),\n });\n }\n return metadata;\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __executeMigration(operation: MigrationOperation): Promise<void> {\n if (operation.type === \"createTable\") {\n this.getTable(operation.table);\n }\n // Other operations are implicitly handled by the schemaless nature of MemoryDbAdapter\n }\n}\n","import { Kysely, sql } from \"kysely\";\nimport type {\n DatabaseAdapter,\n DatabaseTransactionAdapter,\n WhereClause,\n CreateOptions,\n FindOptions,\n UpdateOptions,\n DeleteOptions,\n CountOptions,\n} from \"@better-media/core\";\nimport type {\n FieldType,\n FieldDefinition,\n BmSchema,\n DbHooks,\n DatabaseHookContext,\n ModelDefinition,\n MigrationOperation,\n SqlDialect,\n TableMetadata,\n} from \"@better-media/core\";\nimport { serializeData, deserializeData, runHooks, getColumnType } from \"@better-media/core\";\nimport type { KyselyDbConfig } from \"./kysely-db-config.interface\";\n\nexport interface KyselyDbOptions {\n config: KyselyDbConfig;\n schema: BmSchema;\n hooks?: DbHooks;\n}\n\nexport type DbSchema = Record<string, Record<string, unknown>>;\n\ntype AnyFunction = (...args: unknown[]) => unknown;\n\ntype KyselyBuilder = {\n where: (field: string, op: string, value: unknown) => KyselyBuilder;\n orWhere: (field: string, op: string, value: unknown) => KyselyBuilder;\n select: (fields: unknown) => KyselyBuilder;\n selectAll: () => KyselyBuilder;\n leftJoin: (table: string, left: string, right: string) => KyselyBuilder;\n orderBy: (field: string, direction: string) => KyselyBuilder;\n limit: (n: number) => KyselyBuilder;\n offset: (n: number) => KyselyBuilder;\n set: (data: Record<string, unknown>) => KyselyBuilder;\n values: (data: Record<string, unknown>) => KyselyBuilder;\n returningAll: () => KyselyBuilder;\n execute: () => Promise<unknown[] & { numUpdatedRows?: number; numDeletedRows?: number }>;\n executeTakeFirst: () => Promise<unknown>;\n};\n\n/**\n * SQL database adapter using Kysely.\n */\nexport class KyselyDbAdapter implements DatabaseAdapter {\n private readonly db: Kysely<DbSchema>;\n private readonly config: KyselyDbConfig;\n private readonly schema: BmSchema;\n private readonly hooks?: DbHooks;\n\n constructor(db: Kysely<DbSchema>, options: KyselyDbOptions) {\n this.db = db;\n this.config = options.config;\n this.schema = options.schema;\n this.hooks = options.hooks;\n }\n\n private getModelFields(model: string): Record<string, { type: FieldType }> {\n return this.schema[model]?.fields ?? {};\n }\n\n private getModelDefinition(model: string): ModelDefinition | undefined {\n return this.schema[model];\n }\n\n private getHookContext(model: string, trx?: DatabaseTransactionAdapter): DatabaseHookContext {\n return {\n model,\n adapter: this,\n transaction: trx,\n };\n }\n\n private applyWhere(\n qb: KyselyBuilder,\n where?: WhereClause,\n model?: string,\n options?: { withDeleted?: boolean }\n ): KyselyBuilder {\n let currentQb = qb;\n const definition = model ? this.getModelDefinition(model) : undefined;\n\n // Soft delete filtering\n if (definition?.softDelete && !options?.withDeleted) {\n currentQb = currentQb.where(\"deletedAt\", \"is\", null);\n }\n\n if (!where || where.length === 0) return currentQb;\n\n for (let i = 0; i < where.length; i++) {\n const condition = where[i];\n if (!condition) continue;\n\n const connector = i > 0 ? (where[i - 1]?.connector ?? \"AND\") : \"AND\";\n const field = condition.field;\n let operator = condition.operator ?? \"=\";\n let value = condition.value;\n\n if (operator === \"contains\") {\n operator = \"like\";\n value = `%${value}%`;\n } else if (operator === \"starts_with\") {\n operator = \"like\";\n value = `${value}%`;\n } else if (operator === \"ends_with\") {\n operator = \"like\";\n value = `%${value}`;\n } else if (operator === \"not_in\") {\n operator = \"not in\" as \"in\";\n }\n\n const method = (connector === \"OR\" ? \"orWhere\" : \"where\") as keyof KyselyBuilder;\n currentQb = (currentQb[method] as AnyFunction)(field, operator, value) as KyselyBuilder;\n }\n\n return currentQb;\n }\n\n async create<T extends Record<string, unknown>>(options: CreateOptions<T>): Promise<T> {\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n let dataToInsert = options.data as Record<string, unknown>;\n dataToInsert = await runHooks.beforeCreate(this.hooks, dataToInsert, context);\n\n const serializedData = serializeData(fields, dataToInsert);\n let resultRecord: T;\n\n if (this.config.provider === \"sqlite\") {\n await (this.db.insertInto(options.model) as unknown as KyselyBuilder)\n .values(serializedData)\n .execute();\n\n const refetched = await (this.db.selectFrom(options.model) as unknown as KyselyBuilder)\n .selectAll()\n .where(\"id\", \"=\", serializedData.id)\n .executeTakeFirst();\n\n resultRecord = deserializeData(\n fields,\n (refetched as Record<string, unknown>) || serializedData\n ) as T;\n } else {\n const result =\n (await (this.db.insertInto(options.model) as unknown as KyselyBuilder)\n .values(serializedData)\n .returningAll()\n .executeTakeFirst()) || serializedData;\n\n resultRecord = deserializeData(fields, result as Record<string, unknown>) as T;\n }\n\n await runHooks.afterCreate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async findOne<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T | null> {\n const fields = this.getModelFields(options.model);\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n\n if (options.select) {\n qb = qb.select(options.select);\n } else {\n qb = qb.selectAll();\n }\n\n qb = this.applyWhere(qb, options.where, options.model, { withDeleted: options.withDeleted });\n\n if (options.populate) {\n // Basic population via left joins if references exist\n for (const relation of options.populate) {\n const fieldDef = this.schema[options.model]?.fields[relation];\n if (fieldDef?.references) {\n qb = qb.leftJoin(\n fieldDef.references.model,\n `${options.model}.${relation}`,\n `${fieldDef.references.model}.${fieldDef.references.field}`\n );\n }\n }\n }\n\n const result = await qb.executeTakeFirst();\n if (!result) return null;\n\n return deserializeData(fields, result as Record<string, unknown>) as T;\n }\n\n async findMany<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T[]> {\n const fields = this.getModelFields(options.model);\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n\n if (options.select) {\n qb = qb.select(options.select);\n } else {\n qb = qb.selectAll();\n }\n\n qb = this.applyWhere(qb, options.where, options.model, { withDeleted: options.withDeleted });\n\n if (options.sortBy) {\n qb = qb.orderBy(options.sortBy.field, options.sortBy.direction);\n }\n\n if (options.limit !== undefined) qb = qb.limit(options.limit);\n if (options.offset !== undefined) qb = qb.offset(options.offset);\n\n const results = await (qb as { execute: AnyFunction }).execute();\n return (results as Record<string, unknown>[]).map((row) => deserializeData(fields, row)) as T[];\n }\n\n async update<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<T | null> {\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n // We still need the current record for hooks (merging data)\n const target = await this.findOne({ model: options.model, where: options.where });\n if (!target) return null;\n\n let updatedData = { ...target, ...(options.update as Record<string, unknown>) };\n updatedData = await runHooks.beforeUpdate(this.hooks, updatedData, context);\n\n const updatePayload = serializeData(fields, options.update as Record<string, unknown>);\n\n let qb = (this.db.updateTable(options.model) as unknown as KyselyBuilder).set(updatePayload);\n qb = this.applyWhere(qb, options.where, options.model);\n\n let resultRecord: T;\n if (this.config.provider === \"sqlite\") {\n await qb.execute();\n resultRecord = deserializeData(fields, serializeData(fields, updatedData)) as T;\n } else {\n const result = await (qb as unknown as KyselyBuilder).returningAll().executeTakeFirst();\n resultRecord = deserializeData(\n fields,\n (result as Record<string, unknown>) || serializeData(fields, updatedData)\n ) as T;\n }\n\n await runHooks.afterUpdate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async updateMany<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<number> {\n const fields = this.getModelFields(options.model);\n const updatePayload = serializeData(fields, options.update as Record<string, unknown>);\n\n let qb = (this.db.updateTable(options.model) as unknown as KyselyBuilder).set(updatePayload);\n qb = this.applyWhere(\n qb as unknown as KyselyBuilder,\n options.where,\n options.model\n ) as KyselyBuilder;\n\n const results = (await qb.execute()) as unknown as { numUpdatedRows: bigint | number }[];\n return Number(results[0]?.numUpdatedRows || 0);\n }\n\n async delete(options: DeleteOptions): Promise<void> {\n const context = this.getHookContext(options.model);\n const definition = this.getModelDefinition(options.model);\n\n await runHooks.beforeDelete(this.hooks, options.where, context);\n\n if (definition?.softDelete) {\n await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n } else {\n let qb = this.db.deleteFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n await qb.execute();\n }\n\n await runHooks.afterDelete(this.hooks, options.where, context);\n }\n\n async deleteMany(options: DeleteOptions): Promise<number> {\n const definition = this.getModelDefinition(options.model);\n\n if (definition?.softDelete) {\n return await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n }\n\n let qb = this.db.deleteFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n\n const results = (await qb.execute()) as unknown as { numDeletedRows: bigint | number }[];\n return Number(results[0]?.numDeletedRows || 0);\n }\n\n async count(options: CountOptions): Promise<number> {\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n\n const { count } = this.db.fn as unknown as {\n count: (f: string) => { as: (a: string) => unknown };\n };\n qb = qb.select(count(\"id\").as(\"c\"));\n\n const result = (await qb.executeTakeFirst()) as { c: string | number } | undefined;\n return Number(result?.c || 0);\n }\n\n async raw<T = unknown>(query: string, params?: unknown[]): Promise<T> {\n const result = await (\n sql as unknown as {\n raw: (q: string, p: unknown) => { execute: (db: unknown) => Promise<{ rows: T }> };\n }\n )\n .raw(query, params)\n .execute(this.db);\n return result.rows;\n }\n\n async transaction<R>(callback: (trx: DatabaseTransactionAdapter) => Promise<R>): Promise<R> {\n return (await (\n this.db.transaction() as unknown as {\n execute: (cb: (trx: Kysely<DbSchema>) => Promise<R>) => Promise<R>;\n }\n ).execute(async (trx) => {\n const trxAdapter = new KyselyDbAdapter(trx, {\n config: this.config,\n schema: this.schema,\n hooks: this.hooks,\n });\n return await callback(trxAdapter);\n })) as R;\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __getMetadata(): Promise<TableMetadata[]> {\n const tables = await this.db.introspection.getTables();\n const dialect = this.__getDialect();\n\n let filtered = tables;\n if (dialect === \"postgres\") {\n const currentSchema = await this.getPostgresSchema();\n filtered = tables.filter((table) => {\n const schema = (table as unknown as { schema?: string }).schema;\n return !schema || schema === currentSchema;\n });\n }\n\n return filtered.map((table) => ({\n name: table.name,\n columns: table.columns.map((col) => ({\n name: col.name,\n dataType: col.dataType,\n isNullable: col.isNullable ?? true,\n })),\n }));\n }\n\n private async getPostgresSchema(): Promise<string> {\n try {\n const result = await sql<{\n search_path?: string;\n searchPath?: string;\n }>`SHOW search_path`.execute(this.db);\n const searchPath = result.rows[0]?.search_path ?? result.rows[0]?.searchPath;\n if (!searchPath) return \"public\";\n const schemas = searchPath\n .split(\",\")\n .map((s) => s.trim())\n .map((s) => s.replace(/^[\"']|[\"']$/g, \"\"))\n .filter((s) => !s.startsWith(\"$\") && !s.startsWith(\"\\\\$\"));\n return schemas[0] || \"public\";\n } catch {\n return \"public\";\n }\n }\n\n /** @internal Used by runMigrations to auto-detect the SQL dialect. */\n __getDialect(): SqlDialect {\n switch (this.config.provider) {\n case \"pg\":\n return \"postgres\";\n case \"mysql\":\n return \"mysql\";\n case \"sqlite\":\n return \"sqlite\";\n default:\n return \"postgres\";\n }\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __executeMigration(operation: MigrationOperation): Promise<void> {\n const dialect = this.__getDialect();\n\n if (operation.type === \"createTable\") {\n let builder = this.db.schema.createTable(operation.table).ifNotExists();\n\n for (const [name, field] of Object.entries(operation.definition.fields) as [\n string,\n FieldDefinition,\n ][]) {\n const type = getColumnType(field, dialect);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n builder = builder.addColumn(name, type as any, (col: any) => {\n if (field.primaryKey) col = col.primaryKey();\n if (field.required) col = col.notNull();\n if (field.unique) col = col.unique();\n if (field.references) {\n col = col\n .references(`${field.references.model}.${field.references.field}`)\n .onDelete(field.references.onDelete || \"cascade\");\n }\n return col;\n });\n }\n await builder.execute();\n\n // Create indexes\n if (operation.definition.indexes) {\n for (const index of operation.definition.indexes) {\n const indexName = `idx_${operation.table}_${index.fields.join(\"_\")}`;\n let indexBuilder = this.db.schema\n .createIndex(indexName)\n .on(operation.table)\n .columns(index.fields);\n if (index.unique) {\n indexBuilder = indexBuilder.unique();\n }\n await indexBuilder.execute();\n }\n }\n } else if (operation.type === \"addColumn\") {\n const type = getColumnType(operation.definition, dialect);\n await this.db.schema\n .alterTable(operation.table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .addColumn(operation.field, type as any, (col: any) => {\n if (operation.definition.required) col = col.notNull();\n if (operation.definition.unique) col = col.unique();\n if (operation.definition.references) {\n col = col\n .references(\n `${operation.definition.references.model}.${operation.definition.references.field}`\n )\n .onDelete(operation.definition.references.onDelete || \"cascade\");\n }\n return col;\n })\n .execute();\n } else if (operation.type === \"createIndex\") {\n let builder = this.db.schema\n .createIndex(operation.name)\n .on(operation.table)\n .columns(operation.fields);\n if (operation.unique) {\n builder = builder.unique();\n }\n await builder.execute();\n }\n }\n}\n","// Types and schemas are now exported from \"@better-media/framework\" directly.\nexport * from \"./adapters/memory/memory-db.adapter\";\nexport * from \"./adapters/kysely/kysely-db.adapter\";\n// MongoDB implementation lives in @better-media/mongodb-adapter; re-exported here for convenience.\nexport * from \"./adapters/mongodb/index\";\nexport type { KyselyDbConfig } from \"./adapters/kysely/kysely-db-config.interface\";\n\n// Backwards compatibility for the old memoryDatabase export\nimport { MemoryDbAdapter } from \"./adapters/memory/memory-db.adapter\";\nimport type { DatabaseAdapter } from \"@better-media/core\";\n\nexport function memoryDatabase(): DatabaseAdapter {\n // Return a proxy that supports the new DatabaseAdapter interface + the old get/put methods\n // for the legacy adapters that haven't been migrated to the new schema-driven architecture yet.\n const adapter = new MemoryDbAdapter();\n return new Proxy(adapter, {\n get(target, prop, receiver) {\n if (prop === \"get\") {\n return async (key: string) => {\n const res = await adapter.findOne({\n model: \"legacy\",\n where: [{ field: \"id\", value: key }],\n });\n return res;\n };\n }\n if (prop === \"put\") {\n return async (key: string, data: Record<string, unknown>) => {\n await adapter.create({ model: \"legacy\", data: { id: key, ...data } });\n };\n }\n if (prop === \"delete\") {\n return async (key: string) => {\n await adapter.delete({ model: \"legacy\", where: [{ field: \"id\", value: key }] });\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/memory/memory-db.adapter.ts","../src/adapters/kysely/kysely-db.adapter.ts","../src/index.ts"],"names":["runHooks","serializeData","deserializeData"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n DatabaseAdapter,\n DatabaseTransactionAdapter,\n WhereClause,\n CreateOptions,\n FindOptions,\n UpdateOptions,\n DeleteOptions,\n CountOptions,\n} from \"@better-media/core\";\nimport type {\n DbHooks,\n BmSchema,\n FieldType,\n ModelDefinition,\n DatabaseHookContext,\n TableMetadata,\n MigrationOperation,\n} from \"@better-media/core\";\nimport { runHooks, serializeData, deserializeData } from \"@better-media/core\";\n\nexport interface MemoryDbOptions {\n schema?: BmSchema;\n hooks?: DbHooks;\n}\n\n/**\n * In-memory database adapter for development and testing.\n */\nexport class MemoryDbAdapter implements DatabaseAdapter {\n private readonly store = new Map<string, Map<string, Record<string, unknown>>>();\n private readonly schema?: BmSchema;\n private readonly hooks?: DbHooks;\n\n constructor(options?: MemoryDbOptions) {\n this.schema = options?.schema;\n this.hooks = options?.hooks;\n }\n\n private getTable(model: string): Map<string, Record<string, unknown>> {\n let table = this.store.get(model);\n if (!table) {\n table = new Map();\n this.store.set(model, table);\n }\n return table;\n }\n\n private getModelFields(model: string): Record<string, { type: FieldType }> {\n return this.schema?.[model]?.fields ?? {};\n }\n\n private getModelDefinition(model: string): ModelDefinition | undefined {\n return this.schema?.[model];\n }\n\n private getHookContext(model: string, trx?: DatabaseTransactionAdapter): DatabaseHookContext {\n return {\n model,\n adapter: this,\n transaction: trx,\n };\n }\n\n private matchCondition(record: Record<string, unknown>, condition: WhereClause[number]): boolean {\n const recordValue = record[condition.field];\n const targetValue = condition.value;\n\n switch (condition.operator) {\n case \"!=\":\n return recordValue !== targetValue;\n case \"<\":\n return Number(recordValue) < Number(targetValue);\n case \"<=\":\n return Number(recordValue) <= Number(targetValue);\n case \">\":\n return Number(recordValue) > Number(targetValue);\n case \">=\":\n return Number(recordValue) >= Number(targetValue);\n case \"in\":\n return Array.isArray(targetValue) && targetValue.includes(recordValue);\n case \"not_in\":\n return Array.isArray(targetValue) && !targetValue.includes(recordValue);\n case \"contains\":\n return typeof recordValue === \"string\" && recordValue.includes(String(targetValue));\n case \"starts_with\":\n return String(recordValue).toLowerCase().startsWith(String(targetValue).toLowerCase());\n case \"ends_with\":\n return String(recordValue).toLowerCase().endsWith(String(targetValue).toLowerCase());\n case \"like\":\n return (\n typeof recordValue === \"string\" &&\n recordValue.toLowerCase().includes(String(targetValue).toLowerCase())\n );\n case \"=\":\n default:\n return recordValue === targetValue;\n }\n }\n\n private matchesWhere(\n record: Record<string, unknown>,\n where?: WhereClause,\n model?: string,\n options?: { withDeleted?: boolean }\n ): boolean {\n const definition = model ? this.getModelDefinition(model) : undefined;\n\n // Soft delete filtering\n if (definition?.softDelete && !options?.withDeleted) {\n if (record.deletedAt !== null && record.deletedAt !== undefined) return false;\n }\n\n if (!where || where.length === 0) return true;\n\n let isMatch = true;\n for (let i = 0; i < where.length; i++) {\n const condition = where[i]!;\n const connector = i > 0 ? (where[i - 1]?.connector ?? \"AND\") : \"AND\";\n const conditionMatches = this.matchCondition(record, condition);\n\n if (connector === \"OR\") {\n isMatch = isMatch || conditionMatches;\n } else {\n isMatch = isMatch && conditionMatches;\n }\n }\n\n return isMatch;\n }\n\n async create<T extends Record<string, unknown>>(options: CreateOptions<T>): Promise<T> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n let dataToInsert = options.data as Record<string, unknown>;\n dataToInsert = await runHooks.beforeCreate(this.hooks, dataToInsert, context);\n\n if (!dataToInsert.id) {\n throw new Error(\"MemoryDbAdapter requires 'id' in data for create operations\");\n }\n\n const serializedData = serializeData(fields, dataToInsert);\n const clonedData = JSON.parse(JSON.stringify(serializedData));\n table.set(String(clonedData.id), clonedData);\n\n const resultRecord = deserializeData(fields, clonedData) as T;\n await runHooks.afterCreate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n private populateRecord(\n record: Record<string, unknown>,\n model: string,\n populate: string[]\n ): Record<string, unknown> {\n const result = JSON.parse(JSON.stringify(record));\n const sortedPopulate = [...populate].sort((a, b) => a.split(\".\").length - b.split(\".\").length);\n\n for (const path of sortedPopulate) {\n const parts = path.split(\".\");\n let currentObj = result;\n let currentModel = model;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n const fieldDef = this.schema?.[currentModel]?.fields[part];\n\n if (fieldDef?.references) {\n const relatedTable = this.getTable(fieldDef.references.model);\n const localValue = currentObj[part];\n if (localValue === undefined || localValue === null) break;\n\n // If already populated (e.g. by a previous path segment), use that\n const relatedId = typeof localValue === \"object\" ? localValue.id : localValue;\n const relatedRecord = relatedTable.get(String(relatedId));\n\n if (relatedRecord) {\n currentObj[part] = JSON.parse(JSON.stringify(relatedRecord));\n currentModel = fieldDef.references.model;\n currentObj = currentObj[part];\n } else {\n break;\n }\n } else {\n break;\n }\n }\n }\n return result;\n }\n\n async findOne<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T | null> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n\n for (const record of table.values()) {\n if (\n this.matchesWhere(record, options.where, options.model, {\n withDeleted: options.withDeleted,\n })\n ) {\n let result = record;\n if (options.populate) {\n result = this.populateRecord(record, options.model, options.populate);\n }\n return deserializeData(fields, JSON.parse(JSON.stringify(result))) as T;\n }\n }\n return null;\n }\n\n async findMany<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T[]> {\n const table = this.getTable(options.model);\n let results: T[] = [];\n\n for (const record of table.values()) {\n if (\n this.matchesWhere(record, options.where, options.model, {\n withDeleted: options.withDeleted,\n })\n ) {\n results.push(JSON.parse(JSON.stringify(record)) as T);\n }\n }\n\n if (options.sortBy) {\n const { field, direction } = options.sortBy;\n results.sort((a, b) => {\n const valA = a[field] as string | number;\n const valB = b[field] as string | number;\n if (valA < valB) return direction === \"asc\" ? -1 : 1;\n if (valA > valB) return direction === \"asc\" ? 1 : -1;\n return 0;\n });\n }\n\n if (options.offset) results = results.slice(options.offset);\n if (options.limit) results = results.slice(0, options.limit);\n\n return results;\n }\n\n async update<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<T | null> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n const target = await this.findOne({ model: options.model, where: options.where });\n if (!target) return null;\n\n let updatedData = { ...target, ...(options.update as Record<string, unknown>) };\n updatedData = await runHooks.beforeUpdate(this.hooks, updatedData, context);\n\n const serializedUpdate = serializeData(fields, updatedData);\n const mergedData = { ...target, ...serializedUpdate };\n\n const clonedData = JSON.parse(JSON.stringify(mergedData));\n table.set(String(target.id), clonedData);\n\n const resultRecord = deserializeData(fields, clonedData) as T;\n await runHooks.afterUpdate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async updateMany<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<number> {\n const targets = await this.findMany({ model: options.model, where: options.where });\n for (const target of targets) {\n await this.update({\n model: options.model,\n where: [{ field: \"id\", value: target.id }],\n update: options.update,\n });\n }\n return targets.length;\n }\n\n async delete(options: DeleteOptions): Promise<void> {\n const context = this.getHookContext(options.model);\n const definition = this.getModelDefinition(options.model);\n\n await runHooks.beforeDelete(this.hooks, options.where, context);\n\n if (definition?.softDelete) {\n await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n } else {\n const table = this.getTable(options.model);\n const targets = await this.findMany({ model: options.model, where: options.where });\n for (const target of targets) {\n table.delete(String(target.id));\n }\n }\n\n await runHooks.afterDelete(this.hooks, options.where, context);\n }\n\n async deleteMany(options: DeleteOptions): Promise<number> {\n const targets = await this.findMany({ model: options.model, where: options.where });\n await this.delete(options);\n return targets.length;\n }\n\n async count(options: CountOptions): Promise<number> {\n const results = await this.findMany({ ...options, limit: undefined, offset: undefined });\n return results.length;\n }\n\n clear(): void {\n this.store.clear();\n }\n\n async raw<T = unknown>(query: string): Promise<T> {\n if (query === \"clear\") {\n this.clear();\n return true as unknown as T;\n }\n throw new Error(\"MemoryDbAdapter only supports 'clear' as raw query.\");\n }\n\n async transaction<R>(callback: (trx: DatabaseTransactionAdapter) => Promise<R>): Promise<R> {\n return await callback(this as unknown as DatabaseTransactionAdapter);\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __getMetadata(): Promise<TableMetadata[]> {\n const metadata: TableMetadata[] = [];\n for (const [tableName, table] of this.store.entries()) {\n const columns = new Set<string>();\n for (const record of table.values()) {\n Object.keys(record).forEach((k) => columns.add(k));\n }\n metadata.push({\n name: tableName,\n columns: Array.from(columns).map((name) => ({\n name,\n dataType: \"text\",\n isNullable: true,\n })),\n });\n }\n return metadata;\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __executeMigration(operation: MigrationOperation): Promise<void> {\n if (operation.type === \"createTable\") {\n this.getTable(operation.table);\n }\n // Other operations are implicitly handled by the schemaless nature of MemoryDbAdapter\n }\n}\n","import { Kysely, sql } from \"kysely\";\nimport type {\n DatabaseAdapter,\n DatabaseTransactionAdapter,\n WhereClause,\n CreateOptions,\n FindOptions,\n UpdateOptions,\n DeleteOptions,\n CountOptions,\n} from \"@better-media/core\";\nimport type {\n FieldType,\n FieldDefinition,\n BmSchema,\n DbHooks,\n DatabaseHookContext,\n ModelDefinition,\n MigrationOperation,\n SqlDialect,\n TableMetadata,\n} from \"@better-media/core\";\nimport { serializeData, deserializeData, runHooks, getColumnType } from \"@better-media/core\";\nimport type { KyselyDbConfig } from \"./kysely-db-config.interface\";\n\nexport interface KyselyDbOptions {\n config: KyselyDbConfig;\n schema: BmSchema;\n hooks?: DbHooks;\n}\n\nexport type DbSchema = Record<string, Record<string, unknown>>;\n\ntype AnyFunction = (...args: unknown[]) => unknown;\n\ntype KyselyBuilder = {\n where: (field: string, op: string, value: unknown) => KyselyBuilder;\n orWhere: (field: string, op: string, value: unknown) => KyselyBuilder;\n select: (fields: unknown) => KyselyBuilder;\n selectAll: () => KyselyBuilder;\n leftJoin: (table: string, left: string, right: string) => KyselyBuilder;\n orderBy: (field: string, direction: string) => KyselyBuilder;\n limit: (n: number) => KyselyBuilder;\n offset: (n: number) => KyselyBuilder;\n set: (data: Record<string, unknown>) => KyselyBuilder;\n values: (data: Record<string, unknown>) => KyselyBuilder;\n returningAll: () => KyselyBuilder;\n execute: () => Promise<unknown[] & { numUpdatedRows?: number; numDeletedRows?: number }>;\n executeTakeFirst: () => Promise<unknown>;\n};\n\n/**\n * SQL database adapter using Kysely.\n */\nexport class KyselyDbAdapter implements DatabaseAdapter {\n private readonly db: Kysely<DbSchema>;\n private readonly config: KyselyDbConfig;\n private readonly schema: BmSchema;\n private readonly hooks?: DbHooks;\n\n constructor(db: Kysely<DbSchema>, options: KyselyDbOptions) {\n this.db = db;\n this.config = options.config;\n this.schema = options.schema;\n this.hooks = options.hooks;\n }\n\n private getModelFields(model: string): Record<string, { type: FieldType }> {\n return this.schema[model]?.fields ?? {};\n }\n\n private getModelDefinition(model: string): ModelDefinition | undefined {\n return this.schema[model];\n }\n\n private getHookContext(model: string, trx?: DatabaseTransactionAdapter): DatabaseHookContext {\n return {\n model,\n adapter: this,\n transaction: trx,\n };\n }\n\n private applyWhere(\n qb: KyselyBuilder,\n where?: WhereClause,\n model?: string,\n options?: { withDeleted?: boolean }\n ): KyselyBuilder {\n let currentQb = qb;\n const definition = model ? this.getModelDefinition(model) : undefined;\n\n // Soft delete filtering\n if (definition?.softDelete && !options?.withDeleted) {\n currentQb = currentQb.where(\"deletedAt\", \"is\", null);\n }\n\n if (!where || where.length === 0) return currentQb;\n\n for (let i = 0; i < where.length; i++) {\n const condition = where[i];\n if (!condition) continue;\n\n const connector = i > 0 ? (where[i - 1]?.connector ?? \"AND\") : \"AND\";\n const field = condition.field;\n let operator = condition.operator ?? \"=\";\n let value = condition.value;\n\n if (operator === \"contains\") {\n operator = \"like\";\n value = `%${value}%`;\n } else if (operator === \"starts_with\") {\n operator = \"like\";\n value = `${value}%`;\n } else if (operator === \"ends_with\") {\n operator = \"like\";\n value = `%${value}`;\n } else if (operator === \"not_in\") {\n operator = \"not in\" as \"in\";\n }\n\n const method = (connector === \"OR\" ? \"orWhere\" : \"where\") as keyof KyselyBuilder;\n currentQb = (currentQb[method] as AnyFunction)(field, operator, value) as KyselyBuilder;\n }\n\n return currentQb;\n }\n\n async create<T extends Record<string, unknown>>(options: CreateOptions<T>): Promise<T> {\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n let dataToInsert = options.data as Record<string, unknown>;\n dataToInsert = await runHooks.beforeCreate(this.hooks, dataToInsert, context);\n\n const serializedData = serializeData(fields, dataToInsert);\n let resultRecord: T;\n\n if (this.config.provider === \"sqlite\") {\n await (this.db.insertInto(options.model) as unknown as KyselyBuilder)\n .values(serializedData)\n .execute();\n\n const refetched = await (this.db.selectFrom(options.model) as unknown as KyselyBuilder)\n .selectAll()\n .where(\"id\", \"=\", serializedData.id)\n .executeTakeFirst();\n\n resultRecord = deserializeData(\n fields,\n (refetched as Record<string, unknown>) || serializedData\n ) as T;\n } else {\n const result =\n (await (this.db.insertInto(options.model) as unknown as KyselyBuilder)\n .values(serializedData)\n .returningAll()\n .executeTakeFirst()) || serializedData;\n\n resultRecord = deserializeData(fields, result as Record<string, unknown>) as T;\n }\n\n await runHooks.afterCreate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async findOne<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T | null> {\n const fields = this.getModelFields(options.model);\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n\n if (options.select) {\n qb = qb.select(options.select);\n } else {\n qb = qb.selectAll();\n }\n\n qb = this.applyWhere(qb, options.where, options.model, { withDeleted: options.withDeleted });\n\n if (options.populate) {\n // Basic population via left joins if references exist\n for (const relation of options.populate) {\n const fieldDef = this.schema[options.model]?.fields[relation];\n if (fieldDef?.references) {\n qb = qb.leftJoin(\n fieldDef.references.model,\n `${options.model}.${relation}`,\n `${fieldDef.references.model}.${fieldDef.references.field}`\n );\n }\n }\n }\n\n const result = await qb.executeTakeFirst();\n if (!result) return null;\n\n return deserializeData(fields, result as Record<string, unknown>) as T;\n }\n\n async findMany<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T[]> {\n const fields = this.getModelFields(options.model);\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n\n if (options.select) {\n qb = qb.select(options.select);\n } else {\n qb = qb.selectAll();\n }\n\n qb = this.applyWhere(qb, options.where, options.model, { withDeleted: options.withDeleted });\n\n if (options.sortBy) {\n qb = qb.orderBy(options.sortBy.field, options.sortBy.direction);\n }\n\n if (options.limit !== undefined) qb = qb.limit(options.limit);\n if (options.offset !== undefined) qb = qb.offset(options.offset);\n\n const results = await (qb as { execute: AnyFunction }).execute();\n return (results as Record<string, unknown>[]).map((row) => deserializeData(fields, row)) as T[];\n }\n\n async update<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<T | null> {\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n // We still need the current record for hooks (merging data)\n const target = await this.findOne({ model: options.model, where: options.where });\n if (!target) return null;\n\n let updatedData = { ...target, ...(options.update as Record<string, unknown>) };\n updatedData = await runHooks.beforeUpdate(this.hooks, updatedData, context);\n\n const updatePayload = serializeData(fields, options.update as Record<string, unknown>);\n\n let qb = (this.db.updateTable(options.model) as unknown as KyselyBuilder).set(updatePayload);\n qb = this.applyWhere(qb, options.where, options.model);\n\n let resultRecord: T;\n if (this.config.provider === \"sqlite\") {\n await qb.execute();\n resultRecord = deserializeData(fields, serializeData(fields, updatedData)) as T;\n } else {\n const result = await (qb as unknown as KyselyBuilder).returningAll().executeTakeFirst();\n resultRecord = deserializeData(\n fields,\n (result as Record<string, unknown>) || serializeData(fields, updatedData)\n ) as T;\n }\n\n await runHooks.afterUpdate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async updateMany<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<number> {\n const fields = this.getModelFields(options.model);\n const updatePayload = serializeData(fields, options.update as Record<string, unknown>);\n\n let qb = (this.db.updateTable(options.model) as unknown as KyselyBuilder).set(updatePayload);\n qb = this.applyWhere(\n qb as unknown as KyselyBuilder,\n options.where,\n options.model\n ) as KyselyBuilder;\n\n const results = (await qb.execute()) as unknown as { numUpdatedRows: bigint | number }[];\n return Number(results[0]?.numUpdatedRows || 0);\n }\n\n async delete(options: DeleteOptions): Promise<void> {\n const context = this.getHookContext(options.model);\n const definition = this.getModelDefinition(options.model);\n\n await runHooks.beforeDelete(this.hooks, options.where, context);\n\n if (definition?.softDelete) {\n await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n } else {\n let qb = this.db.deleteFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n await qb.execute();\n }\n\n await runHooks.afterDelete(this.hooks, options.where, context);\n }\n\n async deleteMany(options: DeleteOptions): Promise<number> {\n const definition = this.getModelDefinition(options.model);\n\n if (definition?.softDelete) {\n return await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n }\n\n let qb = this.db.deleteFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n\n const results = (await qb.execute()) as unknown as { numDeletedRows: bigint | number }[];\n return Number(results[0]?.numDeletedRows || 0);\n }\n\n async count(options: CountOptions): Promise<number> {\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n\n const { count } = this.db.fn as unknown as {\n count: (f: string) => { as: (a: string) => unknown };\n };\n qb = qb.select(count(\"id\").as(\"c\"));\n\n const result = (await qb.executeTakeFirst()) as { c: string | number } | undefined;\n return Number(result?.c || 0);\n }\n\n async raw<T = unknown>(query: string, params?: unknown[]): Promise<T> {\n const result = await (\n sql as unknown as {\n raw: (q: string, p: unknown) => { execute: (db: unknown) => Promise<{ rows: T }> };\n }\n )\n .raw(query, params)\n .execute(this.db);\n return result.rows;\n }\n\n async transaction<R>(callback: (trx: DatabaseTransactionAdapter) => Promise<R>): Promise<R> {\n return (await (\n this.db.transaction() as unknown as {\n execute: (cb: (trx: Kysely<DbSchema>) => Promise<R>) => Promise<R>;\n }\n ).execute(async (trx) => {\n const trxAdapter = new KyselyDbAdapter(trx, {\n config: this.config,\n schema: this.schema,\n hooks: this.hooks,\n });\n return await callback(trxAdapter);\n })) as R;\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __getMetadata(): Promise<TableMetadata[]> {\n const tables = await this.db.introspection.getTables();\n const dialect = this.__getDialect();\n\n let filtered = tables;\n if (dialect === \"postgres\") {\n const currentSchema = await this.getPostgresSchema();\n filtered = tables.filter((table) => {\n const schema = (table as unknown as { schema?: string }).schema;\n return !schema || schema === currentSchema;\n });\n }\n\n return filtered.map((table) => ({\n name: table.name,\n columns: table.columns.map((col) => ({\n name: col.name,\n dataType: col.dataType,\n isNullable: col.isNullable ?? true,\n })),\n }));\n }\n\n private async getPostgresSchema(): Promise<string> {\n try {\n const result = await sql<{\n search_path?: string;\n searchPath?: string;\n }>`SHOW search_path`.execute(this.db);\n const searchPath = result.rows[0]?.search_path ?? result.rows[0]?.searchPath;\n if (!searchPath) return \"public\";\n const schemas = searchPath\n .split(\",\")\n .map((s) => s.trim())\n .map((s) => s.replace(/^[\"']|[\"']$/g, \"\"))\n .filter((s) => !s.startsWith(\"$\") && !s.startsWith(\"\\\\$\"));\n return schemas[0] || \"public\";\n } catch {\n return \"public\";\n }\n }\n\n /** @internal Used by runMigrations to auto-detect the SQL dialect. */\n __getDialect(): SqlDialect {\n switch (this.config.provider) {\n case \"pg\":\n return \"postgres\";\n case \"mysql\":\n return \"mysql\";\n case \"sqlite\":\n return \"sqlite\";\n default:\n return \"postgres\";\n }\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __executeMigration(operation: MigrationOperation): Promise<void> {\n const dialect = this.__getDialect();\n\n if (operation.type === \"createTable\") {\n let builder = this.db.schema.createTable(operation.table).ifNotExists();\n\n for (const [name, field] of Object.entries(operation.definition.fields) as [\n string,\n FieldDefinition,\n ][]) {\n const type = getColumnType(field, dialect);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n builder = builder.addColumn(name, type as any, (col: any) => {\n if (field.primaryKey) col = col.primaryKey();\n if (field.required) col = col.notNull();\n if (field.unique) col = col.unique();\n if (field.references) {\n col = col\n .references(`${field.references.model}.${field.references.field}`)\n .onDelete(field.references.onDelete || \"cascade\");\n }\n return col;\n });\n }\n await builder.execute();\n\n // Create indexes\n if (operation.definition.indexes) {\n for (const index of operation.definition.indexes) {\n const indexName = `idx_${operation.table}_${index.fields.join(\"_\")}`;\n let indexBuilder = this.db.schema\n .createIndex(indexName)\n .on(operation.table)\n .columns(index.fields);\n if (index.unique) {\n indexBuilder = indexBuilder.unique();\n }\n await indexBuilder.execute();\n }\n }\n } else if (operation.type === \"addColumn\") {\n const type = getColumnType(operation.definition, dialect);\n await this.db.schema\n .alterTable(operation.table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .addColumn(operation.field, type as any, (col: any) => {\n if (operation.definition.required) col = col.notNull();\n if (operation.definition.unique) col = col.unique();\n if (operation.definition.references) {\n col = col\n .references(\n `${operation.definition.references.model}.${operation.definition.references.field}`\n )\n .onDelete(operation.definition.references.onDelete || \"cascade\");\n }\n return col;\n })\n .execute();\n } else if (operation.type === \"createIndex\") {\n let builder = this.db.schema\n .createIndex(operation.name)\n .on(operation.table)\n .columns(operation.fields);\n if (operation.unique) {\n builder = builder.unique();\n }\n await builder.execute();\n }\n }\n}\n","// Types and schemas are now exported from \"better-media\" directly.\nexport * from \"./adapters/memory/memory-db.adapter\";\nexport * from \"./adapters/kysely/kysely-db.adapter\";\n// MongoDB implementation lives in @better-media/mongodb-adapter; re-exported here for convenience.\nexport * from \"./adapters/mongodb/index\";\nexport type { KyselyDbConfig } from \"./adapters/kysely/kysely-db-config.interface\";\n\n// Backwards compatibility for the old memoryDatabase export\nimport { MemoryDbAdapter } from \"./adapters/memory/memory-db.adapter\";\nimport type { DatabaseAdapter } from \"@better-media/core\";\n\nexport function memoryDatabase(): DatabaseAdapter {\n // Return a proxy that supports the new DatabaseAdapter interface + the old get/put methods\n // for the legacy adapters that haven't been migrated to the new schema-driven architecture yet.\n const adapter = new MemoryDbAdapter();\n return new Proxy(adapter, {\n get(target, prop, receiver) {\n if (prop === \"get\") {\n return async (key: string) => {\n const res = await adapter.findOne({\n model: \"legacy\",\n where: [{ field: \"id\", value: key }],\n });\n return res;\n };\n }\n if (prop === \"put\") {\n return async (key: string, data: Record<string, unknown>) => {\n await adapter.create({ model: \"legacy\", data: { id: key, ...data } });\n };\n }\n if (prop === \"delete\") {\n return async (key: string) => {\n await adapter.delete({ model: \"legacy\", where: [{ field: \"id\", value: key }] });\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/adapters/memory/memory-db.adapter.ts","../src/adapters/kysely/kysely-db.adapter.ts","../src/index.ts"],"names":["runHooks","serializeData","deserializeData"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n DatabaseAdapter,\n DatabaseTransactionAdapter,\n WhereClause,\n CreateOptions,\n FindOptions,\n UpdateOptions,\n DeleteOptions,\n CountOptions,\n} from \"@better-media/core\";\nimport type {\n DbHooks,\n BmSchema,\n FieldType,\n ModelDefinition,\n DatabaseHookContext,\n TableMetadata,\n MigrationOperation,\n} from \"@better-media/core\";\nimport { runHooks, serializeData, deserializeData } from \"@better-media/core\";\n\nexport interface MemoryDbOptions {\n schema?: BmSchema;\n hooks?: DbHooks;\n}\n\n/**\n * In-memory database adapter for development and testing.\n */\nexport class MemoryDbAdapter implements DatabaseAdapter {\n private readonly store = new Map<string, Map<string, Record<string, unknown>>>();\n private readonly schema?: BmSchema;\n private readonly hooks?: DbHooks;\n\n constructor(options?: MemoryDbOptions) {\n this.schema = options?.schema;\n this.hooks = options?.hooks;\n }\n\n private getTable(model: string): Map<string, Record<string, unknown>> {\n let table = this.store.get(model);\n if (!table) {\n table = new Map();\n this.store.set(model, table);\n }\n return table;\n }\n\n private getModelFields(model: string): Record<string, { type: FieldType }> {\n return this.schema?.[model]?.fields ?? {};\n }\n\n private getModelDefinition(model: string): ModelDefinition | undefined {\n return this.schema?.[model];\n }\n\n private getHookContext(model: string, trx?: DatabaseTransactionAdapter): DatabaseHookContext {\n return {\n model,\n adapter: this,\n transaction: trx,\n };\n }\n\n private matchCondition(record: Record<string, unknown>, condition: WhereClause[number]): boolean {\n const recordValue = record[condition.field];\n const targetValue = condition.value;\n\n switch (condition.operator) {\n case \"!=\":\n return recordValue !== targetValue;\n case \"<\":\n return Number(recordValue) < Number(targetValue);\n case \"<=\":\n return Number(recordValue) <= Number(targetValue);\n case \">\":\n return Number(recordValue) > Number(targetValue);\n case \">=\":\n return Number(recordValue) >= Number(targetValue);\n case \"in\":\n return Array.isArray(targetValue) && targetValue.includes(recordValue);\n case \"not_in\":\n return Array.isArray(targetValue) && !targetValue.includes(recordValue);\n case \"contains\":\n return typeof recordValue === \"string\" && recordValue.includes(String(targetValue));\n case \"starts_with\":\n return String(recordValue).toLowerCase().startsWith(String(targetValue).toLowerCase());\n case \"ends_with\":\n return String(recordValue).toLowerCase().endsWith(String(targetValue).toLowerCase());\n case \"like\":\n return (\n typeof recordValue === \"string\" &&\n recordValue.toLowerCase().includes(String(targetValue).toLowerCase())\n );\n case \"=\":\n default:\n return recordValue === targetValue;\n }\n }\n\n private matchesWhere(\n record: Record<string, unknown>,\n where?: WhereClause,\n model?: string,\n options?: { withDeleted?: boolean }\n ): boolean {\n const definition = model ? this.getModelDefinition(model) : undefined;\n\n // Soft delete filtering\n if (definition?.softDelete && !options?.withDeleted) {\n if (record.deletedAt !== null && record.deletedAt !== undefined) return false;\n }\n\n if (!where || where.length === 0) return true;\n\n let isMatch = true;\n for (let i = 0; i < where.length; i++) {\n const condition = where[i]!;\n const connector = i > 0 ? (where[i - 1]?.connector ?? \"AND\") : \"AND\";\n const conditionMatches = this.matchCondition(record, condition);\n\n if (connector === \"OR\") {\n isMatch = isMatch || conditionMatches;\n } else {\n isMatch = isMatch && conditionMatches;\n }\n }\n\n return isMatch;\n }\n\n async create<T extends Record<string, unknown>>(options: CreateOptions<T>): Promise<T> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n let dataToInsert = options.data as Record<string, unknown>;\n dataToInsert = await runHooks.beforeCreate(this.hooks, dataToInsert, context);\n\n if (!dataToInsert.id) {\n throw new Error(\"MemoryDbAdapter requires 'id' in data for create operations\");\n }\n\n const serializedData = serializeData(fields, dataToInsert);\n const clonedData = JSON.parse(JSON.stringify(serializedData));\n table.set(String(clonedData.id), clonedData);\n\n const resultRecord = deserializeData(fields, clonedData) as T;\n await runHooks.afterCreate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n private populateRecord(\n record: Record<string, unknown>,\n model: string,\n populate: string[]\n ): Record<string, unknown> {\n const result = JSON.parse(JSON.stringify(record));\n const sortedPopulate = [...populate].sort((a, b) => a.split(\".\").length - b.split(\".\").length);\n\n for (const path of sortedPopulate) {\n const parts = path.split(\".\");\n let currentObj = result;\n let currentModel = model;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n const fieldDef = this.schema?.[currentModel]?.fields[part];\n\n if (fieldDef?.references) {\n const relatedTable = this.getTable(fieldDef.references.model);\n const localValue = currentObj[part];\n if (localValue === undefined || localValue === null) break;\n\n // If already populated (e.g. by a previous path segment), use that\n const relatedId = typeof localValue === \"object\" ? localValue.id : localValue;\n const relatedRecord = relatedTable.get(String(relatedId));\n\n if (relatedRecord) {\n currentObj[part] = JSON.parse(JSON.stringify(relatedRecord));\n currentModel = fieldDef.references.model;\n currentObj = currentObj[part];\n } else {\n break;\n }\n } else {\n break;\n }\n }\n }\n return result;\n }\n\n async findOne<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T | null> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n\n for (const record of table.values()) {\n if (\n this.matchesWhere(record, options.where, options.model, {\n withDeleted: options.withDeleted,\n })\n ) {\n let result = record;\n if (options.populate) {\n result = this.populateRecord(record, options.model, options.populate);\n }\n return deserializeData(fields, JSON.parse(JSON.stringify(result))) as T;\n }\n }\n return null;\n }\n\n async findMany<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T[]> {\n const table = this.getTable(options.model);\n let results: T[] = [];\n\n for (const record of table.values()) {\n if (\n this.matchesWhere(record, options.where, options.model, {\n withDeleted: options.withDeleted,\n })\n ) {\n results.push(JSON.parse(JSON.stringify(record)) as T);\n }\n }\n\n if (options.sortBy) {\n const { field, direction } = options.sortBy;\n results.sort((a, b) => {\n const valA = a[field] as string | number;\n const valB = b[field] as string | number;\n if (valA < valB) return direction === \"asc\" ? -1 : 1;\n if (valA > valB) return direction === \"asc\" ? 1 : -1;\n return 0;\n });\n }\n\n if (options.offset) results = results.slice(options.offset);\n if (options.limit) results = results.slice(0, options.limit);\n\n return results;\n }\n\n async update<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<T | null> {\n const table = this.getTable(options.model);\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n const target = await this.findOne({ model: options.model, where: options.where });\n if (!target) return null;\n\n let updatedData = { ...target, ...(options.update as Record<string, unknown>) };\n updatedData = await runHooks.beforeUpdate(this.hooks, updatedData, context);\n\n const serializedUpdate = serializeData(fields, updatedData);\n const mergedData = { ...target, ...serializedUpdate };\n\n const clonedData = JSON.parse(JSON.stringify(mergedData));\n table.set(String(target.id), clonedData);\n\n const resultRecord = deserializeData(fields, clonedData) as T;\n await runHooks.afterUpdate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async updateMany<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<number> {\n const targets = await this.findMany({ model: options.model, where: options.where });\n for (const target of targets) {\n await this.update({\n model: options.model,\n where: [{ field: \"id\", value: target.id }],\n update: options.update,\n });\n }\n return targets.length;\n }\n\n async delete(options: DeleteOptions): Promise<void> {\n const context = this.getHookContext(options.model);\n const definition = this.getModelDefinition(options.model);\n\n await runHooks.beforeDelete(this.hooks, options.where, context);\n\n if (definition?.softDelete) {\n await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n } else {\n const table = this.getTable(options.model);\n const targets = await this.findMany({ model: options.model, where: options.where });\n for (const target of targets) {\n table.delete(String(target.id));\n }\n }\n\n await runHooks.afterDelete(this.hooks, options.where, context);\n }\n\n async deleteMany(options: DeleteOptions): Promise<number> {\n const targets = await this.findMany({ model: options.model, where: options.where });\n await this.delete(options);\n return targets.length;\n }\n\n async count(options: CountOptions): Promise<number> {\n const results = await this.findMany({ ...options, limit: undefined, offset: undefined });\n return results.length;\n }\n\n clear(): void {\n this.store.clear();\n }\n\n async raw<T = unknown>(query: string): Promise<T> {\n if (query === \"clear\") {\n this.clear();\n return true as unknown as T;\n }\n throw new Error(\"MemoryDbAdapter only supports 'clear' as raw query.\");\n }\n\n async transaction<R>(callback: (trx: DatabaseTransactionAdapter) => Promise<R>): Promise<R> {\n return await callback(this as unknown as DatabaseTransactionAdapter);\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __getMetadata(): Promise<TableMetadata[]> {\n const metadata: TableMetadata[] = [];\n for (const [tableName, table] of this.store.entries()) {\n const columns = new Set<string>();\n for (const record of table.values()) {\n Object.keys(record).forEach((k) => columns.add(k));\n }\n metadata.push({\n name: tableName,\n columns: Array.from(columns).map((name) => ({\n name,\n dataType: \"text\",\n isNullable: true,\n })),\n });\n }\n return metadata;\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __executeMigration(operation: MigrationOperation): Promise<void> {\n if (operation.type === \"createTable\") {\n this.getTable(operation.table);\n }\n // Other operations are implicitly handled by the schemaless nature of MemoryDbAdapter\n }\n}\n","import { Kysely, sql } from \"kysely\";\nimport type {\n DatabaseAdapter,\n DatabaseTransactionAdapter,\n WhereClause,\n CreateOptions,\n FindOptions,\n UpdateOptions,\n DeleteOptions,\n CountOptions,\n} from \"@better-media/core\";\nimport type {\n FieldType,\n FieldDefinition,\n BmSchema,\n DbHooks,\n DatabaseHookContext,\n ModelDefinition,\n MigrationOperation,\n SqlDialect,\n TableMetadata,\n} from \"@better-media/core\";\nimport { serializeData, deserializeData, runHooks, getColumnType } from \"@better-media/core\";\nimport type { KyselyDbConfig } from \"./kysely-db-config.interface\";\n\nexport interface KyselyDbOptions {\n config: KyselyDbConfig;\n schema: BmSchema;\n hooks?: DbHooks;\n}\n\nexport type DbSchema = Record<string, Record<string, unknown>>;\n\ntype AnyFunction = (...args: unknown[]) => unknown;\n\ntype KyselyBuilder = {\n where: (field: string, op: string, value: unknown) => KyselyBuilder;\n orWhere: (field: string, op: string, value: unknown) => KyselyBuilder;\n select: (fields: unknown) => KyselyBuilder;\n selectAll: () => KyselyBuilder;\n leftJoin: (table: string, left: string, right: string) => KyselyBuilder;\n orderBy: (field: string, direction: string) => KyselyBuilder;\n limit: (n: number) => KyselyBuilder;\n offset: (n: number) => KyselyBuilder;\n set: (data: Record<string, unknown>) => KyselyBuilder;\n values: (data: Record<string, unknown>) => KyselyBuilder;\n returningAll: () => KyselyBuilder;\n execute: () => Promise<unknown[] & { numUpdatedRows?: number; numDeletedRows?: number }>;\n executeTakeFirst: () => Promise<unknown>;\n};\n\n/**\n * SQL database adapter using Kysely.\n */\nexport class KyselyDbAdapter implements DatabaseAdapter {\n private readonly db: Kysely<DbSchema>;\n private readonly config: KyselyDbConfig;\n private readonly schema: BmSchema;\n private readonly hooks?: DbHooks;\n\n constructor(db: Kysely<DbSchema>, options: KyselyDbOptions) {\n this.db = db;\n this.config = options.config;\n this.schema = options.schema;\n this.hooks = options.hooks;\n }\n\n private getModelFields(model: string): Record<string, { type: FieldType }> {\n return this.schema[model]?.fields ?? {};\n }\n\n private getModelDefinition(model: string): ModelDefinition | undefined {\n return this.schema[model];\n }\n\n private getHookContext(model: string, trx?: DatabaseTransactionAdapter): DatabaseHookContext {\n return {\n model,\n adapter: this,\n transaction: trx,\n };\n }\n\n private applyWhere(\n qb: KyselyBuilder,\n where?: WhereClause,\n model?: string,\n options?: { withDeleted?: boolean }\n ): KyselyBuilder {\n let currentQb = qb;\n const definition = model ? this.getModelDefinition(model) : undefined;\n\n // Soft delete filtering\n if (definition?.softDelete && !options?.withDeleted) {\n currentQb = currentQb.where(\"deletedAt\", \"is\", null);\n }\n\n if (!where || where.length === 0) return currentQb;\n\n for (let i = 0; i < where.length; i++) {\n const condition = where[i];\n if (!condition) continue;\n\n const connector = i > 0 ? (where[i - 1]?.connector ?? \"AND\") : \"AND\";\n const field = condition.field;\n let operator = condition.operator ?? \"=\";\n let value = condition.value;\n\n if (operator === \"contains\") {\n operator = \"like\";\n value = `%${value}%`;\n } else if (operator === \"starts_with\") {\n operator = \"like\";\n value = `${value}%`;\n } else if (operator === \"ends_with\") {\n operator = \"like\";\n value = `%${value}`;\n } else if (operator === \"not_in\") {\n operator = \"not in\" as \"in\";\n }\n\n const method = (connector === \"OR\" ? \"orWhere\" : \"where\") as keyof KyselyBuilder;\n currentQb = (currentQb[method] as AnyFunction)(field, operator, value) as KyselyBuilder;\n }\n\n return currentQb;\n }\n\n async create<T extends Record<string, unknown>>(options: CreateOptions<T>): Promise<T> {\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n let dataToInsert = options.data as Record<string, unknown>;\n dataToInsert = await runHooks.beforeCreate(this.hooks, dataToInsert, context);\n\n const serializedData = serializeData(fields, dataToInsert);\n let resultRecord: T;\n\n if (this.config.provider === \"sqlite\") {\n await (this.db.insertInto(options.model) as unknown as KyselyBuilder)\n .values(serializedData)\n .execute();\n\n const refetched = await (this.db.selectFrom(options.model) as unknown as KyselyBuilder)\n .selectAll()\n .where(\"id\", \"=\", serializedData.id)\n .executeTakeFirst();\n\n resultRecord = deserializeData(\n fields,\n (refetched as Record<string, unknown>) || serializedData\n ) as T;\n } else {\n const result =\n (await (this.db.insertInto(options.model) as unknown as KyselyBuilder)\n .values(serializedData)\n .returningAll()\n .executeTakeFirst()) || serializedData;\n\n resultRecord = deserializeData(fields, result as Record<string, unknown>) as T;\n }\n\n await runHooks.afterCreate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async findOne<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T | null> {\n const fields = this.getModelFields(options.model);\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n\n if (options.select) {\n qb = qb.select(options.select);\n } else {\n qb = qb.selectAll();\n }\n\n qb = this.applyWhere(qb, options.where, options.model, { withDeleted: options.withDeleted });\n\n if (options.populate) {\n // Basic population via left joins if references exist\n for (const relation of options.populate) {\n const fieldDef = this.schema[options.model]?.fields[relation];\n if (fieldDef?.references) {\n qb = qb.leftJoin(\n fieldDef.references.model,\n `${options.model}.${relation}`,\n `${fieldDef.references.model}.${fieldDef.references.field}`\n );\n }\n }\n }\n\n const result = await qb.executeTakeFirst();\n if (!result) return null;\n\n return deserializeData(fields, result as Record<string, unknown>) as T;\n }\n\n async findMany<T extends Record<string, unknown>>(options: FindOptions<T>): Promise<T[]> {\n const fields = this.getModelFields(options.model);\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n\n if (options.select) {\n qb = qb.select(options.select);\n } else {\n qb = qb.selectAll();\n }\n\n qb = this.applyWhere(qb, options.where, options.model, { withDeleted: options.withDeleted });\n\n if (options.sortBy) {\n qb = qb.orderBy(options.sortBy.field, options.sortBy.direction);\n }\n\n if (options.limit !== undefined) qb = qb.limit(options.limit);\n if (options.offset !== undefined) qb = qb.offset(options.offset);\n\n const results = await (qb as { execute: AnyFunction }).execute();\n return (results as Record<string, unknown>[]).map((row) => deserializeData(fields, row)) as T[];\n }\n\n async update<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<T | null> {\n const fields = this.getModelFields(options.model);\n const context = this.getHookContext(options.model);\n\n // We still need the current record for hooks (merging data)\n const target = await this.findOne({ model: options.model, where: options.where });\n if (!target) return null;\n\n let updatedData = { ...target, ...(options.update as Record<string, unknown>) };\n updatedData = await runHooks.beforeUpdate(this.hooks, updatedData, context);\n\n const updatePayload = serializeData(fields, options.update as Record<string, unknown>);\n\n let qb = (this.db.updateTable(options.model) as unknown as KyselyBuilder).set(updatePayload);\n qb = this.applyWhere(qb, options.where, options.model);\n\n let resultRecord: T;\n if (this.config.provider === \"sqlite\") {\n await qb.execute();\n resultRecord = deserializeData(fields, serializeData(fields, updatedData)) as T;\n } else {\n const result = await (qb as unknown as KyselyBuilder).returningAll().executeTakeFirst();\n resultRecord = deserializeData(\n fields,\n (result as Record<string, unknown>) || serializeData(fields, updatedData)\n ) as T;\n }\n\n await runHooks.afterUpdate(this.hooks, resultRecord as Record<string, unknown>, context);\n return resultRecord;\n }\n\n async updateMany<T extends Record<string, unknown>>(options: UpdateOptions<T>): Promise<number> {\n const fields = this.getModelFields(options.model);\n const updatePayload = serializeData(fields, options.update as Record<string, unknown>);\n\n let qb = (this.db.updateTable(options.model) as unknown as KyselyBuilder).set(updatePayload);\n qb = this.applyWhere(\n qb as unknown as KyselyBuilder,\n options.where,\n options.model\n ) as KyselyBuilder;\n\n const results = (await qb.execute()) as unknown as { numUpdatedRows: bigint | number }[];\n return Number(results[0]?.numUpdatedRows || 0);\n }\n\n async delete(options: DeleteOptions): Promise<void> {\n const context = this.getHookContext(options.model);\n const definition = this.getModelDefinition(options.model);\n\n await runHooks.beforeDelete(this.hooks, options.where, context);\n\n if (definition?.softDelete) {\n await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n } else {\n let qb = this.db.deleteFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n await qb.execute();\n }\n\n await runHooks.afterDelete(this.hooks, options.where, context);\n }\n\n async deleteMany(options: DeleteOptions): Promise<number> {\n const definition = this.getModelDefinition(options.model);\n\n if (definition?.softDelete) {\n return await this.updateMany({\n model: options.model,\n where: options.where,\n update: { deletedAt: new Date() } as unknown as Record<string, unknown>,\n });\n }\n\n let qb = this.db.deleteFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n\n const results = (await qb.execute()) as unknown as { numDeletedRows: bigint | number }[];\n return Number(results[0]?.numDeletedRows || 0);\n }\n\n async count(options: CountOptions): Promise<number> {\n let qb = this.db.selectFrom(options.model) as unknown as KyselyBuilder;\n qb = this.applyWhere(qb, options.where, options.model);\n\n const { count } = this.db.fn as unknown as {\n count: (f: string) => { as: (a: string) => unknown };\n };\n qb = qb.select(count(\"id\").as(\"c\"));\n\n const result = (await qb.executeTakeFirst()) as { c: string | number } | undefined;\n return Number(result?.c || 0);\n }\n\n async raw<T = unknown>(query: string, params?: unknown[]): Promise<T> {\n const result = await (\n sql as unknown as {\n raw: (q: string, p: unknown) => { execute: (db: unknown) => Promise<{ rows: T }> };\n }\n )\n .raw(query, params)\n .execute(this.db);\n return result.rows;\n }\n\n async transaction<R>(callback: (trx: DatabaseTransactionAdapter) => Promise<R>): Promise<R> {\n return (await (\n this.db.transaction() as unknown as {\n execute: (cb: (trx: Kysely<DbSchema>) => Promise<R>) => Promise<R>;\n }\n ).execute(async (trx) => {\n const trxAdapter = new KyselyDbAdapter(trx, {\n config: this.config,\n schema: this.schema,\n hooks: this.hooks,\n });\n return await callback(trxAdapter);\n })) as R;\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __getMetadata(): Promise<TableMetadata[]> {\n const tables = await this.db.introspection.getTables();\n const dialect = this.__getDialect();\n\n let filtered = tables;\n if (dialect === \"postgres\") {\n const currentSchema = await this.getPostgresSchema();\n filtered = tables.filter((table) => {\n const schema = (table as unknown as { schema?: string }).schema;\n return !schema || schema === currentSchema;\n });\n }\n\n return filtered.map((table) => ({\n name: table.name,\n columns: table.columns.map((col) => ({\n name: col.name,\n dataType: col.dataType,\n isNullable: col.isNullable ?? true,\n })),\n }));\n }\n\n private async getPostgresSchema(): Promise<string> {\n try {\n const result = await sql<{\n search_path?: string;\n searchPath?: string;\n }>`SHOW search_path`.execute(this.db);\n const searchPath = result.rows[0]?.search_path ?? result.rows[0]?.searchPath;\n if (!searchPath) return \"public\";\n const schemas = searchPath\n .split(\",\")\n .map((s) => s.trim())\n .map((s) => s.replace(/^[\"']|[\"']$/g, \"\"))\n .filter((s) => !s.startsWith(\"$\") && !s.startsWith(\"\\\\$\"));\n return schemas[0] || \"public\";\n } catch {\n return \"public\";\n }\n }\n\n /** @internal Used by runMigrations to auto-detect the SQL dialect. */\n __getDialect(): SqlDialect {\n switch (this.config.provider) {\n case \"pg\":\n return \"postgres\";\n case \"mysql\":\n return \"mysql\";\n case \"sqlite\":\n return \"sqlite\";\n default:\n return \"postgres\";\n }\n }\n\n /** @internal Used by runMigrations — not part of the public DatabaseAdapter contract. */\n async __executeMigration(operation: MigrationOperation): Promise<void> {\n const dialect = this.__getDialect();\n\n if (operation.type === \"createTable\") {\n let builder = this.db.schema.createTable(operation.table).ifNotExists();\n\n for (const [name, field] of Object.entries(operation.definition.fields) as [\n string,\n FieldDefinition,\n ][]) {\n const type = getColumnType(field, dialect);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n builder = builder.addColumn(name, type as any, (col: any) => {\n if (field.primaryKey) col = col.primaryKey();\n if (field.required) col = col.notNull();\n if (field.unique) col = col.unique();\n if (field.references) {\n col = col\n .references(`${field.references.model}.${field.references.field}`)\n .onDelete(field.references.onDelete || \"cascade\");\n }\n return col;\n });\n }\n await builder.execute();\n\n // Create indexes\n if (operation.definition.indexes) {\n for (const index of operation.definition.indexes) {\n const indexName = `idx_${operation.table}_${index.fields.join(\"_\")}`;\n let indexBuilder = this.db.schema\n .createIndex(indexName)\n .on(operation.table)\n .columns(index.fields);\n if (index.unique) {\n indexBuilder = indexBuilder.unique();\n }\n await indexBuilder.execute();\n }\n }\n } else if (operation.type === \"addColumn\") {\n const type = getColumnType(operation.definition, dialect);\n await this.db.schema\n .alterTable(operation.table)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .addColumn(operation.field, type as any, (col: any) => {\n if (operation.definition.required) col = col.notNull();\n if (operation.definition.unique) col = col.unique();\n if (operation.definition.references) {\n col = col\n .references(\n `${operation.definition.references.model}.${operation.definition.references.field}`\n )\n .onDelete(operation.definition.references.onDelete || \"cascade\");\n }\n return col;\n })\n .execute();\n } else if (operation.type === \"createIndex\") {\n let builder = this.db.schema\n .createIndex(operation.name)\n .on(operation.table)\n .columns(operation.fields);\n if (operation.unique) {\n builder = builder.unique();\n }\n await builder.execute();\n }\n }\n}\n","// Types and schemas are now exported from \"@better-media/framework\" directly.\nexport * from \"./adapters/memory/memory-db.adapter\";\nexport * from \"./adapters/kysely/kysely-db.adapter\";\n// MongoDB implementation lives in @better-media/mongodb-adapter; re-exported here for convenience.\nexport * from \"./adapters/mongodb/index\";\nexport type { KyselyDbConfig } from \"./adapters/kysely/kysely-db-config.interface\";\n\n// Backwards compatibility for the old memoryDatabase export\nimport { MemoryDbAdapter } from \"./adapters/memory/memory-db.adapter\";\nimport type { DatabaseAdapter } from \"@better-media/core\";\n\nexport function memoryDatabase(): DatabaseAdapter {\n // Return a proxy that supports the new DatabaseAdapter interface + the old get/put methods\n // for the legacy adapters that haven't been migrated to the new schema-driven architecture yet.\n const adapter = new MemoryDbAdapter();\n return new Proxy(adapter, {\n get(target, prop, receiver) {\n if (prop === \"get\") {\n return async (key: string) => {\n const res = await adapter.findOne({\n model: \"legacy\",\n where: [{ field: \"id\", value: key }],\n });\n return res;\n };\n }\n if (prop === \"put\") {\n return async (key: string, data: Record<string, unknown>) => {\n await adapter.create({ model: \"legacy\", data: { id: key, ...data } });\n };\n }\n if (prop === \"delete\") {\n return async (key: string) => {\n await adapter.delete({ model: \"legacy\", where: [{ field: \"id\", value: key }] });\n };\n }\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-media/adapter-db",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Database adapter interfaces and implementations for Better Media",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -27,9 +27,9 @@
27
27
  "README.md"
28
28
  ],
29
29
  "dependencies": {
30
- "@better-media/core": "0.1.0",
31
- "better-media": "1.0.0",
32
- "@better-media/mongodb-adapter": "0.1.0"
30
+ "@better-media/core": "0.2.0",
31
+ "@better-media/framework": "0.2.0",
32
+ "@better-media/mongodb-adapter": "0.1.2"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "kysely": "^0.27.0 || ^0.28.0",
@@ -57,7 +57,7 @@
57
57
  "type": "git",
58
58
  "url": "git+https://github.com/AbenezerAtnafu/better-media.git"
59
59
  },
60
- "homepage": "https://better-media.dev",
60
+ "homepage": "https://better-media-platform.vercel.app/",
61
61
  "bugs": {
62
62
  "url": "https://github.com/AbenezerAtnafu/better-media/issues"
63
63
  },