44 lines
1.2 KiB
JavaScript
44 lines
1.2 KiB
JavaScript
import { SqliteDialect } from 'kysely';
|
|
/**
|
|
* Kysely dialect for `node:sqlite` (Node.js 22.5+, Deno 2.2+).
|
|
*
|
|
* Bridges `node:sqlite`'s `DatabaseSync` to the `better-sqlite3` interface
|
|
* that Kysely's `SqliteDialect` expects.
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* import { SqliteDriver, NodeSqliteDialect } from '@mikro-orm/sql';
|
|
*
|
|
* const orm = await MikroORM.init({
|
|
* driver: SqliteDriver,
|
|
* dbName: ':memory:',
|
|
* driverOptions: new NodeSqliteDialect(':memory:'),
|
|
* });
|
|
* ```
|
|
*/
|
|
export class NodeSqliteDialect extends SqliteDialect {
|
|
constructor(dbName) {
|
|
const { DatabaseSync } = globalThis.process.getBuiltinModule('node:sqlite');
|
|
super({
|
|
database: () => {
|
|
const db = new DatabaseSync(dbName);
|
|
return {
|
|
prepare(sql) {
|
|
const stmt = db.prepare(sql);
|
|
return {
|
|
reader: /^\s*(select|pragma|explain|with)/i.test(sql) || /\breturning\b/i.test(sql),
|
|
all: params => stmt.all(...params),
|
|
run: params => stmt.run(...params),
|
|
/* v8 ignore next */
|
|
get: params => stmt.get(...params),
|
|
};
|
|
},
|
|
close() {
|
|
db.close();
|
|
},
|
|
};
|
|
},
|
|
});
|
|
}
|
|
}
|