import type { IsolationLevel } from '../driver/driver.js'; import type { Command, ConnectionBuilder, ControlledTransaction, Kysely, Transaction } from '../kysely.js'; import type { ReleaseSavepoint, RollbackToSavepoint } from '../parser/savepoint-parser.js'; import type { KyselyPlugin } from '../plugin/kysely-plugin.js'; import type { SelectQueryBuilder } from '../query-builder/select-query-builder.js'; import type { AbortableOperationOptions, AbortableQueryOptions } from '../util/abort.js'; import type { KyselyTypeError } from '../util/type-error.js'; import type { DrainOuterGeneric } from '../util/type-utils.js'; import type { ReadonlyCompiledQuery } from './readonly-compiled-query.js'; import type { ReadonlyQueryResult } from './readonly-database-connection.js'; import type { ReadonlyAccessMode } from './readonly-driver.js'; import type { ReadonlyQueryCreator } from './readonly-query-creator.js'; /** * A helper type that allows you to expose a type-level read-only {@link Kysely} version * to your service's consumers. * * ### Examples * * ```ts * import * as Sqlite from 'better-sqlite3' * import { type Generated, Kysely, SqliteDialect } from 'kysely' * import type { ReadonlyKysely } from 'kysely/readonly' * * interface Database { * person: { * id: Generated * first_name: string * last_name: string | null * } * } * * function getDB(): ReadonlyKysely { * return new Kysely({ * dialect: new SqliteDialect({ * database: new Sqlite(':memory:'), * }) * }) as never * } * * const db = getDB() * * db.selectFrom('person') // works! * db.deleteFrom('person') // typescript compiler error! * ``` */ export interface ReadonlyKysely extends ReadonlyQueryCreator, Pick, 'case' | 'destroy' | 'dynamic' | 'fn' | 'introspection' | 'isTransaction'> { /** * Similar to {@link Kysely.connection} but read-only. */ connection(): ReadonlyConnectionBuilder; /** * Similar to {@link Kysely.executeQuery} but read-only. */ executeQuery(query: ReadonlyCompiledQuery | SelectQueryBuilder, options?: AbortableQueryOptions): Promise>; /** * @deprecated not allowed with a read-only Kysely instance. */ executeQuery(...args: any[]): KyselyTypeError<'not allowed with a read-only Kysely instance.'>; /** * @deprecated not allowed with a read-only Kysely instance. */ getExecutor(...args: any[]): KyselyTypeError<'not allowed with a read-only Kysely instance.'>; /** * @deprecated not allowed with a read-only Kysely instance. */ get schema(): KyselyTypeError<'not allowed with a read-only Kysely instance.'>; /** * Similar to {@link Kysely.transaction} but read-only. */ transaction(): ReadonlyTransactionBuilder; /** * Similar to {@link Kysely.startTransaction} but read-only. */ startTransaction(): ReadonlyControlledTransactionBuilder; /** * Similar to {@link Kysely.withoutPlugins} but read-only. */ withoutPlugins(): ReadonlyKysely; /** * Similar to {@link Kysely.withPlugin} but read-only. */ withPlugin(plugin: KyselyPlugin): ReadonlyKysely; /** * Similar to {@link Kysely.withSchema} but read-only. */ withSchema(schema: string): ReadonlyKysely; /** * Similar to {@link Kysely.withTables} but read-only. * * @deprecated use {@link $extendTables} instead. */ withTables>>(): ReadonlyKysely>; /** * Similar to {@link Kysely.$extendTables} but read-only. */ $extendTables>>(): ReadonlyKysely>; /** * Similar to {@link Kysely.$omitTables} but read-only. */ $omitTables(): ReadonlyKysely : DB>; /** * Similar to {@link Kysely.$pickTables} but read-only. */ $pickTables(): ReadonlyKysely : DB>; } /** * Similar to {@link ConnectionBuilder} but read-only. */ export interface ReadonlyConnectionBuilder extends Omit, 'execute'> { /** * Similar to {@link ConnectionBuilder.execute} but read-only. */ execute(callback: (db: ReadonlyKysely) => Promise, options?: AbortableOperationOptions): Promise; } /** * Similar to {@link TransactionBuilder} but read-only. */ export interface ReadonlyTransactionBuilder { /** * Similar to {@link TransactionBuilder.execute} but read-only. */ execute(callback: (trx: ReadonlyTransaction) => Promise): Promise; /** * Similar to {@link TransactionBuilder.setAccessMode} but read-only. */ setAccessMode(accessMode: ReadonlyAccessMode): ReadonlyTransactionBuilder; /** * Similar to {@link TransactionBuilder.setIsolationLevel} but read-only. */ setIsolationLevel(isolationLevel: IsolationLevel): ReadonlyTransactionBuilder; } /** * Similar to {@link Transaction} but read-only. */ export interface ReadonlyTransaction extends Pick, 'case' | 'deleteFrom' | 'dynamic' | 'executeQuery' | 'fn' | 'getExecutor' | 'insertInto' | 'introspection' | 'mergeInto' | 'replaceInto' | 'schema' | 'selectFrom' | 'selectNoFrom' | 'updateTable' | 'with' | 'withRecursive'>, Pick, 'connection' | 'destroy' | 'isTransaction' | 'startTransaction' | 'transaction'> { /** * Similar to {@link Transaction.withoutPlugins} but read-only. */ withoutPlugins(): ReadonlyTransaction; /** * Similar to {@link Transaction.withPlugin} but read-only. */ withPlugin(plugin: KyselyPlugin): ReadonlyTransaction; /** * Similar to {@link Transaction.withSchema} but read-only. */ withSchema(schema: string): ReadonlyTransaction; /** * Similar to {@link Transaction.withTables} but read-only. * * @deprecated use {@link $extendTables} instead. */ withTables>>(): ReadonlyTransaction>; /** * Similar to {@link Transaction.$extendTables} but read-only. */ $extendTables>>(): ReadonlyTransaction>; /** * Similar to {@link Transaction.$omitTables} but read-only. */ $omitTables(): ReadonlyTransaction : DB>; /** * Similar to {@link Transaction.$pickTables} but read-only. */ $pickTables(): ReadonlyTransaction : DB>; } /** * Similar to {@link ControlledTransactionBuilder} but read-only. */ export interface ReadonlyControlledTransactionBuilder { /** * Similar to {@link ControlledTransactionBuilder.execute} but read-only. */ execute(): Promise>; /** * Similar to {@link ControlledTransactionBuilder.setAccessMode} but read-only. */ setAccessMode(accessMode: ReadonlyAccessMode): ReadonlyControlledTransactionBuilder; /** * Similar to {@link ControlledTransactionBuilder.setIsolationLevel} but read-only. */ setIsolationLevel(isolationLevel: IsolationLevel): ReadonlyControlledTransactionBuilder; } /** * Similar to {@link ControlledTransaction} but read-only. */ export interface ReadonlyControlledTransaction extends ReadonlyTransaction, Pick, 'commit' | 'isCommitted' | 'isRolledBack' | 'rollback'> { /** * Similar to {@link ControlledTransaction.releaseSavepoint} but read-only. */ releaseSavepoint(savepointName: SN): ReleaseSavepoint extends string[] ? Command>> : never; /** * Similar to {@link ControlledTransaction.rollbackToSavepoint} but read-only. */ rollbackToSavepoint(savepointName: SN): RollbackToSavepoint extends string[] ? Command>> : never; /** * Similar to {@link ControlledTransaction.savepoint} but read-only. */ savepoint(savepointName: SN extends S ? never : SN): Command>; /** * Similar to {@link ControlledTransaction.withoutPlugins} but read-only. */ withoutPlugins(): ReadonlyControlledTransaction; /** * Similar to {@link ControlledTransaction.withPlugin} but read-only. */ withPlugin(plugin: KyselyPlugin): ReadonlyControlledTransaction; /** * Similar to {@link ControlledTransaction.withSchema} but read-only. */ withSchema(schema: string): ReadonlyControlledTransaction; /** * Similar to {@link ControlledTransaction.withTables} but read-only. * * @deprecated use {@link $extendTables} instead. */ withTables>>(): ReadonlyControlledTransaction, S>; /** * Similar to {@link ControlledTransaction.$extendTables} but read-only. */ $extendTables>>(): ReadonlyControlledTransaction, S>; /** * Similar to {@link ControlledTransaction.$omitTables} but read-only. */ $omitTables(): ReadonlyControlledTransaction : DB, S>; /** * Similar to {@link ControlledTransaction.$pickTables} but read-only. */ $pickTables(): ReadonlyControlledTransaction : DB, S>; }