knex 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Master (Unreleased)
2
2
 
3
+ # 1.0.5 - 05 March, 2022
4
+
5
+ ### New features:
6
+
7
+ - Override knexfile options with CLI options #4047
8
+
9
+ ### Bug fixes:
10
+
11
+ - Stringify json value in update #5063
12
+ - Fix isModuleType() for yarn #4447
13
+ - Wrapped Unions Fixes #5072
14
+ - SQLite: Fix @vscode-sqlite3 error message #5081
15
+ - CLI: Fix completed migration listing #5060
16
+
17
+ ### Typings:
18
+
19
+ - Make default generic parameters of `Knex` match the generic parameter types of `knex` #5021
20
+ - Update knex types for TS 4.7 #5095
21
+
3
22
  # 1.0.4 - 13 March, 2022
4
23
 
5
24
  ### New features:
package/bin/cli.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  const rechoir = require('rechoir');
3
+ const merge = require('lodash/merge');
3
4
  const interpret = require('interpret');
4
5
  const resolveFrom = require('resolve-from');
5
6
  const path = require('path');
@@ -9,6 +10,7 @@ const color = require('colorette');
9
10
  const argv = require('getopts')(process.argv.slice(2));
10
11
  const cliPkg = require('../package');
11
12
  const {
13
+ parseConfigObj,
12
14
  mkConfigObj,
13
15
  resolveEnvironmentConfig,
14
16
  exit,
@@ -59,8 +61,17 @@ async function initKnex(env, opts) {
59
61
  env.configuration,
60
62
  env.configPath
61
63
  );
64
+
65
+ const optionsConfig = parseConfigObj(opts);
66
+ const config = merge(resolvedConfig, optionsConfig);
67
+
68
+ // Migrations directory gets defaulted if it is undefined.
69
+ if (!env.configPath && !config.migrations.directory) {
70
+ config.migrations.directory = null;
71
+ }
72
+
62
73
  const knex = require(env.modulePath);
63
- return knex(resolvedConfig);
74
+ return knex(config);
64
75
  }
65
76
 
66
77
  function invoke() {
@@ -138,16 +149,10 @@ function invoke() {
138
149
  .option('--knexfile [path]', 'Specify the knexfile path.')
139
150
  .option('--knexpath [path]', 'Specify the path to knex instance.')
140
151
  .option('--cwd [path]', 'Specify the working directory.')
141
- .option('--client [name]', 'Set DB client without a knexfile.')
142
- .option('--connection [address]', 'Set DB connection without a knexfile.')
143
- .option(
144
- '--migrations-directory [path]',
145
- 'Set migrations directory without a knexfile.'
146
- )
147
- .option(
148
- '--migrations-table-name [path]',
149
- 'Set migrations table name without a knexfile.'
150
- )
152
+ .option('--client [name]', 'Set DB client.')
153
+ .option('--connection [address]', 'Set DB connection.')
154
+ .option('--migrations-directory [path]', 'Set migrations directory.')
155
+ .option('--migrations-table-name [path]', 'Set migrations table name.')
151
156
  .option(
152
157
  '--env [name]',
153
158
  'environment, default: process.env.NODE_ENV || development'
@@ -1,12 +1,39 @@
1
1
  const { DEFAULT_EXT, DEFAULT_TABLE_NAME } = require('./constants');
2
2
  const { resolveClientNameWithAliases } = require('../../lib/util/helpers');
3
- const fs = require('fs');
4
3
  const path = require('path');
5
4
  const escalade = require('escalade/sync');
6
5
  const tildify = require('tildify');
7
6
  const color = require('colorette');
8
7
  const argv = require('getopts')(process.argv.slice(2));
9
8
 
9
+ function findCaseInsensitiveProperty(propertyName, object) {
10
+ return Object.keys(object).find(
11
+ (key) => key.toLowerCase() === propertyName.toLowerCase()
12
+ );
13
+ }
14
+
15
+ function parseConfigObj(opts) {
16
+ const config = { migrations: {} };
17
+
18
+ if (opts.client) {
19
+ config.client = opts.client;
20
+ }
21
+
22
+ if (opts.connection) {
23
+ config.connection = opts.connection;
24
+ }
25
+
26
+ if (opts.migrationsDirectory) {
27
+ config.migrations.directory = opts.migrationsDirectory;
28
+ }
29
+
30
+ if (opts.migrationsTableName) {
31
+ config.migrations.tableName = opts.migrationsTableName;
32
+ }
33
+
34
+ return config;
35
+ }
36
+
10
37
  function mkConfigObj(opts) {
11
38
  if (!opts.client) {
12
39
  throw new Error(
@@ -17,16 +44,14 @@ function mkConfigObj(opts) {
17
44
  const envName = opts.env || process.env.NODE_ENV || 'development';
18
45
  const resolvedClientName = resolveClientNameWithAliases(opts.client);
19
46
  const useNullAsDefault = resolvedClientName === 'sqlite3';
47
+ const parsedConfig = parseConfigObj(opts);
48
+
20
49
  return {
21
50
  ext: DEFAULT_EXT,
22
51
  [envName]: {
52
+ ...parsedConfig,
23
53
  useNullAsDefault,
24
- client: opts.client,
25
- connection: opts.connection,
26
- migrations: {
27
- directory: opts.migrationsDirectory,
28
- tableName: opts.migrationsTableName || DEFAULT_TABLE_NAME,
29
- },
54
+ tableName: parsedConfig.tableName || DEFAULT_TABLE_NAME,
30
55
  },
31
56
  };
32
57
  }
@@ -174,6 +199,7 @@ function findUpConfig(cwd, name, extensions) {
174
199
  }
175
200
 
176
201
  module.exports = {
202
+ parseConfigObj,
177
203
  mkConfigObj,
178
204
  resolveEnvironmentConfig,
179
205
  exit,
@@ -6,7 +6,7 @@ function listMigrations(completed, newMigrations) {
6
6
  let message = '';
7
7
 
8
8
  if (completed.length === 0) {
9
- message += color.red('No Completed Migration files Found. \n');
9
+ message += color.red('No Completed Migration files Found.\n');
10
10
  } else {
11
11
  message = color.green(
12
12
  `Found ${completed.length} Completed Migration file/files.\n`
@@ -14,7 +14,7 @@ function listMigrations(completed, newMigrations) {
14
14
 
15
15
  for (let i = 0; i < completed.length; i++) {
16
16
  const file = completed[i];
17
- message += color.cyan(`${file} \n`);
17
+ message += color.cyan(`${file.name}\n`);
18
18
  }
19
19
  }
20
20
 
@@ -27,7 +27,7 @@ function listMigrations(completed, newMigrations) {
27
27
 
28
28
  for (let i = 0; i < newMigrations.length; i++) {
29
29
  const file = newMigrations[i];
30
- message += color.cyan(`${file.file} \n`);
30
+ message += color.cyan(`${file.file}\n`);
31
31
  }
32
32
  }
33
33
 
package/lib/client.js CHANGED
@@ -189,7 +189,10 @@ class Client extends EventEmitter {
189
189
  try {
190
190
  this.driver = this._driver();
191
191
  } catch (e) {
192
- const message = `Knex: run\n$ npm install ${this.driverName} --save`;
192
+ const driverName = this.aliasDriverName
193
+ ? this.aliasDriverName
194
+ : this.driverName;
195
+ const message = `Knex: run\n$ npm install ${driverName} --save`;
193
196
  this.logger.error(`${message}\n${e.message}\n${e.stack}`);
194
197
  throw new Error(`${message}\n${e.message}`);
195
198
  }
@@ -232,6 +232,8 @@ Object.assign(Client_SQLite3.prototype, {
232
232
  dialect: 'sqlite3',
233
233
 
234
234
  driverName: 'sqlite3',
235
+ // SqlLite3 driver package name is different from driver name.
236
+ aliasDriverName: '@vscode/sqlite3',
235
237
  });
236
238
 
237
239
  module.exports = Client_SQLite3;
@@ -1,14 +1,9 @@
1
- const { readFile } = require('./fs');
1
+ const getPackageType = require('get-package-type');
2
2
 
3
3
  module.exports = async function isModuleType(filepath) {
4
- if (process.env.npm_package_json) {
5
- // npm >= 7.0.0
6
- const packageJson = JSON.parse(
7
- await readFile(process.env.npm_package_json, 'utf-8')
8
- );
9
- if (packageJson.type === 'module') {
10
- return true;
11
- }
12
- }
13
- return process.env.npm_package_type === 'module' || filepath.endsWith('.mjs');
4
+ return (
5
+ filepath.endsWith('.mjs') ||
6
+ (!filepath.endsWith('.cjs') &&
7
+ (await getPackageType(filepath)) === 'module')
8
+ );
14
9
  };
@@ -1236,7 +1236,11 @@ class Builder extends EventEmitter {
1236
1236
  const obj = this._single.update || {};
1237
1237
  this._method = 'update';
1238
1238
  if (isString(values)) {
1239
- obj[values] = returning;
1239
+ if (isPlainObject(returning)) {
1240
+ obj[values] = JSON.stringify(returning);
1241
+ } else {
1242
+ obj[values] = returning;
1243
+ }
1240
1244
  if (arguments.length > 2) {
1241
1245
  ret = arguments[2];
1242
1246
  }
@@ -125,16 +125,27 @@ class QueryCompiler {
125
125
  let sql = this.with();
126
126
 
127
127
  let unionStatement = '';
128
- // Compute all statements to main query
129
- const statements = components.map((component) => {
128
+
129
+ const firstStatements = [];
130
+ const endStatements = [];
131
+
132
+ components.forEach((component) => {
130
133
  const statement = this[component](this);
131
134
  // We store the 'union' statement to append it at the end.
132
135
  // We still need to call the component sequentially because of
133
136
  // order of bindings.
134
- if (component === 'union') {
135
- unionStatement = statement;
136
- } else {
137
- return statement;
137
+ switch (component) {
138
+ case 'union':
139
+ unionStatement = statement;
140
+ break;
141
+ case 'columns':
142
+ case 'join':
143
+ case 'where':
144
+ firstStatements.push(statement);
145
+ break;
146
+ default:
147
+ endStatements.push(statement);
148
+ break;
138
149
  }
139
150
  });
140
151
 
@@ -144,15 +155,22 @@ class QueryCompiler {
144
155
  const wrapMainQuery =
145
156
  this.grouped.union &&
146
157
  this.grouped.union.map((u) => u.wrap).some((u) => u);
147
- const allStatements =
148
- (wrapMainQuery ? '(' : '') +
149
- compact(statements).join(' ') +
150
- (wrapMainQuery ? ')' : '');
151
158
 
152
159
  if (this.onlyUnions()) {
153
- sql += unionStatement + ' ' + allStatements;
160
+ const statements = compact(firstStatements.concat(endStatements)).join(
161
+ ' '
162
+ );
163
+ sql += unionStatement + (statements ? ' ' + statements : '');
154
164
  } else {
155
- sql += allStatements + (unionStatement ? ' ' + unionStatement : '');
165
+ const allStatements =
166
+ (wrapMainQuery ? '(' : '') +
167
+ compact(firstStatements).join(' ') +
168
+ (wrapMainQuery ? ')' : '');
169
+ const endStat = compact(endStatements).join(' ');
170
+ sql +=
171
+ allStatements +
172
+ (unionStatement ? ' ' + unionStatement : '') +
173
+ (endStat ? ' ' + endStat : endStat);
156
174
  }
157
175
  return sql;
158
176
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "knex",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "A batteries-included SQL query & schema builder for PostgresSQL, MySQL, CockroachDB, MSSQL and SQLite3",
5
5
  "main": "knex",
6
6
  "types": "types/index.d.ts",
@@ -55,10 +55,11 @@
55
55
  },
56
56
  "dependencies": {
57
57
  "colorette": "2.0.16",
58
- "commander": "^8.3.0",
59
- "debug": "4.3.3",
58
+ "commander": "^9.1.0",
59
+ "debug": "4.3.4",
60
60
  "escalade": "^3.1.1",
61
61
  "esm": "^3.2.25",
62
+ "get-package-type": "^0.1.0",
62
63
  "getopts": "2.3.0",
63
64
  "interpret": "^2.2.0",
64
65
  "lodash": "^4.17.21",
@@ -111,6 +112,7 @@
111
112
  "eslint": "^8.8.0",
112
113
  "eslint-config-prettier": "^8.3.0",
113
114
  "eslint-plugin-import": "^2.25.4",
115
+ "eslint-plugin-mocha-no-only": "^1.1.1",
114
116
  "husky": "^4.3.8",
115
117
  "jake": "^8.1.1",
116
118
  "JSONStream": "^1.3.5",
@@ -123,17 +125,17 @@
123
125
  "oracledb": "^5.3.0",
124
126
  "pg": "^8.7.1",
125
127
  "pg-query-stream": "^4.2.1",
126
- "prettier": "2.5.1",
128
+ "prettier": "2.6.2",
127
129
  "rimraf": "^3.0.2",
128
130
  "sinon": "^13.0.1",
129
131
  "sinon-chai": "^3.7.0",
130
132
  "source-map-support": "^0.5.21",
131
133
  "tap-spec": "^5.0.0",
132
134
  "tape": "^5.5.0",
133
- "tedious": "^12.3.0",
135
+ "tedious": "^14.3.0",
134
136
  "toxiproxy-node-client": "^2.0.6",
135
137
  "ts-node": "^10.4.0",
136
- "tsd": "^0.19.1",
138
+ "tsd": "^0.20.0",
137
139
  "typescript": "4.5.5"
138
140
  },
139
141
  "buildDependencies": [
package/types/index.d.ts CHANGED
@@ -30,6 +30,11 @@ type StrKey<T> = string & keyof T;
30
30
 
31
31
  // If T is unknown then convert to any, else retain original
32
32
  type UnknownToAny<T> = unknown extends T ? any : T;
33
+ type CurlyCurlyToAny<T> = T extends unknown ? // distribute
34
+ (<U>() => U extends T ? 0 : 1) extends
35
+ (<U>() => U extends {} ? 0 : 1) ? any : T
36
+ : never;
37
+ type UnknownOrCurlyCurlyToAny<T> = [UnknownToAny<T> | CurlyCurlyToAny<T>][0];
33
38
  type AnyToUnknown<T> = unknown extends T ? unknown : T;
34
39
  type AnyOrUnknownToOther<T1, T2> = unknown extends T1 ? T2 : T1;
35
40
 
@@ -193,7 +198,7 @@ declare namespace DeferredKeySelection {
193
198
  ? DeferredKeySelection<TBase, TKeys | TKey, true, TAliasMapping, TSingle, TIntersectProps, TUnionProps>
194
199
  : DeferredKeySelection<unknown, TKey, true>;
195
200
 
196
- type AddAliases<TSelection, T> = TSelection extends DeferredKeySelection<
201
+ type AddAliases<TSelection, T extends {}> = TSelection extends DeferredKeySelection<
197
202
  infer TBase,
198
203
  infer TKeys,
199
204
  infer THasSelect,
@@ -219,7 +224,7 @@ declare namespace DeferredKeySelection {
219
224
 
220
225
  // Convenience utility to set base, keys and aliases in a single type
221
226
  // application
222
- type Augment<T, TBase, TKey extends string, TAliasMapping = {}> = AddAliases<
227
+ type Augment<T, TBase, TKey extends string, TAliasMapping extends {} = {}> = AddAliases<
223
228
  AddKey<SetBase<T, TBase>, TKey>,
224
229
  TAliasMapping
225
230
  >;
@@ -234,7 +239,7 @@ declare namespace DeferredKeySelection {
234
239
  infer TIntersectProps,
235
240
  infer TUnionProps
236
241
  >
237
- ? UnknownToAny<
242
+ ? UnknownOrCurlyCurlyToAny<
238
243
  // ^ We convert final result to any if it is unknown for backward compatibility.
239
244
  // Historically knex typings have been liberal with returning any and changing
240
245
  // default return type to unknown would be a major breaking change for users.
@@ -263,11 +268,11 @@ declare namespace DeferredKeySelection {
263
268
  : TSelection extends DeferredKeySelection.Any[]
264
269
  ? Knex.ResolveTableType<ResolveOne<TSelection[0]>>[]
265
270
  : TSelection extends (infer I)[]
266
- ? UnknownToAny<Knex.ResolveTableType<I>>[]
267
- : UnknownToAny<Knex.ResolveTableType<TSelection>>;
271
+ ? UnknownOrCurlyCurlyToAny<Knex.ResolveTableType<I>>[]
272
+ : UnknownOrCurlyCurlyToAny<Knex.ResolveTableType<TSelection>>;
268
273
  }
269
274
 
270
- type AggregationQueryResult<TResult, TIntersectProps2> = ArrayIfAlready<
275
+ type AggregationQueryResult<TResult, TIntersectProps2 extends {}> = ArrayIfAlready<
271
276
  TResult,
272
277
  UnwrapArrayMember<TResult> extends DeferredKeySelection<
273
278
  infer TBase,
@@ -307,13 +312,13 @@ interface DMLOptions {
307
312
  includeTriggerModifications?: boolean;
308
313
  }
309
314
 
310
- export interface Knex<TRecord extends {} = any, TResult = Record<string, any>[]>
315
+ export interface Knex<TRecord extends {} = any, TResult = any[]>
311
316
  extends Knex.QueryInterface<TRecord, TResult>, events.EventEmitter {
312
317
  <TTable extends Knex.TableNames>(
313
318
  tableName: TTable,
314
319
  options?: TableOptions
315
320
  ): Knex.QueryBuilder<Knex.TableType<TTable>, DeferredKeySelection<Knex.ResolveTableType<Knex.TableType<TTable>>, never>[]>;
316
- <TRecord2 = TRecord, TResult2 = DeferredKeySelection<TRecord2, never>[]>(
321
+ <TRecord2 extends {} = TRecord, TResult2 = DeferredKeySelection<TRecord2, never>[]>(
317
322
  tableName?: Knex.TableDescriptor | Knex.AliasDict,
318
323
  options?: TableOptions
319
324
  ): Knex.QueryBuilder<TRecord2, TResult2>;
@@ -340,7 +345,7 @@ export interface Knex<TRecord extends {} = any, TResult = Record<string, any>[]>
340
345
  destroy(callback: Function): void;
341
346
  destroy(): Promise<void>;
342
347
 
343
- batchInsert<TRecord2 = TRecord, TResult2 = number[]>(
348
+ batchInsert<TRecord2 extends {} = TRecord, TResult2 = number[]>(
344
349
  tableName: Knex.TableDescriptor,
345
350
  data: TRecord2 extends Knex.CompositeTableType<unknown>
346
351
  ? ReadonlyArray<Knex.ResolveTableType<TRecord2, 'insert'>>
@@ -349,7 +354,7 @@ export interface Knex<TRecord extends {} = any, TResult = Record<string, any>[]>
349
354
  ): Knex.BatchInsertBuilder<TRecord2, TResult2>;
350
355
 
351
356
  schema: Knex.SchemaBuilder;
352
- queryBuilder<TRecord2 = TRecord, TResult2 = TResult>(): Knex.QueryBuilder<
357
+ queryBuilder<TRecord2 extends {} = TRecord, TResult2 = TResult>(): Knex.QueryBuilder<
353
358
  TRecord2,
354
359
  TResult2
355
360
  >;
@@ -405,7 +410,7 @@ export declare namespace Knex {
405
410
  interface ValueDict extends Dict<Value | Knex.QueryBuilder> {}
406
411
  interface AliasDict extends Dict<string> {}
407
412
 
408
- type ColumnDescriptor<TRecord, TResult> =
413
+ type ColumnDescriptor<TRecord extends {}, TResult> =
409
414
  | string
410
415
  | Knex.Raw
411
416
  | Knex.QueryBuilder<TRecord, TResult>
@@ -452,7 +457,7 @@ export declare namespace Knex {
452
457
  ? TCompositeTableType[TScope]
453
458
  : TCompositeTableType;
454
459
 
455
- interface OnConflictQueryBuilder<TRecord, TResult> {
460
+ interface OnConflictQueryBuilder<TRecord extends {}, TResult> {
456
461
  ignore(): QueryBuilder<TRecord, TResult>;
457
462
  merge(mergeColumns?: (keyof TRecord)[]): QueryBuilder<TRecord, TResult>;
458
463
  merge(data?: Extract<DbRecord<ResolveTableType<TRecord, 'update'>>, object>): QueryBuilder<TRecord, TResult>;
@@ -1026,7 +1031,7 @@ export declare namespace Knex {
1026
1031
  truncate(): QueryBuilder<TRecord, void>;
1027
1032
  }
1028
1033
 
1029
- interface As<TRecord, TResult> {
1034
+ interface As<TRecord extends {}, TResult> {
1030
1035
  (columnName: keyof TRecord): QueryBuilder<TRecord, TResult>;
1031
1036
  (columnName: string): QueryBuilder<TRecord, TResult>;
1032
1037
  }
@@ -1042,7 +1047,7 @@ export declare namespace Knex {
1042
1047
  Dict,
1043
1048
  {}
1044
1049
  >
1045
- >;
1050
+ > & {}; // filters out `null` and `undefined`
1046
1051
 
1047
1052
  interface AliasQueryBuilder<TRecord extends {} = any, TResult = unknown[]> {
1048
1053
  <
@@ -1099,11 +1104,11 @@ export declare namespace Knex {
1099
1104
  ColumnNameQueryBuilder<TRecord, TResult> {
1100
1105
  (): QueryBuilder<TRecord, TResult>;
1101
1106
 
1102
- <TResult2 = ArrayIfAlready<TResult, any>, TInnerRecord = any, TInnerResult = any>(
1107
+ <TResult2 = ArrayIfAlready<TResult, any>, TInnerRecord extends {} = any, TInnerResult = any>(
1103
1108
  ...subQueryBuilders: readonly QueryBuilder<TInnerRecord, TInnerResult>[]
1104
1109
  ): QueryBuilder<TRecord, TResult2>;
1105
1110
 
1106
- <TResult2 = ArrayIfAlready<TResult, any>, TInnerRecord = any, TInnerResult = any>(
1111
+ <TResult2 = ArrayIfAlready<TResult, any>, TInnerRecord extends {} = any, TInnerResult = any>(
1107
1112
  subQueryBuilders: readonly QueryBuilder<TInnerRecord, TInnerResult>[]
1108
1113
  ): QueryBuilder<TRecord, TResult2>;
1109
1114
  }
@@ -1115,53 +1120,53 @@ export declare namespace Knex {
1115
1120
  singleValue?: boolean;
1116
1121
  }
1117
1122
 
1118
- interface JsonExtract<TRecord extends {} = any, TResult extends {} = any> {
1123
+ interface JsonExtract<TRecord extends {} = any, TResult = any> {
1119
1124
  (column: string | Raw | QueryBuilder, path: string, alias?: string, singleValue?: boolean): QueryBuilder<TRecord, TResult>;
1120
1125
  (column: JsonExtraction[] | any[][], singleValue?: boolean): QueryBuilder<TRecord, TResult>;
1121
1126
  }
1122
1127
 
1123
- interface JsonSet<TRecord extends {} = any, TResult extends {} = any> {
1128
+ interface JsonSet<TRecord extends {} = any, TResult = any> {
1124
1129
  (column: string | Raw | QueryBuilder, path: string, value: any, alias?: string): QueryBuilder<TRecord, TResult>;
1125
1130
  }
1126
1131
 
1127
- interface JsonInsert<TRecord extends {} = any, TResult extends {} = any> {
1132
+ interface JsonInsert<TRecord extends {} = any, TResult = any> {
1128
1133
  (column: string | Raw | QueryBuilder, path: string, value: any, alias?: string): QueryBuilder<TRecord, TResult>;
1129
1134
  }
1130
1135
 
1131
- interface JsonRemove<TRecord extends {} = any, TResult extends {} = any> {
1136
+ interface JsonRemove<TRecord extends {} = any, TResult = any> {
1132
1137
  (column: string | Raw | QueryBuilder, path: string, alias?: string): QueryBuilder<TRecord, TResult>;
1133
1138
  }
1134
1139
 
1135
- interface HintComment<TRecord extends {} = any, TResult extends {} = any> {
1140
+ interface HintComment<TRecord extends {} = any, TResult = any> {
1136
1141
  (hint: string): QueryBuilder<TRecord, TResult>;
1137
1142
  (hints: readonly string[]): QueryBuilder<TRecord, TResult>;
1138
1143
  }
1139
1144
 
1140
- interface Table<TRecord extends {} = any, TResult extends {} = any> {
1145
+ interface Table<TRecord extends {} = any, TResult = any> {
1141
1146
  <
1142
1147
  TTable extends TableNames,
1143
- TRecord2 = TableType<TTable>,
1148
+ TRecord2 extends {} = TableType<TTable>,
1144
1149
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, ResolveTableType<TRecord2>>
1145
1150
  >(
1146
1151
  tableName: TTable,
1147
1152
  options?: TableOptions
1148
1153
  ): QueryBuilder<TRecord2, TResult2>;
1149
1154
  <
1150
- TRecord2 = unknown,
1155
+ TRecord2 extends {} = {},
1151
1156
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
1152
1157
  >(
1153
1158
  tableName: TableDescriptor | AliasDict,
1154
1159
  options?: TableOptions
1155
1160
  ): QueryBuilder<TRecord2, TResult2>;
1156
1161
  <
1157
- TRecord2 = unknown,
1162
+ TRecord2 extends {} = {},
1158
1163
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
1159
1164
  >(
1160
1165
  callback: Function,
1161
1166
  options?: TableOptions
1162
1167
  ): QueryBuilder<TRecord2, TResult2>;
1163
1168
  <
1164
- TRecord2 = unknown,
1169
+ TRecord2 extends {} = {},
1165
1170
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
1166
1171
  >(
1167
1172
  raw: Raw,
@@ -1199,7 +1204,7 @@ export declare namespace Knex {
1199
1204
  ): QueryBuilder<TRecord2, TResult2>;
1200
1205
  <
1201
1206
  TTable extends TableNames,
1202
- TRecord2 = ResolveTableType<TRecord> &
1207
+ TRecord2 extends {} = ResolveTableType<TRecord> &
1203
1208
  ResolveTableType<TableType<TTable>>,
1204
1209
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
1205
1210
  >(
@@ -1236,7 +1241,7 @@ export declare namespace Knex {
1236
1241
  TKey1 extends StrKey<ResolveTableType<TableType<TTable1>>> & StrKey<TRecord1>,
1237
1242
  TKey2 extends StrKey<ResolveTableType<TableType<TTable2>>>,
1238
1243
  TRecord1 = ResolveTableType<TRecord>,
1239
- TRecord2 = TRecord1 & ResolveTableType<TableType<TTable2>>,
1244
+ TRecord2 extends {} = TRecord1 & ResolveTableType<TableType<TTable2>>,
1240
1245
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
1241
1246
  >(
1242
1247
  tableName: TTable2,
@@ -1249,7 +1254,7 @@ export declare namespace Knex {
1249
1254
  TKey1 extends StrKey<ResolveTableType<TableType<TTable1>>> & StrKey<TRecord1>,
1250
1255
  TKey2 extends StrKey<ResolveTableType<TableType<TTable2>>>,
1251
1256
  TRecord1 = ResolveTableType<TRecord>,
1252
- TRecord2 = TRecord1 & ResolveTableType<TableType<TTable2>>,
1257
+ TRecord2 extends {} = TRecord1 & ResolveTableType<TableType<TTable2>>,
1253
1258
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
1254
1259
  >(
1255
1260
  tableName: TTable2,
@@ -1280,7 +1285,7 @@ export declare namespace Knex {
1280
1285
  TKey1 extends StrKey<ResolveTableType<TableType<TTable1>>> & StrKey<TRecord1>,
1281
1286
  TKey2 extends StrKey<ResolveTableType<TableType<TTable2>>>,
1282
1287
  TRecord1 = ResolveTableType<TRecord>,
1283
- TRecord2 = TRecord1 & ResolveTableType<TableType<TTable2>>,
1288
+ TRecord2 extends {} = TRecord1 & ResolveTableType<TableType<TTable2>>,
1284
1289
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
1285
1290
  >(
1286
1291
  tableName: TTable2,
@@ -1294,7 +1299,7 @@ export declare namespace Knex {
1294
1299
  TKey1 extends StrKey<ResolveTableType<TableType<TTable1>>> & StrKey<TRecord1>,
1295
1300
  TKey2 extends StrKey<ResolveTableType<TableType<TTable2>>>,
1296
1301
  TRecord1 = ResolveTableType<TRecord>,
1297
- TRecord2 = TRecord1 & ResolveTableType<TableType<TTable2>>,
1302
+ TRecord2 extends {} = TRecord1 & ResolveTableType<TableType<TTable2>>,
1298
1303
  TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
1299
1304
  >(
1300
1305
  tableName: TTable2,
@@ -1371,22 +1376,22 @@ export declare namespace Knex {
1371
1376
  type(type: string): JoinClause;
1372
1377
  }
1373
1378
 
1374
- interface JoinRaw<TRecord = any, TResult = unknown[]> {
1379
+ interface JoinRaw<TRecord extends {} = any, TResult = unknown[]> {
1375
1380
  (tableName: string, binding?: Value | Value[] | ValueDict): QueryBuilder<
1376
1381
  TRecord,
1377
1382
  TResult
1378
1383
  >;
1379
1384
  }
1380
1385
 
1381
- interface Using<TRecord = any, TResult = unknown[]> {
1386
+ interface Using<TRecord extends {} = any, TResult = unknown[]> {
1382
1387
  (tables: string[]): QueryBuilder<TRecord, TResult>;
1383
1388
  }
1384
1389
 
1385
- interface With<TRecord = any, TResult = unknown[]>
1390
+ interface With<TRecord extends {} = any, TResult = unknown[]>
1386
1391
  extends WithRaw<TRecord, TResult>,
1387
1392
  WithWrapped<TRecord, TResult> {}
1388
1393
 
1389
- interface WithRaw<TRecord = any, TResult = unknown[]> {
1394
+ interface WithRaw<TRecord extends {} = any, TResult = unknown[]> {
1390
1395
  (alias: string, raw: Raw | QueryBuilder): QueryBuilder<TRecord, TResult>;
1391
1396
  (alias: string, sql: string, bindings?: readonly Value[] | Object): QueryBuilder<
1392
1397
  TRecord,
@@ -1399,11 +1404,11 @@ export declare namespace Knex {
1399
1404
  >;
1400
1405
  }
1401
1406
 
1402
- interface WithSchema<TRecord = any, TResult = unknown[]> {
1407
+ interface WithSchema<TRecord extends {} = any, TResult = unknown[]> {
1403
1408
  (schema: string): QueryBuilder<TRecord, TResult>;
1404
1409
  }
1405
1410
 
1406
- interface WithWrapped<TRecord = any, TResult = unknown[]> {
1411
+ interface WithWrapped<TRecord extends {} = any, TResult = unknown[]> {
1407
1412
  (alias: string, queryBuilder: QueryBuilder): QueryBuilder<TRecord, TResult>;
1408
1413
  (
1409
1414
  alias: string,
@@ -1417,7 +1422,7 @@ export declare namespace Knex {
1417
1422
  ): QueryBuilder<TRecord, TResult>;
1418
1423
  }
1419
1424
 
1420
- interface Where<TRecord = any, TResult = unknown>
1425
+ interface Where<TRecord extends {} = any, TResult = unknown>
1421
1426
  extends WhereRaw<TRecord, TResult>,
1422
1427
  WhereWrapped<TRecord, TResult>,
1423
1428
  WhereNull<TRecord, TResult> {
@@ -1447,13 +1452,13 @@ export declare namespace Knex {
1447
1452
  TResult
1448
1453
  >;
1449
1454
 
1450
- <T extends keyof ResolveTableType<TRecord>, TRecordInner, TResultInner>(
1455
+ <T extends keyof ResolveTableType<TRecord>, TRecordInner extends {}, TResultInner>(
1451
1456
  columnName: T,
1452
1457
  operator: ComparisonOperator,
1453
1458
  value: QueryBuilder<TRecordInner, TResultInner>
1454
1459
  ): QueryBuilder<TRecord, TResult>;
1455
1460
 
1456
- <TRecordInner, TResultInner>(
1461
+ <TRecordInner extends {}, TResultInner>(
1457
1462
  columnName: string,
1458
1463
  operator: string,
1459
1464
  value: QueryBuilder<TRecordInner, TResultInner>
@@ -1464,28 +1469,28 @@ export declare namespace Knex {
1464
1469
  TResult
1465
1470
  >;
1466
1471
 
1467
- <TRecordInner, TResultInner>(
1472
+ <TRecordInner extends {}, TResultInner>(
1468
1473
  left: Raw,
1469
1474
  operator: string,
1470
1475
  right: QueryBuilder<TRecordInner, TResultInner>
1471
1476
  ): QueryBuilder<TRecord, TResult>;
1472
1477
  }
1473
1478
 
1474
- interface WhereRaw<TRecord = any, TResult = unknown[]>
1479
+ interface WhereRaw<TRecord extends {} = any, TResult = unknown[]>
1475
1480
  extends RawQueryBuilder<TRecord, TResult> {
1476
1481
  (condition: boolean): QueryBuilder<TRecord, TResult>;
1477
1482
  }
1478
1483
 
1479
- interface WhereWrapped<TRecord = any, TResult = unknown[]> {
1484
+ interface WhereWrapped<TRecord extends {} = any, TResult = unknown[]> {
1480
1485
  (callback: QueryCallback<TRecord, TResult>): QueryBuilder<TRecord, TResult>;
1481
1486
  }
1482
1487
 
1483
- interface WhereNull<TRecord = any, TResult = unknown[]> {
1488
+ interface WhereNull<TRecord extends {} = any, TResult = unknown[]> {
1484
1489
  (columnName: keyof TRecord): QueryBuilder<TRecord, TResult>;
1485
1490
  (columnName: string): QueryBuilder<TRecord, TResult>;
1486
1491
  }
1487
1492
 
1488
- interface WhereBetween<TRecord = any, TResult = unknown[]> {
1493
+ interface WhereBetween<TRecord extends {} = any, TResult = unknown[]> {
1489
1494
  <K extends keyof TRecord>(
1490
1495
  columnName: K,
1491
1496
  range: readonly [DbColumn<TRecord[K]>, DbColumn<TRecord[K]>]
@@ -1493,22 +1498,22 @@ export declare namespace Knex {
1493
1498
  (columnName: string, range: readonly [Value, Value]): QueryBuilder<TRecord, TResult>;
1494
1499
  }
1495
1500
 
1496
- interface WhereExists<TRecord = any, TResult = unknown[]> {
1501
+ interface WhereExists<TRecord extends {} = any, TResult = unknown[]> {
1497
1502
  (callback: QueryCallback<TRecord, TResult>): QueryBuilder<TRecord, TResult>;
1498
- <TRecordInner, TResultInner>(
1503
+ <TRecordInner extends {}, TResultInner>(
1499
1504
  query: QueryBuilder<TRecordInner, TResultInner>
1500
1505
  ): QueryBuilder<TRecord, TResult>;
1501
1506
  }
1502
1507
 
1503
- interface WhereJsonObject<TRecord = any, TResult = unknown[]> {
1508
+ interface WhereJsonObject<TRecord extends {} = any, TResult = unknown[]> {
1504
1509
  (columnName: keyof TRecord, value: any): QueryBuilder<TRecord, TResult>;
1505
1510
  }
1506
1511
 
1507
- interface WhereJsonPath<TRecord = any, TResult = unknown[]> {
1512
+ interface WhereJsonPath<TRecord extends {} = any, TResult = unknown[]> {
1508
1513
  (columnName: keyof TRecord, jsonPath: string, operator: string, value: any): QueryBuilder<TRecord, TResult>;
1509
1514
  }
1510
1515
 
1511
- interface WhereIn<TRecord = any, TResult = unknown[]> {
1516
+ interface WhereIn<TRecord extends {} = any, TResult = unknown[]> {
1512
1517
  <K extends keyof ResolveTableType<TRecord>>(
1513
1518
  columnName: K,
1514
1519
  values: readonly DbColumn<ResolveTableType<TRecord>[K]>[] | QueryCallback
@@ -1525,19 +1530,19 @@ export declare namespace Knex {
1525
1530
  TRecord,
1526
1531
  TResult
1527
1532
  >;
1528
- <K extends keyof TRecord, TRecordInner, TResultInner>(
1533
+ <K extends keyof TRecord, TRecordInner extends {}, TResultInner>(
1529
1534
  columnName: K,
1530
1535
  values: QueryBuilder<TRecordInner, TRecord[K]>
1531
1536
  ): QueryBuilder<TRecord, TResult>;
1532
- <TRecordInner, TResultInner>(
1537
+ <TRecordInner extends {}, TResultInner>(
1533
1538
  columnName: string,
1534
1539
  values: Value[] | QueryBuilder<TRecordInner, TResultInner>
1535
1540
  ): QueryBuilder<TRecord, TResult>;
1536
- <K extends keyof TRecord, TRecordInner, TResultInner>(
1541
+ <K extends keyof TRecord, TRecordInner extends {}, TResultInner>(
1537
1542
  columnNames: readonly K[],
1538
1543
  values: QueryBuilder<TRecordInner, TRecord[K]>
1539
1544
  ): QueryBuilder<TRecord, TResult>;
1540
- <TRecordInner, TResultInner>(
1545
+ <TRecordInner extends {}, TResultInner>(
1541
1546
  columnNames: readonly string[],
1542
1547
  values: QueryBuilder<TRecordInner, TResultInner>
1543
1548
  ): QueryBuilder<TRecord, TResult>;
@@ -1547,7 +1552,7 @@ export declare namespace Knex {
1547
1552
  // by extracting out a common base interface will not work because order of overloads
1548
1553
  // is significant.
1549
1554
 
1550
- interface AsymmetricAggregation<TRecord = any, TResult = unknown[], TValue = any> {
1555
+ interface AsymmetricAggregation<TRecord extends {} = any, TResult = unknown[], TValue = any> {
1551
1556
  <
1552
1557
  TOptions extends { "as": string },
1553
1558
  TResult2 = AggregationQueryResult<TResult, {[k in TOptions["as"]]: TValue}>
@@ -1567,7 +1572,7 @@ export declare namespace Knex {
1567
1572
  ): QueryBuilder<TRecord, TResult2>;
1568
1573
  }
1569
1574
 
1570
- interface TypePreservingAggregation<TRecord = any, TResult = unknown[], TValue = any> {
1575
+ interface TypePreservingAggregation<TRecord extends {} = any, TResult = unknown[], TValue = any> {
1571
1576
  <
1572
1577
  TKey extends keyof ResolveTableType<TRecord>,
1573
1578
  TOptions extends { "as": string },
@@ -1599,7 +1604,7 @@ export declare namespace Knex {
1599
1604
  ): QueryBuilder<TRecord, TResult2>;
1600
1605
  }
1601
1606
 
1602
- interface AnalyticFunction<TRecord = any, TResult = unknown[]> {
1607
+ interface AnalyticFunction<TRecord extends {} = any, TResult = unknown[]> {
1603
1608
  <
1604
1609
  TAlias extends string,
1605
1610
  TResult2 = AggregationQueryResult<TResult, {[x in TAlias]: number}>
@@ -1617,11 +1622,11 @@ export declare namespace Knex {
1617
1622
  >;
1618
1623
  }
1619
1624
 
1620
- interface GroupBy<TRecord = any, TResult = unknown[]>
1625
+ interface GroupBy<TRecord extends {} = any, TResult = unknown[]>
1621
1626
  extends RawQueryBuilder<TRecord, TResult>,
1622
1627
  ColumnNameQueryBuilder<TRecord, TResult> {}
1623
1628
 
1624
- interface OrderBy<TRecord = any, TResult = unknown[]> {
1629
+ interface OrderBy<TRecord extends {} = any, TResult = unknown[]> {
1625
1630
  (columnName: keyof TRecord | QueryBuilder, order?: 'asc' | 'desc', nulls?: 'first' | 'last'): QueryBuilder<
1626
1631
  TRecord,
1627
1632
  TResult
@@ -1645,10 +1650,10 @@ export declare namespace Knex {
1645
1650
  ): QueryBuilder<TRecord, TResult>;
1646
1651
  }
1647
1652
 
1648
- interface PartitionBy<TRecord = any, TResult = unknown[]>
1653
+ interface PartitionBy<TRecord extends {} = any, TResult = unknown[]>
1649
1654
  extends OrderBy<TRecord, TResult> {}
1650
1655
 
1651
- interface Intersect<TRecord = any, TResult = unknown[]> {
1656
+ interface Intersect<TRecord extends {} = any, TResult = unknown[]> {
1652
1657
  (
1653
1658
  callback: MaybeArray<QueryCallback | QueryBuilder<TRecord> | Raw>,
1654
1659
  wrap?: boolean
@@ -1658,10 +1663,10 @@ export declare namespace Knex {
1658
1663
  ): QueryBuilder<TRecord, TResult>;
1659
1664
  }
1660
1665
 
1661
- interface Union<TRecord = any, TResult = unknown[]>
1666
+ interface Union<TRecord extends {} = any, TResult = unknown[]>
1662
1667
  extends Intersect<TRecord, TResult> {}
1663
1668
 
1664
- interface Having<TRecord = any, TResult = unknown[]>
1669
+ interface Having<TRecord extends {} = any, TResult = unknown[]>
1665
1670
  extends WhereWrapped<TRecord, TResult> {
1666
1671
  <K extends keyof TRecord>(
1667
1672
  column: K,
@@ -1681,7 +1686,7 @@ export declare namespace Knex {
1681
1686
  >;
1682
1687
  }
1683
1688
 
1684
- interface HavingRange<TRecord = any, TResult = unknown[]> {
1689
+ interface HavingRange<TRecord extends {} = any, TResult = unknown[]> {
1685
1690
  <K extends keyof TRecord>(
1686
1691
  columnName: K,
1687
1692
  values: readonly DbColumn<TRecord[K]>[]
@@ -1691,7 +1696,7 @@ export declare namespace Knex {
1691
1696
 
1692
1697
  // commons
1693
1698
 
1694
- interface ColumnNameQueryBuilder<TRecord = any, TResult = unknown[]> {
1699
+ interface ColumnNameQueryBuilder<TRecord extends {} = any, TResult = unknown[]> {
1695
1700
  // When all columns are known to be keys of original record,
1696
1701
  // we can extend our selection by these columns
1697
1702
  (columnName: '*'): QueryBuilder<
@@ -1746,7 +1751,7 @@ export declare namespace Knex {
1746
1751
 
1747
1752
  type RawBinding = Value | QueryBuilder;
1748
1753
 
1749
- interface RawQueryBuilder<TRecord = any, TResult = unknown[]> {
1754
+ interface RawQueryBuilder<TRecord extends {} = any, TResult = unknown[]> {
1750
1755
  <TResult2 = TResult>(
1751
1756
  sql: string,
1752
1757
  bindings?: readonly RawBinding[] | ValueDict | RawBinding
@@ -1834,12 +1839,12 @@ export declare namespace Knex {
1834
1839
  // QueryBuilder
1835
1840
  //
1836
1841
 
1837
- type QueryCallback<TRecord = any, TResult = unknown[]> = (
1842
+ type QueryCallback<TRecord extends {} = any, TResult = unknown[]> = (
1838
1843
  this: QueryBuilder<TRecord, TResult>,
1839
1844
  builder: QueryBuilder<TRecord, TResult>
1840
1845
  ) => void;
1841
1846
 
1842
- type QueryCallbackWithArgs<TRecord = any, TResult = unknown[]> = (
1847
+ type QueryCallbackWithArgs<TRecord extends {} = any, TResult = unknown[]> = (
1843
1848
  this: QueryBuilder<TRecord, TResult>,
1844
1849
  builder: QueryBuilder<TRecord, TResult>,
1845
1850
  ...args: any[]