Skip to content

Commit ccd34b7

Browse files
committed
feat(builder)!: add logger option
remove onError, auto log error
1 parent 85d3e98 commit ccd34b7

File tree

3 files changed

+38
-22
lines changed

3 files changed

+38
-22
lines changed

packages/sqlite-builder/src/builder.ts

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { Compilable, CompiledQuery, KyselyPlugin, LogEvent, QueryResult, Ra
22
import { Kysely, sql } from 'kysely'
33
import { SqliteSerializePlugin } from 'kysely-plugin-serialize'
44
import { parseTableMap, runCreateTable } from './util'
5-
import type { ITable, SqliteBuilderOption } from './types'
5+
import type { ITable, Logger, SqliteBuilderOption } from './types'
66

77
const enum DBStatus {
88
'needDrop',
@@ -13,15 +13,17 @@ export class SqliteBuilder<DB extends Record<string, any>> {
1313
public kysely: Kysely<DB>
1414
private status: DBStatus
1515
private tableMap: Map<string, ITable<DB[Extract<keyof DB, string>]>>
16+
private logger?: Logger
1617
public constructor(option: SqliteBuilderOption<DB>) {
17-
const { dialect, tables, dropTableBeforeInit: truncateBeforeInit, onError, onQuery, plugins: additionalPlugin } = option
18+
const { dialect, tables, dropTableBeforeInit: truncateBeforeInit, onQuery, plugins: additionalPlugin, logger } = option
19+
this.logger = logger
1820
const plugins: KyselyPlugin[] = additionalPlugin ?? []
1921
plugins.push(new SqliteSerializePlugin())
2022
this.kysely = new Kysely<DB>({
2123
dialect,
2224
log: (event: LogEvent) => {
2325
event.level === 'error'
24-
? onError?.(event.error)
26+
? this.logger?.error('uncaught db error', event.error as Error)
2527
: onQuery?.(event.query, event.queryDurationMillis)
2628
},
2729
plugins,
@@ -39,44 +41,51 @@ export class SqliteBuilder<DB extends Record<string, any>> {
3941
return this
4042
}
4143

42-
private async checkInit() {
44+
private async isEmptyTable(): Promise<boolean> {
4345
this.status !== DBStatus.ready && await this.init()
44-
if (this.status !== DBStatus.ready) {
45-
throw new Error('fail to init table')
46+
if (this.status === DBStatus.ready) {
47+
return false
4648
}
49+
this.logger?.error('fail to init table')
50+
return true
4751
}
4852

4953
public async transaction<T>(
5054
cb: (trx: Transaction<DB>) => Promise<T>,
51-
errorLog = false,
55+
errorMsg = 'transaction error',
5256
): Promise<T | undefined> {
53-
await this.checkInit()
57+
if (await this.isEmptyTable()) {
58+
return undefined
59+
}
5460
return await this.kysely.transaction().execute(cb)
5561
.catch((err) => {
56-
errorLog && console.error(err)
62+
this.logger?.error(errorMsg, err)
5763
return undefined
5864
})
5965
}
6066

6167
public async exec<T>(
6268
cb: (db: Kysely<DB>) => Promise<T>,
63-
errorLog = false,
69+
errorMsg = 'execute error',
6470
): Promise<T | undefined> {
65-
await this.checkInit()
71+
if (await this.isEmptyTable()) {
72+
return undefined
73+
}
6674
return cb(this.kysely)
6775
.catch((err) => {
68-
errorLog && console.error(err)
76+
this.logger?.error(errorMsg, err)
6977
return undefined
7078
})
7179
}
7280

7381
public async toSQL<T extends Compilable>(cb: (db: Kysely<DB>) => T): Promise<CompiledQuery<unknown>> {
74-
await this.checkInit()
7582
return cb(this.kysely).compile()
7683
}
7784

78-
public async raw<T = any>(rawSql: (s: Sql) => RawBuilder<T>): Promise<QueryResult<T>> {
79-
await this.checkInit()
85+
public async raw<T = any>(rawSql: (s: Sql) => RawBuilder<T>): Promise<QueryResult<T> | undefined> {
86+
if (await this.isEmptyTable()) {
87+
return undefined
88+
}
8089
return rawSql(sql).execute(this.kysely)
8190
}
8291
}

packages/sqlite-builder/src/types.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ export interface SqliteBuilderOption<T> {
4747
dialect: Dialect
4848
dropTableBeforeInit?: boolean
4949
onQuery?: (queryInfo: CompiledQuery, time: number) => any
50-
onError?: (reason: unknown) => any
5150
plugins?: Array<KyselyPlugin>
51+
logger?: Logger
5252
}
53+
export type Logger = {
54+
info: (msg: string) => void
55+
debug: (msg: string) => void
56+
warn: (msg: string) => void
57+
error: (msg: string, e?: Error) => void
58+
}

test/builder.test.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Generated } from 'kysely'
22
import { SqliteDialect } from 'kysely'
33
import Database from 'better-sqlite3'
4-
import { describe, expect, test } from 'vitest'
4+
import { beforeAll, describe, expect, test } from 'vitest'
55
import { SqliteBuilder } from '../packages/sqlite-builder/src'
66

77
interface DB {
@@ -36,15 +36,16 @@ describe('test builder', async () => {
3636
},
3737
},
3838
dropTableBeforeInit: true,
39-
onError: reason => console.error(reason),
39+
logger: console,
4040
onQuery: (queryInfo, time) => console.log(`${time}ms`, queryInfo.sql, queryInfo.parameters),
4141
})
42-
// manually generate table
43-
await db.init(true)
44-
// auto generate table
42+
beforeAll(async () => {
43+
// manually generate table
44+
await db.init(true)
45+
})
4546
test('insert', async () => {
46-
await db.transaction(trx => trx.insertInto('test').values({ gender: false }).execute())
4747
// auto generate table
48+
await db.transaction(trx => trx.insertInto('test').values({ gender: false }).execute())
4849
const result = await db.exec(d => d.selectFrom('test').selectAll().execute())
4950
expect(result).toBeInstanceOf(Array)
5051
expect(result![0].person).toStrictEqual({ name: 'test' })

0 commit comments

Comments
 (0)