@zhin.js/database 1.0.4 → 1.0.6

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.
Files changed (115) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1360 -34
  3. package/lib/base/database.d.ts +71 -13
  4. package/lib/base/database.d.ts.map +1 -1
  5. package/lib/base/database.js +128 -4
  6. package/lib/base/database.js.map +1 -1
  7. package/lib/base/dialect.d.ts +27 -10
  8. package/lib/base/dialect.d.ts.map +1 -1
  9. package/lib/base/dialect.js +32 -0
  10. package/lib/base/dialect.js.map +1 -1
  11. package/lib/base/index.d.ts +1 -0
  12. package/lib/base/index.d.ts.map +1 -1
  13. package/lib/base/index.js +1 -0
  14. package/lib/base/index.js.map +1 -1
  15. package/lib/base/model.d.ts +105 -12
  16. package/lib/base/model.d.ts.map +1 -1
  17. package/lib/base/model.js +224 -3
  18. package/lib/base/model.js.map +1 -1
  19. package/lib/base/query-classes.d.ts +204 -33
  20. package/lib/base/query-classes.d.ts.map +1 -1
  21. package/lib/base/query-classes.js +276 -0
  22. package/lib/base/query-classes.js.map +1 -1
  23. package/lib/base/thenable.d.ts +7 -7
  24. package/lib/base/thenable.d.ts.map +1 -1
  25. package/lib/base/thenable.js +5 -4
  26. package/lib/base/thenable.js.map +1 -1
  27. package/lib/base/transaction.d.ts +46 -0
  28. package/lib/base/transaction.d.ts.map +1 -0
  29. package/lib/base/transaction.js +186 -0
  30. package/lib/base/transaction.js.map +1 -0
  31. package/lib/dialects/memory.d.ts +12 -7
  32. package/lib/dialects/memory.d.ts.map +1 -1
  33. package/lib/dialects/memory.js +7 -4
  34. package/lib/dialects/memory.js.map +1 -1
  35. package/lib/dialects/mongodb.d.ts +11 -7
  36. package/lib/dialects/mongodb.d.ts.map +1 -1
  37. package/lib/dialects/mongodb.js +18 -15
  38. package/lib/dialects/mongodb.js.map +1 -1
  39. package/lib/dialects/mysql.d.ts +35 -6
  40. package/lib/dialects/mysql.d.ts.map +1 -1
  41. package/lib/dialects/mysql.js +137 -18
  42. package/lib/dialects/mysql.js.map +1 -1
  43. package/lib/dialects/pg.d.ts +35 -6
  44. package/lib/dialects/pg.d.ts.map +1 -1
  45. package/lib/dialects/pg.js +137 -18
  46. package/lib/dialects/pg.js.map +1 -1
  47. package/lib/dialects/redis.d.ts +11 -6
  48. package/lib/dialects/redis.d.ts.map +1 -1
  49. package/lib/dialects/redis.js +11 -8
  50. package/lib/dialects/redis.js.map +1 -1
  51. package/lib/dialects/sqlite.d.ts +19 -6
  52. package/lib/dialects/sqlite.d.ts.map +1 -1
  53. package/lib/dialects/sqlite.js +63 -10
  54. package/lib/dialects/sqlite.js.map +1 -1
  55. package/lib/index.d.ts +1 -0
  56. package/lib/index.d.ts.map +1 -1
  57. package/lib/index.js +1 -0
  58. package/lib/index.js.map +1 -1
  59. package/lib/migration.d.ts +132 -0
  60. package/lib/migration.d.ts.map +1 -0
  61. package/lib/migration.js +475 -0
  62. package/lib/migration.js.map +1 -0
  63. package/lib/registry.d.ts +26 -23
  64. package/lib/registry.d.ts.map +1 -1
  65. package/lib/registry.js +1 -5
  66. package/lib/registry.js.map +1 -1
  67. package/lib/type/document/database.d.ts +11 -11
  68. package/lib/type/document/database.d.ts.map +1 -1
  69. package/lib/type/document/database.js.map +1 -1
  70. package/lib/type/document/model.d.ts +7 -7
  71. package/lib/type/document/model.d.ts.map +1 -1
  72. package/lib/type/document/model.js.map +1 -1
  73. package/lib/type/keyvalue/database.d.ts +11 -11
  74. package/lib/type/keyvalue/database.d.ts.map +1 -1
  75. package/lib/type/keyvalue/database.js.map +1 -1
  76. package/lib/type/keyvalue/model.d.ts +2 -2
  77. package/lib/type/keyvalue/model.d.ts.map +1 -1
  78. package/lib/type/keyvalue/model.js.map +1 -1
  79. package/lib/type/related/database.d.ts +48 -13
  80. package/lib/type/related/database.d.ts.map +1 -1
  81. package/lib/type/related/database.js +258 -27
  82. package/lib/type/related/database.js.map +1 -1
  83. package/lib/type/related/model.d.ts +251 -15
  84. package/lib/type/related/model.d.ts.map +1 -1
  85. package/lib/type/related/model.js +647 -22
  86. package/lib/type/related/model.js.map +1 -1
  87. package/lib/types.d.ts +475 -37
  88. package/lib/types.d.ts.map +1 -1
  89. package/lib/types.js +6 -0
  90. package/lib/types.js.map +1 -1
  91. package/package.json +14 -5
  92. package/src/base/database.ts +168 -24
  93. package/src/base/dialect.ts +49 -10
  94. package/src/base/index.ts +2 -1
  95. package/src/base/model.ts +258 -18
  96. package/src/base/query-classes.ts +471 -63
  97. package/src/base/thenable.ts +12 -11
  98. package/src/base/transaction.ts +213 -0
  99. package/src/dialects/memory.ts +14 -13
  100. package/src/dialects/mongodb.ts +40 -38
  101. package/src/dialects/mysql.ts +151 -22
  102. package/src/dialects/pg.ts +148 -21
  103. package/src/dialects/redis.ts +40 -38
  104. package/src/dialects/sqlite.ts +73 -15
  105. package/src/index.ts +1 -2
  106. package/src/migration.ts +544 -0
  107. package/src/registry.ts +33 -33
  108. package/src/type/document/database.ts +32 -32
  109. package/src/type/document/model.ts +14 -14
  110. package/src/type/keyvalue/database.ts +32 -32
  111. package/src/type/keyvalue/model.ts +18 -18
  112. package/src/type/related/database.ts +309 -34
  113. package/src/type/related/model.ts +800 -33
  114. package/src/types.ts +559 -44
  115. package/tests/database.test.ts +1738 -0
@@ -1,17 +1,45 @@
1
1
  import type { Dialect } from './dialect.js';
2
2
  import { Model } from './model.js';
3
- import { Definition, QueryParams, AlterDefinition, Condition, BuildQueryResult } from '../types.js';
3
+ import { Definition, QueryParams, AlterDefinition, Condition, BuildQueryResult, TransactionOptions, TransactionContext } from '../types.js';
4
4
  import * as QueryClasses from './query-classes.js';
5
+ /**
6
+ * 查询日志处理器类型
7
+ */
8
+ export type QueryLogger = (info: {
9
+ sql: string;
10
+ params?: any[];
11
+ duration: number;
12
+ error?: Error;
13
+ }) => void;
5
14
  /**
6
15
  * 基础数据库抽象类
7
16
  * 定义所有数据库类型的通用接口和行为
8
17
  */
9
18
  export declare abstract class Database<D = any, S extends Record<string, object> = Record<string, object>, Q = string> {
10
- readonly dialect: Dialect<D, Q>;
11
- definitions?: Database.Definitions<S> | undefined;
19
+ readonly dialect: Dialect<D, S, Q>;
12
20
  protected hasStarted: boolean;
13
- readonly models: Map<string, Model<D, object, Q>>;
14
- constructor(dialect: Dialect<D, Q>, definitions?: Database.Definitions<S> | undefined);
21
+ readonly definitions: Database.Definitions<S>;
22
+ readonly models: Database.Models<S, D, Q>;
23
+ private _logger?;
24
+ private _logging;
25
+ constructor(dialect: Dialect<D, S, Q>, definitions?: Database.DefinitionObj<S>);
26
+ /**
27
+ * 启用查询日志
28
+ * @param handler 自定义日志处理器,不传则使用默认控制台输出
29
+ */
30
+ enableLogging(handler?: QueryLogger): this;
31
+ /**
32
+ * 禁用查询日志
33
+ */
34
+ disableLogging(): this;
35
+ /**
36
+ * 查询日志是否启用
37
+ */
38
+ get isLogging(): boolean;
39
+ /**
40
+ * 记录查询日志
41
+ */
42
+ protected log(sql: string, params?: any[], duration?: number, error?: Error): void;
15
43
  /**
16
44
  * 数据库是否已启动
17
45
  */
@@ -32,7 +60,7 @@ export declare abstract class Database<D = any, S extends Record<string, object>
32
60
  * 执行原生查询
33
61
  */
34
62
  query<U = any>(sql: Q, params?: any[]): Promise<U>;
35
- abstract buildQuery<U extends object = any>(params: QueryParams<U>): BuildQueryResult<Q>;
63
+ abstract buildQuery<T extends keyof S>(params: QueryParams<S, T>): BuildQueryResult<Q>;
36
64
  /**
37
65
  * 获取数据库方言名称
38
66
  */
@@ -45,15 +73,38 @@ export declare abstract class Database<D = any, S extends Record<string, object>
45
73
  * 抽象方法:初始化数据库
46
74
  */
47
75
  protected abstract initialize(): Promise<void>;
76
+ define<K extends keyof S>(name: K, definition: Definition<S[K]>): void;
77
+ /**
78
+ * 删除表定义
79
+ */
80
+ destroy<K extends keyof S>(name: K): void;
48
81
  /**
49
82
  * 创建表
50
83
  */
51
- create<T extends object>(name: string, definition: Definition<T>): QueryClasses.Creation<T, D, Q>;
52
- alter<T extends object>(name: string, alterations: AlterDefinition<T>): QueryClasses.Alteration<T, D, Q>;
53
- select<T extends object, K extends keyof T>(name: string, fields: Array<K>): QueryClasses.Selection<Pick<T, K>, K, D, Q>;
54
- insert<T extends object>(name: string, data: T): QueryClasses.Insertion<T, D, Q>;
55
- update<T extends object>(name: string, update: Partial<T>): QueryClasses.Updation<T, D, Q>;
56
- delete<T extends object>(name: string, condition: Condition<T>): QueryClasses.Deletion<T, D, Q>;
84
+ create<T extends keyof S>(name: T, definition: Definition<S[T]>): QueryClasses.Creation<S, T, D, Q>;
85
+ alter<T extends keyof S>(name: T, alterations: AlterDefinition<S[T]>): QueryClasses.Alteration<S, T, D, Q>;
86
+ select<T extends keyof S, K extends keyof S[T]>(name: T, fields: Array<K>): QueryClasses.Selection<S, T, K, D, Q>;
87
+ insert<T extends keyof S>(name: T, data: S[T]): QueryClasses.Insertion<S, T, D, Q>;
88
+ update<T extends keyof S>(name: T, update: Partial<S[T]>): QueryClasses.Updation<S, T, D, Q>;
89
+ delete<T extends keyof S>(name: T, condition: Condition<S[T]>): QueryClasses.Deletion<S, T, D, Q>;
90
+ /**
91
+ * 批量插入
92
+ */
93
+ insertMany<T extends keyof S>(name: T, data: S[T][]): QueryClasses.BatchInsertion<S, T, D, Q>;
94
+ /**
95
+ * 聚合查询
96
+ */
97
+ aggregate<T extends keyof S>(name: T): QueryClasses.Aggregation<S, T, D, Q>;
98
+ /**
99
+ * 是否支持事务
100
+ */
101
+ supportsTransactions(): boolean;
102
+ /**
103
+ * 在事务中执行操作
104
+ * 自动处理 commit 和 rollback
105
+ * 支持链式调用:trx.insert(), trx.select(), trx.update(), trx.delete()
106
+ */
107
+ transaction<R>(callback: (trx: TransactionContext<S>) => Promise<R>, options?: TransactionOptions): Promise<R>;
57
108
  /**
58
109
  * 抽象方法:获取所有模型名称
59
110
  */
@@ -64,7 +115,14 @@ export declare abstract class Database<D = any, S extends Record<string, object>
64
115
  dispose(): Promise<void>;
65
116
  }
66
117
  export declare namespace Database {
67
- type Definitions<S extends Record<string, object>> = {
118
+ class Definitions<S extends Record<string, object>> extends Map<keyof S, Definition<S[keyof S]>> {
119
+ constructor();
120
+ }
121
+ class Models<S extends Record<string, object>, D = any, Q = string> extends Map<keyof S, Model<D, S, Q, keyof S>> {
122
+ constructor();
123
+ get<K extends keyof S>(key: K): Model<D, S, Q, K> | undefined;
124
+ }
125
+ type DefinitionObj<S extends Record<string, object>> = {
68
126
  [K in keyof S]: Definition<S[K]>;
69
127
  };
70
128
  }
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/base/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/base/database.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,62 @@
1
1
  import * as QueryClasses from './query-classes.js';
2
+ import { TransactionContextImpl } from './transaction.js';
3
+ /**
4
+ * 默认查询日志处理器
5
+ */
6
+ const defaultLogger = ({ sql, params, duration, error }) => {
7
+ const paramStr = params?.length ? ` [${JSON.stringify(params)}]` : '';
8
+ const status = error ? `❌ ERROR: ${error.message}` : `✅ ${duration}ms`;
9
+ console.log(`[SQL] ${sql}${paramStr} → ${status}`);
10
+ };
2
11
  /**
3
12
  * 基础数据库抽象类
4
13
  * 定义所有数据库类型的通用接口和行为
5
14
  */
6
15
  export class Database {
7
16
  dialect;
8
- definitions;
9
17
  hasStarted = false;
10
- models = new Map();
18
+ definitions = new Database.Definitions();
19
+ models = new Database.Models();
20
+ _logger;
21
+ _logging = false;
11
22
  constructor(dialect, definitions) {
12
23
  this.dialect = dialect;
13
- this.definitions = definitions;
24
+ for (const key in definitions) {
25
+ this.definitions.set(key, definitions[key]);
26
+ }
27
+ }
28
+ // ============================================================================
29
+ // Query Logging
30
+ // ============================================================================
31
+ /**
32
+ * 启用查询日志
33
+ * @param handler 自定义日志处理器,不传则使用默认控制台输出
34
+ */
35
+ enableLogging(handler) {
36
+ this._logging = true;
37
+ this._logger = handler ?? defaultLogger;
38
+ return this;
39
+ }
40
+ /**
41
+ * 禁用查询日志
42
+ */
43
+ disableLogging() {
44
+ this._logging = false;
45
+ return this;
46
+ }
47
+ /**
48
+ * 查询日志是否启用
49
+ */
50
+ get isLogging() {
51
+ return this._logging;
52
+ }
53
+ /**
54
+ * 记录查询日志
55
+ */
56
+ log(sql, params, duration, error) {
57
+ if (this._logging && this._logger) {
58
+ this._logger({ sql: String(sql), params, duration: duration ?? 0, error });
59
+ }
14
60
  }
15
61
  /**
16
62
  * 数据库是否已启动
@@ -32,6 +78,7 @@ export class Database {
32
78
  async stop() {
33
79
  await this.dialect.disconnect();
34
80
  this.hasStarted = false;
81
+ console.log(`Database disconnected from dialect: ${this.dialect.name}`);
35
82
  }
36
83
  /**
37
84
  * 健康检查
@@ -46,7 +93,16 @@ export class Database {
46
93
  if (!this.isStarted) {
47
94
  throw new Error('Database not started');
48
95
  }
49
- return this.dialect.query(sql, params);
96
+ const start = Date.now();
97
+ try {
98
+ const result = await this.dialect.query(sql, params);
99
+ this.log(String(sql), params, Date.now() - start);
100
+ return result;
101
+ }
102
+ catch (error) {
103
+ this.log(String(sql), params, Date.now() - start, error);
104
+ throw error;
105
+ }
50
106
  }
51
107
  /**
52
108
  * 获取数据库方言名称
@@ -66,6 +122,15 @@ export class Database {
66
122
  }
67
123
  return this.dialect.config;
68
124
  }
125
+ define(name, definition) {
126
+ this.definitions.set(name, definition);
127
+ }
128
+ /**
129
+ * 删除表定义
130
+ */
131
+ destroy(name) {
132
+ this.definitions.delete(name);
133
+ }
69
134
  /**
70
135
  * 创建表
71
136
  */
@@ -87,6 +152,48 @@ export class Database {
87
152
  delete(name, condition) {
88
153
  return new QueryClasses.Deletion(this, name).where(condition);
89
154
  }
155
+ /**
156
+ * 批量插入
157
+ */
158
+ insertMany(name, data) {
159
+ return new QueryClasses.BatchInsertion(this, name, data);
160
+ }
161
+ /**
162
+ * 聚合查询
163
+ */
164
+ aggregate(name) {
165
+ return new QueryClasses.Aggregation(this, name);
166
+ }
167
+ // ============================================================================
168
+ // Transaction Support
169
+ // ============================================================================
170
+ /**
171
+ * 是否支持事务
172
+ */
173
+ supportsTransactions() {
174
+ return this.dialect.supportsTransactions();
175
+ }
176
+ /**
177
+ * 在事务中执行操作
178
+ * 自动处理 commit 和 rollback
179
+ * 支持链式调用:trx.insert(), trx.select(), trx.update(), trx.delete()
180
+ */
181
+ async transaction(callback, options) {
182
+ if (!this.isStarted) {
183
+ throw new Error('Database not started');
184
+ }
185
+ const trx = await this.dialect.beginTransaction(options);
186
+ const trxContext = new TransactionContextImpl(this, trx);
187
+ try {
188
+ const result = await callback(trxContext);
189
+ await trxContext.commit();
190
+ return result;
191
+ }
192
+ catch (error) {
193
+ await trxContext.rollback();
194
+ throw error;
195
+ }
196
+ }
90
197
  /**
91
198
  * 抽象方法:清理资源
92
199
  */
@@ -98,4 +205,21 @@ export class Database {
98
205
  await this.dialect.dispose();
99
206
  }
100
207
  }
208
+ (function (Database) {
209
+ class Definitions extends Map {
210
+ constructor() {
211
+ super();
212
+ }
213
+ }
214
+ Database.Definitions = Definitions;
215
+ class Models extends Map {
216
+ constructor() {
217
+ super();
218
+ }
219
+ get(key) {
220
+ return super.get(key);
221
+ }
222
+ }
223
+ Database.Models = Models;
224
+ })(Database || (Database = {}));
101
225
  //# sourceMappingURL=database.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/base/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/base/database.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- export declare abstract class Dialect<T, Q> {
1
+ import { Transaction, TransactionOptions, IsolationLevel } from '../types.js';
2
+ export declare abstract class Dialect<T, S extends Record<string, object>, Q> {
2
3
  readonly name: string;
3
4
  readonly config: T;
4
5
  protected constructor(name: string, config: T);
@@ -8,7 +9,7 @@ export declare abstract class Dialect<T, Q> {
8
9
  abstract healthCheck(): Promise<boolean>;
9
10
  abstract query<U = any>(query: Q, params?: any[]): Promise<U>;
10
11
  abstract mapColumnType(type: string): string;
11
- abstract quoteIdentifier(identifier: string): string;
12
+ abstract quoteIdentifier(identifier: string | number | symbol): string;
12
13
  abstract getParameterPlaceholder(index: number): string;
13
14
  abstract getStatementTerminator(): string;
14
15
  abstract formatBoolean(value: boolean): string;
@@ -19,16 +20,32 @@ export declare abstract class Dialect<T, Q> {
19
20
  abstract formatLimit(limit: number): string;
20
21
  abstract formatOffset(offset: number): string;
21
22
  abstract formatLimitOffset(limit: number, offset: number): string;
22
- abstract formatCreateTable(tableName: string, columns: string[]): string;
23
- abstract formatAlterTable(tableName: string, alterations: string[]): string;
24
- abstract formatDropTable(tableName: string, ifExists?: boolean): string;
25
- abstract formatDropIndex(indexName: string, tableName: string, ifExists?: boolean): string;
23
+ abstract formatCreateTable<T extends keyof S>(tableName: T, columns: string[]): string;
24
+ abstract formatAlterTable<T extends keyof S>(tableName: T, alterations: string[]): string;
25
+ abstract formatDropTable<T extends keyof S>(tableName: T, ifExists?: boolean): string;
26
+ abstract formatDropIndex<T extends keyof S>(indexName: string, tableName: T, ifExists?: boolean): string;
26
27
  abstract dispose(): Promise<void>;
28
+ /**
29
+ * 是否支持事务
30
+ */
31
+ supportsTransactions(): boolean;
32
+ /**
33
+ * 开始事务
34
+ */
35
+ beginTransaction(options?: TransactionOptions): Promise<Transaction>;
36
+ /**
37
+ * 格式化事务隔离级别
38
+ */
39
+ formatIsolationLevel(level: IsolationLevel): string;
40
+ /**
41
+ * 格式化聚合函数
42
+ */
43
+ formatAggregate(fn: string, field: string, alias?: string): string;
27
44
  }
28
45
  export declare namespace Dialect {
29
- type Creator<D, Q> = (config: D) => Dialect<D, Q>;
30
- type Constructor<D, Q> = new (config: D) => Dialect<D, Q>;
31
- type Factory<D, Q> = Creator<D, Q> | Constructor<D, Q>;
32
- function isConstructor<D, Q>(fn: Factory<D, Q>): fn is Constructor<D, Q>;
46
+ type Creator<D, S extends Record<string, object>, Q> = (config: D) => Dialect<D, S, Q>;
47
+ type Constructor<D, S extends Record<string, object>, Q> = new (config: D) => Dialect<D, S, Q>;
48
+ type Factory<D, S extends Record<string, object>, Q> = Creator<D, S, Q> | Constructor<D, S, Q>;
49
+ function isConstructor<D, S extends Record<string, object>, Q>(fn: Factory<D, S, Q>): fn is Constructor<D, S, Q>;
33
50
  }
34
51
  //# sourceMappingURL=dialect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/base/dialect.ts"],"names":[],"mappings":"AASA,8BAAsB,OAAO,CAAC,CAAC,EAAC,CAAC;IAC/B,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,MAAM,EAAE,CAAC,CAAC;IAE1B,SAAS,aAAa,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAM7C,QAAQ,CAAC,WAAW,IAAI,OAAO;IAC/B,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IACpC,QAAQ,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAC5C,QAAQ,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IACpD,QAAQ,CAAC,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IACvD,QAAQ,CAAC,sBAAsB,IAAI,MAAM;IACzC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAC9C,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM;IACxC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IACvC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAC5C,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;IAC/C,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAC3C,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAC7C,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IACjE,QAAQ,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM;IACxE,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM;IAC3E,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IACvE,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAC1F,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAClC;AACD,yBAAiB,OAAO,CAAC;IACvB,KAAY,OAAO,CAAC,CAAC,EAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IACvD,KAAY,WAAW,CAAC,CAAC,EAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IAC/D,KAAY,OAAO,CAAC,CAAC,EAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IAC3D,SAAgB,aAAa,CAAC,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,CAAC,EAAC,CAAC,CAAC,CAE3E;CACF"}
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/base/dialect.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,38 @@ export class Dialect {
11
11
  this.name = name;
12
12
  this.config = config;
13
13
  }
14
+ // ============================================================================
15
+ // Transaction Support (optional, default implementations)
16
+ // ============================================================================
17
+ /**
18
+ * 是否支持事务
19
+ */
20
+ supportsTransactions() {
21
+ return false;
22
+ }
23
+ /**
24
+ * 开始事务
25
+ */
26
+ async beginTransaction(options) {
27
+ throw new Error(`Dialect ${this.name} does not support transactions`);
28
+ }
29
+ /**
30
+ * 格式化事务隔离级别
31
+ */
32
+ formatIsolationLevel(level) {
33
+ return level.replace(/_/g, ' ');
34
+ }
35
+ // ============================================================================
36
+ // Aggregation Support
37
+ // ============================================================================
38
+ /**
39
+ * 格式化聚合函数
40
+ */
41
+ formatAggregate(fn, field, alias) {
42
+ const fnUpper = fn.toUpperCase();
43
+ const aliasClause = alias ? ` AS ${this.quoteIdentifier(alias)}` : '';
44
+ return `${fnUpper}(${field === '*' ? '*' : this.quoteIdentifier(field)})${aliasClause}`;
45
+ }
14
46
  }
15
47
  (function (Dialect) {
16
48
  function isConstructor(fn) {
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.js","sourceRoot":"","sources":["../../src/base/dialect.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAG/E,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,MAAM,OAAgB,OAAO;IACX,IAAI,CAAS;IACb,MAAM,CAAI;IAE1B,YAAsB,IAAY,EAAE,MAAS;QAC3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CAyBF;AACD,WAAiB,OAAO;IAItB,SAAgB,aAAa,CAAM,EAAgB;QACjD,OAAO,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,CAAC,WAAW,KAAK,EAAE,CAAC;IACzD,CAAC;IAFe,qBAAa,gBAE5B,CAAA;AACH,CAAC,EAPgB,OAAO,KAAP,OAAO,QAOvB"}
1
+ {"version":3,"file":"dialect.js","sourceRoot":"","sources":["../../src/base/dialect.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAI/E,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,MAAM,OAAgB,OAAO;IACX,IAAI,CAAS;IACb,MAAM,CAAI;IAE1B,YAAsB,IAAY,EAAE,MAAS;QAC3C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IA0BD,+EAA+E;IAC/E,0DAA0D;IAC1D,+EAA+E;IAE/E;;OAEG;IACH,oBAAoB;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAA4B;QACjD,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,gCAAgC,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,KAAqB;QACxC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,+EAA+E;IAC/E,sBAAsB;IACtB,+EAA+E;IAE/E;;OAEG;IACH,eAAe,CAAC,EAAU,EAAE,KAAa,EAAE,KAAc;QACvD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,OAAO,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;IAC1F,CAAC;CACF;AACD,WAAiB,OAAO;IAItB,SAAgB,aAAa,CAAuC,EAAkB;QACpF,OAAO,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,CAAC,WAAW,KAAK,EAAE,CAAC;IACzD,CAAC;IAFe,qBAAa,gBAE5B,CAAA;AACH,CAAC,EAPgB,OAAO,KAAP,OAAO,QAOvB"}
@@ -3,4 +3,5 @@ export * from './database.js';
3
3
  export * from './model.js';
4
4
  export * from './thenable.js';
5
5
  export * from './query-classes.js';
6
+ export * from './transaction.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
package/lib/base/index.js CHANGED
@@ -3,4 +3,5 @@ export * from './database.js';
3
3
  export * from './model.js';
4
4
  export * from './thenable.js';
5
5
  export * from './query-classes.js';
6
+ export * from './transaction.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
@@ -1,19 +1,74 @@
1
1
  import type { Database } from './database.js';
2
2
  import type { Dialect } from './dialect.js';
3
- import { AlterDefinition, Condition } from '../types.js';
3
+ import { AlterDefinition, Condition, ModelOptions, HookName, HookFn, HookContext, HooksConfig } from '../types.js';
4
4
  import * as QueryClasses from './query-classes.js';
5
5
  /**
6
6
  * 基础模型抽象类
7
7
  * 定义所有模型类型的通用接口和行为
8
+ * 支持软删除、自动时间戳和生命周期钩子
8
9
  */
9
- export declare abstract class Model<C = any, O extends object = object, Q = string> {
10
- readonly database: Database<C, any, Q>;
11
- readonly name: string;
12
- constructor(database: Database<C, any, Q>, name: string);
10
+ export declare abstract class Model<C = any, S extends Record<string, object> = Record<string, object>, Q = string, T extends keyof S = keyof S> {
11
+ readonly database: Database<any, S, Q>;
12
+ readonly name: T;
13
+ /** 模型配置选项 */
14
+ readonly options: ModelOptions;
15
+ /** 生命周期钩子注册表 */
16
+ private readonly hooks;
17
+ constructor(database: Database<any, S, Q>, name: T, options?: ModelOptions);
18
+ /**
19
+ * 注册生命周期钩子
20
+ * @param hookName 钩子名称
21
+ * @param fn 钩子函数
22
+ * @returns this(支持链式调用)
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * userModel
27
+ * .addHook('beforeCreate', (ctx) => {
28
+ * ctx.data.createdBy = 'system';
29
+ * })
30
+ * .addHook('afterDelete', async (ctx) => {
31
+ * await logService.log('User deleted', ctx.result);
32
+ * });
33
+ * ```
34
+ */
35
+ addHook(hookName: HookName, fn: HookFn<S[T]>): this;
36
+ /**
37
+ * addHook 的别名
38
+ */
39
+ on(hookName: HookName, fn: HookFn<S[T]>): this;
40
+ /**
41
+ * 批量注册钩子
42
+ * @example
43
+ * ```ts
44
+ * userModel.registerHooks({
45
+ * beforeCreate: (ctx) => { ... },
46
+ * afterUpdate: [(ctx) => { ... }, (ctx) => { ... }]
47
+ * });
48
+ * ```
49
+ */
50
+ registerHooks(hooks: HooksConfig<S[T]>): this;
51
+ /**
52
+ * 移除指定钩子
53
+ */
54
+ removeHook(hookName: HookName, fn?: HookFn<S[T]>): this;
55
+ /**
56
+ * 清除所有钩子
57
+ */
58
+ clearHooks(): this;
59
+ /**
60
+ * 触发钩子
61
+ * @returns 如果任何 before 钩子返回 false,则返回 false
62
+ */
63
+ protected runHooks(hookName: HookName, context: HookContext<S[T]>): Promise<boolean>;
64
+ /**
65
+ * 创建钩子上下文
66
+ */
67
+ protected createHookContext(options?: Partial<HookContext<S[T]>>): HookContext<S[T]>;
13
68
  /**
14
69
  * 获取数据库方言
15
70
  */
16
- get dialect(): Dialect<C, Q>;
71
+ get dialect(): Dialect<C, S, Q>;
17
72
  /**
18
73
  * 获取数据库是否已启动
19
74
  */
@@ -21,12 +76,50 @@ export declare abstract class Model<C = any, O extends object = object, Q = stri
21
76
  /**
22
77
  * 获取模型名称
23
78
  */
24
- get modelName(): string;
25
- alter(alterations: AlterDefinition<O>): QueryClasses.Alteration<O, C, Q>;
26
- select<K extends keyof O>(...fields: Array<K>): QueryClasses.Selection<Pick<O, K>, K, C, Q>;
27
- insert(data: O): QueryClasses.Insertion<O, C, Q>;
28
- update(update: Partial<O>): QueryClasses.Updation<O, C, Q>;
29
- delete(condition: Condition<O>): QueryClasses.Deletion<O, C, Q>;
79
+ get modelName(): T;
80
+ /**
81
+ * 是否启用软删除
82
+ */
83
+ get isSoftDelete(): boolean;
84
+ /**
85
+ * 软删除字段名
86
+ */
87
+ get deletedAtField(): string;
88
+ alter(alterations: AlterDefinition<S[T]>): QueryClasses.Alteration<S, T, C, Q>;
89
+ /**
90
+ * 查询(软删除模式下自动排除已删除记录)
91
+ */
92
+ select<K extends keyof S[T]>(...fields: Array<K>): QueryClasses.Selection<S, T, K, C, Q>;
93
+ /**
94
+ * 查询(包含已删除的记录)
95
+ */
96
+ selectWithTrashed<K extends keyof S[T]>(...fields: Array<K>): QueryClasses.Selection<S, T, K, C, Q>;
97
+ /**
98
+ * 仅查询已删除的记录
99
+ */
100
+ selectOnlyTrashed<K extends keyof S[T]>(...fields: Array<K>): QueryClasses.Selection<S, T, K, C, Q>;
101
+ insert(data: S[T]): QueryClasses.Insertion<S, T, C, Q>;
102
+ update(update: Partial<S[T]>): QueryClasses.Updation<S, T, C, Q>;
103
+ /**
104
+ * 删除(软删除模式下执行软删除)
105
+ */
106
+ delete(condition: Condition<S[T]>): QueryClasses.Deletion<S, T, C, Q> | QueryClasses.Updation<S, T, C, Q>;
107
+ /**
108
+ * 强制删除(忽略软删除,直接物理删除)
109
+ */
110
+ forceDelete(condition: Condition<S[T]>): QueryClasses.Deletion<S, T, C, Q>;
111
+ /**
112
+ * 恢复软删除的记录
113
+ */
114
+ restore(condition: Condition<S[T]>): QueryClasses.Updation<S, T, C, Q>;
115
+ /**
116
+ * 批量插入
117
+ */
118
+ insertMany(data: S[T][]): QueryClasses.BatchInsertion<S, T, C, Q>;
119
+ /**
120
+ * 聚合查询
121
+ */
122
+ aggregate(): QueryClasses.Aggregation<S, T, C, Q>;
30
123
  /**
31
124
  * 验证查询条件
32
125
  */
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/base/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAGnD;;;GAGG;AACH,8BAAsB,KAAK,CAAC,CAAC,GAAC,GAAG,EAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAC,CAAC,GAAG,MAAM;aAElD,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;aAC7B,IAAI,EAAE,MAAM;gBADZ,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM;IAG9B;;OAEG;IACH,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,EAAC,CAAC,CAAC,CAE1B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,KAAK,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAGxE,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAI3F,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAIhD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAI1D,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAG/D;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO;IAI5C;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO;IAI1C;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK;CAI9D;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/base/model.ts"],"names":[],"mappings":"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"}