import { knex, Knex } from '../types'; import { expectType } from 'tsd'; const clientConfig = { client: 'sqlite3', connection: { filename: './mydb.sqlite', }, }; const knexInstance = knex(clientConfig); const knex2 = knex({ ...clientConfig, log: { debug(msg: string) { // }, }, pool: { log: (msg: string, level: string) => { // }, }, }); knexInstance.initialize(); knexInstance.initialize({}); interface User { id: number; age: number; name: string; active: boolean; departmentId: number; } interface Department { id: number; departmentName: string; } interface Article { id: number; subject: string; body?: string; authorId?: string; } interface Ticket { name: string; from: string; to: string; at: Date; } const main = async () => { const userUpdateReturnCols = ['id', 'age'] as const; { // $ExpectType Pick[] const r = await knexInstance('users') .where('id', 10) .update({ active: true }, userUpdateReturnCols); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance('users_inferred') .where('id', 10) .update({ active: true }, userUpdateReturnCols); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance('users_composite') .where('id', 10) .update({ update: 'update' }, userUpdateReturnCols); expectType>>(r); } // $ExpectError in original code // await knexInstance('users_composite').where('id', 10).update({ id: 11 }, userUpdateReturnCols); // await knexInstance('users_composite').where('id', 10).update({}, userUpdateReturnCols); { // $ExpectType Pick[] const r = await knexInstance .where('id', 10) .update({ active: true }, ['id', 'age']) .into('users'); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance .where('id', 10) .update({ active: true }, ['id', 'age']) .into('users_inferred'); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance .where('id', 10) .update({ update: 'update' }, ['id', 'age']) .into('users_composite'); expectType>>(r); } // # Insert onConflict { // Just ensures no type errors occur. You could do additional validations if you want. const r = await knexInstance .table('users') .insert({ id: 10, active: true }) .onConflict('id') .merge({ active: true }) .returning('*'); // $ExpectType User[] expectType(r); } // # Regression test (issue #4101), ensuring .debug() can be called { const r = await knexInstance .table('users') .insert({ id: 10, active: true }) .onConflict('id') .merge({ active: true }) .debug(true); // No specific return type check here, but confirm no error } // # Deletion { // $ExpectType number const r = await knexInstance('users').where('id', 10).delete(); expectType(r); } { // $ExpectType number const r = await knexInstance('users_inferred').where('id', 10).delete(); expectType(r); } { // $ExpectType number const r = await knexInstance('users_composite').where('id', 10).delete(); expectType(r); } { // $ExpectType number const r = await knexInstance('users').where('id', 10).del(); expectType(r); } { // $ExpectType number const r = await knexInstance('users_inferred').where('id', 10).del(); expectType(r); } { // $ExpectType number const r = await knexInstance('users_composite').where('id', 10).del(); expectType(r); } { // $ExpectType Pick[] const r = await knexInstance('users').where('id', 10).delete('id'); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance('users_inferred').where('id', 10).delete('id'); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance('users_composite') .where('id', 10) .delete('id'); expectType>>(r); } { // $ExpectType any[] const r = await knexInstance('users').where('id', 10).del().returning('*'); expectType(r); } { // $ExpectType any[] const r = await knexInstance('users') .where('id', 10) .delete() .returning('*'); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users') .where('id', 10) .del() .returning('*'); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users_inferred') .where('id', 10) .del() .returning('*'); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users_composite') .where('id', 10) .del() .returning('*'); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users') .where('id', 10) .delete() .returning('*'); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users_inferred') .where('id', 10) .delete() .returning('*'); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users_composite') .where('id', 10) .delete() .returning('*'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .where('id', 10) .del() .returning('*') .from('users'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .where('id', 10) .del() .returning('*') .from('users_inferred'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .where('id', 10) .del() .returning('*') .from('users_composite'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .where('id', 10) .delete() .returning('*') .from('users'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .where('id', 10) .delete() .returning('*') .from('users_inferred'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .where('id', 10) .delete() .returning('*') .from('users_composite'); expectType(r); } { // $ExpectType Pick[] const r = await knexInstance .where('id', 10) .delete('id') .from('users'); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance .where('id', 10) .delete('id') .from('users_inferred'); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance .where('id', 10) .delete('id') .from('users_composite'); expectType>>(r); } { // $ExpectType void const r = await knexInstance('users').truncate(); expectType(r); } { // $ExpectType void const r = await knexInstance('users_inferred').truncate(); expectType(r); } { // $ExpectType void const r = await knexInstance('users_composite').truncate(); expectType(r); } { // $ExpectType void const r = await knexInstance('users').truncate(); expectType(r); } // # Column Info: { // $ExpectType ColumnInfo const c = await knexInstance('users').columnInfo('id'); // No need to further check the type in test code, we trust the $ExpectType from above } { // $ExpectType ColumnInfo const c = await knexInstance('users').columnInfo('id'); } { // $ExpectType ColumnInfo const c = await knexInstance('users_inferred').columnInfo('id'); } { // $ExpectType ColumnInfo const c = await knexInstance('users_composite').columnInfo('id'); } // # Modify: function withUserName(queryBuilder: Knex.QueryBuilder, foreignKey: string) { queryBuilder .leftJoin('users', foreignKey, 'users.id') .select('users.user_name'); } { // $ExpectType QueryBuilder const qb = knexInstance .table('articles') .select('title', 'body') .modify(withUserName, 'articles_user.id'); expectType>(qb); } { const withAge = (queryBuilder: Knex.QueryBuilder) => queryBuilder.select('age'); // $ExpectType Pick const r = await knexInstance .table('users') .select('id') .modify>(withAge); expectType>(r); } // With: { // $ExpectType any[] const r = await knexInstance .with( 'with_alias', knexInstance.raw('select * from "users" where "id" = ?', 1) ) .select('*') .from('with_alias'); expectType(r); } { // $ExpectType any[] const r = await knexInstance .with( 'with_alias', knexInstance.raw('select * from "users" where "id" = ?', 1) ) .select('*') .from('with_alias'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .with( 'with_alias', knexInstance.raw('select * from "users" where "id" = ?', 1) ) .select('*') .from('with_alias'); expectType(r); } { // $ExpectType any[] const r = await knexInstance .with('with_alias', (qb) => { qb.select('*').from('books').where('author', 'Test'); }) .select('*') .from('with_alias'); expectType(r); } { // $ExpectType any[] const r = await knexInstance .withRecursive('ancestors', (qb) => { qb.select('*').from('users').where('users.id', 1); }) .select('*') .from('ancestors'); expectType(r); } { // $ExpectType any[] const r = await knexInstance .withRecursive('ancestors', (qb) => { qb.select('*').from('users').where('users.id', 1); }) .select('*') .from('ancestors'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .withRecursive('ancestors', (qb) => { qb.select('*').from('users').where('users.id', 1); }) .select('*') .from('ancestors'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .withRecursive('ancestors', (qb: Knex.QueryBuilder) => { qb.select('*').from('users').where('users.id', 1); }) .select('*') .from('ancestors'); expectType(r); } { // $ExpectType Pick[] const r = await knexInstance .withRecursive('ancestors', (qb) => { qb.select('*').from('users').where('users.id', 1); }) .select('id', 'name') .from('ancestors'); expectType>>(r); } { // $ExpectType any[] const r = await knexInstance.withSchema('public').select('*').from('users'); expectType(r); } { // $ExpectType User[] const r = await knexInstance .withSchema('public') .select('*') .from('users'); expectType(r); } // Seed: { // $ExpectType string const res = await knexInstance.seed.make('test'); expectType(res); } { // $ExpectType string const res = await knexInstance.seed.make('test', { extension: 'ts', directory: 'lib/seeds', }); expectType(res); } { // $ExpectType [string[]] const res = await knexInstance.seed.run(); expectType<[string[]]>(res); } { // $ExpectType [string[]] const res = await knexInstance.seed.run({ extension: 'ts', directory: 'lib/seeds', }); expectType<[string[]]>(res); } { // $ExpectType any[] const r = await knexInstance('users', { only: true }); expectType(r); } { // $ExpectType any[] const r = await knexInstance.select('*').from('users', { only: true }); expectType(r); } { // $ExpectType any const ctx = knexInstance.queryBuilder().queryContext(); expectType(ctx); } // .raw() support { // $ExpectType User[] const r = await knexInstance('users').where({ id: knexInstance.raw('a'), }); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users').where( 'id', knexInstance.raw('a') ); expectType(r); } { // $ExpectType Ticket[] const r = await knexInstance('users').where({ at: knexInstance.fn.now(), }); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users').where( 'id', knexInstance.raw('string') ); expectType(r); } { // $ExpectType number[] const r = await knexInstance('users').insert({ id: knexInstance.raw('a'), }); expectType(r); } { // $ExpectType User[] const r = await knexInstance('users').insert( [ { id: knexInstance.raw('a'), }, ], '*' ); expectType(r); } { // $ExpectType Pick[] const r = await knexInstance('users').update( { id: knexInstance.raw('a'), }, 'id' ); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance('users').update<'active', 'name'>( 'active', knexInstance.raw('true'), 'name' ); expectType>>(r); } { // $ExpectType Pick[] const r = await knexInstance('users').update<'active', 'name'>( 'active', knexInstance.raw('true'), ['name'] ); expectType>>(r); } }; class ExcelClient extends knex.Client {}