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
package/README.md CHANGED
@@ -24,11 +24,15 @@ fail you. With Kysely you can also explicitly tell it to ignore the typings, but
24
24
  type-safety! See the [DynamicModule](https://koskimas.github.io/kysely/classes/DynamicModule.html#ref)
25
25
  for more info.
26
26
 
27
- Kysely is still young and some useful methods and modules are not yet implemented. If you start using
28
- Kysely, please open an issue as soon as you can't find something you want to use.
27
+ Kysely is still young and some useful features are propably not yet implemented. If you start
28
+ using Kysely and can't find something you'd want to use, please open an issue.
29
29
 
30
- - [API reference](https://koskimas.github.io/kysely/index.html)
30
+ # Table of contents
31
+
32
+ - [Installation](#installation)
33
+ - [Minimal example](#minimal-example)
31
34
  - [Migrations](#migrations)
35
+ - [API reference](https://koskimas.github.io/kysely/index.html)
32
36
 
33
37
  # Installation
34
38
 
@@ -43,7 +47,7 @@ npm install kysely mysql2
43
47
  ```
44
48
 
45
49
  More dialects will be added soon. Kysely also has a simple interface
46
- for [third-party dialects](https://koskimas.github.io/kysely/interfaces/Dialect.html).
50
+ for [3rd party dialects](https://koskimas.github.io/kysely/interfaces/Dialect.html).
47
51
 
48
52
  3rd party dialects:
49
53
 
@@ -76,7 +80,7 @@ interface Movie {
76
80
  stars: number
77
81
  }
78
82
 
79
- // Keys are table names.
83
+ // Keys of this interface are table names.
80
84
  interface Database {
81
85
  person: Person
82
86
  pet: Pet
@@ -1,13 +1,5 @@
1
1
  import { Kysely } from '../kysely.js';
2
- /**
3
- * The `DialectAdapter` encapsulates all differences between dialects outside
4
- * the `Driver` and `QueryCompiler`.
5
- *
6
- * For example, some databases support transactional DDL and therefore we want
7
- * to run migrations inside a transaction, while other databases don't support
8
- * it. For that there's a `supportsTransactionalDdl` boolean in this interface.
9
- */
10
- export interface DialectAdapter {
2
+ export interface DialectSupports {
11
3
  /**
12
4
  * Whether or not this dialect supports transactional DDL.
13
5
  *
@@ -19,6 +11,16 @@ export interface DialectAdapter {
19
11
  * upates and deletes.
20
12
  */
21
13
  readonly supportsReturning: boolean;
14
+ }
15
+ /**
16
+ * The `DialectAdapter` encapsulates all differences between dialects outside
17
+ * the `Driver` and `QueryCompiler`.
18
+ *
19
+ * For example, some databases support transactional DDL and therefore we want
20
+ * to run migrations inside a transaction, while other databases don't support
21
+ * it. For that there's a `supportsTransactionalDdl` boolean in this interface.
22
+ */
23
+ export interface DialectAdapter extends DialectSupports {
22
24
  /**
23
25
  * This method is used to acquire a lock for the migrations so that
24
26
  * it's not possible for two migration processes to run in parallel.
@@ -2,7 +2,7 @@ export * from './kysely.js';
2
2
  export * from './query-creator.js';
3
3
  export * from './query-builder/query-builder.js';
4
4
  export * from './query-builder/join-builder.js';
5
- export * from './query-builder/sub-query-builder.js';
5
+ export * from './query-builder/expression-builder.js';
6
6
  export * from './raw-builder/raw-builder.js';
7
7
  export * from './query-executor/query-executor.js';
8
8
  export * from './query-executor/default-query-executor.js';
@@ -17,6 +17,7 @@ export * from './schema/drop-index-builder.js';
17
17
  export * from './schema/create-schema-builder.js';
18
18
  export * from './schema/drop-schema-builder.js';
19
19
  export * from './schema/column-definition-builder.js';
20
+ export * from './schema/foreign-key-constraint-builder.js';
20
21
  export * from './schema/alter-table-builder.js';
21
22
  export * from './dynamic/dynamic.js';
22
23
  export * from './driver/driver.js';
package/dist/cjs/index.js CHANGED
@@ -14,7 +14,7 @@ __exportStar(require("./kysely.js"), exports);
14
14
  __exportStar(require("./query-creator.js"), exports);
15
15
  __exportStar(require("./query-builder/query-builder.js"), exports);
16
16
  __exportStar(require("./query-builder/join-builder.js"), exports);
17
- __exportStar(require("./query-builder/sub-query-builder.js"), exports);
17
+ __exportStar(require("./query-builder/expression-builder.js"), exports);
18
18
  __exportStar(require("./raw-builder/raw-builder.js"), exports);
19
19
  __exportStar(require("./query-executor/query-executor.js"), exports);
20
20
  __exportStar(require("./query-executor/default-query-executor.js"), exports);
@@ -29,6 +29,7 @@ __exportStar(require("./schema/drop-index-builder.js"), exports);
29
29
  __exportStar(require("./schema/create-schema-builder.js"), exports);
30
30
  __exportStar(require("./schema/drop-schema-builder.js"), exports);
31
31
  __exportStar(require("./schema/column-definition-builder.js"), exports);
32
+ __exportStar(require("./schema/foreign-key-constraint-builder.js"), exports);
32
33
  __exportStar(require("./schema/alter-table-builder.js"), exports);
33
34
  __exportStar(require("./dynamic/dynamic.js"), exports);
34
35
  __exportStar(require("./driver/driver.js"), exports);
@@ -8,7 +8,7 @@ import { KyselyPlugin } from './plugin/kysely-plugin.js';
8
8
  import { GeneratedPlaceholder } from './query-builder/type-utils.js';
9
9
  import { DatabaseIntrospector } from './introspection/database-introspector.js';
10
10
  import { Driver, IsolationLevel } from './driver/driver.js';
11
- import { DialectAdapter } from './dialect/dialect-adapter.js';
11
+ import { ParseContext } from './parser/parse-context.js';
12
12
  /**
13
13
  * The main Kysely class.
14
14
  *
@@ -186,7 +186,7 @@ export interface KyselyProps {
186
186
  readonly driver: Driver;
187
187
  readonly executor: QueryExecutor;
188
188
  readonly dialect: Dialect;
189
- readonly adapter: DialectAdapter;
189
+ readonly parseContext: ParseContext;
190
190
  }
191
191
  export declare function isKyselyProps(obj: unknown): obj is KyselyProps;
192
192
  export interface KyselyConfig {
@@ -13,6 +13,7 @@ const runtime_driver_js_1 = require("./driver/runtime-driver.js");
13
13
  const single_connection_provider_js_1 = require("./driver/single-connection-provider.js");
14
14
  const driver_js_1 = require("./driver/driver.js");
15
15
  const prevent_await_js_1 = require("./util/prevent-await.js");
16
+ const parse_context_js_1 = require("./parser/parse-context.js");
16
17
  /**
17
18
  * The main Kysely class.
18
19
  *
@@ -57,7 +58,7 @@ class Kysely extends query_creator_js_1.QueryCreator {
57
58
  #props;
58
59
  constructor(args) {
59
60
  if (isKyselyProps(args)) {
60
- super({ executor: args.executor, adapter: args.adapter });
61
+ super({ executor: args.executor, parseContext: args.parseContext });
61
62
  this.#props = (0, object_utils_js_1.freeze)(args);
62
63
  }
63
64
  else {
@@ -65,16 +66,17 @@ class Kysely extends query_creator_js_1.QueryCreator {
65
66
  const driver = dialect.createDriver();
66
67
  const compiler = dialect.createQueryCompiler();
67
68
  const adapter = dialect.createAdapter();
69
+ const parseContext = new parse_context_js_1.DefaultParseContext(adapter);
68
70
  const runtimeDriver = new runtime_driver_js_1.RuntimeDriver(driver);
69
71
  const connectionProvider = new default_connection_provider_js_1.DefaultConnectionProvider(runtimeDriver);
70
72
  const executor = new default_query_executor_js_1.DefaultQueryExecutor(compiler, connectionProvider, args.plugins ?? []);
71
- super({ executor, adapter });
73
+ super({ executor, parseContext });
72
74
  this.#props = (0, object_utils_js_1.freeze)({
73
75
  config: args,
74
76
  executor,
75
- adapter,
76
77
  dialect,
77
- driver,
78
+ driver: runtimeDriver,
79
+ parseContext,
78
80
  });
79
81
  }
80
82
  }
@@ -88,7 +90,7 @@ class Kysely extends query_creator_js_1.QueryCreator {
88
90
  * Returns the {@link MigrationModule} module for managing and running migrations.
89
91
  */
90
92
  get migration() {
91
- return new migration_js_1.MigrationModule(this, this.#props.adapter);
93
+ return new migration_js_1.MigrationModule(this, this.#props.parseContext.adapter);
92
94
  }
93
95
  /**
94
96
  * Returns a the {@link DynamicModule} module.
@@ -248,7 +250,7 @@ function isKyselyProps(obj) {
248
250
  (0, object_utils_js_1.isObject)(obj.driver) &&
249
251
  (0, object_utils_js_1.isObject)(obj.executor) &&
250
252
  (0, object_utils_js_1.isObject)(obj.dialect) &&
251
- (0, object_utils_js_1.isObject)(obj.adapter));
253
+ (0, object_utils_js_1.isObject)(obj.parseContext));
252
254
  }
253
255
  exports.isKyselyProps = isKyselyProps;
254
256
  class ConnectionBuilder {
@@ -276,7 +278,7 @@ exports.ConnectionBuilder = ConnectionBuilder;
276
278
  class TransactionBuilder {
277
279
  #props;
278
280
  constructor(props) {
279
- this.#props = props;
281
+ this.#props = (0, object_utils_js_1.freeze)(props);
280
282
  }
281
283
  setIsolationLevel(isolationLevel) {
282
284
  return new TransactionBuilder({
@@ -1,5 +1,6 @@
1
1
  import { OperationNode } from './operation-node.js';
2
2
  import { TableNode } from './table-node.js';
3
+ import { ForeignKeyConstraintNode } from './foreign-key-constraint-node.js';
3
4
  import { ConstraintNode } from './constraint-node.js';
4
5
  import { ColumnDefinitionNode } from './column-definition-node.js';
5
6
  export declare type CreateTableNodeModifier = 'IfNotExists';
@@ -21,5 +22,5 @@ export declare const CreateTableNode: Readonly<{
21
22
  cloneWithPrimaryKeyConstraint(createTable: CreateTableNode, constraintName: string, columns: string[]): CreateTableNode;
22
23
  cloneWithUniqueConstraint(createTable: CreateTableNode, constraintName: string, columns: string[]): CreateTableNode;
23
24
  cloneWithCheckConstraint(createTable: CreateTableNode, constraintName: string, sql: string): CreateTableNode;
24
- cloneWithForeignKeyConstraint(createTable: CreateTableNode, constraintName: string, sourceColumns: string[], targetTable: string, targetColumns: string[]): CreateTableNode;
25
+ cloneWithForeignKeyConstraint(createTable: CreateTableNode, constraint: ForeignKeyConstraintNode): CreateTableNode;
25
26
  }>;
@@ -3,11 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CreateTableNode = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
5
  const check_constraint_node_js_1 = require("./check-constraint-node.js");
6
- const table_node_js_1 = require("./table-node.js");
7
6
  const primary_constraint_node_js_1 = require("./primary-constraint-node.js");
8
7
  const unique_constraint_node_js_1 = require("./unique-constraint-node.js");
9
- const foreign_key_constraint_node_js_1 = require("./foreign-key-constraint-node.js");
10
- const column_node_js_1 = require("./column-node.js");
11
8
  /**
12
9
  * @internal
13
10
  */
@@ -61,8 +58,7 @@ exports.CreateTableNode = (0, object_utils_js_1.freeze)({
61
58
  : (0, object_utils_js_1.freeze)([constraint]),
62
59
  });
63
60
  },
64
- cloneWithForeignKeyConstraint(createTable, constraintName, sourceColumns, targetTable, targetColumns) {
65
- const constraint = foreign_key_constraint_node_js_1.ForeignKeyConstraintNode.create(sourceColumns.map(column_node_js_1.ColumnNode.create), table_node_js_1.TableNode.create(targetTable), targetColumns.map(column_node_js_1.ColumnNode.create), constraintName);
61
+ cloneWithForeignKeyConstraint(createTable, constraint) {
66
62
  return (0, object_utils_js_1.freeze)({
67
63
  ...createTable,
68
64
  constraints: createTable.constraints
@@ -1,12 +1,15 @@
1
1
  import { ColumnNode } from './column-node.js';
2
2
  import { IdentifierNode } from './identifier-node.js';
3
3
  import { OperationNode } from './operation-node.js';
4
- import { ReferencesNode } from './references-node.js';
4
+ import { OnModifyForeignAction, ReferencesNode } from './references-node.js';
5
5
  import { TableNode } from './table-node.js';
6
+ export declare type ForeignKeyConstraintNodeProps = Omit<ForeignKeyConstraintNode, 'kind' | 'columns' | 'references'>;
6
7
  export interface ForeignKeyConstraintNode extends OperationNode {
7
8
  readonly kind: 'ForeignKeyConstraintNode';
8
9
  readonly columns: ReadonlyArray<ColumnNode>;
9
10
  readonly references: ReferencesNode;
11
+ readonly onDelete?: OnModifyForeignAction;
12
+ readonly onUpdate?: OnModifyForeignAction;
10
13
  readonly name?: IdentifierNode;
11
14
  }
12
15
  /**
@@ -15,4 +18,12 @@ export interface ForeignKeyConstraintNode extends OperationNode {
15
18
  export declare const ForeignKeyConstraintNode: Readonly<{
16
19
  is(node: OperationNode): node is ForeignKeyConstraintNode;
17
20
  create(sourceColumns: ReadonlyArray<ColumnNode>, targetTable: TableNode, targetColumns: ReadonlyArray<ColumnNode>, constraintName?: string | undefined): ForeignKeyConstraintNode;
21
+ cloneWith(node: ForeignKeyConstraintNode, props: ForeignKeyConstraintNodeProps): Readonly<{
22
+ name?: IdentifierNode | undefined;
23
+ onDelete?: OnModifyForeignAction | undefined;
24
+ onUpdate?: OnModifyForeignAction | undefined;
25
+ kind: 'ForeignKeyConstraintNode';
26
+ columns: ReadonlyArray<ColumnNode>;
27
+ references: ReferencesNode;
28
+ }>;
18
29
  }>;
@@ -19,4 +19,10 @@ exports.ForeignKeyConstraintNode = (0, object_utils_js_1.freeze)({
19
19
  name: constraintName ? identifier_node_js_1.IdentifierNode.create(constraintName) : undefined,
20
20
  });
21
21
  },
22
+ cloneWith(node, props) {
23
+ return (0, object_utils_js_1.freeze)({
24
+ ...node,
25
+ ...props,
26
+ });
27
+ },
22
28
  });
@@ -20,5 +20,6 @@ export interface JoinNode extends OperationNode {
20
20
  export declare const JoinNode: Readonly<{
21
21
  is(node: OperationNode): node is JoinNode;
22
22
  create(joinType: JoinType, table: JoinTableNode): JoinNode;
23
+ createWithOn(joinType: JoinType, table: JoinTableNode, on: JoinNodeOnNode): JoinNode;
23
24
  cloneWithOn(joinNode: JoinNode, op: 'And' | 'Or', on: JoinNodeOnNode): JoinNode;
24
25
  }>;
@@ -19,6 +19,14 @@ exports.JoinNode = (0, object_utils_js_1.freeze)({
19
19
  on: undefined,
20
20
  });
21
21
  },
22
+ createWithOn(joinType, table, on) {
23
+ return (0, object_utils_js_1.freeze)({
24
+ kind: 'JoinNode',
25
+ joinType,
26
+ table,
27
+ on,
28
+ });
29
+ },
22
30
  cloneWithOn(joinNode, op, on) {
23
31
  return (0, object_utils_js_1.freeze)({
24
32
  ...joinNode,
@@ -399,6 +399,8 @@ class OperationNodeTransformer {
399
399
  columns: this.transformNodeList(node.columns),
400
400
  references: this.transformNode(node.references),
401
401
  name: this.transformNode(node.name),
402
+ onDelete: node.onDelete,
403
+ onUpdate: node.onUpdate,
402
404
  };
403
405
  }
404
406
  transformReferences(node) {
@@ -407,6 +409,7 @@ class OperationNodeTransformer {
407
409
  table: this.transformNode(node.table),
408
410
  columns: this.transformNodeList(node.columns),
409
411
  onDelete: node.onDelete,
412
+ onUpdate: node.onUpdate,
410
413
  };
411
414
  }
412
415
  transformCheckConstraint(node) {
@@ -1,12 +1,13 @@
1
1
  import { OperationNode } from './operation-node.js';
2
2
  import { ColumnNode } from './column-node.js';
3
3
  import { TableNode } from './table-node.js';
4
- export declare type OnDelete = 'cascade' | 'set null';
4
+ export declare type OnModifyForeignAction = 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default';
5
5
  export interface ReferencesNode extends OperationNode {
6
6
  readonly kind: 'ReferencesNode';
7
7
  readonly table: TableNode;
8
8
  readonly columns: ReadonlyArray<ColumnNode>;
9
- readonly onDelete?: OnDelete;
9
+ readonly onDelete?: OnModifyForeignAction;
10
+ readonly onUpdate?: OnModifyForeignAction;
10
11
  }
11
12
  /**
12
13
  * @internal
@@ -14,5 +15,6 @@ export interface ReferencesNode extends OperationNode {
14
15
  export declare const ReferencesNode: Readonly<{
15
16
  is(node: OperationNode): node is ReferencesNode;
16
17
  create(table: TableNode, columns: ReadonlyArray<ColumnNode>): ReferencesNode;
17
- cloneWithOnDelete(references: ReferencesNode, onDelete: OnDelete): ReferencesNode;
18
+ cloneWithOnDelete(references: ReferencesNode, onDelete: OnModifyForeignAction): ReferencesNode;
19
+ cloneWithOnUpdate(references: ReferencesNode, onUpdate: OnModifyForeignAction): ReferencesNode;
18
20
  }>;
@@ -22,4 +22,10 @@ exports.ReferencesNode = (0, object_utils_js_1.freeze)({
22
22
  onDelete,
23
23
  });
24
24
  },
25
+ cloneWithOnUpdate(references, onUpdate) {
26
+ return (0, object_utils_js_1.freeze)({
27
+ ...references,
28
+ onUpdate,
29
+ });
30
+ },
25
31
  });
@@ -11,10 +11,10 @@ exports.TableNode = (0, object_utils_js_1.freeze)({
11
11
  return node.kind === 'TableNode';
12
12
  },
13
13
  create(table) {
14
- return {
14
+ return (0, object_utils_js_1.freeze)({
15
15
  kind: 'TableNode',
16
16
  table: identifier_node_js_1.IdentifierNode.create(table),
17
- };
17
+ });
18
18
  },
19
19
  createWithSchema(schema, table) {
20
20
  return (0, object_utils_js_1.freeze)({
@@ -0,0 +1,5 @@
1
+ import { ColumnDataType, DataTypeNode } from '../operation-node/data-type-node.js';
2
+ import { RawNode } from '../operation-node/raw-node.js';
3
+ import { AnyRawBuilder } from '../query-builder/type-utils.js';
4
+ export declare type DataTypeExpression = ColumnDataType | AnyRawBuilder;
5
+ export declare function parseDataTypeExpression(dataType: DataTypeExpression): DataTypeNode | RawNode;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDataTypeExpression = void 0;
4
+ const data_type_node_js_1 = require("../operation-node/data-type-node.js");
5
+ const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
6
+ function parseDataTypeExpression(dataType) {
7
+ return (0, operation_node_source_js_1.isOperationNodeSource)(dataType)
8
+ ? dataType.toOperationNode()
9
+ : data_type_node_js_1.DataTypeNode.create(dataType);
10
+ }
11
+ exports.parseDataTypeExpression = parseDataTypeExpression;
@@ -0,0 +1,6 @@
1
+ import { RawNode } from '../operation-node/raw-node.js';
2
+ import { ValueNode } from '../operation-node/value-node.js';
3
+ import { AnyRawBuilder } from '../query-builder/type-utils.js';
4
+ import { PrimitiveValue } from '../util/object-utils.js';
5
+ export declare type DefaultValueExpression = PrimitiveValue | AnyRawBuilder;
6
+ export declare function parseDefaultValueExpression(value: DefaultValueExpression): ValueNode | RawNode;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDefaultValueExpression = void 0;
4
+ const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
5
+ const value_node_js_1 = require("../operation-node/value-node.js");
6
+ function parseDefaultValueExpression(value) {
7
+ return (0, operation_node_source_js_1.isOperationNodeSource)(value)
8
+ ? value.toOperationNode()
9
+ : value_node_js_1.ValueNode.createImmediate(value);
10
+ }
11
+ exports.parseDefaultValueExpression = parseDefaultValueExpression;
@@ -10,5 +10,5 @@ export declare function parseWhereFilter(ctx: ParseContext, args: any[]): Filter
10
10
  export declare function parseHavingFilter(ctx: ParseContext, args: any[]): FilterExpressionNode;
11
11
  export declare function parseOnFilter(ctx: ParseContext, args: any[]): FilterExpressionNode;
12
12
  export declare function parseReferenceFilter(ctx: ParseContext, lhs: ReferenceExpression<any, any>, op: FilterOperator, rhs: ReferenceExpression<any, any>): FilterNode;
13
- export declare function parseExistExpression(ctx: ParseContext, arg: ExistsExpression<any, any>): FilterNode;
14
- export declare function parseNotExistExpression(ctx: ParseContext, arg: ExistsExpression<any, any>): FilterNode;
13
+ export declare function parseExistFilter(ctx: ParseContext, arg: ExistsExpression<any, any>): FilterNode;
14
+ export declare function parseNotExistFilter(ctx: ParseContext, arg: ExistsExpression<any, any>): FilterNode;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseNotExistExpression = exports.parseExistExpression = exports.parseReferenceFilter = exports.parseOnFilter = exports.parseHavingFilter = exports.parseWhereFilter = void 0;
3
+ exports.parseNotExistFilter = exports.parseExistFilter = exports.parseReferenceFilter = exports.parseOnFilter = exports.parseHavingFilter = exports.parseWhereFilter = void 0;
4
4
  const filter_node_js_1 = require("../operation-node/filter-node.js");
5
5
  const object_utils_js_1 = require("../util/object-utils.js");
6
6
  const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
@@ -11,13 +11,12 @@ const reference_parser_js_1 = require("./reference-parser.js");
11
11
  const value_parser_js_1 = require("./value-parser.js");
12
12
  const select_query_node_js_1 = require("../operation-node/select-query-node.js");
13
13
  const value_node_js_1 = require("../operation-node/value-node.js");
14
- const table_parser_js_1 = require("./table-parser.js");
15
14
  function parseWhereFilter(ctx, args) {
16
15
  if (args.length === 3) {
17
16
  return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
18
17
  }
19
18
  else if (args.length === 1 && (0, object_utils_js_1.isFunction)(args[0])) {
20
- return parseWhereGrouper(ctx, args[0]);
19
+ return parseWhereGroup(ctx, args[0]);
21
20
  }
22
21
  else {
23
22
  throw new Error(`invalid arguments passed to a where method ${JSON.stringify(args)}`);
@@ -29,7 +28,7 @@ function parseHavingFilter(ctx, args) {
29
28
  return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
30
29
  }
31
30
  else if (args.length === 1 && (0, object_utils_js_1.isFunction)(args[0])) {
32
- return parseHavingGrouper(ctx, args[0]);
31
+ return parseHavingGroup(ctx, args[0]);
33
32
  }
34
33
  else {
35
34
  throw new Error(`invalid arguments passed to a having method ${JSON.stringify(args)}`);
@@ -41,7 +40,7 @@ function parseOnFilter(ctx, args) {
41
40
  return parseThreeArgFilter(ctx, args[0], args[1], args[2]);
42
41
  }
43
42
  else if (args.length === 1 && (0, object_utils_js_1.isFunction)(args[0])) {
44
- return parseOnGrouper(ctx, args[0]);
43
+ return parseOnGroup(ctx, args[0]);
45
44
  }
46
45
  else {
47
46
  throw new Error(`invalid arguments passed to an on method ${JSON.stringify(args)}`);
@@ -52,23 +51,14 @@ function parseReferenceFilter(ctx, lhs, op, rhs) {
52
51
  return filter_node_js_1.FilterNode.create((0, reference_parser_js_1.parseReferenceExpression)(ctx, lhs), parseFilterOperator(op), (0, reference_parser_js_1.parseReferenceExpression)(ctx, rhs));
53
52
  }
54
53
  exports.parseReferenceFilter = parseReferenceFilter;
55
- function parseExistExpression(ctx, arg) {
56
- return doParseExistExpression(ctx, 'exists', arg);
54
+ function parseExistFilter(ctx, arg) {
55
+ return parseExistExpression(ctx, 'exists', arg);
57
56
  }
58
- exports.parseExistExpression = parseExistExpression;
59
- function parseNotExistExpression(ctx, arg) {
60
- return doParseExistExpression(ctx, 'not exists', arg);
61
- }
62
- exports.parseNotExistExpression = parseNotExistExpression;
63
- function doParseExistExpression(ctx, type, arg) {
64
- const node = (0, object_utils_js_1.isFunction)(arg)
65
- ? arg(ctx.createSubQueryBuilder()).toOperationNode()
66
- : arg.toOperationNode();
67
- if (!select_query_node_js_1.SelectQueryNode.is(node) && !raw_node_js_1.RawNode.is(node)) {
68
- throw new Error('invalid where exists arg');
69
- }
70
- return filter_node_js_1.FilterNode.create(undefined, operator_node_js_1.OperatorNode.create(type), node);
57
+ exports.parseExistFilter = parseExistFilter;
58
+ function parseNotExistFilter(ctx, arg) {
59
+ return parseExistExpression(ctx, 'not exists', arg);
71
60
  }
61
+ exports.parseNotExistFilter = parseNotExistFilter;
72
62
  function parseThreeArgFilter(ctx, left, op, right) {
73
63
  if ((op === 'is' || op === 'is not') && ((0, object_utils_js_1.isNull)(right) || (0, object_utils_js_1.isBoolean)(right))) {
74
64
  return parseIsFilter(ctx, left, op, right);
@@ -79,38 +69,46 @@ function parseIsFilter(ctx, left, op, right) {
79
69
  return filter_node_js_1.FilterNode.create((0, reference_parser_js_1.parseReferenceExpression)(ctx, left), parseFilterOperator(op), value_node_js_1.ValueNode.createImmediate(right));
80
70
  }
81
71
  function parseFilterOperator(op) {
82
- if ((0, operation_node_source_js_1.isOperationNodeSource)(op)) {
83
- return op.toOperationNode();
84
- }
85
- else if ((0, object_utils_js_1.isString)(op)) {
86
- const opString = op.trim().toLowerCase();
87
- if (operator_node_js_1.OPERATORS.some((it) => it === opString)) {
88
- return operator_node_js_1.OperatorNode.create(opString);
72
+ if ((0, object_utils_js_1.isString)(op)) {
73
+ if (operator_node_js_1.OPERATORS.includes(op)) {
74
+ return operator_node_js_1.OperatorNode.create(op);
89
75
  }
90
76
  }
77
+ else if ((0, operation_node_source_js_1.isOperationNodeSource)(op)) {
78
+ return op.toOperationNode();
79
+ }
91
80
  throw new Error(`invalid comparison operator ${JSON.stringify(op)} passed to a filter method`);
92
81
  }
93
- function parseWhereGrouper(ctx, grouper) {
94
- const query = grouper(ctx.createEmptySelectQuery());
82
+ function parseWhereGroup(ctx, callback) {
83
+ const query = callback(ctx.createSelectQueryBuilder([]));
95
84
  const queryNode = query.toOperationNode();
96
85
  if (!queryNode.where) {
97
- throw new Error('no where methods called insided a grouper');
86
+ throw new Error('no `where*` methods called insided a group callback');
98
87
  }
99
88
  return parens_node_js_1.ParensNode.create(queryNode.where.where);
100
89
  }
101
- function parseHavingGrouper(ctx, grouper) {
102
- const query = grouper(ctx.createEmptySelectQuery());
90
+ function parseHavingGroup(ctx, callback) {
91
+ const query = callback(ctx.createSelectQueryBuilder([]));
103
92
  const queryNode = query.toOperationNode();
104
93
  if (!queryNode.having) {
105
- throw new Error('no having methods called insided a grouper');
94
+ throw new Error('no `having*` methods called insided a group callback');
106
95
  }
107
96
  return parens_node_js_1.ParensNode.create(queryNode.having.having);
108
97
  }
109
- function parseOnGrouper(ctx, grouper) {
110
- const joinBuilder = grouper(ctx.createJoinBuilder('InnerJoin', (0, table_parser_js_1.parseTableExpression)(ctx, 'table')));
98
+ function parseOnGroup(ctx, callback) {
99
+ const joinBuilder = callback(ctx.createJoinBuilder('InnerJoin', 'table'));
111
100
  const joinNode = joinBuilder.toOperationNode();
112
101
  if (!joinNode.on) {
113
- throw new Error('no `on` methods called insided a grouper where');
102
+ throw new Error('no `on*` methods called insided a group callback');
114
103
  }
115
104
  return parens_node_js_1.ParensNode.create(joinNode.on);
116
105
  }
106
+ function parseExistExpression(ctx, type, arg) {
107
+ const node = (0, object_utils_js_1.isFunction)(arg)
108
+ ? arg(ctx.createExpressionBuilder()).toOperationNode()
109
+ : arg.toOperationNode();
110
+ if (!select_query_node_js_1.SelectQueryNode.is(node) && !raw_node_js_1.RawNode.is(node)) {
111
+ throw new Error('invalid where exists arg');
112
+ }
113
+ return filter_node_js_1.FilterNode.create(undefined, operator_node_js_1.OperatorNode.create(type), node);
114
+ }
@@ -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,27 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseJoinArgs = void 0;
3
+ exports.parseJoin = void 0;
4
4
  const join_node_js_1 = require("../operation-node/join-node.js");
5
5
  const table_parser_js_1 = require("./table-parser.js");
6
6
  const filter_parser_js_1 = require("./filter-parser.js");
7
- function parseJoinArgs(ctx, joinType, args) {
8
- if (args.length === 2) {
9
- return parseCallbackJoin(ctx, joinType, args[0], args[1]);
10
- }
11
- else if (args.length === 3) {
7
+ function parseJoin(ctx, joinType, args) {
8
+ if (args.length === 3) {
12
9
  return parseSingleOnJoin(ctx, joinType, args[0], args[1], args[2]);
13
10
  }
11
+ else if (args.length === 2) {
12
+ return parseCallbackJoin(ctx, joinType, args[0], args[1]);
13
+ }
14
14
  else {
15
15
  throw new Error('not implemented');
16
16
  }
17
17
  }
18
- exports.parseJoinArgs = parseJoinArgs;
18
+ exports.parseJoin = parseJoin;
19
19
  function parseCallbackJoin(ctx, joinType, from, callback) {
20
- const tableNode = (0, table_parser_js_1.parseTableExpression)(ctx, from);
21
- const joinBuilder = callback(ctx.createJoinBuilder(joinType, tableNode));
20
+ const joinBuilder = callback(ctx.createJoinBuilder(joinType, from));
22
21
  return joinBuilder.toOperationNode();
23
22
  }
24
23
  function parseSingleOnJoin(ctx, joinType, from, lhsColumn, rhsColumn) {
25
- const tableNode = (0, table_parser_js_1.parseTableExpression)(ctx, from);
26
- return join_node_js_1.JoinNode.cloneWithOn(join_node_js_1.JoinNode.create(joinType, tableNode), 'And', (0, filter_parser_js_1.parseReferenceFilter)(ctx, lhsColumn, '=', rhsColumn));
24
+ return join_node_js_1.JoinNode.createWithOn(joinType, (0, table_parser_js_1.parseTableExpression)(ctx, from), (0, filter_parser_js_1.parseReferenceFilter)(ctx, lhsColumn, '=', rhsColumn));
27
25
  }
@@ -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;