Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix some more cases of missing typings #3223

Merged
merged 2 commits into from May 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
74 changes: 38 additions & 36 deletions types/index.d.ts
Expand Up @@ -258,17 +258,18 @@ interface Dict<T = any> {
type SafePick<T, K extends keyof T> = T extends {} ? Pick<T, K> : any;

interface Knex<TRecord extends {} = any, TResult = unknown[]>
extends Knex.QueryInterface<TRecord, TResult> {
extends Knex.QueryInterface<TRecord, TResult>, events.EventEmitter {
<TRecord2 = TRecord, TResult2 = DeferredKeySelection<TRecord2, never>[]>(
tableName?: Knex.TableDescriptor | Knex.AliasDict
): Knex.QueryBuilder<TRecord2, TResult2>;
VERSION: string;
__knex__: string;

raw: Knex.RawBuilder;
raw: Knex.RawBuilder<TRecord, TResult>;
transaction<T>(
transactionScope: (trx: Knex.Transaction) => Promise<T> | Bluebird<T> | void
): Bluebird<T>;
initialize(config?: Knex.Config): void;
destroy(callback: Function): void;
destroy(): Bluebird<void>;
batchInsert(
Expand All @@ -284,13 +285,9 @@ interface Knex<TRecord extends {} = any, TResult = unknown[]>

client: any;
migrate: Knex.Migrator;
seed: any;
seed: Knex.Seeder;
fn: Knex.FunctionHelper;
ref: Knex.RefBuilder;
on(
eventName: string,
callback: Function
): Knex.QueryBuilder<TRecord, TResult>;
}

declare function Knex<TRecord = any, TResult = unknown[]>(
Expand Down Expand Up @@ -582,9 +579,9 @@ declare namespace Knex {
data: MaybeArray<SafePartial<TRecord>>,
returning: TKey[]
): QueryBuilder<TRecord, TResult2>;
insert(
insert<TResult2 = number[]>(
data: MaybeArray<SafePartial<TRecord>>
): QueryBuilder<TRecord, number[]>;
): QueryBuilder<TRecord, TResult2>;

modify<TRecord2 extends {} = any, TResult2 extends {} = any>(
callback: QueryCallbackWithArgs<TRecord, any>,
Expand Down Expand Up @@ -635,9 +632,9 @@ declare namespace Knex {
data: MaybeArray<SafePartial<TRecord>>,
returning: TKey[]
): QueryBuilder<TRecord, TResult2>;
update(
update<TResult2 = number>(
data: MaybeArray<SafePartial<TRecord>>
): QueryBuilder<TRecord, number>;
): QueryBuilder<TRecord, TResult2>;
update<
K1 extends StrKey<TRecord>,
K2 extends StrKey<TRecord>,
Expand Down Expand Up @@ -668,12 +665,12 @@ declare namespace Knex {
columnName: K,
value: TRecord[K]
): QueryBuilder<TRecord, number>;
update(
update<TResult2 = SafePartial<TRecord>[]>(
columnName: string,
value: Value,
returning: string | string[]
): QueryBuilder<TRecord>;
update(columnName: string, value: Value): QueryBuilder<TRecord, number>;
): QueryBuilder<TRecord, TResult2>;
update<TResult2 = number>(columnName: string, value: Value): QueryBuilder<TRecord, TResult2>;

returning<
TKey extends StrKey<TRecord>,
Expand Down Expand Up @@ -707,7 +704,7 @@ declare namespace Knex {
>[]
>(
returning: TKey
): QueryBuilder<TRecord, TResult2[]>;
): QueryBuilder<TRecord, TResult2>;
del<
TKey extends StrKey<TRecord>,
TResult2 = DeferredKeySelection.Augment<
Expand All @@ -718,10 +715,10 @@ declare namespace Knex {
>(
returning: TKey[]
): QueryBuilder<TRecord, TResult2[]>;
del<TResult2 = void>(
del<TResult2 = SafePartial<TRecord>[]>(
returning: string | string[]
): QueryBuilder<TRecord, TResult2[]>;
del(): QueryBuilder<TRecord, number>;
): QueryBuilder<TRecord, TResult2>;
del<TResult2 = number>(): QueryBuilder<TRecord, TResult2>;

delete<
TKey extends StrKey<TRecord>,
Expand All @@ -743,10 +740,10 @@ declare namespace Knex {
>(
returning: TKey[]
): QueryBuilder<TRecord, TResult2>;
delete<TResult2 = void>(
delete<TResult2 = any>(
returning: string | string[]
): QueryBuilder<TRecord, TResult2>;
delete(): QueryBuilder<TRecord, number>;
delete<TResult2 = number>(): QueryBuilder<TRecord, TResult2>;

truncate(): QueryBuilder<TRecord, void>;

Expand Down Expand Up @@ -1230,18 +1227,18 @@ declare namespace Knex {
): QueryBuilder<TRecord, TResult2>;
}

type RawBinding = Value | QueryBuilder;
type RawBinding = Value | QueryBuilder<any, any>;

interface RawQueryBuilder<TRecord = any, TResult = unknown[]> {
<TResult2 = SafePartial<TRecord>[]>(
<TResult2 = UnknownToAny<TResult>>(
sql: string,
...bindings: RawBinding[]
): QueryBuilder<TRecord, TResult2>;
<TResult2 = SafePartial<TRecord>[]>(
<TResult2 = UnknownToAny<TResult>>(
sql: string,
bindings: RawBinding[] | ValueDict
): QueryBuilder<TRecord, TResult2>;
<TResult2 = SafePartial<TRecord>[]>(raw: Raw<TResult2>): QueryBuilder<
<TResult2 = UnknownToAny<TResult>>(raw: Raw<TResult2>): QueryBuilder<
TRecord,
TResult2
>;
Expand All @@ -1257,18 +1254,10 @@ declare namespace Knex {
queryContext(context: any): Raw<TResult>;
}

interface RawBuilder {
<TResult>(value: Value): Raw<TResult>;
<TResult>(sql: string, ...bindings: Value[]): Raw<TResult>;
<TResult>(sql: string, bindings: Value[] | ValueDict): Raw<TResult>;
<TRecord, TResult>(
sql: string,
...bindings: QueryBuilder<TRecord, TResult>[]
): Raw<TResult>;
<TRecord, TResult>(
sql: string,
bindings: QueryBuilder<TRecord, TResult>[] | ValueDict
): Raw<TResult>;
interface RawBuilder<TRecord extends {} = any, TResult = unknown[]> {
<TResult2 = UnknownToAny<TResult>>(value: Value): Raw<TResult2>;
<TResult2 = UnknownToAny<TResult>>(sql: string, ...bindings: RawBinding[]): Raw<TResult2>;
<TResult2 = UnknownToAny<TResult>>(sql: string, bindings: RawBinding[] | ValueDict): Raw<TResult2>;
}

interface Ref<TSrc extends string, TMapping extends {}> extends Raw<string> {
Expand Down Expand Up @@ -1721,6 +1710,19 @@ declare namespace Knex {
up(config?: MigratorConfig): Bluebird<any>;
}

interface SeederConfig {
extension?: string;
directory?: string;
loadExtensions?: string[];
}

class Seeder {
constructor(knex: Knex);
setConfig(config: SeederConfig): SeederConfig;
run(config?: SeederConfig): Bluebird<string[]>;
make(name: string, config?: SeederConfig): Bluebird<string>;
}

interface FunctionHelper {
now(): Raw;
}
Expand Down
90 changes: 89 additions & 1 deletion types/test.ts
Expand Up @@ -11,6 +11,9 @@ const knex = Knex({
},
});

knex.initialize();
knex.initialize({});

interface User {
id: number;
age: number;
Expand Down Expand Up @@ -90,6 +93,42 @@ const main = async () => {
// $ExpectType Pick<User, "id" | "age">[]
await knex<User>('users').select('id', 'age');

// $ExpectType any[]
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<User[]>(
'select * from users where id in ?',
knex('contacts').select('name')
);

// $ExpectType User[]
await knex.raw<User[]>(
'select * from users where departmentId in ?',
knex<Department>('departments').select('id')
);

// $ExpectType User[]
await knex.raw<User[]>(
'select * from users where departmentId in ? & active in ?',
[
knex<Department>('departments').select('name'),
[true, false]
]
);

// $ExpectType User[]
await knex<User>('user').whereRaw('name = ?', 'L');

// $ExpectType User[]
await knex<User>('user').whereRaw('name = ?', 'L').clearWhere();

// $ExpectType { id: number; }[]
const r3 = await knex<User>('users').select(knex.ref('id'));

Expand Down Expand Up @@ -307,6 +346,13 @@ const main = async () => {
.join('departments', 'departments.id', '=', 'users.department_id')
.orderBy('name');

// $ExpectType Partial<User>[]
await knex
.select<Partial<User>[]>(['users.*', 'departments.name as depName'])
.from('users')
.join('departments', 'departments.id', '=', 'users.department_id')
.orderByRaw('name DESC');

// $ExpectType User
await knex<User>('users')
.where({ id: 10 })
Expand All @@ -329,12 +375,24 @@ const main = async () => {

// ## Aggregation:

// $ExpectType Partial<User>[]
// $ExpectType User[]
await knex<User>('users')
.groupBy('count')
.orderBy('name', 'desc')
.having('age', '>', 10);

// $ExpectType User[]
await knex<User>('users')
.groupByRaw('count')
.orderBy('name', 'desc')
.having('age', '>', 10);

// $ExpectType User[]
await knex<User>('users')
.groupByRaw('count')
.orderBy('name', 'desc')
.havingRaw('age > ?', [10]);

// $ExpectType { [key: string]: string | number; }[]
await knex<User>('users').count();

Expand Down Expand Up @@ -597,6 +655,11 @@ const main = async () => {
// $ExpectType number[]
await knex<User>('users').insert({ id: 10 });

const qb2 = knex<User>('users');
qb2.returning(['id', 'name']);
// $ExpectType Partial<User>[]
await qb2.insert<Partial<User>[]>({ id: 10 });

// ## With returning

// $ExpectType any[]
Expand Down Expand Up @@ -658,6 +721,11 @@ const main = async () => {
.where('id', 10)
.update({ active: true });

const qb1 = knex('users').where('id', 10);
qb1.returning(['id', 'name']);
// $ExpectType Partial<User>[]
await qb1.update<Partial<User>[]>({ active: true });

// $ExpectType number
await knex<User>('users')
.where('id', 10)
Expand Down Expand Up @@ -915,4 +983,24 @@ const main = async () => {
.withSchema('public')
.select('*')
.from<User>('users');

// Seed:

// $ExpectType string
await knex.seed.make('test');

// $ExpectType string
await knex.seed.make('test', {
extension: 'ts',
directory: 'src/seeds'
});

// $ExpectType string[]
await knex.seed.run();

// $ExpectType string[]
await knex.seed.run({
extension: 'ts',
directory: 'src/seeds'
});
};