rake-db 2.33.11 → 2.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +28 -4
- package/dist/index.js +150 -30
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +150 -30
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -263,6 +263,7 @@ declare namespace RakeDbAst {
|
|
|
263
263
|
comment?: string | null;
|
|
264
264
|
compression?: string;
|
|
265
265
|
primaryKey?: boolean;
|
|
266
|
+
primaryKeyName?: string;
|
|
266
267
|
checks?: Column$1.Data.Check[];
|
|
267
268
|
foreignKeys?: TableData.ColumnReferences[];
|
|
268
269
|
indexes?: TableData.ColumnIndex[];
|
|
@@ -466,14 +467,38 @@ interface OneWayChange {
|
|
|
466
467
|
interface ColumnForeignKeyChangeInput {
|
|
467
468
|
columnForeignKey: TableData.ColumnReferences;
|
|
468
469
|
}
|
|
469
|
-
interface
|
|
470
|
-
|
|
470
|
+
interface ColumnPrimaryKeyChangeInput {
|
|
471
|
+
columnPrimaryKey: {
|
|
472
|
+
name?: string;
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
interface ColumnIndexChangeInput {
|
|
476
|
+
columnIndex: TableData.ColumnIndex;
|
|
477
|
+
}
|
|
478
|
+
interface ColumnExcludeChangeInput {
|
|
479
|
+
columnExclude: TableData.ColumnExclude;
|
|
471
480
|
}
|
|
472
|
-
type ChangeInput = Column$1 | OneWayChange | NonUniqDataItem | ColumnForeignKeyChangeInput |
|
|
481
|
+
type ChangeInput = Column$1 | OneWayChange | NonUniqDataItem | ColumnForeignKeyChangeInput | ColumnPrimaryKeyChangeInput | ColumnIndexChangeInput | ColumnExcludeChangeInput;
|
|
473
482
|
interface TableChangeMethods extends TableMethods, TableDataMethods<string> {
|
|
474
483
|
name(name: string): TableChangeMethods;
|
|
475
484
|
add: Add;
|
|
476
485
|
drop: Add;
|
|
486
|
+
primaryKey<Columns extends [string, ...string[]], Name extends string>(columns: Columns, name?: Name): {
|
|
487
|
+
tableDataItem: true;
|
|
488
|
+
columns: Columns;
|
|
489
|
+
name: string extends Name ? never : Name;
|
|
490
|
+
};
|
|
491
|
+
primaryKey(name?: string): ColumnPrimaryKeyChangeInput;
|
|
492
|
+
index(columns: (string | TableData.Index.ColumnOrExpressionOptions)[], options?: TableData.Index.OptionsArg): NonUniqDataItem;
|
|
493
|
+
index(options?: TableData.Index.ColumnArg): ColumnIndexChangeInput;
|
|
494
|
+
unique<Columns extends [string | TableData.Index.ColumnOrExpressionOptions, ...(string | TableData.Index.ColumnOrExpressionOptions)[]], Name extends string>(columns: Columns, options?: TableData.Index.UniqueOptionsArg<Name>): {
|
|
495
|
+
tableDataItem: true;
|
|
496
|
+
columns: Columns extends (string | TableData.Index.ColumnOptionsForColumn<string>)[] ? { [I in keyof Columns]: 'column' extends keyof Columns[I] ? Columns[I]['column'] : Columns[I] } : never;
|
|
497
|
+
name: string extends Name ? never : Name;
|
|
498
|
+
};
|
|
499
|
+
unique(options?: TableData.Index.UniqueColumnArg): ColumnIndexChangeInput;
|
|
500
|
+
exclude(columns: TableData.Exclude.ColumnOrExpressionOptions[], options?: TableData.Exclude.Options): NonUniqDataItem;
|
|
501
|
+
exclude(with_: string, options?: TableData.Exclude.ColumnArg): ColumnExcludeChangeInput;
|
|
477
502
|
foreignKey<Shape>(columns: [string, ...string[]], fnOrTable: () => new () => {
|
|
478
503
|
columns: {
|
|
479
504
|
shape: Shape;
|
|
@@ -481,7 +506,6 @@ interface TableChangeMethods extends TableMethods, TableDataMethods<string> {
|
|
|
481
506
|
}, foreignColumns: [keyof Shape, ...(keyof Shape)[]], options?: TableData.References.Options): NonUniqDataItem;
|
|
482
507
|
foreignKey(columns: [string, ...string[]], fnOrTable: string, foreignColumns: [string, ...string[]], options?: TableData.References.Options): NonUniqDataItem;
|
|
483
508
|
foreignKey(fnOrTable: string, foreignColumn: string, options?: TableData.References.Options): ColumnForeignKeyChangeInput;
|
|
484
|
-
noForeignKey(): NoForeignKeyChangeInput;
|
|
485
509
|
change(from: ChangeInput, to: ChangeInput, using?: ChangeOptions): Change;
|
|
486
510
|
default(value: unknown | RawSqlBase): OneWayChange;
|
|
487
511
|
nullable(): OneWayChange;
|
package/dist/index.js
CHANGED
|
@@ -541,14 +541,34 @@ const resetChangeTableData = () => {
|
|
|
541
541
|
changeTableData = newChangeTableData();
|
|
542
542
|
};
|
|
543
543
|
const addOrDropChanges = [];
|
|
544
|
+
const standaloneCheckChanges = [];
|
|
544
545
|
function add(item, options) {
|
|
545
546
|
(0, pqb_internal.consumeColumnName)();
|
|
546
547
|
setName(this, item);
|
|
547
|
-
if (isNoForeignKeyChangeInput(item)) throw new Error("t.noForeignKey() is only supported in t.change(...)");
|
|
548
548
|
if (item instanceof pqb_internal.Column) {
|
|
549
549
|
const result = addOrDrop("add", item, options);
|
|
550
|
-
if (result.type === "change")
|
|
550
|
+
if (result.type === "change") {
|
|
551
|
+
result.name ??= getName(this);
|
|
552
|
+
return result;
|
|
553
|
+
}
|
|
554
|
+
addOrDropChanges.push(result);
|
|
555
|
+
return addOrDropChanges.length - 1;
|
|
556
|
+
}
|
|
557
|
+
if (isStandaloneAddOrDropInput(item)) {
|
|
558
|
+
const result = standaloneAddOrDropToChange("add", item);
|
|
559
|
+
result.name ??= getName(this);
|
|
560
|
+
addOrDropChanges.push(result);
|
|
561
|
+
return addOrDropChanges.length - 1;
|
|
562
|
+
}
|
|
563
|
+
if (isStandaloneCheckAddOrDropInput(item)) {
|
|
564
|
+
const result = standaloneAddOrDropToChange("add", item);
|
|
565
|
+
result.name ??= getName(this);
|
|
551
566
|
addOrDropChanges.push(result);
|
|
567
|
+
standaloneCheckChanges.push({
|
|
568
|
+
index: addOrDropChanges.length - 1,
|
|
569
|
+
type: "add",
|
|
570
|
+
item
|
|
571
|
+
});
|
|
552
572
|
return addOrDropChanges.length - 1;
|
|
553
573
|
}
|
|
554
574
|
for (const key in item) {
|
|
@@ -568,11 +588,30 @@ function add(item, options) {
|
|
|
568
588
|
const drop = function(item, options) {
|
|
569
589
|
(0, pqb_internal.consumeColumnName)();
|
|
570
590
|
setName(this, item);
|
|
571
|
-
if (isNoForeignKeyChangeInput(item)) throw new Error("t.noForeignKey() is only supported in t.change(...)");
|
|
572
591
|
if (item instanceof pqb_internal.Column) {
|
|
573
592
|
const result = addOrDrop("drop", item, options);
|
|
574
|
-
if (result.type === "change")
|
|
593
|
+
if (result.type === "change") {
|
|
594
|
+
result.name ??= getName(this);
|
|
595
|
+
return result;
|
|
596
|
+
}
|
|
597
|
+
addOrDropChanges.push(result);
|
|
598
|
+
return addOrDropChanges.length - 1;
|
|
599
|
+
}
|
|
600
|
+
if (isStandaloneAddOrDropInput(item)) {
|
|
601
|
+
const result = standaloneAddOrDropToChange("drop", item);
|
|
602
|
+
result.name ??= getName(this);
|
|
603
|
+
addOrDropChanges.push(result);
|
|
604
|
+
return addOrDropChanges.length - 1;
|
|
605
|
+
}
|
|
606
|
+
if (isStandaloneCheckAddOrDropInput(item)) {
|
|
607
|
+
const result = standaloneAddOrDropToChange("drop", item);
|
|
608
|
+
result.name ??= getName(this);
|
|
575
609
|
addOrDropChanges.push(result);
|
|
610
|
+
standaloneCheckChanges.push({
|
|
611
|
+
index: addOrDropChanges.length - 1,
|
|
612
|
+
type: "drop",
|
|
613
|
+
item
|
|
614
|
+
});
|
|
576
615
|
return addOrDropChanges.length - 1;
|
|
577
616
|
}
|
|
578
617
|
for (const key in item) {
|
|
@@ -612,22 +651,48 @@ const addOrDrop = (type, item, options) => {
|
|
|
612
651
|
dropMode: options?.dropMode
|
|
613
652
|
};
|
|
614
653
|
};
|
|
654
|
+
const standaloneAddOrDropToChange = (type, item) => {
|
|
655
|
+
const empty = columnTypeToColumnChange({
|
|
656
|
+
type: "change",
|
|
657
|
+
to: {}
|
|
658
|
+
});
|
|
659
|
+
const change = changeInputToColumnChange(item);
|
|
660
|
+
return {
|
|
661
|
+
type: "change",
|
|
662
|
+
from: type === "add" ? empty : change,
|
|
663
|
+
to: type === "add" ? change : empty
|
|
664
|
+
};
|
|
665
|
+
};
|
|
615
666
|
const isColumnForeignKeyChangeInput = (item) => {
|
|
616
667
|
return "columnForeignKey" in item;
|
|
617
668
|
};
|
|
618
|
-
const
|
|
619
|
-
return "
|
|
669
|
+
const isColumnPrimaryKeyChangeInput = (item) => {
|
|
670
|
+
return "columnPrimaryKey" in item;
|
|
671
|
+
};
|
|
672
|
+
const isColumnIndexChangeInput = (item) => {
|
|
673
|
+
return "columnIndex" in item;
|
|
674
|
+
};
|
|
675
|
+
const isColumnExcludeChangeInput = (item) => {
|
|
676
|
+
return "columnExclude" in item;
|
|
677
|
+
};
|
|
678
|
+
const isStandaloneAddOrDropInput = (item) => {
|
|
679
|
+
return isColumnForeignKeyChangeInput(item) || isColumnPrimaryKeyChangeInput(item) || isColumnIndexChangeInput(item) || isColumnExcludeChangeInput(item);
|
|
680
|
+
};
|
|
681
|
+
const isStandaloneCheckAddOrDropInput = (item) => {
|
|
682
|
+
return isCheckConstraintItem(item);
|
|
620
683
|
};
|
|
621
684
|
const isCheckConstraintItem = (item) => {
|
|
622
685
|
return !!item.constraint?.check;
|
|
623
686
|
};
|
|
624
|
-
const changeInputToColumnChange = (item
|
|
687
|
+
const changeInputToColumnChange = (item) => {
|
|
625
688
|
if (item instanceof pqb_internal.Column || "type" in item) return columnTypeToColumnChange(item);
|
|
689
|
+
if (isColumnPrimaryKeyChangeInput(item)) return {
|
|
690
|
+
primaryKey: true,
|
|
691
|
+
primaryKeyName: item.columnPrimaryKey.name
|
|
692
|
+
};
|
|
693
|
+
if (isColumnIndexChangeInput(item)) return { indexes: [item.columnIndex] };
|
|
694
|
+
if (isColumnExcludeChangeInput(item)) return { excludes: [item.columnExclude] };
|
|
626
695
|
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
696
|
if (isCheckConstraintItem(item)) return { checks: [{
|
|
632
697
|
sql: item.constraint.check,
|
|
633
698
|
name: item.constraint.name
|
|
@@ -658,6 +723,9 @@ const columnTypeToColumnChange = (item, name) => {
|
|
|
658
723
|
return item.to;
|
|
659
724
|
};
|
|
660
725
|
const nameKey = Symbol("name");
|
|
726
|
+
const getName = (self) => {
|
|
727
|
+
return self[nameKey];
|
|
728
|
+
};
|
|
661
729
|
const setName = (self, item) => {
|
|
662
730
|
const name = self[nameKey];
|
|
663
731
|
if (!name) return;
|
|
@@ -677,6 +745,47 @@ function foreignKey(...args) {
|
|
|
677
745
|
options
|
|
678
746
|
} };
|
|
679
747
|
}
|
|
748
|
+
function primaryKey(...args) {
|
|
749
|
+
if (Array.isArray(args[0])) {
|
|
750
|
+
const [columns, name] = args;
|
|
751
|
+
return pqb_internal.tableDataMethods.primaryKey(columns, name);
|
|
752
|
+
}
|
|
753
|
+
const [name] = args;
|
|
754
|
+
return { columnPrimaryKey: { name } };
|
|
755
|
+
}
|
|
756
|
+
function index(...args) {
|
|
757
|
+
if (Array.isArray(args[0])) {
|
|
758
|
+
const [columns, first, second] = args;
|
|
759
|
+
if (typeof first === "string") return pqb_internal.tableDataMethods.index(columns, first, second);
|
|
760
|
+
return pqb_internal.tableDataMethods.index(columns, first);
|
|
761
|
+
}
|
|
762
|
+
const [options] = args;
|
|
763
|
+
return { columnIndex: { options: { ...options } } };
|
|
764
|
+
}
|
|
765
|
+
function unique(...args) {
|
|
766
|
+
if (Array.isArray(args[0])) {
|
|
767
|
+
const [columns, first, second] = args;
|
|
768
|
+
if (typeof first === "string") return pqb_internal.tableDataMethods.unique(columns, first, second);
|
|
769
|
+
return pqb_internal.tableDataMethods.unique(columns, first);
|
|
770
|
+
}
|
|
771
|
+
const [options] = args;
|
|
772
|
+
return { columnIndex: { options: {
|
|
773
|
+
...options,
|
|
774
|
+
unique: true
|
|
775
|
+
} } };
|
|
776
|
+
}
|
|
777
|
+
function exclude(...args) {
|
|
778
|
+
if (Array.isArray(args[0])) {
|
|
779
|
+
const [columns, first, second] = args;
|
|
780
|
+
if (typeof first === "string") return pqb_internal.tableDataMethods.exclude(columns, first, second);
|
|
781
|
+
return pqb_internal.tableDataMethods.exclude(columns, first);
|
|
782
|
+
}
|
|
783
|
+
const [with_, options] = args;
|
|
784
|
+
return { columnExclude: {
|
|
785
|
+
with: with_,
|
|
786
|
+
options: { ...options }
|
|
787
|
+
} };
|
|
788
|
+
}
|
|
680
789
|
const tableChangeMethods = {
|
|
681
790
|
...tableMethods,
|
|
682
791
|
...pqb_internal.tableDataMethods,
|
|
@@ -688,14 +797,15 @@ const tableChangeMethods = {
|
|
|
688
797
|
},
|
|
689
798
|
add,
|
|
690
799
|
drop,
|
|
800
|
+
primaryKey,
|
|
801
|
+
index,
|
|
802
|
+
unique,
|
|
803
|
+
exclude,
|
|
691
804
|
foreignKey,
|
|
692
|
-
noForeignKey() {
|
|
693
|
-
return { noForeignKey: true };
|
|
694
|
-
},
|
|
695
805
|
change(from, to, using) {
|
|
696
806
|
(0, pqb_internal.consumeColumnName)();
|
|
697
|
-
const f = changeInputToColumnChange(from
|
|
698
|
-
const t = changeInputToColumnChange(to
|
|
807
|
+
const f = changeInputToColumnChange(from);
|
|
808
|
+
const t = changeInputToColumnChange(to);
|
|
699
809
|
setName(this, f);
|
|
700
810
|
setName(this, t);
|
|
701
811
|
return {
|
|
@@ -745,6 +855,7 @@ const changeTable = async (migration, up, tableName, options, fn) => {
|
|
|
745
855
|
const tableChanger = Object.create(migration.columnTypes);
|
|
746
856
|
Object.assign(tableChanger, tableChangeMethods);
|
|
747
857
|
addOrDropChanges.length = 0;
|
|
858
|
+
standaloneCheckChanges.length = 0;
|
|
748
859
|
const changeData = fn?.(tableChanger) || {};
|
|
749
860
|
const schema = migration.adapter.getSchema();
|
|
750
861
|
const queries = astToQueries(schema, makeAst$3(schema, up, tableName, changeData, changeTableData, options), snakeCase, language);
|
|
@@ -759,6 +870,7 @@ const makeAst$3 = (schema, up, name, changeData, changeTableData, options) => {
|
|
|
759
870
|
const consumedChanges = {};
|
|
760
871
|
for (const key in changeData) {
|
|
761
872
|
let item = changeData[key];
|
|
873
|
+
if (item === void 0) continue;
|
|
762
874
|
if (typeof item === "number") {
|
|
763
875
|
consumedChanges[item] = true;
|
|
764
876
|
item = addOrDropChanges[item];
|
|
@@ -784,9 +896,15 @@ const makeAst$3 = (schema, up, name, changeData, changeTableData, options) => {
|
|
|
784
896
|
}
|
|
785
897
|
} : item;
|
|
786
898
|
}
|
|
899
|
+
for (const checkChange of standaloneCheckChanges) {
|
|
900
|
+
if (consumedChanges[checkChange.index]) continue;
|
|
901
|
+
(0, pqb_internal.parseTableDataInput)(changeTableData[checkChange.type], checkChange.item);
|
|
902
|
+
consumedChanges[checkChange.index] = true;
|
|
903
|
+
}
|
|
787
904
|
for (let i = 0; i < addOrDropChanges.length; i++) {
|
|
788
905
|
if (consumedChanges[i]) continue;
|
|
789
906
|
const change = addOrDropChanges[i];
|
|
907
|
+
if (change.type === "change") throw new Error("Standalone helper add/drop changes must be assigned to a column key");
|
|
790
908
|
const name = change.item.data.name;
|
|
791
909
|
if (!name) throw new Error(`Column in ...t.${change.type}() must have a name`);
|
|
792
910
|
const arr = shape[name] ? (0, pqb_internal.toArray)(shape[name]) : [];
|
|
@@ -882,6 +1000,11 @@ const alterTableSql = (tableName, lines, values) => ({
|
|
|
882
1000
|
${lines.join(",\n ")}`,
|
|
883
1001
|
values
|
|
884
1002
|
});
|
|
1003
|
+
const setPrimaryKeyName = (key, primaryKey, name) => {
|
|
1004
|
+
if (!name) return;
|
|
1005
|
+
if (primaryKey.name && primaryKey.name !== name) throw new Error(`Cannot use different primary key names in standalone changes for column ${key}`);
|
|
1006
|
+
primaryKey.name = name;
|
|
1007
|
+
};
|
|
885
1008
|
const handlePrerequisitesForTableItem = (schema, key, item, queries, addPrimaryKeys, dropPrimaryKeys, snakeCase) => {
|
|
886
1009
|
if ("item" in item) {
|
|
887
1010
|
const { item: column } = item;
|
|
@@ -895,10 +1018,12 @@ const handlePrerequisitesForTableItem = (schema, key, item, queries, addPrimaryK
|
|
|
895
1018
|
if (item.from.column instanceof pqb_internal.EnumColumn) queries.push(makePopulateEnumQuery(schema, item.from.column));
|
|
896
1019
|
if (item.to.column instanceof pqb_internal.EnumColumn) queries.push(makePopulateEnumQuery(schema, item.to.column));
|
|
897
1020
|
if (item.from.primaryKey) {
|
|
1021
|
+
setPrimaryKeyName(key, dropPrimaryKeys, item.from.primaryKeyName);
|
|
898
1022
|
dropPrimaryKeys.columns.push(item.from.column ? getColumnName(item.from.column, key, snakeCase) : snakeCase ? (0, pqb_internal.toSnakeCase)(key) : key);
|
|
899
1023
|
dropPrimaryKeys.change = true;
|
|
900
1024
|
}
|
|
901
1025
|
if (item.to.primaryKey) {
|
|
1026
|
+
setPrimaryKeyName(key, addPrimaryKeys, item.to.primaryKeyName);
|
|
902
1027
|
addPrimaryKeys.columns.push(item.to.column ? getColumnName(item.to.column, key, snakeCase) : snakeCase ? (0, pqb_internal.toSnakeCase)(key) : key);
|
|
903
1028
|
addPrimaryKeys.change = true;
|
|
904
1029
|
}
|
|
@@ -2158,7 +2283,7 @@ const wrapWithEnhancingError = async (text, values, promise) => {
|
|
|
2158
2283
|
try {
|
|
2159
2284
|
return await promise;
|
|
2160
2285
|
} catch (err) {
|
|
2161
|
-
if (err && typeof err === "object" && "message" in err && typeof err.message === "string" && err.constructor.name === "PostgresError") {
|
|
2286
|
+
if (err && typeof err === "object" && "message" in err && typeof err.message === "string" && (err.constructor.name === "PostgresError" || err.constructor.name === "DatabaseError")) {
|
|
2162
2287
|
err.message += `\nSQL: ${text}${values ? `\nVariables: ${JSON.stringify(values)}` : ""}`;
|
|
2163
2288
|
throw new err.constructor(err);
|
|
2164
2289
|
}
|
|
@@ -2632,13 +2757,11 @@ const getMaybeTransactionAdapter = (db) => "$getAdapter" in db ? db.$getAdapter(
|
|
|
2632
2757
|
const runSqlInSavePoint = async (db, sql, code) => {
|
|
2633
2758
|
const adapter = getMaybeTransactionAdapter(db);
|
|
2634
2759
|
try {
|
|
2635
|
-
|
|
2760
|
+
const query = () => adapter.query(sql);
|
|
2761
|
+
await (adapter.isInTransaction() ? adapter.savepoint("s", query) : query());
|
|
2636
2762
|
return "done";
|
|
2637
2763
|
} catch (err) {
|
|
2638
|
-
if (err.code === code)
|
|
2639
|
-
if (adapter.isInTransaction()) await adapter.query(`ROLLBACK TO SAVEPOINT s`);
|
|
2640
|
-
return "already";
|
|
2641
|
-
}
|
|
2764
|
+
if (err.code === code) return "already";
|
|
2642
2765
|
throw err;
|
|
2643
2766
|
}
|
|
2644
2767
|
};
|
|
@@ -2768,17 +2891,14 @@ const deleteMigratedVersion = async (adapter, version, name, config) => {
|
|
|
2768
2891
|
var NoMigrationsTableError = class extends Error {};
|
|
2769
2892
|
const getMigratedVersionsMap = async (ctx, adapter, config, renameTo) => {
|
|
2770
2893
|
const table = migrationsSchemaTableSql(adapter, config);
|
|
2771
|
-
const
|
|
2894
|
+
const queryVersion = () => adapter.arrays(`SELECT * FROM ${table} ORDER BY version`);
|
|
2772
2895
|
let result;
|
|
2773
2896
|
try {
|
|
2774
|
-
if (
|
|
2775
|
-
result = await
|
|
2776
|
-
if (inTransaction) await adapter.query(`RELEASE SAVEPOINT check_migrations_table`);
|
|
2897
|
+
if (adapter.isInTransaction()) result = await adapter.savepoint("check_migrations_table", queryVersion);
|
|
2898
|
+
else result = await queryVersion();
|
|
2777
2899
|
} catch (err) {
|
|
2778
|
-
if (err.code === "42P01")
|
|
2779
|
-
|
|
2780
|
-
throw new NoMigrationsTableError();
|
|
2781
|
-
} else throw err;
|
|
2900
|
+
if (err.code === "42P01") throw new NoMigrationsTableError();
|
|
2901
|
+
else throw err;
|
|
2782
2902
|
}
|
|
2783
2903
|
if (!result.fields[1]) {
|
|
2784
2904
|
const { migrations } = await getMigrations(ctx, config, true);
|