From cdf830950a5fb651c8e26b3617dfdb0c00e8e5ef Mon Sep 17 00:00:00 2001 From: Shigma Date: Fri, 9 Feb 2024 04:21:54 +0800 Subject: [PATCH] feat(minato): enhance generic typings --- packages/core/package.json | 2 +- packages/core/src/database.ts | 12 ++++++------ packages/core/src/driver.ts | 8 ++++---- packages/core/src/index.ts | 8 +++----- packages/memory/src/index.ts | 14 ++++++++------ packages/mongo/src/index.ts | 2 +- packages/mysql/src/index.ts | 2 +- packages/postgres/src/index.ts | 2 +- packages/sqlite/src/index.ts | 3 +-- 9 files changed, 26 insertions(+), 27 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 95a464f5..5b2f4838 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -42,7 +42,7 @@ "postgres" ], "dependencies": { - "cordis": "^3.9.0", + "cordis": "^3.9.1", "cosmokit": "^1.5.2" } } diff --git a/packages/core/src/database.ts b/packages/core/src/database.ts index 138e6154..5c9833ac 100644 --- a/packages/core/src/database.ts +++ b/packages/core/src/database.ts @@ -1,5 +1,5 @@ import { Dict, Intersect, makeArray, MaybeArray, valueMap } from 'cosmokit' -import { Context, Plugin, Service, Spread } from 'cordis' +import { Context, Service, Spread } from 'cordis' import { Flatten, Indexable, Keys, Row } from './utils.ts' import { Selection } from './selection.ts' import { Field, Model } from './model.ts' @@ -37,7 +37,7 @@ type JoinCallback2>> = (args: { const kTransaction = Symbol('transaction') -export class Database extends Service { +export class Database extends Service { public tables: { [K in Keys]: Model } = Object.create(null) public drivers: Record = Object.create(null) public migrating = false @@ -46,12 +46,12 @@ export class Database extends Service { private stashed = new Set() - constructor(ctx?: Context) { + constructor(ctx?: C) { super(ctx, 'model', true) } - async connect(driver: Plugin.Constructor, ...args: Spread) { - this.ctx.plugin(driver, args[0]) + async connect(driver: Driver.Constructor, ...args: Spread) { + this.ctx.plugin(driver, args[0] as any) await this.ctx.start() } @@ -92,7 +92,7 @@ export class Database extends Service { } model.extend(fields, config) this.prepareTasks[name] = this.prepare(name) - this.ctx.emit('minato/model', name) + ;(this.ctx as Context).emit('model', name) } migrate>(name: K, fields: Field.Extension, callback: Model.Migration) { diff --git a/packages/core/src/driver.ts b/packages/core/src/driver.ts index b81c628c..7fc1b1f2 100644 --- a/packages/core/src/driver.ts +++ b/packages/core/src/driver.ts @@ -34,10 +34,10 @@ export namespace Driver { } export namespace Driver { - export type Constructor = new (database: Database, config?: T) => Driver + export type Constructor = new (ctx: Context, config: T) => Driver } -export abstract class Driver { +export abstract class Driver { static inject = ['model'] abstract start(): Promise @@ -52,12 +52,12 @@ export abstract class Driver { abstract remove(sel: Selection.Mutable): Promise abstract create(sel: Selection.Mutable, data: any): Promise abstract upsert(sel: Selection.Mutable, data: any[], keys: string[]): Promise - abstract withTransaction(callback: (driver: Driver) => Promise): Promise + abstract withTransaction(callback: (driver: this) => Promise): Promise public database: Database public logger: Logger - constructor(public ctx: Context, public config: C) { + constructor(public ctx: Context, public config: T) { this.database = ctx.model this.logger = ctx.logger(this.constructor.name) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d6f57c41..323482df 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -11,17 +11,15 @@ export * from './utils.ts' declare module 'cordis' { interface Events { - 'minato/model'(name: string): void + 'model'(name: string): void } interface Context { - database: Database - model: Database + database: Database + model: Database } } -export interface Tables {} - export { Logger, Schema, Schema as z } from 'cordis' export default Database diff --git a/packages/memory/src/index.ts b/packages/memory/src/index.ts index 88c4c404..ab165a32 100644 --- a/packages/memory/src/index.ts +++ b/packages/memory/src/index.ts @@ -1,9 +1,5 @@ import { clone, Dict, makeArray, noop, omit, pick, valueMap } from 'cosmokit' -import { Driver, Eval, executeEval, executeQuery, executeSort, executeUpdate, RuntimeError, Selection } from 'minato' - -export namespace MemoryDriver { - export interface Config {} -} +import { Driver, Eval, executeEval, executeQuery, executeSort, executeUpdate, RuntimeError, Selection, z } from 'minato' export class MemoryDriver extends Driver { static name = 'memory' @@ -189,7 +185,7 @@ export class MemoryDriver extends Driver { return res } - async withTransaction(callback: (session: Driver) => Promise) { + async withTransaction(callback: (session: this) => Promise) { const data = clone(this.#store) await callback(this).then(undefined, (e) => { this.#store = data @@ -198,4 +194,10 @@ export class MemoryDriver extends Driver { } } +export namespace MemoryDriver { + export interface Config {} + + export const Config: z = z.object({}) +} + export default MemoryDriver diff --git a/packages/mongo/src/index.ts b/packages/mongo/src/index.ts index 98824996..54fb50cd 100644 --- a/packages/mongo/src/index.ts +++ b/packages/mongo/src/index.ts @@ -447,7 +447,7 @@ export class MongoDriver extends Driver { } } - async withTransaction(callback: (session: Driver) => Promise) { + async withTransaction(callback: (session: this) => Promise) { await this.client.withSession(async (session) => { const driver = new Proxy(this, { get(target, p, receiver) { diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index 621c5b12..53e1799a 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -658,7 +658,7 @@ INSERT INTO mtt VALUES(json_extract(j, concat('$[', i, ']'))); SET i=i+1; END WH return { inserted: records - result.changedRows, matched: result.changedRows, modified: result.affectedRows - records } } - async withTransaction(callback: (session: Driver) => Promise) { + async withTransaction(callback: (session: this) => Promise) { return new Promise((resolve, reject) => { this.pool.getConnection((err, conn) => { if (err) { diff --git a/packages/postgres/src/index.ts b/packages/postgres/src/index.ts index 5dd24489..d0a2f754 100644 --- a/packages/postgres/src/index.ts +++ b/packages/postgres/src/index.ts @@ -760,7 +760,7 @@ export class PostgresDriver extends Driver { return { inserted: result.filter(({ rtime }) => +rtime !== mtime).length, matched: result.filter(({ rtime }) => +rtime === mtime).length } } - async withTransaction(callback: (session: Driver) => Promise) { + async withTransaction(callback: (session: this) => Promise) { return await this.postgres.begin(async (conn) => { const driver = new Proxy(this, { get(target, p, receiver) { diff --git a/packages/sqlite/src/index.ts b/packages/sqlite/src/index.ts index 2455f1f7..5f136f37 100644 --- a/packages/sqlite/src/index.ts +++ b/packages/sqlite/src/index.ts @@ -261,7 +261,6 @@ export class SQLiteDriver extends Driver { : require.resolve('@minatojs/sql.js/dist/' + file), }) if (!isBrowser || this.config.path === ':memory:') { - console.log(this.config.path) this.db = new sqlite.Database(this.config.path) } else { const buffer = await readFile(this.config.path).catch(() => null) @@ -452,7 +451,7 @@ export class SQLiteDriver extends Driver { return result } - async withTransaction(callback: (session: Driver) => Promise) { + async withTransaction(callback: (session: this) => Promise) { if (this._transactionTask) await this._transactionTask return this._transactionTask = new Promise((resolve, reject) => { this.#run('BEGIN TRANSACTION')