jsql-neo 5.4.2 → 5.5.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 (72) hide show
  1. package/LICENSE +202 -202
  2. package/README.md +8097 -7971
  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 +385 -357
  7. package/index.js +124 -118
  8. package/lib/ast.js +214 -0
  9. package/lib/btree.js +413 -413
  10. package/lib/cache.js +328 -328
  11. package/lib/client.js +125 -125
  12. package/lib/database.js +1744 -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 +732 -732
  23. package/lib/nedb_compat.js +506 -506
  24. package/lib/pg_server.js +864 -864
  25. package/lib/plugin.js +34 -34
  26. package/lib/query.js +815 -815
  27. package/lib/redis_server.js +571 -571
  28. package/lib/sql.js +3460 -2925
  29. package/lib/sqlite_compat.js +323 -323
  30. package/lib/sqlite_worker.js +264 -264
  31. package/lib/table.js +1304 -1304
  32. package/lib/tui.js +502 -502
  33. package/lib/wasm.js +1 -1
  34. package/lib/wasm_client.js +718 -718
  35. package/lib/web_ui.js +257 -257
  36. package/native/jsql-neo-native.node +0 -0
  37. package/nativesrc/jsql-neo-core/Cargo.lock +455 -455
  38. package/nativesrc/jsql-neo-core/Cargo.toml +24 -24
  39. package/nativesrc/jsql-neo-core/src/engine/hybrid.rs +455 -455
  40. package/nativesrc/jsql-neo-core/src/engine/memory.rs +168 -168
  41. package/nativesrc/jsql-neo-core/src/engine/mod.rs +62 -62
  42. package/nativesrc/jsql-neo-core/src/engine/table.rs +700 -700
  43. package/nativesrc/jsql-neo-core/src/lib.rs +2 -2
  44. package/nativesrc/jsql-neo-core/src/storage/mod.rs +2 -2
  45. package/nativesrc/jsql-neo-core/src/storage/persistent.rs +1 -1
  46. package/nativesrc/jsql-neo-core/src/storage/wal.rs +85 -85
  47. package/nativesrc/jsql-neo-core/src/types.rs +93 -93
  48. package/nativesrc/jsql-neo-native/Cargo.lock +606 -606
  49. package/nativesrc/jsql-neo-native/Cargo.toml +16 -16
  50. package/nativesrc/jsql-neo-native/build.rs +3 -3
  51. package/nativesrc/jsql-neo-native/package.json +7 -7
  52. package/nativesrc/jsql-neo-native/src/lib.rs +269 -269
  53. package/nativesrc/jsql-neo-wasm/Cargo.lock +465 -465
  54. package/nativesrc/jsql-neo-wasm/Cargo.toml +15 -15
  55. package/nativesrc/jsql-neo-wasm/src/lib.rs +447 -447
  56. package/package.json +87 -86
  57. package/postinstall.js +158 -158
  58. package/test/btree.test.js +128 -128
  59. package/test/coverage.js +187 -187
  60. package/test/join.test.js +110 -110
  61. package/test/native.test.js +158 -158
  62. package/test/regress-5.1.0.js +271 -271
  63. package/test/smoke.js +58 -58
  64. package/test/sql-parser.test.js +273 -0
  65. package/test/wasm.test.js +110 -110
  66. package/wasm/browser.d.ts +89 -89
  67. package/wasm/browser.mjs +569 -569
  68. package/wasm/browser_bg.mjs +597 -597
  69. package/wasm/jsql_neo_wasm.d.ts +38 -38
  70. package/wasm/jsql_neo_wasm.js +520 -520
  71. package/wasm/jsql_neo_wasm_bg.wasm.d.ts +26 -26
  72. package/wasm/package.json +11 -11
package/index.d.ts CHANGED
@@ -1,357 +1,385 @@
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
- }
264
-
265
- export function executeSQL(engine: unknown, sql: string, paramsOrOpts?: unknown[] | SQLOptions, opts?: SQLOptions): Promise<SQLResult>;
266
- export function parseSQL(sql: string): unknown;
267
- export function splitStatements(sql: string): string[];
268
- export function applyParams(sql: string, values: unknown[]): string;
269
- export function escapeValue(value: unknown): string;
270
- export function escapeId(value: string): string;
271
-
272
- export interface DatabaseOptions {
273
- dataDir?: string;
274
- persist?: boolean;
275
- inMemoryOnly?: boolean;
276
- }
277
-
278
- export class Database {
279
- constructor(options?: DatabaseOptions);
280
- createTable(name: string, schema: Schema): Promise<unknown>;
281
- insert(table: string, data: Record<string, unknown>): Promise<unknown>;
282
- find(table: string, filter?: Record<string, unknown>): Promise<Row[]>;
283
- update(table: string, filter: Record<string, unknown>, data: Record<string, unknown>): Promise<number>;
284
- remove(table: string, filter: Record<string, unknown>): Promise<number>;
285
- findOne(table: string, filter?: Record<string, unknown>): Promise<Row | null>;
286
- count(table: string): Promise<number>;
287
- getTables(): Promise<string[]>;
288
- dropTable(name: string): Promise<void>;
289
- getTableSchema(name: string): Promise<Schema | null>;
290
- }
291
-
292
- export class Table {
293
- constructor(name: string, schema: Schema, db?: unknown);
294
- insert(data: Record<string, unknown>): Promise<unknown>;
295
- find(filter?: Record<string, unknown>): Promise<Row[]>;
296
- updateById(id: number | string, data: Record<string, unknown>): Promise<unknown>;
297
- removeById(id: number | string): Promise<unknown>;
298
- count(): Promise<number>;
299
- }
300
-
301
- export class Query {
302
- constructor(table: unknown);
303
- exec(): Promise<Row[]>;
304
- then(resolve: (rows: Row[]) => unknown, reject?: (err: Error) => unknown): Promise<unknown>;
305
- }
306
-
307
- export class BTree {
308
- constructor(order?: number);
309
- insert(key: unknown, value: unknown): void;
310
- find(key: unknown): unknown;
311
- range(min: unknown, max: unknown): unknown[];
312
- }
313
-
314
- export class Cache {
315
- constructor(options?: Record<string, unknown>);
316
- get(key: string): unknown;
317
- set(key: string, value: unknown, ttlMs?: number): void;
318
- del(key: string): void;
319
- flush(): void;
320
- close(): void;
321
- }
322
-
323
- export class Plugin {
324
- static create(plugin: JSQLPlugin): JSQLPlugin;
325
- }
326
-
327
- export class ModuleManager {
328
- constructor(opts?: { cwd?: string });
329
- applyTo(engine: JSQL): void;
330
- }
331
-
332
- export class JSQL_Error extends Error {
333
- code: number;
334
- codeKey: string;
335
- args: unknown[];
336
- }
337
-
338
- export const ErrorCodes: Record<string, { code: number; msg: string }>;
339
-
340
- export class JSQLFormat {
341
- constructor(db: unknown);
342
- dump(): string;
343
- load(dump: string): void;
344
- }
345
-
346
- export class Datastore {
347
- constructor(options?: DatabaseOptions);
348
- insert(docs: unknown): Promise<unknown>;
349
- find(query?: unknown): Promise<unknown[]>;
350
- update(query: unknown, update: unknown): Promise<number>;
351
- remove(query: unknown): Promise<number>;
352
- loadDatabase(): Promise<void>;
353
- persistence: { persistCachedDatabase: (cb?: (err?: Error) => void) => void };
354
- }
355
- }
356
-
357
- 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 | ((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;