import * as Knex from 'knex'; // Use: // import Knex from 'knex' // when "esModuleInterop": true declare module 'knex' { interface QueryBuilder { customSelect(value: number): QueryBuilder; } } Knex.QueryBuilder.extend('customSelect', function(value: number) { return this.select(this.client.raw(`${value} as value`)); }); const clientConfig = { client: 'sqlite3', connection: { filename: './mydb.sqlite', }, }; const knex = Knex(clientConfig); const knex2 = Knex({ ...clientConfig, log: { debug(msg: string) {} }, pool: { log: (msg: string, level: string) => {} } }); knex.initialize(); knex.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 to witness type compatibility interface ExtendsWitness { _t: T1; } // Ensure that Knex type with parameters is compatible with Knex with default parameters // // This ensures that a value of Parameterized Knex can always be passed to a function that // consumes unparameterized Knex. type _T1 = ExtendsWitness, Knex>; type _T2 = ExtendsWitness[]>, Knex>; type _T3 = ExtendsWitness[]>, Knex.Where>; type _T4 = ExtendsWitness, Knex.Where>; type _T5 = ExtendsWitness< Knex.QueryInterface>, Knex.QueryInterface >; type _T6 = ExtendsWitness, Knex.QueryBuilder>; type _T7 = ExtendsWitness< Knex.QueryBuilder, Knex.QueryBuilder >; type _T8 = ExtendsWitness, Knex.QueryBuilder>; type _T9 = ExtendsWitness, Knex.QueryBuilder>; type _T10 = ExtendsWitness, Knex.QueryBuilder>; const main = async () => { // # Select: // $ExpectType any[] await knex('users'); // $ExpectType number[] await knex('users').customSelect(42); // This test (others similar to it) may seem useless but they are needed // to test for left-to-right inference issues eg: #3260 const u1: User[] = await knex('users'); // $ExpectType User[] await knex('users'); // $ExpectType any[] await knex('users').select('id'); const u2: Partial[] = await knex('users').select('id'); // $ExpectType any[] await knex('users') .select('id') .select('age'); // $ExpectType any await knex('users') .select('id') .select('age') .first(); // $ExpectType any await knex('users').first('id'); // $ExpectType any await knex .first('*') .from('table') .where({ whatever: 'whatever' }); // $ExpectType any await knex('users').first('id', 'name'); const u3: User = await knex('users').first('id', 'name'); // $ExpectType any await knex('users').first(knex.ref('id').as('identifier')); // $ExpectType Pick | undefined await knex('users').first('id'); // $ExpectType Pick | undefined await knex('users').first('id', 'name'); // $ExpectType { identifier: number; } | undefined await knex('users').first(knex.ref('id').as('identifier')); // $ExpectType Pick | undefined await knex.first('id').from('users'); // $ExpectType Pick | undefined await knex.first('id', 'name').from('users'); // $ExpectType { identifier: number; } | undefined await knex.first(knex.ref('id').as('identifier')).from('users'); // $ExpectType Pick[] await knex('users').select('id'); // $ExpectType Pick[] await knex('users') .select('id') .select('age'); // $ExpectType Pick[] await knex('users').select('id', 'age'); // $ExpectType any await knex.raw('select * from users'); // $ExpectType User[] await knex.raw('select * from users'); // $ExpectType any await knex.raw( 'select * from users where id in ?', knex('contacts').select('name') ); // $ExpectType User[] await knex.raw( 'select * from users where id in ?', knex('contacts').select('name') ); // $ExpectType User[] await knex.raw( 'select * from users where departmentId in ?', knex('departments').select('id') ); // $ExpectType User[] await knex.raw( 'select * from users where departmentId in ? & active in ?', [ knex('departments').select('name'), [true, false] ] ); // $ExpectType User[] await knex('user').whereRaw('name = ?', 'L'); // $ExpectType User[] await knex('user').whereRaw('name = ?', 'L').clearWhere(); // $ExpectType { id: number; }[] const r3 = await knex('users').select(knex.ref('id')); // $ExpectType (Pick & { id: number; })[] const r4 = await knex('users').select(knex.ref('id'), 'name'); type _TR4 = ExtendsWitness>; // $ExpectType (Pick & { identifier: number; })[] const r5 = await knex('users').select(knex.ref('id').as('identifier'), 'name'); type _TR5 = ExtendsWitness; // $ExpectType (Pick & { identifier: number; yearsSinceBirth: number; })[] const r6 = await knex('users').select( knex.ref('id').as('identifier'), 'name', knex.ref('age').as('yearsSinceBirth') ); type _TR6 = ExtendsWitness; // $ExpectType { id: number; }[] const r7 = await knex.select(knex.ref('id')).from('users'); type _TR7 = ExtendsWitness>; // $ExpectType (Pick & { id: number; })[] const r8 = await knex.select(knex.ref('id'), 'name').from('users'); type _TR8 = ExtendsWitness>; // $ExpectType (Pick & { identifier: number; })[] const r9 = await knex.select(knex.ref('id').as('identifier'), 'name').from('users'); type _TR9 = ExtendsWitness; // $ExpectType (Pick & { identifier: number; yearsSinceBirth: number; })[] const r10 = await knex.select( knex.ref('id').as('identifier'), 'name', knex.ref('age').as('yearsSinceBirth') ).from('users'); type _TR10 = ExtendsWitness; // $ExpectType { id: number; age: any; }[] await knex('users').select(knex.ref('id'), {age: 'users.age'}); // $ExpectType { id: number; age: any; } | undefined await knex('users').select(knex.ref('id'), {age: 'users.age'}).first(); // $ExpectType { identifier: number; username: string; }[] (await knex('users') .select('id', 'name')) .map((u) => ({ identifier: u.id, username: u.name })); // $ExpectType { identifier: number; username: string; }[] (await knex .select('id', 'name') .from('users')) .map((u) => ({ identifier: u.id, username: u.name })); // $ExpectType { identifier: any; username: any; }[] (await knex .select('id', 'name') .from('users')) .map((u) => ({ identifier: u.id, username: u.name })); // $ExpectType number (await knex .select('id', 'name', 'age') .from('users')) .reduce((maxAge: number, user) => (user.age > maxAge ? user.age : maxAge), 0); // $ExpectType any (await knex('table') .select('key', 'value') .where({ namespace: 'foo' })) .reduce( (aggr, { value, key }) => ({ ...aggr, [key]: value > 10 ? (aggr[key] || 0) + 1 : aggr[key], }), {} as any ); // $ExpectType Pick[] await knex('users').select(['id', 'age']); // $ExpectType Pick | undefined await knex('users') .select(['id', 'age']) .first(); // $ExpectType any[] await knex('users').select('users.id'); // $ExpectType Pick[] await knex('users') .select(['id', 'age']) .clearSelect() .select(['name']); // $ExpectType Pick[] await knex('users') .select('id') .select('age') .clearSelect() .select('name') .select('departmentId'); // $ExpectType Pick[] await knex .select('id') .select('age') .clearSelect() .select('name') .select('departmentId') .from('users'); // $ExpectType any[] await knex('users') .select('users.id') .select('age'); // $ExpectType any[] await knex('users') .select('id') .from('departments'); // $ExpectType Pick[] await knex('users') .select('id') .from('departments'); // $ExpectType any[] await knex.select('id').from('users'); // $ExpectType Pick[] await knex.select('id').from('users'); // $ExpectType Pick[] await knex.select('id', 'age').from('users'); // $ExpectType Pick[] await knex.from('users').select('id'); // $ExpectType any[] await knex.from('users').select('users.id'); // $ExpectType Pick[] await knex.from('users').select[]>('users.id'); // $ExpectType any[] await knex .column('id', 'age') .select() .from('users'); // $ExpectType Pick[] await knex .column('id', 'age') .select() .from('users'); // $ExpectType Pick[] await knex('users') .column('id', 'age') .select(); // $ExpectType Pick[] await knex('users').column('id', 'age'); // $ExpectType any[] await knex('users').distinct('name', 'age'); // $ExpectType Pick[] await knex('users').distinct('name', 'age'); // $ExpectType Pick[] await knex('users').distinct(); // $ExpectType User[] await knex.select('*').from('users'); const r1 = await knex .column('id', { yearsSinceBirth: 'age' }) .select() .from('users'); type TR1_1 = ExtendsWitness< { id: number; yearsSinceBirth: any }, typeof r1[0] >; type TR1_2 = ExtendsWitness; type TR1_3 = ExtendsWitness; const r2 = await knex .column('id', { yearsSinceBirth: 'age' as 'age' }) .select() .from('users'); type TR2_1 = ExtendsWitness< { id: number; yearsSinceBirth: number }, typeof r2[0] >; type TR2_2 = ExtendsWitness; type TR2_3 = ExtendsWitness; // ## Conditional Selection: // $ExpectType User[] await knex('users').where({ id: 10 }); // $ExpectType Pick[] await knex('users') .select('id', 'name') .where({ id: 10 }); // $ExpectType Partial[] await knex .select[]>(['users.*', 'departments.name as depName']) .from('users') .join('departments', 'departments.id', '=', 'users.department_id') .orderBy('name'); // $ExpectType Partial | undefined await knex .select[]>(['users.*', 'departments.name as depName']) .from('users') .join('departments', 'departments.id', '=', 'users.department_id') .orderBy('name') .first(); // $ExpectType Partial[] await knex .select[]>(['users.*', 'departments.name as depName']) .from('users') .join('departments', 'departments.id', '=', 'users.department_id') .orderByRaw('name DESC'); // $ExpectType User | undefined await knex('users') .where({ id: 10 }) .first(); // $ExpectType any[] await knex.where({ id: 10 }).from('users'); // $ExpectType any await knex.where({ id: 10 }).from('users').first(); // $ExpectType User[] await knex.where({ id: 10 }).from('users'); // $ExpectType User | undefined await knex .where({ id: 10 }) .from('users') .clearWhere() .where({ id: 11 }) .orWhere({ id: 12 }) .first(); // $ExpectType User[] await knex .where({ id: 10 }) .where('age', '>', 20) .from('users'); // $ExpectType User[] await knex('users').whereNot('age', '>', 100); // ### Boolean operations // $ExpectType User[] await knex('users').not.where('id', 10); // $ExpectType User[] await knex('user').where('name', 'L').and.where('age', 20); // $ExpectType User[] await knex('user').where('name', 'L').or.where('age', 20); // ## Aggregation: const u4: User[] = await knex('users') .groupBy('count') .orderBy('name', 'desc') .having('age', '>', 10); // $ExpectType User[] await knex('users') .groupBy('count') .orderBy('name', 'desc') .having('age', '>', 10); // $ExpectType User[] await knex('users') .groupByRaw('count') .orderBy('name', 'desc') .having('age', '>', 10); // $ExpectType User[] await knex('users') .groupByRaw('count') .orderBy('name', 'desc') .havingRaw('age > ?', [10]); // $ExpectType User[] await knex('users') .select() .orderBy( knex('users') .select('u.id') .from('users as u') .where('users.id', 'u.id') ); // $ExpectType Dict[] await knex('users').count(); // $ExpectType Dict[] await knex('users').count('age'); // $ExpectType Dict[] await knex('users').count('age'); // $ExpectType { count: number; } await knex('foo').first().count<{count: number}>({count: '*'}); // $ExpectType { count: number; } await knex('foo').first().countDistinct<{count: number}>({count: '*'}); // $ExpectType { count?: string | number | undefined; } await knex('foo').first().count({count: '*'}); // $ExpectType { count?: string | number | undefined; } await knex('foo').first().countDistinct({count: '*'}); // $ExpectType Dict await knex('users').first().count('age'); // $ExpectType Dict await knex('users').first().count('age', 'id'); // $ExpectType Dict await knex('users').first().count(); // $ExpectType Dict[] await knex.count().from('users'); // $ExpectType Dict[] await knex.count('age').from('users'); // $ExpectType Dict[] await knex.count('age').from('users'); // $ExpectType { count: number; } await knex.first().count<{count: number}>({count: '*'}).from('foo'); // $ExpectType { count: number; } await knex.first().countDistinct<{count: number}>({count: '*'}).from('foo'); // $ExpectType { count?: string | number | undefined; } await knex.first().count({count: '*'}).from('foo'); // $ExpectType { count?: string | number | undefined; } await knex.first().countDistinct({count: '*'}).from('foo'); // $ExpectType Dict await knex.first().count('age').from('users'); // $ExpectType Dict await knex.first().count('age', 'id').from('users'); // $ExpectType Dict await knex.first().count().from('users'); // $ExpectType Dict[] await knex('users').max('age'); // $ExpectType Dict await knex('users').first().max('age'); // $ExpectType Dict[] await knex('users').max('age'); // $ExpectType Dict[] await knex('users').min('age'); // $ExpectType Dict await knex('users').first().min('age'); // $ExpectType Dict[] await knex.max('age').from('users'); // $ExpectType Dict await knex.first().max('age').from('users'); // $ExpectType Dict[] await knex.max('age').from('users'); // $ExpectType Dict[] await knex.min('age').from('users'); // $ExpectType Dict await knex.first().min('age').from('users'); // $ExpectType ({ dep: any; } & { a?: any; } & { b?: any; })[] await knex .select({dep: 'departmentId'}) .min({a: 'age'}) .max({b: 'age'}) .from('users'); // $ExpectType ({ dep: number; } & { a?: any; } & { b?: any; })[] await knex('users') .select({dep: 'departmentId'}) .min({a: 'age'}) .max({b: 'age'}); // $ExpectType ({ dep: number; } & { a?: string | number | undefined; })[] await knex('users') .select({dep: 'departmentId'}) .count({a: 'age'}); // Type of dep can't be inferred if User type is not available // at the time of select // $ExpectType ({ dep: any; } & { a?: string | number | undefined; })[] await knex .select({dep: 'departmentId'}) .count({a: 'age'}) .from('users'); // ## With inner query: // ### For column selection: // $ExpectType any[] await knex('users').select( knex('foo') .select('bar') .as('colName') ); // $ExpectType any[] await knex('users').select( knex('foo') .select('bar') .as('colName') ); // $ExpectType Pick[] await knex('users').select[]>( knex('foo') .select('bar') .as('colName') ); // ### For condition: // $ExpectType any[] await knex('users').whereNot(function() { this.where('id', 1).orWhereNot('id', '>', 10); }); // $ExpectType User[] await knex('users').whereNot(function() { this.where('id', 1).orWhereNot('id', '>', 10); }); // $ExpectType User[] await knex('users') .where((builder) => builder.whereIn('id', [1, 11, 15]).whereNotIn('id', [17, 19]) ) .andWhere(function() { this.where('id', '>', 10); }); // $ExpectType User | undefined await knex('users') .where((builder) => builder.whereIn('id', [1, 11, 15]).whereNotIn('id', [17, 19]) ) .andWhere(function() { this.where('id', '>', 10); }) .first(); // $ExpectType User[] await knex('users').whereNotExists(function() { this.select('*') .from('accounts') .whereRaw('users.account_id = accounts.id'); }); // ## Union Queries: // $ExpectType any[] await knex .select('*') .from('users') .whereNull('last_name') .union(function() { this.select('*') .from('users') .whereNull('first_name'); }); // $ExpectType User[] await knex('users') .select('*') .whereNull('name') .union(function() { this.select('*') .from('users') .whereNull('first_name'); }); // ## Joins: // $ExpectType any[] await knex('users').innerJoin( 'departments', 'users.departmentid', 'departments.id' ); // $ExpectType any[] await knex('users').innerJoin( 'departments', 'users.departmentid', 'departments.id' ); // $ExpectType any[] await knex('users').innerJoin( 'departments', 'users.departmentid', 'departments.id' ); // $ExpectType (User & Department)[] await knex('users').innerJoin( 'departments', 'users.departmentid', 'departments.id' ); // $ExpectType (User & Department & Article)[] await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) .innerJoin
('articles', 'articles.authorId', 'users.id'); // $ExpectType any[] await knex('users') .innerJoin('departments', 'users.departmentid', 'departments.id') .innerJoin
('articles', 'articles.authorId', 'users.id'); // $ExpectType (User & Department)[] await knex('users').innerJoin( 'departments', 'users.departmentid', '=', 'departments.id' ); // $ExpectType { username: any; }[] (await knex('users') .innerJoin('departments', 'users.departmentid', 'departments.id')) .map(function(joined) { return { username: joined.name, }; }); // $ExpectType { username: string; }[] (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' )) .map(function(joined) { return { username: joined.name, }; }); // $ExpectType { username: string; }[] (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) .select('*')) .map(function(joined) { return { username: joined.name, }; }); // $ExpectType { username: string; }[] (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) .select()) .map(function(joined) { return { username: joined.name, }; }); // $ExpectType { username: string; }[] (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) .select('name', 'age')) .map(function(joined) { return { username: joined.name, }; }); // $ExpectType { username: any; }[] (await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) .select('users.name', 'age')) .map(function(joined) { return { username: joined.name, }; }); // $ExpectType (User & Department)[] await knex .select<(User & Department)[]>('users') .innerJoin('departments', 'users.departmentId', 'departments.id'); // $ExpectType (User & Department)[] await knex('users').innerJoin('departments', function() { this.on('users.id', '=', 'departments.id'); }); // $ExpectType any[] await knex('users') .innerJoin( 'departments', 'users.departmentid', 'departments.id' ) .select('users.id', 'departments.id'); // $ExpectType (User & Department)[] await knex .select('*') .from('users') .join('departments', function() { this.on(function() { this.on('departments.id', '=', 'users.department_id'); this.orOn('departments.owner_id', '=', 'users.id'); }); }); // # Insertion // $ExpectType number[] await knex('users').insert({ id: 10 }); // $ExpectType number[] await knex('users').insert({ id: 10 }); const qb2 = knex('users'); qb2.returning(['id', 'name']); // $ExpectType Partial[] await qb2.insert[]>({ id: 10 }); // ## With returning // $ExpectType any[] await knex('users') .insert({ id: 10 }) .returning('id'); // $ExpectType number[] await knex('users') .insert({ id: 10 }) .returning('id'); // $ExpectType string[] await knex('users') .insert({ id: 10 }) .returning('id'); // $ExpectType number[] await knex('users') .insert({ id: 10 }) .returning('id'); // $ExpectType Pick[] await knex('users') .insert({ id: 10 }) .returning(['id', 'age']); // $ExpectType number[] await knex('users').insert({ id: 10 }, 'id'); // $ExpectType User[] await knex('users').insert({ id: 10 }, '*'); // $ExpectType number[] await knex.insert({ id: 10 }, 'id').into('users'); // $ExpectType Pick[] await knex('users') .insert({ id: 10 }) .returning(['id', 'age']); // $ExpectType Pick[] await knex('users') .insert({ id: 10 }, 'id') .returning(['id', 'age']); // $ExpectType any[] await knex('users') .insert({id: 10}) .returning('*'); // $ExpectType User[] await knex('users') .insert({id: 10}) .returning('*'); // $ExpectType any[] await knex .insert({id: 10}) .into('users') .returning('*'); // $ExpectType User[] await knex .insert({id: 10}) .into('users') .returning('*'); // $ExpectType User[] await knex .insert({id: 10}) .returning('*') .into('users'); // $ExpectType User[] await knex('users') .insert({id: 10}, 'id') .returning('*'); // $ExpectType Pick[] await knex .insert({ id: 10 }) .returning(['id', 'age']) .into('users'); // $ExpectType any[] await knex('users') .insert({ id: 10 }) .returning(['id', 'age']); // # Update // $ExpectType number await knex('users') .where('id', 10) .update({ active: true }); const qb1 = knex('users').where('id', 10); qb1.returning(['id', 'name']); // $ExpectType Partial[] await qb1.update[]>({ active: true }); // $ExpectType number await knex('users') .where('id', 10) .update({ active: true }); // $ExpectType number await knex .where('id', 10) .update({ active: true }) .from('users'); // ## With Returning // $ExpectType any[] await knex('users') .where('id', 10) .update({ active: true }) .returning(['id', 'age']); // $ExpectType any[] await knex('users') .where('id', 10) .update({ active: true }) .returning('*'); // $ExpectType User[] await knex('users') .where('id', 10) .update({ active: true }) .returning('*'); // $ExpectType any[] await knex .where('id', 10) .update({ active: true }) .returning('*') .from('users'); // $ExpectType User[] await knex .where('id', 10) .update({ active: true }) .returning('*') .from('users'); // $ExpectType Pick[] await knex('users') .where('id', 10) .update({ active: true }) .returning(['id', 'age']); // $ExpectType number[] await knex('users') .where('id', 10) .update({ active: true }, 'id'); // $ExpectType Pick[] await knex('users') .where('id', 10) .update({ active: true }, ['id', 'age']); // $ExpectType Pick[] await knex .where('id', 10) .update({ active: true }, ['id', 'age']) .into('users'); // # Deletion // $ExpectType number await knex('users') .where('id', 10) .delete(); // $ExpectType number await knex('users') .where('id', 10) .del(); // $ExpectType number[] await knex('users') .where('id', 10) .delete('id'); // $ExpectType any[] await knex('users') .where('id', 10) .del() .returning('*'); // $ExpectType any[] await knex('users') .where('id', 10) .delete() .returning('*'); // $ExpectType User[] await knex('users') .where('id', 10) .del() .returning('*'); // $ExpectType User[] await knex('users') .where('id', 10) .delete() .returning('*'); // $ExpectType User[] await knex .where('id', 10) .del() .returning('*') .from('users'); // $ExpectType User[] await knex .where('id', 10) .delete() .returning('*') .from('users'); // $ExpectType number[] await knex .where('id', 10) .delete('id') .from('users'); // $ExpectType void await knex('users').truncate(); // $ExpectType void await knex('users').truncate(); // # Column Info: // $ExpectType ColumnInfo await knex('users').columnInfo(); // $ExpectType ColumnInfo await knex('users').columnInfo(); // # Modify: function withUserName(queryBuilder: Knex.QueryBuilder, foreignKey: string) { queryBuilder .leftJoin('users', foreignKey, 'users.id') .select('users.user_name'); } // $ExpectType QueryBuilder knex .table('articles') .select('title', 'body') .modify(withUserName, 'articles_user.id'); const withAge = (queryBuilder: Knex.QueryBuilder) => queryBuilder.select('age'); // $ExpectType Pick await knex .table('users') .select('id') .modify>(withAge); // Transactions: // $ExpectType any[] await knex.transaction(async (trx) => { const articles: Article[] = [ { id: 1, subject: 'Canterbury Tales' }, { id: 2, subject: 'Moby Dick' }, { id: 3, subject: 'Hamlet' }, ]; return trx.insert({ name: 'Old Books' }, 'id').into('articles'); }); // $ExpectType Pick[] await knex.transaction(async (trx) => { const articles: Article[] = [ { id: 1, subject: 'Canterbury Tales' }, { id: 2, subject: 'Moby Dick' }, { id: 3, subject: 'Hamlet' }, ]; return trx .insert(articles) .into
('articles') .returning(['id', 'subject']); }); // $ExpectType any await knex.transaction(async (trx) => { const articles: Article[] = [ { id: 1, subject: 'Canterbury Tales' }, { id: 2, subject: 'Moby Dick' }, { id: 3, subject: 'Hamlet' }, ]; return knex .insert(articles, ['id', 'subject']) .into
('articles') .transacting(trx) .then(trx.commit) .catch(trx.rollback); }); // $ExpectType Pick[] await knex.transaction( async ( trx: Knex.Transaction[]> ) => { const articles: Article[] = [ { id: 1, subject: 'Canterbury Tales' }, { id: 2, subject: 'Moby Dick' }, { id: 3, subject: 'Hamlet' }, ]; return knex .insert(articles, ['id', 'subject']) .into
('articles') .transacting(trx) .then(trx.commit) .catch(trx.rollback); } ); // With: // $ExpectType any[] await knex .with('with_alias', knex.raw('select * from "users" where "id" = ?', 1)) .select('*') .from('with_alias'); // $ExpectType any[] await knex .with( 'with_alias', knex.raw('select * from "users" where "id" = ?', 1) ) .select('*') .from('with_alias'); // $ExpectType User[] await knex .with( 'with_alias', knex.raw('select * from "users" where "id" = ?', 1) ) .select('*') .from('with_alias'); // $ExpectType any[] await knex .with('with_alias', (qb) => { qb.select('*') .from('books') .where('author', 'Test'); }) .select('*') .from('with_alias'); // $ExpectType any[] await knex .withRecursive('ancestors', (qb) => { qb.select('*') .from('users') .where('users.id', 1); }) .select('*') .from('ancestors'); // $ExpectType any[] await knex .withRecursive('ancestors', (qb) => { qb.select('*') .from('users') .where('users.id', 1); }) .select('*') .from('ancestors'); // $ExpectType User[] await knex .withRecursive('ancestors', (qb) => { qb.select('*') .from('users') .where('users.id', 1); }) .select('*') .from('ancestors'); // $ExpectType User[] await knex .withRecursive('ancestors', (qb: Knex.QueryBuilder) => { qb.select('*') .from('users') .where('users.id', 1); }) .select('*') .from('ancestors'); // $ExpectType Pick[] await knex .withRecursive('ancestors', (qb) => { qb.select('*') .from('users') .where('users.id', 1); }) .select('id', 'name') .from('ancestors'); // $ExpectType any[] await knex .withSchema('public') .select('*') .from('users'); // $ExpectType User[] await knex .withSchema('public') .select('*') .from('users'); // Seed: // $ExpectType string await knex.seed.make('test'); // $ExpectType string await knex.seed.make('test', { extension: 'ts', directory: 'lib/seeds' }); // $ExpectType [string[]] await knex.seed.run(); // $ExpectType [string[]] await knex.seed.run({ extension: 'ts', directory: 'lib/seeds' }); // $ExpectType any[] await knex('users', { only: true }); // $ExpectType any[] await knex .select('*') .from('users', { only: true }); // $ExpectType any knex.queryBuilder().queryContext(); };