From 57a61a7b6d564bcffb91089e08f674743916c99a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20Hano=C4=9Flu?= Date: Fri, 13 Mar 2026 13:14:49 +0300 Subject: [PATCH 1/3] feat: Added index hint and no-index support --- packages/builder/src/query/delete-query.ts | 8 ++ packages/builder/src/query/insert-query.ts | 8 ++ packages/builder/src/query/query.ts | 86 ++++++++++++++++--- packages/builder/src/query/select-query.ts | 8 ++ packages/builder/src/query/update-query.ts | 8 ++ .../test/query-objects/select-query.spec.ts | 4 +- .../connect/src/orm/commands/count.command.ts | 6 +- .../src/orm/commands/create.command.ts | 6 +- .../src/orm/commands/delete.command.ts | 6 +- .../connect/src/orm/commands/find.command.ts | 21 ++++- packages/connect/src/orm/repository.class.ts | 35 +++++++- .../oracle-dialect/src/oracle-serializer.ts | 16 ++++ .../test/oracle-serializer.spec.ts | 18 ++++ 13 files changed, 208 insertions(+), 22 deletions(-) diff --git a/packages/builder/src/query/delete-query.ts b/packages/builder/src/query/delete-query.ts index 3a42425a..3dcbcc34 100644 --- a/packages/builder/src/query/delete-query.ts +++ b/packages/builder/src/query/delete-query.ts @@ -45,6 +45,14 @@ export class DeleteQuery extends Query { const o = { table: this._table._serialize(ctx), where: this._serializeWhere(ctx), + indexHint: this._indexHint.filter( + x => + !ctx.dialect || !x.dialect?.length || x.dialect.includes(ctx.dialect), + ), + noIndexHint: this._noIndexHint.filter( + x => + !ctx.dialect || !x.dialect?.length || x.dialect.includes(ctx.dialect), + ), }; return ctx.serialize(this._type, o, () => this.__defaultSerialize(ctx, o)); } diff --git a/packages/builder/src/query/insert-query.ts b/packages/builder/src/query/insert-query.ts index e833b1bf..45e83832 100644 --- a/packages/builder/src/query/insert-query.ts +++ b/packages/builder/src/query/insert-query.ts @@ -50,6 +50,14 @@ export class InsertQuery extends ReturningQuery { columns: this.__serializeColumns(ctx), values: this.__serializeValues(ctx), returning: this.__serializeReturning(ctx), + indexHint: this._indexHint.filter( + x => + !ctx.dialect || !x.dialect?.length || x.dialect.includes(ctx.dialect), + ), + noIndexHint: this._noIndexHint.filter( + x => + !ctx.dialect || !x.dialect?.length || x.dialect.includes(ctx.dialect), + ), }; let out = diff --git a/packages/builder/src/query/query.ts b/packages/builder/src/query/query.ts index f83e029d..77d7d461 100644 --- a/packages/builder/src/query/query.ts +++ b/packages/builder/src/query/query.ts @@ -7,9 +7,20 @@ import { GenerateOptions, GenerateResult } from '../types.js'; export declare interface Query extends EventEmitter {} +export interface QueryCommentArgs { + comment: string; + dialect?: string[]; +} + +export interface QueryIndexHintArgs { + index: string[]; + dialect?: string[]; +} + export abstract class Query extends Serializable { - protected _comment?: string; - protected _commentDialect?: string[]; + protected _comment: QueryCommentArgs[] = []; + protected _indexHint: QueryIndexHintArgs[] = []; + protected _noIndexHint: QueryIndexHintArgs[] = []; protected _params?: Record; constructor() { @@ -28,14 +39,19 @@ export abstract class Query extends Serializable { /* generate output */ let sql = this._serialize(ctx); sql = flattenText(sql, { noWrap: !ctx.prettyPrint }); - if ( - this._comment && - (!ctx.dialect || - !this._commentDialect || - this._commentDialect.includes(ctx.dialect)) - ) { - const lines = '-- ' + this._comment.split('\n').join('\n-- ') + '\n'; - sql = lines + sql; + if (this._comment.length) { + const comment = this._comment + .filter( + x => + !ctx.dialect || + !x.dialect?.length || + x.dialect.includes(ctx.dialect), + ) + .map(x => x.comment.replace(/\n/g, '\n ')) + .join('\n'); + if (comment) { + sql = `/*${comment}*/\n${sql}`; + } } return { sql, @@ -52,9 +68,53 @@ export abstract class Query extends Serializable { return this; } - comment(text: string, dialect?: string[]): this { - this._comment = text; - this._commentDialect = dialect; + comment(args: QueryCommentArgs): this; + comment(text: string, dialect?: string[]): this; + comment(arg0: any, dialect?: string[]): this { + if (typeof arg0 === 'string') + this._comment.push({ + comment: arg0, + dialect: Array.isArray(dialect) ? dialect : undefined, + }); + else if (typeof arg0 === 'object' && typeof arg0.comment === 'string') + this._comment.push({ + comment: arg0.comment, + dialect: Array.isArray(arg0.dialect) ? arg0.dialect : undefined, + }); + return this; + } + + indexHint(args: QueryIndexHintArgs): this; + indexHint(index: string | string[], dialect?: string[]): this; + indexHint(arg0: any, dialect?: string[]): this { + if (typeof arg0 === 'object' && !Array.isArray(arg0)) + this._indexHint.push({ + index: Array.isArray(arg0.index) ? arg0.index : [arg0.index], + dialect: Array.isArray(arg0.dialect) ? arg0.dialect : undefined, + }); + else { + this._indexHint.push({ + index: Array.isArray(arg0) ? arg0 : [arg0], + dialect: Array.isArray(dialect) ? dialect : undefined, + }); + } + return this; + } + + noIndexHint(args: QueryIndexHintArgs): this; + noIndexHint(index: string | string[], dialect?: string[]): this; + noIndexHint(arg0: any, dialect?: string[]): this { + if (typeof arg0 === 'object' && !Array.isArray(arg0)) + this._noIndexHint.push({ + index: Array.isArray(arg0.index) ? arg0.index : [arg0.index], + dialect: Array.isArray(arg0.dialect) ? arg0.dialect : undefined, + }); + else { + this._noIndexHint.push({ + index: Array.isArray(arg0) ? arg0 : [arg0], + dialect: Array.isArray(dialect) ? dialect : undefined, + }); + } return this; } } diff --git a/packages/builder/src/query/select-query.ts b/packages/builder/src/query/select-query.ts index e586bd99..6be78211 100644 --- a/packages/builder/src/query/select-query.ts +++ b/packages/builder/src/query/select-query.ts @@ -166,6 +166,14 @@ export class SelectQuery extends Query { orderBy: this.__serializeOrderColumns(ctx), limit: this._limit, offset: this._offset, + indexHint: this._indexHint.filter( + x => + !ctx.dialect || !x.dialect?.length || x.dialect.includes(ctx.dialect), + ), + noIndexHint: this._noIndexHint.filter( + x => + !ctx.dialect || !x.dialect?.length || x.dialect.includes(ctx.dialect), + ), }; return ctx.serialize(this._type, o, () => { diff --git a/packages/builder/src/query/update-query.ts b/packages/builder/src/query/update-query.ts index 12a6594f..02362285 100644 --- a/packages/builder/src/query/update-query.ts +++ b/packages/builder/src/query/update-query.ts @@ -58,6 +58,14 @@ export class UpdateQuery extends ReturningQuery { values: this.__serializeValues(ctx), where: this.__serializeWhere(ctx), returning: this.__serializeReturning(ctx), + indexHint: this._indexHint.filter( + x => + !ctx.dialect || !x.dialect?.length || x.dialect.includes(ctx.dialect), + ), + noIndexHint: this._noIndexHint.filter( + x => + !ctx.dialect || !x.dialect?.length || x.dialect.includes(ctx.dialect), + ), }; let out = 'update ' + o.table + ' set \n\t' + o.values + '\b'; if (o.where) out += '\n' + o.where; diff --git a/packages/builder/test/query-objects/select-query.spec.ts b/packages/builder/test/query-objects/select-query.spec.ts index 386245b3..30de6916 100644 --- a/packages/builder/test/query-objects/select-query.spec.ts +++ b/packages/builder/test/query-objects/select-query.spec.ts @@ -239,14 +239,14 @@ describe('builder:serialize "SelectQuery"', () => { it('should serialize comment', () => { const query = Select().comment('This is a comment'); const result = query.generate(options); - expect(result.sql).toStrictEqual('-- This is a comment\nselect *'); + expect(result.sql).toStrictEqual('/*This is a comment*/\nselect *'); }); it('should serialize multiline comment', () => { const query = Select().comment('This is a comment\nline 2\nline 3'); const result = query.generate(options); expect(result.sql).toStrictEqual( - '-- This is a comment\n-- line 2\n-- line 3\nselect *', + '/*This is a comment\n line 2\n line 3*/\nselect *', ); }); }); diff --git a/packages/connect/src/orm/commands/count.command.ts b/packages/connect/src/orm/commands/count.command.ts index 8f39aa94..300c8c34 100644 --- a/packages/connect/src/orm/commands/count.command.ts +++ b/packages/connect/src/orm/commands/count.command.ts @@ -23,7 +23,11 @@ export class CountCommand { await prepareFilter(entity, filter, where, 'T'); } const query = Select(Count()).from(entity.tableName + ' T'); - if (args.comment) query.comment(args.comment, args.commentDialect); + if (args.comment) { + if (Array.isArray(args.comment)) + args.comment.forEach(c => query.comment(c)); + else query.comment(args.comment as any); + } if (where) query.where(where); // Execute query const resp = await connection.execute(query, { diff --git a/packages/connect/src/orm/commands/create.command.ts b/packages/connect/src/orm/commands/create.command.ts index a4bf7c59..c21ce0e8 100644 --- a/packages/connect/src/orm/commands/create.command.ts +++ b/packages/connect/src/orm/commands/create.command.ts @@ -51,7 +51,11 @@ export class CreateCommand { throw new Error('No field given to create new entity instance'); const query = Insert(tableName, ctx.queryValues); - if (args.comment) query.comment(args.comment, args.commentDialect); + if (args.comment) { + if (Array.isArray(args.comment)) + args.comment.forEach(c => query.comment(c)); + else query.comment(args.comment as any); + } if (args.returning) { const primaryIndexColumns = EntityMetadata.getPrimaryIndexColumns(entity); if (primaryIndexColumns.length) diff --git a/packages/connect/src/orm/commands/delete.command.ts b/packages/connect/src/orm/commands/delete.command.ts index 231b2899..661948c5 100644 --- a/packages/connect/src/orm/commands/delete.command.ts +++ b/packages/connect/src/orm/commands/delete.command.ts @@ -24,7 +24,11 @@ export class DeleteCommand { await prepareFilter(entity, filter, where); } const query = Delete(entity.tableName + ' T'); - if (args.comment) query.comment(args.comment, args.commentDialect); + if (args.comment) { + if (Array.isArray(args.comment)) + args.comment.forEach(c => query.comment(c)); + else query.comment(args.comment as any); + } if (where) query.where(...where._items); // Execute query const resp = await connection.execute(query, { diff --git a/packages/connect/src/orm/commands/find.command.ts b/packages/connect/src/orm/commands/find.command.ts index 91fcb428..ee1761c6 100644 --- a/packages/connect/src/orm/commands/find.command.ts +++ b/packages/connect/src/orm/commands/find.command.ts @@ -337,7 +337,8 @@ export class FindCommand { | 'onTransformRow' | 'prettyPrint' | 'comment' - | 'commentDialect' + | 'indexHint' + | 'noIndexHint' >, ): Promise { // Generate select query @@ -350,7 +351,23 @@ export class FindCommand { this.mainEntity.tableName + ' as ' + this.mainAlias, ); - if (args.comment) query.comment(args.comment, args.commentDialect); + if (args.comment) { + if (Array.isArray(args.comment)) + args.comment.forEach(c => query.comment(c)); + else query.comment(args.comment as any); + } + + if (args.indexHint) { + if (Array.isArray(args.indexHint)) + args.indexHint.forEach(c => query.indexHint(c)); + else query.indexHint(args.indexHint as any); + } + + if (args.noIndexHint) { + if (Array.isArray(args.noIndexHint)) + args.noIndexHint.forEach(c => query.noIndexHint(c)); + else query.noIndexHint(args.noIndexHint as any); + } if (args.distinct) query.distinct(); diff --git a/packages/connect/src/orm/repository.class.ts b/packages/connect/src/orm/repository.class.ts index a72dbfc4..6b920bf2 100644 --- a/packages/connect/src/orm/repository.class.ts +++ b/packages/connect/src/orm/repository.class.ts @@ -32,8 +32,39 @@ export namespace Repository { export interface CommandOptions { connection?: SqbConnection; prettyPrint?: boolean; - comment?: string; - commentDialect?: string[]; + comment?: + | string + | string[] + | { + comment: string; + dialect?: string[]; + } + | { + comment: string; + dialect?: string[]; + }[]; + indexHint?: + | string + | string[] + | { + index: string[]; + dialect?: string[]; + } + | { + index: string[]; + dialect?: string[]; + }[]; + noIndexHint?: + | string + | string[] + | { + index: string[]; + dialect?: string[]; + } + | { + index: string[]; + dialect?: string[]; + }[]; } export interface CreateOptions extends CommandOptions, Projection {} diff --git a/packages/oracle-dialect/src/oracle-serializer.ts b/packages/oracle-dialect/src/oracle-serializer.ts index 0f3685c5..d65f30dc 100644 --- a/packages/oracle-dialect/src/oracle-serializer.ts +++ b/packages/oracle-dialect/src/oracle-serializer.ts @@ -55,6 +55,22 @@ export class OracleSerializer implements SerializerExtension { o: any, defFn: DefaultSerializeFunction, ) { + const indexHint = o.indexHint + ?.map(x => + x.index?.length ? `/*+ INDEX(t ${x.index.join(',')})*/` : undefined, + ) + .filter(x => x) + .join('\n'); + if (indexHint) o.columns = indexHint + '\n\t' + o.columns; + + const noIndexHint = o.noIndexHint + ?.map(x => + x.index?.length ? `/*+ NO_INDEX(t ${x.index.join(',')})*/` : undefined, + ) + .filter(x => x) + .join('\n'); + if (noIndexHint) o.columns = noIndexHint + '\n\t' + o.columns; + let out = defFn(ctx, o); const limit = o.limit || 0; const offset = Math.max(o.offset || 0, 0); diff --git a/packages/oracle-dialect/test/oracle-serializer.spec.ts b/packages/oracle-dialect/test/oracle-serializer.spec.ts index 525c4293..9fd18b66 100644 --- a/packages/oracle-dialect/test/oracle-serializer.spec.ts +++ b/packages/oracle-dialect/test/oracle-serializer.spec.ts @@ -116,6 +116,24 @@ describe('oracle-dialect:OracleSerializer', () => { ); expect(result.params).toStrictEqual({}); }); + + it('should serialize index hint', () => { + const query = Select().from('table1').indexHint('IDX_ID'); + const result = query.generate({ dialect: 'oracle' }); + + expect(result.sql).toStrictEqual( + 'select /*+ INDEX(t IDX_ID)*/ * from table1', + ); + }); + + it('should serialize no-index hint', () => { + const query = Select().from('table1').noIndexHint('IDX_ID'); + const result = query.generate({ dialect: 'oracle' }); + + expect(result.sql).toStrictEqual( + 'select /*+ NO_INDEX(t IDX_ID)*/ * from table1', + ); + }); }); describe('oracle-dialect:Oracle version < 12', () => { From 6810f0f903e46833e92e44e61961d563618e81c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20Hano=C4=9Flu?= Date: Fri, 13 Mar 2026 13:14:57 +0300 Subject: [PATCH 2/3] 4.25.0 --- packages/builder/package.json | 2 +- packages/connect/package.json | 4 ++-- packages/mssql-dialect/package.json | 4 ++-- packages/oracle-dialect/package.json | 4 ++-- packages/postgres-dialect/package.json | 4 ++-- packages/sqlite-dialect/package.json | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/builder/package.json b/packages/builder/package.json index e6ea9862..e5949341 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/builder", "description": "Extensible multi-dialect SQL query builder written with TypeScript", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "private": false, "license": "Apache-2.0", diff --git a/packages/connect/package.json b/packages/connect/package.json index 0bd61f8a..4df48c34 100644 --- a/packages/connect/package.json +++ b/packages/connect/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/connect", "description": "Multi-dialect database connection framework written with TypeScript", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -44,7 +44,7 @@ "postgrejs": "^2.22.9" }, "peerDependencies": { - "@sqb/builder": "^4.24.1", + "@sqb/builder": "^4.25.0", "reflect-metadata": "^0.2.2" }, "type": "module", diff --git a/packages/mssql-dialect/package.json b/packages/mssql-dialect/package.json index 312f004f..185f1915 100644 --- a/packages/mssql-dialect/package.json +++ b/packages/mssql-dialect/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/mssql-dialect", "description": "SQB serialization extension for MS-SQL database", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -24,7 +24,7 @@ "tslib": "^2.8.1" }, "peerDependencies": { - "@sqb/builder": "^4.24.1" + "@sqb/builder": "^4.25.0" }, "devDependencies": { "expect": "^30.3.0" diff --git a/packages/oracle-dialect/package.json b/packages/oracle-dialect/package.json index eb775832..abd8c2bd 100644 --- a/packages/oracle-dialect/package.json +++ b/packages/oracle-dialect/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/oracle-dialect", "description": "SQB serialization extension for Oracle database", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -25,7 +25,7 @@ "tslib": "^2.8.1" }, "peerDependencies": { - "@sqb/builder": "^4.24.1" + "@sqb/builder": "^4.25.0" }, "devDependencies": { "expect": "^30.3.0" diff --git a/packages/postgres-dialect/package.json b/packages/postgres-dialect/package.json index 86b5158f..a6c90dc0 100644 --- a/packages/postgres-dialect/package.json +++ b/packages/postgres-dialect/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/postgres-dialect", "description": "SQB serialization extension for PostgreSQL database", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -24,7 +24,7 @@ "tslib": "^2.8.1" }, "peerDependencies": { - "@sqb/builder": "^4.24.1" + "@sqb/builder": "^4.25.0" }, "devDependencies": { "expect": "^30.3.0" diff --git a/packages/sqlite-dialect/package.json b/packages/sqlite-dialect/package.json index d8429ff9..cf8ba892 100644 --- a/packages/sqlite-dialect/package.json +++ b/packages/sqlite-dialect/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/sqlite-dialect", "description": "SQB serialization extension for SQLite database", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -24,7 +24,7 @@ "tslib": "^2.8.1" }, "peerDependencies": { - "@sqb/builder": "^4.24.1" + "@sqb/builder": "^4.25.0" }, "devDependencies": { "expect": "^30.3.0" From 98ad1e92be156dce87e323605cfe30360d1df92e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20Hano=C4=9Flu?= Date: Fri, 13 Mar 2026 13:14:57 +0300 Subject: [PATCH 3/3] 4.25.0 --- packages/migrator/package.json | 8 ++++---- packages/nestjs/package.json | 6 +++--- packages/oracle/package.json | 8 ++++---- packages/postgres/package.json | 8 ++++---- packages/sqljs/package.json | 8 ++++---- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/migrator/package.json b/packages/migrator/package.json index 05c34d18..de1a68ab 100644 --- a/packages/migrator/package.json +++ b/packages/migrator/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/migrator", "description": "Database migrator for SQB", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -28,9 +28,9 @@ "tslib": "^2.8.1" }, "peerDependencies": { - "@sqb/builder": "^4.24.1", - "@sqb/connect": "^4.24.1", - "@sqb/postgres": "^4.24.1" + "@sqb/builder": "^4.25.0", + "@sqb/connect": "^4.25.0", + "@sqb/postgres": "^4.25.0" }, "devDependencies": { "expect": "^30.3.0", diff --git a/packages/nestjs/package.json b/packages/nestjs/package.json index dd8ddd71..e2dbc5be 100644 --- a/packages/nestjs/package.json +++ b/packages/nestjs/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/nestjs", "description": "Nestjs module for data connection using SQB", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -39,8 +39,8 @@ "peerDependencies": { "@nestjs/common": ">=7.4.0", "@nestjs/core": ">=7.4.0", - "@sqb/builder": "^4.24.1", - "@sqb/connect": "^4.24.1", + "@sqb/builder": "^4.25.0", + "@sqb/connect": "^4.25.0", "reflect-metadata": "^0.2.2", "rxjs": ">=6.6.0" }, diff --git a/packages/oracle/package.json b/packages/oracle/package.json index 587c2b96..116b348d 100644 --- a/packages/oracle/package.json +++ b/packages/oracle/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/oracle", "description": "SQB serialization extension for Oracle database", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -24,9 +24,9 @@ "tslib": "^2.8.1" }, "peerDependencies": { - "@sqb/builder": "^4.24.1", - "@sqb/connect": "^4.24.1", - "@sqb/oracle-dialect": "^4.24.1", + "@sqb/builder": "^4.25.0", + "@sqb/connect": "^4.25.0", + "@sqb/oracle-dialect": "^4.25.0", "oracledb": ">= 6.4.0" }, "devDependencies": { diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 202bc4f2..ebf60b4b 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/postgres", "description": "SQB serialization extension for PostgreSQL database", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -29,9 +29,9 @@ "postgrejs": "^2.22.2" }, "peerDependencies": { - "@sqb/builder": "^4.24.1", - "@sqb/connect": "^4.24.1", - "@sqb/postgres-dialect": "^4.24.1", + "@sqb/builder": "^4.25.0", + "@sqb/connect": "^4.25.0", + "@sqb/postgres-dialect": "^4.25.0", "postgrejs": ">=2.15.1 <3.0.0" }, "type": "module", diff --git a/packages/sqljs/package.json b/packages/sqljs/package.json index 2aaeebb1..e5bfbae5 100644 --- a/packages/sqljs/package.json +++ b/packages/sqljs/package.json @@ -1,7 +1,7 @@ { "name": "@sqb/sqljs", "description": "SQB serialization extension for sql.js driver", - "version": "4.24.1", + "version": "4.25.0", "author": "Panates", "license": "Apache-2.0", "scripts": { @@ -30,9 +30,9 @@ "sql.js": "^1.14.1" }, "peerDependencies": { - "@sqb/builder": "^4.24.1", - "@sqb/connect": "^4.24.1", - "@sqb/sqlite-dialect": "^4.24.1", + "@sqb/builder": "^4.25.0", + "@sqb/connect": "^4.25.0", + "@sqb/sqlite-dialect": "^4.25.0", "sql.js": "^1.14.1" }, "type": "module",