// noinspection UnnecessaryLocalVariableJS import Dexie from "dexie" import type { DexieDatabaseTableNames, DexieTableConfig } from "./types/index" /** * Create a dexie database instance with the provided schema * * @template Schema * @param {string} dbName * @param {number} version * @param {Record} schema * @return {DexieDatabase} */ export function createDexieDatabase< Schema extends {}, DB extends Dexie, TableName extends DexieDatabaseTableNames = DexieDatabaseTableNames >(dbName: string, version: number, schema: Schema): DB { const tableDefs = Object.entries(schema) as unknown as Array< [TableName, DexieTableConfig] >, // Create Record mapping table name to index sig for the table dexieSchema = Object.fromEntries( tableDefs.map(([tableName, [, , indexSig]]) => [tableName, indexSig]) ) // Create dexie instance const dexie = new Dexie(dbName) as DB // Define the schema dexie.version(version).stores(dexieSchema) // Assign {@link ClassConstructor} to table tableDefs .filter(([, [, , , config]]) => config?.mapToClass !== false) .forEach(([tableName, [ctor]]) => { const table = dexie[ tableName as keyof typeof dexie ] as unknown as Dexie.Table table.mapToClass(ctor) }) return dexie as DB }