kysely 0.7.2 → 0.7.6

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 (122) hide show
  1. package/README.md +9 -5
  2. package/dist/cjs/dialect/dialect-adapter.d.ts +11 -9
  3. package/dist/cjs/index.d.ts +2 -1
  4. package/dist/cjs/index.js +2 -1
  5. package/dist/cjs/kysely.d.ts +2 -2
  6. package/dist/cjs/kysely.js +9 -7
  7. package/dist/cjs/operation-node/create-table-node.d.ts +2 -1
  8. package/dist/cjs/operation-node/create-table-node.js +1 -5
  9. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +12 -1
  10. package/dist/cjs/operation-node/foreign-key-constraint-node.js +6 -0
  11. package/dist/cjs/operation-node/join-node.d.ts +1 -0
  12. package/dist/cjs/operation-node/join-node.js +8 -0
  13. package/dist/cjs/operation-node/operation-node-transformer.js +3 -0
  14. package/dist/cjs/operation-node/references-node.d.ts +5 -3
  15. package/dist/cjs/operation-node/references-node.js +6 -0
  16. package/dist/cjs/operation-node/table-node.js +2 -2
  17. package/dist/cjs/parser/data-type-parser.d.ts +5 -0
  18. package/dist/cjs/parser/data-type-parser.js +11 -0
  19. package/dist/cjs/parser/default-value-parser.d.ts +6 -0
  20. package/dist/cjs/parser/default-value-parser.js +11 -0
  21. package/dist/cjs/parser/filter-parser.d.ts +2 -2
  22. package/dist/cjs/parser/filter-parser.js +34 -36
  23. package/dist/cjs/parser/join-parser.d.ts +1 -1
  24. package/dist/cjs/parser/join-parser.js +9 -11
  25. package/dist/cjs/parser/parse-context.d.ts +33 -6
  26. package/dist/cjs/parser/parse-context.js +40 -33
  27. package/dist/cjs/parser/reference-parser.d.ts +2 -2
  28. package/dist/cjs/parser/reference-parser.js +16 -12
  29. package/dist/cjs/parser/select-parser.d.ts +1 -2
  30. package/dist/cjs/parser/select-parser.js +4 -5
  31. package/dist/cjs/parser/table-parser.js +11 -6
  32. package/dist/cjs/parser/update-set-parser.js +1 -1
  33. package/dist/cjs/parser/value-parser.js +1 -1
  34. package/dist/cjs/query-builder/{sub-query-builder.d.ts → expression-builder.d.ts} +6 -6
  35. package/dist/cjs/query-builder/{sub-query-builder.js → expression-builder.js} +6 -10
  36. package/dist/cjs/query-builder/join-builder.d.ts +2 -2
  37. package/dist/cjs/query-builder/join-builder.js +8 -12
  38. package/dist/cjs/query-builder/query-builder.d.ts +2 -2
  39. package/dist/cjs/query-builder/query-builder.js +34 -36
  40. package/dist/cjs/query-builder/type-utils.d.ts +5 -5
  41. package/dist/cjs/query-compiler/default-query-compiler.js +13 -1
  42. package/dist/cjs/query-creator.d.ts +2 -2
  43. package/dist/cjs/query-creator.js +8 -12
  44. package/dist/cjs/schema/alter-table-builder.d.ts +26 -8
  45. package/dist/cjs/schema/alter-table-builder.js +75 -7
  46. package/dist/cjs/schema/column-definition-builder.d.ts +10 -4
  47. package/dist/cjs/schema/column-definition-builder.js +11 -6
  48. package/dist/cjs/schema/create-index-builder.d.ts +5 -5
  49. package/dist/cjs/schema/create-index-builder.js +19 -28
  50. package/dist/cjs/schema/create-schema-builder.d.ts +5 -5
  51. package/dist/cjs/schema/create-schema-builder.js +9 -13
  52. package/dist/cjs/schema/create-table-builder.d.ts +22 -10
  53. package/dist/cjs/schema/create-table-builder.js +41 -34
  54. package/dist/cjs/schema/drop-index-builder.d.ts +5 -5
  55. package/dist/cjs/schema/drop-index-builder.js +11 -16
  56. package/dist/cjs/schema/drop-schema-builder.d.ts +5 -5
  57. package/dist/cjs/schema/drop-schema-builder.js +9 -13
  58. package/dist/cjs/schema/drop-table-builder.d.ts +5 -5
  59. package/dist/cjs/schema/drop-table-builder.js +9 -13
  60. package/dist/cjs/schema/foreign-key-constraint-builder.d.ts +14 -0
  61. package/dist/cjs/schema/foreign-key-constraint-builder.js +26 -0
  62. package/dist/esm/dialect/dialect-adapter.d.ts +11 -9
  63. package/dist/esm/index.d.ts +2 -1
  64. package/dist/esm/index.js +2 -1
  65. package/dist/esm/kysely.d.ts +2 -2
  66. package/dist/esm/kysely.js +9 -7
  67. package/dist/esm/operation-node/create-table-node.d.ts +2 -1
  68. package/dist/esm/operation-node/create-table-node.js +1 -5
  69. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +12 -1
  70. package/dist/esm/operation-node/foreign-key-constraint-node.js +6 -0
  71. package/dist/esm/operation-node/join-node.d.ts +1 -0
  72. package/dist/esm/operation-node/join-node.js +8 -0
  73. package/dist/esm/operation-node/operation-node-transformer.js +3 -0
  74. package/dist/esm/operation-node/references-node.d.ts +5 -3
  75. package/dist/esm/operation-node/references-node.js +6 -0
  76. package/dist/esm/operation-node/table-node.js +2 -2
  77. package/dist/esm/parser/data-type-parser.d.ts +5 -0
  78. package/dist/esm/parser/data-type-parser.js +7 -0
  79. package/dist/esm/parser/default-value-parser.d.ts +6 -0
  80. package/dist/esm/parser/default-value-parser.js +7 -0
  81. package/dist/esm/parser/filter-parser.d.ts +2 -2
  82. package/dist/esm/parser/filter-parser.js +31 -33
  83. package/dist/esm/parser/join-parser.d.ts +1 -1
  84. package/dist/esm/parser/join-parser.js +7 -9
  85. package/dist/esm/parser/parse-context.d.ts +33 -6
  86. package/dist/esm/parser/parse-context.js +38 -31
  87. package/dist/esm/parser/reference-parser.d.ts +2 -2
  88. package/dist/esm/parser/reference-parser.js +16 -12
  89. package/dist/esm/parser/select-parser.d.ts +1 -2
  90. package/dist/esm/parser/select-parser.js +3 -3
  91. package/dist/esm/parser/table-parser.js +11 -6
  92. package/dist/esm/parser/update-set-parser.js +1 -1
  93. package/dist/esm/parser/value-parser.js +1 -1
  94. package/dist/esm/query-builder/{sub-query-builder.d.ts → expression-builder.d.ts} +6 -6
  95. package/dist/esm/query-builder/{sub-query-builder.js → expression-builder.js} +4 -8
  96. package/dist/esm/query-builder/join-builder.d.ts +2 -2
  97. package/dist/esm/query-builder/join-builder.js +9 -13
  98. package/dist/esm/query-builder/query-builder.d.ts +2 -2
  99. package/dist/esm/query-builder/query-builder.js +37 -39
  100. package/dist/esm/query-builder/type-utils.d.ts +5 -5
  101. package/dist/esm/query-compiler/default-query-compiler.js +14 -2
  102. package/dist/esm/query-creator.d.ts +2 -2
  103. package/dist/esm/query-creator.js +8 -12
  104. package/dist/esm/schema/alter-table-builder.d.ts +26 -8
  105. package/dist/esm/schema/alter-table-builder.js +73 -6
  106. package/dist/esm/schema/column-definition-builder.d.ts +10 -4
  107. package/dist/esm/schema/column-definition-builder.js +12 -7
  108. package/dist/esm/schema/create-index-builder.d.ts +5 -5
  109. package/dist/esm/schema/create-index-builder.js +19 -28
  110. package/dist/esm/schema/create-schema-builder.d.ts +5 -5
  111. package/dist/esm/schema/create-schema-builder.js +9 -13
  112. package/dist/esm/schema/create-table-builder.d.ts +22 -10
  113. package/dist/esm/schema/create-table-builder.js +41 -34
  114. package/dist/esm/schema/drop-index-builder.d.ts +5 -5
  115. package/dist/esm/schema/drop-index-builder.js +11 -16
  116. package/dist/esm/schema/drop-schema-builder.d.ts +5 -5
  117. package/dist/esm/schema/drop-schema-builder.js +9 -13
  118. package/dist/esm/schema/drop-table-builder.d.ts +5 -5
  119. package/dist/esm/schema/drop-table-builder.js +9 -13
  120. package/dist/esm/schema/foreign-key-constraint-builder.d.ts +14 -0
  121. package/dist/esm/schema/foreign-key-constraint-builder.js +22 -0
  122. package/package.json +1 -1
@@ -8,13 +8,12 @@ import { parseReferenceExpression, } from './reference-parser.js';
8
8
  import { parseValueExpressionOrList, } from './value-parser.js';
9
9
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
10
10
  import { ValueNode } from '../operation-node/value-node.js';
11
- import { parseTableExpression } from './table-parser.js';
12
11
  export function parseWhereFilter(ctx, args) {
13
12
  if (args.length === 3) {
14
13
  return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
15
14
  }
16
15
  else if (args.length === 1 && isFunction(args[0])) {
17
- return parseWhereGrouper(ctx, args[0]);
16
+ return parseWhereGroup(ctx, args[0]);
18
17
  }
19
18
  else {
20
19
  throw new Error(`invalid arguments passed to a where method ${JSON.stringify(args)}`);
@@ -25,7 +24,7 @@ export function parseHavingFilter(ctx, args) {
25
24
  return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
26
25
  }
27
26
  else if (args.length === 1 && isFunction(args[0])) {
28
- return parseHavingGrouper(ctx, args[0]);
27
+ return parseHavingGroup(ctx, args[0]);
29
28
  }
30
29
  else {
31
30
  throw new Error(`invalid arguments passed to a having method ${JSON.stringify(args)}`);
@@ -36,7 +35,7 @@ export function parseOnFilter(ctx, args) {
36
35
  return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
37
36
  }
38
37
  else if (args.length === 1 && isFunction(args[0])) {
39
- return parseOnGrouper(ctx, args[0]);
38
+ return parseOnGroup(ctx, args[0]);
40
39
  }
41
40
  else {
42
41
  throw new Error(`invalid arguments passed to an on method ${JSON.stringify(args)}`);
@@ -45,20 +44,11 @@ export function parseOnFilter(ctx, args) {
45
44
  export function parseReferenceFilter(ctx, lhs, op, rhs) {
46
45
  return FilterNode.create(parseReferenceExpression(ctx, lhs), parseFilterOperator(op), parseReferenceExpression(ctx, rhs));
47
46
  }
48
- export function parseExistExpression(ctx, arg) {
49
- return doParseExistExpression(ctx, 'exists', arg);
47
+ export function parseExistFilter(ctx, arg) {
48
+ return parseExistExpression(ctx, 'exists', arg);
50
49
  }
51
- export function parseNotExistExpression(ctx, arg) {
52
- return doParseExistExpression(ctx, 'not exists', arg);
53
- }
54
- function doParseExistExpression(ctx, type, arg) {
55
- const node = isFunction(arg)
56
- ? arg(ctx.createSubQueryBuilder()).toOperationNode()
57
- : arg.toOperationNode();
58
- if (!SelectQueryNode.is(node) && !RawNode.is(node)) {
59
- throw new Error('invalid where exists arg');
60
- }
61
- return FilterNode.create(undefined, OperatorNode.create(type), node);
50
+ export function parseNotExistFilter(ctx, arg) {
51
+ return parseExistExpression(ctx, 'not exists', arg);
62
52
  }
63
53
  function parseThreeArgFilter(ctx, left, op, right) {
64
54
  if ((op === 'is' || op === 'is not') && (isNull(right) || isBoolean(right))) {
@@ -70,38 +60,46 @@ function parseIsFilter(ctx, left, op, right) {
70
60
  return FilterNode.create(parseReferenceExpression(ctx, left), parseFilterOperator(op), ValueNode.createImmediate(right));
71
61
  }
72
62
  function parseFilterOperator(op) {
73
- if (isOperationNodeSource(op)) {
74
- return op.toOperationNode();
75
- }
76
- else if (isString(op)) {
77
- const opString = op.trim().toLowerCase();
78
- if (OPERATORS.some((it) => it === opString)) {
79
- return OperatorNode.create(opString);
63
+ if (isString(op)) {
64
+ if (OPERATORS.includes(op)) {
65
+ return OperatorNode.create(op);
80
66
  }
81
67
  }
68
+ else if (isOperationNodeSource(op)) {
69
+ return op.toOperationNode();
70
+ }
82
71
  throw new Error(`invalid comparison operator ${JSON.stringify(op)} passed to a filter method`);
83
72
  }
84
- function parseWhereGrouper(ctx, grouper) {
85
- const query = grouper(ctx.createEmptySelectQuery());
73
+ function parseWhereGroup(ctx, callback) {
74
+ const query = callback(ctx.createSelectQueryBuilder([]));
86
75
  const queryNode = query.toOperationNode();
87
76
  if (!queryNode.where) {
88
- throw new Error('no where methods called insided a grouper');
77
+ throw new Error('no `where*` methods called insided a group callback');
89
78
  }
90
79
  return ParensNode.create(queryNode.where.where);
91
80
  }
92
- function parseHavingGrouper(ctx, grouper) {
93
- const query = grouper(ctx.createEmptySelectQuery());
81
+ function parseHavingGroup(ctx, callback) {
82
+ const query = callback(ctx.createSelectQueryBuilder([]));
94
83
  const queryNode = query.toOperationNode();
95
84
  if (!queryNode.having) {
96
- throw new Error('no having methods called insided a grouper');
85
+ throw new Error('no `having*` methods called insided a group callback');
97
86
  }
98
87
  return ParensNode.create(queryNode.having.having);
99
88
  }
100
- function parseOnGrouper(ctx, grouper) {
101
- const joinBuilder = grouper(ctx.createJoinBuilder('InnerJoin', parseTableExpression(ctx, 'table')));
89
+ function parseOnGroup(ctx, callback) {
90
+ const joinBuilder = callback(ctx.createJoinBuilder('InnerJoin', 'table'));
102
91
  const joinNode = joinBuilder.toOperationNode();
103
92
  if (!joinNode.on) {
104
- throw new Error('no `on` methods called insided a grouper where');
93
+ throw new Error('no `on*` methods called insided a group callback');
105
94
  }
106
95
  return ParensNode.create(joinNode.on);
107
96
  }
97
+ function parseExistExpression(ctx, type, arg) {
98
+ const node = isFunction(arg)
99
+ ? arg(ctx.createExpressionBuilder()).toOperationNode()
100
+ : arg.toOperationNode();
101
+ if (!SelectQueryNode.is(node) && !RawNode.is(node)) {
102
+ throw new Error('invalid where exists arg');
103
+ }
104
+ return FilterNode.create(undefined, OperatorNode.create(type), node);
105
+ }
@@ -5,4 +5,4 @@ import { JoinBuilder } from '../query-builder/join-builder.js';
5
5
  import { ParseContext } from './parse-context.js';
6
6
  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>>;
7
7
  export declare type JoinCallbackExpression<DB, TB extends keyof DB, F> = (join: JoinBuilder<TableExpressionDatabaseType<DB, F>, TB | ExtractAliasFromTableExpression<DB, F>>) => JoinBuilder<any, any>;
8
- export declare function parseJoinArgs(ctx: ParseContext, joinType: JoinType, args: any[]): JoinNode;
8
+ export declare function parseJoin(ctx: ParseContext, joinType: JoinType, args: any[]): JoinNode;
@@ -1,23 +1,21 @@
1
1
  import { JoinNode } from '../operation-node/join-node.js';
2
2
  import { parseTableExpression, } from './table-parser.js';
3
3
  import { parseReferenceFilter } from './filter-parser.js';
4
- export function parseJoinArgs(ctx, joinType, args) {
5
- if (args.length === 2) {
6
- return parseCallbackJoin(ctx, joinType, args[0], args[1]);
7
- }
8
- else if (args.length === 3) {
4
+ export function parseJoin(ctx, joinType, args) {
5
+ if (args.length === 3) {
9
6
  return parseSingleOnJoin(ctx, joinType, args[0], args[1], args[2]);
10
7
  }
8
+ else if (args.length === 2) {
9
+ return parseCallbackJoin(ctx, joinType, args[0], args[1]);
10
+ }
11
11
  else {
12
12
  throw new Error('not implemented');
13
13
  }
14
14
  }
15
15
  function parseCallbackJoin(ctx, joinType, from, callback) {
16
- const tableNode = parseTableExpression(ctx, from);
17
- const joinBuilder = callback(ctx.createJoinBuilder(joinType, tableNode));
16
+ const joinBuilder = callback(ctx.createJoinBuilder(joinType, from));
18
17
  return joinBuilder.toOperationNode();
19
18
  }
20
19
  function parseSingleOnJoin(ctx, joinType, from, lhsColumn, rhsColumn) {
21
- const tableNode = parseTableExpression(ctx, from);
22
- return JoinNode.cloneWithOn(JoinNode.create(joinType, tableNode), 'And', parseReferenceFilter(ctx, lhsColumn, '=', rhsColumn));
20
+ return JoinNode.createWithOn(joinType, parseTableExpression(ctx, from), parseReferenceFilter(ctx, lhsColumn, '=', rhsColumn));
23
21
  }
@@ -1,14 +1,41 @@
1
1
  import { DialectAdapter } from '../dialect/dialect-adapter.js';
2
2
  import { JoinType } from '../operation-node/join-node.js';
3
- import { TableExpressionNode } from '../operation-node/operation-node-utils.js';
4
3
  import { JoinBuilder } from '../query-builder/join-builder.js';
5
4
  import { QueryBuilder } from '../query-builder/query-builder.js';
6
- import { SubQueryBuilder } from '../query-builder/sub-query-builder.js';
5
+ import { ExpressionBuilder } from '../query-builder/expression-builder.js';
7
6
  import { QueryCreator } from '../query-creator.js';
7
+ import { TableExpression } from './table-parser.js';
8
+ /**
9
+ * This interface exposes everything the parsers need to be able to parse
10
+ * method calls into {@link OperationNode} trees.
11
+ */
8
12
  export interface ParseContext {
9
- createEmptySelectQuery(): QueryBuilder<any, any>;
10
- createSubQueryBuilder(): SubQueryBuilder<any, any>;
13
+ readonly adapter: DialectAdapter;
14
+ /**
15
+ * Creates a select query builder with a {@link NoopQueryExecutor}.
16
+ */
17
+ createSelectQueryBuilder(tables: ReadonlyArray<TableExpression<any, any>>): QueryBuilder<any, any>;
18
+ /**
19
+ * Creates an instance of a join builder.
20
+ */
21
+ createJoinBuilder(joinType: JoinType, table: TableExpression<any, any>): JoinBuilder<any, any>;
22
+ /**
23
+ * Creates an expression builder for building stuff like subqueries.
24
+ * {@link NoopQueryExecutor} is used as the executor and the queries
25
+ * built using the returned builder can never be executed.
26
+ */
27
+ createExpressionBuilder(): ExpressionBuilder<any, any>;
28
+ /**
29
+ * Creates a query creator with a {@link NoopQueryExecutor}.
30
+ */
31
+ createQueryCreator(): QueryCreator<any>;
32
+ }
33
+ export declare class DefaultParseContext implements ParseContext {
34
+ #private;
35
+ constructor(adapter: DialectAdapter);
36
+ get adapter(): DialectAdapter;
37
+ createSelectQueryBuilder(tables: ReadonlyArray<TableExpression<any, any>>): QueryBuilder<any, any>;
38
+ createJoinBuilder(joinType: JoinType, table: TableExpression<any, any>): JoinBuilder<any, any>;
39
+ createExpressionBuilder(): ExpressionBuilder<any, any>;
11
40
  createQueryCreator(): QueryCreator<any>;
12
- createJoinBuilder(joinType: JoinType, tableNode: TableExpressionNode): JoinBuilder<any, any>;
13
41
  }
14
- export declare function createParseContext(adapter: DialectAdapter): ParseContext;
@@ -2,38 +2,45 @@ import { JoinNode } from '../operation-node/join-node.js';
2
2
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
3
3
  import { JoinBuilder } from '../query-builder/join-builder.js';
4
4
  import { QueryBuilder } from '../query-builder/query-builder.js';
5
- import { SubQueryBuilder } from '../query-builder/sub-query-builder.js';
5
+ import { ExpressionBuilder } from '../query-builder/expression-builder.js';
6
6
  import { QueryCreator } from '../query-creator.js';
7
7
  import { NoopQueryExecutor } from '../query-executor/noop-query-executor.js';
8
- import { freeze } from '../util/object-utils.js';
9
8
  import { createQueryId } from '../util/query-id.js';
10
- export function createParseContext(adapter) {
11
- return freeze({
12
- createEmptySelectQuery() {
13
- return new QueryBuilder({
14
- queryId: createQueryId(),
15
- executor: new NoopQueryExecutor(),
16
- queryNode: SelectQueryNode.create([]),
17
- adapter,
18
- });
19
- },
20
- createSubQueryBuilder() {
21
- return new SubQueryBuilder({
22
- executor: new NoopQueryExecutor(),
23
- adapter,
24
- });
25
- },
26
- createQueryCreator() {
27
- return new QueryCreator({
28
- executor: new NoopQueryExecutor(),
29
- adapter,
30
- });
31
- },
32
- createJoinBuilder(joinType, tableNode) {
33
- return new JoinBuilder({
34
- joinNode: JoinNode.create(joinType, tableNode),
35
- adapter,
36
- });
37
- },
38
- });
9
+ import { parseTableExpression, parseTableExpressionOrList, } from './table-parser.js';
10
+ export class DefaultParseContext {
11
+ #adapter;
12
+ #noopExecutor;
13
+ constructor(adapter) {
14
+ this.#adapter = adapter;
15
+ this.#noopExecutor = new NoopQueryExecutor();
16
+ }
17
+ get adapter() {
18
+ return this.#adapter;
19
+ }
20
+ createSelectQueryBuilder(tables) {
21
+ return new QueryBuilder({
22
+ queryId: createQueryId(),
23
+ executor: this.#noopExecutor,
24
+ parseContext: this,
25
+ queryNode: SelectQueryNode.create(parseTableExpressionOrList(this, tables)),
26
+ });
27
+ }
28
+ createJoinBuilder(joinType, table) {
29
+ return new JoinBuilder({
30
+ joinNode: JoinNode.create(joinType, parseTableExpression(this, table)),
31
+ parseContext: this,
32
+ });
33
+ }
34
+ createExpressionBuilder() {
35
+ return new ExpressionBuilder({
36
+ executor: this.#noopExecutor,
37
+ parseContext: this,
38
+ });
39
+ }
40
+ createQueryCreator() {
41
+ return new QueryCreator({
42
+ executor: this.#noopExecutor,
43
+ parseContext: this,
44
+ });
45
+ }
39
46
  }
@@ -14,7 +14,7 @@ export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB,
14
14
  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;
15
15
  export declare function parseReferenceExpressionOrList(ctx: ParseContext, arg: ReferenceExpressionOrList<any, any>): ReferenceExpressionNode[];
16
16
  export declare function parseReferenceExpression(ctx: ParseContext, arg: ReferenceExpression<any, any>): ReferenceExpressionNode;
17
- export declare function parseStringReference(str: string): ColumnNode | ReferenceNode;
18
- export declare function parseAliasedStringReference(str: string): ColumnNode | ReferenceNode | AliasNode;
17
+ export declare function parseStringReference(ref: string): ColumnNode | ReferenceNode;
18
+ export declare function parseAliasedStringReference(ref: string): ColumnNode | ReferenceNode | AliasNode;
19
19
  export declare function parseColumnName(column: AnyColumn<any, any>): ColumnNode;
20
20
  export {};
@@ -24,16 +24,17 @@ export function parseReferenceExpression(ctx, arg) {
24
24
  }
25
25
  }
26
26
  else if (isFunction(arg)) {
27
- const node = arg(ctx.createSubQueryBuilder()).toOperationNode();
27
+ const node = arg(ctx.createExpressionBuilder()).toOperationNode();
28
28
  if (!QueryNode.isMutating(node)) {
29
29
  return node;
30
30
  }
31
31
  }
32
32
  throw new Error(`invalid reference expression ${JSON.stringify(arg)}`);
33
33
  }
34
- export function parseStringReference(str) {
35
- if (str.includes('.')) {
36
- const parts = str.split('.').map((it) => it.trim());
34
+ export function parseStringReference(ref) {
35
+ const COLUMN_SEPARATOR = '.';
36
+ if (ref.includes(COLUMN_SEPARATOR)) {
37
+ const parts = ref.split(COLUMN_SEPARATOR).map(trim);
37
38
  if (parts.length === 3) {
38
39
  return parseStringReferenceWithTableAndSchema(parts);
39
40
  }
@@ -41,21 +42,21 @@ export function parseStringReference(str) {
41
42
  return parseStringReferenceWithTable(parts);
42
43
  }
43
44
  else {
44
- throw new Error(`invalid column reference ${str}`);
45
+ throw new Error(`invalid column reference ${ref}`);
45
46
  }
46
47
  }
47
48
  else {
48
- return ColumnNode.create(str);
49
+ return ColumnNode.create(ref);
49
50
  }
50
51
  }
51
- export function parseAliasedStringReference(str) {
52
- if (str.includes(' as ')) {
53
- const [tableColumn, alias] = str.split(' as ').map((it) => it.trim());
54
- const tableColumnNode = parseStringReference(tableColumn);
55
- return AliasNode.create(tableColumnNode, alias);
52
+ export function parseAliasedStringReference(ref) {
53
+ const ALIAS_SEPARATOR = ' as ';
54
+ if (ref.includes(ALIAS_SEPARATOR)) {
55
+ const [columnRef, alias] = ref.split(ALIAS_SEPARATOR).map(trim);
56
+ return AliasNode.create(parseStringReference(columnRef), alias);
56
57
  }
57
58
  else {
58
- return parseStringReference(str);
59
+ return parseStringReference(ref);
59
60
  }
60
61
  }
61
62
  export function parseColumnName(column) {
@@ -69,3 +70,6 @@ function parseStringReferenceWithTable(parts) {
69
70
  const [table, column] = parts;
70
71
  return ReferenceNode.create(TableNode.create(table), ColumnNode.create(column));
71
72
  }
73
+ function trim(str) {
74
+ return str.trim();
75
+ }
@@ -26,6 +26,5 @@ declare type ExtractAliasFromStringSelectExpression<S extends string> = S extend
26
26
  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;
27
27
  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;
28
28
  export declare function parseSelectExpressionOrList(ctx: ParseContext, selection: SelectExpressionOrList<any, any>): SelectionNode[];
29
- export declare function parseSelectAllArgs(table?: string | string[]): SelectionNode[];
30
- export declare function parseSelectAllArg(table: string): SelectionNode;
29
+ export declare function parseSelectAll(table?: string | string[]): SelectionNode[];
31
30
  export {};
@@ -18,13 +18,13 @@ function parseSelectExpression(ctx, selection) {
18
18
  return SelectionNode.create(selection.toOperationNode());
19
19
  }
20
20
  else if (isFunction(selection)) {
21
- return SelectionNode.create(selection(ctx.createSubQueryBuilder()).toOperationNode());
21
+ return SelectionNode.create(selection(ctx.createExpressionBuilder()).toOperationNode());
22
22
  }
23
23
  else {
24
24
  throw new Error(`invalid value passed to select method: ${JSON.stringify(selection)}`);
25
25
  }
26
26
  }
27
- export function parseSelectAllArgs(table) {
27
+ export function parseSelectAll(table) {
28
28
  if (!table) {
29
29
  return [SelectionNode.createSelectAll()];
30
30
  }
@@ -35,7 +35,7 @@ export function parseSelectAllArgs(table) {
35
35
  return [parseSelectAllArg(table)];
36
36
  }
37
37
  }
38
- export function parseSelectAllArg(table) {
38
+ function parseSelectAllArg(table) {
39
39
  if (isString(table)) {
40
40
  return SelectionNode.createSelectAllFromTable(table);
41
41
  }
@@ -18,27 +18,32 @@ export function parseTableExpression(ctx, table) {
18
18
  return table.toOperationNode();
19
19
  }
20
20
  else if (isFunction(table)) {
21
- return table(ctx.createSubQueryBuilder()).toOperationNode();
21
+ return table(ctx.createExpressionBuilder()).toOperationNode();
22
22
  }
23
23
  else {
24
24
  throw new Error(`invalid table expression ${JSON.stringify(table)}`);
25
25
  }
26
26
  }
27
27
  export function parseAliasedTable(from) {
28
- const [table, alias] = from.split(' as ').map((it) => it.trim());
29
- if (alias) {
28
+ const ALIAS_SEPARATOR = ' as ';
29
+ if (from.includes(ALIAS_SEPARATOR)) {
30
+ const [table, alias] = from.split(ALIAS_SEPARATOR).map(trim);
30
31
  return AliasNode.create(parseTable(table), alias);
31
32
  }
32
33
  else {
33
- return parseTable(table);
34
+ return parseTable(from);
34
35
  }
35
36
  }
36
37
  export function parseTable(from) {
37
- if (from.includes('.')) {
38
- const [schema, table] = from.split('.').map((it) => it.trim());
38
+ const SCHEMA_SEPARATOR = '.';
39
+ if (from.includes(SCHEMA_SEPARATOR)) {
40
+ const [schema, table] = from.split(SCHEMA_SEPARATOR).map(trim);
39
41
  return TableNode.createWithSchema(schema, table);
40
42
  }
41
43
  else {
42
44
  return TableNode.create(from);
43
45
  }
44
46
  }
47
+ function trim(str) {
48
+ return str.trim();
49
+ }
@@ -20,7 +20,7 @@ export function parseMutationValueExpression(ctx, value) {
20
20
  }
21
21
  }
22
22
  else if (isFunction(value)) {
23
- const node = value(ctx.createSubQueryBuilder()).toOperationNode();
23
+ const node = value(ctx.createExpressionBuilder()).toOperationNode();
24
24
  if (!QueryNode.isMutating(node)) {
25
25
  return node;
26
26
  }
@@ -24,7 +24,7 @@ export function parseValueExpression(ctx, arg) {
24
24
  }
25
25
  }
26
26
  else if (isFunction(arg)) {
27
- const node = arg(ctx.createSubQueryBuilder()).toOperationNode();
27
+ const node = arg(ctx.createExpressionBuilder()).toOperationNode();
28
28
  if (!QueryNode.isMutating(node)) {
29
29
  return node;
30
30
  }
@@ -1,9 +1,9 @@
1
1
  import { TableExpression, QueryBuilderWithTable } from '../parser/table-parser.js';
2
2
  import { NoopQueryExecutor } from '../query-executor/noop-query-executor.js';
3
- import { DialectAdapter } from '../dialect/dialect-adapter.js';
4
- export declare class SubQueryBuilder<DB, TB extends keyof DB> {
3
+ import { ParseContext } from '../parser/parse-context.js';
4
+ export declare class ExpressionBuilder<DB, TB extends keyof DB> {
5
5
  #private;
6
- constructor(props: SubQueryBuilderProps);
6
+ constructor(props: ExpressionBuilderProps);
7
7
  /**
8
8
  * Creates a subquery.
9
9
  *
@@ -50,9 +50,9 @@ export declare class SubQueryBuilder<DB, TB extends keyof DB> {
50
50
  /**
51
51
  * See {@link QueryCreator.withSchema}
52
52
  */
53
- withSchema(schema: string): SubQueryBuilder<DB, TB>;
53
+ withSchema(schema: string): ExpressionBuilder<DB, TB>;
54
54
  }
55
- export interface SubQueryBuilderProps {
55
+ export interface ExpressionBuilderProps {
56
56
  readonly executor: NoopQueryExecutor;
57
- readonly adapter: DialectAdapter;
57
+ readonly parseContext: ParseContext;
58
58
  }
@@ -4,8 +4,7 @@ import { parseTableExpressionOrList, } from '../parser/table-parser.js';
4
4
  import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
5
5
  import { createQueryId } from '../util/query-id.js';
6
6
  import { freeze } from '../util/object-utils.js';
7
- import { createParseContext } from '../parser/parse-context.js';
8
- export class SubQueryBuilder {
7
+ export class ExpressionBuilder {
9
8
  #props;
10
9
  constructor(props) {
11
10
  this.#props = freeze(props);
@@ -14,20 +13,17 @@ export class SubQueryBuilder {
14
13
  return new QueryBuilder({
15
14
  queryId: createQueryId(),
16
15
  executor: this.#props.executor,
17
- adapter: this.#props.adapter,
18
- queryNode: SelectQueryNode.create(parseTableExpressionOrList(this.#parseContext, table)),
16
+ parseContext: this.#props.parseContext,
17
+ queryNode: SelectQueryNode.create(parseTableExpressionOrList(this.#props.parseContext, table)),
19
18
  });
20
19
  }
21
20
  /**
22
21
  * See {@link QueryCreator.withSchema}
23
22
  */
24
23
  withSchema(schema) {
25
- return new SubQueryBuilder({
24
+ return new ExpressionBuilder({
26
25
  ...this.#props,
27
26
  executor: this.#props.executor.withPluginAtFront(new WithSchemaPlugin(schema)),
28
27
  });
29
28
  }
30
- get #parseContext() {
31
- return createParseContext(this.#props.adapter);
32
- }
33
29
  }
@@ -1,7 +1,7 @@
1
- import { DialectAdapter } from '../dialect/dialect-adapter.js';
2
1
  import { JoinNode } from '../operation-node/join-node.js';
3
2
  import { OperationNodeSource } from '../operation-node/operation-node-source.js';
4
3
  import { ExistsExpression, FilterOperator } from '../parser/filter-parser.js';
4
+ import { ParseContext } from '../parser/parse-context.js';
5
5
  import { ReferenceExpression } from '../parser/reference-parser.js';
6
6
  import { ValueExpressionOrList } from '../parser/value-parser.js';
7
7
  export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNodeSource {
@@ -69,5 +69,5 @@ export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNo
69
69
  }
70
70
  export interface JoinBuilderProps {
71
71
  readonly joinNode: JoinNode;
72
- readonly adapter: DialectAdapter;
72
+ readonly parseContext: ParseContext;
73
73
  }
@@ -1,6 +1,5 @@
1
1
  import { JoinNode } from '../operation-node/join-node.js';
2
- import { parseExistExpression, parseNotExistExpression, parseOnFilter, parseReferenceFilter, } from '../parser/filter-parser.js';
3
- import { createParseContext } from '../parser/parse-context.js';
2
+ import { parseExistFilter, parseNotExistFilter, parseOnFilter, parseReferenceFilter, } from '../parser/filter-parser.js';
4
3
  import { freeze } from '../util/object-utils.js';
5
4
  import { preventAwait } from '../util/prevent-await.js';
6
5
  export class JoinBuilder {
@@ -11,13 +10,13 @@ export class JoinBuilder {
11
10
  on(...args) {
12
11
  return new JoinBuilder({
13
12
  ...this.#props,
14
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseOnFilter(this.#parseContext, args)),
13
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseOnFilter(this.#props.parseContext, args)),
15
14
  });
16
15
  }
17
16
  orOn(...args) {
18
17
  return new JoinBuilder({
19
18
  ...this.#props,
20
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseOnFilter(this.#parseContext, args)),
19
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseOnFilter(this.#props.parseContext, args)),
21
20
  });
22
21
  }
23
22
  /**
@@ -29,7 +28,7 @@ export class JoinBuilder {
29
28
  onRef(lhs, op, rhs) {
30
29
  return new JoinBuilder({
31
30
  ...this.#props,
32
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseReferenceFilter(this.#parseContext, lhs, op, rhs)),
31
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
33
32
  });
34
33
  }
35
34
  /**
@@ -41,7 +40,7 @@ export class JoinBuilder {
41
40
  orOnRef(lhs, op, rhs) {
42
41
  return new JoinBuilder({
43
42
  ...this.#props,
44
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseReferenceFilter(this.#parseContext, lhs, op, rhs)),
43
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
45
44
  });
46
45
  }
47
46
  /**
@@ -53,7 +52,7 @@ export class JoinBuilder {
53
52
  onExists(arg) {
54
53
  return new JoinBuilder({
55
54
  ...this.#props,
56
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseExistExpression(this.#parseContext, arg)),
55
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseExistFilter(this.#props.parseContext, arg)),
57
56
  });
58
57
  }
59
58
  /**
@@ -65,7 +64,7 @@ export class JoinBuilder {
65
64
  onNotExists(arg) {
66
65
  return new JoinBuilder({
67
66
  ...this.#props,
68
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseNotExistExpression(this.#parseContext, arg)),
67
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'And', parseNotExistFilter(this.#props.parseContext, arg)),
69
68
  });
70
69
  }
71
70
  /**
@@ -77,7 +76,7 @@ export class JoinBuilder {
77
76
  orOnExists(arg) {
78
77
  return new JoinBuilder({
79
78
  ...this.#props,
80
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseExistExpression(this.#parseContext, arg)),
79
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseExistFilter(this.#props.parseContext, arg)),
81
80
  });
82
81
  }
83
82
  /**
@@ -89,14 +88,11 @@ export class JoinBuilder {
89
88
  orOnNotExists(arg) {
90
89
  return new JoinBuilder({
91
90
  ...this.#props,
92
- joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseNotExistExpression(this.#parseContext, arg)),
91
+ joinNode: JoinNode.cloneWithOn(this.#props.joinNode, 'Or', parseNotExistFilter(this.#props.parseContext, arg)),
93
92
  });
94
93
  }
95
94
  toOperationNode() {
96
95
  return this.#props.joinNode;
97
96
  }
98
- get #parseContext() {
99
- return createParseContext(this.#props.adapter);
100
- }
101
97
  }
102
98
  preventAwait(JoinBuilder, "don't await JoinBuilder instances. They are never executed directly and are always just a part of a query.");
@@ -18,7 +18,7 @@ import { Compilable } from '../util/compilable.js';
18
18
  import { QueryExecutor } from '../query-executor/query-executor.js';
19
19
  import { QueryId } from '../util/query-id.js';
20
20
  import { OnConflictConstraintTarget } from '../parser/on-conflict-parser.js';
21
- import { DialectAdapter } from '../dialect/dialect-adapter.js';
21
+ import { ParseContext } from '../parser/parse-context.js';
22
22
  /**
23
23
  * The main query builder class.
24
24
  *
@@ -1605,7 +1605,7 @@ export interface QueryBuilderProps {
1605
1605
  readonly queryId: QueryId;
1606
1606
  readonly queryNode: QueryNode;
1607
1607
  readonly executor: QueryExecutor;
1608
- readonly adapter: DialectAdapter;
1608
+ readonly parseContext: ParseContext;
1609
1609
  }
1610
1610
  /**
1611
1611
  * {@link QueryBuilder} with an alias. The result of calling {@link QueryBuilder.as}.