kysely 0.19.8 → 0.19.11

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 (106) hide show
  1. package/README.md +67 -13
  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-type-node.d.ts +17 -0
  14. package/dist/cjs/operation-node/create-type-node.js +27 -0
  15. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  16. package/dist/cjs/operation-node/drop-type-node.d.ts +16 -0
  17. package/dist/cjs/operation-node/drop-type-node.js +25 -0
  18. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
  19. package/dist/cjs/operation-node/insert-query-node.js +2 -1
  20. package/dist/cjs/operation-node/operation-node-transformer.d.ts +9 -2
  21. package/dist/cjs/operation-node/operation-node-transformer.js +148 -122
  22. package/dist/cjs/operation-node/operation-node-visitor.d.ts +6 -0
  23. package/dist/cjs/operation-node/operation-node-visitor.js +3 -0
  24. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  25. package/dist/cjs/operation-node/select-modifier-node.d.ts +16 -0
  26. package/dist/cjs/operation-node/select-modifier-node.js +24 -0
  27. package/dist/cjs/operation-node/select-query-node.d.ts +5 -5
  28. package/dist/cjs/operation-node/select-query-node.js +11 -9
  29. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  30. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  31. package/dist/cjs/query-builder/insert-query-builder.d.ts +1 -1
  32. package/dist/cjs/query-builder/select-query-builder.d.ts +77 -6
  33. package/dist/cjs/query-builder/select-query-builder.js +101 -14
  34. package/dist/cjs/query-compiler/default-query-compiler.d.ts +6 -0
  35. package/dist/cjs/query-compiler/default-query-compiler.js +30 -8
  36. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  37. package/dist/cjs/query-creator.d.ts +27 -0
  38. package/dist/cjs/query-creator.js +33 -0
  39. package/dist/cjs/query-executor/query-executor-base.d.ts +6 -0
  40. package/dist/cjs/query-executor/query-executor-base.js +19 -0
  41. package/dist/cjs/query-executor/query-executor.d.ts +11 -0
  42. package/dist/cjs/schema/create-table-builder.d.ts +6 -6
  43. package/dist/cjs/schema/create-table-builder.js +6 -6
  44. package/dist/cjs/schema/create-type-builder.d.ts +28 -0
  45. package/dist/cjs/schema/create-type-builder.js +38 -0
  46. package/dist/cjs/schema/drop-type-builder.d.ts +19 -0
  47. package/dist/cjs/schema/drop-type-builder.js +31 -0
  48. package/dist/cjs/schema/schema.d.ts +32 -0
  49. package/dist/cjs/schema/schema.js +46 -0
  50. package/dist/cjs/util/deferred.d.ts +7 -0
  51. package/dist/cjs/util/deferred.js +28 -0
  52. package/dist/cjs/util/require-all-props.d.ts +43 -0
  53. package/dist/cjs/util/require-all-props.js +40 -0
  54. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +10 -0
  55. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -0
  56. package/dist/esm/dialect/mysql/mysql-driver.js +25 -0
  57. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +29 -0
  58. package/dist/esm/dialect/postgres/postgres-driver.d.ts +6 -2
  59. package/dist/esm/dialect/postgres/postgres-driver.js +24 -2
  60. package/dist/esm/dialect/sqlite/sqlite-driver.js +3 -0
  61. package/dist/esm/driver/database-connection.d.ts +1 -0
  62. package/dist/esm/driver/dummy-driver.js +3 -0
  63. package/dist/esm/index.d.ts +4 -0
  64. package/dist/esm/index.js +4 -0
  65. package/dist/esm/operation-node/create-type-node.d.ts +17 -0
  66. package/dist/esm/operation-node/create-type-node.js +25 -0
  67. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  68. package/dist/esm/operation-node/drop-type-node.d.ts +16 -0
  69. package/dist/esm/operation-node/drop-type-node.js +23 -0
  70. package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
  71. package/dist/esm/operation-node/insert-query-node.js +2 -1
  72. package/dist/esm/operation-node/operation-node-transformer.d.ts +9 -2
  73. package/dist/esm/operation-node/operation-node-transformer.js +148 -122
  74. package/dist/esm/operation-node/operation-node-visitor.d.ts +6 -0
  75. package/dist/esm/operation-node/operation-node-visitor.js +3 -0
  76. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  77. package/dist/esm/operation-node/select-modifier-node.d.ts +16 -0
  78. package/dist/esm/operation-node/select-modifier-node.js +22 -0
  79. package/dist/esm/operation-node/select-query-node.d.ts +5 -5
  80. package/dist/esm/operation-node/select-query-node.js +11 -9
  81. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  82. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  83. package/dist/esm/query-builder/insert-query-builder.d.ts +1 -1
  84. package/dist/esm/query-builder/select-query-builder.d.ts +77 -6
  85. package/dist/esm/query-builder/select-query-builder.js +101 -14
  86. package/dist/esm/query-compiler/default-query-compiler.d.ts +6 -0
  87. package/dist/esm/query-compiler/default-query-compiler.js +30 -8
  88. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  89. package/dist/esm/query-creator.d.ts +27 -0
  90. package/dist/esm/query-creator.js +33 -0
  91. package/dist/esm/query-executor/query-executor-base.d.ts +6 -0
  92. package/dist/esm/query-executor/query-executor-base.js +19 -0
  93. package/dist/esm/query-executor/query-executor.d.ts +11 -0
  94. package/dist/esm/schema/create-table-builder.d.ts +6 -6
  95. package/dist/esm/schema/create-table-builder.js +6 -6
  96. package/dist/esm/schema/create-type-builder.d.ts +28 -0
  97. package/dist/esm/schema/create-type-builder.js +35 -0
  98. package/dist/esm/schema/drop-type-builder.d.ts +19 -0
  99. package/dist/esm/schema/drop-type-builder.js +28 -0
  100. package/dist/esm/schema/schema.d.ts +32 -0
  101. package/dist/esm/schema/schema.js +46 -0
  102. package/dist/esm/util/deferred.d.ts +7 -0
  103. package/dist/esm/util/deferred.js +25 -0
  104. package/dist/esm/util/require-all-props.d.ts +43 -0
  105. package/dist/esm/util/require-all-props.js +37 -0
  106. package/package.json +5 -2
package/README.md CHANGED
@@ -5,21 +5,20 @@
5
5
 
6
6
  # [Kysely](https://koskimas.github.io/kysely/index.html)
7
7
 
8
- A type-safe and autocompletion-friendly typescript SQL query builder. Inspired by [knex](http://knexjs.org/).
9
- Mainly developed for [node.js](https://nodejs.org/en/) but also runs on [deno](https://deno.land/) and
10
- in the browser.
8
+ Kysely (pronounce “Key-Seh-Lee”) is a type-safe and autocompletion-friendly typescript SQL query builder. Inspired by
9
+ [knex](http://knexjs.org/). Mainly developed for [node.js](https://nodejs.org/en/) but also runs on [deno](https://deno.land/)
10
+ and in the browser.
11
11
 
12
12
  ![](https://github.com/koskimas/kysely/blob/master/assets/demo.gif)
13
13
 
14
14
  Kysely makes sure you only refer to tables and columns that are visible to the part of the query
15
- you are writing. The result type only has the selected columns with correct types and aliases. As an
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
- much anything you can think of. Typescript is always there for you offering completions and making sure
22
- you build a valid query.
21
+ much anything you can think of.
23
22
 
24
23
  Of course there are cases where things cannot be typed at compile time, and Kysely offers escape
25
24
  hatches for these situations. See the [sql template tag](https://koskimas.github.io/kysely/modules.html#sql)
@@ -33,14 +32,21 @@ You can find a more thorough introduction [here](https://www.jakso.me/blog/kysel
33
32
  # Table of contents
34
33
 
35
34
  - [Installation](#installation)
35
+ - [3rd party dialects](#3rd-party-dialects)
36
36
  - [Minimal example](#minimal-example)
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
 
@@ -166,6 +172,11 @@ type InsertablePerson = Insertable<PersonTable>
166
172
  type UpdateablePerson = Updateable<PersonTable>
167
173
  ```
168
174
 
175
+ # Generating types
176
+
177
+ If you want to generate the table types automatically from the database schema please
178
+ check out [this awesome project](https://github.com/RobinBlomberg/kysely-codegen).
179
+
169
180
  # Query examples
170
181
 
171
182
  ## Select queries
@@ -175,6 +186,48 @@ You can find examples of select queries in the documentation of the
175
186
  the [where method](https://koskimas.github.io/kysely/classes/SelectQueryBuilder.html#where)
176
187
  among other places.
177
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
+
178
231
  ## Update queries
179
232
 
180
233
  See the [set method](https://koskimas.github.io/kysely/classes/UpdateQueryBuilder.html#set) and the
@@ -208,10 +261,11 @@ export async function down(db: Kysely<any>): Promise<void> {
208
261
  }
209
262
  ```
210
263
 
211
- 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`
212
265
  when you go back to previous version. The only argument for the functions is an instance of
213
- `Kysely<any>`. It's important to use `Kysely<any>` and not `Kysely<YourDatabase>`. Migrations
214
- 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
215
269
  changes. Migrations need to be "frozen in time".
216
270
 
217
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);
@@ -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
+ });
@@ -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) {
@@ -65,6 +65,9 @@ import { GeneratedNode } from './generated-node.js';
65
65
  import { DefaultValueNode } from './default-value-node.js';
66
66
  import { OnNode } from './on-node.js';
67
67
  import { ValuesNode } from './values-node.js';
68
+ import { SelectModifierNode } from './select-modifier-node.js';
69
+ import { CreateTypeNode } from './create-type-node.js';
70
+ import { DropTypeNode } from './drop-type-node.js';
68
71
  /**
69
72
  * Transforms an operation node tree into another one.
70
73
  *
@@ -97,8 +100,9 @@ import { ValuesNode } from './values-node.js';
97
100
  export declare class OperationNodeTransformer {
98
101
  #private;
99
102
  protected readonly nodeStack: OperationNode[];
100
- readonly transformNode: <T extends OperationNode | undefined>(node: OperationNode | undefined) => T;
101
- protected transformNodeList<T extends OperationNode>(list: readonly T[] | undefined): readonly T[];
103
+ readonly transformNode: <T extends OperationNode | undefined, U extends T | undefined = T>(node: U) => T;
104
+ protected transformNodeList<T extends OperationNode, U extends T = T>(list: readonly U[]): readonly T[];
105
+ protected transformNodeList<T extends OperationNode, U extends T = T>(list: readonly U[] | undefined): readonly T[] | undefined;
102
106
  protected transformSelectQuery(node: SelectQueryNode): SelectQueryNode;
103
107
  protected transformSelection(node: SelectionNode): SelectionNode;
104
108
  protected transformColumn(node: ColumnNode): ColumnNode;
@@ -159,6 +163,9 @@ export declare class OperationNodeTransformer {
159
163
  protected transformGenerated(node: GeneratedNode): GeneratedNode;
160
164
  protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
161
165
  protected transformOn(node: OnNode): OnNode;
166
+ protected transformSelectModifier(node: SelectModifierNode): SelectModifierNode;
167
+ protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
168
+ protected transformDropType(node: DropTypeNode): DropTypeNode;
162
169
  protected transformDataType(node: DataTypeNode): DataTypeNode;
163
170
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
164
171
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;