@smartive/graphql-magic 23.11.0-next.1 → 23.12.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.
Files changed (40) hide show
  1. package/CHANGELOG.md +3 -2
  2. package/dist/bin/gqm.cjs +87 -51
  3. package/dist/cjs/index.cjs +142 -69
  4. package/dist/esm/client/mutations.js +30 -4
  5. package/dist/esm/client/mutations.js.map +1 -1
  6. package/dist/esm/db/generate.d.ts +1 -0
  7. package/dist/esm/db/generate.js +1 -0
  8. package/dist/esm/db/generate.js.map +1 -1
  9. package/dist/esm/migrations/generate.js +10 -7
  10. package/dist/esm/migrations/generate.js.map +1 -1
  11. package/dist/esm/models/model-definitions.d.ts +7 -0
  12. package/dist/esm/models/models.d.ts +4 -1
  13. package/dist/esm/models/models.js +3 -0
  14. package/dist/esm/models/models.js.map +1 -1
  15. package/dist/esm/models/mutation-hook.d.ts +1 -3
  16. package/dist/esm/resolvers/mutations.d.ts +18 -6
  17. package/dist/esm/resolvers/mutations.js +22 -14
  18. package/dist/esm/resolvers/mutations.js.map +1 -1
  19. package/dist/esm/resolvers/resolvers.js +37 -0
  20. package/dist/esm/resolvers/resolvers.js.map +1 -1
  21. package/dist/esm/schema/generate.js +2 -0
  22. package/dist/esm/schema/generate.js.map +1 -1
  23. package/docs/docs/3-fields.md +3 -0
  24. package/migrations/20230912185644_setup.ts +2 -0
  25. package/package.json +5 -5
  26. package/src/bin/gqm/codegen.ts +2 -0
  27. package/src/client/mutations.ts +35 -4
  28. package/src/db/generate.ts +1 -0
  29. package/src/migrations/generate.ts +16 -15
  30. package/src/models/model-definitions.ts +4 -0
  31. package/src/models/models.ts +8 -0
  32. package/src/models/mutation-hook.ts +1 -1
  33. package/src/resolvers/mutations.ts +33 -12
  34. package/src/resolvers/resolvers.ts +44 -0
  35. package/src/schema/generate.ts +2 -0
  36. package/tests/api/__snapshots__/query.spec.ts.snap +19 -0
  37. package/tests/api/query.spec.ts +17 -0
  38. package/tests/unit/__snapshots__/resolve.spec.ts.snap +1 -0
  39. package/tests/utils/database/seed.ts +5 -2
  40. package/tests/utils/models.ts +6 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,6 @@
1
- ## [23.11.0-next.1](https://github.com/smartive/graphql-magic/compare/v23.10.0...v23.11.0-next.1) (2026-03-16)
1
+ ## [23.12.0-next.1](https://github.com/smartive/graphql-magic/compare/v23.11.0...v23.12.0-next.1) (2026-03-31)
2
2
 
3
3
  ### Features
4
4
 
5
- * Enable mutation args ([6f67ed4](https://github.com/smartive/graphql-magic/commit/6f67ed48eb539c52c7374078b72ff6cdf9fe6f2c))
5
+ * add field type time ([223adf4](https://github.com/smartive/graphql-magic/commit/223adf482c523266a194630b1dc5eda3d7d8b850))
6
+ * add time type ([33adeec](https://github.com/smartive/graphql-magic/commit/33adeec46751f8ca29770b47d8d0ddfb2ce526bb))
package/dist/bin/gqm.cjs CHANGED
@@ -41,47 +41,65 @@ var import_graphql = require("graphql");
41
41
  // src/client/mutations.ts
42
42
  var import_upperCase = __toESM(require("lodash/upperCase"), 1);
43
43
  var constantCase = (str) => (0, import_upperCase.default)(str).replace(/ /g, "_");
44
+ var argTypeStr = (field) => {
45
+ const base = field.list ? `[${field.type}!]` : field.type;
46
+ return field.nonNull ? `${base}!` : base;
47
+ };
48
+ var argsToVariables = (args2) => args2.map((a) => `$${a.name}: ${argTypeStr(a)}`).join(", ");
49
+ var argsToMutationArgs = (args2) => args2.map((a) => `${a.name}: $${a.name}`).join(", ");
44
50
  var generateMutations = (models) => {
45
51
  const parts = [];
46
52
  for (const { name: name2, creatable, updatable, deletable } of models.entities.filter(not(isRootModel))) {
47
53
  if (creatable) {
54
+ const extraArgs = creatable !== true && creatable.args ? creatable.args : [];
55
+ const variables = extraArgs.length ? `$data: Create${name2}!, ${argsToVariables(extraArgs)}` : `$data: Create${name2}!`;
56
+ const mutationArgs = extraArgs.length ? `data: $data, ${argsToMutationArgs(extraArgs)}` : `data: $data`;
48
57
  parts.push(
49
58
  `export const CREATE_${constantCase(
50
59
  name2
51
60
  )} = gql\`
52
- mutation Create${name2}Mutation($data: Create${name2}!) {
53
- create${name2}(data: $data) { id }
61
+ mutation Create${name2}Mutation(${variables}) {
62
+ create${name2}(${mutationArgs}) { id }
54
63
  }
55
64
  \`;`
56
65
  );
57
66
  }
58
67
  if (updatable) {
68
+ const extraArgs = updatable !== true && updatable.args ? updatable.args : [];
69
+ const variables = extraArgs.length ? `$id: ID!, $data: Update${name2}!, ${argsToVariables(extraArgs)}` : `$id: ID!, $data: Update${name2}!`;
70
+ const mutationArgs = extraArgs.length ? `where: { id: $id }, data: $data, ${argsToMutationArgs(extraArgs)}` : `where: { id: $id }, data: $data`;
59
71
  parts.push(
60
72
  `export const UPDATE_${constantCase(
61
73
  name2
62
74
  )} = gql\`
63
- mutation Update${name2}Mutation($id: ID!, $data: Update${name2}!) {
64
- update${name2}(where: { id: $id }, data: $data) { id }
75
+ mutation Update${name2}Mutation(${variables}) {
76
+ update${name2}(${mutationArgs}) { id }
65
77
  }
66
78
  \`;`
67
79
  );
68
80
  }
69
81
  if (deletable) {
82
+ const deleteExtraArgs = deletable !== true && deletable.args ? deletable.args : [];
83
+ const deleteVariables = deleteExtraArgs.length ? `$id: ID!, ${argsToVariables(deleteExtraArgs)}` : `$id: ID!`;
84
+ const deleteMutationArgs = deleteExtraArgs.length ? `where: { id: $id }, ${argsToMutationArgs(deleteExtraArgs)}` : `where: { id: $id }`;
70
85
  parts.push(
71
86
  `export const DELETE_${constantCase(
72
87
  name2
73
88
  )} = gql\`
74
- mutation Delete${name2}Mutation($id: ID!) {
75
- delete${name2}(where: { id: $id })
89
+ mutation Delete${name2}Mutation(${deleteVariables}) {
90
+ delete${name2}(${deleteMutationArgs})
76
91
  }
77
92
  \`;`
78
93
  );
94
+ const restoreExtraArgs = deletable !== true && deletable.restoreArgs ? deletable.restoreArgs : [];
95
+ const restoreVariables = restoreExtraArgs.length ? `$id: ID!, ${argsToVariables(restoreExtraArgs)}` : `$id: ID!`;
96
+ const restoreMutationArgs = restoreExtraArgs.length ? `where: { id: $id }, ${argsToMutationArgs(restoreExtraArgs)}` : `where: { id: $id }`;
79
97
  parts.push(
80
98
  `export const RESTORE_${constantCase(
81
99
  name2
82
100
  )} = gql\`
83
- mutation Restore${name2}Mutation($id: ID!) {
84
- restore${name2}(where: { id: $id })
101
+ mutation Restore${name2}Mutation(${restoreVariables}) {
102
+ restore${name2}(${restoreMutationArgs})
85
103
  }
86
104
  \`;`
87
105
  );
@@ -122,6 +140,10 @@ var Models = class {
122
140
  kind: "scalar",
123
141
  name: "DateTime"
124
142
  },
143
+ {
144
+ kind: "scalar",
145
+ name: "Time"
146
+ },
125
147
  { kind: "scalar", name: "Upload" },
126
148
  {
127
149
  kind: "raw-enum",
@@ -682,7 +704,8 @@ var PRIMITIVE_TYPES = {
682
704
  Upload: "string",
683
705
  Int: "number",
684
706
  Float: "number",
685
- String: "string"
707
+ String: "string",
708
+ Time: "string"
686
709
  };
687
710
  var OPTIONAL_SEED_FIELDS = ["createdAt", "createdById", "updatedAt", "updatedById", "deletedAt", "deletedById"];
688
711
  var generateDBModels = (models, dateLibrary) => {
@@ -886,6 +909,9 @@ var getColumnName = (field) => field.kind === "relation" ? field.foreignKey || `
886
909
  var import_cloneDeep2 = __toESM(require("lodash/cloneDeep"), 1);
887
910
  var import_flatMap = __toESM(require("lodash/flatMap"), 1);
888
911
 
912
+ // src/resolvers/resolvers.ts
913
+ var import_graphql5 = require("graphql");
914
+
889
915
  // src/migrations/update-functions.ts
890
916
  var normalizeWhitespace = (str) => {
891
917
  return str.replace(/\s+/g, " ").replace(/\s*\(\s*/g, "(").replace(/\s*\)\s*/g, ")").replace(/\s*,\s*/g, ",").replace(/\s*;\s*/g, ";").trim();
@@ -1884,11 +1910,7 @@ var MigrationGenerator = class _MigrationGenerator {
1884
1910
  }
1885
1911
  return -1;
1886
1912
  }
1887
- static TRIGGER_EVENT_ORDER = [
1888
- "INSERT",
1889
- "UPDATE",
1890
- "DELETE"
1891
- ];
1913
+ static TRIGGER_EVENT_ORDER = ["INSERT", "UPDATE", "DELETE"];
1892
1914
  static sortTriggerEvents(events) {
1893
1915
  return [...events].sort(
1894
1916
  (a, b) => _MigrationGenerator.TRIGGER_EVENT_ORDER.indexOf(a) - _MigrationGenerator.TRIGGER_EVENT_ORDER.indexOf(b)
@@ -1896,7 +1918,9 @@ var MigrationGenerator = class _MigrationGenerator {
1896
1918
  }
1897
1919
  normalizeTriggerDef(def) {
1898
1920
  let s = def.replace(/\s+/g, " ").replace(/\s*\(\s*/g, "(").replace(/\s*\)\s*/g, ")").replace(/\bON\s+[a-zA-Z_][a-zA-Z0-9_]*\./gi, "ON ").trim();
1899
- const eventsMatch = s.match(/\b(AFTER|BEFORE)\s+((?:INSERT|UPDATE|DELETE)(?:\s+OR\s+(?:INSERT|UPDATE|DELETE))+)\s+ON\b/i);
1921
+ const eventsMatch = s.match(
1922
+ /\b(AFTER|BEFORE)\s+((?:INSERT|UPDATE|DELETE)(?:\s+OR\s+(?:INSERT|UPDATE|DELETE))+)\s+ON\b/i
1923
+ );
1900
1924
  if (eventsMatch) {
1901
1925
  const events = eventsMatch[2].split(/\s+OR\s+/).map((e) => e.toUpperCase());
1902
1926
  const sorted = [...events].sort(
@@ -2273,6 +2297,9 @@ var MigrationGenerator = class _MigrationGenerator {
2273
2297
  case "DateTime":
2274
2298
  col(`table.timestamp('${name2}')`);
2275
2299
  break;
2300
+ case "Time":
2301
+ col(`table.specificType('${name2}', 'time without time zone')`);
2302
+ break;
2276
2303
  case "ID":
2277
2304
  col(`table.uuid('${name2}')`);
2278
2305
  break;
@@ -2365,6 +2392,11 @@ var MigrationGenerator = class _MigrationGenerator {
2365
2392
  return true;
2366
2393
  }
2367
2394
  }
2395
+ if (field.type === "Time") {
2396
+ if (!["time without time zone", "time"].includes(col.data_type)) {
2397
+ return true;
2398
+ }
2399
+ }
2368
2400
  }
2369
2401
  return false;
2370
2402
  }
@@ -2454,48 +2486,48 @@ var getMigrationDate = () => {
2454
2486
  var ACTIONS = ["READ", "CREATE", "UPDATE", "DELETE", "RESTORE", "LINK"];
2455
2487
 
2456
2488
  // src/schema/generate.ts
2457
- var import_graphql6 = require("graphql");
2489
+ var import_graphql7 = require("graphql");
2458
2490
 
2459
2491
  // src/schema/utils.ts
2460
2492
  var import_dayjs2 = require("dayjs");
2461
- var import_graphql5 = require("graphql");
2493
+ var import_graphql6 = require("graphql");
2462
2494
  var import_luxon2 = require("luxon");
2463
2495
  var document = (definitions) => ({
2464
- kind: import_graphql5.Kind.DOCUMENT,
2496
+ kind: import_graphql6.Kind.DOCUMENT,
2465
2497
  definitions
2466
2498
  });
2467
2499
  var scalar = (nme) => ({
2468
2500
  name: name(nme),
2469
- kind: import_graphql5.Kind.SCALAR_TYPE_DEFINITION
2501
+ kind: import_graphql6.Kind.SCALAR_TYPE_DEFINITION
2470
2502
  });
2471
2503
  var input = (nme, fields2, dvs) => ({
2472
2504
  name: name(nme),
2473
2505
  fields: inputValues(fields2),
2474
- kind: import_graphql5.Kind.INPUT_OBJECT_TYPE_DEFINITION,
2506
+ kind: import_graphql6.Kind.INPUT_OBJECT_TYPE_DEFINITION,
2475
2507
  directives: directives(dvs)
2476
2508
  });
2477
2509
  var union = (nme, types) => ({
2478
2510
  name: name(nme),
2479
- kind: import_graphql5.Kind.UNION_TYPE_DEFINITION,
2511
+ kind: import_graphql6.Kind.UNION_TYPE_DEFINITION,
2480
2512
  types: types.map((t) => namedType(t))
2481
2513
  });
2482
2514
  var object = (nme, fds, interfaces, dvs) => ({
2483
2515
  name: name(nme),
2484
2516
  fields: fields(fds),
2485
- kind: import_graphql5.Kind.OBJECT_TYPE_DEFINITION,
2517
+ kind: import_graphql6.Kind.OBJECT_TYPE_DEFINITION,
2486
2518
  interfaces: interfaces?.map((i) => namedType(i)),
2487
2519
  directives: directives(dvs)
2488
2520
  });
2489
2521
  var iface = (nme, fds, interfaces, dvs) => ({
2490
2522
  name: name(nme),
2491
2523
  fields: fields(fds),
2492
- kind: import_graphql5.Kind.INTERFACE_TYPE_DEFINITION,
2524
+ kind: import_graphql6.Kind.INTERFACE_TYPE_DEFINITION,
2493
2525
  interfaces: interfaces?.map((i) => namedType(i)),
2494
2526
  directives: directives(dvs)
2495
2527
  });
2496
2528
  var inputValues = (fields2) => fields2.map(
2497
2529
  (field) => ({
2498
- kind: import_graphql5.Kind.INPUT_VALUE_DEFINITION,
2530
+ kind: import_graphql6.Kind.INPUT_VALUE_DEFINITION,
2499
2531
  name: name(field.name),
2500
2532
  type: fieldType(field),
2501
2533
  defaultValue: field.defaultValue === void 0 ? void 0 : value(field.defaultValue),
@@ -2504,11 +2536,11 @@ var inputValues = (fields2) => fields2.map(
2504
2536
  );
2505
2537
  var fields = (fields2) => fields2.map(
2506
2538
  (field) => ({
2507
- kind: import_graphql5.Kind.FIELD_DEFINITION,
2539
+ kind: import_graphql6.Kind.FIELD_DEFINITION,
2508
2540
  name: name(field.name),
2509
2541
  type: fieldType(field),
2510
2542
  arguments: field.args?.map((arg) => ({
2511
- kind: import_graphql5.Kind.INPUT_VALUE_DEFINITION,
2543
+ kind: import_graphql6.Kind.INPUT_VALUE_DEFINITION,
2512
2544
  name: name(arg.name),
2513
2545
  type: fieldType(arg),
2514
2546
  defaultValue: arg.defaultValue === void 0 ? void 0 : value(arg.defaultValue)
@@ -2518,42 +2550,42 @@ var fields = (fields2) => fields2.map(
2518
2550
  );
2519
2551
  var directives = (directives2) => directives2?.map(
2520
2552
  (directive) => ({
2521
- kind: import_graphql5.Kind.DIRECTIVE,
2553
+ kind: import_graphql6.Kind.DIRECTIVE,
2522
2554
  name: name(directive.name),
2523
2555
  arguments: args(directive.values)
2524
2556
  })
2525
2557
  );
2526
2558
  var args = (ags) => ags?.map(
2527
2559
  (argument) => ({
2528
- kind: import_graphql5.Kind.ARGUMENT,
2560
+ kind: import_graphql6.Kind.ARGUMENT,
2529
2561
  name: name(argument.name),
2530
2562
  value: value(argument.values)
2531
2563
  })
2532
2564
  );
2533
2565
  var enm = (nme, values) => ({
2534
2566
  name: name(nme),
2535
- kind: import_graphql5.Kind.ENUM_TYPE_DEFINITION,
2567
+ kind: import_graphql6.Kind.ENUM_TYPE_DEFINITION,
2536
2568
  values: values.map(
2537
2569
  (v) => ({
2538
- kind: import_graphql5.Kind.ENUM_VALUE_DEFINITION,
2570
+ kind: import_graphql6.Kind.ENUM_VALUE_DEFINITION,
2539
2571
  name: name(v)
2540
2572
  })
2541
2573
  )
2542
2574
  });
2543
2575
  var nonNull = (type) => ({
2544
2576
  type,
2545
- kind: import_graphql5.Kind.NON_NULL_TYPE
2577
+ kind: import_graphql6.Kind.NON_NULL_TYPE
2546
2578
  });
2547
2579
  var namedType = (nme) => ({
2548
- kind: import_graphql5.Kind.NAMED_TYPE,
2580
+ kind: import_graphql6.Kind.NAMED_TYPE,
2549
2581
  name: name(nme)
2550
2582
  });
2551
2583
  var list = (type) => ({
2552
2584
  type,
2553
- kind: import_graphql5.Kind.LIST_TYPE
2585
+ kind: import_graphql6.Kind.LIST_TYPE
2554
2586
  });
2555
2587
  var name = (name2) => ({
2556
- kind: import_graphql5.Kind.NAME,
2588
+ kind: import_graphql6.Kind.NAME,
2557
2589
  value: name2
2558
2590
  });
2559
2591
  var fieldType = (field) => {
@@ -2567,33 +2599,33 @@ var fieldType = (field) => {
2567
2599
  return type;
2568
2600
  };
2569
2601
  var value = (val = null) => val === null ? {
2570
- kind: import_graphql5.Kind.NULL
2602
+ kind: import_graphql6.Kind.NULL
2571
2603
  } : typeof val === "boolean" ? {
2572
- kind: import_graphql5.Kind.BOOLEAN,
2604
+ kind: import_graphql6.Kind.BOOLEAN,
2573
2605
  value: val
2574
2606
  } : typeof val === "number" ? {
2575
- kind: import_graphql5.Kind.INT,
2607
+ kind: import_graphql6.Kind.INT,
2576
2608
  value: `${val}`
2577
2609
  } : typeof val === "string" ? {
2578
- kind: import_graphql5.Kind.STRING,
2610
+ kind: import_graphql6.Kind.STRING,
2579
2611
  value: val
2580
2612
  } : val instanceof Symbol ? {
2581
- kind: import_graphql5.Kind.ENUM,
2613
+ kind: import_graphql6.Kind.ENUM,
2582
2614
  value: val.description
2583
2615
  } : Array.isArray(val) ? {
2584
- kind: import_graphql5.Kind.LIST,
2616
+ kind: import_graphql6.Kind.LIST,
2585
2617
  values: val.map(value)
2586
2618
  } : val instanceof import_luxon2.DateTime ? {
2587
- kind: import_graphql5.Kind.STRING,
2619
+ kind: import_graphql6.Kind.STRING,
2588
2620
  value: val.toString()
2589
2621
  } : val instanceof import_dayjs2.Dayjs ? {
2590
- kind: import_graphql5.Kind.STRING,
2622
+ kind: import_graphql6.Kind.STRING,
2591
2623
  value: val.toISOString()
2592
2624
  } : typeof val === "object" ? {
2593
- kind: import_graphql5.Kind.OBJECT,
2625
+ kind: import_graphql6.Kind.OBJECT,
2594
2626
  fields: Object.keys(val).map(
2595
2627
  (nme) => ({
2596
- kind: import_graphql5.Kind.OBJECT_FIELD,
2628
+ kind: import_graphql6.Kind.OBJECT_FIELD,
2597
2629
  name: name(nme),
2598
2630
  value: value(val[nme])
2599
2631
  })
@@ -2843,7 +2875,8 @@ var generateDefinitions = ({
2843
2875
  {
2844
2876
  name: "dryRun",
2845
2877
  type: "Boolean"
2846
- }
2878
+ },
2879
+ ...model.deletable && model.deletable !== true && model.deletable.args || []
2847
2880
  ]
2848
2881
  });
2849
2882
  mutations2.push({
@@ -2855,7 +2888,8 @@ var generateDefinitions = ({
2855
2888
  name: "where",
2856
2889
  type: `${model.name}WhereUnique`,
2857
2890
  nonNull: true
2858
- }
2891
+ },
2892
+ ...model.deletable && model.deletable !== true && model.deletable.restoreArgs || []
2859
2893
  ]
2860
2894
  });
2861
2895
  }
@@ -2871,11 +2905,11 @@ var generateDefinitions = ({
2871
2905
  };
2872
2906
  var generate = (models) => document(generateDefinitions(models));
2873
2907
  var printSchema = (schema) => [
2874
- ...schema.getDirectives().map((d) => d.astNode && (0, import_graphql6.print)(d.astNode)),
2875
- ...Object.values(schema.getTypeMap()).filter((t) => !t.name.match(/^__/)).sort((a, b) => a.name > b.name ? 1 : -1).map((t) => t.astNode && (0, import_graphql6.print)(t.astNode))
2908
+ ...schema.getDirectives().map((d) => d.astNode && (0, import_graphql7.print)(d.astNode)),
2909
+ ...Object.values(schema.getTypeMap()).filter((t) => !t.name.match(/^__/)).sort((a, b) => a.name > b.name ? 1 : -1).map((t) => t.astNode && (0, import_graphql7.print)(t.astNode))
2876
2910
  ].filter(Boolean).map((s) => `${s}
2877
2911
  `).join("\n");
2878
- var printSchemaFromModels = (models) => printSchema((0, import_graphql6.buildASTSchema)(generate(models)));
2912
+ var printSchemaFromModels = (models) => printSchema((0, import_graphql7.buildASTSchema)(generate(models)));
2879
2913
 
2880
2914
  // src/bin/gqm/codegen.ts
2881
2915
  var import_cli = require("@graphql-codegen/cli");
@@ -3183,7 +3217,8 @@ var generateGraphqlApiTypes = async (dateLibrary) => {
3183
3217
  },
3184
3218
  config: {
3185
3219
  scalars: {
3186
- DateTime: DATE_CLASS[dateLibrary]
3220
+ DateTime: DATE_CLASS[dateLibrary],
3221
+ Time: "string"
3187
3222
  }
3188
3223
  }
3189
3224
  });
@@ -3212,7 +3247,8 @@ var generateGraphqlClientTypes = async () => {
3212
3247
  field: true
3213
3248
  },
3214
3249
  scalars: {
3215
- DateTime: "string"
3250
+ DateTime: "string",
3251
+ Time: "string"
3216
3252
  },
3217
3253
  ignoreNoDocuments: true
3218
3254
  }