kysely 0.19.9 → 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 (42) hide show
  1. package/README.md +5 -4
  2. package/dist/cjs/operation-node/create-type-node.d.ts +17 -0
  3. package/dist/cjs/operation-node/create-type-node.js +27 -0
  4. package/dist/cjs/operation-node/drop-type-node.d.ts +16 -0
  5. package/dist/cjs/operation-node/drop-type-node.js +25 -0
  6. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  7. package/dist/cjs/operation-node/operation-node-transformer.js +16 -0
  8. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  9. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  10. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  11. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  12. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  13. package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
  14. package/dist/cjs/query-compiler/default-query-compiler.js +15 -0
  15. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  16. package/dist/cjs/schema/create-type-builder.d.ts +19 -0
  17. package/dist/cjs/schema/create-type-builder.js +29 -0
  18. package/dist/cjs/schema/drop-type-builder.d.ts +19 -0
  19. package/dist/cjs/schema/drop-type-builder.js +31 -0
  20. package/dist/cjs/schema/schema.d.ts +32 -0
  21. package/dist/cjs/schema/schema.js +46 -0
  22. package/dist/esm/operation-node/create-type-node.d.ts +17 -0
  23. package/dist/esm/operation-node/create-type-node.js +25 -0
  24. package/dist/esm/operation-node/drop-type-node.d.ts +16 -0
  25. package/dist/esm/operation-node/drop-type-node.js +23 -0
  26. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  27. package/dist/esm/operation-node/operation-node-transformer.js +16 -0
  28. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  29. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  30. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  31. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  32. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  33. package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
  34. package/dist/esm/query-compiler/default-query-compiler.js +15 -0
  35. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  36. package/dist/esm/schema/create-type-builder.d.ts +19 -0
  37. package/dist/esm/schema/create-type-builder.js +26 -0
  38. package/dist/esm/schema/drop-type-builder.d.ts +19 -0
  39. package/dist/esm/schema/drop-type-builder.js +28 -0
  40. package/dist/esm/schema/schema.d.ts +32 -0
  41. package/dist/esm/schema/schema.js +46 -0
  42. package/package.json +1 -1
package/README.md CHANGED
@@ -15,7 +15,7 @@ Kysely makes sure you only refer to tables and columns that are visible to the p
15
15
  you're writing. The result type only has the selected columns with correct types and aliases. As an
16
16
  added bonus you get autocompletion for all that stuff.
17
17
 
18
- As you can see in the gif above, through the pure magic of modern typescript, Kysely is even able to parse
18
+ As shown in the gif above, through the pure magic of modern typescript, Kysely is even able to parse
19
19
  the alias given to `pet.name` and add the `pet_name` column to the result row type. Kysely is able to infer
20
20
  column names, aliases and types from selected subqueries, joined subqueries, `with` statements and pretty
21
21
  much anything you can think of.
@@ -213,10 +213,11 @@ export async function down(db: Kysely<any>): Promise<void> {
213
213
  }
214
214
  ```
215
215
 
216
- The `up` function is called when you update your database schema to next version and `down`
216
+ The `up` function is called when you update your database schema to the next version and `down`
217
217
  when you go back to previous version. The only argument for the functions is an instance of
218
- `Kysely<any>`. It's important to use `Kysely<any>` and not `Kysely<YourDatabase>`. Migrations
219
- should never depend on the current code of your app because they need to work even when the app
218
+ `Kysely<any>`. It's important to use `Kysely<any>` and not `Kysely<YourDatabase>`.
219
+
220
+ Migrations should never depend on the current code of your app because they need to work even when the app
220
221
  changes. Migrations need to be "frozen in time".
221
222
 
222
223
  The migrations can use the [Kysely.schema](https://koskimas.github.io/kysely/classes/SchemaModule.html)
@@ -0,0 +1,17 @@
1
+ import { IdentifierNode } from './identifier-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ import { ValueListNode } from './value-list-node.js';
4
+ export declare type CreateTypeNodeParams = Omit<Partial<CreateTypeNode>, 'kind'>;
5
+ export interface CreateTypeNode extends OperationNode {
6
+ readonly kind: 'CreateTypeNode';
7
+ readonly name: IdentifierNode;
8
+ readonly enum?: ValueListNode;
9
+ }
10
+ /**
11
+ * @internal
12
+ */
13
+ export declare const CreateTypeNode: Readonly<{
14
+ is(node: OperationNode): node is CreateTypeNode;
15
+ create(name: string): CreateTypeNode;
16
+ cloneWithEnum(createType: CreateTypeNode, values: string[]): CreateTypeNode;
17
+ }>;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateTypeNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ const identifier_node_js_1 = require("./identifier-node.js");
6
+ const value_list_node_js_1 = require("./value-list-node.js");
7
+ const value_node_js_1 = require("./value-node.js");
8
+ /**
9
+ * @internal
10
+ */
11
+ exports.CreateTypeNode = (0, object_utils_js_1.freeze)({
12
+ is(node) {
13
+ return node.kind === 'CreateTypeNode';
14
+ },
15
+ create(name) {
16
+ return (0, object_utils_js_1.freeze)({
17
+ kind: 'CreateTypeNode',
18
+ name: identifier_node_js_1.IdentifierNode.create(name),
19
+ });
20
+ },
21
+ cloneWithEnum(createType, values) {
22
+ return (0, object_utils_js_1.freeze)({
23
+ ...createType,
24
+ enum: value_list_node_js_1.ValueListNode.create(values.map((value) => value_node_js_1.ValueNode.createImmediate(value))),
25
+ });
26
+ },
27
+ });
@@ -0,0 +1,16 @@
1
+ import { IdentifierNode } from './identifier-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ export declare type DropTypeNodeParams = Omit<Partial<DropTypeNode>, 'kind' | 'name'>;
4
+ export interface DropTypeNode extends OperationNode {
5
+ readonly kind: 'DropTypeNode';
6
+ readonly name: IdentifierNode;
7
+ readonly ifExists?: boolean;
8
+ }
9
+ /**
10
+ * @internal
11
+ */
12
+ export declare const DropTypeNode: Readonly<{
13
+ is(node: OperationNode): node is DropTypeNode;
14
+ create(name: string): DropTypeNode;
15
+ cloneWith(dropType: DropTypeNode, params: DropTypeNodeParams): DropTypeNode;
16
+ }>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DropTypeNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ const identifier_node_js_1 = require("./identifier-node.js");
6
+ /**
7
+ * @internal
8
+ */
9
+ exports.DropTypeNode = (0, object_utils_js_1.freeze)({
10
+ is(node) {
11
+ return node.kind === 'DropTypeNode';
12
+ },
13
+ create(name) {
14
+ return (0, object_utils_js_1.freeze)({
15
+ kind: 'DropTypeNode',
16
+ name: identifier_node_js_1.IdentifierNode.create(name),
17
+ });
18
+ },
19
+ cloneWith(dropType, params) {
20
+ return (0, object_utils_js_1.freeze)({
21
+ ...dropType,
22
+ ...params,
23
+ });
24
+ },
25
+ });
@@ -66,6 +66,8 @@ import { DefaultValueNode } from './default-value-node.js';
66
66
  import { OnNode } from './on-node.js';
67
67
  import { ValuesNode } from './values-node.js';
68
68
  import { SelectModifierNode } from './select-modifier-node.js';
69
+ import { CreateTypeNode } from './create-type-node.js';
70
+ import { DropTypeNode } from './drop-type-node.js';
69
71
  /**
70
72
  * Transforms an operation node tree into another one.
71
73
  *
@@ -162,6 +164,8 @@ export declare class OperationNodeTransformer {
162
164
  protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
163
165
  protected transformOn(node: OnNode): OnNode;
164
166
  protected transformSelectModifier(node: SelectModifierNode): SelectModifierNode;
167
+ protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
168
+ protected transformDropType(node: DropTypeNode): DropTypeNode;
165
169
  protected transformDataType(node: DataTypeNode): DataTypeNode;
166
170
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
167
171
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;
@@ -102,6 +102,8 @@ class OperationNodeTransformer {
102
102
  OnNode: this.transformOn.bind(this),
103
103
  ValuesNode: this.transformValues.bind(this),
104
104
  SelectModifierNode: this.transformSelectModifier.bind(this),
105
+ CreateTypeNode: this.transformCreateType.bind(this),
106
+ DropTypeNode: this.transformDropType.bind(this),
105
107
  });
106
108
  transformNode = (node) => {
107
109
  if (!node) {
@@ -603,6 +605,20 @@ class OperationNodeTransformer {
603
605
  rawModifier: this.transformNode(node.rawModifier),
604
606
  });
605
607
  }
608
+ transformCreateType(node) {
609
+ return (0, require_all_props_js_1.requireAllProps)({
610
+ kind: 'CreateTypeNode',
611
+ name: this.transformNode(node.name),
612
+ enum: this.transformNode(node.enum),
613
+ });
614
+ }
615
+ transformDropType(node) {
616
+ return (0, require_all_props_js_1.requireAllProps)({
617
+ kind: 'DropTypeNode',
618
+ name: this.transformNode(node.name),
619
+ ifExists: node.ifExists,
620
+ });
621
+ }
606
622
  transformDataType(node) {
607
623
  // An Object.freezed leaf node. No need to clone.
608
624
  return node;
@@ -66,6 +66,8 @@ import { DefaultValueNode } from './default-value-node.js';
66
66
  import { OnNode } from './on-node.js';
67
67
  import { ValuesNode } from './values-node.js';
68
68
  import { SelectModifierNode } from './select-modifier-node.js';
69
+ import { CreateTypeNode } from './create-type-node.js';
70
+ import { DropTypeNode } from './drop-type-node.js';
69
71
  export declare abstract class OperationNodeVisitor {
70
72
  #private;
71
73
  protected readonly nodeStack: OperationNode[];
@@ -138,4 +140,6 @@ export declare abstract class OperationNodeVisitor {
138
140
  protected abstract visitOn(node: OnNode): void;
139
141
  protected abstract visitValues(node: ValuesNode): void;
140
142
  protected abstract visitSelectModifier(node: SelectModifierNode): void;
143
+ protected abstract visitCreateType(node: CreateTypeNode): void;
144
+ protected abstract visitDropType(node: DropTypeNode): void;
141
145
  }
@@ -75,6 +75,8 @@ class OperationNodeVisitor {
75
75
  OnNode: this.visitOn.bind(this),
76
76
  ValuesNode: this.visitValues.bind(this),
77
77
  SelectModifierNode: this.visitSelectModifier.bind(this),
78
+ CreateTypeNode: this.visitCreateType.bind(this),
79
+ DropTypeNode: this.visitDropType.bind(this),
78
80
  });
79
81
  visitNode = (node) => {
80
82
  this.nodeStack.push(node);
@@ -1,4 +1,4 @@
1
- export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode';
1
+ export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -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
  }
@@ -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,6 +147,8 @@ 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;
@@ -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
  }
@@ -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,29 @@
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
+ asEnum(values) {
16
+ return new CreateTypeBuilder({
17
+ ...this.#props,
18
+ createTypeNode: create_type_node_js_1.CreateTypeNode.cloneWithEnum(this.#props.createTypeNode, values),
19
+ });
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
+ exports.CreateTypeBuilder = CreateTypeBuilder;
29
+ (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
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DropTypeBuilder = void 0;
4
+ const drop_type_node_js_1 = require("../operation-node/drop-type-node.js");
5
+ const prevent_await_js_1 = require("../util/prevent-await.js");
6
+ const object_utils_js_1 = require("../util/object-utils.js");
7
+ class DropTypeBuilder {
8
+ #props;
9
+ constructor(props) {
10
+ this.#props = (0, object_utils_js_1.freeze)(props);
11
+ }
12
+ ifExists() {
13
+ return new DropTypeBuilder({
14
+ ...this.#props,
15
+ dropTypeNode: drop_type_node_js_1.DropTypeNode.cloneWith(this.#props.dropTypeNode, {
16
+ ifExists: true,
17
+ }),
18
+ });
19
+ }
20
+ toOperationNode() {
21
+ return this.#props.executor.transformQuery(this.#props.dropTypeNode, this.#props.queryId);
22
+ }
23
+ compile() {
24
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
25
+ }
26
+ async execute() {
27
+ await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
28
+ }
29
+ }
30
+ exports.DropTypeBuilder = DropTypeBuilder;
31
+ (0, prevent_await_js_1.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
  */
@@ -22,6 +22,10 @@ const create_view_builder_js_1 = require("./create-view-builder.js");
22
22
  const create_view_node_js_1 = require("../operation-node/create-view-node.js");
23
23
  const drop_view_builder_js_1 = require("./drop-view-builder.js");
24
24
  const drop_view_node_js_1 = require("../operation-node/drop-view-node.js");
25
+ const create_type_builder_js_1 = require("./create-type-builder.js");
26
+ const drop_type_builder_js_1 = require("./drop-type-builder.js");
27
+ const create_type_node_js_1 = require("../operation-node/create-type-node.js");
28
+ const drop_type_node_js_1 = require("../operation-node/drop-type-node.js");
25
29
  /**
26
30
  * Provides methods for building database schema.
27
31
  */
@@ -239,6 +243,48 @@ class SchemaModule {
239
243
  dropViewNode: drop_view_node_js_1.DropViewNode.create(viewName),
240
244
  });
241
245
  }
246
+ /**
247
+ * Create a new type.
248
+ *
249
+ * Only some dialects like PostgreSQL have user-defined types.
250
+ *
251
+ * ### Examples
252
+ *
253
+ * ```ts
254
+ * await db.schema
255
+ * .createType('species')
256
+ * .asEnum(['dog', 'cat', 'frog'])
257
+ * .execute()
258
+ * ```
259
+ */
260
+ createType(viewName) {
261
+ return new create_type_builder_js_1.CreateTypeBuilder({
262
+ queryId: (0, query_id_js_1.createQueryId)(),
263
+ executor: this.#executor,
264
+ createTypeNode: create_type_node_js_1.CreateTypeNode.create(viewName),
265
+ });
266
+ }
267
+ /**
268
+ * Drop a type.
269
+ *
270
+ * Only some dialects like PostgreSQL have user-defined types.
271
+ *
272
+ * ### Examples
273
+ *
274
+ * ```ts
275
+ * await db.schema
276
+ * .dropType('species')
277
+ * .ifExists()
278
+ * .execute()
279
+ * ```
280
+ */
281
+ dropType(viewName) {
282
+ return new drop_type_builder_js_1.DropTypeBuilder({
283
+ queryId: (0, query_id_js_1.createQueryId)(),
284
+ executor: this.#executor,
285
+ dropTypeNode: drop_type_node_js_1.DropTypeNode.create(viewName),
286
+ });
287
+ }
242
288
  /**
243
289
  * Returns a copy of this schema module with the given plugin installed.
244
290
  */
@@ -0,0 +1,17 @@
1
+ import { IdentifierNode } from './identifier-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ import { ValueListNode } from './value-list-node.js';
4
+ export declare type CreateTypeNodeParams = Omit<Partial<CreateTypeNode>, 'kind'>;
5
+ export interface CreateTypeNode extends OperationNode {
6
+ readonly kind: 'CreateTypeNode';
7
+ readonly name: IdentifierNode;
8
+ readonly enum?: ValueListNode;
9
+ }
10
+ /**
11
+ * @internal
12
+ */
13
+ export declare const CreateTypeNode: Readonly<{
14
+ is(node: OperationNode): node is CreateTypeNode;
15
+ create(name: string): CreateTypeNode;
16
+ cloneWithEnum(createType: CreateTypeNode, values: string[]): CreateTypeNode;
17
+ }>;
@@ -0,0 +1,25 @@
1
+ /// <reference types="./create-type-node.d.ts" />
2
+ import { freeze } from '../util/object-utils.js';
3
+ import { IdentifierNode } from './identifier-node.js';
4
+ import { ValueListNode } from './value-list-node.js';
5
+ import { ValueNode } from './value-node.js';
6
+ /**
7
+ * @internal
8
+ */
9
+ export const CreateTypeNode = freeze({
10
+ is(node) {
11
+ return node.kind === 'CreateTypeNode';
12
+ },
13
+ create(name) {
14
+ return freeze({
15
+ kind: 'CreateTypeNode',
16
+ name: IdentifierNode.create(name),
17
+ });
18
+ },
19
+ cloneWithEnum(createType, values) {
20
+ return freeze({
21
+ ...createType,
22
+ enum: ValueListNode.create(values.map((value) => ValueNode.createImmediate(value))),
23
+ });
24
+ },
25
+ });
@@ -0,0 +1,16 @@
1
+ import { IdentifierNode } from './identifier-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ export declare type DropTypeNodeParams = Omit<Partial<DropTypeNode>, 'kind' | 'name'>;
4
+ export interface DropTypeNode extends OperationNode {
5
+ readonly kind: 'DropTypeNode';
6
+ readonly name: IdentifierNode;
7
+ readonly ifExists?: boolean;
8
+ }
9
+ /**
10
+ * @internal
11
+ */
12
+ export declare const DropTypeNode: Readonly<{
13
+ is(node: OperationNode): node is DropTypeNode;
14
+ create(name: string): DropTypeNode;
15
+ cloneWith(dropType: DropTypeNode, params: DropTypeNodeParams): DropTypeNode;
16
+ }>;
@@ -0,0 +1,23 @@
1
+ /// <reference types="./drop-type-node.d.ts" />
2
+ import { freeze } from '../util/object-utils.js';
3
+ import { IdentifierNode } from './identifier-node.js';
4
+ /**
5
+ * @internal
6
+ */
7
+ export const DropTypeNode = freeze({
8
+ is(node) {
9
+ return node.kind === 'DropTypeNode';
10
+ },
11
+ create(name) {
12
+ return freeze({
13
+ kind: 'DropTypeNode',
14
+ name: IdentifierNode.create(name),
15
+ });
16
+ },
17
+ cloneWith(dropType, params) {
18
+ return freeze({
19
+ ...dropType,
20
+ ...params,
21
+ });
22
+ },
23
+ });
@@ -66,6 +66,8 @@ import { DefaultValueNode } from './default-value-node.js';
66
66
  import { OnNode } from './on-node.js';
67
67
  import { ValuesNode } from './values-node.js';
68
68
  import { SelectModifierNode } from './select-modifier-node.js';
69
+ import { CreateTypeNode } from './create-type-node.js';
70
+ import { DropTypeNode } from './drop-type-node.js';
69
71
  /**
70
72
  * Transforms an operation node tree into another one.
71
73
  *
@@ -162,6 +164,8 @@ export declare class OperationNodeTransformer {
162
164
  protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
163
165
  protected transformOn(node: OnNode): OnNode;
164
166
  protected transformSelectModifier(node: SelectModifierNode): SelectModifierNode;
167
+ protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
168
+ protected transformDropType(node: DropTypeNode): DropTypeNode;
165
169
  protected transformDataType(node: DataTypeNode): DataTypeNode;
166
170
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
167
171
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;
@@ -100,6 +100,8 @@ export class OperationNodeTransformer {
100
100
  OnNode: this.transformOn.bind(this),
101
101
  ValuesNode: this.transformValues.bind(this),
102
102
  SelectModifierNode: this.transformSelectModifier.bind(this),
103
+ CreateTypeNode: this.transformCreateType.bind(this),
104
+ DropTypeNode: this.transformDropType.bind(this),
103
105
  });
104
106
  transformNode = (node) => {
105
107
  if (!node) {
@@ -601,6 +603,20 @@ export class OperationNodeTransformer {
601
603
  rawModifier: this.transformNode(node.rawModifier),
602
604
  });
603
605
  }
606
+ transformCreateType(node) {
607
+ return requireAllProps({
608
+ kind: 'CreateTypeNode',
609
+ name: this.transformNode(node.name),
610
+ enum: this.transformNode(node.enum),
611
+ });
612
+ }
613
+ transformDropType(node) {
614
+ return requireAllProps({
615
+ kind: 'DropTypeNode',
616
+ name: this.transformNode(node.name),
617
+ ifExists: node.ifExists,
618
+ });
619
+ }
604
620
  transformDataType(node) {
605
621
  // An Object.freezed leaf node. No need to clone.
606
622
  return node;
@@ -66,6 +66,8 @@ import { DefaultValueNode } from './default-value-node.js';
66
66
  import { OnNode } from './on-node.js';
67
67
  import { ValuesNode } from './values-node.js';
68
68
  import { SelectModifierNode } from './select-modifier-node.js';
69
+ import { CreateTypeNode } from './create-type-node.js';
70
+ import { DropTypeNode } from './drop-type-node.js';
69
71
  export declare abstract class OperationNodeVisitor {
70
72
  #private;
71
73
  protected readonly nodeStack: OperationNode[];
@@ -138,4 +140,6 @@ export declare abstract class OperationNodeVisitor {
138
140
  protected abstract visitOn(node: OnNode): void;
139
141
  protected abstract visitValues(node: ValuesNode): void;
140
142
  protected abstract visitSelectModifier(node: SelectModifierNode): void;
143
+ protected abstract visitCreateType(node: CreateTypeNode): void;
144
+ protected abstract visitDropType(node: DropTypeNode): void;
141
145
  }
@@ -73,6 +73,8 @@ export class OperationNodeVisitor {
73
73
  OnNode: this.visitOn.bind(this),
74
74
  ValuesNode: this.visitValues.bind(this),
75
75
  SelectModifierNode: this.visitSelectModifier.bind(this),
76
+ CreateTypeNode: this.visitCreateType.bind(this),
77
+ DropTypeNode: this.visitDropType.bind(this),
76
78
  });
77
79
  visitNode = (node) => {
78
80
  this.nodeStack.push(node);
@@ -1,4 +1,4 @@
1
- export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode';
1
+ export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -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
  }
@@ -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,6 +147,8 @@ 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;
@@ -789,6 +789,21 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
789
789
  this.append(SELECT_MODIFIER_SQL[node.modifier]);
790
790
  }
791
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
+ }
792
807
  append(str) {
793
808
  this.#sql += str;
794
809
  }
@@ -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
  */
@@ -20,6 +20,10 @@ import { CreateViewBuilder } from './create-view-builder.js';
20
20
  import { CreateViewNode } from '../operation-node/create-view-node.js';
21
21
  import { DropViewBuilder } from './drop-view-builder.js';
22
22
  import { DropViewNode } from '../operation-node/drop-view-node.js';
23
+ import { CreateTypeBuilder } from './create-type-builder.js';
24
+ import { DropTypeBuilder } from './drop-type-builder.js';
25
+ import { CreateTypeNode } from '../operation-node/create-type-node.js';
26
+ import { DropTypeNode } from '../operation-node/drop-type-node.js';
23
27
  /**
24
28
  * Provides methods for building database schema.
25
29
  */
@@ -237,6 +241,48 @@ export class SchemaModule {
237
241
  dropViewNode: DropViewNode.create(viewName),
238
242
  });
239
243
  }
244
+ /**
245
+ * Create a new type.
246
+ *
247
+ * Only some dialects like PostgreSQL have user-defined types.
248
+ *
249
+ * ### Examples
250
+ *
251
+ * ```ts
252
+ * await db.schema
253
+ * .createType('species')
254
+ * .asEnum(['dog', 'cat', 'frog'])
255
+ * .execute()
256
+ * ```
257
+ */
258
+ createType(viewName) {
259
+ return new CreateTypeBuilder({
260
+ queryId: createQueryId(),
261
+ executor: this.#executor,
262
+ createTypeNode: CreateTypeNode.create(viewName),
263
+ });
264
+ }
265
+ /**
266
+ * Drop a type.
267
+ *
268
+ * Only some dialects like PostgreSQL have user-defined types.
269
+ *
270
+ * ### Examples
271
+ *
272
+ * ```ts
273
+ * await db.schema
274
+ * .dropType('species')
275
+ * .ifExists()
276
+ * .execute()
277
+ * ```
278
+ */
279
+ dropType(viewName) {
280
+ return new DropTypeBuilder({
281
+ queryId: createQueryId(),
282
+ executor: this.#executor,
283
+ dropTypeNode: DropTypeNode.create(viewName),
284
+ });
285
+ }
240
286
  /**
241
287
  * Returns a copy of this schema module with the given plugin installed.
242
288
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.19.9",
3
+ "version": "0.19.10",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",