kysely 0.19.9 → 0.19.12

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 (116) hide show
  1. package/README.md +56 -7
  2. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  3. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -0
  4. package/dist/cjs/dialect/mysql/mysql-driver.js +25 -0
  5. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  6. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +6 -2
  7. package/dist/cjs/dialect/postgres/postgres-driver.js +24 -2
  8. package/dist/cjs/dialect/sqlite/sqlite-driver.js +3 -0
  9. package/dist/cjs/driver/database-connection.d.ts +1 -0
  10. package/dist/cjs/driver/dummy-driver.js +3 -0
  11. package/dist/cjs/index.d.ts +4 -0
  12. package/dist/cjs/index.js +4 -0
  13. package/dist/cjs/operation-node/create-table-node.d.ts +3 -1
  14. package/dist/cjs/operation-node/create-table-node.js +2 -1
  15. package/dist/cjs/operation-node/create-type-node.d.ts +17 -0
  16. package/dist/cjs/operation-node/create-type-node.js +27 -0
  17. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  18. package/dist/cjs/operation-node/drop-type-node.d.ts +16 -0
  19. package/dist/cjs/operation-node/drop-type-node.js +25 -0
  20. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +2 -2
  21. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
  22. package/dist/cjs/operation-node/insert-query-node.js +2 -1
  23. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  24. package/dist/cjs/operation-node/operation-node-transformer.js +17 -0
  25. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  26. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  27. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  28. package/dist/cjs/operation-node/references-node.d.ts +3 -1
  29. package/dist/cjs/operation-node/references-node.js +8 -1
  30. package/dist/cjs/parser/on-commit-action-parse.d.ts +2 -0
  31. package/dist/cjs/parser/on-commit-action-parse.js +11 -0
  32. package/dist/cjs/parser/on-modify-action-parser.d.ts +2 -0
  33. package/dist/cjs/parser/on-modify-action-parser.js +11 -0
  34. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  35. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  36. package/dist/cjs/query-builder/insert-query-builder.d.ts +1 -1
  37. package/dist/cjs/query-builder/select-query-builder.d.ts +27 -0
  38. package/dist/cjs/query-builder/select-query-builder.js +34 -2
  39. package/dist/cjs/query-compiler/default-query-compiler.d.ts +5 -0
  40. package/dist/cjs/query-compiler/default-query-compiler.js +35 -2
  41. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  42. package/dist/cjs/query-creator.d.ts +27 -0
  43. package/dist/cjs/query-creator.js +33 -0
  44. package/dist/cjs/query-executor/query-executor-base.d.ts +6 -0
  45. package/dist/cjs/query-executor/query-executor-base.js +19 -0
  46. package/dist/cjs/query-executor/query-executor.d.ts +11 -0
  47. package/dist/cjs/schema/column-definition-builder.js +3 -2
  48. package/dist/cjs/schema/create-table-builder.d.ts +6 -6
  49. package/dist/cjs/schema/create-table-builder.js +8 -7
  50. package/dist/cjs/schema/create-type-builder.d.ts +28 -0
  51. package/dist/cjs/schema/create-type-builder.js +38 -0
  52. package/dist/cjs/schema/drop-type-builder.d.ts +19 -0
  53. package/dist/cjs/schema/drop-type-builder.js +31 -0
  54. package/dist/cjs/schema/foreign-key-constraint-builder.js +3 -2
  55. package/dist/cjs/schema/schema.d.ts +32 -0
  56. package/dist/cjs/schema/schema.js +46 -0
  57. package/dist/cjs/util/deferred.d.ts +7 -0
  58. package/dist/cjs/util/deferred.js +28 -0
  59. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  60. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -0
  61. package/dist/esm/dialect/mysql/mysql-driver.js +25 -0
  62. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  63. package/dist/esm/dialect/postgres/postgres-driver.d.ts +6 -2
  64. package/dist/esm/dialect/postgres/postgres-driver.js +24 -2
  65. package/dist/esm/dialect/sqlite/sqlite-driver.js +3 -0
  66. package/dist/esm/driver/database-connection.d.ts +1 -0
  67. package/dist/esm/driver/dummy-driver.js +3 -0
  68. package/dist/esm/index.d.ts +4 -0
  69. package/dist/esm/index.js +4 -0
  70. package/dist/esm/operation-node/create-table-node.d.ts +3 -1
  71. package/dist/esm/operation-node/create-table-node.js +1 -0
  72. package/dist/esm/operation-node/create-type-node.d.ts +17 -0
  73. package/dist/esm/operation-node/create-type-node.js +25 -0
  74. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  75. package/dist/esm/operation-node/drop-type-node.d.ts +16 -0
  76. package/dist/esm/operation-node/drop-type-node.js +23 -0
  77. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +2 -2
  78. package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
  79. package/dist/esm/operation-node/insert-query-node.js +2 -1
  80. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  81. package/dist/esm/operation-node/operation-node-transformer.js +17 -0
  82. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  83. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  84. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  85. package/dist/esm/operation-node/references-node.d.ts +3 -1
  86. package/dist/esm/operation-node/references-node.js +7 -0
  87. package/dist/esm/parser/on-commit-action-parse.d.ts +2 -0
  88. package/dist/esm/parser/on-commit-action-parse.js +8 -0
  89. package/dist/esm/parser/on-modify-action-parser.d.ts +2 -0
  90. package/dist/esm/parser/on-modify-action-parser.js +8 -0
  91. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  92. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  93. package/dist/esm/query-builder/insert-query-builder.d.ts +1 -1
  94. package/dist/esm/query-builder/select-query-builder.d.ts +27 -0
  95. package/dist/esm/query-builder/select-query-builder.js +34 -2
  96. package/dist/esm/query-compiler/default-query-compiler.d.ts +5 -0
  97. package/dist/esm/query-compiler/default-query-compiler.js +35 -2
  98. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  99. package/dist/esm/query-creator.d.ts +27 -0
  100. package/dist/esm/query-creator.js +33 -0
  101. package/dist/esm/query-executor/query-executor-base.d.ts +6 -0
  102. package/dist/esm/query-executor/query-executor-base.js +19 -0
  103. package/dist/esm/query-executor/query-executor.d.ts +11 -0
  104. package/dist/esm/schema/column-definition-builder.js +3 -2
  105. package/dist/esm/schema/create-table-builder.d.ts +6 -6
  106. package/dist/esm/schema/create-table-builder.js +8 -7
  107. package/dist/esm/schema/create-type-builder.d.ts +28 -0
  108. package/dist/esm/schema/create-type-builder.js +35 -0
  109. package/dist/esm/schema/drop-type-builder.d.ts +19 -0
  110. package/dist/esm/schema/drop-type-builder.js +28 -0
  111. package/dist/esm/schema/foreign-key-constraint-builder.js +3 -2
  112. package/dist/esm/schema/schema.d.ts +32 -0
  113. package/dist/esm/schema/schema.js +46 -0
  114. package/dist/esm/util/deferred.d.ts +7 -0
  115. package/dist/esm/util/deferred.js +25 -0
  116. package/package.json +5 -2
@@ -1,7 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ReferencesNode = void 0;
3
+ exports.ReferencesNode = exports.ON_MODIFY_FOREIGN_ACTIONS = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
+ exports.ON_MODIFY_FOREIGN_ACTIONS = [
6
+ 'no action',
7
+ 'restrict',
8
+ 'cascade',
9
+ 'set null',
10
+ 'set default',
11
+ ];
5
12
  /**
6
13
  * @internal
7
14
  */
@@ -0,0 +1,2 @@
1
+ import { OnCommitAction } from '../operation-node/create-table-node.js';
2
+ export declare function parseOnCommitAction(action: OnCommitAction): OnCommitAction;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOnCommitAction = void 0;
4
+ const create_table_node_js_1 = require("../operation-node/create-table-node.js");
5
+ function parseOnCommitAction(action) {
6
+ if (create_table_node_js_1.ON_COMMIT_ACTIONS.includes(action)) {
7
+ return action;
8
+ }
9
+ throw new Error(`invalid OnCommitAction ${action}`);
10
+ }
11
+ exports.parseOnCommitAction = parseOnCommitAction;
@@ -0,0 +1,2 @@
1
+ import { OnModifyForeignAction } from '../operation-node/references-node.js';
2
+ export declare function parseOnModifyForeignAction(action: OnModifyForeignAction): OnModifyForeignAction;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOnModifyForeignAction = void 0;
4
+ const references_node_js_1 = require("../operation-node/references-node.js");
5
+ function parseOnModifyForeignAction(action) {
6
+ if (references_node_js_1.ON_MODIFY_FOREIGN_ACTIONS.includes(action)) {
7
+ return action;
8
+ }
9
+ throw new Error(`invalid OnModifyForeignAction ${action}`);
10
+ }
11
+ exports.parseOnModifyForeignAction = parseOnModifyForeignAction;
@@ -1,10 +1,12 @@
1
1
  import { AlterTableNode } from '../../operation-node/alter-table-node.js';
2
2
  import { CreateIndexNode } from '../../operation-node/create-index-node.js';
3
3
  import { CreateTableNode } from '../../operation-node/create-table-node.js';
4
+ import { CreateTypeNode } from '../../operation-node/create-type-node.js';
4
5
  import { CreateViewNode } from '../../operation-node/create-view-node.js';
5
6
  import { DeleteQueryNode } from '../../operation-node/delete-query-node.js';
6
7
  import { DropIndexNode } from '../../operation-node/drop-index-node.js';
7
8
  import { DropTableNode } from '../../operation-node/drop-table-node.js';
9
+ import { DropTypeNode } from '../../operation-node/drop-type-node.js';
8
10
  import { DropViewNode } from '../../operation-node/drop-view-node.js';
9
11
  import { InsertQueryNode } from '../../operation-node/insert-query-node.js';
10
12
  import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
@@ -24,6 +26,8 @@ export declare class WithSchemaTransformer extends OperationNodeTransformer {
24
26
  protected transformDropIndex(node: DropIndexNode): DropIndexNode;
25
27
  protected transformCreateView(node: CreateViewNode): CreateViewNode;
26
28
  protected transformDropView(node: DropViewNode): DropViewNode;
29
+ protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
30
+ protected transformDropType(node: DropTypeNode): DropTypeNode;
27
31
  protected transformAlterTable(node: AlterTableNode): AlterTableNode;
28
32
  protected transformTable(node: TableNode): TableNode;
29
33
  }
@@ -41,6 +41,12 @@ class WithSchemaTransformer extends operation_node_transformer_js_1.OperationNod
41
41
  transformDropView(node) {
42
42
  return this.#transformRoot(node, (node) => super.transformDropView(node));
43
43
  }
44
+ transformCreateType(node) {
45
+ return this.#transformRoot(node, (node) => super.transformCreateType(node));
46
+ }
47
+ transformDropType(node) {
48
+ return this.#transformRoot(node, (node) => super.transformDropType(node));
49
+ }
44
50
  transformAlterTable(node) {
45
51
  return this.#transformRoot(node, (node) => super.transformAlterTable(node));
46
52
  }
@@ -43,7 +43,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
43
43
  *
44
44
  * Insert a row into `person`:
45
45
  * ```ts
46
- * const id = await db
46
+ * const result = await db
47
47
  * .insertInto('person')
48
48
  * .values({
49
49
  * first_name: 'Jennifer',
@@ -1343,6 +1343,33 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1343
1343
  * error.
1344
1344
  */
1345
1345
  executeTakeFirstOrThrow(errorConstructor?: NoResultErrorConstructor): Promise<O>;
1346
+ /**
1347
+ * Executes the query and streams the rows.
1348
+ *
1349
+ * The optional argument `chunkSize` defines how many rows to fetch from the database
1350
+ * at a time. It only affects some dialects like PostgreSQL that support it.
1351
+ *
1352
+ * ### Examples
1353
+ *
1354
+ * ```ts
1355
+ * const stream = db.
1356
+ * .selectFrom('person')
1357
+ * .select(['first_name', 'last_name'])
1358
+ * .where('gender', '=', 'other')
1359
+ * .stream()
1360
+ *
1361
+ * for await (const person of stream) {
1362
+ * console.log(person.first_name)
1363
+ *
1364
+ * if (person.last_name === 'Something') {
1365
+ * // Breaking or returning before the stream has ended will release
1366
+ * // the database connection and invalidate the stream.
1367
+ * break
1368
+ * }
1369
+ * }
1370
+ * ```
1371
+ */
1372
+ stream(chunkSize?: number): AsyncIterableIterator<O>;
1346
1373
  }
1347
1374
  export interface SelectQueryBuilderProps {
1348
1375
  readonly queryId: QueryId;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AliasedQueryBuilder = exports.SelectQueryBuilder = void 0;
4
4
  const alias_node_js_1 = require("../operation-node/alias-node.js");
5
+ const select_modifier_node_js_1 = require("../operation-node/select-modifier-node.js");
5
6
  const join_parser_js_1 = require("../parser/join-parser.js");
6
7
  const select_parser_js_1 = require("../parser/select-parser.js");
7
8
  const filter_parser_js_1 = require("../parser/filter-parser.js");
@@ -16,7 +17,6 @@ const group_by_parser_js_1 = require("../parser/group-by-parser.js");
16
17
  const union_parser_js_1 = require("../parser/union-parser.js");
17
18
  const no_result_error_js_1 = require("./no-result-error.js");
18
19
  const identifier_node_js_1 = require("../operation-node/identifier-node.js");
19
- const select_modifier_node_js_1 = require("../operation-node/select-modifier-node.js");
20
20
  class SelectQueryBuilder {
21
21
  #props;
22
22
  constructor(props) {
@@ -630,7 +630,6 @@ class SelectQueryBuilder {
630
630
  */
631
631
  async execute() {
632
632
  const compildQuery = this.compile();
633
- const query = compildQuery.query;
634
633
  const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
635
634
  return result.rows;
636
635
  }
@@ -657,6 +656,39 @@ class SelectQueryBuilder {
657
656
  }
658
657
  return result;
659
658
  }
659
+ /**
660
+ * Executes the query and streams the rows.
661
+ *
662
+ * The optional argument `chunkSize` defines how many rows to fetch from the database
663
+ * at a time. It only affects some dialects like PostgreSQL that support it.
664
+ *
665
+ * ### Examples
666
+ *
667
+ * ```ts
668
+ * const stream = db.
669
+ * .selectFrom('person')
670
+ * .select(['first_name', 'last_name'])
671
+ * .where('gender', '=', 'other')
672
+ * .stream()
673
+ *
674
+ * for await (const person of stream) {
675
+ * console.log(person.first_name)
676
+ *
677
+ * if (person.last_name === 'Something') {
678
+ * // Breaking or returning before the stream has ended will release
679
+ * // the database connection and invalidate the stream.
680
+ * break
681
+ * }
682
+ * }
683
+ * ```
684
+ */
685
+ async *stream(chunkSize = 100) {
686
+ const compildQuery = this.compile();
687
+ const stream = this.#props.executor.stream(compildQuery, chunkSize, this.#props.queryId);
688
+ for await (const item of stream) {
689
+ yield* item.rows;
690
+ }
691
+ }
660
692
  }
661
693
  exports.SelectQueryBuilder = SelectQueryBuilder;
662
694
  (0, prevent_await_js_1.preventAwait)(SelectQueryBuilder, "don't await SelectQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
@@ -69,6 +69,8 @@ import { OnNode } from '../operation-node/on-node.js';
69
69
  import { ValuesNode } from '../operation-node/values-node.js';
70
70
  import { CommonTableExpressionNameNode } from '../operation-node/common-table-expression-name-node.js';
71
71
  import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
72
+ import { CreateTypeNode } from '../operation-node/create-type-node.js';
73
+ import { DropTypeNode } from '../operation-node/drop-type-node.js';
72
74
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
73
75
  #private;
74
76
  protected get numParameters(): number;
@@ -145,11 +147,14 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
145
147
  protected visitGenerated(node: GeneratedNode): void;
146
148
  protected visitDefaultValue(node: DefaultValueNode): void;
147
149
  protected visitSelectModifier(node: SelectModifierNode): void;
150
+ protected visitCreateType(node: CreateTypeNode): void;
151
+ protected visitDropType(node: DropTypeNode): void;
148
152
  protected append(str: string): void;
149
153
  protected appendValue(parameter: unknown): void;
150
154
  protected getLeftIdentifierWrapper(): string;
151
155
  protected getRightIdentifierWrapper(): string;
152
156
  protected getCurrentParameterPlaceholder(): string;
157
+ protected sanitizeIdentifier(identifier: string): string;
153
158
  protected addParameter(parameter: unknown): void;
154
159
  protected appendImmediateValue(value: unknown): void;
155
160
  }
@@ -134,7 +134,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
134
134
  this.visitNode(node.with);
135
135
  this.append(' ');
136
136
  }
137
- this.append('insert');
137
+ this.append(node.replace ? 'replace' : 'insert');
138
138
  if (node.ignore) {
139
139
  this.append(' ignore');
140
140
  }
@@ -227,7 +227,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
227
227
  this.append(this.getRightIdentifierWrapper());
228
228
  }
229
229
  compileUnwrappedIdentifier(node) {
230
- this.append(node.identifier);
230
+ this.append(this.sanitizeIdentifier(node.identifier));
231
231
  }
232
232
  visitFilter(node) {
233
233
  if (node.left) {
@@ -791,6 +791,21 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
791
791
  this.append(SELECT_MODIFIER_SQL[node.modifier]);
792
792
  }
793
793
  }
794
+ visitCreateType(node) {
795
+ this.append('create type ');
796
+ this.visitNode(node.name);
797
+ if (node.enum) {
798
+ this.append(' as enum ');
799
+ this.visitNode(node.enum);
800
+ }
801
+ }
802
+ visitDropType(node) {
803
+ this.append('drop type ');
804
+ if (node.ifExists) {
805
+ this.append('if exists ');
806
+ }
807
+ this.visitNode(node.name);
808
+ }
794
809
  append(str) {
795
810
  this.#sql += str;
796
811
  }
@@ -807,6 +822,24 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
807
822
  getCurrentParameterPlaceholder() {
808
823
  return '$' + this.numParameters;
809
824
  }
825
+ sanitizeIdentifier(identifier) {
826
+ if (!(0, object_utils_js_1.isString)(identifier)) {
827
+ throw new Error('a non-string identifier was passed to sanitizeIdentifier.');
828
+ }
829
+ const leftWrap = this.getLeftIdentifierWrapper();
830
+ const rightWrap = this.getRightIdentifierWrapper();
831
+ let sanitized = '';
832
+ for (const c of identifier) {
833
+ sanitized += c;
834
+ if (c === leftWrap) {
835
+ sanitized += leftWrap;
836
+ }
837
+ else if (c === rightWrap) {
838
+ sanitized += rightWrap;
839
+ }
840
+ }
841
+ return sanitized;
842
+ }
810
843
  addParameter(parameter) {
811
844
  this.#parameters.push(parameter);
812
845
  }
@@ -2,15 +2,17 @@ import { AlterTableNode } from '../operation-node/alter-table-node.js';
2
2
  import { CreateIndexNode } from '../operation-node/create-index-node.js';
3
3
  import { CreateSchemaNode } from '../operation-node/create-schema-node.js';
4
4
  import { CreateTableNode } from '../operation-node/create-table-node.js';
5
+ import { CreateTypeNode } from '../operation-node/create-type-node.js';
5
6
  import { CreateViewNode } from '../operation-node/create-view-node.js';
6
7
  import { DropIndexNode } from '../operation-node/drop-index-node.js';
7
8
  import { DropSchemaNode } from '../operation-node/drop-schema-node.js';
8
9
  import { DropTableNode } from '../operation-node/drop-table-node.js';
10
+ import { DropTypeNode } from '../operation-node/drop-type-node.js';
9
11
  import { DropViewNode } from '../operation-node/drop-view-node.js';
10
12
  import { QueryNode } from '../operation-node/query-node.js';
11
13
  import { RawNode } from '../operation-node/raw-node.js';
12
14
  import { CompiledQuery } from './compiled-query.js';
13
- export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode;
15
+ export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode | CreateTypeNode | DropTypeNode;
14
16
  /**
15
17
  * a `QueryCompiler` compiles a query expressed as a tree of `OperationNodes` into SQL.
16
18
  */
@@ -161,6 +161,33 @@ export declare class QueryCreator<DB> {
161
161
  * ```
162
162
  */
163
163
  insertInto<T extends keyof DB & string>(table: T): InsertQueryBuilder<DB, T, InsertResult>;
164
+ /**
165
+ * Creates a replace query.
166
+ *
167
+ * A MySQL-only statement similar to {@link InsertQueryBuilder.onDuplicateKeyUpdate}
168
+ * that deletes and inserts values on collision instead of updating existing rows.
169
+ *
170
+ * The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
171
+ * has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
172
+ * the inserted row if the db returned one.
173
+ *
174
+ * See the {@link InsertQueryBuilder.values | values} method for more info and examples.
175
+ *
176
+ * ### Examples
177
+ *
178
+ * ```ts
179
+ * const result = await db
180
+ * .replaceInto('person')
181
+ * .values({
182
+ * first_name: 'Jennifer',
183
+ * last_name: 'Aniston'
184
+ * })
185
+ * .executeTakeFirst()
186
+ *
187
+ * console.log(result.insertId)
188
+ * ```
189
+ */
190
+ replaceInto<T extends keyof DB & string>(table: T): InsertQueryBuilder<DB, T, InsertResult>;
164
191
  /**
165
192
  * Creates a delete query.
166
193
  *
@@ -72,6 +72,39 @@ class QueryCreator {
72
72
  queryNode: insert_query_node_js_1.InsertQueryNode.create((0, table_parser_js_1.parseTable)(table), this.#props.withNode),
73
73
  });
74
74
  }
75
+ /**
76
+ * Creates a replace query.
77
+ *
78
+ * A MySQL-only statement similar to {@link InsertQueryBuilder.onDuplicateKeyUpdate}
79
+ * that deletes and inserts values on collision instead of updating existing rows.
80
+ *
81
+ * The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
82
+ * has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
83
+ * the inserted row if the db returned one.
84
+ *
85
+ * See the {@link InsertQueryBuilder.values | values} method for more info and examples.
86
+ *
87
+ * ### Examples
88
+ *
89
+ * ```ts
90
+ * const result = await db
91
+ * .replaceInto('person')
92
+ * .values({
93
+ * first_name: 'Jennifer',
94
+ * last_name: 'Aniston'
95
+ * })
96
+ * .executeTakeFirst()
97
+ *
98
+ * console.log(result.insertId)
99
+ * ```
100
+ */
101
+ replaceInto(table) {
102
+ return new insert_query_builder_js_1.InsertQueryBuilder({
103
+ queryId: (0, query_id_js_1.createQueryId)(),
104
+ executor: this.#props.executor,
105
+ queryNode: insert_query_node_js_1.InsertQueryNode.create((0, table_parser_js_1.parseTable)(table), this.#props.withNode, true),
106
+ });
107
+ }
75
108
  /**
76
109
  * Creates a delete query.
77
110
  *
@@ -36,6 +36,12 @@ export declare abstract class QueryExecutorBase implements QueryExecutor {
36
36
  * `transformResult` method.
37
37
  */
38
38
  executeQuery<R>(compiledQuery: CompiledQuery, queryId: QueryId): Promise<QueryResult<R>>;
39
+ /**
40
+ * Executes a compiled query and runs the result through all plugins'
41
+ * `transformResult` method. Results are streamead instead of loaded
42
+ * at once.
43
+ */
44
+ stream<R>(compiledQuery: CompiledQuery, chunkSize: number, queryId: QueryId): AsyncIterableIterator<QueryResult<R>>;
39
45
  /**
40
46
  * Returns a copy of this executor with a new connection provider.
41
47
  */
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.QueryExecutorBase = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
+ const deferred_js_1 = require("../util/deferred.js");
5
6
  const NO_PLUGINS = (0, object_utils_js_1.freeze)([]);
6
7
  class QueryExecutorBase {
7
8
  #plugins;
@@ -36,6 +37,24 @@ class QueryExecutorBase {
36
37
  return this.#transformResult(result, queryId);
37
38
  });
38
39
  }
40
+ async *stream(compiledQuery, chunkSize, queryId) {
41
+ const connectionDefer = new deferred_js_1.Deferred();
42
+ const connectionReleaseDefer = new deferred_js_1.Deferred();
43
+ this.provideConnection(async (connection) => {
44
+ connectionDefer.resolve(connection);
45
+ // Lets wait until we don't need connection before returning here (returning releases connection)
46
+ return await connectionReleaseDefer.promise;
47
+ }).catch((ex) => connectionDefer.reject(ex));
48
+ const connection = await connectionDefer.promise;
49
+ try {
50
+ for await (const result of connection.streamQuery(compiledQuery, chunkSize)) {
51
+ yield await this.#transformResult(result, queryId);
52
+ }
53
+ }
54
+ finally {
55
+ connectionReleaseDefer.resolve();
56
+ }
57
+ }
39
58
  async #transformResult(result, queryId) {
40
59
  for (const plugin of this.#plugins) {
41
60
  result = await plugin.transformResult({ result, queryId });
@@ -37,6 +37,17 @@ export interface QueryExecutor extends ConnectionProvider {
37
37
  * `transformResult` method.
38
38
  */
39
39
  executeQuery<R>(compiledQuery: CompiledQuery, queryId: QueryId): Promise<QueryResult<R>>;
40
+ /**
41
+ * Executes a compiled query and runs the result through all plugins'
42
+ * `transformResult` method. Results are streamead instead of loaded
43
+ * at once.
44
+ */
45
+ stream<R>(compiledQuery: CompiledQuery,
46
+ /**
47
+ * How many rows should be pulled from the database at once. Supported
48
+ * only by the postgres driver.
49
+ */
50
+ chunkSize: number, queryId: QueryId): AsyncIterableIterator<QueryResult<R>>;
40
51
  /**
41
52
  * Returns a copy of this executor with a new connection provider.
42
53
  */
@@ -11,6 +11,7 @@ const column_definition_node_js_1 = require("../operation-node/column-definition
11
11
  const default_value_parser_js_1 = require("../parser/default-value-parser.js");
12
12
  const generated_node_js_1 = require("../operation-node/generated-node.js");
13
13
  const default_value_node_js_1 = require("../operation-node/default-value-node.js");
14
+ const on_modify_action_parser_js_1 = require("../parser/on-modify-action-parser.js");
14
15
  class ColumnDefinitionBuilder {
15
16
  #node;
16
17
  constructor(node) {
@@ -38,7 +39,7 @@ class ColumnDefinitionBuilder {
38
39
  throw new Error('on delete constraint can only be added for foreign keys');
39
40
  }
40
41
  return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {
41
- references: references_node_js_1.ReferencesNode.cloneWithOnDelete(this.#node.references, onDelete),
42
+ references: references_node_js_1.ReferencesNode.cloneWithOnDelete(this.#node.references, (0, on_modify_action_parser_js_1.parseOnModifyForeignAction)(onDelete)),
42
43
  }));
43
44
  }
44
45
  onUpdate(onUpdate) {
@@ -46,7 +47,7 @@ class ColumnDefinitionBuilder {
46
47
  throw new Error('on update constraint can only be added for foreign keys');
47
48
  }
48
49
  return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {
49
- references: references_node_js_1.ReferencesNode.cloneWithOnUpdate(this.#node.references, onUpdate),
50
+ references: references_node_js_1.ReferencesNode.cloneWithOnUpdate(this.#node.references, (0, on_modify_action_parser_js_1.parseOnModifyForeignAction)(onUpdate)),
50
51
  }));
51
52
  }
52
53
  unique() {
@@ -47,17 +47,17 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
47
47
  * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
48
48
  * .addColumn('last_name', 'varchar(255)')
49
49
  * .addColumn('bank_balance', 'numeric(8, 2)')
50
- * .addColumn('data', sql`customtype`)
50
+ * .addColumn('data', sql`some_type`)
51
51
  * .addColumn('parent_id', 'integer', (col) =>
52
52
  * col.references('person.id').onDelete('cascade'))
53
53
  * )
54
54
  * ```
55
55
  *
56
- * With this method, it's once again good to remember that Kysely just builds the query
57
- * and doesn't provide the same API for all databses. For example, some databases like
58
- * older MySQL don't support `references` statement in the column definition. Instead
59
- * foreign key constraints need to be defined in at the level of the `create table`
60
- * query. See the next example:
56
+ * With this method, it's once again good to remember that Kysely just builds the
57
+ * query and doesn't provide the same API for all databses. For example, some
58
+ * databases like older MySQL don't support the `references` statement in the
59
+ * column definition. Instead foreign key constraints need to be defined in the
60
+ * `create table` query. See the next example:
61
61
  *
62
62
  * ```ts
63
63
  * .addColumn('parent_id', 'integer')
@@ -14,6 +14,7 @@ const primary_constraint_node_js_1 = require("../operation-node/primary-constrai
14
14
  const unique_constraint_node_js_1 = require("../operation-node/unique-constraint-node.js");
15
15
  const check_constraint_node_js_1 = require("../operation-node/check-constraint-node.js");
16
16
  const table_parser_js_1 = require("../parser/table-parser.js");
17
+ const on_commit_action_parse_js_1 = require("../parser/on-commit-action-parse.js");
17
18
  /**
18
19
  * This builder can be used to create a `create table` query.
19
20
  */
@@ -45,7 +46,7 @@ class CreateTableBuilder {
45
46
  return new CreateTableBuilder({
46
47
  ...this.#props,
47
48
  createTableNode: create_table_node_js_1.CreateTableNode.cloneWith(this.#props.createTableNode, {
48
- onCommit,
49
+ onCommit: (0, on_commit_action_parse_js_1.parseOnCommitAction)(onCommit),
49
50
  }),
50
51
  });
51
52
  }
@@ -76,17 +77,17 @@ class CreateTableBuilder {
76
77
  * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
77
78
  * .addColumn('last_name', 'varchar(255)')
78
79
  * .addColumn('bank_balance', 'numeric(8, 2)')
79
- * .addColumn('data', sql`customtype`)
80
+ * .addColumn('data', sql`some_type`)
80
81
  * .addColumn('parent_id', 'integer', (col) =>
81
82
  * col.references('person.id').onDelete('cascade'))
82
83
  * )
83
84
  * ```
84
85
  *
85
- * With this method, it's once again good to remember that Kysely just builds the query
86
- * and doesn't provide the same API for all databses. For example, some databases like
87
- * older MySQL don't support `references` statement in the column definition. Instead
88
- * foreign key constraints need to be defined in at the level of the `create table`
89
- * query. See the next example:
86
+ * With this method, it's once again good to remember that Kysely just builds the
87
+ * query and doesn't provide the same API for all databses. For example, some
88
+ * databases like older MySQL don't support the `references` statement in the
89
+ * column definition. Instead foreign key constraints need to be defined in the
90
+ * `create table` query. See the next example:
90
91
  *
91
92
  * ```ts
92
93
  * .addColumn('parent_id', 'integer')
@@ -0,0 +1,28 @@
1
+ import { OperationNodeSource } from '../operation-node/operation-node-source.js';
2
+ import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
+ import { Compilable } from '../util/compilable.js';
4
+ import { QueryExecutor } from '../query-executor/query-executor.js';
5
+ import { QueryId } from '../util/query-id.js';
6
+ import { CreateTypeNode } from '../operation-node/create-type-node.js';
7
+ export declare class CreateTypeBuilder implements OperationNodeSource, Compilable {
8
+ #private;
9
+ constructor(props: CreateTypeBuilderProps);
10
+ toOperationNode(): CreateTypeNode;
11
+ /**
12
+ * Creates an anum type.
13
+ *
14
+ * ### Examples
15
+ *
16
+ * ```ts
17
+ * db.schema.createType('species').asEnum(['cat', 'dog', 'frog'])
18
+ * ```
19
+ */
20
+ asEnum(values: string[]): CreateTypeBuilder;
21
+ compile(): CompiledQuery;
22
+ execute(): Promise<void>;
23
+ }
24
+ export interface CreateTypeBuilderProps {
25
+ readonly queryId: QueryId;
26
+ readonly executor: QueryExecutor;
27
+ readonly createTypeNode: CreateTypeNode;
28
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateTypeBuilder = void 0;
4
+ const prevent_await_js_1 = require("../util/prevent-await.js");
5
+ const object_utils_js_1 = require("../util/object-utils.js");
6
+ const create_type_node_js_1 = require("../operation-node/create-type-node.js");
7
+ class CreateTypeBuilder {
8
+ #props;
9
+ constructor(props) {
10
+ this.#props = (0, object_utils_js_1.freeze)(props);
11
+ }
12
+ toOperationNode() {
13
+ return this.#props.executor.transformQuery(this.#props.createTypeNode, this.#props.queryId);
14
+ }
15
+ /**
16
+ * Creates an anum type.
17
+ *
18
+ * ### Examples
19
+ *
20
+ * ```ts
21
+ * db.schema.createType('species').asEnum(['cat', 'dog', 'frog'])
22
+ * ```
23
+ */
24
+ asEnum(values) {
25
+ return new CreateTypeBuilder({
26
+ ...this.#props,
27
+ createTypeNode: create_type_node_js_1.CreateTypeNode.cloneWithEnum(this.#props.createTypeNode, values),
28
+ });
29
+ }
30
+ compile() {
31
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
32
+ }
33
+ async execute() {
34
+ await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
35
+ }
36
+ }
37
+ exports.CreateTypeBuilder = CreateTypeBuilder;
38
+ (0, prevent_await_js_1.preventAwait)(CreateTypeBuilder, "don't await CreateTypeBuilder instances directly. To execute the query you need to call `execute`");
@@ -0,0 +1,19 @@
1
+ import { DropTypeNode } from '../operation-node/drop-type-node.js';
2
+ import { OperationNodeSource } from '../operation-node/operation-node-source.js';
3
+ import { CompiledQuery } from '../query-compiler/compiled-query.js';
4
+ import { Compilable } from '../util/compilable.js';
5
+ import { QueryExecutor } from '../query-executor/query-executor.js';
6
+ import { QueryId } from '../util/query-id.js';
7
+ export declare class DropTypeBuilder implements OperationNodeSource, Compilable {
8
+ #private;
9
+ constructor(props: DropTypeBuilderProps);
10
+ ifExists(): DropTypeBuilder;
11
+ toOperationNode(): DropTypeNode;
12
+ compile(): CompiledQuery;
13
+ execute(): Promise<void>;
14
+ }
15
+ export interface DropTypeBuilderProps {
16
+ readonly queryId: QueryId;
17
+ readonly executor: QueryExecutor;
18
+ readonly dropTypeNode: DropTypeNode;
19
+ }