kysely 0.27.1 → 0.27.3
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.
- package/dist/cjs/dialect/database-introspector.d.ts +1 -0
- package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +2 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/cjs/driver/database-connection.d.ts +1 -1
- package/dist/cjs/expression/expression-builder.d.ts +30 -4
- package/dist/cjs/expression/expression-builder.js +5 -0
- package/dist/cjs/index.d.ts +7 -1
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/migration/migrator.d.ts +19 -2
- package/dist/cjs/migration/migrator.js +77 -43
- package/dist/cjs/operation-node/add-index-node.js +1 -1
- package/dist/cjs/operation-node/cast-node.d.ts +13 -0
- package/dist/cjs/operation-node/cast-node.js +19 -0
- package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
- package/dist/cjs/operation-node/data-type-node.js +55 -1
- package/dist/cjs/operation-node/delete-query-node.d.ts +4 -0
- package/dist/cjs/operation-node/delete-query-node.js +12 -0
- package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
- package/dist/cjs/operation-node/fetch-node.js +19 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +4 -1
- package/dist/cjs/operation-node/insert-query-node.js +5 -0
- package/dist/cjs/operation-node/join-node.d.ts +1 -1
- package/dist/cjs/operation-node/matched-node.d.ts +13 -0
- package/dist/cjs/operation-node/matched-node.js +19 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +25 -0
- package/dist/cjs/operation-node/merge-query-node.js +45 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +50 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +5 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/query-node.d.ts +10 -3
- package/dist/cjs/operation-node/query-node.js +15 -1
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -0
- package/dist/cjs/operation-node/select-query-node.js +6 -0
- package/dist/cjs/operation-node/top-node.d.ts +14 -0
- package/dist/cjs/operation-node/top-node.js +19 -0
- package/dist/cjs/operation-node/update-query-node.d.ts +7 -1
- package/dist/cjs/operation-node/update-query-node.js +11 -0
- package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.js +2 -2
- package/dist/cjs/parser/data-type-parser.js +7 -3
- package/dist/cjs/parser/fetch-parser.d.ts +2 -0
- package/dist/cjs/parser/fetch-parser.js +18 -0
- package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
- package/dist/cjs/parser/merge-parser.d.ts +9 -0
- package/dist/cjs/parser/merge-parser.js +32 -0
- package/dist/cjs/parser/table-parser.d.ts +4 -3
- package/dist/cjs/parser/top-parser.d.ts +2 -0
- package/dist/cjs/parser/top-parser.js +20 -0
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +99 -0
- package/dist/cjs/query-builder/delete-query-builder.js +120 -0
- package/dist/cjs/query-builder/insert-query-builder.d.ts +73 -3
- package/dist/cjs/query-builder/insert-query-builder.js +242 -0
- package/dist/cjs/query-builder/merge-query-builder.d.ts +557 -0
- package/dist/cjs/query-builder/merge-query-builder.js +518 -0
- package/dist/cjs/query-builder/merge-result.d.ts +4 -0
- package/dist/cjs/query-builder/merge-result.js +10 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +102 -7
- package/dist/cjs/query-builder/select-query-builder.js +14 -0
- package/dist/cjs/query-builder/update-query-builder.d.ts +82 -3
- package/dist/cjs/query-builder/update-query-builder.js +98 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +94 -10
- package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
- package/dist/cjs/query-creator.d.ts +40 -2
- package/dist/cjs/query-creator.js +9 -0
- package/dist/cjs/schema/alter-table-add-index-builder.js +6 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +13 -1
- package/dist/cjs/schema/column-definition-builder.js +15 -1
- package/dist/cjs/util/infer-result.d.ts +2 -1
- package/dist/cjs/util/type-utils.d.ts +3 -2
- package/dist/esm/dialect/database-introspector.d.ts +1 -0
- package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +2 -0
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/esm/driver/database-connection.d.ts +1 -1
- package/dist/esm/expression/expression-builder.d.ts +30 -4
- package/dist/esm/expression/expression-builder.js +5 -0
- package/dist/esm/index.d.ts +7 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/migration/migrator.d.ts +19 -2
- package/dist/esm/migration/migrator.js +76 -42
- package/dist/esm/operation-node/add-index-node.js +1 -1
- package/dist/esm/operation-node/cast-node.d.ts +13 -0
- package/dist/esm/operation-node/cast-node.js +17 -0
- package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
- package/dist/esm/operation-node/data-type-node.d.ts +5 -1
- package/dist/esm/operation-node/data-type-node.js +53 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +4 -0
- package/dist/esm/operation-node/delete-query-node.js +12 -0
- package/dist/esm/operation-node/fetch-node.d.ts +15 -0
- package/dist/esm/operation-node/fetch-node.js +17 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +4 -1
- package/dist/esm/operation-node/insert-query-node.js +5 -0
- package/dist/esm/operation-node/join-node.d.ts +1 -1
- package/dist/esm/operation-node/matched-node.d.ts +13 -0
- package/dist/esm/operation-node/matched-node.js +17 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +25 -0
- package/dist/esm/operation-node/merge-query-node.js +43 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -0
- package/dist/esm/operation-node/operation-node-transformer.js +50 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -0
- package/dist/esm/operation-node/operation-node-visitor.js +5 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/query-node.d.ts +10 -3
- package/dist/esm/operation-node/query-node.js +15 -1
- package/dist/esm/operation-node/select-query-node.d.ts +5 -0
- package/dist/esm/operation-node/select-query-node.js +6 -0
- package/dist/esm/operation-node/top-node.d.ts +14 -0
- package/dist/esm/operation-node/top-node.js +17 -0
- package/dist/esm/operation-node/update-query-node.d.ts +7 -1
- package/dist/esm/operation-node/update-query-node.js +11 -0
- package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
- package/dist/esm/parser/binary-operation-parser.js +2 -2
- package/dist/esm/parser/data-type-parser.js +8 -4
- package/dist/esm/parser/fetch-parser.d.ts +2 -0
- package/dist/esm/parser/fetch-parser.js +15 -0
- package/dist/esm/parser/insert-values-parser.d.ts +3 -3
- package/dist/esm/parser/merge-parser.d.ts +9 -0
- package/dist/esm/parser/merge-parser.js +28 -0
- package/dist/esm/parser/table-parser.d.ts +4 -3
- package/dist/esm/parser/top-parser.d.ts +2 -0
- package/dist/esm/parser/top-parser.js +17 -0
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +99 -0
- package/dist/esm/query-builder/delete-query-builder.js +120 -0
- package/dist/esm/query-builder/insert-query-builder.d.ts +73 -3
- package/dist/esm/query-builder/insert-query-builder.js +242 -0
- package/dist/esm/query-builder/merge-query-builder.d.ts +557 -0
- package/dist/esm/query-builder/merge-query-builder.js +512 -0
- package/dist/esm/query-builder/merge-result.d.ts +4 -0
- package/dist/esm/query-builder/merge-result.js +7 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +102 -7
- package/dist/esm/query-builder/select-query-builder.js +14 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +82 -3
- package/dist/esm/query-builder/update-query-builder.js +98 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -0
- package/dist/esm/query-compiler/default-query-compiler.js +94 -10
- package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
- package/dist/esm/query-creator.d.ts +40 -2
- package/dist/esm/query-creator.js +10 -1
- package/dist/esm/schema/alter-table-add-index-builder.js +7 -3
- package/dist/esm/schema/column-definition-builder.d.ts +13 -1
- package/dist/esm/schema/column-definition-builder.js +15 -1
- package/dist/esm/util/infer-result.d.ts +2 -1
- package/dist/esm/util/type-utils.d.ts +3 -2
- package/package.json +22 -21
|
@@ -4,6 +4,7 @@ import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
|
|
|
4
4
|
import { freeze, getLast } from '../util/object-utils.js';
|
|
5
5
|
export const DEFAULT_MIGRATION_TABLE = 'kysely_migration';
|
|
6
6
|
export const DEFAULT_MIGRATION_LOCK_TABLE = 'kysely_migration_lock';
|
|
7
|
+
export const DEFAULT_ALLOW_UNORDERED_MIGRATIONS = false;
|
|
7
8
|
export const MIGRATION_LOCK_ID = 'migration_lock';
|
|
8
9
|
export const NO_MIGRATIONS = freeze({ __noMigrations__: true });
|
|
9
10
|
/**
|
|
@@ -70,7 +71,7 @@ export class Migrator {
|
|
|
70
71
|
* This method goes through all possible migrations provided by the provider and runs the
|
|
71
72
|
* ones whose names come alphabetically after the last migration that has been run. If the
|
|
72
73
|
* list of executed migrations doesn't match the beginning of the list of possible migrations
|
|
73
|
-
* an error is
|
|
74
|
+
* an error is returned.
|
|
74
75
|
*
|
|
75
76
|
* ### Examples
|
|
76
77
|
*
|
|
@@ -107,7 +108,7 @@ export class Migrator {
|
|
|
107
108
|
* ```
|
|
108
109
|
*/
|
|
109
110
|
async migrateToLatest() {
|
|
110
|
-
return this.#migrate(({
|
|
111
|
+
return this.#migrate(() => ({ direction: 'Up', step: Infinity }));
|
|
111
112
|
}
|
|
112
113
|
/**
|
|
113
114
|
* Migrate up/down to a specific migration.
|
|
@@ -133,15 +134,27 @@ export class Migrator {
|
|
|
133
134
|
* ```
|
|
134
135
|
*/
|
|
135
136
|
async migrateTo(targetMigrationName) {
|
|
136
|
-
return this.#migrate(({ migrations }) => {
|
|
137
|
+
return this.#migrate(({ migrations, executedMigrations, pendingMigrations, }) => {
|
|
137
138
|
if (targetMigrationName === NO_MIGRATIONS) {
|
|
138
|
-
return
|
|
139
|
+
return { direction: 'Down', step: Infinity };
|
|
139
140
|
}
|
|
140
|
-
|
|
141
|
-
if (index === -1) {
|
|
141
|
+
if (!migrations.find((m) => m.name === targetMigrationName)) {
|
|
142
142
|
throw new Error(`migration "${targetMigrationName}" doesn't exist`);
|
|
143
143
|
}
|
|
144
|
-
|
|
144
|
+
const executedIndex = executedMigrations.indexOf(targetMigrationName);
|
|
145
|
+
const pendingIndex = pendingMigrations.findIndex((m) => m.name === targetMigrationName);
|
|
146
|
+
if (executedIndex !== -1) {
|
|
147
|
+
return {
|
|
148
|
+
direction: 'Down',
|
|
149
|
+
step: executedMigrations.length - executedIndex - 1,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
else if (pendingIndex !== -1) {
|
|
153
|
+
return { direction: 'Up', step: pendingIndex + 1 };
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
throw new Error(`migration "${targetMigrationName}" isn't executed or pending`);
|
|
157
|
+
}
|
|
145
158
|
});
|
|
146
159
|
}
|
|
147
160
|
/**
|
|
@@ -159,7 +172,7 @@ export class Migrator {
|
|
|
159
172
|
* ```
|
|
160
173
|
*/
|
|
161
174
|
async migrateUp() {
|
|
162
|
-
return this.#migrate((
|
|
175
|
+
return this.#migrate(() => ({ direction: 'Up', step: 1 }));
|
|
163
176
|
}
|
|
164
177
|
/**
|
|
165
178
|
* Migrate one step down.
|
|
@@ -176,12 +189,12 @@ export class Migrator {
|
|
|
176
189
|
* ```
|
|
177
190
|
*/
|
|
178
191
|
async migrateDown() {
|
|
179
|
-
return this.#migrate((
|
|
192
|
+
return this.#migrate(() => ({ direction: 'Down', step: 1 }));
|
|
180
193
|
}
|
|
181
|
-
async #migrate(
|
|
194
|
+
async #migrate(getMigrationDirectionAndStep) {
|
|
182
195
|
try {
|
|
183
196
|
await this.#ensureMigrationTablesExists();
|
|
184
|
-
return await this.#runMigrations(
|
|
197
|
+
return await this.#runMigrations(getMigrationDirectionAndStep);
|
|
185
198
|
}
|
|
186
199
|
catch (error) {
|
|
187
200
|
if (error instanceof MigrationResultSetError) {
|
|
@@ -199,6 +212,9 @@ export class Migrator {
|
|
|
199
212
|
get #migrationLockTable() {
|
|
200
213
|
return this.#props.migrationLockTableName ?? DEFAULT_MIGRATION_LOCK_TABLE;
|
|
201
214
|
}
|
|
215
|
+
get #allowUnorderedMigrations() {
|
|
216
|
+
return (this.#props.allowUnorderedMigrations ?? DEFAULT_ALLOW_UNORDERED_MIGRATIONS);
|
|
217
|
+
}
|
|
202
218
|
get #schemaPlugin() {
|
|
203
219
|
if (this.#migrationTableSchema) {
|
|
204
220
|
return new WithSchemaPlugin(this.#migrationTableSchema);
|
|
@@ -309,7 +325,7 @@ export class Migrator {
|
|
|
309
325
|
.executeTakeFirst();
|
|
310
326
|
return !!lockRow;
|
|
311
327
|
}
|
|
312
|
-
async #runMigrations(
|
|
328
|
+
async #runMigrations(getMigrationDirectionAndStep) {
|
|
313
329
|
const adapter = this.#props.db.getExecutor().adapter;
|
|
314
330
|
const lockOptions = freeze({
|
|
315
331
|
lockTable: this.#props.migrationLockTableName ?? DEFAULT_MIGRATION_LOCK_TABLE,
|
|
@@ -323,15 +339,15 @@ export class Migrator {
|
|
|
323
339
|
if (state.migrations.length === 0) {
|
|
324
340
|
return { results: [] };
|
|
325
341
|
}
|
|
326
|
-
const
|
|
327
|
-
if (
|
|
342
|
+
const { direction, step } = getMigrationDirectionAndStep(state);
|
|
343
|
+
if (step <= 0) {
|
|
328
344
|
return { results: [] };
|
|
329
345
|
}
|
|
330
|
-
if (
|
|
331
|
-
return await this.#migrateDown(db, state,
|
|
346
|
+
if (direction === 'Down') {
|
|
347
|
+
return await this.#migrateDown(db, state, step);
|
|
332
348
|
}
|
|
333
|
-
else if (
|
|
334
|
-
return await this.#migrateUp(db, state,
|
|
349
|
+
else if (direction === 'Up') {
|
|
350
|
+
return await this.#migrateUp(db, state, step);
|
|
335
351
|
}
|
|
336
352
|
return { results: [] };
|
|
337
353
|
}
|
|
@@ -349,10 +365,21 @@ export class Migrator {
|
|
|
349
365
|
async #getState(db) {
|
|
350
366
|
const migrations = await this.#resolveMigrations();
|
|
351
367
|
const executedMigrations = await this.#getExecutedMigrations(db);
|
|
352
|
-
this.#
|
|
368
|
+
this.#ensureNoMissingMigrations(migrations, executedMigrations);
|
|
369
|
+
if (!this.#allowUnorderedMigrations) {
|
|
370
|
+
this.#ensureMigrationsInOrder(migrations, executedMigrations);
|
|
371
|
+
}
|
|
372
|
+
const pendingMigrations = this.#getPendingMigrations(migrations, executedMigrations);
|
|
353
373
|
return freeze({
|
|
354
374
|
migrations,
|
|
355
|
-
|
|
375
|
+
executedMigrations,
|
|
376
|
+
lastMigration: getLast(executedMigrations),
|
|
377
|
+
pendingMigrations,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
#getPendingMigrations(migrations, executedMigrations) {
|
|
381
|
+
return migrations.filter((migration) => {
|
|
382
|
+
return !executedMigrations.includes(migration.name);
|
|
356
383
|
});
|
|
357
384
|
}
|
|
358
385
|
async #resolveMigrations() {
|
|
@@ -369,36 +396,43 @@ export class Migrator {
|
|
|
369
396
|
.withPlugin(this.#schemaPlugin)
|
|
370
397
|
.selectFrom(this.#migrationTable)
|
|
371
398
|
.select('name')
|
|
372
|
-
.orderBy('name')
|
|
399
|
+
.orderBy(['timestamp', 'name'])
|
|
373
400
|
.execute();
|
|
374
401
|
return executedMigrations.map((it) => it.name);
|
|
375
402
|
}
|
|
376
|
-
#
|
|
403
|
+
#ensureNoMissingMigrations(migrations, executedMigrations) {
|
|
404
|
+
// Ensure all executed migrations exist in the `migrations` list.
|
|
377
405
|
for (const executed of executedMigrations) {
|
|
378
406
|
if (!migrations.some((it) => it.name === executed)) {
|
|
379
407
|
throw new Error(`corrupted migrations: previously executed migration ${executed} is missing`);
|
|
380
408
|
}
|
|
381
409
|
}
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
// ones in the migration list.
|
|
410
|
+
}
|
|
411
|
+
#ensureMigrationsInOrder(migrations, executedMigrations) {
|
|
412
|
+
// Ensure the executed migrations are the first ones in the migration list.
|
|
385
413
|
for (let i = 0; i < executedMigrations.length; ++i) {
|
|
386
414
|
if (migrations[i].name !== executedMigrations[i]) {
|
|
387
415
|
throw new Error(`corrupted migrations: expected previously executed migration ${executedMigrations[i]} to be at index ${i} but ${migrations[i].name} was found in its place. New migrations must always have a name that comes alphabetically after the last executed migration.`);
|
|
388
416
|
}
|
|
389
417
|
}
|
|
390
418
|
}
|
|
391
|
-
async #migrateDown(db, state,
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
419
|
+
async #migrateDown(db, state, step) {
|
|
420
|
+
const migrationsToRollback = state.executedMigrations
|
|
421
|
+
.slice()
|
|
422
|
+
.reverse()
|
|
423
|
+
.slice(0, step)
|
|
424
|
+
.map((name) => {
|
|
425
|
+
return state.migrations.find((it) => it.name === name);
|
|
426
|
+
});
|
|
427
|
+
const results = migrationsToRollback.map((migration) => {
|
|
428
|
+
return {
|
|
429
|
+
migrationName: migration.name,
|
|
396
430
|
direction: 'Down',
|
|
397
431
|
status: 'NotExecuted',
|
|
398
|
-
}
|
|
399
|
-
}
|
|
432
|
+
};
|
|
433
|
+
});
|
|
400
434
|
for (let i = 0; i < results.length; ++i) {
|
|
401
|
-
const migration =
|
|
435
|
+
const migration = migrationsToRollback[i];
|
|
402
436
|
try {
|
|
403
437
|
if (migration.down) {
|
|
404
438
|
await migration.down(db);
|
|
@@ -428,17 +462,17 @@ export class Migrator {
|
|
|
428
462
|
}
|
|
429
463
|
return { results };
|
|
430
464
|
}
|
|
431
|
-
async #migrateUp(db, state,
|
|
432
|
-
const
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
migrationName:
|
|
465
|
+
async #migrateUp(db, state, step) {
|
|
466
|
+
const migrationsToRun = state.pendingMigrations.slice(0, step);
|
|
467
|
+
const results = migrationsToRun.map((migration) => {
|
|
468
|
+
return {
|
|
469
|
+
migrationName: migration.name,
|
|
436
470
|
direction: 'Up',
|
|
437
471
|
status: 'NotExecuted',
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
for (let i = 0; i < results.length; ++
|
|
441
|
-
const migration = state.
|
|
472
|
+
};
|
|
473
|
+
});
|
|
474
|
+
for (let i = 0; i < results.length; i++) {
|
|
475
|
+
const migration = state.pendingMigrations[i];
|
|
442
476
|
try {
|
|
443
477
|
await migration.up(db);
|
|
444
478
|
await db
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
export interface CastNode extends OperationNode {
|
|
3
|
+
readonly kind: 'CastNode';
|
|
4
|
+
readonly expression: OperationNode;
|
|
5
|
+
readonly dataType: OperationNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare const CastNode: Readonly<{
|
|
11
|
+
is(node: OperationNode): node is CastNode;
|
|
12
|
+
create(expression: OperationNode, dataType: OperationNode): CastNode;
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="./cast-node.d.ts" />
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const CastNode = freeze({
|
|
7
|
+
is(node) {
|
|
8
|
+
return node.kind === 'CastNode';
|
|
9
|
+
},
|
|
10
|
+
create(expression, dataType) {
|
|
11
|
+
return freeze({
|
|
12
|
+
kind: 'CastNode',
|
|
13
|
+
expression,
|
|
14
|
+
dataType,
|
|
15
|
+
});
|
|
16
|
+
},
|
|
17
|
+
});
|
|
@@ -21,6 +21,7 @@ export interface ColumnDefinitionNode extends OperationNode {
|
|
|
21
21
|
readonly frontModifiers?: ReadonlyArray<OperationNode>;
|
|
22
22
|
readonly endModifiers?: ReadonlyArray<OperationNode>;
|
|
23
23
|
readonly nullsNotDistinct?: boolean;
|
|
24
|
+
readonly identity?: boolean;
|
|
24
25
|
}
|
|
25
26
|
/**
|
|
26
27
|
* @internal
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { OperationNode } from './operation-node.js';
|
|
2
|
-
|
|
2
|
+
declare const SIMPLE_COLUMN_DATA_TYPES: readonly ["varchar", "char", "text", "integer", "int2", "int4", "int8", "smallint", "bigint", "boolean", "real", "double precision", "float4", "float8", "decimal", "numeric", "binary", "bytea", "date", "datetime", "time", "timetz", "timestamp", "timestamptz", "serial", "bigserial", "uuid", "json", "jsonb", "blob"];
|
|
3
|
+
type SimpleColumnDataType = (typeof SIMPLE_COLUMN_DATA_TYPES)[number];
|
|
4
|
+
export type ColumnDataType = SimpleColumnDataType | `varchar(${number})` | `char(${number})` | `decimal(${number}, ${number})` | `numeric(${number}, ${number})` | `binary(${number})` | `datetime(${number})` | `time(${number})` | `timetz(${number})` | `timestamp(${number})` | `timestamptz(${number})`;
|
|
3
5
|
export type DataTypeParams = Omit<DataTypeNode, 'kind' | 'dataType'>;
|
|
4
6
|
export interface DataTypeNode extends OperationNode {
|
|
5
7
|
readonly kind: 'DataTypeNode';
|
|
@@ -12,3 +14,5 @@ export declare const DataTypeNode: Readonly<{
|
|
|
12
14
|
is(node: OperationNode): node is DataTypeNode;
|
|
13
15
|
create(dataType: ColumnDataType): DataTypeNode;
|
|
14
16
|
}>;
|
|
17
|
+
export declare function isColumnDataType(dataType: string): dataType is ColumnDataType;
|
|
18
|
+
export {};
|
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
/// <reference types="./data-type-node.d.ts" />
|
|
2
2
|
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
const SIMPLE_COLUMN_DATA_TYPES = [
|
|
4
|
+
'varchar',
|
|
5
|
+
'char',
|
|
6
|
+
'text',
|
|
7
|
+
'integer',
|
|
8
|
+
'int2',
|
|
9
|
+
'int4',
|
|
10
|
+
'int8',
|
|
11
|
+
'smallint',
|
|
12
|
+
'bigint',
|
|
13
|
+
'boolean',
|
|
14
|
+
'real',
|
|
15
|
+
'double precision',
|
|
16
|
+
'float4',
|
|
17
|
+
'float8',
|
|
18
|
+
'decimal',
|
|
19
|
+
'numeric',
|
|
20
|
+
'binary',
|
|
21
|
+
'bytea',
|
|
22
|
+
'date',
|
|
23
|
+
'datetime',
|
|
24
|
+
'time',
|
|
25
|
+
'timetz',
|
|
26
|
+
'timestamp',
|
|
27
|
+
'timestamptz',
|
|
28
|
+
'serial',
|
|
29
|
+
'bigserial',
|
|
30
|
+
'uuid',
|
|
31
|
+
'json',
|
|
32
|
+
'jsonb',
|
|
33
|
+
'blob',
|
|
34
|
+
];
|
|
35
|
+
const COLUMN_DATA_TYPE_REGEX = [
|
|
36
|
+
/^varchar\(\d+\)$/,
|
|
37
|
+
/^char\(\d+\)$/,
|
|
38
|
+
/^decimal\(\d+, \d+\)$/,
|
|
39
|
+
/^numeric\(\d+, \d+\)$/,
|
|
40
|
+
/^binary\(\d+\)$/,
|
|
41
|
+
/^datetime\(\d+\)$/,
|
|
42
|
+
/^time\(\d+\)$/,
|
|
43
|
+
/^timez\(\d+\)$/,
|
|
44
|
+
/^timestamp\(\d+\)$/,
|
|
45
|
+
/^timestamptz\(\d+\)$/,
|
|
46
|
+
];
|
|
3
47
|
/**
|
|
4
48
|
* @internal
|
|
5
49
|
*/
|
|
@@ -14,3 +58,12 @@ export const DataTypeNode = freeze({
|
|
|
14
58
|
});
|
|
15
59
|
},
|
|
16
60
|
});
|
|
61
|
+
export function isColumnDataType(dataType) {
|
|
62
|
+
if (SIMPLE_COLUMN_DATA_TYPES.includes(dataType)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
if (COLUMN_DATA_TYPE_REGEX.some((r) => r.test(dataType))) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
@@ -9,6 +9,7 @@ import { OrderByNode } from './order-by-node.js';
|
|
|
9
9
|
import { OrderByItemNode } from './order-by-item-node.js';
|
|
10
10
|
import { ExplainNode } from './explain-node.js';
|
|
11
11
|
import { UsingNode } from './using-node.js';
|
|
12
|
+
import { TopNode } from './top-node.js';
|
|
12
13
|
export interface DeleteQueryNode extends OperationNode {
|
|
13
14
|
readonly kind: 'DeleteQueryNode';
|
|
14
15
|
readonly from: FromNode;
|
|
@@ -20,6 +21,7 @@ export interface DeleteQueryNode extends OperationNode {
|
|
|
20
21
|
readonly orderBy?: OrderByNode;
|
|
21
22
|
readonly limit?: LimitNode;
|
|
22
23
|
readonly explain?: ExplainNode;
|
|
24
|
+
readonly top?: TopNode;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
27
|
* @internal
|
|
@@ -28,6 +30,8 @@ export declare const DeleteQueryNode: Readonly<{
|
|
|
28
30
|
is(node: OperationNode): node is DeleteQueryNode;
|
|
29
31
|
create(fromItems: OperationNode[], withNode?: WithNode): DeleteQueryNode;
|
|
30
32
|
cloneWithOrderByItems(deleteNode: DeleteQueryNode, items: ReadonlyArray<OrderByItemNode>): DeleteQueryNode;
|
|
33
|
+
cloneWithoutOrderBy(deleteNode: DeleteQueryNode): DeleteQueryNode;
|
|
31
34
|
cloneWithLimit(deleteNode: DeleteQueryNode, limit: LimitNode): DeleteQueryNode;
|
|
35
|
+
cloneWithoutLimit(deleteNode: DeleteQueryNode): DeleteQueryNode;
|
|
32
36
|
cloneWithUsing(deleteNode: DeleteQueryNode, tables: OperationNode[]): DeleteQueryNode;
|
|
33
37
|
}>;
|
|
@@ -25,12 +25,24 @@ export const DeleteQueryNode = freeze({
|
|
|
25
25
|
: OrderByNode.create(items),
|
|
26
26
|
});
|
|
27
27
|
},
|
|
28
|
+
cloneWithoutOrderBy(deleteNode) {
|
|
29
|
+
return freeze({
|
|
30
|
+
...deleteNode,
|
|
31
|
+
orderBy: undefined,
|
|
32
|
+
});
|
|
33
|
+
},
|
|
28
34
|
cloneWithLimit(deleteNode, limit) {
|
|
29
35
|
return freeze({
|
|
30
36
|
...deleteNode,
|
|
31
37
|
limit,
|
|
32
38
|
});
|
|
33
39
|
},
|
|
40
|
+
cloneWithoutLimit(deleteNode) {
|
|
41
|
+
return freeze({
|
|
42
|
+
...deleteNode,
|
|
43
|
+
limit: undefined,
|
|
44
|
+
});
|
|
45
|
+
},
|
|
34
46
|
cloneWithUsing(deleteNode, tables) {
|
|
35
47
|
return freeze({
|
|
36
48
|
...deleteNode,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
import { ValueNode } from './value-node.js';
|
|
3
|
+
export type FetchModifier = 'only' | 'with ties';
|
|
4
|
+
export interface FetchNode extends OperationNode {
|
|
5
|
+
readonly kind: 'FetchNode';
|
|
6
|
+
readonly rowCount: ValueNode;
|
|
7
|
+
readonly modifier: FetchModifier;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
export declare const FetchNode: {
|
|
13
|
+
is(node: OperationNode): node is FetchNode;
|
|
14
|
+
create(rowCount: number | bigint, modifier: FetchModifier): FetchNode;
|
|
15
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="./fetch-node.d.ts" />
|
|
2
|
+
import { ValueNode } from './value-node.js';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const FetchNode = {
|
|
7
|
+
is(node) {
|
|
8
|
+
return node.kind === 'FetchNode';
|
|
9
|
+
},
|
|
10
|
+
create(rowCount, modifier) {
|
|
11
|
+
return {
|
|
12
|
+
kind: 'FetchNode',
|
|
13
|
+
rowCount: ValueNode.create(rowCount),
|
|
14
|
+
modifier,
|
|
15
|
+
};
|
|
16
|
+
},
|
|
17
|
+
};
|
|
@@ -5,11 +5,12 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
|
|
|
5
5
|
import { OperationNode } from './operation-node.js';
|
|
6
6
|
import { ReturningNode } from './returning-node.js';
|
|
7
7
|
import { TableNode } from './table-node.js';
|
|
8
|
+
import { TopNode } from './top-node.js';
|
|
8
9
|
import { WithNode } from './with-node.js';
|
|
9
10
|
export type InsertQueryNodeProps = Omit<InsertQueryNode, 'kind' | 'into'>;
|
|
10
11
|
export interface InsertQueryNode extends OperationNode {
|
|
11
12
|
readonly kind: 'InsertQueryNode';
|
|
12
|
-
readonly into
|
|
13
|
+
readonly into?: TableNode;
|
|
13
14
|
readonly columns?: ReadonlyArray<ColumnNode>;
|
|
14
15
|
readonly values?: OperationNode;
|
|
15
16
|
readonly returning?: ReturningNode;
|
|
@@ -20,6 +21,7 @@ export interface InsertQueryNode extends OperationNode {
|
|
|
20
21
|
readonly replace?: boolean;
|
|
21
22
|
readonly explain?: ExplainNode;
|
|
22
23
|
readonly defaultValues?: boolean;
|
|
24
|
+
readonly top?: TopNode;
|
|
23
25
|
}
|
|
24
26
|
/**
|
|
25
27
|
* @internal
|
|
@@ -27,5 +29,6 @@ export interface InsertQueryNode extends OperationNode {
|
|
|
27
29
|
export declare const InsertQueryNode: Readonly<{
|
|
28
30
|
is(node: OperationNode): node is InsertQueryNode;
|
|
29
31
|
create(into: TableNode, withNode?: WithNode, replace?: boolean): InsertQueryNode;
|
|
32
|
+
createWithoutInto(): InsertQueryNode;
|
|
30
33
|
cloneWith(insertQuery: InsertQueryNode, props: InsertQueryNodeProps): InsertQueryNode;
|
|
31
34
|
}>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OnNode } from './on-node.js';
|
|
2
2
|
import { OperationNode } from './operation-node.js';
|
|
3
|
-
export type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin' | 'LateralInnerJoin' | 'LateralLeftJoin';
|
|
3
|
+
export type JoinType = 'InnerJoin' | 'LeftJoin' | 'RightJoin' | 'FullJoin' | 'LateralInnerJoin' | 'LateralLeftJoin' | 'Using';
|
|
4
4
|
export interface JoinNode extends OperationNode {
|
|
5
5
|
readonly kind: 'JoinNode';
|
|
6
6
|
readonly joinType: JoinType;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
export interface MatchedNode extends OperationNode {
|
|
3
|
+
readonly kind: 'MatchedNode';
|
|
4
|
+
readonly not: boolean;
|
|
5
|
+
readonly bySource: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare const MatchedNode: Readonly<{
|
|
11
|
+
is(node: OperationNode): node is MatchedNode;
|
|
12
|
+
create(not: boolean, bySource?: boolean): MatchedNode;
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="./matched-node.d.ts" />
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const MatchedNode = freeze({
|
|
7
|
+
is(node) {
|
|
8
|
+
return node.kind === 'MatchedNode';
|
|
9
|
+
},
|
|
10
|
+
create(not, bySource = false) {
|
|
11
|
+
return freeze({
|
|
12
|
+
kind: 'MatchedNode',
|
|
13
|
+
not,
|
|
14
|
+
bySource,
|
|
15
|
+
});
|
|
16
|
+
},
|
|
17
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AliasNode } from './alias-node.js';
|
|
2
|
+
import { JoinNode } from './join-node.js';
|
|
3
|
+
import { OperationNode } from './operation-node.js';
|
|
4
|
+
import { TableNode } from './table-node.js';
|
|
5
|
+
import { TopNode } from './top-node.js';
|
|
6
|
+
import { WhenNode } from './when-node.js';
|
|
7
|
+
import { WithNode } from './with-node.js';
|
|
8
|
+
export interface MergeQueryNode extends OperationNode {
|
|
9
|
+
readonly kind: 'MergeQueryNode';
|
|
10
|
+
readonly into: TableNode | AliasNode;
|
|
11
|
+
readonly using?: JoinNode;
|
|
12
|
+
readonly whens?: ReadonlyArray<WhenNode>;
|
|
13
|
+
readonly with?: WithNode;
|
|
14
|
+
readonly top?: TopNode;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export declare const MergeQueryNode: Readonly<{
|
|
20
|
+
is(node: OperationNode): node is MergeQueryNode;
|
|
21
|
+
create(into: TableNode | AliasNode, withNode?: WithNode): MergeQueryNode;
|
|
22
|
+
cloneWithUsing(mergeNode: MergeQueryNode, using: JoinNode): MergeQueryNode;
|
|
23
|
+
cloneWithWhen(mergeNode: MergeQueryNode, when: WhenNode): MergeQueryNode;
|
|
24
|
+
cloneWithThen(mergeNode: MergeQueryNode, then: OperationNode): MergeQueryNode;
|
|
25
|
+
}>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/// <reference types="./merge-query-node.d.ts" />
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
import { WhenNode } from './when-node.js';
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export const MergeQueryNode = freeze({
|
|
8
|
+
is(node) {
|
|
9
|
+
return node.kind === 'MergeQueryNode';
|
|
10
|
+
},
|
|
11
|
+
create(into, withNode) {
|
|
12
|
+
return freeze({
|
|
13
|
+
kind: 'MergeQueryNode',
|
|
14
|
+
into,
|
|
15
|
+
...(withNode && { with: withNode }),
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
cloneWithUsing(mergeNode, using) {
|
|
19
|
+
return freeze({
|
|
20
|
+
...mergeNode,
|
|
21
|
+
using,
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
cloneWithWhen(mergeNode, when) {
|
|
25
|
+
return freeze({
|
|
26
|
+
...mergeNode,
|
|
27
|
+
whens: mergeNode.whens
|
|
28
|
+
? freeze([...mergeNode.whens, when])
|
|
29
|
+
: freeze([when]),
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
cloneWithThen(mergeNode, then) {
|
|
33
|
+
return freeze({
|
|
34
|
+
...mergeNode,
|
|
35
|
+
whens: mergeNode.whens
|
|
36
|
+
? freeze([
|
|
37
|
+
...mergeNode.whens.slice(0, -1),
|
|
38
|
+
WhenNode.cloneWithResult(mergeNode.whens[mergeNode.whens.length - 1], then),
|
|
39
|
+
])
|
|
40
|
+
: undefined,
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
});
|
|
@@ -85,7 +85,12 @@ import { JSONPathNode } from './json-path-node.js';
|
|
|
85
85
|
import { JSONPathLegNode } from './json-path-leg-node.js';
|
|
86
86
|
import { JSONOperatorChainNode } from './json-operator-chain-node.js';
|
|
87
87
|
import { TupleNode } from './tuple-node.js';
|
|
88
|
+
import { MergeQueryNode } from './merge-query-node.js';
|
|
89
|
+
import { MatchedNode } from './matched-node.js';
|
|
88
90
|
import { AddIndexNode } from './add-index-node.js';
|
|
91
|
+
import { CastNode } from './cast-node.js';
|
|
92
|
+
import { FetchNode } from './fetch-node.js';
|
|
93
|
+
import { TopNode } from './top-node.js';
|
|
89
94
|
/**
|
|
90
95
|
* Transforms an operation node tree into another one.
|
|
91
96
|
*
|
|
@@ -200,7 +205,12 @@ export declare class OperationNodeTransformer {
|
|
|
200
205
|
protected transformJSONPathLeg(node: JSONPathLegNode): JSONPathLegNode;
|
|
201
206
|
protected transformJSONOperatorChain(node: JSONOperatorChainNode): JSONOperatorChainNode;
|
|
202
207
|
protected transformTuple(node: TupleNode): TupleNode;
|
|
208
|
+
protected transformMergeQuery(node: MergeQueryNode): MergeQueryNode;
|
|
209
|
+
protected transformMatched(node: MatchedNode): MatchedNode;
|
|
203
210
|
protected transformAddIndex(node: AddIndexNode): AddIndexNode;
|
|
211
|
+
protected transformCast(node: CastNode): CastNode;
|
|
212
|
+
protected transformFetch(node: FetchNode): FetchNode;
|
|
213
|
+
protected transformTop(node: TopNode): TopNode;
|
|
204
214
|
protected transformDataType(node: DataTypeNode): DataTypeNode;
|
|
205
215
|
protected transformSelectAll(node: SelectAllNode): SelectAllNode;
|
|
206
216
|
protected transformIdentifier(node: IdentifierNode): IdentifierNode;
|