orchid-orm 1.37.12 → 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.
- package/dist/index.d.ts +7 -2
- package/dist/index.js +109 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +109 -11
- package/dist/index.mjs.map +1 -1
- package/dist/migrations.js +122 -46
- package/dist/migrations.js.map +1 -1
- package/dist/migrations.mjs +123 -47
- package/dist/migrations.mjs.map +1 -1
- package/package.json +5 -5
package/dist/migrations.mjs
CHANGED
|
@@ -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.
|
|
622
|
-
dbColumn.data.
|
|
623
|
-
sql: new RawSQL([[
|
|
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.
|
|
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
|
-
|
|
641
|
-
|
|
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
|
-
|
|
718
|
+
hasChecks: !!column.data.checks?.length
|
|
719
719
|
}
|
|
720
720
|
};
|
|
721
721
|
};
|
|
722
|
-
const
|
|
723
|
-
|
|
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
|
|
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
|
|
1623
|
-
if (
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
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)
|
|
1653
|
-
|
|
1654
|
-
|
|
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.
|
|
1679
|
-
const
|
|
1680
|
-
if (checkForColumnAddOrDrop(shape,
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
column
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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,
|
|
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` : ""}${
|
|
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;
|