@smartive/graphql-magic 23.13.0-next.1 → 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 CHANGED
@@ -1,5 +1,5 @@
1
- ## [23.13.0-next.1](https://github.com/smartive/graphql-magic/compare/v23.12.0...v23.13.0-next.1) (2026-04-01)
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
- * Allow filters to be mandatory ([c8dce7e](https://github.com/smartive/graphql-magic/commit/c8dce7e6da2a673dbce1c67783a43ce11f8b4137))
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
- if (!updatableFields.length) {
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 updatableFields.entries()) {
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 updatableFields.entries()) {
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(this.columns[model.name], field.kind === "relation" ? `${field.name}Id` : field.name)
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
- if (!updatableFields.length) {
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 updatableFields) {
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 updatableFields) {
1697
+ for (const field of revisionFieldsNeedingAlter) {
1708
1698
  this.column(
1709
1699
  field,
1710
- { alter: true },
1711
- summonByName(this.columns[model.name], field.kind === "relation" ? `${field.name}Id` : field.name)
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(model.name, field.kind === "relation" ? `${field.name}Id` : field.name);
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
- throw new Error(
2362
- `Column ${col.name} has specific type ${col.generation_expression} but expected ${field.generateAs.expression}`
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