kysely 0.19.9 → 0.19.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +56 -7
  2. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  3. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -0
  4. package/dist/cjs/dialect/mysql/mysql-driver.js +25 -0
  5. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  6. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +6 -2
  7. package/dist/cjs/dialect/postgres/postgres-driver.js +24 -2
  8. package/dist/cjs/dialect/sqlite/sqlite-driver.js +3 -0
  9. package/dist/cjs/driver/database-connection.d.ts +1 -0
  10. package/dist/cjs/driver/dummy-driver.js +3 -0
  11. package/dist/cjs/index.d.ts +4 -0
  12. package/dist/cjs/index.js +4 -0
  13. package/dist/cjs/operation-node/create-table-node.d.ts +3 -1
  14. package/dist/cjs/operation-node/create-table-node.js +2 -1
  15. package/dist/cjs/operation-node/create-type-node.d.ts +17 -0
  16. package/dist/cjs/operation-node/create-type-node.js +27 -0
  17. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  18. package/dist/cjs/operation-node/drop-type-node.d.ts +16 -0
  19. package/dist/cjs/operation-node/drop-type-node.js +25 -0
  20. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +2 -2
  21. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
  22. package/dist/cjs/operation-node/insert-query-node.js +2 -1
  23. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  24. package/dist/cjs/operation-node/operation-node-transformer.js +17 -0
  25. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  26. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  27. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  28. package/dist/cjs/operation-node/references-node.d.ts +3 -1
  29. package/dist/cjs/operation-node/references-node.js +8 -1
  30. package/dist/cjs/parser/on-commit-action-parse.d.ts +2 -0
  31. package/dist/cjs/parser/on-commit-action-parse.js +11 -0
  32. package/dist/cjs/parser/on-modify-action-parser.d.ts +2 -0
  33. package/dist/cjs/parser/on-modify-action-parser.js +11 -0
  34. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  35. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  36. package/dist/cjs/query-builder/insert-query-builder.d.ts +1 -1
  37. package/dist/cjs/query-builder/select-query-builder.d.ts +27 -0
  38. package/dist/cjs/query-builder/select-query-builder.js +34 -2
  39. package/dist/cjs/query-compiler/default-query-compiler.d.ts +5 -0
  40. package/dist/cjs/query-compiler/default-query-compiler.js +35 -2
  41. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  42. package/dist/cjs/query-creator.d.ts +27 -0
  43. package/dist/cjs/query-creator.js +33 -0
  44. package/dist/cjs/query-executor/query-executor-base.d.ts +6 -0
  45. package/dist/cjs/query-executor/query-executor-base.js +19 -0
  46. package/dist/cjs/query-executor/query-executor.d.ts +11 -0
  47. package/dist/cjs/schema/column-definition-builder.js +3 -2
  48. package/dist/cjs/schema/create-table-builder.d.ts +6 -6
  49. package/dist/cjs/schema/create-table-builder.js +8 -7
  50. package/dist/cjs/schema/create-type-builder.d.ts +28 -0
  51. package/dist/cjs/schema/create-type-builder.js +38 -0
  52. package/dist/cjs/schema/drop-type-builder.d.ts +19 -0
  53. package/dist/cjs/schema/drop-type-builder.js +31 -0
  54. package/dist/cjs/schema/foreign-key-constraint-builder.js +3 -2
  55. package/dist/cjs/schema/schema.d.ts +32 -0
  56. package/dist/cjs/schema/schema.js +46 -0
  57. package/dist/cjs/util/deferred.d.ts +7 -0
  58. package/dist/cjs/util/deferred.js +28 -0
  59. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  60. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -0
  61. package/dist/esm/dialect/mysql/mysql-driver.js +25 -0
  62. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  63. package/dist/esm/dialect/postgres/postgres-driver.d.ts +6 -2
  64. package/dist/esm/dialect/postgres/postgres-driver.js +24 -2
  65. package/dist/esm/dialect/sqlite/sqlite-driver.js +3 -0
  66. package/dist/esm/driver/database-connection.d.ts +1 -0
  67. package/dist/esm/driver/dummy-driver.js +3 -0
  68. package/dist/esm/index.d.ts +4 -0
  69. package/dist/esm/index.js +4 -0
  70. package/dist/esm/operation-node/create-table-node.d.ts +3 -1
  71. package/dist/esm/operation-node/create-table-node.js +1 -0
  72. package/dist/esm/operation-node/create-type-node.d.ts +17 -0
  73. package/dist/esm/operation-node/create-type-node.js +25 -0
  74. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  75. package/dist/esm/operation-node/drop-type-node.d.ts +16 -0
  76. package/dist/esm/operation-node/drop-type-node.js +23 -0
  77. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +2 -2
  78. package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
  79. package/dist/esm/operation-node/insert-query-node.js +2 -1
  80. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  81. package/dist/esm/operation-node/operation-node-transformer.js +17 -0
  82. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  83. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  84. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  85. package/dist/esm/operation-node/references-node.d.ts +3 -1
  86. package/dist/esm/operation-node/references-node.js +7 -0
  87. package/dist/esm/parser/on-commit-action-parse.d.ts +2 -0
  88. package/dist/esm/parser/on-commit-action-parse.js +8 -0
  89. package/dist/esm/parser/on-modify-action-parser.d.ts +2 -0
  90. package/dist/esm/parser/on-modify-action-parser.js +8 -0
  91. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  92. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  93. package/dist/esm/query-builder/insert-query-builder.d.ts +1 -1
  94. package/dist/esm/query-builder/select-query-builder.d.ts +27 -0
  95. package/dist/esm/query-builder/select-query-builder.js +34 -2
  96. package/dist/esm/query-compiler/default-query-compiler.d.ts +5 -0
  97. package/dist/esm/query-compiler/default-query-compiler.js +35 -2
  98. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  99. package/dist/esm/query-creator.d.ts +27 -0
  100. package/dist/esm/query-creator.js +33 -0
  101. package/dist/esm/query-executor/query-executor-base.d.ts +6 -0
  102. package/dist/esm/query-executor/query-executor-base.js +19 -0
  103. package/dist/esm/query-executor/query-executor.d.ts +11 -0
  104. package/dist/esm/schema/column-definition-builder.js +3 -2
  105. package/dist/esm/schema/create-table-builder.d.ts +6 -6
  106. package/dist/esm/schema/create-table-builder.js +8 -7
  107. package/dist/esm/schema/create-type-builder.d.ts +28 -0
  108. package/dist/esm/schema/create-type-builder.js +35 -0
  109. package/dist/esm/schema/drop-type-builder.d.ts +19 -0
  110. package/dist/esm/schema/drop-type-builder.js +28 -0
  111. package/dist/esm/schema/foreign-key-constraint-builder.js +3 -2
  112. package/dist/esm/schema/schema.d.ts +32 -0
  113. package/dist/esm/schema/schema.js +46 -0
  114. package/dist/esm/util/deferred.d.ts +7 -0
  115. package/dist/esm/util/deferred.js +25 -0
  116. package/package.json +5 -2
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.
@@ -32,15 +32,21 @@ You can find a more thorough introduction [here](https://www.jakso.me/blog/kysel
32
32
  # Table of contents
33
33
 
34
34
  - [Installation](#installation)
35
+ - [3rd party dialects](#3rd-party-dialects)
35
36
  - [Minimal example](#minimal-example)
36
37
  - [Generating types](#generating-types)
37
38
  - [Query examples](#query-examples)
38
- - [Recipes](https://github.com/koskimas/kysely/tree/master/recipes)
39
+ - [Select queries](#select-queries)
40
+ - [Stream select query results](#stream-select-query-results)
41
+ - [Update queries](#update-queries)
42
+ - [Insert queries](#insert-queries)
43
+ - [Delete queries](#delete-queries)
39
44
  - [Migrations](#migrations)
45
+ - [PostgreSQL migration example](#postgresql-migration-example)
46
+ - [MySQL migration example](#mysql-migration-example)
40
47
  - [Deno](#deno)
41
48
  - [Browser](#browser)
42
- - [API reference](https://koskimas.github.io/kysely/index.html)
43
- - [Changelog](https://github.com/koskimas/kysely/releases)
49
+ - [Why not just contribute to knex](#why-not-just-contribute-to-knex)
44
50
 
45
51
  # Installation
46
52
 
@@ -180,6 +186,48 @@ You can find examples of select queries in the documentation of the
180
186
  the [where method](https://koskimas.github.io/kysely/classes/SelectQueryBuilder.html#where)
181
187
  among other places.
182
188
 
189
+ ### Stream select query results
190
+
191
+ *Currently only supported by `postgres` and `mysql` dialects.*
192
+
193
+ ```ts
194
+ import { Pool } from 'pg'
195
+ // or `import * as Cursor from 'pg-cursor'` depending on your tsconfig
196
+ import Cursor from 'pg-cursor'
197
+ import {
198
+ Kysely,
199
+ PostgresDialect,
200
+ } from 'kysely'
201
+
202
+ const db = new Kysely<Database>({
203
+ // PostgresDialect requires the Cursor dependency
204
+ dialect: new PostgresDialect({
205
+ pool: new Pool({
206
+ host: 'localhost',
207
+ database: 'kysely_test'
208
+ }),
209
+ cursor: Cursor
210
+ }),
211
+
212
+ // MysqlDialect doesn't require any special configuration
213
+ })
214
+
215
+ async function demo() {
216
+ for await (const male of db.selectFrom("person")
217
+ .selectAll()
218
+ .where("person.gender", "=", "male")
219
+ .stream()) {
220
+ console.log(`Hello mr. ${male.first_name}!`)
221
+
222
+ if (male.first_name === "John") {
223
+ // After this line the db connection is released and no more
224
+ // rows are streamed from the database to the client
225
+ break;
226
+ }
227
+ }
228
+ }
229
+ ```
230
+
183
231
  ## Update queries
184
232
 
185
233
  See the [set method](https://koskimas.github.io/kysely/classes/UpdateQueryBuilder.html#set) and the
@@ -213,10 +261,11 @@ export async function down(db: Kysely<any>): Promise<void> {
213
261
  }
214
262
  ```
215
263
 
216
- The `up` function is called when you update your database schema to next version and `down`
264
+ The `up` function is called when you update your database schema to the next version and `down`
217
265
  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
266
+ `Kysely<any>`. It's important to use `Kysely<any>` and not `Kysely<YourDatabase>`.
267
+
268
+ Migrations should never depend on the current code of your app because they need to work even when the app
220
269
  changes. Migrations need to be "frozen in time".
221
270
 
222
271
  The migrations can use the [Kysely.schema](https://koskimas.github.io/kysely/classes/SchemaModule.html)
@@ -31,9 +31,19 @@ export interface MysqlPool {
31
31
  end(callback: (error: unknown) => void): void;
32
32
  }
33
33
  export interface MysqlPoolConnection {
34
+ query(sql: string, parameters: ReadonlyArray<unknown>): {
35
+ stream: <T>(options: MysqlStreamOptions) => MysqlStream<T>;
36
+ };
34
37
  query(sql: string, parameters: ReadonlyArray<unknown>, callback: (error: unknown, result: MysqlQueryResult) => void): void;
35
38
  release(): void;
36
39
  }
40
+ export interface MysqlStreamOptions {
41
+ highWaterMark?: number;
42
+ objectMode?: boolean;
43
+ }
44
+ export interface MysqlStream<T> {
45
+ [Symbol.asyncIterator](): AsyncIterableIterator<T>;
46
+ }
37
47
  export interface MysqlOkPacket {
38
48
  affectedRows: number;
39
49
  insertId: number;
@@ -42,6 +42,7 @@ declare class MysqlConnection implements DatabaseConnection {
42
42
  #private;
43
43
  constructor(rawConnection: MysqlPoolConnection);
44
44
  executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>>;
45
+ streamQuery<O>(compiledQuery: CompiledQuery, chunkSize: number): AsyncIterableIterator<QueryResult<O>>;
45
46
  [PRIVATE_RELEASE_METHOD](): void;
46
47
  }
47
48
  export {};
@@ -124,6 +124,31 @@ class MysqlConnection {
124
124
  });
125
125
  });
126
126
  }
127
+ async *streamQuery(compiledQuery, chunkSize) {
128
+ const stream = this.#rawConnection
129
+ .query(compiledQuery.sql, compiledQuery.parameters)
130
+ .stream({
131
+ objectMode: true,
132
+ });
133
+ try {
134
+ for await (const row of stream) {
135
+ yield {
136
+ rows: [row],
137
+ };
138
+ }
139
+ }
140
+ catch (ex) {
141
+ if (ex &&
142
+ typeof ex === 'object' &&
143
+ 'code' in ex &&
144
+ // @ts-ignore
145
+ ex.code === 'ERR_STREAM_PREMATURE_CLOSE') {
146
+ // Most likely because of https://github.com/mysqljs/mysql/blob/master/lib/protocol/sequences/Query.js#L220
147
+ return;
148
+ }
149
+ throw ex;
150
+ }
151
+ }
127
152
  [PRIVATE_RELEASE_METHOD]() {
128
153
  this.#rawConnection.release();
129
154
  }
@@ -1,4 +1,14 @@
1
1
  import { DatabaseConnection } from '../../driver/database-connection.js';
2
+ export declare type PostgresCursorConstructor = new <T>(sql: string, parameters: readonly unknown[]) => PostgresCursor<T>;
3
+ export declare type PostgresCursor<T> = {
4
+ state: 'initialized' | 'idle' | 'submitted' | 'busy';
5
+ read: (rowsCount: number) => Promise<T[]>;
6
+ } | {
7
+ state: 'done';
8
+ } | {
9
+ state: 'error';
10
+ _error: Error;
11
+ };
2
12
  /**
3
13
  * Config for the PostgreSQL dialect.
4
14
  */
@@ -11,6 +21,19 @@ export interface PostgresDialectConfig {
11
21
  * https://node-postgres.com/api/pool
12
22
  */
13
23
  pool: PostgresPool | (() => Promise<PostgresPool>);
24
+ /**
25
+ * https://github.com/brianc/node-postgres/tree/master/packages/pg-cursor
26
+ * ```ts
27
+ * import Cursor from 'pg-cursor'
28
+ * // or
29
+ * import * as Cursor from 'pg-cursor'
30
+ *
31
+ * new PostgresDialect({
32
+ * cursor: Cursor
33
+ * })
34
+ * ```
35
+ */
36
+ cursor?: PostgresCursorConstructor;
14
37
  /**
15
38
  * Called once for each created connection.
16
39
  */
@@ -30,6 +53,7 @@ export interface PostgresPool {
30
53
  }
31
54
  export interface PostgresPoolClient {
32
55
  query<R>(sql: string, parameters: ReadonlyArray<unknown>): Promise<PostgresQueryResult<R>>;
56
+ query<R>(cursor: PostgresCursor<R>): PostgresCursor<R>;
33
57
  release(): void;
34
58
  }
35
59
  export interface PostgresQueryResult<R> {
@@ -37,3 +61,8 @@ export interface PostgresQueryResult<R> {
37
61
  rowCount: number;
38
62
  rows: R[];
39
63
  }
64
+ export interface PostgresStreamOptions {
65
+ }
66
+ export interface PostgresStream<T> {
67
+ [Symbol.asyncIterator](): AsyncIterableIterator<T>;
68
+ }
@@ -1,7 +1,7 @@
1
1
  import { DatabaseConnection, QueryResult } from '../../driver/database-connection.js';
2
2
  import { Driver, TransactionSettings } from '../../driver/driver.js';
3
3
  import { CompiledQuery } from '../../query-compiler/compiled-query.js';
4
- import { PostgresDialectConfig, PostgresPoolClient } from './postgres-dialect-config.js';
4
+ import { PostgresCursorConstructor, PostgresDialectConfig, PostgresPoolClient } from './postgres-dialect-config.js';
5
5
  declare const PRIVATE_RELEASE_METHOD: unique symbol;
6
6
  export declare class PostgresDriver implements Driver {
7
7
  #private;
@@ -38,10 +38,14 @@ export declare class PostgresDriver implements Driver {
38
38
  */
39
39
  destroy(): Promise<void>;
40
40
  }
41
+ interface PostgresConnectionOptions {
42
+ cursor: PostgresCursorConstructor | null;
43
+ }
41
44
  declare class PostgresConnection implements DatabaseConnection {
42
45
  #private;
43
- constructor(client: PostgresPoolClient);
46
+ constructor(client: PostgresPoolClient, options: PostgresConnectionOptions);
44
47
  executeQuery<O>(compiledQuery: CompiledQuery): Promise<QueryResult<O>>;
48
+ streamQuery<O>(compiledQuery: CompiledQuery, chunkSize: number): AsyncIterableIterator<QueryResult<O>>;
45
49
  [PRIVATE_RELEASE_METHOD](): void;
46
50
  }
47
51
  export {};
@@ -21,7 +21,9 @@ class PostgresDriver {
21
21
  const client = await this.#pool.connect();
22
22
  let connection = this.#connections.get(client);
23
23
  if (!connection) {
24
- connection = new PostgresConnection(client);
24
+ connection = new PostgresConnection(client, {
25
+ cursor: this.#config.cursor ?? null,
26
+ });
25
27
  this.#connections.set(client, connection);
26
28
  // The driver must take care of calling `onCreateConnection` when a new
27
29
  // connection is created. The `pg` module doesn't provide an async hook
@@ -60,8 +62,10 @@ class PostgresDriver {
60
62
  exports.PostgresDriver = PostgresDriver;
61
63
  class PostgresConnection {
62
64
  #client;
63
- constructor(client) {
65
+ #options;
66
+ constructor(client, options) {
64
67
  this.#client = client;
68
+ this.#options = options;
65
69
  }
66
70
  async executeQuery(compiledQuery) {
67
71
  try {
@@ -82,6 +86,24 @@ class PostgresConnection {
82
86
  throw (0, stack_trace_utils_js_1.extendStackTrace)(err, new Error());
83
87
  }
84
88
  }
89
+ async *streamQuery(compiledQuery, chunkSize) {
90
+ if (!this.#options.cursor) {
91
+ throw new Error("'cursor' is not present in your postgres dialect config. It's required to make streaming work in postgres.");
92
+ }
93
+ const cursor = this.#client.query(new this.#options.cursor(compiledQuery.sql, compiledQuery.parameters));
94
+ while (true) {
95
+ if (cursor.state === 'done') {
96
+ break;
97
+ }
98
+ if (cursor.state === 'error') {
99
+ throw cursor._error;
100
+ }
101
+ const rows = await cursor.read(chunkSize);
102
+ yield {
103
+ rows,
104
+ };
105
+ }
106
+ }
85
107
  [PRIVATE_RELEASE_METHOD]() {
86
108
  this.#client.release();
87
109
  }
@@ -69,6 +69,9 @@ class SqliteConnection {
69
69
  });
70
70
  }
71
71
  }
72
+ async *streamQuery() {
73
+ throw new Error("Sqlite driver doesn't support streaming");
74
+ }
72
75
  }
73
76
  class ConnectionMutex {
74
77
  #promise;
@@ -6,6 +6,7 @@ import { CompiledQuery } from '../query-compiler/compiled-query.js';
6
6
  */
7
7
  export interface DatabaseConnection {
8
8
  executeQuery<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>>;
9
+ streamQuery<R>(compiledQuery: CompiledQuery, chunkSize?: number): AsyncIterableIterator<QueryResult<R>>;
9
10
  }
10
11
  export interface QueryResult<O> {
11
12
  /**
@@ -67,4 +67,7 @@ class DummyConnection {
67
67
  rows: [],
68
68
  };
69
69
  }
70
+ async *streamQuery() {
71
+ // Nothing to do here.
72
+ }
70
73
  }
@@ -25,7 +25,9 @@ export * from './query-compiler/default-query-compiler.js';
25
25
  export * from './query-compiler/compiled-query.js';
26
26
  export * from './schema/schema.js';
27
27
  export * from './schema/create-table-builder.js';
28
+ export * from './schema/create-type-builder.js';
28
29
  export * from './schema/drop-table-builder.js';
30
+ export * from './schema/drop-type-builder.js';
29
31
  export * from './schema/create-index-builder.js';
30
32
  export * from './schema/drop-index-builder.js';
31
33
  export * from './schema/create-schema-builder.js';
@@ -87,6 +89,7 @@ export * from './operation-node/constraint-node.js';
87
89
  export * from './operation-node/create-index-node.js';
88
90
  export * from './operation-node/create-schema-node.js';
89
91
  export * from './operation-node/create-table-node.js';
92
+ export * from './operation-node/create-type-node.js';
90
93
  export * from './operation-node/create-view-node.js';
91
94
  export * from './operation-node/data-type-node.js';
92
95
  export * from './operation-node/default-value-node.js';
@@ -96,6 +99,7 @@ export * from './operation-node/drop-constraint-node.js';
96
99
  export * from './operation-node/drop-index-node.js';
97
100
  export * from './operation-node/drop-schema-node.js';
98
101
  export * from './operation-node/drop-table-node.js';
102
+ export * from './operation-node/drop-type-node.js';
99
103
  export * from './operation-node/drop-view-node.js';
100
104
  export * from './operation-node/filter-node.js';
101
105
  export * from './operation-node/foreign-key-constraint-node.js';
package/dist/cjs/index.js CHANGED
@@ -41,7 +41,9 @@ __exportStar(require("./query-compiler/default-query-compiler.js"), exports);
41
41
  __exportStar(require("./query-compiler/compiled-query.js"), exports);
42
42
  __exportStar(require("./schema/schema.js"), exports);
43
43
  __exportStar(require("./schema/create-table-builder.js"), exports);
44
+ __exportStar(require("./schema/create-type-builder.js"), exports);
44
45
  __exportStar(require("./schema/drop-table-builder.js"), exports);
46
+ __exportStar(require("./schema/drop-type-builder.js"), exports);
45
47
  __exportStar(require("./schema/create-index-builder.js"), exports);
46
48
  __exportStar(require("./schema/drop-index-builder.js"), exports);
47
49
  __exportStar(require("./schema/create-schema-builder.js"), exports);
@@ -103,6 +105,7 @@ __exportStar(require("./operation-node/constraint-node.js"), exports);
103
105
  __exportStar(require("./operation-node/create-index-node.js"), exports);
104
106
  __exportStar(require("./operation-node/create-schema-node.js"), exports);
105
107
  __exportStar(require("./operation-node/create-table-node.js"), exports);
108
+ __exportStar(require("./operation-node/create-type-node.js"), exports);
106
109
  __exportStar(require("./operation-node/create-view-node.js"), exports);
107
110
  __exportStar(require("./operation-node/data-type-node.js"), exports);
108
111
  __exportStar(require("./operation-node/default-value-node.js"), exports);
@@ -112,6 +115,7 @@ __exportStar(require("./operation-node/drop-constraint-node.js"), exports);
112
115
  __exportStar(require("./operation-node/drop-index-node.js"), exports);
113
116
  __exportStar(require("./operation-node/drop-schema-node.js"), exports);
114
117
  __exportStar(require("./operation-node/drop-table-node.js"), exports);
118
+ __exportStar(require("./operation-node/drop-type-node.js"), exports);
115
119
  __exportStar(require("./operation-node/drop-view-node.js"), exports);
116
120
  __exportStar(require("./operation-node/filter-node.js"), exports);
117
121
  __exportStar(require("./operation-node/foreign-key-constraint-node.js"), exports);
@@ -2,7 +2,9 @@ import { OperationNode } from './operation-node.js';
2
2
  import { TableNode } from './table-node.js';
3
3
  import { ConstraintNode } from './constraint-node.js';
4
4
  import { ColumnDefinitionNode } from './column-definition-node.js';
5
- export declare type OnCommitAction = 'preserve rows' | 'delete rows' | 'drop';
5
+ import { ArrayItemType } from '../util/type-utils.js';
6
+ export declare const ON_COMMIT_ACTIONS: string[];
7
+ export declare type OnCommitAction = ArrayItemType<typeof ON_COMMIT_ACTIONS>;
6
8
  export declare type CreateTableNodeParams = Omit<CreateTableNode, 'kind' | 'table' | 'columns' | 'constraints'>;
7
9
  export interface CreateTableNode extends OperationNode {
8
10
  readonly kind: 'CreateTableNode';
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CreateTableNode = void 0;
3
+ exports.CreateTableNode = exports.ON_COMMIT_ACTIONS = void 0;
4
4
  const object_utils_js_1 = require("../util/object-utils.js");
5
+ exports.ON_COMMIT_ACTIONS = ['preserve rows', 'delete rows', 'drop'];
5
6
  /**
6
7
  * @internal
7
8
  */
@@ -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
+ });
@@ -1,5 +1,5 @@
1
1
  import { OperationNode } from './operation-node.js';
2
- export declare type ColumnDataType = 'varchar' | `varchar(${number})` | 'text' | 'integer' | 'int2' | 'int4' | 'int8' | 'bigint' | 'boolean' | 'real' | 'double precision' | 'float4' | 'float8' | 'decimal' | `decimal(${number}, ${number})` | 'numeric' | `numeric(${number}, ${number})` | 'binary' | 'date' | 'datetime' | 'time' | 'timetz' | 'timestamp' | 'timestamptz' | 'serial' | 'bigserial' | 'uuid' | 'json' | 'jsonb' | 'blob';
2
+ export declare type ColumnDataType = 'varchar' | `varchar(${number})` | 'text' | 'integer' | 'int2' | 'int4' | 'int8' | 'bigint' | 'boolean' | 'real' | 'double precision' | 'float4' | 'float8' | 'decimal' | `decimal(${number}, ${number})` | 'numeric' | `numeric(${number}, ${number})` | 'binary' | 'date' | 'datetime' | `datetime(${number})` | 'time' | `time(${number})` | 'timetz' | `timetz(${number})` | 'timestamp' | `timestamp(${number})` | 'timestamptz' | `timestamptz(${number})` | 'serial' | 'bigserial' | 'uuid' | 'json' | 'jsonb' | 'blob';
3
3
  export declare type DataTypeParams = Omit<DataTypeNode, 'kind' | 'dataType'>;
4
4
  export interface DataTypeNode extends OperationNode {
5
5
  readonly kind: 'DataTypeNode';
@@ -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
+ });
@@ -20,8 +20,8 @@ export declare const ForeignKeyConstraintNode: Readonly<{
20
20
  create(sourceColumns: ReadonlyArray<ColumnNode>, targetTable: TableNode, targetColumns: ReadonlyArray<ColumnNode>, constraintName?: string): ForeignKeyConstraintNode;
21
21
  cloneWith(node: ForeignKeyConstraintNode, props: ForeignKeyConstraintNodeProps): Readonly<{
22
22
  name?: IdentifierNode | undefined;
23
- onDelete?: OnModifyForeignAction | undefined;
24
- onUpdate?: OnModifyForeignAction | undefined;
23
+ onDelete?: "no action" | "restrict" | "cascade" | "set null" | "set default" | undefined;
24
+ onUpdate?: "no action" | "restrict" | "cascade" | "set null" | "set default" | undefined;
25
25
  kind: 'ForeignKeyConstraintNode';
26
26
  columns: ReadonlyArray<ColumnNode>;
27
27
  references: ReferencesNode;
@@ -19,12 +19,13 @@ export interface InsertQueryNode extends OperationNode {
19
19
  readonly onDuplicateKey?: OnDuplicateKeyNode;
20
20
  readonly with?: WithNode;
21
21
  readonly ignore?: boolean;
22
+ readonly replace?: boolean;
22
23
  }
23
24
  /**
24
25
  * @internal
25
26
  */
26
27
  export declare const InsertQueryNode: Readonly<{
27
28
  is(node: OperationNode): node is InsertQueryNode;
28
- create(into: TableNode, withNode?: WithNode): InsertQueryNode;
29
+ create(into: TableNode, withNode?: WithNode, replace?: boolean): InsertQueryNode;
29
30
  cloneWith(insertQuery: InsertQueryNode, props: InsertQueryNodeProps): InsertQueryNode;
30
31
  }>;
@@ -9,11 +9,12 @@ exports.InsertQueryNode = (0, object_utils_js_1.freeze)({
9
9
  is(node) {
10
10
  return node.kind === 'InsertQueryNode';
11
11
  },
12
- create(into, withNode) {
12
+ create(into, withNode, replace) {
13
13
  return (0, object_utils_js_1.freeze)({
14
14
  kind: 'InsertQueryNode',
15
15
  into,
16
16
  ...(withNode && { with: withNode }),
17
+ replace,
17
18
  });
18
19
  },
19
20
  cloneWith(insertQuery, props) {
@@ -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) {
@@ -242,6 +244,7 @@ class OperationNodeTransformer {
242
244
  onDuplicateKey: this.transformNode(node.onDuplicateKey),
243
245
  with: this.transformNode(node.with),
244
246
  ignore: node.ignore,
247
+ replace: node.replace,
245
248
  });
246
249
  }
247
250
  transformValues(node) {
@@ -603,6 +606,20 @@ class OperationNodeTransformer {
603
606
  rawModifier: this.transformNode(node.rawModifier),
604
607
  });
605
608
  }
609
+ transformCreateType(node) {
610
+ return (0, require_all_props_js_1.requireAllProps)({
611
+ kind: 'CreateTypeNode',
612
+ name: this.transformNode(node.name),
613
+ enum: this.transformNode(node.enum),
614
+ });
615
+ }
616
+ transformDropType(node) {
617
+ return (0, require_all_props_js_1.requireAllProps)({
618
+ kind: 'DropTypeNode',
619
+ name: this.transformNode(node.name),
620
+ ifExists: node.ifExists,
621
+ });
622
+ }
606
623
  transformDataType(node) {
607
624
  // An Object.freezed leaf node. No need to clone.
608
625
  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,7 +1,9 @@
1
1
  import { OperationNode } from './operation-node.js';
2
2
  import { ColumnNode } from './column-node.js';
3
3
  import { TableNode } from './table-node.js';
4
- export declare type OnModifyForeignAction = 'no action' | 'restrict' | 'cascade' | 'set null' | 'set default';
4
+ import { ArrayItemType } from '../util/type-utils.js';
5
+ export declare const ON_MODIFY_FOREIGN_ACTIONS: readonly ["no action", "restrict", "cascade", "set null", "set default"];
6
+ export declare type OnModifyForeignAction = ArrayItemType<typeof ON_MODIFY_FOREIGN_ACTIONS>;
5
7
  export interface ReferencesNode extends OperationNode {
6
8
  readonly kind: 'ReferencesNode';
7
9
  readonly table: TableNode;