rake-db 2.33.10 → 2.33.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.
- package/dist/index.d.ts +17 -2
- package/dist/index.js +51 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +51 -16
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Adapter, Column as Column$1, ColumnSchemaConfig, ColumnsByType, ColumnsShape, DbDomainArg, DbResult, DbStructureDomainsMap, DefaultColumnTypes, DefaultPrivileges, DefaultSchemaConfig, EmptyObject, EnumColumn, MaybeArray, MaybePromise, NoPrimaryKeyOption, QueryLogObject, QueryLogOptions, QueryLogger, QuerySchema, RawSqlBase, RecordOptionalString, RecordString, SearchWeight, TableData, TableDataFn, TableDataItem, TableDataMethods, raw } from "pqb/internal";
|
|
1
|
+
import { Adapter, Column as Column$1, ColumnSchemaConfig, ColumnsByType, ColumnsShape, DbDomainArg, DbResult, DbStructureDomainsMap, DefaultColumnTypes, DefaultPrivileges, DefaultSchemaConfig, EmptyObject, EnumColumn, MaybeArray, MaybePromise, NoPrimaryKeyOption, NonUniqDataItem, QueryLogObject, QueryLogOptions, QueryLogger, QuerySchema, RawSqlBase, RecordOptionalString, RecordString, SearchWeight, TableData, TableDataFn, TableDataItem, TableDataMethods, raw } from "pqb/internal";
|
|
2
2
|
import { Db } from "pqb";
|
|
3
3
|
declare namespace DbStructure {
|
|
4
4
|
interface TableNameAndSchemaName {
|
|
@@ -463,11 +463,26 @@ interface OneWayChange {
|
|
|
463
463
|
to: RakeDbAst.ColumnChange;
|
|
464
464
|
using?: RakeDbAst.ChangeTableItem.ChangeUsing;
|
|
465
465
|
}
|
|
466
|
+
interface ColumnForeignKeyChangeInput {
|
|
467
|
+
columnForeignKey: TableData.ColumnReferences;
|
|
468
|
+
}
|
|
469
|
+
interface NoForeignKeyChangeInput {
|
|
470
|
+
noForeignKey: true;
|
|
471
|
+
}
|
|
472
|
+
type ChangeInput = Column$1 | OneWayChange | NonUniqDataItem | ColumnForeignKeyChangeInput | NoForeignKeyChangeInput;
|
|
466
473
|
interface TableChangeMethods extends TableMethods, TableDataMethods<string> {
|
|
467
474
|
name(name: string): TableChangeMethods;
|
|
468
475
|
add: Add;
|
|
469
476
|
drop: Add;
|
|
470
|
-
|
|
477
|
+
foreignKey<Shape>(columns: [string, ...string[]], fnOrTable: () => new () => {
|
|
478
|
+
columns: {
|
|
479
|
+
shape: Shape;
|
|
480
|
+
};
|
|
481
|
+
}, foreignColumns: [keyof Shape, ...(keyof Shape)[]], options?: TableData.References.Options): NonUniqDataItem;
|
|
482
|
+
foreignKey(columns: [string, ...string[]], fnOrTable: string, foreignColumns: [string, ...string[]], options?: TableData.References.Options): NonUniqDataItem;
|
|
483
|
+
foreignKey(fnOrTable: string, foreignColumn: string, options?: TableData.References.Options): ColumnForeignKeyChangeInput;
|
|
484
|
+
noForeignKey(): NoForeignKeyChangeInput;
|
|
485
|
+
change(from: ChangeInput, to: ChangeInput, using?: ChangeOptions): Change;
|
|
471
486
|
default(value: unknown | RawSqlBase): OneWayChange;
|
|
472
487
|
nullable(): OneWayChange;
|
|
473
488
|
nonNullable(): OneWayChange;
|
package/dist/index.js
CHANGED
|
@@ -544,6 +544,7 @@ const addOrDropChanges = [];
|
|
|
544
544
|
function add(item, options) {
|
|
545
545
|
(0, pqb_internal.consumeColumnName)();
|
|
546
546
|
setName(this, item);
|
|
547
|
+
if (isNoForeignKeyChangeInput(item)) throw new Error("t.noForeignKey() is only supported in t.change(...)");
|
|
547
548
|
if (item instanceof pqb_internal.Column) {
|
|
548
549
|
const result = addOrDrop("add", item, options);
|
|
549
550
|
if (result.type === "change") return result;
|
|
@@ -567,6 +568,7 @@ function add(item, options) {
|
|
|
567
568
|
const drop = function(item, options) {
|
|
568
569
|
(0, pqb_internal.consumeColumnName)();
|
|
569
570
|
setName(this, item);
|
|
571
|
+
if (isNoForeignKeyChangeInput(item)) throw new Error("t.noForeignKey() is only supported in t.change(...)");
|
|
570
572
|
if (item instanceof pqb_internal.Column) {
|
|
571
573
|
const result = addOrDrop("drop", item, options);
|
|
572
574
|
if (result.type === "change") return result;
|
|
@@ -610,6 +612,28 @@ const addOrDrop = (type, item, options) => {
|
|
|
610
612
|
dropMode: options?.dropMode
|
|
611
613
|
};
|
|
612
614
|
};
|
|
615
|
+
const isColumnForeignKeyChangeInput = (item) => {
|
|
616
|
+
return "columnForeignKey" in item;
|
|
617
|
+
};
|
|
618
|
+
const isNoForeignKeyChangeInput = (item) => {
|
|
619
|
+
return "noForeignKey" in item;
|
|
620
|
+
};
|
|
621
|
+
const isCheckConstraintItem = (item) => {
|
|
622
|
+
return !!item.constraint?.check;
|
|
623
|
+
};
|
|
624
|
+
const changeInputToColumnChange = (item, opposite) => {
|
|
625
|
+
if (item instanceof pqb_internal.Column || "type" in item) return columnTypeToColumnChange(item);
|
|
626
|
+
if (isColumnForeignKeyChangeInput(item)) return { foreignKeys: [item.columnForeignKey] };
|
|
627
|
+
if (isNoForeignKeyChangeInput(item)) {
|
|
628
|
+
if (!isColumnForeignKeyChangeInput(opposite)) throw new Error("t.noForeignKey() in t.change(...) must be paired with t.foreignKey(...)");
|
|
629
|
+
return { foreignKeys: [] };
|
|
630
|
+
}
|
|
631
|
+
if (isCheckConstraintItem(item)) return { checks: [{
|
|
632
|
+
sql: item.constraint.check,
|
|
633
|
+
name: item.constraint.name
|
|
634
|
+
}] };
|
|
635
|
+
throw new Error("t.change(...) supports t.check(...) only for check constraints in this form");
|
|
636
|
+
};
|
|
613
637
|
const columnTypeToColumnChange = (item, name) => {
|
|
614
638
|
if (item instanceof pqb_internal.Column) {
|
|
615
639
|
let column = item;
|
|
@@ -641,6 +665,18 @@ const setName = (self, item) => {
|
|
|
641
665
|
else if (item instanceof pqb_internal.Column) item.data.name ??= name;
|
|
642
666
|
else item.name ??= name;
|
|
643
667
|
};
|
|
668
|
+
function foreignKey(...args) {
|
|
669
|
+
if (Array.isArray(args[0])) {
|
|
670
|
+
const [columns, fnOrTable, foreignColumns, options] = args;
|
|
671
|
+
return pqb_internal.tableDataMethods.foreignKey(columns, fnOrTable, foreignColumns, options);
|
|
672
|
+
}
|
|
673
|
+
const [fnOrTable, foreignColumn, options] = args;
|
|
674
|
+
return { columnForeignKey: {
|
|
675
|
+
fnOrTable,
|
|
676
|
+
foreignColumns: [foreignColumn],
|
|
677
|
+
options
|
|
678
|
+
} };
|
|
679
|
+
}
|
|
644
680
|
const tableChangeMethods = {
|
|
645
681
|
...tableMethods,
|
|
646
682
|
...pqb_internal.tableDataMethods,
|
|
@@ -652,10 +688,14 @@ const tableChangeMethods = {
|
|
|
652
688
|
},
|
|
653
689
|
add,
|
|
654
690
|
drop,
|
|
691
|
+
foreignKey,
|
|
692
|
+
noForeignKey() {
|
|
693
|
+
return { noForeignKey: true };
|
|
694
|
+
},
|
|
655
695
|
change(from, to, using) {
|
|
656
696
|
(0, pqb_internal.consumeColumnName)();
|
|
657
|
-
const f =
|
|
658
|
-
const t =
|
|
697
|
+
const f = changeInputToColumnChange(from, to);
|
|
698
|
+
const t = changeInputToColumnChange(to, from);
|
|
659
699
|
setName(this, f);
|
|
660
700
|
setName(this, t);
|
|
661
701
|
return {
|
|
@@ -2118,7 +2158,7 @@ const wrapWithEnhancingError = async (text, values, promise) => {
|
|
|
2118
2158
|
try {
|
|
2119
2159
|
return await promise;
|
|
2120
2160
|
} catch (err) {
|
|
2121
|
-
if (err && typeof err === "object" && "message" in err && typeof err.message === "string" && err.constructor.name === "PostgresError") {
|
|
2161
|
+
if (err && typeof err === "object" && "message" in err && typeof err.message === "string" && (err.constructor.name === "PostgresError" || err.constructor.name === "DatabaseError")) {
|
|
2122
2162
|
err.message += `\nSQL: ${text}${values ? `\nVariables: ${JSON.stringify(values)}` : ""}`;
|
|
2123
2163
|
throw new err.constructor(err);
|
|
2124
2164
|
}
|
|
@@ -2592,13 +2632,11 @@ const getMaybeTransactionAdapter = (db) => "$getAdapter" in db ? db.$getAdapter(
|
|
|
2592
2632
|
const runSqlInSavePoint = async (db, sql, code) => {
|
|
2593
2633
|
const adapter = getMaybeTransactionAdapter(db);
|
|
2594
2634
|
try {
|
|
2595
|
-
|
|
2635
|
+
const query = () => adapter.query(sql);
|
|
2636
|
+
await (adapter.isInTransaction() ? adapter.savepoint("s", query) : query());
|
|
2596
2637
|
return "done";
|
|
2597
2638
|
} catch (err) {
|
|
2598
|
-
if (err.code === code)
|
|
2599
|
-
if (adapter.isInTransaction()) await adapter.query(`ROLLBACK TO SAVEPOINT s`);
|
|
2600
|
-
return "already";
|
|
2601
|
-
}
|
|
2639
|
+
if (err.code === code) return "already";
|
|
2602
2640
|
throw err;
|
|
2603
2641
|
}
|
|
2604
2642
|
};
|
|
@@ -2728,17 +2766,14 @@ const deleteMigratedVersion = async (adapter, version, name, config) => {
|
|
|
2728
2766
|
var NoMigrationsTableError = class extends Error {};
|
|
2729
2767
|
const getMigratedVersionsMap = async (ctx, adapter, config, renameTo) => {
|
|
2730
2768
|
const table = migrationsSchemaTableSql(adapter, config);
|
|
2731
|
-
const
|
|
2769
|
+
const queryVersion = () => adapter.arrays(`SELECT * FROM ${table} ORDER BY version`);
|
|
2732
2770
|
let result;
|
|
2733
2771
|
try {
|
|
2734
|
-
if (
|
|
2735
|
-
result = await
|
|
2736
|
-
if (inTransaction) await adapter.query(`RELEASE SAVEPOINT check_migrations_table`);
|
|
2772
|
+
if (adapter.isInTransaction()) result = await adapter.savepoint("check_migrations_table", queryVersion);
|
|
2773
|
+
else result = await queryVersion();
|
|
2737
2774
|
} catch (err) {
|
|
2738
|
-
if (err.code === "42P01")
|
|
2739
|
-
|
|
2740
|
-
throw new NoMigrationsTableError();
|
|
2741
|
-
} else throw err;
|
|
2775
|
+
if (err.code === "42P01") throw new NoMigrationsTableError();
|
|
2776
|
+
else throw err;
|
|
2742
2777
|
}
|
|
2743
2778
|
if (!result.fields[1]) {
|
|
2744
2779
|
const { migrations } = await getMigrations(ctx, config, true);
|