jsql-neo 5.5.0 → 6.0.0

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 (81) hide show
  1. package/LICENSE +202 -202
  2. package/README.md +8155 -8097
  3. package/bin/jsql +320 -320
  4. package/bin/jsql-server +90 -90
  5. package/bin/jsql-server-control.js +177 -177
  6. package/index.d.ts +412 -385
  7. package/index.js +128 -124
  8. package/lib/ast.js +214 -214
  9. package/lib/btree.js +478 -413
  10. package/lib/cache.js +328 -328
  11. package/lib/client.js +125 -125
  12. package/lib/database.js +1741 -1744
  13. package/lib/date-types.js +182 -182
  14. package/lib/errors.js +89 -89
  15. package/lib/jsql_format.js +497 -497
  16. package/lib/migrate.js +254 -254
  17. package/lib/mod.js +292 -292
  18. package/lib/mongo_server.js +607 -607
  19. package/lib/multiserver.js +140 -140
  20. package/lib/mysql_compat.js +413 -413
  21. package/lib/mysql_server.js +1237 -1237
  22. package/lib/native_client.js +722 -732
  23. package/lib/nedb_compat.js +506 -506
  24. package/lib/pg_server.js +864 -864
  25. package/lib/plugin.js +259 -35
  26. package/lib/plugins/audit.js +37 -0
  27. package/lib/plugins/index.js +72 -0
  28. package/lib/plugins/logger.js +35 -0
  29. package/lib/plugins/metrics.js +38 -0
  30. package/lib/plugins/timestamps.js +57 -0
  31. package/lib/plugins/validation.js +128 -0
  32. package/lib/prepared.js +37 -0
  33. package/lib/query.js +834 -815
  34. package/lib/redis_server.js +571 -571
  35. package/lib/sql.js +4053 -3460
  36. package/lib/sqlite_compat.js +323 -323
  37. package/lib/sqlite_worker.js +264 -264
  38. package/lib/table.js +1351 -1304
  39. package/lib/tui.js +502 -502
  40. package/lib/wasm.js +1 -1
  41. package/lib/wasm_client.js +715 -718
  42. package/lib/web_ui.js +257 -257
  43. package/native/jsql-neo-native.node +0 -0
  44. package/nativesrc/jsql-neo-core/Cargo.lock +462 -455
  45. package/nativesrc/jsql-neo-core/Cargo.toml +26 -24
  46. package/nativesrc/jsql-neo-core/src/engine/hybrid.rs +492 -455
  47. package/nativesrc/jsql-neo-core/src/engine/memory.rs +191 -168
  48. package/nativesrc/jsql-neo-core/src/engine/mod.rs +74 -62
  49. package/nativesrc/jsql-neo-core/src/engine/table.rs +996 -700
  50. package/nativesrc/jsql-neo-core/src/lib.rs +2 -2
  51. package/nativesrc/jsql-neo-core/src/storage/mod.rs +2 -2
  52. package/nativesrc/jsql-neo-core/src/storage/persistent.rs +1 -1
  53. package/nativesrc/jsql-neo-core/src/storage/wal.rs +298 -85
  54. package/nativesrc/jsql-neo-core/src/types.rs +93 -93
  55. package/nativesrc/jsql-neo-native/Cargo.lock +613 -606
  56. package/nativesrc/jsql-neo-native/Cargo.toml +24 -16
  57. package/nativesrc/jsql-neo-native/build.rs +3 -3
  58. package/nativesrc/jsql-neo-native/package.json +7 -7
  59. package/nativesrc/jsql-neo-native/src/lib.rs +281 -269
  60. package/nativesrc/jsql-neo-wasm/Cargo.lock +472 -465
  61. package/nativesrc/jsql-neo-wasm/Cargo.toml +22 -15
  62. package/nativesrc/jsql-neo-wasm/src/lib.rs +463 -447
  63. package/package.json +87 -87
  64. package/postinstall.js +158 -158
  65. package/test/btree.test.js +144 -128
  66. package/test/coverage.js +187 -187
  67. package/test/join.test.js +110 -110
  68. package/test/native.test.js +158 -158
  69. package/test/query-opt.test.js +109 -0
  70. package/test/regress-5.1.0.js +271 -271
  71. package/test/smoke.js +58 -58
  72. package/test/sql-parser.test.js +450 -273
  73. package/test/wasm.test.js +110 -110
  74. package/wasm/browser.d.ts +89 -89
  75. package/wasm/browser.mjs +591 -569
  76. package/wasm/browser_bg.mjs +618 -597
  77. package/wasm/jsql_neo_wasm.d.ts +44 -38
  78. package/wasm/jsql_neo_wasm.js +641 -520
  79. package/wasm/jsql_neo_wasm_bg.wasm +0 -0
  80. package/wasm/jsql_neo_wasm_bg.wasm.d.ts +26 -26
  81. package/wasm/package.json +11 -11
package/index.d.ts CHANGED
@@ -1,385 +1,412 @@
1
- /**
2
- * JSQL-NEO — Rust-powered embedded database (Native / WASM / Pure JS)
3
- * with a MySQL-compatible server mode.
4
- */
5
-
6
- declare namespace JSQLNeo {
7
- export type FieldType =
8
- | 'string' | 'text' | 'varchar'
9
- | 'integer' | 'int' | 'bigint'
10
- | 'float' | 'double' | 'number'
11
- | 'boolean'
12
- | 'date' | 'datetime' | 'timestamp'
13
- | 'object' | 'json' | 'array'
14
- | 'any' | 'binary';
15
-
16
- export interface FieldDef {
17
- type: FieldType;
18
- primaryKey?: boolean;
19
- autoIncrement?: boolean;
20
- unique?: boolean;
21
- required?: boolean;
22
- nullable?: boolean;
23
- length?: number;
24
- maxLength?: number;
25
- min?: number;
26
- max?: number;
27
- default?: unknown;
28
- check?: string;
29
- ref?: string;
30
- computed?: boolean;
31
- }
32
-
33
- export type Schema = Record<string, FieldDef>;
34
-
35
- export interface Row {
36
- id: number | string;
37
- fields?: Record<string, unknown>;
38
- created_at?: string;
39
- updated_at?: string;
40
- [key: string]: unknown;
41
- }
42
-
43
- export interface FindOptions {
44
- limit?: number;
45
- offset?: number;
46
- }
47
-
48
- export interface JSQLOptions {
49
- dataDir?: string;
50
- flushThreshold?: number;
51
- modules?: boolean;
52
- persistence?: boolean;
53
- dbName?: string;
54
- }
55
-
56
- export type JSQLHook =
57
- | 'beforeInsert' | 'afterInsert'
58
- | 'beforeUpdate' | 'afterUpdate'
59
- | 'beforeDelete' | 'afterDelete'
60
- | 'beforeFind' | 'afterFind'
61
- | 'beforeCreateTable' | 'afterCreateTable'
62
- | 'beforeDropTable' | 'afterDropTable'
63
- | 'beforeFlush' | 'afterFlush'
64
- | 'beforeCount' | 'afterCount'
65
- | 'onStart' | 'onStop';
66
-
67
- export interface JSQLPlugin {
68
- name?: string;
69
- install?(db: JSQL, ctx: PluginContext): void;
70
- onEvent?(event: string, data: unknown): void;
71
- hooks?: Partial<Record<JSQLHook, (...args: any[]) => unknown>>;
72
- }
73
-
74
- export interface PluginContext {
75
- name: string;
76
- engine: JSQL;
77
- plugin: JSQLPlugin;
78
- on(hook: JSQLHook, fn: (...args: any[]) => unknown): JSQL;
79
- onEvent(fn: (event: string, data: unknown) => void): JSQL;
80
- emit(eventName: string, data: unknown): void;
81
- tables(): string[];
82
- hasTable(name: string): boolean;
83
- getTableSchema(name: string): Schema | null;
84
- }
85
-
86
- export class JSQL {
87
- constructor(opts?: JSQLOptions);
88
- use(plugin: JSQLPlugin | ((db: JSQL) => void)): this;
89
- on(event: JSQLHook, fn: (...args: any[]) => unknown): this;
90
- onEvent(fn: (event: string, data: unknown) => void): this;
91
- start(): Promise<void>;
92
- stop(): Promise<void>;
93
- flush(): Promise<void>;
94
- createTable(name: string, schema: Schema): Promise<unknown>;
95
- dropTable(name: string): Promise<unknown>;
96
- insert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown>;
97
- insertMany(table: string, data: Record<string, unknown>[]): Promise<unknown>;
98
- findById(table: string, id: number | string | bigint): Promise<Row | null>;
99
- findByIds(table: string, ids: Array<number | string>): Promise<Row[] | null>;
100
- find(table: string, filter?: Record<string, unknown>, opts?: FindOptions): Promise<Row[]>;
101
- count(table: string): Promise<number>;
102
- updateById(table: string, id: number | string, data: Record<string, unknown>): Promise<unknown>;
103
- updateByIds(table: string, entries: Array<[number | string, Record<string, unknown>]>): Promise<unknown>;
104
- removeById(table: string, id: number | string): Promise<unknown>;
105
- removeByIds(table: string, ids: Array<number | string>): Promise<unknown>;
106
- hasTable(name: string): Promise<boolean>;
107
- getTables(): Promise<string[]>;
108
- getTableSchema(name: string): Promise<Schema | null>;
109
- /**
110
- * 直接执行原生 SQL(本实例即充当 engine)。
111
- * @example await db.query("SELECT * FROM users WHERE age > ?", [21])
112
- * @returns 单条语句返回单个结果对象(含 columns/rows),多条返回数组。
113
- */
114
- query(sql: string, paramsOrOpts?: unknown[] | Record<string, unknown>, opts?: Record<string, unknown>): Promise<any>;
115
- }
116
-
117
- export class NativeJSQL extends JSQL {}
118
-
119
- export interface MysqlServerOptions {
120
- port?: number;
121
- host?: string;
122
- dataDir?: string;
123
- defaultDatabase?: string;
124
- noAuth?: boolean;
125
- auth?: Record<string, string>;
126
- allowComments?: boolean;
127
- safety?: boolean;
128
- maxConnections?: number;
129
- handshakeTimeout?: number;
130
- maxAuthFails?: number;
131
- }
132
-
133
- export class MysqlServer {
134
- constructor(options?: MysqlServerOptions);
135
- listen(cb?: (err?: Error) => void): this;
136
- close(cb?: () => void): void;
137
- readonly address: { port: number; address: string; family: string } | null;
138
- listDatabases(): Promise<string[]>;
139
- createDatabase(name: string, opts?: { ifNotExists?: boolean }): Promise<void>;
140
- dropDatabase(name: string, opts?: { ifExists?: boolean }): Promise<void>;
141
- }
142
-
143
- export function createMysqlServer(options?: MysqlServerOptions): MysqlServer;
144
-
145
- export interface RedisServerOptions {
146
- port?: number;
147
- host?: string;
148
- password?: string | null;
149
- dataDir?: string | null;
150
- onQuery?: (cmd: string, args: string[]) => void;
151
- }
152
-
153
- export class RedisServer {
154
- constructor(options?: RedisServerOptions);
155
- listen(): this;
156
- stop(): void;
157
- execute(cmd: string, args: string[]): string | number | string[] | null | 'OK' | 'PONG';
158
- }
159
-
160
- export function createRedisServer(options?: RedisServerOptions): RedisServer;
161
-
162
- export interface WebUIOptions {
163
- port?: number;
164
- host?: string;
165
- dataDir?: string;
166
- readonly?: boolean;
167
- }
168
-
169
- export class WebUI {
170
- constructor(options?: WebUIOptions);
171
- start(): Promise<number>;
172
- stop(): Promise<void>;
173
- listDatabases(): { name: string; tables: number }[];
174
- }
175
-
176
- export interface MigrateResult {
177
- created?: string[];
178
- inserted?: number;
179
- errors?: { line?: number; error: string }[];
180
- }
181
-
182
- export interface MigrateTools {
183
- normalizeSchema(schema: Record<string, unknown>): Record<string, unknown>;
184
- parseCSV(text: string): string[][];
185
- toCSV(rows: Record<string, unknown>[], columns?: string[]): string;
186
- exportTableToJSON(db: unknown, table: string): { schema: unknown; rows: unknown[] };
187
- exportAllToJSON(db: unknown): Record<string, unknown>;
188
- importFromJSON(db: unknown, data: Record<string, unknown>): Promise<MigrateResult>;
189
- exportTableToCSV(db: unknown, table: string): string;
190
- importFromCSV(db: unknown, table: string, csv: string, opts?: { schema?: unknown }): Promise<MigrateResult>;
191
- importDump(db: unknown, sql: string, opts?: { strict?: boolean }): Promise<MigrateResult>;
192
- importDumpFile(db: unknown, file: string, opts?: { strict?: boolean }): Promise<MigrateResult>;
193
- exportToFile(db: unknown, table: string, outFile: string): Promise<number>;
194
- }
195
-
196
- export const migrate: MigrateTools;
197
- export function exportTableToJSON(db: unknown, table: string): { schema: unknown; rows: unknown[] };
198
- export function exportAllToJSON(db: unknown): Record<string, unknown>;
199
- export function importFromJSON(db: unknown, data: Record<string, unknown>): Promise<MigrateResult>;
200
- export function exportTableToCSV(db: unknown, table: string): string;
201
- export function importFromCSV(db: unknown, table: string, csv: string, opts?: { schema?: unknown }): Promise<MigrateResult>;
202
- export function importDump(db: unknown, sql: string, opts?: { strict?: boolean }): Promise<MigrateResult>;
203
- export function importDumpFile(db: unknown, file: string, opts?: { strict?: boolean }): Promise<MigrateResult>;
204
- export function exportToFile(db: unknown, table: string, outFile: string): Promise<number>;
205
-
206
- export interface ConnectionOptions {
207
- host?: string;
208
- port?: number;
209
- user?: string;
210
- password?: string;
211
- database?: string;
212
- }
213
-
214
- export interface ConnectionResult {
215
- insertId: number | null;
216
- affectedRows: number;
217
- rows: unknown[];
218
- fields?: unknown[];
219
- }
220
-
221
- export class Connection {
222
- constructor(options?: ConnectionOptions);
223
- connect(cb?: (err?: Error) => void): void;
224
- query(sql: string, params?: unknown[], cb?: (err: Error | null, result: ConnectionResult) => void): void;
225
- execute(sql: string, params?: unknown[], cb?: (err: Error | null, result: ConnectionResult) => void): void;
226
- beginTransaction(cb?: (err?: Error) => void): void;
227
- commit(cb?: (err?: Error) => void): void;
228
- rollback(cb?: (err?: Error) => void): void;
229
- end(): void;
230
- format(sql: string, params?: unknown[]): string;
231
- escape(value: unknown): string;
232
- escapeId(value: string): string;
233
- }
234
-
235
- export class Pool {
236
- constructor(options?: ConnectionOptions & { max?: number });
237
- query(sql: string, params?: unknown[], cb?: (err: Error | null, result: ConnectionResult) => void): void;
238
- getConnection(cb: (err: Error | null, conn: Connection) => void): void;
239
- end(): void;
240
- }
241
-
242
- export function createConnection(options?: ConnectionOptions): Connection;
243
- export function createPool(options?: ConnectionOptions & { max?: number }): Pool;
244
-
245
- export interface SQLResult {
246
- ok: boolean;
247
- type: string;
248
- table?: string | null;
249
- columns?: string[];
250
- rows?: unknown[][];
251
- raw?: unknown[];
252
- affectedRows?: number;
253
- insertId?: number | null;
254
- ids?: unknown[];
255
- error?: string;
256
- }
257
-
258
- export interface SQLOptions {
259
- allowComments?: boolean;
260
- safety?: boolean;
261
- maxStatements?: number;
262
- session?: Record<string, unknown>;
263
- /** 5.5.0+:原生 `?` 占位符绑定值(与 applyParams 的数组入参二选一) */
264
- params?: unknown[];
265
- }
266
-
267
- /** AST 节点:带字符串 type 的普通对象树 */
268
- export interface ASTNode {
269
- type: string;
270
- [key: string]: unknown;
271
- }
272
-
273
- /** 5.5.0+:AST 访问与改写 */
274
- export namespace AST {
275
- function walk(ast: unknown, visitor: (node: ASTNode, parent?: unknown, key?: string) => void | false, opts?: { post?: (node: ASTNode) => void }): unknown;
276
- function collect(ast: unknown, predicate: (node: ASTNode) => boolean): ASTNode[];
277
- function find(ast: unknown, predicate: (node: ASTNode) => boolean): ASTNode | null;
278
- function transform(ast: unknown, fn: (node: unknown) => unknown): unknown;
279
- function rewrite(ast: unknown, fn: (node: unknown) => unknown): unknown;
280
- function tables(ast: unknown): string[];
281
- function columns(ast: unknown): string[];
282
- function isNode(value: unknown): boolean;
283
- function cloneNode(node: unknown): unknown;
284
- class StatementVisitor {
285
- run(ast: unknown): unknown;
286
- visitDefault?(node: ASTNode): void;
287
- [key: string]: unknown;
288
- }
289
- }
290
-
291
- export function executeSQL(engine: unknown, sql: string, paramsOrOpts?: unknown[] | SQLOptions, opts?: SQLOptions): Promise<SQLResult>;
292
- export function parseSQL(sql: string): unknown;
293
- export function splitStatements(sql: string): string[];
294
- export function applyParams(sql: string, values: unknown[]): string;
295
- export function escapeValue(value: unknown): string;
296
- export function escapeId(value: string): string;
297
- export function walk(ast: unknown, visitor: (node: ASTNode) => void | false): unknown;
298
- export function transform(ast: unknown, fn: (node: unknown) => unknown): unknown;
299
-
300
- export interface DatabaseOptions {
301
- dataDir?: string;
302
- persist?: boolean;
303
- inMemoryOnly?: boolean;
304
- }
305
-
306
- export class Database {
307
- constructor(options?: DatabaseOptions);
308
- createTable(name: string, schema: Schema): Promise<unknown>;
309
- insert(table: string, data: Record<string, unknown>): Promise<unknown>;
310
- find(table: string, filter?: Record<string, unknown>): Promise<Row[]>;
311
- update(table: string, filter: Record<string, unknown>, data: Record<string, unknown>): Promise<number>;
312
- remove(table: string, filter: Record<string, unknown>): Promise<number>;
313
- findOne(table: string, filter?: Record<string, unknown>): Promise<Row | null>;
314
- count(table: string): Promise<number>;
315
- getTables(): Promise<string[]>;
316
- dropTable(name: string): Promise<void>;
317
- getTableSchema(name: string): Promise<Schema | null>;
318
- }
319
-
320
- export class Table {
321
- constructor(name: string, schema: Schema, db?: unknown);
322
- insert(data: Record<string, unknown>): Promise<unknown>;
323
- find(filter?: Record<string, unknown>): Promise<Row[]>;
324
- updateById(id: number | string, data: Record<string, unknown>): Promise<unknown>;
325
- removeById(id: number | string): Promise<unknown>;
326
- count(): Promise<number>;
327
- }
328
-
329
- export class Query {
330
- constructor(table: unknown);
331
- exec(): Promise<Row[]>;
332
- then(resolve: (rows: Row[]) => unknown, reject?: (err: Error) => unknown): Promise<unknown>;
333
- }
334
-
335
- export class BTree {
336
- constructor(order?: number);
337
- insert(key: unknown, value: unknown): void;
338
- find(key: unknown): unknown;
339
- range(min: unknown, max: unknown): unknown[];
340
- }
341
-
342
- export class Cache {
343
- constructor(options?: Record<string, unknown>);
344
- get(key: string): unknown;
345
- set(key: string, value: unknown, ttlMs?: number): void;
346
- del(key: string): void;
347
- flush(): void;
348
- close(): void;
349
- }
350
-
351
- export class Plugin {
352
- static create(plugin: JSQLPlugin): JSQLPlugin;
353
- }
354
-
355
- export class ModuleManager {
356
- constructor(opts?: { cwd?: string });
357
- applyTo(engine: JSQL): void;
358
- }
359
-
360
- export class JSQL_Error extends Error {
361
- code: number;
362
- codeKey: string;
363
- args: unknown[];
364
- }
365
-
366
- export const ErrorCodes: Record<string, { code: number; msg: string }>;
367
-
368
- export class JSQLFormat {
369
- constructor(db: unknown);
370
- dump(): string;
371
- load(dump: string): void;
372
- }
373
-
374
- export class Datastore {
375
- constructor(options?: DatabaseOptions);
376
- insert(docs: unknown): Promise<unknown>;
377
- find(query?: unknown): Promise<unknown[]>;
378
- update(query: unknown, update: unknown): Promise<number>;
379
- remove(query: unknown): Promise<number>;
380
- loadDatabase(): Promise<void>;
381
- persistence: { persistCachedDatabase: (cb?: (err?: Error) => void) => void };
382
- }
383
- }
384
-
385
- export = JSQLNeo;
1
+ /**
2
+ * JSQL-NEO — Rust-powered embedded database (Native / WASM / Pure JS)
3
+ * with a MySQL-compatible server mode.
4
+ */
5
+
6
+ declare namespace JSQLNeo {
7
+ export type FieldType =
8
+ | 'string' | 'text' | 'varchar'
9
+ | 'integer' | 'int' | 'bigint'
10
+ | 'float' | 'double' | 'number'
11
+ | 'boolean'
12
+ | 'date' | 'datetime' | 'timestamp'
13
+ | 'object' | 'json' | 'array'
14
+ | 'any' | 'binary';
15
+
16
+ export interface FieldDef {
17
+ type: FieldType;
18
+ primaryKey?: boolean;
19
+ autoIncrement?: boolean;
20
+ unique?: boolean;
21
+ required?: boolean;
22
+ nullable?: boolean;
23
+ length?: number;
24
+ maxLength?: number;
25
+ min?: number;
26
+ max?: number;
27
+ default?: unknown;
28
+ check?: string;
29
+ ref?: string;
30
+ computed?: boolean;
31
+ }
32
+
33
+ export type Schema = Record<string, FieldDef>;
34
+
35
+ export interface Row {
36
+ id: number | string;
37
+ fields?: Record<string, unknown>;
38
+ created_at?: string;
39
+ updated_at?: string;
40
+ [key: string]: unknown;
41
+ }
42
+
43
+ export interface FindOptions {
44
+ limit?: number;
45
+ offset?: number;
46
+ }
47
+
48
+ export interface JSQLOptions {
49
+ dataDir?: string;
50
+ flushThreshold?: number;
51
+ modules?: boolean;
52
+ persistence?: boolean;
53
+ dbName?: string;
54
+ }
55
+
56
+ export type JSQLHook =
57
+ | 'beforeInsert' | 'afterInsert'
58
+ | 'beforeUpdate' | 'afterUpdate'
59
+ | 'beforeDelete' | 'afterDelete'
60
+ | 'beforeFind' | 'afterFind'
61
+ | 'beforeCreateTable' | 'afterCreateTable'
62
+ | 'beforeDropTable' | 'afterDropTable'
63
+ | 'beforeFlush' | 'afterFlush'
64
+ | 'beforeCount' | 'afterCount'
65
+ | 'onStart' | 'onStop';
66
+
67
+ export interface JSQLPlugin {
68
+ name?: string;
69
+ install?(db: JSQL, ctx: PluginContext): void;
70
+ onEvent?(event: string, data: unknown): void;
71
+ hooks?: Partial<Record<JSQLHook, (...args: any[]) => unknown>>;
72
+ }
73
+
74
+ export interface PluginContext {
75
+ name: string;
76
+ engine: JSQL;
77
+ plugin: JSQLPlugin;
78
+ on(hook: JSQLHook, fn: (...args: any[]) => unknown): JSQL;
79
+ onEvent(fn: (event: string, data: unknown) => void): JSQL;
80
+ emit(eventName: string, data: unknown): void;
81
+ tables(): string[];
82
+ hasTable(name: string): boolean;
83
+ getTableSchema(name: string): Schema | null;
84
+ }
85
+
86
+ export class JSQL {
87
+ constructor(opts?: JSQLOptions);
88
+ use(plugin: JSQLPlugin | string | ((db: JSQL) => void), opts?: Record<string, unknown>): this;
89
+ on(event: JSQLHook, fn: (...args: any[]) => unknown): this;
90
+ onEvent(fn: (event: string, data: unknown) => void): this;
91
+ start(): Promise<void>;
92
+ stop(): Promise<void>;
93
+ flush(): Promise<void>;
94
+ createTable(name: string, schema: Schema): Promise<unknown>;
95
+ addColumn(table: string, name: string, def: string | FieldDef): Promise<unknown>;
96
+ dropTable(name: string): Promise<unknown>;
97
+ insert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown>;
98
+ insertMany(table: string, data: Record<string, unknown>[]): Promise<unknown>;
99
+ findById(table: string, id: number | string | bigint): Promise<Row | null>;
100
+ findByIds(table: string, ids: Array<number | string>): Promise<Row[] | null>;
101
+ find(table: string, filter?: Record<string, unknown>, opts?: FindOptions): Promise<Row[]>;
102
+ count(table: string): Promise<number>;
103
+ updateById(table: string, id: number | string, data: Record<string, unknown>): Promise<unknown>;
104
+ updateByIds(table: string, entries: Array<[number | string, Record<string, unknown>]>): Promise<unknown>;
105
+ removeById(table: string, id: number | string): Promise<unknown>;
106
+ removeByIds(table: string, ids: Array<number | string>): Promise<unknown>;
107
+ hasTable(name: string): Promise<boolean>;
108
+ getTables(): Promise<string[]>;
109
+ getTableSchema(name: string): Promise<Schema | null>;
110
+ /**
111
+ * 直接执行原生 SQL(本实例即充当 engine)。
112
+ * @example await db.query("SELECT * FROM users WHERE age > ?", [21])
113
+ * @returns 单条语句返回单个结果对象(含 columns/rows),多条返回数组。
114
+ */
115
+ query(sql: string, paramsOrOpts?: unknown[] | Record<string, unknown>, opts?: Record<string, unknown>): Promise<any>;
116
+ exists(table: string, filter?: Record<string, unknown>): Promise<boolean>;
117
+ prepare(sql: string): PreparedStatement;
118
+ }
119
+
120
+ export interface PreparedStatement {
121
+ sql: string;
122
+ all(...params: unknown[]): Promise<any>;
123
+ get(...params: unknown[]): Promise<Record<string, unknown> | null>;
124
+ run(...params: unknown[]): Promise<any>;
125
+ }
126
+
127
+ export class NativeJSQL extends JSQL {}
128
+
129
+ export interface MysqlServerOptions {
130
+ port?: number;
131
+ host?: string;
132
+ dataDir?: string;
133
+ defaultDatabase?: string;
134
+ noAuth?: boolean;
135
+ auth?: Record<string, string>;
136
+ allowComments?: boolean;
137
+ safety?: boolean;
138
+ maxConnections?: number;
139
+ handshakeTimeout?: number;
140
+ maxAuthFails?: number;
141
+ }
142
+
143
+ export class MysqlServer {
144
+ constructor(options?: MysqlServerOptions);
145
+ listen(cb?: (err?: Error) => void): this;
146
+ close(cb?: () => void): void;
147
+ readonly address: { port: number; address: string; family: string } | null;
148
+ listDatabases(): Promise<string[]>;
149
+ createDatabase(name: string, opts?: { ifNotExists?: boolean }): Promise<void>;
150
+ dropDatabase(name: string, opts?: { ifExists?: boolean }): Promise<void>;
151
+ }
152
+
153
+ export function createMysqlServer(options?: MysqlServerOptions): MysqlServer;
154
+
155
+ export interface RedisServerOptions {
156
+ port?: number;
157
+ host?: string;
158
+ password?: string | null;
159
+ dataDir?: string | null;
160
+ onQuery?: (cmd: string, args: string[]) => void;
161
+ }
162
+
163
+ export class RedisServer {
164
+ constructor(options?: RedisServerOptions);
165
+ listen(): this;
166
+ stop(): void;
167
+ execute(cmd: string, args: string[]): string | number | string[] | null | 'OK' | 'PONG';
168
+ }
169
+
170
+ export function createRedisServer(options?: RedisServerOptions): RedisServer;
171
+
172
+ export interface WebUIOptions {
173
+ port?: number;
174
+ host?: string;
175
+ dataDir?: string;
176
+ readonly?: boolean;
177
+ }
178
+
179
+ export class WebUI {
180
+ constructor(options?: WebUIOptions);
181
+ start(): Promise<number>;
182
+ stop(): Promise<void>;
183
+ listDatabases(): { name: string; tables: number }[];
184
+ }
185
+
186
+ export interface MigrateResult {
187
+ created?: string[];
188
+ inserted?: number;
189
+ errors?: { line?: number; error: string }[];
190
+ }
191
+
192
+ export interface MigrateTools {
193
+ normalizeSchema(schema: Record<string, unknown>): Record<string, unknown>;
194
+ parseCSV(text: string): string[][];
195
+ toCSV(rows: Record<string, unknown>[], columns?: string[]): string;
196
+ exportTableToJSON(db: unknown, table: string): { schema: unknown; rows: unknown[] };
197
+ exportAllToJSON(db: unknown): Record<string, unknown>;
198
+ importFromJSON(db: unknown, data: Record<string, unknown>): Promise<MigrateResult>;
199
+ exportTableToCSV(db: unknown, table: string): string;
200
+ importFromCSV(db: unknown, table: string, csv: string, opts?: { schema?: unknown }): Promise<MigrateResult>;
201
+ importDump(db: unknown, sql: string, opts?: { strict?: boolean }): Promise<MigrateResult>;
202
+ importDumpFile(db: unknown, file: string, opts?: { strict?: boolean }): Promise<MigrateResult>;
203
+ exportToFile(db: unknown, table: string, outFile: string): Promise<number>;
204
+ }
205
+
206
+ export const migrate: MigrateTools;
207
+ export function exportTableToJSON(db: unknown, table: string): { schema: unknown; rows: unknown[] };
208
+ export function exportAllToJSON(db: unknown): Record<string, unknown>;
209
+ export function importFromJSON(db: unknown, data: Record<string, unknown>): Promise<MigrateResult>;
210
+ export function exportTableToCSV(db: unknown, table: string): string;
211
+ export function importFromCSV(db: unknown, table: string, csv: string, opts?: { schema?: unknown }): Promise<MigrateResult>;
212
+ export function importDump(db: unknown, sql: string, opts?: { strict?: boolean }): Promise<MigrateResult>;
213
+ export function importDumpFile(db: unknown, file: string, opts?: { strict?: boolean }): Promise<MigrateResult>;
214
+ export function exportToFile(db: unknown, table: string, outFile: string): Promise<number>;
215
+
216
+ export interface ConnectionOptions {
217
+ host?: string;
218
+ port?: number;
219
+ user?: string;
220
+ password?: string;
221
+ database?: string;
222
+ }
223
+
224
+ export interface ConnectionResult {
225
+ insertId: number | null;
226
+ affectedRows: number;
227
+ rows: unknown[];
228
+ fields?: unknown[];
229
+ }
230
+
231
+ export class Connection {
232
+ constructor(options?: ConnectionOptions);
233
+ connect(cb?: (err?: Error) => void): void;
234
+ query(sql: string, params?: unknown[], cb?: (err: Error | null, result: ConnectionResult) => void): void;
235
+ execute(sql: string, params?: unknown[], cb?: (err: Error | null, result: ConnectionResult) => void): void;
236
+ beginTransaction(cb?: (err?: Error) => void): void;
237
+ commit(cb?: (err?: Error) => void): void;
238
+ rollback(cb?: (err?: Error) => void): void;
239
+ end(): void;
240
+ format(sql: string, params?: unknown[]): string;
241
+ escape(value: unknown): string;
242
+ escapeId(value: string): string;
243
+ }
244
+
245
+ export class Pool {
246
+ constructor(options?: ConnectionOptions & { max?: number });
247
+ query(sql: string, params?: unknown[], cb?: (err: Error | null, result: ConnectionResult) => void): void;
248
+ getConnection(cb: (err: Error | null, conn: Connection) => void): void;
249
+ end(): void;
250
+ }
251
+
252
+ export function createConnection(options?: ConnectionOptions): Connection;
253
+ export function createPool(options?: ConnectionOptions & { max?: number }): Pool;
254
+
255
+ export interface SQLResult {
256
+ ok: boolean;
257
+ type: string;
258
+ table?: string | null;
259
+ columns?: string[];
260
+ rows?: unknown[][];
261
+ raw?: unknown[];
262
+ affectedRows?: number;
263
+ insertId?: number | null;
264
+ ids?: unknown[];
265
+ error?: string;
266
+ }
267
+
268
+ export interface SQLOptions {
269
+ allowComments?: boolean;
270
+ safety?: boolean;
271
+ maxStatements?: number;
272
+ session?: Record<string, unknown>;
273
+ /** 5.5.0+:原生 `?` 占位符绑定值(与 applyParams 的数组入参二选一) */
274
+ params?: unknown[];
275
+ }
276
+
277
+ /** AST 节点:带字符串 type 的普通对象树 */
278
+ export interface ASTNode {
279
+ type: string;
280
+ [key: string]: unknown;
281
+ }
282
+
283
+ /** 5.5.0+:AST 访问与改写 */
284
+ export namespace AST {
285
+ function walk(ast: unknown, visitor: (node: ASTNode, parent?: unknown, key?: string) => void | false, opts?: { post?: (node: ASTNode) => void }): unknown;
286
+ function collect(ast: unknown, predicate: (node: ASTNode) => boolean): ASTNode[];
287
+ function find(ast: unknown, predicate: (node: ASTNode) => boolean): ASTNode | null;
288
+ function transform(ast: unknown, fn: (node: unknown) => unknown): unknown;
289
+ function rewrite(ast: unknown, fn: (node: unknown) => unknown): unknown;
290
+ function tables(ast: unknown): string[];
291
+ function columns(ast: unknown): string[];
292
+ function isNode(value: unknown): boolean;
293
+ function cloneNode(node: unknown): unknown;
294
+ class StatementVisitor {
295
+ run(ast: unknown): unknown;
296
+ visitDefault?(node: ASTNode): void;
297
+ [key: string]: unknown;
298
+ }
299
+ }
300
+
301
+ export function executeSQL(engine: unknown, sql: string, paramsOrOpts?: unknown[] | SQLOptions, opts?: SQLOptions): Promise<SQLResult>;
302
+ export function parseSQL(sql: string): unknown;
303
+ export function splitStatements(sql: string): string[];
304
+ export function applyParams(sql: string, values: unknown[]): string;
305
+ export function escapeValue(value: unknown): string;
306
+ export function escapeId(value: string): string;
307
+ export function walk(ast: unknown, visitor: (node: ASTNode) => void | false): unknown;
308
+ export function transform(ast: unknown, fn: (node: unknown) => unknown): unknown;
309
+
310
+ export interface DatabaseOptions {
311
+ dataDir?: string;
312
+ persist?: boolean;
313
+ inMemoryOnly?: boolean;
314
+ }
315
+
316
+ export class Database {
317
+ constructor(options?: DatabaseOptions);
318
+ createTable(name: string, schema: Schema): Promise<unknown>;
319
+ insert(table: string, data: Record<string, unknown>): Promise<unknown>;
320
+ find(table: string, filter?: Record<string, unknown>): Promise<Row[]>;
321
+ exists(table: string, filter?: Record<string, unknown>): boolean;
322
+ prepare(sql: string): PreparedStatement;
323
+ query(sql: string, paramsOrOpts?: unknown[] | SQLOptions, opts?: SQLOptions): Promise<SQLResult>;
324
+ update(table: string, filter: Record<string, unknown>, data: Record<string, unknown>): Promise<number>;
325
+ remove(table: string, filter: Record<string, unknown>): Promise<number>;
326
+ findOne(table: string, filter?: Record<string, unknown>): Promise<Row | null>;
327
+ count(table: string): Promise<number>;
328
+ getTables(): Promise<string[]>;
329
+ dropTable(name: string): Promise<void>;
330
+ getTableSchema(name: string): Promise<Schema | null>;
331
+ use(plugin: JSQLPlugin | string | ((db: Database) => void), opts?: Record<string, unknown>): this;
332
+ }
333
+
334
+ export class Table {
335
+ constructor(name: string, schema: Schema, db?: unknown);
336
+ insert(data: Record<string, unknown>): Promise<unknown>;
337
+ find(filter?: Record<string, unknown>): Promise<Row[]>;
338
+ exists(filter?: Record<string, unknown>): boolean;
339
+ updateById(id: number | string, data: Record<string, unknown>): Promise<unknown>;
340
+ removeById(id: number | string): Promise<unknown>;
341
+ count(): Promise<number>;
342
+ }
343
+
344
+ export class Query {
345
+ constructor(table: unknown);
346
+ where(conditions: Record<string, unknown>): this;
347
+ orderBy(field: string, dir?: 'asc' | 'desc'): this;
348
+ limit(n: number): this;
349
+ offset(n: number): this;
350
+ get(): Row[];
351
+ first(): Row | null;
352
+ exists(): boolean;
353
+ count(): number;
354
+ exec(): Promise<Row[]>;
355
+ then(resolve: (rows: Row[]) => unknown, reject?: (err: Error) => unknown): Promise<unknown>;
356
+ }
357
+
358
+ export class BTree {
359
+ constructor(order?: number, unique?: boolean);
360
+ insert(key: unknown, value: unknown): void;
361
+ search(key: unknown): number[];
362
+ searchMany(keys: unknown[]): number[];
363
+ prefix(prefix: string): number[];
364
+ range(min: unknown, max: unknown): number[];
365
+ greaterThan(min: unknown): number[];
366
+ lessThan(max: unknown): number[];
367
+ }
368
+
369
+ export class Cache {
370
+ constructor(options?: Record<string, unknown>);
371
+ get(key: string): unknown;
372
+ set(key: string, value: unknown, ttlMs?: number): void;
373
+ del(key: string): void;
374
+ flush(): void;
375
+ close(): void;
376
+ }
377
+
378
+ export class Plugin {
379
+ static create(plugin: JSQLPlugin): JSQLPlugin;
380
+ }
381
+
382
+ export class ModuleManager {
383
+ constructor(opts?: { cwd?: string });
384
+ applyTo(engine: JSQL): void;
385
+ }
386
+
387
+ export class JSQL_Error extends Error {
388
+ code: number;
389
+ codeKey: string;
390
+ args: unknown[];
391
+ }
392
+
393
+ export const ErrorCodes: Record<string, { code: number; msg: string }>;
394
+
395
+ export class JSQLFormat {
396
+ constructor(db: unknown);
397
+ dump(): string;
398
+ load(dump: string): void;
399
+ }
400
+
401
+ export class Datastore {
402
+ constructor(options?: DatabaseOptions);
403
+ insert(docs: unknown): Promise<unknown>;
404
+ find(query?: unknown): Promise<unknown[]>;
405
+ update(query: unknown, update: unknown): Promise<number>;
406
+ remove(query: unknown): Promise<number>;
407
+ loadDatabase(): Promise<void>;
408
+ persistence: { persistCachedDatabase: (cb?: (err?: Error) => void) => void };
409
+ }
410
+ }
411
+
412
+ export = JSQLNeo;