@smartive/graphql-magic 23.13.0 → 23.14.0-next.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/CHANGELOG.md +2 -2
- package/dist/bin/gqm.cjs +65 -55
- package/dist/cjs/index.cjs +3079 -3069
- package/dist/esm/migrations/generate.d.ts +2 -0
- package/dist/esm/migrations/generate.js +40 -43
- package/dist/esm/migrations/generate.js.map +1 -1
- package/package.json +1 -1
- package/src/migrations/generate.ts +56 -56
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
## [23.
|
|
1
|
+
## [23.14.0-next.1](https://github.com/smartive/graphql-magic/compare/v23.13.0...v23.14.0-next.1) (2026-04-01)
|
|
2
2
|
|
|
3
3
|
### Features
|
|
4
4
|
|
|
5
|
-
*
|
|
5
|
+
* Disable null constraints on revisions table ([8b2c179](https://github.com/smartive/graphql-magic/commit/8b2c1794500824bbf3a9f61ede28bb36995d5344))
|
package/dist/bin/gqm.cjs
CHANGED
|
@@ -903,21 +903,6 @@ var import_code_block_writer2 = __toESM(require("code-block-writer"), 1);
|
|
|
903
903
|
var import_knex_schema_inspector = require("knex-schema-inspector");
|
|
904
904
|
var import_lowerFirst = __toESM(require("lodash/lowerFirst"), 1);
|
|
905
905
|
|
|
906
|
-
// src/resolvers/arguments.ts
|
|
907
|
-
var import_graphql3 = require("graphql");
|
|
908
|
-
|
|
909
|
-
// src/resolvers/utils.ts
|
|
910
|
-
var import_graphql4 = require("graphql");
|
|
911
|
-
var import_isEqual = __toESM(require("lodash/isEqual"), 1);
|
|
912
|
-
var getColumnName = (field) => field.kind === "relation" ? field.foreignKey || `${field.name}Id` : field.name;
|
|
913
|
-
|
|
914
|
-
// src/resolvers/resolver.ts
|
|
915
|
-
var import_cloneDeep2 = __toESM(require("lodash/cloneDeep"), 1);
|
|
916
|
-
var import_flatMap = __toESM(require("lodash/flatMap"), 1);
|
|
917
|
-
|
|
918
|
-
// src/resolvers/resolvers.ts
|
|
919
|
-
var import_graphql5 = require("graphql");
|
|
920
|
-
|
|
921
906
|
// src/migrations/update-functions.ts
|
|
922
907
|
var normalizeWhitespace = (str) => {
|
|
923
908
|
return str.replace(/\s+/g, " ").replace(/\s*\(\s*/g, "(").replace(/\s*\)\s*/g, ")").replace(/\s*,\s*/g, ",").replace(/\s*;\s*/g, ";").trim();
|
|
@@ -1644,24 +1629,28 @@ var MigrationGenerator = class _MigrationGenerator {
|
|
|
1644
1629
|
});
|
|
1645
1630
|
if (isUpdatableModel(model)) {
|
|
1646
1631
|
const updatableFields = fields2.filter(and(isUpdatableField, isStoredInDatabase));
|
|
1647
|
-
|
|
1632
|
+
const revisionFieldsNeedingAlter = updatableFields.filter((field) => this.revisionFieldNeedsSchemaAlter(model, field));
|
|
1633
|
+
if (!revisionFieldsNeedingAlter.length) {
|
|
1648
1634
|
return;
|
|
1649
1635
|
}
|
|
1650
1636
|
up.push(() => {
|
|
1651
1637
|
this.alterTable(`${model.name}Revision`, () => {
|
|
1652
|
-
for (const [index, field] of
|
|
1653
|
-
this.columnRaw(field, { alter: true }, index);
|
|
1638
|
+
for (const [index, field] of revisionFieldsNeedingAlter.entries()) {
|
|
1639
|
+
this.columnRaw(field, { alter: true, setNonNull: false }, index);
|
|
1654
1640
|
}
|
|
1655
1641
|
});
|
|
1656
1642
|
});
|
|
1657
1643
|
down.push(() => {
|
|
1658
1644
|
this.alterTable(`${model.name}Revision`, () => {
|
|
1659
|
-
for (const [index, field] of
|
|
1645
|
+
for (const [index, field] of revisionFieldsNeedingAlter.entries()) {
|
|
1660
1646
|
this.columnRaw(
|
|
1661
1647
|
field,
|
|
1662
|
-
{ alter: true },
|
|
1648
|
+
{ alter: true, setNonNull: false },
|
|
1663
1649
|
index,
|
|
1664
|
-
summonByName(
|
|
1650
|
+
summonByName(
|
|
1651
|
+
this.columns[`${model.name}Revision`],
|
|
1652
|
+
field.kind === "relation" ? `${field.name}Id` : field.name
|
|
1653
|
+
)
|
|
1665
1654
|
);
|
|
1666
1655
|
}
|
|
1667
1656
|
});
|
|
@@ -1692,23 +1681,27 @@ var MigrationGenerator = class _MigrationGenerator {
|
|
|
1692
1681
|
});
|
|
1693
1682
|
if (isUpdatableModel(model)) {
|
|
1694
1683
|
const updatableFields = fields2.filter(and(isUpdatableField, isStoredInDatabase));
|
|
1695
|
-
|
|
1684
|
+
const revisionFieldsNeedingAlter = updatableFields.filter((field) => this.revisionFieldNeedsSchemaAlter(model, field));
|
|
1685
|
+
if (!revisionFieldsNeedingAlter.length) {
|
|
1696
1686
|
return;
|
|
1697
1687
|
}
|
|
1698
1688
|
up.push(() => {
|
|
1699
1689
|
this.alterTable(`${model.name}Revision`, () => {
|
|
1700
|
-
for (const field of
|
|
1701
|
-
this.column(field, { alter: true });
|
|
1690
|
+
for (const field of revisionFieldsNeedingAlter) {
|
|
1691
|
+
this.column(field, { alter: true, setUnique: false, setNonNull: false, foreign: false });
|
|
1702
1692
|
}
|
|
1703
1693
|
});
|
|
1704
1694
|
});
|
|
1705
1695
|
down.push(() => {
|
|
1706
1696
|
this.alterTable(`${model.name}Revision`, () => {
|
|
1707
|
-
for (const field of
|
|
1697
|
+
for (const field of revisionFieldsNeedingAlter) {
|
|
1708
1698
|
this.column(
|
|
1709
1699
|
field,
|
|
1710
|
-
{ alter: true },
|
|
1711
|
-
summonByName(
|
|
1700
|
+
{ alter: true, setUnique: false, setNonNull: false, foreign: false },
|
|
1701
|
+
summonByName(
|
|
1702
|
+
this.columns[`${model.name}Revision`],
|
|
1703
|
+
field.kind === "relation" ? `${field.name}Id` : field.name
|
|
1704
|
+
)
|
|
1712
1705
|
);
|
|
1713
1706
|
}
|
|
1714
1707
|
});
|
|
@@ -1730,7 +1723,7 @@ var MigrationGenerator = class _MigrationGenerator {
|
|
|
1730
1723
|
}
|
|
1731
1724
|
}
|
|
1732
1725
|
for (const field of model.fields.filter(and(isUpdatableField, not(isInherited), isStoredInDatabase))) {
|
|
1733
|
-
this.column(field, { setUnique: false, setDefault: false });
|
|
1726
|
+
this.column(field, { setUnique: false, setDefault: false, setNonNull: false, foreign: false });
|
|
1734
1727
|
}
|
|
1735
1728
|
});
|
|
1736
1729
|
}
|
|
@@ -1740,30 +1733,9 @@ var MigrationGenerator = class _MigrationGenerator {
|
|
|
1740
1733
|
up.push(() => {
|
|
1741
1734
|
this.alterTable(revisionTable, () => {
|
|
1742
1735
|
for (const field of missingRevisionFields) {
|
|
1743
|
-
this.column(field, { setUnique: false, setNonNull: false, setDefault: false });
|
|
1736
|
+
this.column(field, { setUnique: false, setNonNull: false, setDefault: false, foreign: false });
|
|
1744
1737
|
}
|
|
1745
1738
|
});
|
|
1746
|
-
const revisionFieldsWithDataToCopy = missingRevisionFields.filter(
|
|
1747
|
-
(field) => this.columns[model.name].find((col) => col.name === getColumnName(field)) || field.defaultValue !== void 0 || field.nonNull
|
|
1748
|
-
);
|
|
1749
|
-
if (revisionFieldsWithDataToCopy.length) {
|
|
1750
|
-
this.writer.write(`await knex('${model.name}Revision').update(`).inlineBlock(() => {
|
|
1751
|
-
for (const { name: name2, kind: type } of revisionFieldsWithDataToCopy) {
|
|
1752
|
-
const col = type === "relation" ? `${name2}Id` : name2;
|
|
1753
|
-
this.writer.write(
|
|
1754
|
-
`${col}: knex.raw('(select "${col}" from "${model.name}" where "${model.name}".id = "${model.name}Revision"."${typeToField(model.name)}Id")'),`
|
|
1755
|
-
).newLine();
|
|
1756
|
-
}
|
|
1757
|
-
}).write(");").newLine().blankLine();
|
|
1758
|
-
}
|
|
1759
|
-
const nonNullableMissingRevisionFields = missingRevisionFields.filter(({ nonNull: nonNull2 }) => nonNull2);
|
|
1760
|
-
if (nonNullableMissingRevisionFields.length) {
|
|
1761
|
-
this.alterTable(revisionTable, () => {
|
|
1762
|
-
for (const field of nonNullableMissingRevisionFields) {
|
|
1763
|
-
this.column(field, { setUnique: false, setDefault: false, alter: true });
|
|
1764
|
-
}
|
|
1765
|
-
});
|
|
1766
|
-
}
|
|
1767
1739
|
});
|
|
1768
1740
|
down.push(() => {
|
|
1769
1741
|
this.alterTable(revisionTable, () => {
|
|
@@ -2349,21 +2321,27 @@ var MigrationGenerator = class _MigrationGenerator {
|
|
|
2349
2321
|
return this.columns[tableName].find((col) => col.name === columnName);
|
|
2350
2322
|
}
|
|
2351
2323
|
hasChanged(model, field) {
|
|
2324
|
+
return this.hasChangedOnTable(model.name, field, { respectNullability: true });
|
|
2325
|
+
}
|
|
2326
|
+
hasChangedOnTable(tableName, field, { respectNullability }) {
|
|
2352
2327
|
if (field.generateAs?.type === "expression") {
|
|
2353
2328
|
return false;
|
|
2354
2329
|
}
|
|
2355
|
-
const col = this.getColumn(
|
|
2330
|
+
const col = this.getColumn(tableName, field.kind === "relation" ? `${field.name}Id` : field.name);
|
|
2356
2331
|
if (!col) {
|
|
2357
2332
|
return false;
|
|
2358
2333
|
}
|
|
2359
2334
|
if (field.generateAs) {
|
|
2360
2335
|
if (col.generation_expression !== field.generateAs.expression) {
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2336
|
+
if (respectNullability) {
|
|
2337
|
+
throw new Error(
|
|
2338
|
+
`Column ${col.name} has specific type ${col.generation_expression} but expected ${field.generateAs.expression}`
|
|
2339
|
+
);
|
|
2340
|
+
}
|
|
2341
|
+
return true;
|
|
2364
2342
|
}
|
|
2365
2343
|
}
|
|
2366
|
-
if (!field.nonNull && !col.is_nullable || field.nonNull && col.is_nullable) {
|
|
2344
|
+
if (respectNullability && (!field.nonNull && !col.is_nullable || field.nonNull && col.is_nullable)) {
|
|
2367
2345
|
return true;
|
|
2368
2346
|
}
|
|
2369
2347
|
if (!field.kind || field.kind === "primitive") {
|
|
@@ -2406,6 +2384,23 @@ var MigrationGenerator = class _MigrationGenerator {
|
|
|
2406
2384
|
}
|
|
2407
2385
|
return false;
|
|
2408
2386
|
}
|
|
2387
|
+
revisionFieldNeedsSchemaAlter(model, field) {
|
|
2388
|
+
if (field.generateAs?.type === "expression") {
|
|
2389
|
+
return false;
|
|
2390
|
+
}
|
|
2391
|
+
const tableName = `${model.name}Revision`;
|
|
2392
|
+
const colName = field.kind === "relation" ? `${field.name}Id` : field.name;
|
|
2393
|
+
const revCol = this.getColumn(tableName, colName);
|
|
2394
|
+
if (!revCol) {
|
|
2395
|
+
return false;
|
|
2396
|
+
}
|
|
2397
|
+
if (field.generateAs) {
|
|
2398
|
+
if (revCol.generation_expression !== field.generateAs.expression) {
|
|
2399
|
+
return true;
|
|
2400
|
+
}
|
|
2401
|
+
}
|
|
2402
|
+
return this.hasChangedOnTable(tableName, field, { respectNullability: false });
|
|
2403
|
+
}
|
|
2409
2404
|
async handleFunctions(up, down) {
|
|
2410
2405
|
if (!this.parsedFunctions || this.parsedFunctions.length === 0) {
|
|
2411
2406
|
return;
|
|
@@ -2488,9 +2483,24 @@ var getMigrationDate = () => {
|
|
|
2488
2483
|
return `${year}${month}${day}${hours}${minutes}${seconds}`;
|
|
2489
2484
|
};
|
|
2490
2485
|
|
|
2486
|
+
// src/resolvers/utils.ts
|
|
2487
|
+
var import_graphql3 = require("graphql");
|
|
2488
|
+
var import_isEqual = __toESM(require("lodash/isEqual"), 1);
|
|
2489
|
+
var getColumnName = (field) => field.kind === "relation" ? field.foreignKey || `${field.name}Id` : field.name;
|
|
2490
|
+
|
|
2491
2491
|
// src/permissions/generate.ts
|
|
2492
2492
|
var ACTIONS = ["READ", "CREATE", "UPDATE", "DELETE", "RESTORE", "LINK"];
|
|
2493
2493
|
|
|
2494
|
+
// src/resolvers/arguments.ts
|
|
2495
|
+
var import_graphql4 = require("graphql");
|
|
2496
|
+
|
|
2497
|
+
// src/resolvers/resolver.ts
|
|
2498
|
+
var import_cloneDeep2 = __toESM(require("lodash/cloneDeep"), 1);
|
|
2499
|
+
var import_flatMap = __toESM(require("lodash/flatMap"), 1);
|
|
2500
|
+
|
|
2501
|
+
// src/resolvers/resolvers.ts
|
|
2502
|
+
var import_graphql5 = require("graphql");
|
|
2503
|
+
|
|
2494
2504
|
// src/schema/generate.ts
|
|
2495
2505
|
var import_graphql7 = require("graphql");
|
|
2496
2506
|
|