orchid-orm 1.38.0 → 1.38.1

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.
@@ -1,6 +1,6 @@
1
1
  import { promptSelect, colors, getSchemaAndTableFromName, getDbTableColumnsChecks, dbColumnToAst, instantiateDbColumn, concatSchemaAndName, encodeColumnDefault, getIndexName, getExcludeName, getConstraintName, tableToAst, getDbStructureTableData, makeDomainsMap, astToMigration, createMigrationInterface, introspectDbSchema, exhaustive, pluralize, makeStructureToAstCtx, makeFileVersion, writeMigrationFile, migrate, structureToAst, saveMigratedVersion, rakeDbCommands } from 'rake-db';
2
2
  export * from 'rake-db';
3
- import { toSnakeCase, deepCompare, toArray, addCode, codeToString, toCamelCase, toPascalCase, getImportPath, singleQuote, quoteObjectKey, pathToLog } from 'orchid-core';
3
+ import { toSnakeCase, deepCompare, emptyArray, toArray, addCode, codeToString, toCamelCase, toPascalCase, getImportPath, singleQuote, quoteObjectKey, pathToLog } from 'orchid-core';
4
4
  import { EnumColumn, ArrayColumn, DomainColumn, RawSQL, VirtualColumn, UnknownColumn, defaultSchemaConfig, columnsShapeToCode, pushTableDataCode, Adapter } from 'pqb';
5
5
  import path from 'node:path';
6
6
  import { pathToFileURL } from 'url';
@@ -618,10 +618,10 @@ const processDomains = async (ast, adapter, structureToAstCtx, domainsMap, dbStr
618
618
  typmod: -1
619
619
  }
620
620
  );
621
- if (domain.check) {
622
- dbColumn.data.check = {
623
- sql: new RawSQL([[domain.check]])
624
- };
621
+ if (domain.checks) {
622
+ dbColumn.data.checks = domain.checks.map((check) => ({
623
+ sql: new RawSQL([[check]])
624
+ }));
625
625
  }
626
626
  const dbDomain = makeComparableDomain(
627
627
  currentSchema,
@@ -632,13 +632,13 @@ const processDomains = async (ast, adapter, structureToAstCtx, domainsMap, dbStr
632
632
  const found = codeDomains.filter(
633
633
  (codeDomain) => deepCompare(dbDomain.compare, codeDomain.compare)
634
634
  );
635
- if ((domain.default || domain.check) && found.length) {
635
+ if ((domain.default || domain.checks?.length) && found.length) {
636
636
  for (const codeDomain of found) {
637
637
  holdCodeDomains.add(codeDomain);
638
638
  }
639
639
  const compare = [];
640
- pushCompare(compare, domain, found, "default");
641
- pushCompare(compare, domain, found, "check");
640
+ pushCompareDefault(compare, domain, found);
641
+ pushCompareChecks(compare, domain, found);
642
642
  const source = `(VALUES (NULL::${getColumnDbType(
643
643
  dbColumn,
644
644
  currentSchema
@@ -715,17 +715,16 @@ const makeComparableDomain = (currentSchema, schemaName, name, column) => {
715
715
  dateTimePrecision: inner.data.dateTimePrecision,
716
716
  collate: column.data.collate,
717
717
  hasDefault: column.data.default !== void 0,
718
- hasCheck: column.data.check !== void 0
718
+ hasChecks: !!column.data.checks?.length
719
719
  }
720
720
  };
721
721
  };
722
- const pushCompare = (compare, domain, found, key) => {
723
- const inDb = domain[key];
724
- if (inDb) {
722
+ const pushCompareDefault = (compare, domain, found) => {
723
+ if (domain.default) {
725
724
  compare.push({
726
- inDb,
725
+ inDb: domain.default,
727
726
  inCode: found.map((codeDomain) => {
728
- const value = codeDomain.column.data[key];
727
+ const value = codeDomain.column.data.default;
729
728
  if ("sql" in value) {
730
729
  return value.sql;
731
730
  }
@@ -734,6 +733,21 @@ const pushCompare = (compare, domain, found, key) => {
734
733
  });
735
734
  }
736
735
  };
736
+ const pushCompareChecks = (compare, domain, found) => {
737
+ if (domain.checks?.length) {
738
+ const inCode = found.flatMap(
739
+ (codeDomain) => codeDomain.column.data.checks?.map(
740
+ (check) => typeof check === "string" ? check : check.sql
741
+ ) || emptyArray
742
+ );
743
+ compare.push(
744
+ ...domain.checks.map((check) => ({
745
+ inDb: check,
746
+ inCode
747
+ }))
748
+ );
749
+ }
750
+ };
737
751
  const dropAst = (dbDomain) => ({
738
752
  type: "domain",
739
753
  action: "drop",
@@ -1619,12 +1633,12 @@ const processChecks = (ast, changeTableData, compareExpressions) => {
1619
1633
  if (!hasDbChecks) {
1620
1634
  if (codeChecks.length) {
1621
1635
  const constraints = add.constraints ?? (add.constraints = []);
1622
- for (const check of codeChecks) {
1623
- if (check.column && changeTableData.changingColumns[check.column]) {
1624
- const column = changeTableData.changingColumns[check.column];
1625
- column.to.data.check = check;
1626
- } else {
1627
- constraints.push({ check: check.sql, name: check.name });
1636
+ for (const codeCheck of codeChecks) {
1637
+ if (!codeCheck.column || !changeTableData.changingColumns[codeCheck.column]) {
1638
+ constraints.push({
1639
+ check: codeCheck.check.sql,
1640
+ name: codeCheck.name
1641
+ });
1628
1642
  }
1629
1643
  }
1630
1644
  }
@@ -1645,20 +1659,40 @@ const processChecks = (ast, changeTableData, compareExpressions) => {
1645
1659
  compare: [
1646
1660
  {
1647
1661
  inDb: dbCheck.expression,
1648
- inCode: codeChecks.map((check) => check.sql)
1662
+ inCode: codeChecks.map(({ check }) => check.sql)
1649
1663
  }
1650
1664
  ],
1651
1665
  handle(i) {
1652
- if (i !== void 0) return;
1653
- dropCheck(changeTableData, dbCheck, name);
1654
- if (--wait === 0 && !changeTableData.pushedAst) {
1666
+ if (i !== void 0) {
1667
+ foundCodeChecks.add(i);
1668
+ } else {
1669
+ dropCheck(changeTableData, dbCheck, name);
1670
+ }
1671
+ if (--wait !== 0) return;
1672
+ const checksToAdd = [];
1673
+ codeChecks.forEach((check, i2) => {
1674
+ if (foundCodeChecks.has(i2)) {
1675
+ if (!check.column) return;
1676
+ const change = changeTableData.changingColumns[check.column];
1677
+ if (!change) return;
1678
+ const columnChecks = change.to.data.checks;
1679
+ if (!columnChecks) return;
1680
+ const i3 = columnChecks.indexOf(check.check);
1681
+ if (i3 !== -1) {
1682
+ columnChecks.splice(i3, 1);
1683
+ }
1684
+ return;
1685
+ }
1686
+ checksToAdd.push({
1687
+ name: check.name,
1688
+ check: check.check.sql
1689
+ });
1690
+ });
1691
+ if (checksToAdd.length) {
1692
+ (add.constraints ?? (add.constraints = [])).push(...checksToAdd);
1693
+ }
1694
+ if (!changeTableData.pushedAst && (changeTableData.changeTableAst.drop.constraints?.length || add.constraints?.length)) {
1655
1695
  changeTableData.pushedAst = true;
1656
- (add.constraints ?? (add.constraints = [])).push(
1657
- ...codeChecks.filter((_, i2) => !foundCodeChecks.has(i2)).map((check) => ({
1658
- name: check.name,
1659
- check: check.sql
1660
- }))
1661
- );
1662
1696
  ast.push(changeTableData.changeTableAst);
1663
1697
  }
1664
1698
  }
@@ -1672,41 +1706,70 @@ const collectCodeChecks = ({
1672
1706
  codeTable,
1673
1707
  changeTableAst: { shape }
1674
1708
  }) => {
1709
+ const names = /* @__PURE__ */ new Set();
1675
1710
  const codeChecks = [];
1676
1711
  for (const key in codeTable.shape) {
1677
1712
  const column = codeTable.shape[key];
1678
- if (!column.data.check) continue;
1679
- const name = column.data.name ?? key;
1680
- if (checkForColumnAddOrDrop(shape, name)) continue;
1681
- codeChecks.push({
1682
- ...column.data.check,
1683
- column: name
1684
- });
1713
+ if (!column.data.checks) continue;
1714
+ const columnName = column.data.name ?? key;
1715
+ if (checkForColumnAddOrDrop(shape, columnName)) continue;
1716
+ const baseName = `${codeTable.table}_${columnName}_check`;
1717
+ codeChecks.push(
1718
+ ...column.data.checks.map((check) => {
1719
+ let name = check.name;
1720
+ if (!name) {
1721
+ name = baseName;
1722
+ let n = 0;
1723
+ while (names.has(name)) {
1724
+ name = baseName + ++n;
1725
+ }
1726
+ }
1727
+ names.add(name);
1728
+ return {
1729
+ check,
1730
+ name,
1731
+ column: columnName
1732
+ };
1733
+ })
1734
+ );
1685
1735
  }
1686
1736
  if (codeTable.internal.tableData.constraints) {
1687
1737
  for (const constraint of codeTable.internal.tableData.constraints) {
1688
1738
  const { check } = constraint;
1689
1739
  if (check) {
1690
- codeChecks.push({ sql: check, name: constraint.name });
1740
+ const baseName = `${codeTable.table}_check`;
1741
+ let name = constraint.name;
1742
+ if (!name) {
1743
+ name = baseName;
1744
+ let n = 0;
1745
+ while (names.has(name)) {
1746
+ name = baseName + ++n;
1747
+ }
1748
+ }
1749
+ names.add(name);
1750
+ codeChecks.push({
1751
+ check: { sql: check, name: constraint.name },
1752
+ name
1753
+ });
1691
1754
  }
1692
1755
  }
1693
1756
  }
1694
1757
  return codeChecks;
1695
1758
  };
1696
1759
  const dropCheck = ({ changeTableAst: { drop }, changingColumns }, dbCheck, name) => {
1697
- const constraints = drop.constraints ?? (drop.constraints = []);
1760
+ var _a;
1698
1761
  const sql = new RawSQL([
1699
1762
  [dbCheck.expression]
1700
1763
  ]);
1701
1764
  if (dbCheck.columns?.length === 1 && changingColumns[dbCheck.columns[0]]) {
1702
1765
  const column = changingColumns[dbCheck.columns[0]];
1703
1766
  column.from.data.name = "i_d";
1704
- column.from.data.check = {
1767
+ ((_a = column.from.data).checks ?? (_a.checks = [])).push({
1705
1768
  name,
1706
1769
  sql
1707
- };
1770
+ });
1708
1771
  } else {
1709
- constraints.push({
1772
+ (drop.constraints ?? (drop.constraints = [])).push({
1710
1773
  name,
1711
1774
  check: sql
1712
1775
  });
@@ -1920,7 +1983,7 @@ const addChangeTable = (dbStructure, changeTables, tableShapes, currentSchema, d
1920
1983
  const shape = {};
1921
1984
  const schema = codeTable.q.schema ?? currentSchema;
1922
1985
  changeTables.push({
1923
- codeTable,
1986
+ codeTable: cloneCodeTableForChange(codeTable),
1924
1987
  dbTable,
1925
1988
  dbTableData: getDbStructureTableData(dbStructure, dbTable),
1926
1989
  schema,
@@ -1938,6 +2001,19 @@ const addChangeTable = (dbStructure, changeTables, tableShapes, currentSchema, d
1938
2001
  });
1939
2002
  tableShapes[`${schema}.${codeTable.table}`] = shape;
1940
2003
  };
2004
+ const cloneCodeTableForChange = (codeTable) => ({
2005
+ ...codeTable,
2006
+ shape: Object.fromEntries(
2007
+ Object.entries(codeTable.shape).map(([key, column]) => {
2008
+ const cloned = Object.create(column);
2009
+ cloned.data = {
2010
+ ...cloned.data,
2011
+ checks: cloned.data.checks && [...cloned.data.checks]
2012
+ };
2013
+ return [key, cloned];
2014
+ })
2015
+ )
2016
+ });
1941
2017
  const createTableAst = (currentSchema, table) => {
1942
2018
  return {
1943
2019
  type: "table",
@@ -2106,8 +2182,8 @@ const report = (ast, config, currentSchema) => {
2106
2182
  if (column.data.foreignKeys) {
2107
2183
  counters["foreign key"] += column.data.foreignKeys.length;
2108
2184
  }
2109
- if (column.data.check) {
2110
- counters.check++;
2185
+ if (column.data.checks) {
2186
+ counters.check += column.data.checks.length;
2111
2187
  }
2112
2188
  }
2113
2189
  const summary = [];
@@ -2140,13 +2216,13 @@ const report = (ast, config, currentSchema) => {
2140
2216
  for (const change of changes) {
2141
2217
  if (change.type === "add" || change.type === "drop") {
2142
2218
  const column = change.item;
2143
- const { primaryKey, indexes, excludes, foreignKeys, check } = column.data;
2219
+ const { primaryKey, indexes, excludes, foreignKeys, checks } = column.data;
2144
2220
  inner.push(
2145
2221
  `${change.type === "add" ? green("+ add column") : red("- drop column")} ${key} ${column.data.alias ?? getColumnDbType(column, currentSchema)}${column.data.isNullable ? " nullable" : ""}${primaryKey ? " primary key" : ""}${foreignKeys ? ` references ${foreignKeys.map((fk) => {
2146
2222
  return `${fnOrTableToString(
2147
2223
  fk.fnOrTable
2148
2224
  )}(${fk.foreignColumns.join(", ")})`;
2149
- }).join(", ")}` : ""}${indexes?.length ? indexes.length === 1 ? ", has index" : `, has ${indexes.length} indexes` : ""}${excludes?.length ? excludes.length === 1 ? ", has exclude" : `, has ${excludes.length} excludes` : ""}${check ? `, checks ${check.sql.toSQL({ values: [] })}` : ""}`
2225
+ }).join(", ")}` : ""}${indexes?.length ? indexes.length === 1 ? ", has index" : `, has ${indexes.length} indexes` : ""}${excludes?.length ? excludes.length === 1 ? ", has exclude" : `, has ${excludes.length} excludes` : ""}${checks?.length ? `, checks ${checks.map((check) => check.sql.toSQL({ values: [] })).join(", ")}` : ""}`
2150
2226
  );
2151
2227
  } else if (change.type === "change") {
2152
2228
  const name = change.from.column?.data.name ?? key;