@hedystia/db 2.1.1 → 2.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.cjs","names":["BaseDriver","DriverError","compileCreateTable","compileColumnDef"],"sources":["../../src/drivers/sqlite.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, SQLiteConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\nimport { compileColumnDef, compileCreateTable } from \"./sql-compiler\";\n\n/**\n * Interface for SQLite database adapters\n */\ninterface SQLiteAdapter {\n close(): void | Promise<void>;\n prepare(sql: string): SQLiteStatement;\n exec(sql: string): void | Promise<void>;\n}\n\ninterface SQLiteStatement {\n run(...params: any[]): any | Promise<any>;\n all(...params: any[]): any[] | Promise<any[]>;\n}\n\n/**\n * SQLite database driver supporting multiple libraries (better-sqlite3, sqlite3, sql.js, bun:sqlite)\n */\nexport class SQLiteDriver extends BaseDriver {\n private db: SQLiteAdapter | null = null;\n private config: SQLiteConnectionConfig;\n private provider?: \"better-sqlite3\" | \"sqlite3\" | \"sql.js\" | \"bun:sqlite\";\n\n constructor(\n config: SQLiteConnectionConfig,\n provider?: \"better-sqlite3\" | \"sqlite3\" | \"sql.js\" | \"bun:sqlite\",\n ) {\n super();\n this.config = config;\n this.provider = provider;\n }\n\n /**\n * Connect to the SQLite database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const adapter = await this.getAdapter();\n this.db = adapter;\n await this.db.exec(\"PRAGMA journal_mode=WAL\");\n await this.db.exec(\"PRAGMA foreign_keys=ON\");\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to SQLite database: ${err.message}`);\n }\n }\n\n private async getAdapter(): Promise<SQLiteAdapter> {\n const provider = this.provider;\n\n if (!provider || provider === \"better-sqlite3\") {\n try {\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const Database = BetterSqlite3.default || BetterSqlite3;\n return new Database(this.config.filename) as any;\n } catch (err) {\n if (provider === \"better-sqlite3\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"sqlite3\") {\n try {\n const sqlite3 = await import(\"sqlite3\");\n const db = new sqlite3.Database(this.config.filename);\n\n return {\n close: () => new Promise<void>((res, rej) => db.close((err) => (err ? rej(err) : res()))),\n exec: (sql: string) =>\n new Promise<void>((res, rej) => db.exec(sql, (err) => (err ? rej(err) : res()))),\n prepare: (sql: string) => ({\n run: (...params: any[]) =>\n new Promise<{ lastInsertRowid: number; changes: number }>((res, rej) => {\n db.run(sql, params, function (this: any, err: Error | null) {\n if (err) {\n return rej(err);\n }\n res({ lastInsertRowid: this.lastID, changes: this.changes });\n });\n }),\n all: (...params: any[]) =>\n new Promise<any[]>((res, rej) => {\n db.all(sql, params, (err, rows) => (err ? rej(err) : res(rows)));\n }),\n }),\n } as any;\n } catch (err) {\n if (provider === \"sqlite3\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"sql.js\") {\n try {\n const initSqlJs = await import(\"sql.js\");\n const SQL = await initSqlJs.default();\n const fs = await import(\"fs\");\n let data: Buffer | undefined;\n if (fs.existsSync(this.config.filename)) {\n data = fs.readFileSync(this.config.filename);\n }\n const db = new SQL.Database(data);\n return {\n close: () => {\n const binaryArray = db.export();\n fs.writeFileSync(this.config.filename, Buffer.from(binaryArray));\n db.close();\n },\n exec: (sql: string) => db.run(sql),\n prepare: (sql: string) => {\n const stmt = db.prepare(sql);\n return {\n run: (...params: any[]) => {\n stmt.run(params);\n const result = db.exec(\"SELECT last_insert_rowid()\");\n const lastInsertRowid = result[0]?.values[0]\n ? (result[0].values[0][0] as number)\n : 0;\n return { lastInsertRowid, changes: db.getRowsModified() };\n },\n all: (...params: any[]) => {\n const rows: any[] = [];\n stmt.bind(params);\n while (stmt.step()) {\n rows.push(stmt.getAsObject());\n }\n return rows;\n },\n };\n },\n } as any;\n } catch (err) {\n if (provider === \"sql.js\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"bun:sqlite\") {\n try {\n const { Database } = await import(\"bun:sqlite\");\n return new Database(this.config.filename) as any;\n } catch (err) {\n if (provider === \"bun:sqlite\") {\n throw err;\n }\n }\n }\n\n throw new Error(\n provider\n ? `SQLite provider \"${provider}\" not found.`\n : \"No SQLite driver found. Please install better-sqlite3, sqlite3, sql.js or run with Bun.\",\n );\n }\n\n /**\n * Disconnect from the SQLite database\n */\n async disconnect(): Promise<void> {\n if (this.db) {\n try {\n await this.db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n } catch {}\n await this.db.close();\n this.db = null;\n this.connected = false;\n }\n }\n\n /**\n * Execute a SQL statement\n * @param {string} sql - SQL statement\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any>} Execution result with lastInsertRowid and changes\n */\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n try {\n const formatted = this.formatParams(params);\n if (formatted.length === 0) {\n await this.db!.exec(sql);\n return { insertId: 0, affectedRows: 0 };\n }\n const stmt = this.db!.prepare(sql);\n const result = await stmt.run(...formatted);\n return {\n insertId: Number(result.lastInsertRowid),\n affectedRows: result.changes,\n };\n } catch (err: any) {\n throw new DriverError(`SQLite execute error: ${err.message}`);\n }\n }\n\n /**\n * Execute a SQL query\n * @param {string} sql - SQL query\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any[]>} Query results\n */\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n try {\n const stmt = this.db!.prepare(sql);\n return await stmt.all(...this.formatParams(params));\n } catch (err: any) {\n throw new DriverError(`SQLite query error: ${err.message}`);\n }\n }\n\n private formatParams(params: unknown[]): any[] {\n return params.map((p) => {\n if (p instanceof Date) {\n return p.toISOString();\n }\n return p;\n });\n }\n\n /**\n * Check if a table exists\n * @param {string} name - Table name\n * @returns {Promise<boolean>} Whether the table exists\n */\n async tableExists(name: string): Promise<boolean> {\n const rows = await this.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name=?\", [\n name,\n ]);\n return rows.length > 0;\n }\n\n /**\n * Get column metadata for a table\n * @param {string} name - Table name\n * @returns {Promise<ColumnMetadata[]>} Column metadata\n */\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const rows = (await this.query(`PRAGMA table_info(\\`${name}\\`)`)) as any[];\n return rows.map((row: any) => ({\n name: row.name,\n type: this.mapSQLiteType(row.type),\n primaryKey: row.pk === 1,\n autoIncrement: row.pk === 1 && row.type.toUpperCase() === \"INTEGER\",\n notNull: row.notnull === 1,\n unique: false,\n defaultValue: row.dflt_value,\n }));\n }\n\n /**\n * Create a table from metadata\n * @param {TableMetadata} meta - Table metadata\n */\n async createTable(meta: TableMetadata): Promise<void> {\n const sql = compileCreateTable(meta, \"sqlite\");\n await this.execute(sql);\n }\n\n /**\n * Drop a table\n * @param {string} name - Table name\n */\n async dropTable(name: string): Promise<void> {\n await this.execute(`DROP TABLE IF EXISTS \\`${name}\\``);\n }\n\n /**\n * Add a column to a table\n * @param {string} table - Table name\n * @param {ColumnMetadata} column - Column metadata\n */\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const colDef = compileColumnDef(column, \"sqlite\");\n await this.execute(`ALTER TABLE \\`${table}\\` ADD COLUMN ${colDef}`);\n }\n\n /**\n * Drop a column from a table\n * @param {string} table - Table name\n * @param {string} name - Column name\n */\n async dropColumn(table: string, name: string): Promise<void> {\n await this.execute(`ALTER TABLE \\`${table}\\` DROP COLUMN \\`${name}\\``);\n }\n\n /**\n * Rename a column\n * @param {string} table - Table name\n * @param {string} oldName - Current name\n * @param {string} newName - New name\n */\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n await this.execute(`ALTER TABLE \\`${table}\\` RENAME COLUMN \\`${oldName}\\` TO \\`${newName}\\``);\n }\n\n /**\n * Execute within a transaction\n * @param {() => Promise<T>} fn - Function to execute\n * @returns {Promise<T>} Result\n */\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n await this.execute(\"BEGIN TRANSACTION\");\n try {\n const result = await fn();\n await this.execute(\"COMMIT\");\n return result;\n } catch (err) {\n await this.execute(\"ROLLBACK\");\n throw err;\n }\n }\n\n /**\n * Fetch all column metadata for all tables in the database\n * @returns {Promise<Record<string, ColumnMetadata[]>>} Columns grouped by table name\n */\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n try {\n const tables = await this.query(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\",\n );\n const result: Record<string, ColumnMetadata[]> = {};\n\n for (const table of tables) {\n const tableName = table.name;\n result[tableName] = await this.getTableColumns(tableName);\n }\n return result;\n } catch (err: any) {\n throw new DriverError(`Failed to fetch all table columns: ${err.message}`);\n }\n }\n\n private mapSQLiteType(type: string): ColumnMetadata[\"type\"] {\n const upper = type.toUpperCase();\n if (upper.includes(\"INT\")) {\n return \"integer\";\n }\n if (upper.includes(\"CHAR\") || upper.includes(\"TEXT\") || upper.includes(\"CLOB\")) {\n return \"text\";\n }\n if (upper.includes(\"REAL\") || upper.includes(\"FLOAT\") || upper.includes(\"DOUBLE\")) {\n return \"float\";\n }\n if (upper.includes(\"BLOB\")) {\n return \"blob\";\n }\n return \"text\";\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sqlite.cjs","names":["BaseDriver","DriverError","compileCreateTable","compileColumnDef"],"sources":["../../src/drivers/sqlite.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, SQLiteConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\nimport { compileColumnDef, compileCreateTable } from \"./sql-compiler\";\n\n/**\n * Interface for SQLite database adapters\n */\ninterface SQLiteAdapter {\n close(): void | Promise<void>;\n prepare(sql: string): SQLiteStatement;\n exec(sql: string): void | Promise<void>;\n}\n\ninterface SQLiteStatement {\n run(...params: any[]): any | Promise<any>;\n all(...params: any[]): any[] | Promise<any[]>;\n}\n\n/**\n * SQLite database driver supporting multiple libraries (better-sqlite3, sqlite3, sql.js, bun:sqlite)\n */\nexport class SQLiteDriver extends BaseDriver {\n readonly dialect = \"sqlite\" as const;\n private db: SQLiteAdapter | null = null;\n private config: SQLiteConnectionConfig;\n private provider?: \"better-sqlite3\" | \"sqlite3\" | \"sql.js\" | \"bun:sqlite\";\n\n constructor(\n config: SQLiteConnectionConfig,\n provider?: \"better-sqlite3\" | \"sqlite3\" | \"sql.js\" | \"bun:sqlite\",\n ) {\n super();\n this.config = config;\n this.provider = provider;\n }\n\n /**\n * Connect to the SQLite database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const adapter = await this.getAdapter();\n this.db = adapter;\n await this.db.exec(\"PRAGMA journal_mode=WAL\");\n await this.db.exec(\"PRAGMA foreign_keys=ON\");\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to SQLite database: ${err.message}`);\n }\n }\n\n private async getAdapter(): Promise<SQLiteAdapter> {\n const provider = this.provider;\n\n if (!provider || provider === \"better-sqlite3\") {\n try {\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const Database = BetterSqlite3.default || BetterSqlite3;\n return new Database(this.config.filename) as any;\n } catch (err) {\n if (provider === \"better-sqlite3\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"sqlite3\") {\n try {\n const sqlite3 = await import(\"sqlite3\");\n const db = new sqlite3.Database(this.config.filename);\n\n return {\n close: () => new Promise<void>((res, rej) => db.close((err) => (err ? rej(err) : res()))),\n exec: (sql: string) =>\n new Promise<void>((res, rej) => db.exec(sql, (err) => (err ? rej(err) : res()))),\n prepare: (sql: string) => ({\n run: (...params: any[]) =>\n new Promise<{ lastInsertRowid: number; changes: number }>((res, rej) => {\n db.run(sql, params, function (this: any, err: Error | null) {\n if (err) {\n return rej(err);\n }\n res({ lastInsertRowid: this.lastID, changes: this.changes });\n });\n }),\n all: (...params: any[]) =>\n new Promise<any[]>((res, rej) => {\n db.all(sql, params, (err, rows) => (err ? rej(err) : res(rows)));\n }),\n }),\n } as any;\n } catch (err) {\n if (provider === \"sqlite3\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"sql.js\") {\n try {\n const initSqlJs = await import(\"sql.js\");\n const SQL = await initSqlJs.default();\n const fs = await import(\"fs\");\n let data: Buffer | undefined;\n if (fs.existsSync(this.config.filename)) {\n data = fs.readFileSync(this.config.filename);\n }\n const db = new SQL.Database(data);\n return {\n close: () => {\n const binaryArray = db.export();\n fs.writeFileSync(this.config.filename, Buffer.from(binaryArray));\n db.close();\n },\n exec: (sql: string) => db.run(sql),\n prepare: (sql: string) => {\n const stmt = db.prepare(sql);\n return {\n run: (...params: any[]) => {\n stmt.run(params);\n const result = db.exec(\"SELECT last_insert_rowid()\");\n const lastInsertRowid = result[0]?.values[0]\n ? (result[0].values[0][0] as number)\n : 0;\n return { lastInsertRowid, changes: db.getRowsModified() };\n },\n all: (...params: any[]) => {\n const rows: any[] = [];\n stmt.bind(params);\n while (stmt.step()) {\n rows.push(stmt.getAsObject());\n }\n return rows;\n },\n };\n },\n } as any;\n } catch (err) {\n if (provider === \"sql.js\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"bun:sqlite\") {\n try {\n const { Database } = await import(\"bun:sqlite\");\n return new Database(this.config.filename) as any;\n } catch (err) {\n if (provider === \"bun:sqlite\") {\n throw err;\n }\n }\n }\n\n throw new Error(\n provider\n ? `SQLite provider \"${provider}\" not found.`\n : \"No SQLite driver found. Please install better-sqlite3, sqlite3, sql.js or run with Bun.\",\n );\n }\n\n /**\n * Disconnect from the SQLite database\n */\n async disconnect(): Promise<void> {\n if (this.db) {\n try {\n await this.db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n } catch {}\n await this.db.close();\n this.db = null;\n this.connected = false;\n }\n }\n\n /**\n * Execute a SQL statement\n * @param {string} sql - SQL statement\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any>} Execution result with lastInsertRowid and changes\n */\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n try {\n const formatted = this.formatParams(params);\n if (formatted.length === 0) {\n await this.db!.exec(sql);\n return { insertId: 0, affectedRows: 0 };\n }\n const stmt = this.db!.prepare(sql);\n const result = await stmt.run(...formatted);\n return {\n insertId: Number(result.lastInsertRowid),\n affectedRows: result.changes,\n };\n } catch (err: any) {\n throw new DriverError(`SQLite execute error: ${err.message}`);\n }\n }\n\n /**\n * Execute a SQL query\n * @param {string} sql - SQL query\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any[]>} Query results\n */\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n try {\n const stmt = this.db!.prepare(sql);\n return await stmt.all(...this.formatParams(params));\n } catch (err: any) {\n throw new DriverError(`SQLite query error: ${err.message}`);\n }\n }\n\n private formatParams(params: unknown[]): any[] {\n return params.map((p) => {\n if (p instanceof Date) {\n return p.toISOString();\n }\n return p;\n });\n }\n\n /**\n * Check if a table exists\n * @param {string} name - Table name\n * @returns {Promise<boolean>} Whether the table exists\n */\n async tableExists(name: string): Promise<boolean> {\n const rows = await this.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name=?\", [\n name,\n ]);\n return rows.length > 0;\n }\n\n /**\n * Get column metadata for a table\n * @param {string} name - Table name\n * @returns {Promise<ColumnMetadata[]>} Column metadata\n */\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const rows = (await this.query(`PRAGMA table_info(\\`${name}\\`)`)) as any[];\n return rows.map((row: any) => ({\n name: row.name,\n type: this.mapSQLiteType(row.type),\n primaryKey: row.pk === 1,\n autoIncrement: row.pk === 1 && row.type.toUpperCase() === \"INTEGER\",\n notNull: row.notnull === 1,\n unique: false,\n defaultValue: row.dflt_value,\n }));\n }\n\n /**\n * Create a table from metadata\n * @param {TableMetadata} meta - Table metadata\n */\n async createTable(meta: TableMetadata): Promise<void> {\n const sql = compileCreateTable(meta, \"sqlite\");\n await this.execute(sql);\n }\n\n /**\n * Drop a table\n * @param {string} name - Table name\n */\n async dropTable(name: string): Promise<void> {\n await this.execute(`DROP TABLE IF EXISTS \\`${name}\\``);\n }\n\n /**\n * Add a column to a table\n * @param {string} table - Table name\n * @param {ColumnMetadata} column - Column metadata\n */\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const colDef = compileColumnDef(column, \"sqlite\");\n await this.execute(`ALTER TABLE \\`${table}\\` ADD COLUMN ${colDef}`);\n }\n\n /**\n * Drop a column from a table\n * @param {string} table - Table name\n * @param {string} name - Column name\n */\n async dropColumn(table: string, name: string): Promise<void> {\n await this.execute(`ALTER TABLE \\`${table}\\` DROP COLUMN \\`${name}\\``);\n }\n\n /**\n * Rename a column\n * @param {string} table - Table name\n * @param {string} oldName - Current name\n * @param {string} newName - New name\n */\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n await this.execute(`ALTER TABLE \\`${table}\\` RENAME COLUMN \\`${oldName}\\` TO \\`${newName}\\``);\n }\n\n /**\n * Execute within a transaction\n * @param {() => Promise<T>} fn - Function to execute\n * @returns {Promise<T>} Result\n */\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n await this.execute(\"BEGIN TRANSACTION\");\n try {\n const result = await fn();\n await this.execute(\"COMMIT\");\n return result;\n } catch (err) {\n await this.execute(\"ROLLBACK\");\n throw err;\n }\n }\n\n /**\n * Fetch all column metadata for all tables in the database\n * @returns {Promise<Record<string, ColumnMetadata[]>>} Columns grouped by table name\n */\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n try {\n const tables = await this.query(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\",\n );\n const result: Record<string, ColumnMetadata[]> = {};\n\n for (const table of tables) {\n const tableName = table.name;\n result[tableName] = await this.getTableColumns(tableName);\n }\n return result;\n } catch (err: any) {\n throw new DriverError(`Failed to fetch all table columns: ${err.message}`);\n }\n }\n\n private mapSQLiteType(type: string): ColumnMetadata[\"type\"] {\n const upper = type.toUpperCase();\n if (upper.includes(\"INT\")) {\n return \"integer\";\n }\n if (upper.includes(\"CHAR\") || upper.includes(\"TEXT\") || upper.includes(\"CLOB\")) {\n return \"text\";\n }\n if (upper.includes(\"REAL\") || upper.includes(\"FLOAT\") || upper.includes(\"DOUBLE\")) {\n return \"float\";\n }\n if (upper.includes(\"BLOB\")) {\n return \"blob\";\n }\n return \"text\";\n }\n}\n"],"mappings":"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"}
@@ -9,6 +9,7 @@ var init_sqlite = __esmMin((() => {
9
9
  init_driver();
10
10
  init_sql_compiler();
11
11
  SQLiteDriver = class extends BaseDriver {
12
+ dialect = "sqlite";
12
13
  db = null;
13
14
  config;
14
15
  provider;
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite.mjs","names":[],"sources":["../../src/drivers/sqlite.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, SQLiteConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\nimport { compileColumnDef, compileCreateTable } from \"./sql-compiler\";\n\n/**\n * Interface for SQLite database adapters\n */\ninterface SQLiteAdapter {\n close(): void | Promise<void>;\n prepare(sql: string): SQLiteStatement;\n exec(sql: string): void | Promise<void>;\n}\n\ninterface SQLiteStatement {\n run(...params: any[]): any | Promise<any>;\n all(...params: any[]): any[] | Promise<any[]>;\n}\n\n/**\n * SQLite database driver supporting multiple libraries (better-sqlite3, sqlite3, sql.js, bun:sqlite)\n */\nexport class SQLiteDriver extends BaseDriver {\n private db: SQLiteAdapter | null = null;\n private config: SQLiteConnectionConfig;\n private provider?: \"better-sqlite3\" | \"sqlite3\" | \"sql.js\" | \"bun:sqlite\";\n\n constructor(\n config: SQLiteConnectionConfig,\n provider?: \"better-sqlite3\" | \"sqlite3\" | \"sql.js\" | \"bun:sqlite\",\n ) {\n super();\n this.config = config;\n this.provider = provider;\n }\n\n /**\n * Connect to the SQLite database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const adapter = await this.getAdapter();\n this.db = adapter;\n await this.db.exec(\"PRAGMA journal_mode=WAL\");\n await this.db.exec(\"PRAGMA foreign_keys=ON\");\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to SQLite database: ${err.message}`);\n }\n }\n\n private async getAdapter(): Promise<SQLiteAdapter> {\n const provider = this.provider;\n\n if (!provider || provider === \"better-sqlite3\") {\n try {\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const Database = BetterSqlite3.default || BetterSqlite3;\n return new Database(this.config.filename) as any;\n } catch (err) {\n if (provider === \"better-sqlite3\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"sqlite3\") {\n try {\n const sqlite3 = await import(\"sqlite3\");\n const db = new sqlite3.Database(this.config.filename);\n\n return {\n close: () => new Promise<void>((res, rej) => db.close((err) => (err ? rej(err) : res()))),\n exec: (sql: string) =>\n new Promise<void>((res, rej) => db.exec(sql, (err) => (err ? rej(err) : res()))),\n prepare: (sql: string) => ({\n run: (...params: any[]) =>\n new Promise<{ lastInsertRowid: number; changes: number }>((res, rej) => {\n db.run(sql, params, function (this: any, err: Error | null) {\n if (err) {\n return rej(err);\n }\n res({ lastInsertRowid: this.lastID, changes: this.changes });\n });\n }),\n all: (...params: any[]) =>\n new Promise<any[]>((res, rej) => {\n db.all(sql, params, (err, rows) => (err ? rej(err) : res(rows)));\n }),\n }),\n } as any;\n } catch (err) {\n if (provider === \"sqlite3\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"sql.js\") {\n try {\n const initSqlJs = await import(\"sql.js\");\n const SQL = await initSqlJs.default();\n const fs = await import(\"fs\");\n let data: Buffer | undefined;\n if (fs.existsSync(this.config.filename)) {\n data = fs.readFileSync(this.config.filename);\n }\n const db = new SQL.Database(data);\n return {\n close: () => {\n const binaryArray = db.export();\n fs.writeFileSync(this.config.filename, Buffer.from(binaryArray));\n db.close();\n },\n exec: (sql: string) => db.run(sql),\n prepare: (sql: string) => {\n const stmt = db.prepare(sql);\n return {\n run: (...params: any[]) => {\n stmt.run(params);\n const result = db.exec(\"SELECT last_insert_rowid()\");\n const lastInsertRowid = result[0]?.values[0]\n ? (result[0].values[0][0] as number)\n : 0;\n return { lastInsertRowid, changes: db.getRowsModified() };\n },\n all: (...params: any[]) => {\n const rows: any[] = [];\n stmt.bind(params);\n while (stmt.step()) {\n rows.push(stmt.getAsObject());\n }\n return rows;\n },\n };\n },\n } as any;\n } catch (err) {\n if (provider === \"sql.js\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"bun:sqlite\") {\n try {\n const { Database } = await import(\"bun:sqlite\");\n return new Database(this.config.filename) as any;\n } catch (err) {\n if (provider === \"bun:sqlite\") {\n throw err;\n }\n }\n }\n\n throw new Error(\n provider\n ? `SQLite provider \"${provider}\" not found.`\n : \"No SQLite driver found. Please install better-sqlite3, sqlite3, sql.js or run with Bun.\",\n );\n }\n\n /**\n * Disconnect from the SQLite database\n */\n async disconnect(): Promise<void> {\n if (this.db) {\n try {\n await this.db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n } catch {}\n await this.db.close();\n this.db = null;\n this.connected = false;\n }\n }\n\n /**\n * Execute a SQL statement\n * @param {string} sql - SQL statement\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any>} Execution result with lastInsertRowid and changes\n */\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n try {\n const formatted = this.formatParams(params);\n if (formatted.length === 0) {\n await this.db!.exec(sql);\n return { insertId: 0, affectedRows: 0 };\n }\n const stmt = this.db!.prepare(sql);\n const result = await stmt.run(...formatted);\n return {\n insertId: Number(result.lastInsertRowid),\n affectedRows: result.changes,\n };\n } catch (err: any) {\n throw new DriverError(`SQLite execute error: ${err.message}`);\n }\n }\n\n /**\n * Execute a SQL query\n * @param {string} sql - SQL query\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any[]>} Query results\n */\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n try {\n const stmt = this.db!.prepare(sql);\n return await stmt.all(...this.formatParams(params));\n } catch (err: any) {\n throw new DriverError(`SQLite query error: ${err.message}`);\n }\n }\n\n private formatParams(params: unknown[]): any[] {\n return params.map((p) => {\n if (p instanceof Date) {\n return p.toISOString();\n }\n return p;\n });\n }\n\n /**\n * Check if a table exists\n * @param {string} name - Table name\n * @returns {Promise<boolean>} Whether the table exists\n */\n async tableExists(name: string): Promise<boolean> {\n const rows = await this.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name=?\", [\n name,\n ]);\n return rows.length > 0;\n }\n\n /**\n * Get column metadata for a table\n * @param {string} name - Table name\n * @returns {Promise<ColumnMetadata[]>} Column metadata\n */\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const rows = (await this.query(`PRAGMA table_info(\\`${name}\\`)`)) as any[];\n return rows.map((row: any) => ({\n name: row.name,\n type: this.mapSQLiteType(row.type),\n primaryKey: row.pk === 1,\n autoIncrement: row.pk === 1 && row.type.toUpperCase() === \"INTEGER\",\n notNull: row.notnull === 1,\n unique: false,\n defaultValue: row.dflt_value,\n }));\n }\n\n /**\n * Create a table from metadata\n * @param {TableMetadata} meta - Table metadata\n */\n async createTable(meta: TableMetadata): Promise<void> {\n const sql = compileCreateTable(meta, \"sqlite\");\n await this.execute(sql);\n }\n\n /**\n * Drop a table\n * @param {string} name - Table name\n */\n async dropTable(name: string): Promise<void> {\n await this.execute(`DROP TABLE IF EXISTS \\`${name}\\``);\n }\n\n /**\n * Add a column to a table\n * @param {string} table - Table name\n * @param {ColumnMetadata} column - Column metadata\n */\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const colDef = compileColumnDef(column, \"sqlite\");\n await this.execute(`ALTER TABLE \\`${table}\\` ADD COLUMN ${colDef}`);\n }\n\n /**\n * Drop a column from a table\n * @param {string} table - Table name\n * @param {string} name - Column name\n */\n async dropColumn(table: string, name: string): Promise<void> {\n await this.execute(`ALTER TABLE \\`${table}\\` DROP COLUMN \\`${name}\\``);\n }\n\n /**\n * Rename a column\n * @param {string} table - Table name\n * @param {string} oldName - Current name\n * @param {string} newName - New name\n */\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n await this.execute(`ALTER TABLE \\`${table}\\` RENAME COLUMN \\`${oldName}\\` TO \\`${newName}\\``);\n }\n\n /**\n * Execute within a transaction\n * @param {() => Promise<T>} fn - Function to execute\n * @returns {Promise<T>} Result\n */\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n await this.execute(\"BEGIN TRANSACTION\");\n try {\n const result = await fn();\n await this.execute(\"COMMIT\");\n return result;\n } catch (err) {\n await this.execute(\"ROLLBACK\");\n throw err;\n }\n }\n\n /**\n * Fetch all column metadata for all tables in the database\n * @returns {Promise<Record<string, ColumnMetadata[]>>} Columns grouped by table name\n */\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n try {\n const tables = await this.query(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\",\n );\n const result: Record<string, ColumnMetadata[]> = {};\n\n for (const table of tables) {\n const tableName = table.name;\n result[tableName] = await this.getTableColumns(tableName);\n }\n return result;\n } catch (err: any) {\n throw new DriverError(`Failed to fetch all table columns: ${err.message}`);\n }\n }\n\n private mapSQLiteType(type: string): ColumnMetadata[\"type\"] {\n const upper = type.toUpperCase();\n if (upper.includes(\"INT\")) {\n return \"integer\";\n }\n if (upper.includes(\"CHAR\") || upper.includes(\"TEXT\") || upper.includes(\"CLOB\")) {\n return \"text\";\n }\n if (upper.includes(\"REAL\") || upper.includes(\"FLOAT\") || upper.includes(\"DOUBLE\")) {\n return \"float\";\n }\n if (upper.includes(\"BLOB\")) {\n return \"blob\";\n }\n return \"text\";\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sqlite.mjs","names":[],"sources":["../../src/drivers/sqlite.ts"],"sourcesContent":["import { DriverError } from \"../errors\";\nimport type { ColumnMetadata, SQLiteConnectionConfig, TableMetadata } from \"../types\";\nimport { BaseDriver } from \"./driver\";\nimport { compileColumnDef, compileCreateTable } from \"./sql-compiler\";\n\n/**\n * Interface for SQLite database adapters\n */\ninterface SQLiteAdapter {\n close(): void | Promise<void>;\n prepare(sql: string): SQLiteStatement;\n exec(sql: string): void | Promise<void>;\n}\n\ninterface SQLiteStatement {\n run(...params: any[]): any | Promise<any>;\n all(...params: any[]): any[] | Promise<any[]>;\n}\n\n/**\n * SQLite database driver supporting multiple libraries (better-sqlite3, sqlite3, sql.js, bun:sqlite)\n */\nexport class SQLiteDriver extends BaseDriver {\n readonly dialect = \"sqlite\" as const;\n private db: SQLiteAdapter | null = null;\n private config: SQLiteConnectionConfig;\n private provider?: \"better-sqlite3\" | \"sqlite3\" | \"sql.js\" | \"bun:sqlite\";\n\n constructor(\n config: SQLiteConnectionConfig,\n provider?: \"better-sqlite3\" | \"sqlite3\" | \"sql.js\" | \"bun:sqlite\",\n ) {\n super();\n this.config = config;\n this.provider = provider;\n }\n\n /**\n * Connect to the SQLite database\n */\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n const adapter = await this.getAdapter();\n this.db = adapter;\n await this.db.exec(\"PRAGMA journal_mode=WAL\");\n await this.db.exec(\"PRAGMA foreign_keys=ON\");\n this.connected = true;\n } catch (err: any) {\n throw new DriverError(`Failed to connect to SQLite database: ${err.message}`);\n }\n }\n\n private async getAdapter(): Promise<SQLiteAdapter> {\n const provider = this.provider;\n\n if (!provider || provider === \"better-sqlite3\") {\n try {\n const BetterSqlite3 = await import(\"better-sqlite3\");\n const Database = BetterSqlite3.default || BetterSqlite3;\n return new Database(this.config.filename) as any;\n } catch (err) {\n if (provider === \"better-sqlite3\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"sqlite3\") {\n try {\n const sqlite3 = await import(\"sqlite3\");\n const db = new sqlite3.Database(this.config.filename);\n\n return {\n close: () => new Promise<void>((res, rej) => db.close((err) => (err ? rej(err) : res()))),\n exec: (sql: string) =>\n new Promise<void>((res, rej) => db.exec(sql, (err) => (err ? rej(err) : res()))),\n prepare: (sql: string) => ({\n run: (...params: any[]) =>\n new Promise<{ lastInsertRowid: number; changes: number }>((res, rej) => {\n db.run(sql, params, function (this: any, err: Error | null) {\n if (err) {\n return rej(err);\n }\n res({ lastInsertRowid: this.lastID, changes: this.changes });\n });\n }),\n all: (...params: any[]) =>\n new Promise<any[]>((res, rej) => {\n db.all(sql, params, (err, rows) => (err ? rej(err) : res(rows)));\n }),\n }),\n } as any;\n } catch (err) {\n if (provider === \"sqlite3\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"sql.js\") {\n try {\n const initSqlJs = await import(\"sql.js\");\n const SQL = await initSqlJs.default();\n const fs = await import(\"fs\");\n let data: Buffer | undefined;\n if (fs.existsSync(this.config.filename)) {\n data = fs.readFileSync(this.config.filename);\n }\n const db = new SQL.Database(data);\n return {\n close: () => {\n const binaryArray = db.export();\n fs.writeFileSync(this.config.filename, Buffer.from(binaryArray));\n db.close();\n },\n exec: (sql: string) => db.run(sql),\n prepare: (sql: string) => {\n const stmt = db.prepare(sql);\n return {\n run: (...params: any[]) => {\n stmt.run(params);\n const result = db.exec(\"SELECT last_insert_rowid()\");\n const lastInsertRowid = result[0]?.values[0]\n ? (result[0].values[0][0] as number)\n : 0;\n return { lastInsertRowid, changes: db.getRowsModified() };\n },\n all: (...params: any[]) => {\n const rows: any[] = [];\n stmt.bind(params);\n while (stmt.step()) {\n rows.push(stmt.getAsObject());\n }\n return rows;\n },\n };\n },\n } as any;\n } catch (err) {\n if (provider === \"sql.js\") {\n throw err;\n }\n }\n }\n\n if (!provider || provider === \"bun:sqlite\") {\n try {\n const { Database } = await import(\"bun:sqlite\");\n return new Database(this.config.filename) as any;\n } catch (err) {\n if (provider === \"bun:sqlite\") {\n throw err;\n }\n }\n }\n\n throw new Error(\n provider\n ? `SQLite provider \"${provider}\" not found.`\n : \"No SQLite driver found. Please install better-sqlite3, sqlite3, sql.js or run with Bun.\",\n );\n }\n\n /**\n * Disconnect from the SQLite database\n */\n async disconnect(): Promise<void> {\n if (this.db) {\n try {\n await this.db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n } catch {}\n await this.db.close();\n this.db = null;\n this.connected = false;\n }\n }\n\n /**\n * Execute a SQL statement\n * @param {string} sql - SQL statement\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any>} Execution result with lastInsertRowid and changes\n */\n async execute(sql: string, params: unknown[] = []): Promise<any> {\n try {\n const formatted = this.formatParams(params);\n if (formatted.length === 0) {\n await this.db!.exec(sql);\n return { insertId: 0, affectedRows: 0 };\n }\n const stmt = this.db!.prepare(sql);\n const result = await stmt.run(...formatted);\n return {\n insertId: Number(result.lastInsertRowid),\n affectedRows: result.changes,\n };\n } catch (err: any) {\n throw new DriverError(`SQLite execute error: ${err.message}`);\n }\n }\n\n /**\n * Execute a SQL query\n * @param {string} sql - SQL query\n * @param {unknown[]} [params] - Query parameters\n * @returns {Promise<any[]>} Query results\n */\n async query(sql: string, params: unknown[] = []): Promise<any[]> {\n try {\n const stmt = this.db!.prepare(sql);\n return await stmt.all(...this.formatParams(params));\n } catch (err: any) {\n throw new DriverError(`SQLite query error: ${err.message}`);\n }\n }\n\n private formatParams(params: unknown[]): any[] {\n return params.map((p) => {\n if (p instanceof Date) {\n return p.toISOString();\n }\n return p;\n });\n }\n\n /**\n * Check if a table exists\n * @param {string} name - Table name\n * @returns {Promise<boolean>} Whether the table exists\n */\n async tableExists(name: string): Promise<boolean> {\n const rows = await this.query(\"SELECT name FROM sqlite_master WHERE type='table' AND name=?\", [\n name,\n ]);\n return rows.length > 0;\n }\n\n /**\n * Get column metadata for a table\n * @param {string} name - Table name\n * @returns {Promise<ColumnMetadata[]>} Column metadata\n */\n async getTableColumns(name: string): Promise<ColumnMetadata[]> {\n const rows = (await this.query(`PRAGMA table_info(\\`${name}\\`)`)) as any[];\n return rows.map((row: any) => ({\n name: row.name,\n type: this.mapSQLiteType(row.type),\n primaryKey: row.pk === 1,\n autoIncrement: row.pk === 1 && row.type.toUpperCase() === \"INTEGER\",\n notNull: row.notnull === 1,\n unique: false,\n defaultValue: row.dflt_value,\n }));\n }\n\n /**\n * Create a table from metadata\n * @param {TableMetadata} meta - Table metadata\n */\n async createTable(meta: TableMetadata): Promise<void> {\n const sql = compileCreateTable(meta, \"sqlite\");\n await this.execute(sql);\n }\n\n /**\n * Drop a table\n * @param {string} name - Table name\n */\n async dropTable(name: string): Promise<void> {\n await this.execute(`DROP TABLE IF EXISTS \\`${name}\\``);\n }\n\n /**\n * Add a column to a table\n * @param {string} table - Table name\n * @param {ColumnMetadata} column - Column metadata\n */\n async addColumn(table: string, column: ColumnMetadata): Promise<void> {\n const colDef = compileColumnDef(column, \"sqlite\");\n await this.execute(`ALTER TABLE \\`${table}\\` ADD COLUMN ${colDef}`);\n }\n\n /**\n * Drop a column from a table\n * @param {string} table - Table name\n * @param {string} name - Column name\n */\n async dropColumn(table: string, name: string): Promise<void> {\n await this.execute(`ALTER TABLE \\`${table}\\` DROP COLUMN \\`${name}\\``);\n }\n\n /**\n * Rename a column\n * @param {string} table - Table name\n * @param {string} oldName - Current name\n * @param {string} newName - New name\n */\n async renameColumn(table: string, oldName: string, newName: string): Promise<void> {\n await this.execute(`ALTER TABLE \\`${table}\\` RENAME COLUMN \\`${oldName}\\` TO \\`${newName}\\``);\n }\n\n /**\n * Execute within a transaction\n * @param {() => Promise<T>} fn - Function to execute\n * @returns {Promise<T>} Result\n */\n async transaction<T>(fn: () => Promise<T>): Promise<T> {\n await this.execute(\"BEGIN TRANSACTION\");\n try {\n const result = await fn();\n await this.execute(\"COMMIT\");\n return result;\n } catch (err) {\n await this.execute(\"ROLLBACK\");\n throw err;\n }\n }\n\n /**\n * Fetch all column metadata for all tables in the database\n * @returns {Promise<Record<string, ColumnMetadata[]>>} Columns grouped by table name\n */\n async getAllTableColumns(): Promise<Record<string, ColumnMetadata[]>> {\n try {\n const tables = await this.query(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'\",\n );\n const result: Record<string, ColumnMetadata[]> = {};\n\n for (const table of tables) {\n const tableName = table.name;\n result[tableName] = await this.getTableColumns(tableName);\n }\n return result;\n } catch (err: any) {\n throw new DriverError(`Failed to fetch all table columns: ${err.message}`);\n }\n }\n\n private mapSQLiteType(type: string): ColumnMetadata[\"type\"] {\n const upper = type.toUpperCase();\n if (upper.includes(\"INT\")) {\n return \"integer\";\n }\n if (upper.includes(\"CHAR\") || upper.includes(\"TEXT\") || upper.includes(\"CLOB\")) {\n return \"text\";\n }\n if (upper.includes(\"REAL\") || upper.includes(\"FLOAT\") || upper.includes(\"DOUBLE\")) {\n return \"float\";\n }\n if (upper.includes(\"BLOB\")) {\n return \"blob\";\n }\n return \"text\";\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@hedystia/db",
3
- "version": "2.1.1",
3
+ "version": "2.2.1",
4
4
  "description": "Next-gen TypeScript ORM for building type-safe database layers at lightspeed",
5
5
  "homepage": "https://docs.hedystia.com",
6
6
  "devDependencies": {
7
- "@types/bun": "^1.3.3"
7
+ "@types/bun": "^1.3.11",
8
+ "typescript": "6.0.2"
8
9
  },
9
10
  "peerDependencies": {
10
- "typescript": ">= 6.0.0",
11
11
  "mysql2": ">= 3.0.0",
12
12
  "mysql": ">= 2.0.0",
13
13
  "better-sqlite3": ">= 12.0.0",
@@ -16,9 +16,6 @@
16
16
  "@aws-sdk/client-s3": ">= 3.0.0"
17
17
  },
18
18
  "peerDependenciesMeta": {
19
- "typescript": {
20
- "optional": true
21
- },
22
19
  "mysql2": {
23
20
  "optional": true
24
21
  },