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 r1 = await knexInstance('users_composite').innerJoin( 'departments_composite', 'users_composite.departmentId', 'departments_composite.id' ); expectType>( r1.map((joined) => ({ username: joined.name, })) ); const r2 = await knexInstance('users') .innerJoin( 'departments', 'users.departmentId', 'departments.id' ) .select('*'); expectType>( r2.map((joined) => ({ username: joined.name, })) ); const r3 = await knexInstance('users_inferred') .innerJoin( 'departments_inferred', 'users_inferred.departmentId', 'departments_inferred.id' ) .select('*'); expectType>( r3.map((joined) => ({ username: joined.name, })) ); const r4 = await knexInstance('users_composite') .innerJoin( 'departments_composite', 'users_composite.departmentId', 'departments_composite.id' ) .select('*'); expectType>( r4.map((joined) => ({ username: joined.name, })) ); const r5 = await knexInstance('users') .innerJoin( 'departments', 'users.departmentId', 'departments.id' ) .select(); expectType>( r5.map((joined) => ({ username: joined.name, })) ); const r6 = await knexInstance('users_inferred') .innerJoin( 'departments_inferred', 'users_inferred.departmentId', 'departments_inferred.id' ) .select(); expectType>( r6.map((joined) => ({ username: joined.name, })) ); const r7 = await knexInstance('users_composite') .innerJoin( 'departments_composite', 'users_composite.departmentId', 'departments_composite.id' ) .select(); expectType>( r7.map((joined) => ({ username: joined.name, })) ); const r8 = await knexInstance('users') .innerJoin( 'departments', 'users.departmentId', 'departments.id' ) .select('name', 'age'); expectType>( r8.map((joined) => ({ username: joined.name, })) ); const r9 = await knexInstance('users_inferred') .innerJoin( 'departments_inferred', 'users_inferred.departmentId', 'departments_inferred.id' ) .select('name', 'age'); expectType>( r9.map((joined) => ({ username: joined.name, })) ); const r10 = await knexInstance('users_composite') .innerJoin( 'departments_composite', 'users_composite.departmentId', 'departments_composite.id' ) .select('name', 'age'); expectType>( r10.map((joined) => ({ username: joined.name, })) ); const r11 = await knexInstance('users') .innerJoin( 'departments', 'users.departmentId', 'departments.id' ) .select('users.name', 'age'); expectType>( r11.map((joined) => ({ username: joined.name, })) ); const r12 = await knexInstance('users_inferred') .innerJoin( 'departments_inferred', 'users_inferred.departmentId', 'departments_inferred.id' ) .select('users_inferred.name', 'age'); expectType>( r12.map((joined) => ({ username: joined.name, })) ); const r13 = await knexInstance('users_composite') .innerJoin( 'departments_composite', 'users_composite.departmentId', 'departments_composite.id' ) .select('users_composite.name', 'age'); expectType>( r13.map((joined) => ({ username: joined.name, })) ); const j14 = await knexInstance .select<(User & Department)[]>('users') .innerJoin('departments', 'users.departmentId', 'departments.id'); expectType>(j14); const j15 = await knexInstance('users').innerJoin( 'departments', function () { this.on('users.id', '=', 'departments.id'); } ); expectType>(j15); const j16 = await knexInstance('users_inferred').innerJoin( 'departments_inferred', function () { this.on('users_inferred.id', '=', 'departments_inferred.id'); } ); expectType>(j16); const j17 = await knexInstance('users_composite').innerJoin( 'departments_composite', function () { this.on('users_composite.id', '=', 'departments_composite.id'); } ); expectType>(j17); const j18 = await knexInstance('users') .innerJoin( 'departments', 'users.departmentId', 'departments.id' ) .select('users.id', 'departments.id'); expectType(j18); const j19 = await knexInstance .select('*') .from('users') .join('departments', function () { this.on(function () { this.on('departments.id', '=', 'users.department_id'); this.orOn('departments.owner_id', '=', 'users.id'); }); }); expectType>(j19); const j20 = await knexInstance .select('*') .from('users_inferred') .join('departments_inferred', function () { this.on(function () { this.on('departments_inferred.id', '=', 'users_inferred.department_id'); this.orOn('departments_inferred.owner_id', '=', 'users_inferred.id'); }); }); expectType>(j20); const j21 = await knexInstance .select('*') .from('users_composite') .join('departments_composite', function () { this.on(function () { this.on( 'departments_composite.id', '=', 'users_composite.department_id' ); this.orOn('departments_composite.owner_id', '=', 'users_composite.id'); }); }); expectType>(j21); // # Insertion const i1 = await knexInstance('users').insert({ id: 10 }); expectType(i1); const i2 = await knexInstance('users').insert({ id: 10 }); expectType(i2); const i3 = await knexInstance('users_inferred').insert({ id: 10 }); expectType(i3); // $ExpectError in original code -> checking that these lines would produce a type error // await knexInstance('users_composite').insert({ id: 10 }); // await knexInstance('users_composite').insert({}); const i4 = await knexInstance('users_composite').insert({ insert: 'insert' }); expectType(i4); const i5 = await knexInstance('users').insert([{ id: 10 }]); expectType(i5); const i6 = await knexInstance('users').insert([{ id: 10 }]); expectType(i6); const i7 = await knexInstance('users_inferred').insert([{ id: 10 }]); expectType(i7); // $ExpectError // await knexInstance('users_composite').insert([{ id: 10 }]); // await knexInstance('users_composite').insert([{}]); const i8 = await knexInstance('users_composite').insert([ { insert: 'insert' }, ]); expectType(i8); const qb2 = knexInstance('users'); qb2.returning(['id', 'name']); const qb2ReturnCols = ['id', 'name'] as const; qb2.returning(qb2ReturnCols); const i9 = await qb2.insert[]>({ id: 10 }); expectType>>(i9); // ## With returning const rReturn1 = await knexInstance('users') .insert({ id: 10 }) .returning('id'); expectType(rReturn1); const rReturn2 = await knexInstance('users') .insert({ id: 10 }) .returning('id'); expectType(rReturn2); const rReturn3 = await knexInstance('users') .insert({ id: 10 }) .returning('id'); expectType(rReturn3); const rReturn4 = await knexInstance('users') .insert({ id: 10 }) .returning('id'); expectType>>(rReturn4); const rReturn5 = await knexInstance('users_inferred') .insert({ id: 10 }) .returning('id'); expectType>>(rReturn5); const rReturn6 = await knexInstance('users_composite') .insert({ insert: 'insert' }) .returning('id'); expectType>>(rReturn6); // $ExpectError // await knexInstance('users_composite').insert({ id: 10 }).returning('id'); // await knexInstance('users_composite').insert({}).returning('id'); const rReturn7 = await knexInstance('users') .insert([{ id: 10 }]) .returning('id'); expectType(rReturn7); const rReturn8 = await knexInstance('users') .insert([{ id: 10 }]) .returning('id'); expectType(rReturn8); const rReturn9 = await knexInstance('users') .insert([{ id: 10 }]) .returning('id'); expectType(rReturn9); const rReturn10 = await knexInstance('users') .insert([{ id: 10 }]) .returning('id'); expectType>>(rReturn10); const rReturn11 = await knexInstance('users_inferred') .insert([{ id: 10 }]) .returning('id'); expectType>>(rReturn11); const rReturn12 = await knexInstance('users_composite') .insert([{ insert: 'insert' }]) .returning('id'); expectType>>(rReturn12); // $ExpectError // await knexInstance('users_composite').insert([{ id: 10 }]).returning('id'); // await knexInstance('users_composite').insert({}).returning('id'); const rReturn13 = await knexInstance('users') .insert({ id: 10 }) .returning(['id', 'age']); expectType>>(rReturn13); }; class ExcelClient extends knex.Client {}