kysely 0.3.4 → 0.3.9

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.
Files changed (80) hide show
  1. package/.prettierignore +1 -0
  2. package/README.md +9 -0
  3. package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
  4. package/dist/cjs/driver/driver-config.d.ts +6 -0
  5. package/dist/cjs/index.d.ts +11 -0
  6. package/dist/cjs/index.js +1 -0
  7. package/dist/cjs/kysely.d.ts +25 -0
  8. package/dist/cjs/kysely.js +27 -0
  9. package/dist/cjs/operation-node/operation-node-transformer.js +2 -1
  10. package/dist/cjs/operation-node/select-query-node.d.ts +4 -2
  11. package/dist/cjs/operation-node/select-query-node.js +9 -1
  12. package/dist/cjs/parser/filter-parser.d.ts +6 -7
  13. package/dist/cjs/parser/filter-parser.js +10 -19
  14. package/dist/cjs/parser/insert-values-parser.d.ts +9 -1
  15. package/dist/cjs/parser/insert-values-parser.js +9 -5
  16. package/dist/cjs/parser/join-parser.d.ts +2 -2
  17. package/dist/cjs/parser/join-parser.js +1 -1
  18. package/dist/cjs/parser/mutation-parser.d.ts +2 -3
  19. package/dist/cjs/parser/reference-parser.d.ts +8 -3
  20. package/dist/cjs/parser/returning-parser.d.ts +2 -2
  21. package/dist/cjs/parser/select-parser.d.ts +6 -5
  22. package/dist/cjs/parser/select-parser.js +1 -1
  23. package/dist/cjs/parser/table-parser.d.ts +2 -2
  24. package/dist/cjs/parser/value-parser.d.ts +6 -7
  25. package/dist/cjs/parser/value-parser.js +3 -1
  26. package/dist/cjs/parser/with-parser.d.ts +2 -1
  27. package/dist/cjs/query-builder/join-builder.d.ts +9 -9
  28. package/dist/cjs/query-builder/join-builder.js +8 -8
  29. package/dist/cjs/query-builder/query-builder.d.ts +202 -106
  30. package/dist/cjs/query-builder/query-builder.js +44 -25
  31. package/dist/cjs/query-builder/type-utils.d.ts +23 -6
  32. package/dist/cjs/query-compiler/default-query-compiler.js +7 -6
  33. package/dist/cjs/query-creator.d.ts +2 -0
  34. package/dist/cjs/query-creator.js +2 -0
  35. package/dist/cjs/schema/alter-table-builder.d.ts +3 -2
  36. package/dist/cjs/schema/column-definition-builder.d.ts +3 -3
  37. package/dist/cjs/util/generated-placeholder.d.ts +3 -0
  38. package/dist/cjs/util/generated-placeholder.js +11 -0
  39. package/dist/cjs/util/object-utils.d.ts +1 -0
  40. package/dist/cjs/util/object-utils.js +2 -1
  41. package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
  42. package/dist/esm/driver/driver-config.d.ts +6 -0
  43. package/dist/esm/index.d.ts +11 -0
  44. package/dist/esm/index.js +1 -0
  45. package/dist/esm/kysely.d.ts +25 -0
  46. package/dist/esm/kysely.js +27 -0
  47. package/dist/esm/operation-node/operation-node-transformer.js +2 -1
  48. package/dist/esm/operation-node/select-query-node.d.ts +4 -2
  49. package/dist/esm/operation-node/select-query-node.js +9 -1
  50. package/dist/esm/parser/filter-parser.d.ts +6 -7
  51. package/dist/esm/parser/filter-parser.js +5 -14
  52. package/dist/esm/parser/insert-values-parser.d.ts +9 -1
  53. package/dist/esm/parser/insert-values-parser.js +7 -3
  54. package/dist/esm/parser/join-parser.d.ts +2 -2
  55. package/dist/esm/parser/join-parser.js +2 -2
  56. package/dist/esm/parser/mutation-parser.d.ts +2 -3
  57. package/dist/esm/parser/reference-parser.d.ts +8 -3
  58. package/dist/esm/parser/reference-parser.js +1 -1
  59. package/dist/esm/parser/returning-parser.d.ts +2 -2
  60. package/dist/esm/parser/select-parser.d.ts +6 -5
  61. package/dist/esm/parser/select-parser.js +2 -2
  62. package/dist/esm/parser/table-parser.d.ts +2 -2
  63. package/dist/esm/parser/value-parser.d.ts +6 -7
  64. package/dist/esm/parser/value-parser.js +4 -2
  65. package/dist/esm/parser/with-parser.d.ts +2 -1
  66. package/dist/esm/query-builder/join-builder.d.ts +9 -9
  67. package/dist/esm/query-builder/join-builder.js +9 -9
  68. package/dist/esm/query-builder/query-builder.d.ts +202 -106
  69. package/dist/esm/query-builder/query-builder.js +46 -27
  70. package/dist/esm/query-builder/type-utils.d.ts +23 -6
  71. package/dist/esm/query-compiler/default-query-compiler.js +7 -6
  72. package/dist/esm/query-creator.d.ts +2 -0
  73. package/dist/esm/query-creator.js +2 -0
  74. package/dist/esm/schema/alter-table-builder.d.ts +3 -2
  75. package/dist/esm/schema/column-definition-builder.d.ts +3 -3
  76. package/dist/esm/util/generated-placeholder.d.ts +3 -0
  77. package/dist/esm/util/generated-placeholder.js +7 -0
  78. package/dist/esm/util/object-utils.d.ts +1 -0
  79. package/dist/esm/util/object-utils.js +1 -1
  80. package/package.json +2 -2
@@ -36,7 +36,9 @@ export const selectQueryNode = freeze({
36
36
  cloneWithModifier(select, modifier) {
37
37
  return freeze({
38
38
  ...select,
39
- modifier,
39
+ modifiers: select.modifiers
40
+ ? freeze([...select.modifiers, modifier])
41
+ : freeze([modifier]),
40
42
  });
41
43
  },
42
44
  cloneWithOrderByItem(selectNode, item) {
@@ -75,4 +77,10 @@ export const selectQueryNode = freeze({
75
77
  : havingNode.create(filter),
76
78
  });
77
79
  },
80
+ cloneWithDistinct(selectNode) {
81
+ return freeze({
82
+ ...selectNode,
83
+ isDistinct: true,
84
+ });
85
+ },
78
86
  });
@@ -1,14 +1,13 @@
1
1
  import { FilterNode } from '../operation-node/filter-node.js';
2
- import { RawBuilder } from '../raw-builder/raw-builder.js';
3
- import { AnyQueryBuilder, QueryBuilderFactory, RawBuilderFactory } from '../query-builder/type-utils.js';
2
+ import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../query-builder/type-utils.js';
4
3
  import { Operator } from '../operation-node/operator-node.js';
5
4
  import { ReferenceExpression } from './reference-parser.js';
6
5
  import { JoinBuilder } from '../query-builder/join-builder.js';
7
6
  import { FilterExpressionNode } from '../operation-node/operation-node-utils.js';
8
- export declare type ExistsFilterArg<DB, TB extends keyof DB> = AnyQueryBuilder | QueryBuilderFactory<DB, TB> | RawBuilder<any> | RawBuilderFactory<DB, TB>;
9
- export declare type FilterOperatorArg = Operator | RawBuilder<any>;
7
+ export declare type ExistsExpression<DB, TB extends keyof DB> = AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
8
+ export declare type FilterOperator = Operator | AnyRawBuilder;
10
9
  export declare type FilterType = 'Where' | 'On' | 'Having';
11
- export declare function parseFilterArgs(filterType: FilterType, args: any[]): FilterExpressionNode;
12
- export declare function parseReferenceFilterArgs(lhs: ReferenceExpression<any, any>, op: FilterOperatorArg, rhs: ReferenceExpression<any, any>): FilterNode;
13
- export declare function parseExistsFilterArgs(type: 'exists' | 'not exists', arg: ExistsFilterArg<any, any>): FilterNode;
10
+ export declare function parseFilter(filterType: FilterType, args: any[]): FilterExpressionNode;
11
+ export declare function parseReferenceFilter(lhs: ReferenceExpression<any, any>, op: FilterOperator, rhs: ReferenceExpression<any, any>): FilterNode;
12
+ export declare function parseExistExpression(type: 'exists' | 'not exists', arg: ExistsExpression<any, any>): FilterNode;
14
13
  export declare function createEmptyJoinBuilder(): JoinBuilder<any, any>;
@@ -12,12 +12,12 @@ import { createEmptySelectQuery } from '../query-builder/query-builder.js';
12
12
  import { JoinBuilder } from '../query-builder/join-builder.js';
13
13
  import { parseTableExpression } from './table-parser.js';
14
14
  import { joinNode } from '../operation-node/join-node.js';
15
- import { valueNode } from '../index.js';
16
- export function parseFilterArgs(filterType, args) {
15
+ import { valueNode } from '../operation-node/value-node.js';
16
+ export function parseFilter(filterType, args) {
17
17
  if (args.length === 3) {
18
18
  return parseThreeArgFilter(args[0], args[1], args[2]);
19
19
  }
20
- else if (args.length === 1) {
20
+ else if (args.length === 1 && isFunction(args[0])) {
21
21
  if (filterType === 'Where') {
22
22
  return parseWhereGrouper(args[0]);
23
23
  }
@@ -32,10 +32,10 @@ export function parseFilterArgs(filterType, args) {
32
32
  throw new Error(`invalid arguments passed to a filter method ${JSON.stringify(args)}`);
33
33
  }
34
34
  }
35
- export function parseReferenceFilterArgs(lhs, op, rhs) {
35
+ export function parseReferenceFilter(lhs, op, rhs) {
36
36
  return filterNode.create(parseReferenceExpression(lhs), parseFilterOperator(op), parseReferenceExpression(rhs));
37
37
  }
38
- export function parseExistsFilterArgs(type, arg) {
38
+ export function parseExistExpression(type, arg) {
39
39
  const node = isFunction(arg)
40
40
  ? arg(new SubQueryBuilder()).toOperationNode()
41
41
  : arg.toOperationNode();
@@ -66,9 +66,6 @@ function parseFilterOperator(op) {
66
66
  throw new Error(`invalid comparison operator ${JSON.stringify(op)} passed to a filter method`);
67
67
  }
68
68
  function parseWhereGrouper(grouper) {
69
- if (!isFunction(grouper)) {
70
- throw new Error(`invalid call to queryBuilder.where: ${JSON.stringify(grouper)}`);
71
- }
72
69
  const query = grouper(createEmptySelectQuery());
73
70
  const queryNode = query.toOperationNode();
74
71
  if (!queryNode.where) {
@@ -77,9 +74,6 @@ function parseWhereGrouper(grouper) {
77
74
  return parensNode.create(queryNode.where.where);
78
75
  }
79
76
  function parseHavingGrouper(grouper) {
80
- if (!isFunction(grouper)) {
81
- throw new Error(`invalid call to queryBuilder.having: ${JSON.stringify(grouper)}`);
82
- }
83
77
  const query = grouper(createEmptySelectQuery());
84
78
  const queryNode = query.toOperationNode();
85
79
  if (!queryNode.having) {
@@ -88,9 +82,6 @@ function parseHavingGrouper(grouper) {
88
82
  return parensNode.create(queryNode.having.having);
89
83
  }
90
84
  function parseOnGrouper(grouper) {
91
- if (!isFunction(grouper)) {
92
- throw new Error(`invalid call to joinBuilder.on: ${JSON.stringify(grouper)}`);
93
- }
94
85
  const joinBuilder = grouper(createEmptyJoinBuilder());
95
86
  const joinNode = joinBuilder.toOperationNode();
96
87
  if (!joinNode.on) {
@@ -1,3 +1,11 @@
1
1
  import { ColumnNode } from '../operation-node/column-node.js';
2
2
  import { InsertValuesNode } from '../operation-node/insert-query-node.js';
3
- export declare function parseInsertValuesArgs(args: any): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
3
+ import { AnyQueryBuilder, AnyRawBuilder, GeneratedPlaceholder } from '../query-builder/type-utils.js';
4
+ import { PrimitiveValue } from '../util/object-utils.js';
5
+ export declare type InsertObject<DB, TB extends keyof DB> = {
6
+ [C in keyof DB[TB]]: InsertValueExpression<DB[TB][C]>;
7
+ };
8
+ export declare type InsertObjectOrList<DB, TB extends keyof DB> = InsertObject<DB, TB> | InsertObject<DB, TB>[];
9
+ declare type InsertValueExpression<T extends PrimitiveValue> = T | AnyQueryBuilder | AnyRawBuilder | GeneratedPlaceholder;
10
+ export declare function parseInsertObjectOrList(args: InsertObjectOrList<any, any>): [ReadonlyArray<ColumnNode>, ReadonlyArray<InsertValuesNode>];
11
+ export {};
@@ -1,9 +1,10 @@
1
1
  import { columnNode } from '../operation-node/column-node.js';
2
2
  import { primitiveValueListNode } from '../operation-node/primitive-value-list-node.js';
3
3
  import { valueListNode } from '../operation-node/value-list-node.js';
4
+ import { isGeneratedPlaceholder } from '../util/generated-placeholder.js';
4
5
  import { isPrimitive } from '../util/object-utils.js';
5
6
  import { parseMutationValueExpression, } from './mutation-parser.js';
6
- export function parseInsertValuesArgs(args) {
7
+ export function parseInsertObjectOrList(args) {
7
8
  return parseInsertColumnsAndValues(Array.isArray(args) ? args : [args]);
8
9
  }
9
10
  function parseInsertColumnsAndValues(rows) {
@@ -11,7 +12,8 @@ function parseInsertColumnsAndValues(rows) {
11
12
  const values = [];
12
13
  for (const row of rows) {
13
14
  for (const column of Object.keys(row)) {
14
- if (!columns.includes(column)) {
15
+ const value = row[column];
16
+ if (!columns.includes(column) && !isGeneratedPlaceholder(value)) {
15
17
  columns.push(column);
16
18
  }
17
19
  }
@@ -20,7 +22,9 @@ function parseInsertColumnsAndValues(rows) {
20
22
  const rowValues = columns.map(() => null);
21
23
  for (const column of Object.keys(row)) {
22
24
  const columnIdx = columns.indexOf(column);
23
- rowValues[columnIdx] = row[column];
25
+ if (columnIdx !== -1) {
26
+ rowValues[columnIdx] = row[column];
27
+ }
24
28
  }
25
29
  if (rowValues.every(isPrimitive)) {
26
30
  values.push(primitiveValueListNode.create(rowValues));
@@ -2,6 +2,6 @@ import { JoinNode, JoinType } from '../operation-node/join-node.js';
2
2
  import { AnyColumn, AnyColumnWithTable } from '../query-builder/type-utils.js';
3
3
  import { ExtractAliasFromTableExpression, TableExpressionDatabaseType } from './table-parser.js';
4
4
  import { JoinBuilder } from '../query-builder/join-builder.js';
5
- export declare type JoinReferenceArg<DB, TB extends keyof DB, F> = AnyColumn<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>> | AnyColumnWithTable<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>;
6
- export declare type JoinCallbackArg<DB, TB extends keyof DB, F> = (join: JoinBuilder<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>) => JoinBuilder<any, any>;
5
+ export declare type JoinReferenceExpression<DB, TB extends keyof DB, F> = AnyColumn<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>> | AnyColumnWithTable<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>;
6
+ export declare type JoinCallbackExpression<DB, TB extends keyof DB, F> = (join: JoinBuilder<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>) => JoinBuilder<any, any>;
7
7
  export declare function parseJoinArgs(joinType: JoinType, args: any[]): JoinNode;
@@ -1,6 +1,6 @@
1
1
  import { joinNode } from '../operation-node/join-node.js';
2
2
  import { parseTableExpression, } from './table-parser.js';
3
- import { parseReferenceFilterArgs } from './filter-parser.js';
3
+ import { parseReferenceFilter } from './filter-parser.js';
4
4
  import { JoinBuilder } from '../query-builder/join-builder.js';
5
5
  export function parseJoinArgs(joinType, args) {
6
6
  if (args.length === 2) {
@@ -20,5 +20,5 @@ function parseCallbackJoin(joinType, from, callback) {
20
20
  }
21
21
  function parseSingleOnJoin(joinType, from, lhsColumn, rhsColumn) {
22
22
  const tableNode = parseTableExpression(from);
23
- return joinNode.cloneWithOn(joinNode.create(joinType, tableNode), 'and', parseReferenceFilterArgs(lhsColumn, '=', rhsColumn));
23
+ return joinNode.cloneWithOn(joinNode.create(joinType, tableNode), 'and', parseReferenceFilter(lhsColumn, '=', rhsColumn));
24
24
  }
@@ -1,11 +1,10 @@
1
1
  import { RawNode } from '../operation-node/raw-node.js';
2
2
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
3
3
  import { ValueNode } from '../operation-node/value-node.js';
4
- import { AnyQueryBuilder } from '../query-builder/type-utils.js';
5
- import { RawBuilder } from '../raw-builder/raw-builder.js';
4
+ import { AnyQueryBuilder, AnyRawBuilder } from '../query-builder/type-utils.js';
6
5
  import { PrimitiveValue } from '../util/object-utils.js';
7
6
  export declare type MutationObject<DB, TB extends keyof DB> = {
8
7
  [C in keyof DB[TB]]?: MutationValueExpression<DB[TB][C]>;
9
8
  };
10
- export declare type MutationValueExpression<T extends PrimitiveValue> = T | AnyQueryBuilder | RawBuilder<any>;
9
+ export declare type MutationValueExpression<T extends PrimitiveValue> = T | AnyQueryBuilder | AnyRawBuilder;
11
10
  export declare function parseMutationValueExpression(value: MutationValueExpression<PrimitiveValue>): ValueNode | RawNode | SelectQueryNode;
@@ -2,13 +2,18 @@ import { AliasNode } from '../operation-node/alias-node.js';
2
2
  import { ColumnNode } from '../operation-node/column-node.js';
3
3
  import { ReferenceExpressionNode } from '../operation-node/operation-node-utils.js';
4
4
  import { ReferenceNode } from '../operation-node/reference-node.js';
5
- import { RawBuilder } from '../raw-builder/raw-builder.js';
6
- import { AnyColumn, AnyColumnWithTable, AnyQueryBuilder, QueryBuilderFactory, RawBuilderFactory } from '../query-builder/type-utils.js';
5
+ import { PrimitiveValue } from '../util/object-utils.js';
6
+ import { AnyColumn, AnyColumnWithTable, AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory, RowType, ValueType } from '../query-builder/type-utils.js';
7
7
  import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
8
- export declare type ReferenceExpression<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | RawBuilder<any> | RawBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
8
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
9
+ import { QueryBuilder } from '../query-builder/query-builder.js';
10
+ export declare type ReferenceExpression<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
9
11
  export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReferenceExpression<DB, TB>[];
12
+ export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? ExtractTypeFromStringReference<DB, TB, RE> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends QueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => QueryBuilder<any, any, infer O> ? ValueType<O> : PrimitiveValue;
13
+ declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, S extends string, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : S extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : S extends keyof R ? R[S] : PrimitiveValue;
10
14
  export declare function parseReferenceExpressionOrList(arg: ReferenceExpressionOrList<any, any>): ReferenceExpressionNode[];
11
15
  export declare function parseReferenceExpression(arg: ReferenceExpression<any, any>): ReferenceExpressionNode;
12
16
  export declare function parseStringReference(str: string): ColumnNode | ReferenceNode;
13
17
  export declare function parseAliasedStringReference(str: string): ColumnNode | ReferenceNode | AliasNode;
14
18
  export declare function parseColumnName(column: AnyColumn<any, any>): ColumnNode;
19
+ export {};
@@ -1,7 +1,7 @@
1
1
  import { aliasNode } from '../operation-node/alias-node.js';
2
2
  import { columnNode } from '../operation-node/column-node.js';
3
3
  import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
4
- import { referenceNode } from '../operation-node/reference-node.js';
4
+ import { referenceNode, } from '../operation-node/reference-node.js';
5
5
  import { tableNode } from '../operation-node/table-node.js';
6
6
  import { isFunction, isString } from '../util/object-utils.js';
7
7
  import { queryNode } from '../operation-node/query-node.js';
@@ -1,7 +1,7 @@
1
1
  import { QueryBuilder } from '../query-builder/query-builder.js';
2
2
  import { DeleteResultTypeTag, InsertResultTypeTag, UpdateResultTypeTag } from '../query-builder/type-utils.js';
3
- import { SelectResultType } from './select-parser.js';
3
+ import { Selection } from './select-parser.js';
4
4
  /**
5
5
  * `returning` method output query builder type
6
6
  */
7
- export declare type QueryBuilderWithReturning<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O extends InsertResultTypeTag ? SelectResultType<DB, TB, S> : O extends DeleteResultTypeTag ? SelectResultType<DB, TB, S> : O extends UpdateResultTypeTag ? SelectResultType<DB, TB, S> : O & SelectResultType<DB, TB, S>>;
7
+ export declare type QueryBuilderWithReturning<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O extends InsertResultTypeTag ? Selection<DB, TB, S> : O extends DeleteResultTypeTag ? Selection<DB, TB, S> : O extends UpdateResultTypeTag ? Selection<DB, TB, S> : O & Selection<DB, TB, S>>;
@@ -1,29 +1,30 @@
1
1
  import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
2
2
  import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
3
3
  import { SelectionNode } from '../operation-node/selection-node.js';
4
- import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedColumn, AnyAliasedColumnWithTable, AnyAliasedQueryBuilder, AnyColumn, AnyColumnWithTable, InsertResultTypeTag, RowType, ValueType } from '../query-builder/type-utils.js';
4
+ import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedColumn, AnyAliasedColumnWithTable, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, AnyColumn, AnyColumnWithTable, InsertResultTypeTag, RowType, ValueType } from '../query-builder/type-utils.js';
5
5
  import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
6
6
  /**
7
7
  * A selection expression.
8
8
  */
9
- export declare type SelectExpression<DB, TB extends keyof DB> = AnyAliasedColumnWithTable<DB, TB> | AnyAliasedColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyColumn<DB, TB> | AliasedRawBuilder<any, any> | AliasedRawBuilderFactory<DB, TB> | AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
9
+ export declare type SelectExpression<DB, TB extends keyof DB> = AnyAliasedColumnWithTable<DB, TB> | AnyAliasedColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyColumn<DB, TB> | AnyAliasedRawBuilder | AliasedRawBuilderFactory<DB, TB> | AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
10
+ export declare type SelectExpressionOrList<DB, TB extends keyof DB> = SelectExpression<DB, TB> | ReadonlyArray<SelectExpression<DB, TB>>;
10
11
  /**
11
12
  * Given a selection expression returns a query builder type that
12
13
  * has the selection.
13
14
  */
14
- export declare type QueryBuilderWithSelection<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O extends InsertResultTypeTag ? InsertResultTypeTag : O & SelectResultType<DB, TB, S>>;
15
+ export declare type QueryBuilderWithSelection<DB, TB extends keyof DB, O, S> = QueryBuilder<DB, TB, O extends InsertResultTypeTag ? InsertResultTypeTag : O & Selection<DB, TB, S>>;
15
16
  /**
16
17
  * `selectAll` output query builder type.
17
18
  */
18
19
  export declare type SelectAllQueryBuilder<DB, TB extends keyof DB, O, S extends keyof DB> = QueryBuilder<DB, TB, O & RowType<DB, S>>;
19
- export declare type SelectResultType<DB, TB extends keyof DB, S> = {
20
+ export declare type Selection<DB, TB extends keyof DB, S> = {
20
21
  [A in ExtractAliasFromSelectExpression<S>]: ExtractTypeFromSelectExpression<DB, TB, S, A>;
21
22
  };
22
23
  declare type ExtractAliasFromSelectExpression<S> = S extends string ? ExtractAliasFromStringSelectExpression<S> : S extends AliasedRawBuilder<any, infer RA> ? RA : S extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : S extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : S extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : S extends DynamicReferenceBuilder<infer RA> ? ExtractAliasFromStringSelectExpression<RA> : never;
23
24
  declare type ExtractAliasFromStringSelectExpression<S extends string> = S extends `${string}.${string}.${string} as ${infer A}` ? A : S extends `${string}.${string} as ${infer A}` ? A : S extends `${string} as ${infer A}` ? A : S extends `${string}.${string}.${infer C}` ? C : S extends `${string}.${infer C}` ? C : S;
24
25
  declare type ExtractTypeFromSelectExpression<DB, TB extends keyof DB, S, A extends keyof any> = S extends string ? ExtractTypeFromStringSelectExpression<DB, TB, S, A> : S extends AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : S extends (qb: any) => AliasedRawBuilder<infer O, infer RA> ? RA extends A ? O : never : S extends AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : S extends (qb: any) => AliasedQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? ValueType<O> : never : S extends DynamicReferenceBuilder<infer RA> ? A extends ExtractAliasFromStringSelectExpression<RA> ? ExtractTypeFromStringSelectExpression<DB, TB, RA, A> | undefined : never : never;
25
26
  declare type ExtractTypeFromStringSelectExpression<DB, TB extends keyof DB, S extends string, A extends keyof any, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C} as ${infer RA}` ? RA extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : S extends `${infer T}.${infer C} as ${infer RA}` ? RA extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : S extends `${infer C} as ${infer RA}` ? RA extends A ? C extends keyof R ? R[C] : never : never : S extends `${infer SC}.${infer T}.${infer C}` ? C extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : S extends `${infer T}.${infer C}` ? C extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : S extends A ? S extends keyof R ? R[S] : never : never;
26
- export declare function parseSelectExpressionOrList(selection: SelectExpression<any, any> | SelectExpression<any, any>[]): SelectionNode[];
27
+ export declare function parseSelectExpressionOrList(selection: SelectExpressionOrList<any, any>): SelectionNode[];
27
28
  export declare function parseSelectAllArgs(table?: string | string[]): SelectionNode[];
28
29
  export declare function parseSelectAllArg(table: string): SelectionNode;
29
30
  export {};
@@ -1,10 +1,10 @@
1
1
  import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
2
- import { isFunction, isString } from '../util/object-utils.js';
2
+ import { isFunction, isReadonlyArray, isString } from '../util/object-utils.js';
3
3
  import { selectionNode, } from '../operation-node/selection-node.js';
4
4
  import { parseAliasedStringReference } from './reference-parser.js';
5
5
  import { SubQueryBuilder } from '../query-builder/sub-query-builder.js';
6
6
  export function parseSelectExpressionOrList(selection) {
7
- if (Array.isArray(selection)) {
7
+ if (isReadonlyArray(selection)) {
8
8
  return selection.map((it) => parseSelectExpression(it));
9
9
  }
10
10
  else {
@@ -1,10 +1,10 @@
1
1
  import { AliasedQueryBuilder, QueryBuilder } from '../query-builder/query-builder.js';
2
2
  import { TableNode } from '../operation-node/table-node.js';
3
- import { AliasedQueryBuilderFactory, AnyAliasedQueryBuilder } from '../query-builder/type-utils.js';
3
+ import { AliasedQueryBuilderFactory, AnyAliasedQueryBuilder, AnyAliasedRawBuilder } from '../query-builder/type-utils.js';
4
4
  import { AliasedRawBuilder } from '../raw-builder/raw-builder.js';
5
5
  import { TableExpressionNode } from '../operation-node/operation-node-utils.js';
6
6
  export declare type TableExpression<DB, TB extends keyof DB> = TableReference<DB> | AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB>;
7
- export declare type TableReference<DB> = AnyAliasedTable<DB, any, any> | AnyTable<DB> | AliasedRawBuilder<any, any>;
7
+ export declare type TableReference<DB> = AnyAliasedTable<DB, any, any> | AnyTable<DB> | AnyAliasedRawBuilder;
8
8
  export declare type QueryBuilderWithTable<DB, TB extends keyof DB, O, TE> = QueryBuilder<TableExpressionDatabaseType<DB, TE>, TB | ExtractAliasFromTableExpression<DB, TE>, O>;
9
9
  export declare type TableExpressionDatabaseType<DB, TE> = DB extends ExtractDatabaseTypeFromTableExpression<DB, TE> ? DB : DB & ExtractDatabaseTypeFromTableExpression<DB, TE>;
10
10
  export declare type ExtractAliasFromTableExpression<DB, TE> = TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : TE extends AliasedQueryBuilder<any, any, any, infer QA> ? QA : TE extends (qb: any) => AliasedQueryBuilder<any, any, any, infer QA> ? QA : TE extends (qb: any) => AliasedRawBuilder<any, infer RA> ? RA : never;
@@ -1,8 +1,7 @@
1
1
  import { ValueExpressionNode } from '../operation-node/operation-node-utils.js';
2
- import { PrimitiveValue } from '../util/object-utils.js';
3
- import { AnyQueryBuilder, QueryBuilderFactory, RawBuilderFactory } from '../query-builder/type-utils.js';
4
- import { RawBuilder } from '../raw-builder/raw-builder.js';
5
- export declare type ValueExpression<DB, TB extends keyof DB> = PrimitiveValue | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | RawBuilder<any> | RawBuilderFactory<DB, TB>;
6
- export declare type ValueExpressionOrList<DB, TB extends keyof DB> = ValueExpression<DB, TB> | ValueExpression<DB, TB>[];
7
- export declare function parseValueExpressionOrList(arg: ValueExpressionOrList<any, any>): ValueExpressionNode;
8
- export declare function parseValueExpression(arg: ValueExpression<any, any>): ValueExpressionNode;
2
+ import { AnyQueryBuilder, AnyRawBuilder, QueryBuilderFactory, RawBuilderFactory } from '../query-builder/type-utils.js';
3
+ import { ExtractTypeFromReferenceExpression } from './reference-parser.js';
4
+ export declare type ValueExpression<DB, TB extends keyof DB, RE> = ExtractTypeFromReferenceExpression<DB, TB, RE> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB>;
5
+ export declare type ValueExpressionOrList<DB, TB extends keyof DB, RE> = ValueExpression<DB, TB, RE> | ValueExpression<DB, TB, RE>[];
6
+ export declare function parseValueExpressionOrList(arg: ValueExpressionOrList<any, any, any>): ValueExpressionNode;
7
+ export declare function parseValueExpression(arg: ValueExpression<any, any, any>): ValueExpressionNode;
@@ -3,9 +3,11 @@ import { isOperationNodeSource } from '../operation-node/operation-node-source.j
3
3
  import { primitiveValueListNode, } from '../operation-node/primitive-value-list-node.js';
4
4
  import { valueListNode, } from '../operation-node/value-list-node.js';
5
5
  import { valueNode } from '../operation-node/value-node.js';
6
- import { isFunction, isPrimitive, } from '../util/object-utils.js';
6
+ import { isFunction, isPrimitive } from '../util/object-utils.js';
7
7
  import { queryNode } from '../operation-node/query-node.js';
8
8
  import { SubQueryBuilder } from '../query-builder/sub-query-builder.js';
9
+ import { rawNode } from '../operation-node/raw-node.js';
10
+ import { selectQueryNode } from '../operation-node/select-query-node.js';
9
11
  export function parseValueExpressionOrList(arg) {
10
12
  if (Array.isArray(arg)) {
11
13
  return parseValueExpressionList(arg);
@@ -20,7 +22,7 @@ export function parseValueExpression(arg) {
20
22
  }
21
23
  else if (isOperationNodeSource(arg)) {
22
24
  const node = arg.toOperationNode();
23
- if (!queryNode.isMutating(node)) {
25
+ if (rawNode.is(node) || selectQueryNode.is(node)) {
24
26
  return node;
25
27
  }
26
28
  }
@@ -2,7 +2,8 @@ import { CommonTableExpressionNode } from '../operation-node/common-table-expres
2
2
  import { QueryBuilder } from '../query-builder/query-builder.js';
3
3
  import { QueryCreator } from '../query-creator.js';
4
4
  import { RawBuilder } from '../raw-builder/raw-builder.js';
5
- export declare type CommonTableExpression<DB> = (creator: QueryCreator<DB>) => QueryBuilder<DB, any> | RawBuilder<any>;
5
+ import { AnyRawBuilder } from '../query-builder/type-utils.js';
6
+ export declare type CommonTableExpression<DB> = (creator: QueryCreator<DB>) => QueryBuilder<DB, any> | AnyRawBuilder;
6
7
  export declare type QueryCreatorWithCommonTableExpression<DB, N extends string, E extends CommonTableExpression<DB>> = QueryCreator<DB & Record<N, ExtractRowTypeFromCommonTableExpression<E>>>;
7
8
  declare type ExtractRowTypeFromCommonTableExpression<E> = E extends (creator: QueryCreator<any>) => infer Q ? Q extends QueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
8
9
  export declare function parseCommonTableExpression(name: string, expression: CommonTableExpression<any>): CommonTableExpressionNode;
@@ -1,6 +1,6 @@
1
1
  import { JoinNode } from '../operation-node/join-node.js';
2
2
  import { OperationNodeSource } from '../operation-node/operation-node-source.js';
3
- import { ExistsFilterArg, FilterOperatorArg } from '../parser/filter-parser.js';
3
+ import { ExistsExpression, FilterOperator } from '../parser/filter-parser.js';
4
4
  import { ReferenceExpression } from '../parser/reference-parser.js';
5
5
  import { ValueExpressionOrList } from '../parser/value-parser.js';
6
6
  export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNodeSource {
@@ -12,7 +12,7 @@ export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNo
12
12
  *
13
13
  * See {@link QueryBuilder.where} for documentation and examples.
14
14
  */
15
- on(lhs: ReferenceExpression<DB, TB>, op: FilterOperatorArg, rhs: ValueExpressionOrList<DB, TB>): JoinBuilder<DB, TB>;
15
+ on<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: ValueExpressionOrList<DB, TB, RE>): JoinBuilder<DB, TB>;
16
16
  on(grouper: (qb: JoinBuilder<DB, TB>) => JoinBuilder<DB, TB>): JoinBuilder<DB, TB>;
17
17
  /**
18
18
  * Just like {@link QueryBuilder.orWhere} but adds an item to the join's
@@ -20,7 +20,7 @@ export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNo
20
20
  *
21
21
  * See {@link QueryBuilder.orWhere} for documentation and examples.
22
22
  */
23
- orOn(lhs: ReferenceExpression<DB, TB>, op: FilterOperatorArg, rhs: ValueExpressionOrList<DB, TB>): JoinBuilder<DB, TB>;
23
+ orOn<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: FilterOperator, rhs: ValueExpressionOrList<DB, TB, RE>): JoinBuilder<DB, TB>;
24
24
  orOn(grouper: (qb: JoinBuilder<DB, TB>) => JoinBuilder<DB, TB>): JoinBuilder<DB, TB>;
25
25
  /**
26
26
  * Just like {@link QueryBuilder.whereRef} but adds an item to the join's
@@ -28,41 +28,41 @@ export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNo
28
28
  *
29
29
  * See {@link QueryBuilder.whereRef} for documentation and examples.
30
30
  */
31
- onRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperatorArg, rhs: ReferenceExpression<DB, TB>): JoinBuilder<DB, TB>;
31
+ onRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): JoinBuilder<DB, TB>;
32
32
  /**
33
33
  * Just like {@link QueryBuilder.orWhereRef} but adds an item to the join's
34
34
  * `on` clause instead.
35
35
  *
36
36
  * See {@link QueryBuilder.orWhereRef} for documentation and examples.
37
37
  */
38
- orOnRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperatorArg, rhs: ReferenceExpression<DB, TB>): JoinBuilder<DB, TB>;
38
+ orOnRef(lhs: ReferenceExpression<DB, TB>, op: FilterOperator, rhs: ReferenceExpression<DB, TB>): JoinBuilder<DB, TB>;
39
39
  /**
40
40
  * Just like {@link QueryBuilder.whereExists} but adds an item to the join's
41
41
  * `on` clause instead.
42
42
  *
43
43
  * See {@link QueryBuilder.whereExists} for documentation and examples.
44
44
  */
45
- onExists(arg: ExistsFilterArg<DB, TB>): JoinBuilder<DB, TB>;
45
+ onExists(arg: ExistsExpression<DB, TB>): JoinBuilder<DB, TB>;
46
46
  /**
47
47
  * Just like {@link QueryBuilder.whereNotExists} but adds an item to the join's
48
48
  * `on` clause instead.
49
49
  *
50
50
  * See {@link QueryBuilder.whereNotExists} for documentation and examples.
51
51
  */
52
- onNotExists(arg: ExistsFilterArg<DB, TB>): JoinBuilder<DB, TB>;
52
+ onNotExists(arg: ExistsExpression<DB, TB>): JoinBuilder<DB, TB>;
53
53
  /**
54
54
  * Just like {@link QueryBuilder.orWhereExists} but adds an item to the join's
55
55
  * `on` clause instead.
56
56
  *
57
57
  * See {@link QueryBuilder.orWhereExists} for documentation and examples.
58
58
  */
59
- orOnExists(arg: ExistsFilterArg<DB, TB>): JoinBuilder<DB, TB>;
59
+ orOnExists(arg: ExistsExpression<DB, TB>): JoinBuilder<DB, TB>;
60
60
  /**
61
61
  * Just like {@link QueryBuilder.orWhereNotExists} but adds an item to the join's
62
62
  * `on` clause instead.
63
63
  *
64
64
  * See {@link QueryBuilder.orWhereNotExists} for documentation and examples.
65
65
  */
66
- orOnNotExists(arg: ExistsFilterArg<DB, TB>): JoinBuilder<DB, TB>;
66
+ orOnNotExists(arg: ExistsExpression<DB, TB>): JoinBuilder<DB, TB>;
67
67
  toOperationNode(): JoinNode;
68
68
  }
@@ -1,5 +1,5 @@
1
1
  import { joinNode } from '../operation-node/join-node.js';
2
- import { parseExistsFilterArgs, parseFilterArgs, parseReferenceFilterArgs, } from '../parser/filter-parser.js';
2
+ import { parseExistExpression, parseFilter, parseReferenceFilter, } from '../parser/filter-parser.js';
3
3
  import { preventAwait } from '../util/prevent-await.js';
4
4
  export class JoinBuilder {
5
5
  #joinNode;
@@ -7,10 +7,10 @@ export class JoinBuilder {
7
7
  this.#joinNode = joinNode;
8
8
  }
9
9
  on(...args) {
10
- return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'and', parseFilterArgs('On', args)));
10
+ return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'and', parseFilter('On', args)));
11
11
  }
12
12
  orOn(...args) {
13
- return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'or', parseFilterArgs('On', args)));
13
+ return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'or', parseFilter('On', args)));
14
14
  }
15
15
  /**
16
16
  * Just like {@link QueryBuilder.whereRef} but adds an item to the join's
@@ -19,7 +19,7 @@ export class JoinBuilder {
19
19
  * See {@link QueryBuilder.whereRef} for documentation and examples.
20
20
  */
21
21
  onRef(lhs, op, rhs) {
22
- return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'and', parseReferenceFilterArgs(lhs, op, rhs)));
22
+ return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'and', parseReferenceFilter(lhs, op, rhs)));
23
23
  }
24
24
  /**
25
25
  * Just like {@link QueryBuilder.orWhereRef} but adds an item to the join's
@@ -28,7 +28,7 @@ export class JoinBuilder {
28
28
  * See {@link QueryBuilder.orWhereRef} for documentation and examples.
29
29
  */
30
30
  orOnRef(lhs, op, rhs) {
31
- return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'or', parseReferenceFilterArgs(lhs, op, rhs)));
31
+ return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'or', parseReferenceFilter(lhs, op, rhs)));
32
32
  }
33
33
  /**
34
34
  * Just like {@link QueryBuilder.whereExists} but adds an item to the join's
@@ -37,7 +37,7 @@ export class JoinBuilder {
37
37
  * See {@link QueryBuilder.whereExists} for documentation and examples.
38
38
  */
39
39
  onExists(arg) {
40
- return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'and', parseExistsFilterArgs('exists', arg)));
40
+ return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'and', parseExistExpression('exists', arg)));
41
41
  }
42
42
  /**
43
43
  * Just like {@link QueryBuilder.whereNotExists} but adds an item to the join's
@@ -46,7 +46,7 @@ export class JoinBuilder {
46
46
  * See {@link QueryBuilder.whereNotExists} for documentation and examples.
47
47
  */
48
48
  onNotExists(arg) {
49
- return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'and', parseExistsFilterArgs('not exists', arg)));
49
+ return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'and', parseExistExpression('not exists', arg)));
50
50
  }
51
51
  /**
52
52
  * Just like {@link QueryBuilder.orWhereExists} but adds an item to the join's
@@ -55,7 +55,7 @@ export class JoinBuilder {
55
55
  * See {@link QueryBuilder.orWhereExists} for documentation and examples.
56
56
  */
57
57
  orOnExists(arg) {
58
- return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'or', parseExistsFilterArgs('exists', arg)));
58
+ return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'or', parseExistExpression('exists', arg)));
59
59
  }
60
60
  /**
61
61
  * Just like {@link QueryBuilder.orWhereNotExists} but adds an item to the join's
@@ -64,7 +64,7 @@ export class JoinBuilder {
64
64
  * See {@link QueryBuilder.orWhereNotExists} for documentation and examples.
65
65
  */
66
66
  orOnNotExists(arg) {
67
- return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'or', parseExistsFilterArgs('not exists', arg)));
67
+ return new JoinBuilder(joinNode.cloneWithOn(this.#joinNode, 'or', parseExistExpression('not exists', arg)));
68
68
  }
69
69
  toOperationNode() {
70
70
  return this.#joinNode;