kysely 0.20.1 → 0.21.0

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 (61) hide show
  1. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +5 -12
  2. package/dist/cjs/dialect/postgres/postgres-driver.js +16 -11
  3. package/dist/cjs/operation-node/create-type-node.d.ts +2 -2
  4. package/dist/cjs/operation-node/create-type-node.js +2 -2
  5. package/dist/cjs/operation-node/create-view-node.d.ts +2 -2
  6. package/dist/cjs/operation-node/create-view-node.js +2 -2
  7. package/dist/cjs/operation-node/drop-index-node.d.ts +2 -2
  8. package/dist/cjs/operation-node/drop-index-node.js +2 -2
  9. package/dist/cjs/operation-node/drop-type-node.d.ts +2 -2
  10. package/dist/cjs/operation-node/drop-type-node.js +2 -2
  11. package/dist/cjs/operation-node/drop-view-node.d.ts +2 -2
  12. package/dist/cjs/operation-node/drop-view-node.js +2 -2
  13. package/dist/cjs/operation-node/identifier-node.d.ts +2 -2
  14. package/dist/cjs/operation-node/identifier-node.js +2 -2
  15. package/dist/cjs/operation-node/operation-node-transformer.d.ts +6 -4
  16. package/dist/cjs/operation-node/operation-node-transformer.js +23 -13
  17. package/dist/cjs/operation-node/operation-node-visitor.d.ts +6 -4
  18. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  19. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  20. package/dist/cjs/operation-node/schemable-identifier-node.d.ts +15 -0
  21. package/dist/cjs/operation-node/schemable-identifier-node.js +26 -0
  22. package/dist/cjs/operation-node/table-node.d.ts +2 -3
  23. package/dist/cjs/operation-node/table-node.js +3 -4
  24. package/dist/cjs/plugin/camel-case/camel-case-transformer.js +1 -1
  25. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -28
  26. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +72 -78
  27. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
  28. package/dist/cjs/query-compiler/default-query-compiler.js +6 -3
  29. package/dist/cjs/schema/alter-table-builder.d.ts +6 -6
  30. package/dist/cjs/schema/column-definition-builder.d.ts +6 -6
  31. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +5 -12
  32. package/dist/esm/dialect/postgres/postgres-driver.js +16 -11
  33. package/dist/esm/operation-node/create-type-node.d.ts +2 -2
  34. package/dist/esm/operation-node/create-type-node.js +2 -2
  35. package/dist/esm/operation-node/create-view-node.d.ts +2 -2
  36. package/dist/esm/operation-node/create-view-node.js +2 -2
  37. package/dist/esm/operation-node/drop-index-node.d.ts +2 -2
  38. package/dist/esm/operation-node/drop-index-node.js +2 -2
  39. package/dist/esm/operation-node/drop-type-node.d.ts +2 -2
  40. package/dist/esm/operation-node/drop-type-node.js +2 -2
  41. package/dist/esm/operation-node/drop-view-node.d.ts +2 -2
  42. package/dist/esm/operation-node/drop-view-node.js +2 -2
  43. package/dist/esm/operation-node/identifier-node.d.ts +2 -2
  44. package/dist/esm/operation-node/identifier-node.js +2 -2
  45. package/dist/esm/operation-node/operation-node-transformer.d.ts +6 -4
  46. package/dist/esm/operation-node/operation-node-transformer.js +23 -13
  47. package/dist/esm/operation-node/operation-node-visitor.d.ts +6 -4
  48. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  49. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  50. package/dist/esm/operation-node/schemable-identifier-node.d.ts +15 -0
  51. package/dist/esm/operation-node/schemable-identifier-node.js +24 -0
  52. package/dist/esm/operation-node/table-node.d.ts +2 -3
  53. package/dist/esm/operation-node/table-node.js +3 -4
  54. package/dist/esm/plugin/camel-case/camel-case-transformer.js +1 -1
  55. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -28
  56. package/dist/esm/plugin/with-schema/with-schema-transformer.js +72 -78
  57. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
  58. package/dist/esm/query-compiler/default-query-compiler.js +6 -3
  59. package/dist/esm/schema/alter-table-builder.d.ts +6 -6
  60. package/dist/esm/schema/column-definition-builder.d.ts +6 -6
  61. package/package.json +2 -1
@@ -36,6 +36,7 @@ export class OperationNodeTransformer {
36
36
  AliasNode: this.transformAlias.bind(this),
37
37
  ColumnNode: this.transformColumn.bind(this),
38
38
  IdentifierNode: this.transformIdentifier.bind(this),
39
+ SchemableIdentifierNode: this.transformSchemableIdentifier.bind(this),
39
40
  RawNode: this.transformRaw.bind(this),
40
41
  ReferenceNode: this.transformReference.bind(this),
41
42
  SelectQueryNode: this.transformSelectQuery.bind(this),
@@ -104,20 +105,23 @@ export class OperationNodeTransformer {
104
105
  DropTypeNode: this.transformDropType.bind(this),
105
106
  ExplainNode: this.transformExplain.bind(this),
106
107
  });
107
- transformNode = (node) => {
108
+ transformNode(node) {
108
109
  if (!node) {
109
- return undefined;
110
+ return node;
110
111
  }
111
112
  this.nodeStack.push(node);
112
- const out = this.#transformers[node.kind](node);
113
+ const out = this.transformNodeImpl(node);
113
114
  this.nodeStack.pop();
114
115
  return freeze(out);
115
- };
116
+ }
117
+ transformNodeImpl(node) {
118
+ return this.#transformers[node.kind](node);
119
+ }
116
120
  transformNodeList(list) {
117
121
  if (!list) {
118
122
  return list;
119
123
  }
120
- return freeze(list.map(this.transformNode));
124
+ return freeze(list.map((node) => this.transformNode(node)));
121
125
  }
122
126
  transformSelectQuery(node) {
123
127
  return requireAllProps({
@@ -161,7 +165,6 @@ export class OperationNodeTransformer {
161
165
  transformTable(node) {
162
166
  return requireAllProps({
163
167
  kind: 'TableNode',
164
- schema: this.transformNode(node.schema),
165
168
  table: this.transformNode(node.table),
166
169
  });
167
170
  }
@@ -625,6 +628,20 @@ export class OperationNodeTransformer {
625
628
  ifExists: node.ifExists,
626
629
  });
627
630
  }
631
+ transformExplain(node) {
632
+ return requireAllProps({
633
+ kind: 'ExplainNode',
634
+ format: node.format,
635
+ options: this.transformNode(node.options),
636
+ });
637
+ }
638
+ transformSchemableIdentifier(node) {
639
+ return requireAllProps({
640
+ kind: 'SchemableIdentifierNode',
641
+ schema: this.transformNode(node.schema),
642
+ identifier: this.transformNode(node.identifier),
643
+ });
644
+ }
628
645
  transformDataType(node) {
629
646
  // An Object.freezed leaf node. No need to clone.
630
647
  return node;
@@ -649,11 +666,4 @@ export class OperationNodeTransformer {
649
666
  // An Object.freezed leaf node. No need to clone.
650
667
  return node;
651
668
  }
652
- transformExplain(node) {
653
- return requireAllProps({
654
- kind: 'ExplainNode',
655
- format: node.format,
656
- options: this.transformNode(node.options),
657
- });
658
- }
659
669
  }
@@ -69,6 +69,7 @@ import { SelectModifierNode } from './select-modifier-node.js';
69
69
  import { CreateTypeNode } from './create-type-node.js';
70
70
  import { DropTypeNode } from './drop-type-node.js';
71
71
  import { ExplainNode } from './explain-node.js';
72
+ import { SchemableIdentifierNode } from './schemable-identifier-node.js';
72
73
  export declare abstract class OperationNodeVisitor {
73
74
  #private;
74
75
  protected readonly nodeStack: OperationNode[];
@@ -129,10 +130,11 @@ export declare abstract class OperationNodeVisitor {
129
130
  protected abstract visitForeignKeyConstraint(node: ForeignKeyConstraintNode): void;
130
131
  protected abstract visitUnion(node: UnionNode): void;
131
132
  protected abstract visitDataType(node: DataTypeNode): void;
132
- protected abstract visitSelectAll(_: SelectAllNode): void;
133
- protected abstract visitIdentifier(_: IdentifierNode): void;
134
- protected abstract visitValue(_: ValueNode): void;
135
- protected abstract visitPrimitiveValueList(_: PrimitiveValueListNode): void;
133
+ protected abstract visitSelectAll(node: SelectAllNode): void;
134
+ protected abstract visitIdentifier(node: IdentifierNode): void;
135
+ protected abstract visitSchemableIdentifier(node: SchemableIdentifierNode): void;
136
+ protected abstract visitValue(node: ValueNode): void;
137
+ protected abstract visitPrimitiveValueList(node: PrimitiveValueListNode): void;
136
138
  protected abstract visitOperator(node: OperatorNode): void;
137
139
  protected abstract visitCreateView(node: CreateViewNode): void;
138
140
  protected abstract visitDropView(node: DropViewNode): void;
@@ -9,6 +9,7 @@ export class OperationNodeVisitor {
9
9
  AliasNode: this.visitAlias.bind(this),
10
10
  ColumnNode: this.visitColumn.bind(this),
11
11
  IdentifierNode: this.visitIdentifier.bind(this),
12
+ SchemableIdentifierNode: this.visitSchemableIdentifier.bind(this),
12
13
  RawNode: this.visitRaw.bind(this),
13
14
  ReferenceNode: this.visitReference.bind(this),
14
15
  SelectQueryNode: this.visitSelectQuery.bind(this),
@@ -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' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode';
1
+ export declare type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | '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' | 'ExplainNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -0,0 +1,15 @@
1
+ import { IdentifierNode } from './identifier-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ export interface SchemableIdentifierNode extends OperationNode {
4
+ readonly kind: 'SchemableIdentifierNode';
5
+ readonly schema?: IdentifierNode;
6
+ readonly identifier: IdentifierNode;
7
+ }
8
+ /**
9
+ * @internal
10
+ */
11
+ export declare const SchemableIdentifierNode: Readonly<{
12
+ is(node: OperationNode): node is SchemableIdentifierNode;
13
+ create(identifier: string): SchemableIdentifierNode;
14
+ createWithSchema(schema: string, identifier: string): SchemableIdentifierNode;
15
+ }>;
@@ -0,0 +1,24 @@
1
+ /// <reference types="./schemable-identifier-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 SchemableIdentifierNode = freeze({
8
+ is(node) {
9
+ return node.kind === 'SchemableIdentifierNode';
10
+ },
11
+ create(identifier) {
12
+ return freeze({
13
+ kind: 'SchemableIdentifierNode',
14
+ identifier: IdentifierNode.create(identifier),
15
+ });
16
+ },
17
+ createWithSchema(schema, identifier) {
18
+ return freeze({
19
+ kind: 'SchemableIdentifierNode',
20
+ schema: IdentifierNode.create(schema),
21
+ identifier: IdentifierNode.create(identifier),
22
+ });
23
+ },
24
+ });
@@ -1,9 +1,8 @@
1
- import { IdentifierNode } from './identifier-node.js';
2
1
  import { OperationNode } from './operation-node.js';
2
+ import { SchemableIdentifierNode } from './schemable-identifier-node.js';
3
3
  export interface TableNode extends OperationNode {
4
4
  readonly kind: 'TableNode';
5
- readonly schema?: IdentifierNode;
6
- readonly table: IdentifierNode;
5
+ readonly table: SchemableIdentifierNode;
7
6
  }
8
7
  /**
9
8
  * @internal
@@ -1,6 +1,6 @@
1
1
  /// <reference types="./table-node.d.ts" />
2
2
  import { freeze } from '../util/object-utils.js';
3
- import { IdentifierNode } from './identifier-node.js';
3
+ import { SchemableIdentifierNode } from './schemable-identifier-node.js';
4
4
  /**
5
5
  * @internal
6
6
  */
@@ -11,14 +11,13 @@ export const TableNode = freeze({
11
11
  create(table) {
12
12
  return freeze({
13
13
  kind: 'TableNode',
14
- table: IdentifierNode.create(table),
14
+ table: SchemableIdentifierNode.create(table),
15
15
  });
16
16
  },
17
17
  createWithSchema(schema, table) {
18
18
  return freeze({
19
19
  kind: 'TableNode',
20
- schema: IdentifierNode.create(schema),
21
- table: IdentifierNode.create(table),
20
+ table: SchemableIdentifierNode.createWithSchema(schema, table),
22
21
  });
23
22
  },
24
23
  });
@@ -10,7 +10,7 @@ export class SnakeCaseTransformer extends OperationNodeTransformer {
10
10
  node = super.transformIdentifier(node);
11
11
  return {
12
12
  ...node,
13
- identifier: this.#snakeCase(node.identifier),
13
+ name: this.#snakeCase(node.name),
14
14
  };
15
15
  }
16
16
  }
@@ -1,33 +1,9 @@
1
- import { AlterTableNode } from '../../operation-node/alter-table-node.js';
2
- import { CreateIndexNode } from '../../operation-node/create-index-node.js';
3
- import { CreateTableNode } from '../../operation-node/create-table-node.js';
4
- import { CreateTypeNode } from '../../operation-node/create-type-node.js';
5
- import { CreateViewNode } from '../../operation-node/create-view-node.js';
6
- import { DeleteQueryNode } from '../../operation-node/delete-query-node.js';
7
- import { DropIndexNode } from '../../operation-node/drop-index-node.js';
8
- import { DropTableNode } from '../../operation-node/drop-table-node.js';
9
- import { DropTypeNode } from '../../operation-node/drop-type-node.js';
10
- import { DropViewNode } from '../../operation-node/drop-view-node.js';
11
- import { InsertQueryNode } from '../../operation-node/insert-query-node.js';
12
1
  import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
13
- import { SelectQueryNode } from '../../operation-node/select-query-node.js';
14
- import { TableNode } from '../../operation-node/table-node.js';
15
- import { UpdateQueryNode } from '../../operation-node/update-query-node.js';
2
+ import { OperationNode } from '../../operation-node/operation-node.js';
3
+ import { SchemableIdentifierNode } from '../../operation-node/schemable-identifier-node.js';
16
4
  export declare class WithSchemaTransformer extends OperationNodeTransformer {
17
5
  #private;
18
6
  constructor(schema: string);
19
- protected transformSelectQuery(node: SelectQueryNode): SelectQueryNode;
20
- protected transformInsertQuery(node: InsertQueryNode): InsertQueryNode;
21
- protected transformUpdateQuery(node: UpdateQueryNode): UpdateQueryNode;
22
- protected transformDeleteQuery(node: DeleteQueryNode): DeleteQueryNode;
23
- protected transformCreateTable(node: CreateTableNode): CreateTableNode;
24
- protected transformDropTable(node: DropTableNode): DropTableNode;
25
- protected transformCreateIndex(node: CreateIndexNode): CreateIndexNode;
26
- protected transformDropIndex(node: DropIndexNode): DropIndexNode;
27
- protected transformCreateView(node: CreateViewNode): CreateViewNode;
28
- protected transformDropView(node: DropViewNode): DropViewNode;
29
- protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
30
- protected transformDropType(node: DropTypeNode): DropTypeNode;
31
- protected transformAlterTable(node: AlterTableNode): AlterTableNode;
32
- protected transformTable(node: TableNode): TableNode;
7
+ protected transformNodeImpl<T extends OperationNode>(node: T): T;
8
+ protected transformSchemableIdentifier(node: SchemableIdentifierNode): SchemableIdentifierNode;
33
9
  }
@@ -1,119 +1,113 @@
1
1
  /// <reference types="./with-schema-transformer.d.ts" />
2
2
  import { AliasNode } from '../../operation-node/alias-node.js';
3
3
  import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
4
+ import { SchemableIdentifierNode } from '../../operation-node/schemable-identifier-node.js';
4
5
  import { TableNode } from '../../operation-node/table-node.js';
6
+ import { freeze } from '../../util/object-utils.js';
7
+ // This object exist only so that we get a type error when a new RootOperationNode
8
+ // is added. If you get a type error here, make sure to add the new root node and
9
+ // handle it correctly in the transformer.
10
+ //
11
+ // DO NOT REFACTOR THIS EVEN IF IT SEEMS USELESS TO YOU!
12
+ const ROOT_OPERATION_NODES = freeze({
13
+ AlterTableNode: true,
14
+ CreateIndexNode: true,
15
+ CreateSchemaNode: true,
16
+ CreateTableNode: true,
17
+ CreateTypeNode: true,
18
+ CreateViewNode: true,
19
+ DeleteQueryNode: true,
20
+ DropIndexNode: true,
21
+ DropSchemaNode: true,
22
+ DropTableNode: true,
23
+ DropTypeNode: true,
24
+ DropViewNode: true,
25
+ InsertQueryNode: true,
26
+ RawNode: true,
27
+ SelectQueryNode: true,
28
+ UpdateQueryNode: true,
29
+ });
5
30
  export class WithSchemaTransformer extends OperationNodeTransformer {
6
31
  #schema;
7
- #tables = new Set();
32
+ #schemableIds = new Set();
8
33
  constructor(schema) {
9
34
  super();
10
35
  this.#schema = schema;
11
36
  }
12
- transformSelectQuery(node) {
13
- return this.#transformRoot(node, (node) => super.transformSelectQuery(node));
14
- }
15
- transformInsertQuery(node) {
16
- return this.#transformRoot(node, (node) => super.transformInsertQuery(node));
17
- }
18
- transformUpdateQuery(node) {
19
- return this.#transformRoot(node, (node) => super.transformUpdateQuery(node));
20
- }
21
- transformDeleteQuery(node) {
22
- return this.#transformRoot(node, (node) => super.transformDeleteQuery(node));
23
- }
24
- transformCreateTable(node) {
25
- return this.#transformRoot(node, (node) => super.transformCreateTable(node));
26
- }
27
- transformDropTable(node) {
28
- return this.#transformRoot(node, (node) => super.transformDropTable(node));
29
- }
30
- transformCreateIndex(node) {
31
- return this.#transformRoot(node, (node) => super.transformCreateIndex(node));
32
- }
33
- transformDropIndex(node) {
34
- return this.#transformRoot(node, (node) => super.transformDropIndex(node));
35
- }
36
- transformCreateView(node) {
37
- return this.#transformRoot(node, (node) => super.transformCreateView(node));
38
- }
39
- transformDropView(node) {
40
- return this.#transformRoot(node, (node) => super.transformDropView(node));
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
- }
48
- transformAlterTable(node) {
49
- return this.#transformRoot(node, (node) => super.transformAlterTable(node));
37
+ transformNodeImpl(node) {
38
+ if (!this.#isRootOperationNode(node)) {
39
+ return super.transformNodeImpl(node);
40
+ }
41
+ const tables = this.#collectSchemableIds(node);
42
+ for (const table of tables) {
43
+ this.#schemableIds.add(table);
44
+ }
45
+ const transformed = super.transformNodeImpl(node);
46
+ for (const table of tables) {
47
+ this.#schemableIds.delete(table);
48
+ }
49
+ return transformed;
50
50
  }
51
- transformTable(node) {
52
- const transformed = super.transformTable(node);
53
- if (transformed.schema || !this.#tables.has(node.table.identifier)) {
51
+ transformSchemableIdentifier(node) {
52
+ const transformed = super.transformSchemableIdentifier(node);
53
+ if (transformed.schema || !this.#schemableIds.has(node.identifier.name)) {
54
54
  return transformed;
55
55
  }
56
56
  return {
57
57
  ...transformed,
58
- schema: {
58
+ schema: freeze({
59
59
  kind: 'IdentifierNode',
60
- identifier: this.#schema,
61
- },
60
+ name: this.#schema,
61
+ }),
62
62
  };
63
63
  }
64
- #transformRoot(node, transform) {
65
- const tables = this.#collectTables(node);
66
- for (const table of tables) {
67
- this.#tables.add(table);
68
- }
69
- const transformed = transform(node);
70
- for (const table of tables) {
71
- this.#tables.delete(table);
72
- }
73
- return transformed;
64
+ #isRootOperationNode(node) {
65
+ return node.kind in ROOT_OPERATION_NODES;
74
66
  }
75
- #collectTables(node) {
76
- const tables = new Set();
67
+ #collectSchemableIds(node) {
68
+ const schemableIds = new Set();
69
+ if ('name' in node && node.name && SchemableIdentifierNode.is(node.name)) {
70
+ this.#collectSchemableId(node.name, schemableIds);
71
+ }
77
72
  if ('from' in node && node.from) {
78
- this.#collectTablesFromTableExpressionNodes(node.from.froms, tables);
73
+ for (const from of node.from.froms) {
74
+ this.#collectSchemableIdsFromTableExpr(from, schemableIds);
75
+ }
79
76
  }
80
77
  if ('into' in node && node.into) {
81
- this.#collectTablesFromTableExpressionNode(node.into, tables);
78
+ this.#collectSchemableIdsFromTableExpr(node.into, schemableIds);
82
79
  }
83
80
  if ('table' in node && node.table) {
84
- this.#collectTablesFromTableExpressionNode(node.table, tables);
81
+ this.#collectSchemableIdsFromTableExpr(node.table, schemableIds);
85
82
  }
86
83
  if ('joins' in node && node.joins) {
87
- this.#collectTablesFromJoins(node.joins, tables);
84
+ for (const join of node.joins) {
85
+ this.#collectSchemableIdsFromTableExpr(join.table, schemableIds);
86
+ }
88
87
  }
89
88
  if ('with' in node && node.with) {
90
- this.#removeCommonTableExpressionTables(node.with, tables);
91
- }
92
- return tables;
93
- }
94
- #collectTablesFromTableExpressionNodes(nodes, tables) {
95
- for (const node of nodes) {
96
- this.#collectTablesFromTableExpressionNode(node, tables);
89
+ this.#removeCommonTableExpressionTables(node.with, schemableIds);
97
90
  }
91
+ return schemableIds;
98
92
  }
99
- #collectTablesFromJoins(nodes, tables) {
100
- for (const node of nodes) {
101
- this.#collectTablesFromTableExpressionNode(node.table, tables);
102
- }
103
- }
104
- #collectTablesFromTableExpressionNode(node, tables) {
93
+ #collectSchemableIdsFromTableExpr(node, schemableIds) {
105
94
  const table = TableNode.is(node)
106
95
  ? node
107
96
  : AliasNode.is(node) && TableNode.is(node.node)
108
97
  ? node.node
109
98
  : null;
110
- if (table && !this.#tables.has(table.table.identifier)) {
111
- tables.add(table.table.identifier);
99
+ if (table) {
100
+ this.#collectSchemableId(table.table, schemableIds);
101
+ }
102
+ }
103
+ #collectSchemableId(node, schemableIds) {
104
+ if (!this.#schemableIds.has(node.identifier.name)) {
105
+ schemableIds.add(node.identifier.name);
112
106
  }
113
107
  }
114
- #removeCommonTableExpressionTables(node, tables) {
108
+ #removeCommonTableExpressionTables(node, schemableIds) {
115
109
  for (const expr of node.expressions) {
116
- tables.delete(expr.name.table.table.identifier);
110
+ schemableIds.delete(expr.name.table.table.identifier.name);
117
111
  }
118
112
  }
119
113
  }
@@ -72,6 +72,7 @@ import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
72
72
  import { CreateTypeNode } from '../operation-node/create-type-node.js';
73
73
  import { DropTypeNode } from '../operation-node/drop-type-node.js';
74
74
  import { ExplainNode } from '../operation-node/explain-node.js';
75
+ import { SchemableIdentifierNode } from '../operation-node/schemable-identifier-node.js';
75
76
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
76
77
  #private;
77
78
  protected get numParameters(): number;
@@ -106,6 +107,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
106
107
  protected visitRaw(node: RawNode): void;
107
108
  protected visitOperator(node: OperatorNode): void;
108
109
  protected visitTable(node: TableNode): void;
110
+ protected visitSchemableIdentifier(node: SchemableIdentifierNode): void;
109
111
  protected visitCreateTable(node: CreateTableNode): void;
110
112
  protected visitColumnDefinition(node: ColumnDefinitionNode): void;
111
113
  protected getAutoIncrement(): string;
@@ -237,10 +237,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
237
237
  this.append(this.getRightIdentifierWrapper());
238
238
  }
239
239
  compileUnwrappedIdentifier(node) {
240
- if (!isString(node.identifier)) {
240
+ if (!isString(node.name)) {
241
241
  throw new Error('a non-string identifier was passed to compileUnwrappedIdentifier.');
242
242
  }
243
- this.append(this.sanitizeIdentifier(node.identifier));
243
+ this.append(this.sanitizeIdentifier(node.name));
244
244
  }
245
245
  visitFilter(node) {
246
246
  if (node.left) {
@@ -316,11 +316,14 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
316
316
  this.append(node.operator);
317
317
  }
318
318
  visitTable(node) {
319
+ this.visitNode(node.table);
320
+ }
321
+ visitSchemableIdentifier(node) {
319
322
  if (node.schema) {
320
323
  this.visitNode(node.schema);
321
324
  this.append('.');
322
325
  }
323
- this.visitNode(node.table);
326
+ this.visitNode(node.identifier);
324
327
  }
325
328
  visitCreateTable(node) {
326
329
  this.append('create ');
@@ -92,7 +92,7 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
92
92
  * Makes the column the primary key.
93
93
  *
94
94
  * If you want to specify a composite primary key use the
95
- * {@link TableBuilder.addPrimaryKeyConstraint} method.
95
+ * {@link CreateTableBuilder.addPrimaryKeyConstraint} method.
96
96
  */
97
97
  primaryKey(): AlterTableAddColumnBuilder;
98
98
  /**
@@ -100,7 +100,7 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
100
100
  *
101
101
  * If your database engine doesn't support foreign key constraints in the
102
102
  * column definition (like MySQL 5) you need to call the table level
103
- * {@link TableBuilder.addForeignKeyConstraint} method instead.
103
+ * {@link CreateTableBuilder.addForeignKeyConstraint} method instead.
104
104
  *
105
105
  * ### Examples
106
106
  *
@@ -114,7 +114,7 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
114
114
  *
115
115
  * If your database engine doesn't support foreign key constraints in the
116
116
  * column definition (like MySQL 5) you need to call the table level
117
- * {@link TableBuilder.addForeignKeyConstraint} method instead.
117
+ * {@link CreateTableBuilder.addForeignKeyConstraint} method instead.
118
118
  *
119
119
  * ### Examples
120
120
  *
@@ -258,7 +258,7 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
258
258
  * Makes the column the primary key.
259
259
  *
260
260
  * If you want to specify a composite primary key use the
261
- * {@link TableBuilder.addPrimaryKeyConstraint} method.
261
+ * {@link CreateTableBuilder.addPrimaryKeyConstraint} method.
262
262
  */
263
263
  primaryKey(): AlterTableModifyColumnBuilder;
264
264
  /**
@@ -266,7 +266,7 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
266
266
  *
267
267
  * If your database engine doesn't support foreign key constraints in the
268
268
  * column definition (like MySQL 5) you need to call the table level
269
- * {@link TableBuilder.addForeignKeyConstraint} method instead.
269
+ * {@link CreateTableBuilder.addForeignKeyConstraint} method instead.
270
270
  *
271
271
  * ### Examples
272
272
  *
@@ -280,7 +280,7 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
280
280
  *
281
281
  * If your database engine doesn't support foreign key constraints in the
282
282
  * column definition (like MySQL 5) you need to call the table level
283
- * {@link TableBuilder.addForeignKeyConstraint} method instead.
283
+ * {@link CreateTableBuilder.addForeignKeyConstraint} method instead.
284
284
  *
285
285
  * ### Examples
286
286
  *
@@ -16,7 +16,7 @@ export interface ColumnDefinitionBuilderInterface {
16
16
  * Makes the column the primary key.
17
17
  *
18
18
  * If you want to specify a composite primary key use the
19
- * {@link TableBuilder.addPrimaryKeyConstraint} method.
19
+ * {@link CreateTableBuilder.addPrimaryKeyConstraint} method.
20
20
  */
21
21
  primaryKey(): ColumnDefinitionBuilderInterface;
22
22
  /**
@@ -24,7 +24,7 @@ export interface ColumnDefinitionBuilderInterface {
24
24
  *
25
25
  * If your database engine doesn't support foreign key constraints in the
26
26
  * column definition (like MySQL 5) you need to call the table level
27
- * {@link TableBuilder.addForeignKeyConstraint} method instead.
27
+ * {@link CreateTableBuilder.addForeignKeyConstraint} method instead.
28
28
  *
29
29
  * ### Examples
30
30
  *
@@ -38,7 +38,7 @@ export interface ColumnDefinitionBuilderInterface {
38
38
  *
39
39
  * If your database engine doesn't support foreign key constraints in the
40
40
  * column definition (like MySQL 5) you need to call the table level
41
- * {@link TableBuilder.addForeignKeyConstraint} method instead.
41
+ * {@link CreateTableBuilder.addForeignKeyConstraint} method instead.
42
42
  *
43
43
  * ### Examples
44
44
  *
@@ -175,7 +175,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
175
175
  * Makes the column the primary key.
176
176
  *
177
177
  * If you want to specify a composite primary key use the
178
- * {@link TableBuilder.addPrimaryKeyConstraint} method.
178
+ * {@link CreateTableBuilder.addPrimaryKeyConstraint} method.
179
179
  */
180
180
  primaryKey(): ColumnDefinitionBuilder;
181
181
  /**
@@ -183,7 +183,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
183
183
  *
184
184
  * If your database engine doesn't support foreign key constraints in the
185
185
  * column definition (like MySQL 5) you need to call the table level
186
- * {@link TableBuilder.addForeignKeyConstraint} method instead.
186
+ * {@link CreateTableBuilder.addForeignKeyConstraint} method instead.
187
187
  *
188
188
  * ### Examples
189
189
  *
@@ -197,7 +197,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
197
197
  *
198
198
  * If your database engine doesn't support foreign key constraints in the
199
199
  * column definition (like MySQL 5) you need to call the table level
200
- * {@link TableBuilder.addForeignKeyConstraint} method instead.
200
+ * {@link CreateTableBuilder.addForeignKeyConstraint} method instead.
201
201
  *
202
202
  * ### Examples
203
203
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.20.1",
3
+ "version": "0.21.0",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",
@@ -48,6 +48,7 @@
48
48
  "@types/chai-subset": "^1.3.3",
49
49
  "@types/mocha": "^9.1.1",
50
50
  "@types/pg": "^8.6.5",
51
+ "@types/pg-cursor": "^2.7.0",
51
52
  "@types/sinon": "^10.0.13",
52
53
  "better-sqlite3": "^7.5.3",
53
54
  "chai": "^4.3.6",