rake-db 2.33.12 → 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 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 NoForeignKeyChangeInput {
470
- noForeignKey: true;
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 | NoForeignKeyChangeInput;
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") return result;
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,13 +588,32 @@ 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") return result;
593
+ if (result.type === "change") {
594
+ result.name ??= getName(this);
595
+ return result;
596
+ }
575
597
  addOrDropChanges.push(result);
576
598
  return addOrDropChanges.length - 1;
577
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);
609
+ addOrDropChanges.push(result);
610
+ standaloneCheckChanges.push({
611
+ index: addOrDropChanges.length - 1,
612
+ type: "drop",
613
+ item
614
+ });
615
+ return addOrDropChanges.length - 1;
616
+ }
578
617
  for (const key in item) {
579
618
  if (item[key] instanceof pqb_internal.Column) {
580
619
  const result = {};
@@ -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 isNoForeignKeyChangeInput = (item) => {
619
- return "noForeignKey" in item;
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, opposite) => {
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, to);
698
- const t = changeInputToColumnChange(to, from);
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
  }