kysely 0.9.8 → 0.9.9

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 (57) hide show
  1. package/dist/cjs/index.d.ts +2 -0
  2. package/dist/cjs/index.js +2 -0
  3. package/dist/cjs/operation-node/create-view-node.d.ts +22 -0
  4. package/dist/cjs/operation-node/create-view-node.js +25 -0
  5. package/dist/cjs/operation-node/drop-schema-node.d.ts +1 -1
  6. package/dist/cjs/operation-node/drop-schema-node.js +2 -2
  7. package/dist/cjs/operation-node/drop-view-node.d.ts +17 -0
  8. package/dist/cjs/operation-node/drop-view-node.js +25 -0
  9. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  10. package/dist/cjs/operation-node/operation-node-transformer.js +18 -0
  11. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  12. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  13. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  14. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.d.ts +17 -0
  15. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.js +22 -0
  16. package/dist/cjs/plugin/immediate-value.ts/immediate-value-transformer.d.ts +13 -0
  17. package/dist/cjs/plugin/immediate-value.ts/immediate-value-transformer.js +21 -0
  18. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  19. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  20. package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
  21. package/dist/cjs/query-compiler/default-query-compiler.js +25 -0
  22. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  23. package/dist/cjs/schema/create-view-builder.d.ts +23 -0
  24. package/dist/cjs/schema/create-view-builder.js +65 -0
  25. package/dist/cjs/schema/drop-view-builder.d.ts +19 -0
  26. package/dist/cjs/schema/drop-view-builder.js +29 -0
  27. package/dist/cjs/schema/schema.d.ts +27 -0
  28. package/dist/cjs/schema/schema.js +41 -0
  29. package/dist/esm/index.d.ts +2 -0
  30. package/dist/esm/index.js +2 -0
  31. package/dist/esm/operation-node/create-view-node.d.ts +22 -0
  32. package/dist/esm/operation-node/create-view-node.js +22 -0
  33. package/dist/esm/operation-node/drop-schema-node.d.ts +1 -1
  34. package/dist/esm/operation-node/drop-schema-node.js +2 -2
  35. package/dist/esm/operation-node/drop-view-node.d.ts +17 -0
  36. package/dist/esm/operation-node/drop-view-node.js +22 -0
  37. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  38. package/dist/esm/operation-node/operation-node-transformer.js +18 -0
  39. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  40. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  41. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  42. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.d.ts +17 -0
  43. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.js +18 -0
  44. package/dist/esm/plugin/immediate-value.ts/immediate-value-transformer.d.ts +13 -0
  45. package/dist/esm/plugin/immediate-value.ts/immediate-value-transformer.js +17 -0
  46. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  47. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  48. package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
  49. package/dist/esm/query-compiler/default-query-compiler.js +25 -0
  50. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  51. package/dist/esm/schema/create-view-builder.d.ts +23 -0
  52. package/dist/esm/schema/create-view-builder.js +61 -0
  53. package/dist/esm/schema/drop-view-builder.d.ts +19 -0
  54. package/dist/esm/schema/drop-view-builder.js +25 -0
  55. package/dist/esm/schema/schema.d.ts +27 -0
  56. package/dist/esm/schema/schema.js +41 -0
  57. package/package.json +1 -1
@@ -19,6 +19,8 @@ export * from './schema/drop-schema-builder.js';
19
19
  export * from './schema/column-definition-builder.js';
20
20
  export * from './schema/foreign-key-constraint-builder.js';
21
21
  export * from './schema/alter-table-builder.js';
22
+ export * from './schema/create-view-builder.js';
23
+ export * from './schema/drop-view-builder.js';
22
24
  export * from './dynamic/dynamic.js';
23
25
  export * from './driver/driver.js';
24
26
  export * from './driver/database-connection.js';
package/dist/esm/index.js CHANGED
@@ -19,6 +19,8 @@ export * from './schema/drop-schema-builder.js';
19
19
  export * from './schema/column-definition-builder.js';
20
20
  export * from './schema/foreign-key-constraint-builder.js';
21
21
  export * from './schema/alter-table-builder.js';
22
+ export * from './schema/create-view-builder.js';
23
+ export * from './schema/drop-view-builder.js';
22
24
  export * from './dynamic/dynamic.js';
23
25
  export * from './driver/driver.js';
24
26
  export * from './driver/database-connection.js';
@@ -0,0 +1,22 @@
1
+ import { ColumnNode } from './column-node.js';
2
+ import { IdentifierNode } from './identifier-node.js';
3
+ import { OperationNode } from './operation-node.js';
4
+ import { RawNode } from './raw-node.js';
5
+ import { SelectQueryNode } from './select-query-node.js';
6
+ export declare type CreateViewNodeModifier = 'OrReplace';
7
+ export declare type CreateViewNodeParams = Omit<Partial<CreateViewNode>, 'kind' | 'name'>;
8
+ export interface CreateViewNode extends OperationNode {
9
+ readonly kind: 'CreateViewNode';
10
+ readonly name: IdentifierNode;
11
+ readonly modifier?: CreateViewNodeModifier;
12
+ readonly columns?: ReadonlyArray<ColumnNode>;
13
+ readonly as?: SelectQueryNode | RawNode;
14
+ }
15
+ /**
16
+ * @internal
17
+ */
18
+ export declare const CreateViewNode: Readonly<{
19
+ is(node: OperationNode): node is CreateViewNode;
20
+ create(name: string): CreateViewNode;
21
+ cloneWith(createView: CreateViewNode, params: CreateViewNodeParams): CreateViewNode;
22
+ }>;
@@ -0,0 +1,22 @@
1
+ import { freeze } from '../util/object-utils.js';
2
+ import { IdentifierNode } from './identifier-node.js';
3
+ /**
4
+ * @internal
5
+ */
6
+ export const CreateViewNode = freeze({
7
+ is(node) {
8
+ return node.kind === 'CreateViewNode';
9
+ },
10
+ create(name) {
11
+ return freeze({
12
+ kind: 'CreateViewNode',
13
+ name: IdentifierNode.create(name),
14
+ });
15
+ },
16
+ cloneWith(createView, params) {
17
+ return freeze({
18
+ ...createView,
19
+ ...params,
20
+ });
21
+ },
22
+ });
@@ -13,5 +13,5 @@ export interface DropSchemaNode extends OperationNode {
13
13
  export declare const DropSchemaNode: Readonly<{
14
14
  is(node: OperationNode): node is DropSchemaNode;
15
15
  create(schema: string, params?: DropSchemaNodeParams | undefined): DropSchemaNode;
16
- cloneWithModifier(createSchema: DropSchemaNode, modifier: DropSchemaNodeModifier): DropSchemaNode;
16
+ cloneWithModifier(dropSchema: DropSchemaNode, modifier: DropSchemaNodeModifier): DropSchemaNode;
17
17
  }>;
@@ -14,9 +14,9 @@ export const DropSchemaNode = freeze({
14
14
  ...params,
15
15
  });
16
16
  },
17
- cloneWithModifier(createSchema, modifier) {
17
+ cloneWithModifier(dropSchema, modifier) {
18
18
  return freeze({
19
- ...createSchema,
19
+ ...dropSchema,
20
20
  modifier,
21
21
  });
22
22
  },
@@ -0,0 +1,17 @@
1
+ import { IdentifierNode } from './identifier-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ export declare type DropViewNodeModifier = 'IfExists';
4
+ export declare type DropViewNodeParams = Omit<Partial<DropViewNode>, 'kind' | 'name'>;
5
+ export interface DropViewNode extends OperationNode {
6
+ readonly kind: 'DropViewNode';
7
+ readonly name: IdentifierNode;
8
+ readonly modifier?: DropViewNodeModifier;
9
+ }
10
+ /**
11
+ * @internal
12
+ */
13
+ export declare const DropViewNode: Readonly<{
14
+ is(node: OperationNode): node is DropViewNode;
15
+ create(name: string): DropViewNode;
16
+ cloneWithModifier(dropView: DropViewNode, modifier: DropViewNodeModifier): DropViewNode;
17
+ }>;
@@ -0,0 +1,22 @@
1
+ import { freeze } from '../util/object-utils.js';
2
+ import { IdentifierNode } from './identifier-node.js';
3
+ /**
4
+ * @internal
5
+ */
6
+ export const DropViewNode = freeze({
7
+ is(node) {
8
+ return node.kind === 'DropViewNode';
9
+ },
10
+ create(name) {
11
+ return freeze({
12
+ kind: 'DropViewNode',
13
+ name: IdentifierNode.create(name),
14
+ });
15
+ },
16
+ cloneWithModifier(dropView, modifier) {
17
+ return freeze({
18
+ ...dropView,
19
+ modifier,
20
+ });
21
+ },
22
+ });
@@ -58,6 +58,8 @@ import { ColumnDefinitionNode } from './column-definition-node.js';
58
58
  import { ModifyColumnNode } from './modify-column-node.js';
59
59
  import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
60
60
  import { UnionNode } from './union-node.js';
61
+ import { CreateViewNode } from './create-view-node.js';
62
+ import { DropViewNode } from './drop-view-node.js';
61
63
  /**
62
64
  * Transforms an operation node tree into another one.
63
65
  *
@@ -145,6 +147,8 @@ export declare class OperationNodeTransformer {
145
147
  protected transformModifyColumn(node: ModifyColumnNode): ModifyColumnNode;
146
148
  protected transformAddConstraint(node: AddConstraintNode): AddConstraintNode;
147
149
  protected transformDropConstraint(node: DropConstraintNode): DropConstraintNode;
150
+ protected transformCreateView(node: CreateViewNode): CreateViewNode;
151
+ protected transformDropView(node: DropViewNode): DropViewNode;
148
152
  protected transformDataType(node: DataTypeNode): DataTypeNode;
149
153
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
150
154
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;
@@ -90,6 +90,8 @@ export class OperationNodeTransformer {
90
90
  DropConstraintNode: this.transformDropConstraint.bind(this),
91
91
  ForeignKeyConstraintNode: this.transformForeignKeyConstraint.bind(this),
92
92
  UnionNode: this.transformUnion.bind(this),
93
+ CreateViewNode: this.transformCreateView.bind(this),
94
+ DropViewNode: this.transformDropView.bind(this),
93
95
  };
94
96
  transformNode = (node) => {
95
97
  if (!node) {
@@ -515,6 +517,22 @@ export class OperationNodeTransformer {
515
517
  constraintName: this.transformNode(node.constraintName),
516
518
  };
517
519
  }
520
+ transformCreateView(node) {
521
+ return {
522
+ kind: 'CreateViewNode',
523
+ name: this.transformNode(node.name),
524
+ modifier: node.modifier,
525
+ columns: this.transformNodeList(node.columns),
526
+ as: this.transformNode(node.as),
527
+ };
528
+ }
529
+ transformDropView(node) {
530
+ return {
531
+ kind: 'DropViewNode',
532
+ name: this.transformNode(node.name),
533
+ modifier: node.modifier,
534
+ };
535
+ }
518
536
  transformDataType(node) {
519
537
  // An Object.freezed leaf node. No need to clone.
520
538
  return node;
@@ -58,6 +58,8 @@ import { ColumnDefinitionNode } from './column-definition-node.js';
58
58
  import { ModifyColumnNode } from './modify-column-node.js';
59
59
  import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
60
60
  import { UnionNode } from './union-node.js';
61
+ import { CreateViewNode } from './create-view-node.js';
62
+ import { DropViewNode } from './drop-view-node.js';
61
63
  export declare abstract class OperationNodeVisitor {
62
64
  #private;
63
65
  protected readonly nodeStack: OperationNode[];
@@ -121,4 +123,6 @@ export declare abstract class OperationNodeVisitor {
121
123
  protected abstract visitValue(_: ValueNode): void;
122
124
  protected abstract visitPrimitiveValueList(_: PrimitiveValueListNode): void;
123
125
  protected abstract visitOperator(node: OperatorNode): void;
126
+ protected abstract visitCreateView(node: CreateViewNode): void;
127
+ protected abstract visitDropView(node: DropViewNode): void;
124
128
  }
@@ -60,6 +60,8 @@ export class OperationNodeVisitor {
60
60
  DropConstraintNode: this.visitDropConstraint.bind(this),
61
61
  ForeignKeyConstraintNode: this.visitForeignKeyConstraint.bind(this),
62
62
  UnionNode: this.visitUnion.bind(this),
63
+ CreateViewNode: this.visitCreateView.bind(this),
64
+ DropViewNode: this.visitDropView.bind(this),
63
65
  };
64
66
  visitNode = (node) => {
65
67
  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';
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';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -0,0 +1,17 @@
1
+ import { QueryResult } from '../../driver/database-connection.js';
2
+ import { UnknownRow } from '../../index.js';
3
+ import { RootOperationNode } from '../../query-compiler/query-compiler.js';
4
+ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
5
+ /**
6
+ * Transforms all ValueNodes to immediate.
7
+ *
8
+ * WARNING! This should never be part of the public API. Users should never use this.
9
+ * This is an internal helper.
10
+ *
11
+ * @internal
12
+ */
13
+ export declare class ImmediateValuePlugin implements KyselyPlugin {
14
+ #private;
15
+ transformQuery(args: PluginTransformQueryArgs): RootOperationNode;
16
+ transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
17
+ }
@@ -0,0 +1,18 @@
1
+ import { ImmediateValueTransformer } from './immediate-value-transformer.js';
2
+ /**
3
+ * Transforms all ValueNodes to immediate.
4
+ *
5
+ * WARNING! This should never be part of the public API. Users should never use this.
6
+ * This is an internal helper.
7
+ *
8
+ * @internal
9
+ */
10
+ export class ImmediateValuePlugin {
11
+ #transformer = new ImmediateValueTransformer();
12
+ transformQuery(args) {
13
+ return this.#transformer.transformNode(args.node);
14
+ }
15
+ async transformResult(args) {
16
+ return args.result;
17
+ }
18
+ }
@@ -0,0 +1,13 @@
1
+ import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
2
+ import { ValueNode } from '../../operation-node/value-node.js';
3
+ /**
4
+ * Transforms all ValueNodes to immediate.
5
+ *
6
+ * WARNING! This should never be part of the public API. Users should never use this.
7
+ * This is an internal helper.
8
+ *
9
+ * @internal
10
+ */
11
+ export declare class ImmediateValueTransformer extends OperationNodeTransformer {
12
+ transformValue(node: ValueNode): ValueNode;
13
+ }
@@ -0,0 +1,17 @@
1
+ import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
2
+ /**
3
+ * Transforms all ValueNodes to immediate.
4
+ *
5
+ * WARNING! This should never be part of the public API. Users should never use this.
6
+ * This is an internal helper.
7
+ *
8
+ * @internal
9
+ */
10
+ export class ImmediateValueTransformer extends OperationNodeTransformer {
11
+ transformValue(node) {
12
+ return {
13
+ ...super.transformValue(node),
14
+ immediate: true,
15
+ };
16
+ }
17
+ }
@@ -1,9 +1,11 @@
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 { CreateViewNode } from '../../operation-node/create-view-node.js';
4
5
  import { DeleteQueryNode } from '../../operation-node/delete-query-node.js';
5
6
  import { DropIndexNode } from '../../operation-node/drop-index-node.js';
6
7
  import { DropTableNode } from '../../operation-node/drop-table-node.js';
8
+ import { DropViewNode } from '../../operation-node/drop-view-node.js';
7
9
  import { InsertQueryNode } from '../../operation-node/insert-query-node.js';
8
10
  import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
9
11
  import { SelectQueryNode } from '../../operation-node/select-query-node.js';
@@ -20,6 +22,8 @@ export declare class WithSchemaTransformer extends OperationNodeTransformer {
20
22
  protected transformDropTable(node: DropTableNode): DropTableNode;
21
23
  protected transformCreateIndex(node: CreateIndexNode): CreateIndexNode;
22
24
  protected transformDropIndex(node: DropIndexNode): DropIndexNode;
25
+ protected transformCreateView(node: CreateViewNode): CreateViewNode;
26
+ protected transformDropView(node: DropViewNode): DropViewNode;
23
27
  protected transformAlterTable(node: AlterTableNode): AlterTableNode;
24
28
  protected transformTable(node: TableNode): TableNode;
25
29
  }
@@ -32,6 +32,12 @@ export class WithSchemaTransformer extends OperationNodeTransformer {
32
32
  transformDropIndex(node) {
33
33
  return this.#transformRoot(node, (node) => super.transformDropIndex(node));
34
34
  }
35
+ transformCreateView(node) {
36
+ return this.#transformRoot(node, (node) => super.transformCreateView(node));
37
+ }
38
+ transformDropView(node) {
39
+ return this.#transformRoot(node, (node) => super.transformDropView(node));
40
+ }
35
41
  transformAlterTable(node) {
36
42
  return this.#transformRoot(node, (node) => super.transformAlterTable(node));
37
43
  }
@@ -62,6 +62,8 @@ import { ModifyColumnNode } from '../operation-node/modify-column-node.js';
62
62
  import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
63
63
  import { ColumnNode } from '../operation-node/column-node.js';
64
64
  import { UnionNode } from '../operation-node/union-node.js';
65
+ import { CreateViewNode } from '../operation-node/create-view-node.js';
66
+ import { DropViewNode } from '../operation-node/drop-view-node.js';
65
67
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
66
68
  #private;
67
69
  protected get numParameters(): number;
@@ -130,6 +132,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
130
132
  protected visitAddConstraint(node: AddConstraintNode): void;
131
133
  protected visitDropConstraint(node: DropConstraintNode): void;
132
134
  protected visitUnion(node: UnionNode): void;
135
+ protected visitCreateView(node: CreateViewNode): void;
136
+ protected visitDropView(node: DropViewNode): void;
133
137
  protected append(str: string): void;
134
138
  protected appendValue(parameter: unknown): void;
135
139
  protected getLeftIdentifierWrapper(): string;
@@ -644,6 +644,31 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
644
644
  }
645
645
  this.visitNode(node.union);
646
646
  }
647
+ visitCreateView(node) {
648
+ this.append('create ');
649
+ if (node.modifier === 'OrReplace') {
650
+ this.append('or replace ');
651
+ }
652
+ this.append('view ');
653
+ this.visitNode(node.name);
654
+ this.append(' ');
655
+ if (node.columns) {
656
+ this.append('(');
657
+ this.compileList(node.columns);
658
+ this.append(') ');
659
+ }
660
+ if (node.as) {
661
+ this.append('as ');
662
+ this.visitNode(node.as);
663
+ }
664
+ }
665
+ visitDropView(node) {
666
+ this.append('drop view ');
667
+ if (node.modifier === 'IfExists') {
668
+ this.append('if exists ');
669
+ }
670
+ this.visitNode(node.name);
671
+ }
647
672
  append(str) {
648
673
  this.#sql += str;
649
674
  }
@@ -2,13 +2,15 @@ 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 { CreateViewNode } from '../operation-node/create-view-node.js';
5
6
  import { DropIndexNode } from '../operation-node/drop-index-node.js';
6
7
  import { DropSchemaNode } from '../operation-node/drop-schema-node.js';
7
8
  import { DropTableNode } from '../operation-node/drop-table-node.js';
9
+ import { DropViewNode } from '../operation-node/drop-view-node.js';
8
10
  import { QueryNode } from '../operation-node/query-node.js';
9
11
  import { RawNode } from '../operation-node/raw-node.js';
10
12
  import { CompiledQuery } from './compiled-query.js';
11
- export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | AlterTableNode | DropTableNode | DropIndexNode | CreateSchemaNode | DropSchemaNode | RawNode;
13
+ export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode;
12
14
  /**
13
15
  * a `QueryCompiler` compiles a query expressed as a tree of `OperationNodes` into SQL.
14
16
  */
@@ -0,0 +1,23 @@
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 { CreateViewNode } from '../operation-node/create-view-node.js';
7
+ import { AnyQueryBuilder } from '../index.js';
8
+ import { AnyRawBuilder } from '../util/type-utils.js';
9
+ export declare class CreateViewBuilder implements OperationNodeSource, Compilable {
10
+ #private;
11
+ constructor(props: CreateViewBuilderProps);
12
+ orReplace(): CreateViewBuilder;
13
+ columns(columns: string[]): CreateViewBuilder;
14
+ as(query: AnyQueryBuilder | AnyRawBuilder): CreateViewBuilder;
15
+ toOperationNode(): CreateViewNode;
16
+ compile(): CompiledQuery;
17
+ execute(): Promise<void>;
18
+ }
19
+ export interface CreateViewBuilderProps {
20
+ readonly queryId: QueryId;
21
+ readonly executor: QueryExecutor;
22
+ readonly createViewNode: CreateViewNode;
23
+ }
@@ -0,0 +1,61 @@
1
+ import { preventAwait } from '../util/prevent-await.js';
2
+ import { freeze } from '../util/object-utils.js';
3
+ import { CreateViewNode } from '../operation-node/create-view-node.js';
4
+ import { parseColumnName } from '../parser/reference-parser.js';
5
+ import { QueryNode } from '../index.js';
6
+ import { ImmediateValuePlugin } from '../plugin/immediate-value.ts/immediate-value-plugin.js';
7
+ export class CreateViewBuilder {
8
+ #props;
9
+ constructor(props) {
10
+ this.#props = freeze({
11
+ ...props,
12
+ // The select statement (defined using the `as` method) can't have parameters on some
13
+ // dialects. We add the `ImmediateValuePlugin` to make all parameters "immediate"
14
+ // meaning they are interpolated into the SQL instead of added as parameters.
15
+ //
16
+ // The values are therefore not escaped at all, which leads to SQL injection
17
+ // vulnerabilities if user input is passed into the query. However, the use
18
+ // case where user input is passed into a `create view` statement is a weird
19
+ // one, and we can pretty safely just ignore it.
20
+ executor: props.executor.withPlugin(new ImmediateValuePlugin()),
21
+ });
22
+ }
23
+ orReplace() {
24
+ return new CreateViewBuilder({
25
+ ...this.#props,
26
+ createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
27
+ modifier: 'OrReplace',
28
+ }),
29
+ });
30
+ }
31
+ columns(columns) {
32
+ return new CreateViewBuilder({
33
+ ...this.#props,
34
+ createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
35
+ columns: columns.map(parseColumnName),
36
+ }),
37
+ });
38
+ }
39
+ as(query) {
40
+ const queryNode = query.toOperationNode();
41
+ if (QueryNode.isMutating(queryNode)) {
42
+ throw new Error('only select statements are allowd in views');
43
+ }
44
+ return new CreateViewBuilder({
45
+ ...this.#props,
46
+ createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
47
+ as: queryNode,
48
+ }),
49
+ });
50
+ }
51
+ toOperationNode() {
52
+ return this.#props.executor.transformQuery(this.#props.createViewNode, this.#props.queryId);
53
+ }
54
+ compile() {
55
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
56
+ }
57
+ async execute() {
58
+ await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
59
+ }
60
+ }
61
+ preventAwait(CreateViewBuilder, "don't await CreateViewBuilder instances directly. To execute the query you need to call `execute`");
@@ -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 { DropViewNode } from '../operation-node/drop-view-node.js';
7
+ export declare class DropViewBuilder implements OperationNodeSource, Compilable {
8
+ #private;
9
+ constructor(props: DropViewBuilderProps);
10
+ ifExists(): DropViewBuilder;
11
+ toOperationNode(): DropViewNode;
12
+ compile(): CompiledQuery;
13
+ execute(): Promise<void>;
14
+ }
15
+ export interface DropViewBuilderProps {
16
+ readonly queryId: QueryId;
17
+ readonly executor: QueryExecutor;
18
+ readonly dropViewNode: DropViewNode;
19
+ }
@@ -0,0 +1,25 @@
1
+ import { preventAwait } from '../util/prevent-await.js';
2
+ import { freeze } from '../util/object-utils.js';
3
+ import { DropViewNode } from '../operation-node/drop-view-node.js';
4
+ export class DropViewBuilder {
5
+ #props;
6
+ constructor(props) {
7
+ this.#props = freeze(props);
8
+ }
9
+ ifExists() {
10
+ return new DropViewBuilder({
11
+ ...this.#props,
12
+ dropViewNode: DropViewNode.cloneWithModifier(this.#props.dropViewNode, 'IfExists'),
13
+ });
14
+ }
15
+ toOperationNode() {
16
+ return this.#props.executor.transformQuery(this.#props.dropViewNode, this.#props.queryId);
17
+ }
18
+ compile() {
19
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
20
+ }
21
+ async execute() {
22
+ await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
23
+ }
24
+ }
25
+ preventAwait(DropViewBuilder, "don't await DropViewBuilder instances directly. To execute the query you need to call `execute`");
@@ -6,6 +6,8 @@ import { CreateTableBuilder } from './create-table-builder.js';
6
6
  import { DropIndexBuilder } from './drop-index-builder.js';
7
7
  import { DropSchemaBuilder } from './drop-schema-builder.js';
8
8
  import { DropTableBuilder } from './drop-table-builder.js';
9
+ import { CreateViewBuilder } from './create-view-builder.js';
10
+ import { DropViewBuilder } from './drop-view-builder.js';
9
11
  /**
10
12
  * Provides methods for building database schema.
11
13
  */
@@ -135,6 +137,31 @@ export declare class SchemaModule {
135
137
  * ```
136
138
  */
137
139
  alterTable(table: string): AlterTableBuilder;
140
+ /**
141
+ * Create a new view.
142
+ *
143
+ * @example
144
+ * ```ts
145
+ * await db.schema
146
+ * .createView('dogs')
147
+ * .orReplace()
148
+ * .as(db.selectFrom('pet').selectAll().where('species', '=', 'dog'))
149
+ * .execute()
150
+ * ```
151
+ */
152
+ createView(viewName: string): CreateViewBuilder;
153
+ /**
154
+ * Drop a view.
155
+ *
156
+ * @example
157
+ * ```ts
158
+ * await db.schema
159
+ * .dropView('dogs')
160
+ * .ifExists()
161
+ * .execute()
162
+ * ```
163
+ */
164
+ dropView(viewName: string): DropViewBuilder;
138
165
  /**
139
166
  * See {@link QueryCreator.withSchema}
140
167
  */
@@ -15,6 +15,10 @@ import { DropSchemaBuilder } from './drop-schema-builder.js';
15
15
  import { DropTableBuilder } from './drop-table-builder.js';
16
16
  import { createQueryId } from '../util/query-id.js';
17
17
  import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
18
+ import { CreateViewBuilder } from './create-view-builder.js';
19
+ import { CreateViewNode } from '../operation-node/create-view-node.js';
20
+ import { DropViewBuilder } from './drop-view-builder.js';
21
+ import { DropViewNode } from '../operation-node/drop-view-node.js';
18
22
  /**
19
23
  * Provides methods for building database schema.
20
24
  */
@@ -188,6 +192,43 @@ export class SchemaModule {
188
192
  alterTableNode: AlterTableNode.create(table),
189
193
  });
190
194
  }
195
+ /**
196
+ * Create a new view.
197
+ *
198
+ * @example
199
+ * ```ts
200
+ * await db.schema
201
+ * .createView('dogs')
202
+ * .orReplace()
203
+ * .as(db.selectFrom('pet').selectAll().where('species', '=', 'dog'))
204
+ * .execute()
205
+ * ```
206
+ */
207
+ createView(viewName) {
208
+ return new CreateViewBuilder({
209
+ queryId: createQueryId(),
210
+ executor: this.#executor,
211
+ createViewNode: CreateViewNode.create(viewName),
212
+ });
213
+ }
214
+ /**
215
+ * Drop a view.
216
+ *
217
+ * @example
218
+ * ```ts
219
+ * await db.schema
220
+ * .dropView('dogs')
221
+ * .ifExists()
222
+ * .execute()
223
+ * ```
224
+ */
225
+ dropView(viewName) {
226
+ return new DropViewBuilder({
227
+ queryId: createQueryId(),
228
+ executor: this.#executor,
229
+ dropViewNode: DropViewNode.create(viewName),
230
+ });
231
+ }
191
232
  /**
192
233
  * See {@link QueryCreator.withSchema}
193
234
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.9.8",
3
+ "version": "0.9.9",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",