kysely 0.19.7 → 0.19.10

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 (60) hide show
  1. package/README.md +16 -10
  2. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -1
  3. package/dist/cjs/operation-node/create-type-node.d.ts +17 -0
  4. package/dist/cjs/operation-node/create-type-node.js +27 -0
  5. package/dist/cjs/operation-node/drop-type-node.d.ts +16 -0
  6. package/dist/cjs/operation-node/drop-type-node.js +25 -0
  7. package/dist/cjs/operation-node/operation-node-transformer.d.ts +9 -2
  8. package/dist/cjs/operation-node/operation-node-transformer.js +147 -122
  9. package/dist/cjs/operation-node/operation-node-visitor.d.ts +6 -0
  10. package/dist/cjs/operation-node/operation-node-visitor.js +3 -0
  11. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  12. package/dist/cjs/operation-node/select-modifier-node.d.ts +16 -0
  13. package/dist/cjs/operation-node/select-modifier-node.js +24 -0
  14. package/dist/cjs/operation-node/select-query-node.d.ts +5 -5
  15. package/dist/cjs/operation-node/select-query-node.js +11 -9
  16. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  17. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  18. package/dist/cjs/query-builder/select-query-builder.d.ts +50 -6
  19. package/dist/cjs/query-builder/select-query-builder.js +68 -13
  20. package/dist/cjs/query-compiler/default-query-compiler.d.ts +6 -0
  21. package/dist/cjs/query-compiler/default-query-compiler.js +29 -7
  22. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  23. package/dist/cjs/schema/create-type-builder.d.ts +19 -0
  24. package/dist/cjs/schema/create-type-builder.js +29 -0
  25. package/dist/cjs/schema/drop-type-builder.d.ts +19 -0
  26. package/dist/cjs/schema/drop-type-builder.js +31 -0
  27. package/dist/cjs/schema/schema.d.ts +32 -0
  28. package/dist/cjs/schema/schema.js +46 -0
  29. package/dist/cjs/util/require-all-props.d.ts +43 -0
  30. package/dist/cjs/util/require-all-props.js +40 -0
  31. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -1
  32. package/dist/esm/operation-node/create-type-node.d.ts +17 -0
  33. package/dist/esm/operation-node/create-type-node.js +25 -0
  34. package/dist/esm/operation-node/drop-type-node.d.ts +16 -0
  35. package/dist/esm/operation-node/drop-type-node.js +23 -0
  36. package/dist/esm/operation-node/operation-node-transformer.d.ts +9 -2
  37. package/dist/esm/operation-node/operation-node-transformer.js +147 -122
  38. package/dist/esm/operation-node/operation-node-visitor.d.ts +6 -0
  39. package/dist/esm/operation-node/operation-node-visitor.js +3 -0
  40. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  41. package/dist/esm/operation-node/select-modifier-node.d.ts +16 -0
  42. package/dist/esm/operation-node/select-modifier-node.js +22 -0
  43. package/dist/esm/operation-node/select-query-node.d.ts +5 -5
  44. package/dist/esm/operation-node/select-query-node.js +11 -9
  45. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  46. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  47. package/dist/esm/query-builder/select-query-builder.d.ts +50 -6
  48. package/dist/esm/query-builder/select-query-builder.js +68 -13
  49. package/dist/esm/query-compiler/default-query-compiler.d.ts +6 -0
  50. package/dist/esm/query-compiler/default-query-compiler.js +29 -7
  51. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  52. package/dist/esm/schema/create-type-builder.d.ts +19 -0
  53. package/dist/esm/schema/create-type-builder.js +26 -0
  54. package/dist/esm/schema/drop-type-builder.d.ts +19 -0
  55. package/dist/esm/schema/drop-type-builder.js +28 -0
  56. package/dist/esm/schema/schema.d.ts +32 -0
  57. package/dist/esm/schema/schema.js +46 -0
  58. package/dist/esm/util/require-all-props.d.ts +43 -0
  59. package/dist/esm/util/require-all-props.js +37 -0
  60. package/package.json +1 -1
@@ -0,0 +1,22 @@
1
+ /// <reference types="./select-modifier-node.d.ts" />
2
+ import { freeze } from '../util/object-utils.js';
3
+ /**
4
+ * @internal
5
+ */
6
+ export const SelectModifierNode = freeze({
7
+ is(node) {
8
+ return node.kind === 'SelectModifierNode';
9
+ },
10
+ create(modifier) {
11
+ return freeze({
12
+ kind: 'SelectModifierNode',
13
+ modifier,
14
+ });
15
+ },
16
+ createWithRaw(modifier) {
17
+ return freeze({
18
+ kind: 'SelectModifierNode',
19
+ rawModifier: modifier,
20
+ });
21
+ },
22
+ });
@@ -13,18 +13,18 @@ import { SelectionNode } from './selection-node.js';
13
13
  import { WhereNode } from './where-node.js';
14
14
  import { WithNode } from './with-node.js';
15
15
  import { UnionNode } from './union-node.js';
16
- export declare type SelectModifier = 'ForUpdate' | 'ForNoKeyUpdate' | 'ForShare' | 'ForKeyShare' | 'NoWait' | 'SkipLocked';
16
+ import { SelectModifierNode } from './select-modifier-node.js';
17
17
  export interface SelectQueryNode extends OperationNode {
18
18
  readonly kind: 'SelectQueryNode';
19
19
  readonly from: FromNode;
20
20
  readonly selections?: ReadonlyArray<SelectionNode>;
21
21
  readonly distinctOnSelections?: ReadonlyArray<SelectionNode>;
22
- readonly distinct?: boolean;
23
22
  readonly joins?: ReadonlyArray<JoinNode>;
24
23
  readonly groupBy?: GroupByNode;
25
24
  readonly orderBy?: OrderByNode;
26
25
  readonly where?: WhereNode;
27
- readonly modifiers?: ReadonlyArray<SelectModifier>;
26
+ readonly frontModifiers?: ReadonlyArray<SelectModifierNode>;
27
+ readonly endModifiers?: ReadonlyArray<SelectModifierNode>;
28
28
  readonly limit?: LimitNode;
29
29
  readonly offset?: OffsetNode;
30
30
  readonly with?: WithNode;
@@ -39,13 +39,13 @@ export declare const SelectQueryNode: Readonly<{
39
39
  create(fromItems: ReadonlyArray<TableExpressionNode>, withNode?: WithNode): SelectQueryNode;
40
40
  cloneWithSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
41
41
  cloneWithDistinctOnSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
42
- cloneWithModifier(select: SelectQueryNode, modifier: SelectModifier): SelectQueryNode;
42
+ cloneWithFrontModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
43
+ cloneWithEndModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
43
44
  cloneWithOrderByItem(selectNode: SelectQueryNode, item: OrderByItemNode): SelectQueryNode;
44
45
  cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
45
46
  cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
46
47
  cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
47
48
  cloneWithHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
48
49
  cloneWithOrHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
49
- cloneWithDistinct(selectNode: SelectQueryNode): SelectQueryNode;
50
50
  cloneWithUnion(selectNode: SelectQueryNode, union: UnionNode): SelectQueryNode;
51
51
  }>;
@@ -34,11 +34,19 @@ export const SelectQueryNode = freeze({
34
34
  : freeze(selections),
35
35
  });
36
36
  },
37
- cloneWithModifier(select, modifier) {
37
+ cloneWithFrontModifier(select, modifier) {
38
38
  return freeze({
39
39
  ...select,
40
- modifiers: select.modifiers
41
- ? freeze([...select.modifiers, modifier])
40
+ frontModifiers: select.frontModifiers
41
+ ? freeze([...select.frontModifiers, modifier])
42
+ : freeze([modifier]),
43
+ });
44
+ },
45
+ cloneWithEndModifier(select, modifier) {
46
+ return freeze({
47
+ ...select,
48
+ endModifiers: select.endModifiers
49
+ ? freeze([...select.endModifiers, modifier])
42
50
  : freeze([modifier]),
43
51
  });
44
52
  },
@@ -86,12 +94,6 @@ export const SelectQueryNode = freeze({
86
94
  : HavingNode.create(filter),
87
95
  });
88
96
  },
89
- cloneWithDistinct(selectNode) {
90
- return freeze({
91
- ...selectNode,
92
- distinct: true,
93
- });
94
- },
95
97
  cloneWithUnion(selectNode, union) {
96
98
  return freeze({
97
99
  ...selectNode,
@@ -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
  }
@@ -39,6 +39,12 @@ export class WithSchemaTransformer extends OperationNodeTransformer {
39
39
  transformDropView(node) {
40
40
  return this.#transformRoot(node, (node) => super.transformDropView(node));
41
41
  }
42
+ transformCreateType(node) {
43
+ return this.#transformRoot(node, (node) => super.transformCreateType(node));
44
+ }
45
+ transformDropType(node) {
46
+ return this.#transformRoot(node, (node) => super.transformDropType(node));
47
+ }
42
48
  transformAlterTable(node) {
43
49
  return this.#transformRoot(node, (node) => super.transformAlterTable(node));
44
50
  }
@@ -653,6 +653,50 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
653
653
  */
654
654
  distinctOn<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): SelectQueryBuilder<DB, TB, O>;
655
655
  distinctOn<SE extends SelectExpression<DB, TB>>(selection: SE): SelectQueryBuilder<DB, TB, O>;
656
+ /**
657
+ * This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
658
+ *
659
+ * ### Examples
660
+ *
661
+ * ```ts
662
+ * db.selectFrom('person')
663
+ * .modifyFront(sql`sql_no_cache`)
664
+ * .select('first_name')
665
+ * .execute()
666
+ * ```
667
+ *
668
+ * The generated SQL (MySQL):
669
+ *
670
+ * ```sql
671
+ * select sql_no_cache `first_name`
672
+ * from `person`
673
+ * ```
674
+ */
675
+ modifyFront(modifier: AnyRawBuilder): SelectQueryBuilder<DB, TB, O>;
676
+ /**
677
+ * This can be used to add any additional SQL to the end of the query.
678
+ *
679
+ * Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
680
+ * {@link skipLocked} and {@link noWait}.
681
+ *
682
+ * ### Examples
683
+ *
684
+ * ```ts
685
+ * db.selectFrom('person')
686
+ * .select('first_name')
687
+ * .modifyEnd(sql`for update`)
688
+ * .execute()
689
+ * ```
690
+ *
691
+ * The generated SQL (PostgreSQL):
692
+ *
693
+ * ```sql
694
+ * select "first_name"
695
+ * from "person"
696
+ * for update
697
+ * ```
698
+ */
699
+ modifyEnd(modifier: AnyRawBuilder): SelectQueryBuilder<DB, TB, O>;
656
700
  /**
657
701
  * Makes the selection distinct.
658
702
  *
@@ -673,27 +717,27 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
673
717
  */
674
718
  distinct(): SelectQueryBuilder<DB, TB, O>;
675
719
  /**
676
- * Adds the `for update` option to a select query on supported databases.
720
+ * Adds the `for update` modifier to a select query on supported databases.
677
721
  */
678
722
  forUpdate(): SelectQueryBuilder<DB, TB, O>;
679
723
  /**
680
- * Adds the `for share` option to a select query on supported databases.
724
+ * Adds the `for share` modifier to a select query on supported databases.
681
725
  */
682
726
  forShare(): SelectQueryBuilder<DB, TB, O>;
683
727
  /**
684
- * Adds the `for key share` option to a select query on supported databases.
728
+ * Adds the `for key share` modifier to a select query on supported databases.
685
729
  */
686
730
  forKeyShare(): SelectQueryBuilder<DB, TB, O>;
687
731
  /**
688
- * Adds the `for no key update` option to a select query on supported databases.
732
+ * Adds the `for no key update` modifier to a select query on supported databases.
689
733
  */
690
734
  forNoKeyUpdate(): SelectQueryBuilder<DB, TB, O>;
691
735
  /**
692
- * Adds the `skip locked` option to a select query on supported databases.
736
+ * Adds the `skip locked` modifier to a select query on supported databases.
693
737
  */
694
738
  skipLocked(): SelectQueryBuilder<DB, TB, O>;
695
739
  /**
696
- * Adds the `nowait` option to a select query on supported databases.
740
+ * Adds the `nowait` modifier to a select query on supported databases.
697
741
  */
698
742
  noWait(): SelectQueryBuilder<DB, TB, O>;
699
743
  /**
@@ -14,6 +14,7 @@ import { parseGroupBy } from '../parser/group-by-parser.js';
14
14
  import { parseUnion } from '../parser/union-parser.js';
15
15
  import { NoResultError } from './no-result-error.js';
16
16
  import { IdentifierNode } from '../operation-node/identifier-node.js';
17
+ import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
17
18
  export class SelectQueryBuilder {
18
19
  #props;
19
20
  constructor(props) {
@@ -127,6 +128,60 @@ export class SelectQueryBuilder {
127
128
  queryNode: SelectQueryNode.cloneWithDistinctOnSelections(this.#props.queryNode, parseSelectExpressionOrList(selection)),
128
129
  });
129
130
  }
131
+ /**
132
+ * This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
133
+ *
134
+ * ### Examples
135
+ *
136
+ * ```ts
137
+ * db.selectFrom('person')
138
+ * .modifyFront(sql`sql_no_cache`)
139
+ * .select('first_name')
140
+ * .execute()
141
+ * ```
142
+ *
143
+ * The generated SQL (MySQL):
144
+ *
145
+ * ```sql
146
+ * select sql_no_cache `first_name`
147
+ * from `person`
148
+ * ```
149
+ */
150
+ modifyFront(modifier) {
151
+ return new SelectQueryBuilder({
152
+ ...this.#props,
153
+ queryNode: SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, SelectModifierNode.createWithRaw(modifier.toOperationNode())),
154
+ });
155
+ }
156
+ /**
157
+ * This can be used to add any additional SQL to the end of the query.
158
+ *
159
+ * Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
160
+ * {@link skipLocked} and {@link noWait}.
161
+ *
162
+ * ### Examples
163
+ *
164
+ * ```ts
165
+ * db.selectFrom('person')
166
+ * .select('first_name')
167
+ * .modifyEnd(sql`for update`)
168
+ * .execute()
169
+ * ```
170
+ *
171
+ * The generated SQL (PostgreSQL):
172
+ *
173
+ * ```sql
174
+ * select "first_name"
175
+ * from "person"
176
+ * for update
177
+ * ```
178
+ */
179
+ modifyEnd(modifier) {
180
+ return new SelectQueryBuilder({
181
+ ...this.#props,
182
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.createWithRaw(modifier.toOperationNode())),
183
+ });
184
+ }
130
185
  /**
131
186
  * Makes the selection distinct.
132
187
  *
@@ -148,61 +203,61 @@ export class SelectQueryBuilder {
148
203
  distinct() {
149
204
  return new SelectQueryBuilder({
150
205
  ...this.#props,
151
- queryNode: SelectQueryNode.cloneWithDistinct(this.#props.queryNode),
206
+ queryNode: SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, SelectModifierNode.create('Distinct')),
152
207
  });
153
208
  }
154
209
  /**
155
- * Adds the `for update` option to a select query on supported databases.
210
+ * Adds the `for update` modifier to a select query on supported databases.
156
211
  */
157
212
  forUpdate() {
158
213
  return new SelectQueryBuilder({
159
214
  ...this.#props,
160
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForUpdate'),
215
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForUpdate')),
161
216
  });
162
217
  }
163
218
  /**
164
- * Adds the `for share` option to a select query on supported databases.
219
+ * Adds the `for share` modifier to a select query on supported databases.
165
220
  */
166
221
  forShare() {
167
222
  return new SelectQueryBuilder({
168
223
  ...this.#props,
169
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForShare'),
224
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForShare')),
170
225
  });
171
226
  }
172
227
  /**
173
- * Adds the `for key share` option to a select query on supported databases.
228
+ * Adds the `for key share` modifier to a select query on supported databases.
174
229
  */
175
230
  forKeyShare() {
176
231
  return new SelectQueryBuilder({
177
232
  ...this.#props,
178
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForKeyShare'),
233
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForKeyShare')),
179
234
  });
180
235
  }
181
236
  /**
182
- * Adds the `for no key update` option to a select query on supported databases.
237
+ * Adds the `for no key update` modifier to a select query on supported databases.
183
238
  */
184
239
  forNoKeyUpdate() {
185
240
  return new SelectQueryBuilder({
186
241
  ...this.#props,
187
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'ForNoKeyUpdate'),
242
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForNoKeyUpdate')),
188
243
  });
189
244
  }
190
245
  /**
191
- * Adds the `skip locked` option to a select query on supported databases.
246
+ * Adds the `skip locked` modifier to a select query on supported databases.
192
247
  */
193
248
  skipLocked() {
194
249
  return new SelectQueryBuilder({
195
250
  ...this.#props,
196
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'SkipLocked'),
251
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('SkipLocked')),
197
252
  });
198
253
  }
199
254
  /**
200
- * Adds the `nowait` option to a select query on supported databases.
255
+ * Adds the `nowait` modifier to a select query on supported databases.
201
256
  */
202
257
  noWait() {
203
258
  return new SelectQueryBuilder({
204
259
  ...this.#props,
205
- queryNode: SelectQueryNode.cloneWithModifier(this.#props.queryNode, 'NoWait'),
260
+ queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('NoWait')),
206
261
  });
207
262
  }
208
263
  selectAll(table) {
@@ -68,6 +68,9 @@ import { DefaultValueNode } from '../operation-node/default-value-node.js';
68
68
  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
+ 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';
71
74
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
72
75
  #private;
73
76
  protected get numParameters(): number;
@@ -143,6 +146,9 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
143
146
  protected visitDropView(node: DropViewNode): void;
144
147
  protected visitGenerated(node: GeneratedNode): void;
145
148
  protected visitDefaultValue(node: DefaultValueNode): void;
149
+ protected visitSelectModifier(node: SelectModifierNode): void;
150
+ protected visitCreateType(node: CreateTypeNode): void;
151
+ protected visitDropType(node: DropTypeNode): void;
146
152
  protected append(str: string): void;
147
153
  protected appendValue(parameter: unknown): void;
148
154
  protected getLeftIdentifierWrapper(): string;
@@ -42,8 +42,8 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
42
42
  this.compileDistinctOn(node.distinctOnSelections);
43
43
  this.append(' ');
44
44
  }
45
- if (node.distinct) {
46
- this.append('distinct');
45
+ if (node.frontModifiers && node.frontModifiers.length > 0) {
46
+ this.compileList(node.frontModifiers, ' ');
47
47
  this.append(' ');
48
48
  }
49
49
  if (node.selections) {
@@ -83,11 +83,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
83
83
  this.append(' ');
84
84
  this.visitNode(node.offset);
85
85
  }
86
- if (node.modifiers) {
87
- node.modifiers.forEach((modifier) => {
88
- this.append(' ');
89
- this.append(SELECT_MODIFIER_SQL[modifier]);
90
- });
86
+ if (node.endModifiers && node.endModifiers.length > 0) {
87
+ this.append(' ');
88
+ this.compileList(node.endModifiers, ' ');
91
89
  }
92
90
  if (wrapInParens) {
93
91
  this.append(')');
@@ -783,6 +781,29 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
783
781
  this.append('default ');
784
782
  this.visitNode(node.defaultValue);
785
783
  }
784
+ visitSelectModifier(node) {
785
+ if (node.rawModifier) {
786
+ this.visitNode(node.rawModifier);
787
+ }
788
+ else {
789
+ this.append(SELECT_MODIFIER_SQL[node.modifier]);
790
+ }
791
+ }
792
+ visitCreateType(node) {
793
+ this.append('create type ');
794
+ this.visitNode(node.name);
795
+ if (node.enum) {
796
+ this.append(' as enum ');
797
+ this.visitNode(node.enum);
798
+ }
799
+ }
800
+ visitDropType(node) {
801
+ this.append('drop type ');
802
+ if (node.ifExists) {
803
+ this.append('if exists ');
804
+ }
805
+ this.visitNode(node.name);
806
+ }
786
807
  append(str) {
787
808
  this.#sql += str;
788
809
  }
@@ -830,6 +851,7 @@ const SELECT_MODIFIER_SQL = freeze({
830
851
  ForShare: 'for share',
831
852
  NoWait: 'nowait',
832
853
  SkipLocked: 'skip locked',
854
+ Distinct: 'distinct',
833
855
  });
834
856
  const JOIN_TYPE_SQL = freeze({
835
857
  InnerJoin: 'inner join',
@@ -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
  */
@@ -0,0 +1,19 @@
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
+ asEnum(values: string[]): CreateTypeBuilder;
12
+ compile(): CompiledQuery;
13
+ execute(): Promise<void>;
14
+ }
15
+ export interface CreateTypeBuilderProps {
16
+ readonly queryId: QueryId;
17
+ readonly executor: QueryExecutor;
18
+ readonly createTypeNode: CreateTypeNode;
19
+ }
@@ -0,0 +1,26 @@
1
+ /// <reference types="./create-type-builder.d.ts" />
2
+ import { preventAwait } from '../util/prevent-await.js';
3
+ import { freeze } from '../util/object-utils.js';
4
+ import { CreateTypeNode } from '../operation-node/create-type-node.js';
5
+ export class CreateTypeBuilder {
6
+ #props;
7
+ constructor(props) {
8
+ this.#props = freeze(props);
9
+ }
10
+ toOperationNode() {
11
+ return this.#props.executor.transformQuery(this.#props.createTypeNode, this.#props.queryId);
12
+ }
13
+ asEnum(values) {
14
+ return new CreateTypeBuilder({
15
+ ...this.#props,
16
+ createTypeNode: CreateTypeNode.cloneWithEnum(this.#props.createTypeNode, values),
17
+ });
18
+ }
19
+ compile() {
20
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
21
+ }
22
+ async execute() {
23
+ await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
24
+ }
25
+ }
26
+ 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
+ }
@@ -0,0 +1,28 @@
1
+ /// <reference types="./drop-type-builder.d.ts" />
2
+ import { DropTypeNode } from '../operation-node/drop-type-node.js';
3
+ import { preventAwait } from '../util/prevent-await.js';
4
+ import { freeze } from '../util/object-utils.js';
5
+ export class DropTypeBuilder {
6
+ #props;
7
+ constructor(props) {
8
+ this.#props = freeze(props);
9
+ }
10
+ ifExists() {
11
+ return new DropTypeBuilder({
12
+ ...this.#props,
13
+ dropTypeNode: DropTypeNode.cloneWith(this.#props.dropTypeNode, {
14
+ ifExists: true,
15
+ }),
16
+ });
17
+ }
18
+ toOperationNode() {
19
+ return this.#props.executor.transformQuery(this.#props.dropTypeNode, this.#props.queryId);
20
+ }
21
+ compile() {
22
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
23
+ }
24
+ async execute() {
25
+ await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
26
+ }
27
+ }
28
+ preventAwait(DropTypeBuilder, "don't await DropTypeBuilder instances directly. To execute the query you need to call `execute`");
@@ -9,6 +9,8 @@ import { DropTableBuilder } from './drop-table-builder.js';
9
9
  import { CreateViewBuilder } from './create-view-builder.js';
10
10
  import { DropViewBuilder } from './drop-view-builder.js';
11
11
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
12
+ import { CreateTypeBuilder } from './create-type-builder.js';
13
+ import { DropTypeBuilder } from './drop-type-builder.js';
12
14
  /**
13
15
  * Provides methods for building database schema.
14
16
  */
@@ -170,6 +172,36 @@ export declare class SchemaModule {
170
172
  * ```
171
173
  */
172
174
  dropView(viewName: string): DropViewBuilder;
175
+ /**
176
+ * Create a new type.
177
+ *
178
+ * Only some dialects like PostgreSQL have user-defined types.
179
+ *
180
+ * ### Examples
181
+ *
182
+ * ```ts
183
+ * await db.schema
184
+ * .createType('species')
185
+ * .asEnum(['dog', 'cat', 'frog'])
186
+ * .execute()
187
+ * ```
188
+ */
189
+ createType(viewName: string): CreateTypeBuilder;
190
+ /**
191
+ * Drop a type.
192
+ *
193
+ * Only some dialects like PostgreSQL have user-defined types.
194
+ *
195
+ * ### Examples
196
+ *
197
+ * ```ts
198
+ * await db.schema
199
+ * .dropType('species')
200
+ * .ifExists()
201
+ * .execute()
202
+ * ```
203
+ */
204
+ dropType(viewName: string): DropTypeBuilder;
173
205
  /**
174
206
  * Returns a copy of this schema module with the given plugin installed.
175
207
  */