@smartive/graphql-magic 3.1.0 → 5.0.0

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 (91) hide show
  1. package/CHANGELOG.md +1 -6
  2. package/README.md +46 -0
  3. package/dist/cjs/index.cjs +260 -196
  4. package/dist/esm/api/execute.d.ts +10 -0
  5. package/dist/esm/api/execute.js +32 -0
  6. package/dist/esm/api/execute.js.map +1 -0
  7. package/dist/esm/api/index.d.ts +1 -0
  8. package/dist/esm/api/index.js +3 -0
  9. package/dist/esm/api/index.js.map +1 -0
  10. package/dist/esm/client/queries.d.ts +4 -1
  11. package/dist/esm/client/queries.js +7 -4
  12. package/dist/esm/client/queries.js.map +1 -1
  13. package/dist/esm/context.d.ts +1 -4
  14. package/dist/esm/db/generate.js +21 -13
  15. package/dist/esm/db/generate.js.map +1 -1
  16. package/dist/esm/generate/generate.d.ts +1 -1
  17. package/dist/esm/generate/generate.js +17 -22
  18. package/dist/esm/generate/generate.js.map +1 -1
  19. package/dist/esm/generate/mutations.d.ts +1 -1
  20. package/dist/esm/generate/utils.d.ts +10 -1
  21. package/dist/esm/generate/utils.js.map +1 -1
  22. package/dist/esm/index.d.ts +2 -2
  23. package/dist/esm/index.js +2 -2
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/migrations/generate.d.ts +1 -1
  26. package/dist/esm/migrations/generate.js +82 -89
  27. package/dist/esm/migrations/generate.js.map +1 -1
  28. package/dist/esm/models/index.d.ts +2 -0
  29. package/dist/esm/models/index.js +4 -0
  30. package/dist/esm/models/index.js.map +1 -0
  31. package/dist/esm/models/models.d.ts +192 -0
  32. package/dist/esm/models/models.js +2 -0
  33. package/dist/esm/models/models.js.map +1 -0
  34. package/dist/esm/models/utils.d.ts +205 -0
  35. package/dist/esm/{utils.js → models/utils.js} +69 -21
  36. package/dist/esm/models/utils.js.map +1 -0
  37. package/dist/esm/permissions/check.d.ts +1 -1
  38. package/dist/esm/permissions/check.js +2 -2
  39. package/dist/esm/permissions/check.js.map +1 -1
  40. package/dist/esm/permissions/generate.d.ts +1 -1
  41. package/dist/esm/permissions/generate.js +2 -2
  42. package/dist/esm/permissions/generate.js.map +1 -1
  43. package/dist/esm/resolvers/arguments.js +1 -1
  44. package/dist/esm/resolvers/arguments.js.map +1 -1
  45. package/dist/esm/resolvers/filters.js +2 -2
  46. package/dist/esm/resolvers/filters.js.map +1 -1
  47. package/dist/esm/resolvers/mutations.js +5 -6
  48. package/dist/esm/resolvers/mutations.js.map +1 -1
  49. package/dist/esm/resolvers/node.d.ts +1 -1
  50. package/dist/esm/resolvers/node.js +4 -5
  51. package/dist/esm/resolvers/node.js.map +1 -1
  52. package/dist/esm/resolvers/resolver.js +3 -3
  53. package/dist/esm/resolvers/resolver.js.map +1 -1
  54. package/dist/esm/resolvers/resolvers.d.ts +1 -1
  55. package/dist/esm/resolvers/resolvers.js +1 -1
  56. package/dist/esm/resolvers/resolvers.js.map +1 -1
  57. package/dist/esm/resolvers/utils.js +1 -1
  58. package/dist/esm/resolvers/utils.js.map +1 -1
  59. package/package.json +5 -5
  60. package/src/api/execute.ts +45 -0
  61. package/src/api/index.ts +3 -0
  62. package/src/client/queries.ts +16 -10
  63. package/src/context.ts +1 -3
  64. package/src/db/generate.ts +22 -15
  65. package/src/generate/generate.ts +26 -34
  66. package/src/generate/mutations.ts +1 -1
  67. package/src/generate/utils.ts +11 -1
  68. package/src/index.ts +2 -2
  69. package/src/migrations/generate.ts +84 -82
  70. package/src/models/index.ts +4 -0
  71. package/src/models/models.ts +184 -0
  72. package/src/models/utils.ts +288 -0
  73. package/src/permissions/check.ts +3 -3
  74. package/src/permissions/generate.ts +3 -3
  75. package/src/resolvers/arguments.ts +1 -1
  76. package/src/resolvers/filters.ts +2 -2
  77. package/src/resolvers/mutations.ts +10 -9
  78. package/src/resolvers/node.ts +6 -6
  79. package/src/resolvers/resolver.ts +3 -3
  80. package/src/resolvers/resolvers.ts +2 -2
  81. package/src/resolvers/utils.ts +1 -1
  82. package/tests/unit/resolve.spec.ts +4 -19
  83. package/tests/utils/models.ts +8 -7
  84. package/tests/utils/server.ts +13 -33
  85. package/dist/esm/models.d.ts +0 -170
  86. package/dist/esm/models.js +0 -27
  87. package/dist/esm/models.js.map +0 -1
  88. package/dist/esm/utils.d.ts +0 -25
  89. package/dist/esm/utils.js.map +0 -1
  90. package/src/models.ts +0 -228
  91. package/src/utils.ts +0 -187
@@ -53,6 +53,7 @@ __export(src_exports, {
53
53
  displayField: () => displayField,
54
54
  document: () => document,
55
55
  enm: () => enm,
56
+ execute: () => execute,
56
57
  fieldType: () => fieldType,
57
58
  fields: () => fields,
58
59
  generate: () => generate,
@@ -106,7 +107,6 @@ __export(src_exports, {
106
107
  isFieldNode: () => isFieldNode,
107
108
  isFragmentSpreadNode: () => isFragmentSpreadNode,
108
109
  isInlineFragmentNode: () => isInlineFragmentNode,
109
- isJsonObjectModel: () => isJsonObjectModel,
110
110
  isListType: () => isListType,
111
111
  isObjectModel: () => isObjectModel,
112
112
  isQueriableBy: () => isQueriableBy,
@@ -151,6 +151,42 @@ __export(src_exports, {
151
151
  });
152
152
  module.exports = __toCommonJS(src_exports);
153
153
 
154
+ // src/api/execute.ts
155
+ var import_schema = require("@graphql-tools/schema");
156
+ var import_graphql = require("graphql");
157
+ var execute = async ({
158
+ additionalResolvers,
159
+ body,
160
+ ...ctx
161
+ }) => {
162
+ const document2 = generate(ctx.rawModels);
163
+ const generatedResolvers = getResolvers(ctx.models);
164
+ const schema = (0, import_schema.makeExecutableSchema)({
165
+ typeDefs: document2,
166
+ resolvers: {
167
+ ...generatedResolvers,
168
+ ...additionalResolvers
169
+ }
170
+ });
171
+ const contextValue = {
172
+ document: document2,
173
+ ...ctx
174
+ };
175
+ const result = await (0, import_graphql.execute)({
176
+ schema,
177
+ document: (0, import_graphql.parse)(new import_graphql.Source(body.query, "GraphQL request")),
178
+ contextValue,
179
+ variableValues: body.variables,
180
+ operationName: body.operationName,
181
+ fieldResolver: (parent, _args, _ctx, info) => {
182
+ const node = get(info.fieldNodes, 0);
183
+ const alias = node.alias;
184
+ return parent[alias ? alias.value : node.name.value];
185
+ }
186
+ });
187
+ return result;
188
+ };
189
+
154
190
  // src/client/gql.ts
155
191
  var gql = (chunks, ...variables) => {
156
192
  return chunks.reduce(
@@ -162,36 +198,7 @@ var gql = (chunks, ...variables) => {
162
198
  // src/client/queries.ts
163
199
  var import_upperFirst = __toESM(require("lodash/upperFirst"), 1);
164
200
 
165
- // src/models.ts
166
- var isObjectModel = (model) => model.type === "object";
167
- var isEnumModel = (model) => model.type === "enum";
168
- var isRawEnumModel = (model) => model.type === "raw-enum";
169
- var isScalarModel = (model) => model.type === "scalar";
170
- var isRawObjectModel = (model) => model.type === "raw-object";
171
- var isJsonObjectModel = (model) => model.type === "json-object";
172
- var isEnumList = (models, field) => field?.list === true && models.find(({ name: name2 }) => name2 === field.type)?.type === "enum";
173
- var and = (...predicates) => (field) => predicates.every((predicate) => predicate(field));
174
- var not = (predicate) => (field) => !predicate(field);
175
- var isRelation = ({ relation }) => !!relation;
176
- var isVisibleRelation = (visibleRelationsByRole, modelName, role) => {
177
- const whitelist = visibleRelationsByRole[role]?.[modelName];
178
- return ({ name: name2 }) => whitelist ? whitelist.includes(name2) : true;
179
- };
180
- var isToOneRelation = ({ toOne }) => !!toOne;
181
- var isQueriableField = ({ queriable }) => queriable !== false;
182
- var isRaw = ({ raw }) => !!raw;
183
- var isVisible = ({ hidden }) => hidden !== true;
184
- var isSimpleField = and(not(isRelation), not(isRaw));
185
- var isUpdatable = ({ updatable }) => !!updatable;
186
- var isCreatable = ({ creatable }) => !!creatable;
187
- var isQueriableBy = (role) => (field) => isQueriableField(field) && (!field.queriableBy || field.queriableBy.includes(role));
188
- var isUpdatableBy = (role) => (field) => isUpdatable(field) && (!field.updatableBy || field.updatableBy.includes(role));
189
- var isCreatableBy = (role) => (field) => isCreatable(field) && (!field.creatableBy || field.creatableBy.includes(role));
190
- var actionableRelations = (model, action) => model.fields.filter(
191
- ({ relation, ...field }) => relation && field[`${action === "filter" ? action : action.slice(0, -1)}able`]
192
- );
193
-
194
- // src/utils.ts
201
+ // src/models/utils.ts
195
202
  var import_assert = __toESM(require("assert"), 1);
196
203
  var import_inflection = require("inflection");
197
204
  var import_camelCase = __toESM(require("lodash/camelCase"), 1);
@@ -207,6 +214,28 @@ var getModelSlug = (model) => (0, import_kebabCase.default)(getModelPlural(model
207
214
  var getModelLabelPlural = (model) => getLabel(getModelPlural(model));
208
215
  var getModelLabel = (model) => getLabel(model.name);
209
216
  var getLabel = (s) => (0, import_startCase.default)((0, import_camelCase.default)(s));
217
+ var isObjectModel = (model) => model.type === "object";
218
+ var isEnumModel = (model) => model.type === "enum";
219
+ var isRawEnumModel = (model) => model.type === "raw-enum";
220
+ var isScalarModel = (model) => model.type === "scalar";
221
+ var isRawObjectModel = (model) => model.type === "raw";
222
+ var isEnumList = (models, field) => field?.list === true && models.find(({ name: name2 }) => name2 === field.type)?.type === "enum";
223
+ var and = (...predicates) => (field) => predicates.every((predicate) => predicate(field));
224
+ var not = (predicate) => (field) => !predicate(field);
225
+ var isRelation = (field) => field.type === "relation";
226
+ var isToOneRelation = (field) => isRelation(field) && !!field.toOne;
227
+ var isQueriableField = ({ queriable }) => queriable !== false;
228
+ var isRaw = (field) => field.type === "raw";
229
+ var isVisible = ({ hidden }) => hidden !== true;
230
+ var isSimpleField = and(not(isRelation), not(isRaw));
231
+ var isUpdatable = ({ updatable }) => !!updatable;
232
+ var isCreatable = ({ creatable }) => !!creatable;
233
+ var isQueriableBy = (role) => (field) => field.queriable !== false && (field.queriable == true || !field.queriable.roles || field.queriable.roles.includes(role));
234
+ var isUpdatableBy = (role) => (field) => field.updatable && (field.updatable === true || !field.updatable.roles || field.updatable.roles.includes(role));
235
+ var isCreatableBy = (role) => (field) => field.creatable && (field.creatable === true || !field.creatable.roles || field.creatable.roles.includes(role));
236
+ var actionableRelations = (model, action) => model.fields.filter(isRelation).filter(
237
+ (field) => field[`${action === "filter" ? action : action.slice(0, -1)}able`]
238
+ );
210
239
  var getModels = (rawModels) => {
211
240
  const models = rawModels.filter(isObjectModel).map((model) => {
212
241
  const objectModel = {
@@ -220,25 +249,41 @@ var getModels = (rawModels) => {
220
249
  { name: "id", type: "ID", nonNull: true, unique: true, primary: true, generated: true },
221
250
  ...model.fields,
222
251
  ...model.creatable ? [
223
- { name: "createdAt", type: "DateTime", nonNull: !model.nonStrict, orderable: true, generated: true },
252
+ {
253
+ name: "createdAt",
254
+ type: "DateTime",
255
+ nonNull: true,
256
+ orderable: true,
257
+ generated: true,
258
+ ...typeof model.creatable === "object" && model.creatable.createdAt
259
+ },
224
260
  {
225
261
  name: "createdBy",
226
- type: "User",
227
- relation: true,
228
- nonNull: !model.nonStrict,
262
+ type: "relation",
263
+ typeName: "User",
264
+ nonNull: true,
229
265
  reverse: `created${getModelPlural(model)}`,
230
- generated: true
266
+ generated: true,
267
+ ...typeof model.creatable === "object" && model.creatable.createdBy
231
268
  }
232
269
  ] : [],
233
270
  ...model.updatable ? [
234
- { name: "updatedAt", type: "DateTime", nonNull: !model.nonStrict, orderable: true, generated: true },
271
+ {
272
+ name: "updatedAt",
273
+ type: "DateTime",
274
+ nonNull: true,
275
+ orderable: true,
276
+ generated: true,
277
+ ...typeof model.updatable === "object" && model.updatable.updatedAt
278
+ },
235
279
  {
236
280
  name: "updatedBy",
237
- type: "User",
238
- relation: true,
239
- nonNull: !model.nonStrict,
281
+ type: "relation",
282
+ typeName: "User",
283
+ nonNull: true,
240
284
  reverse: `updated${getModelPlural(model)}`,
241
- generated: true
285
+ generated: true,
286
+ ...typeof model.updatable === "object" && model.updatable.updatedBy
242
287
  }
243
288
  ] : [],
244
289
  ...model.deletable ? [
@@ -247,23 +292,30 @@ var getModels = (rawModels) => {
247
292
  type: "Boolean",
248
293
  nonNull: true,
249
294
  default: false,
250
- filterable: true,
251
- defaultFilter: false,
252
- generated: true
295
+ filterable: { default: false },
296
+ generated: true,
297
+ ...typeof model.deletable === "object" && model.deletable.deleted
298
+ },
299
+ {
300
+ name: "deletedAt",
301
+ type: "DateTime",
302
+ orderable: true,
303
+ generated: true,
304
+ ...typeof model.deletable === "object" && model.deletable.deletedAt
253
305
  },
254
- { name: "deletedAt", type: "DateTime", orderable: true, generated: true },
255
306
  {
256
307
  name: "deletedBy",
257
- type: "User",
258
- relation: true,
308
+ type: "relation",
309
+ typeName: "User",
259
310
  reverse: `deleted${getModelPlural(model)}`,
260
- generated: true
311
+ generated: true,
312
+ ...typeof model.deletable === "object" && model.deletable.deletedBy
261
313
  }
262
314
  ] : []
263
- ].map(({ foreignKey, ...field }) => ({
315
+ ].map((field) => ({
264
316
  ...field,
265
- ...field.relation && {
266
- foreignKey: foreignKey || `${field.name}Id`
317
+ ...field.type === "relation" && {
318
+ foreignKey: field.foreignKey || `${field.name}Id`
267
319
  }
268
320
  }))
269
321
  };
@@ -273,12 +325,16 @@ var getModels = (rawModels) => {
273
325
  return objectModel;
274
326
  });
275
327
  for (const model of models) {
276
- for (const field of model.fields.filter(({ relation }) => relation)) {
277
- const fieldModel = summonByName(models, field.type);
328
+ for (const field of model.fields) {
329
+ if (field.type !== "relation") {
330
+ continue;
331
+ }
332
+ const fieldModel = summonByName(models, field.typeName);
278
333
  const reverseRelation = {
334
+ type: "relation",
279
335
  name: field.reverse || (field.toOne ? typeToField(model.name) : getModelPluralField(model)),
280
336
  foreignKey: get(field, "foreignKey"),
281
- type: model.name,
337
+ typeName: model.name,
282
338
  toOne: !!field.toOne,
283
339
  fieldModel,
284
340
  field,
@@ -356,8 +412,8 @@ var getEditEntityRelationsQuery = (models, model, action, fields2, ignoreFields,
356
412
  ({ name: name2 }) => (!fields2 || fields2.includes(name2)) && (!ignoreFields || !ignoreFields.includes(name2))
357
413
  );
358
414
  return !!relations.length && `query ${(0, import_upperFirst.default)(action)}${model.name}Relations {
359
- ${relations.map(({ name: name2, type }) => {
360
- const model2 = summonByName(models, type);
415
+ ${relations.map(({ name: name2, typeName }) => {
416
+ const model2 = summonByName(models, typeName);
361
417
  let filters = "";
362
418
  if (model2.displayField) {
363
419
  const displayField2 = model2.fieldsByName[model2.displayField];
@@ -457,6 +513,10 @@ var getEntityListQuery = (model, role, additionalFields = "", root) => `query ${
457
513
  }
458
514
  ${root ? "}" : ""}
459
515
  }`;
516
+ var isVisibleRelation = (visibleRelationsByRole, modelName, role) => {
517
+ const whitelist = visibleRelationsByRole[role]?.[modelName];
518
+ return ({ name: name2 }) => whitelist ? whitelist.includes(name2) : true;
519
+ };
460
520
  var getEntityQuery = (models, model, role, visibleRelationsByRole, typesWithSubRelations) => `query Admin${model.name} ($id: ID!) {
461
521
  data: ${typeToField(model.name)}(where: { id: $id }) {
462
522
  ${displayField(model)}
@@ -513,14 +573,14 @@ var generateDBModels = (rawModels) => {
513
573
  }
514
574
  const models = getModels(rawModels);
515
575
  for (const model of models) {
516
- const fields2 = model.fields.some((field) => field.foreignKey === "id") ? model.fields.filter((field) => field.name !== "id") : model.fields;
576
+ const fields2 = model.fields.some((field) => field.type === "relation" && field.foreignKey === "id") ? model.fields.filter((field) => field.name !== "id") : model.fields;
517
577
  writer.write(`export type ${model.name} = `).inlineBlock(() => {
518
- for (const field of fields2.filter(({ raw }) => !raw)) {
578
+ for (const field of fields2.filter(not(isRaw))) {
519
579
  writer.write(`'${getFieldName(field)}': ${getFieldOutputType(field)}${field.nonNull ? "" : " | null"},`).newLine();
520
580
  }
521
581
  }).blankLine();
522
582
  writer.write(`export type ${model.name}Initializer = `).inlineBlock(() => {
523
- for (const field of fields2.filter(({ raw }) => !raw)) {
583
+ for (const field of fields2.filter(not(isRaw))) {
524
584
  writer.write(
525
585
  `'${getFieldName(field)}'${field.nonNull && field.default === void 0 ? "" : "?"}: ${getFieldInputType(
526
586
  field
@@ -529,12 +589,12 @@ var generateDBModels = (rawModels) => {
529
589
  }
530
590
  }).blankLine();
531
591
  writer.write(`export type ${model.name}Mutator = `).inlineBlock(() => {
532
- for (const field of fields2.filter(({ raw }) => !raw)) {
592
+ for (const field of fields2.filter(not(isRaw))) {
533
593
  writer.write(`'${getFieldName(field)}'?: ${getFieldInputType(field)}${field.nonNull ? "" : " | null"},`).newLine();
534
594
  }
535
595
  }).blankLine();
536
596
  writer.write(`export type ${model.name}Seed = `).inlineBlock(() => {
537
- for (const field of fields2.filter(({ raw }) => !raw)) {
597
+ for (const field of fields2.filter(not(isRaw))) {
538
598
  const fieldName = getFieldName(field);
539
599
  writer.write(
540
600
  `'${getFieldName(field)}'${field.nonNull && field.default === void 0 && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? "" : "?"}: ${getFieldInputType(
@@ -552,14 +612,20 @@ var generateDBModels = (rawModels) => {
552
612
  });
553
613
  return writer.toString();
554
614
  };
555
- var getFieldName = ({ relation, name: name2, foreignKey }) => {
556
- return foreignKey || `${name2}${relation ? "Id" : ""}`;
557
- };
558
- var getFieldOutputType = ({ relation, type, list: list2, json }) => {
559
- if (json || relation) {
560
- return "string";
615
+ var getFieldName = (field) => field.type === "relation" ? field.foreignKey || `${field.name}Id` : field.name;
616
+ var getFieldOutputType = (field) => {
617
+ switch (field.type) {
618
+ case "json":
619
+ return "string";
620
+ case "relation":
621
+ return "string";
622
+ case "enum":
623
+ return field.typeName + field.list ? "[]" : "";
624
+ case "raw":
625
+ throw new Error(`Raw fields are not in the db.`);
626
+ default:
627
+ return get(PRIMITIVE_TYPES, field.type) + (field.list ? "[]" : "");
561
628
  }
562
- return (PRIMITIVE_TYPES[type] || type) + (list2 ? "[]" : "");
563
629
  };
564
630
  var getFieldInputType = (field, stringTypes = []) => {
565
631
  let outputType = getFieldOutputType(field);
@@ -592,7 +658,7 @@ var generateKnexTables = (rawModels) => {
592
658
  };
593
659
 
594
660
  // src/generate/generate.ts
595
- var import_graphql = require("graphql");
661
+ var import_graphql2 = require("graphql");
596
662
  var import_flatMap = __toESM(require("lodash/flatMap"), 1);
597
663
 
598
664
  // src/generate/utils.ts
@@ -764,14 +830,6 @@ var generateDefinitions = (rawModels) => {
764
830
  ...rawModels.filter(isRawEnumModel).map((model) => enm(model.name, model.values)),
765
831
  ...rawModels.filter(isScalarModel).map((model) => scalar(model.name)),
766
832
  ...rawModels.filter(isRawObjectModel).map((model) => object(model.name, model.fields)),
767
- ...rawModels.filter(isJsonObjectModel).map((model) => object(model.name, model.fields)),
768
- ...rawModels.filter(isRawObjectModel).filter(({ rawFilters }) => rawFilters).map(
769
- (model) => input(
770
- `${model.name}Where`,
771
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- array gets filtered above to only include models with rawFilters
772
- model.rawFilters.map(({ name: name2, type, list: list2 = false, nonNull: nonNull2 = false }) => ({ name: name2, type, list: list2, nonNull: nonNull2 }))
773
- )
774
- ),
775
833
  ...(0, import_flatMap.default)(
776
834
  models.map((model) => {
777
835
  const types = [
@@ -780,10 +838,8 @@ var generateDefinitions = (rawModels) => {
780
838
  [
781
839
  ...model.fields.filter(isQueriableField).map((field) => ({
782
840
  ...field,
783
- args: [
784
- ...field.args || [],
785
- ...hasRawFilters(rawModels, field.type) ? [{ name: "where", type: `${field.type}Where` }] : []
786
- ],
841
+ type: field.type === "relation" || field.type === "enum" || field.type === "raw" ? field.typeName : field.type,
842
+ args: [...field.args || []],
787
843
  directives: field.directives
788
844
  })),
789
845
  ...model.reverseRelations.map(({ name: name2, field, model: model2 }) => ({
@@ -803,7 +859,12 @@ var generateDefinitions = (rawModels) => {
803
859
  model.interfaces
804
860
  ),
805
861
  input(`${model.name}Where`, [
806
- ...model.fields.filter(({ unique, filterable, relation }) => (unique || filterable) && !relation).map(({ name: name2, type, defaultFilter }) => ({ name: name2, type, list: true, default: defaultFilter })),
862
+ ...model.fields.filter(({ type, unique, filterable }) => (unique || filterable) && type !== "relation").map(({ type, name: name2, filterable }) => ({
863
+ name: name2,
864
+ type,
865
+ list: true,
866
+ default: typeof filterable === "object" ? filterable.default : void 0
867
+ })),
807
868
  ...(0, import_flatMap.default)(
808
869
  model.fields.filter(({ comparable }) => comparable),
809
870
  ({ name: name2, type }) => [
@@ -813,9 +874,9 @@ var generateDefinitions = (rawModels) => {
813
874
  { name: `${name2}_LTE`, type }
814
875
  ]
815
876
  ),
816
- ...model.fields.filter(({ filterable, relation }) => filterable && relation).map(({ name: name2, type }) => ({
877
+ ...model.fields.filter(isRelation).filter(({ filterable }) => filterable).map(({ name: name2, typeName }) => ({
817
878
  name: name2,
818
- type: `${type}Where`
879
+ type: `${typeName}Where`
819
880
  }))
820
881
  ]),
821
882
  input(
@@ -834,7 +895,7 @@ var generateDefinitions = (rawModels) => {
834
895
  input(
835
896
  `Create${model.name}`,
836
897
  model.fields.filter(({ creatable }) => creatable).map(
837
- ({ name: name2, relation, type, nonNull: nonNull2, list: list2, default: defaultValue }) => relation ? { name: `${name2}Id`, type: "ID", nonNull: nonNull2 } : { name: name2, type, list: list2, nonNull: nonNull2 && defaultValue === void 0 }
898
+ ({ name: name2, nonNull: nonNull2, list: list2, default: defaultValue, ...field }) => field.type === "relation" ? { name: `${name2}Id`, type: "ID", nonNull: nonNull2 } : { name: name2, type: field.type, list: list2, nonNull: nonNull2 && defaultValue === void 0 }
838
899
  )
839
900
  )
840
901
  );
@@ -844,7 +905,7 @@ var generateDefinitions = (rawModels) => {
844
905
  input(
845
906
  `Update${model.name}`,
846
907
  model.fields.filter(({ updatable }) => updatable).map(
847
- ({ name: name2, relation, type, list: list2 }) => relation ? { name: `${name2}Id`, type: "ID" } : { name: name2, type, list: list2 }
908
+ ({ name: name2, type, list: list2 }) => type === "relation" ? { name: `${name2}Id`, type: "ID" } : { name: name2, type, list: list2 }
848
909
  )
849
910
  )
850
911
  );
@@ -958,13 +1019,12 @@ var generateDefinitions = (rawModels) => {
958
1019
  };
959
1020
  var generate = (rawModels) => document(generateDefinitions(rawModels));
960
1021
  var printSchema = (schema) => [
961
- ...schema.getDirectives().map((d) => d.astNode && (0, import_graphql.print)(d.astNode)),
962
- ...Object.values(schema.getTypeMap()).filter((t) => !t.name.match(/^__/)).sort((a, b) => a.name > b.name ? 1 : -1).map((t) => t.astNode && (0, import_graphql.print)(t.astNode))
1022
+ ...schema.getDirectives().map((d) => d.astNode && (0, import_graphql2.print)(d.astNode)),
1023
+ ...Object.values(schema.getTypeMap()).filter((t) => !t.name.match(/^__/)).sort((a, b) => a.name > b.name ? 1 : -1).map((t) => t.astNode && (0, import_graphql2.print)(t.astNode))
963
1024
  ].filter(Boolean).map((s) => `${s}
964
1025
  `).join("\n");
965
- var hasRawFilters = (models, type) => models.filter(isRawObjectModel).some(({ name: name2, rawFilters }) => name2 === type && !!rawFilters);
966
- var printSchemaFromDocument = (document2) => printSchema((0, import_graphql.buildASTSchema)(document2));
967
- var printSchemaFromModels = (models) => printSchema((0, import_graphql.buildASTSchema)(generate(models)));
1026
+ var printSchemaFromDocument = (document2) => printSchema((0, import_graphql2.buildASTSchema)(document2));
1027
+ var printSchemaFromModels = (models) => printSchema((0, import_graphql2.buildASTSchema)(generate(models)));
968
1028
 
969
1029
  // src/generate/mutations.ts
970
1030
  var import_upperCase = __toESM(require("lodash/upperCase"), 1);
@@ -1114,17 +1174,19 @@ var MigrationGenerator = class {
1114
1174
  this.createFields(
1115
1175
  model,
1116
1176
  model.fields.filter(
1117
- ({ name: name2, relation, raw, foreignKey }) => !raw && !this.columns[model.name].some((col) => col.name === (foreignKey || (relation ? `${name2}Id` : name2)))
1177
+ ({ name: name2, ...field }) => field.type !== "raw" && !this.columns[model.name].some(
1178
+ (col) => col.name === (field.type === "relation" ? field.foreignKey || `${name2}Id` : name2)
1179
+ )
1118
1180
  ),
1119
1181
  up,
1120
1182
  down
1121
1183
  );
1122
- const existingFields = model.fields.filter(({ name: name2, relation, nonNull: nonNull2 }) => {
1123
- const col = this.columns[model.name].find((col2) => col2.name === (relation ? `${name2}Id` : name2));
1184
+ const existingFields = model.fields.filter(({ name: name2, type, nonNull: nonNull2 }) => {
1185
+ const col = this.columns[model.name].find((col2) => col2.name === (type === "relation" ? `${name2}Id` : name2));
1124
1186
  if (!col) {
1125
1187
  return false;
1126
1188
  }
1127
- return !model.nonStrict && !nonNull2 && !col.is_nullable;
1189
+ return !nonNull2 && !col.is_nullable;
1128
1190
  });
1129
1191
  this.updateFields(model, existingFields, up, down);
1130
1192
  }
@@ -1147,8 +1209,8 @@ var MigrationGenerator = class {
1147
1209
  if (model.deletable) {
1148
1210
  writer.writeLine(`deleted: row.deleted,`);
1149
1211
  }
1150
- for (const { name: name2, relation } of model.fields.filter(({ updatable }) => updatable)) {
1151
- const col = relation ? `${name2}Id` : name2;
1212
+ for (const { name: name2, type } of model.fields.filter(({ updatable }) => updatable)) {
1213
+ const col = type === "relation" ? `${name2}Id` : name2;
1152
1214
  writer.writeLine(`${col}: row.${col},`);
1153
1215
  }
1154
1216
  }).write(")));").newLine();
@@ -1162,11 +1224,15 @@ var MigrationGenerator = class {
1162
1224
  } else {
1163
1225
  const revisionTable = `${model.name}Revision`;
1164
1226
  const missingRevisionFields = model.fields.filter(
1165
- ({ name: name2, relation, raw, foreignKey, updatable }) => !raw && updatable && !this.columns[revisionTable].some((col) => col.name === (foreignKey || (relation ? `${name2}Id` : name2)))
1227
+ ({ name: name2, updatable, ...field }) => field.type !== "raw" && updatable && !this.columns[revisionTable].some(
1228
+ (col) => col.name === (field.type === "relation" ? field.foreignKey || `${name2}Id` : name2)
1229
+ )
1166
1230
  );
1167
1231
  this.createRevisionFields(model, missingRevisionFields, up, down);
1168
1232
  const revisionFieldsToRemove = model.fields.filter(
1169
- ({ name: name2, updatable, foreignKey, relation, raw, generated }) => !generated && !raw && !updatable && foreignKey !== "id" && this.columns[revisionTable].some((col) => col.name === (foreignKey || (relation ? `${name2}Id` : name2)))
1233
+ ({ name: name2, updatable, generated, ...field }) => !generated && field.type !== "raw" && !updatable && !(field.type === "relation" && field.foreignKey === "id") && this.columns[revisionTable].some(
1234
+ (col) => col.name === (field.type === "relation" ? field.foreignKey || `${name2}Id` : name2)
1235
+ )
1170
1236
  );
1171
1237
  this.createRevisionFields(model, revisionFieldsToRemove, down, up);
1172
1238
  }
@@ -1218,8 +1284,8 @@ var MigrationGenerator = class {
1218
1284
  for (const field of fields2) {
1219
1285
  this.alterTable(model.name, () => {
1220
1286
  this.renameColumn(
1221
- field.relation ? `${field.oldName}Id` : get(field, "oldName"),
1222
- field.relation ? `${field.name}Id` : field.name
1287
+ field.type === "relation" ? `${field.oldName}Id` : get(field, "oldName"),
1288
+ field.type === "relation" ? `${field.name}Id` : field.name
1223
1289
  );
1224
1290
  });
1225
1291
  }
@@ -1228,14 +1294,14 @@ var MigrationGenerator = class {
1228
1294
  for (const field of fields2) {
1229
1295
  this.alterTable(model.name, () => {
1230
1296
  this.renameColumn(
1231
- field.relation ? `${field.name}Id` : field.name,
1232
- field.relation ? `${field.oldName}Id` : get(field, "oldName")
1297
+ field.type === "relation" ? `${field.name}Id` : field.name,
1298
+ field.type === "relation" ? `${field.oldName}Id` : get(field, "oldName")
1233
1299
  );
1234
1300
  });
1235
1301
  }
1236
1302
  });
1237
1303
  for (const field of fields2) {
1238
- summonByName(this.columns[model.name], field.relation ? `${field.oldName}Id` : field.oldName).name = field.relation ? `${field.name}Id` : field.name;
1304
+ summonByName(this.columns[model.name], field.type === "relation" ? `${field.oldName}Id` : field.oldName).name = field.type === "relation" ? `${field.name}Id` : field.name;
1239
1305
  }
1240
1306
  }
1241
1307
  createFields(model, fields2, up, down) {
@@ -1271,8 +1337,8 @@ var MigrationGenerator = class {
1271
1337
  });
1272
1338
  down.push(() => {
1273
1339
  this.alterTable(model.name, () => {
1274
- for (const { relation, name: name2 } of fields2) {
1275
- this.dropColumn(relation ? `${name2}Id` : name2);
1340
+ for (const { type, name: name2 } of fields2) {
1341
+ this.dropColumn(type === "relation" ? `${name2}Id` : name2);
1276
1342
  }
1277
1343
  });
1278
1344
  });
@@ -1294,7 +1360,7 @@ var MigrationGenerator = class {
1294
1360
  this.column(
1295
1361
  field,
1296
1362
  { alter: true },
1297
- summonByName(this.columns[model.name], field.relation ? `${field.name}Id` : field.name)
1363
+ summonByName(this.columns[model.name], field.type === "relation" ? `${field.name}Id` : field.name)
1298
1364
  );
1299
1365
  }
1300
1366
  });
@@ -1317,7 +1383,7 @@ var MigrationGenerator = class {
1317
1383
  this.column(
1318
1384
  field,
1319
1385
  { alter: true },
1320
- summonByName(this.columns[model.name], field.relation ? `${field.name}Id` : field.name)
1386
+ summonByName(this.columns[model.name], field.type === "relation" ? `${field.name}Id` : field.name)
1321
1387
  );
1322
1388
  }
1323
1389
  });
@@ -1330,9 +1396,7 @@ var MigrationGenerator = class {
1330
1396
  writer.writeLine(`table.uuid('id').notNullable().primary();`);
1331
1397
  writer.writeLine(`table.uuid('${typeToField(model.name)}Id').notNullable();`);
1332
1398
  writer.write(`table.uuid('createdById')`);
1333
- if (!model.nonStrict) {
1334
- writer.write(".notNullable()");
1335
- }
1399
+ writer.write(".notNullable()");
1336
1400
  writer.write(";").newLine();
1337
1401
  writer.writeLine(`table.timestamp('createdAt').notNullable().defaultTo(knex.fn.now(0));`);
1338
1402
  if (model.deletable) {
@@ -1353,8 +1417,8 @@ var MigrationGenerator = class {
1353
1417
  }
1354
1418
  });
1355
1419
  this.writer.write(`await knex('${model.name}Revision').update(`).inlineBlock(() => {
1356
- for (const { name: name2, relation } of missingRevisionFields) {
1357
- const col = relation ? `${name2}Id` : name2;
1420
+ for (const { name: name2, type } of missingRevisionFields) {
1421
+ const col = type === "relation" ? `${name2}Id` : name2;
1358
1422
  this.writer.write(
1359
1423
  `${col}: knex.raw('(select "${col}" from "${model.name}" where "${model.name}".id = "${model.name}Revision"."${typeToField(model.name)}Id")'),`
1360
1424
  ).newLine();
@@ -1372,7 +1436,7 @@ var MigrationGenerator = class {
1372
1436
  down.push(() => {
1373
1437
  this.alterTable(revisionTable, () => {
1374
1438
  for (const field of missingRevisionFields) {
1375
- this.dropColumn(field.relation ? `${field.name}Id` : field.name);
1439
+ this.dropColumn(field.type === "relation" ? `${field.name}Id` : field.name);
1376
1440
  }
1377
1441
  });
1378
1442
  });
@@ -1418,7 +1482,7 @@ var MigrationGenerator = class {
1418
1482
  }
1419
1483
  return value2;
1420
1484
  }
1421
- column({ name: name2, relation, type, primary, list: list2, ...field }, { setUnique = true, setNonNull = true, alter = false, foreign = true, setDefault = true } = {}, toColumn) {
1485
+ column({ name: name2, primary, list: list2, ...field }, { setUnique = true, setNonNull = true, alter = false, foreign = true, setDefault = true } = {}, toColumn) {
1422
1486
  const col = (what) => {
1423
1487
  if (what) {
1424
1488
  this.writer.write(what);
@@ -1451,62 +1515,62 @@ var MigrationGenerator = class {
1451
1515
  }
1452
1516
  this.writer.write(";").newLine();
1453
1517
  };
1454
- if (relation) {
1455
- col(`table.uuid('${name2}Id')`);
1456
- if (foreign && !alter) {
1457
- this.writer.writeLine(`table.foreign('${name2}Id').references('id').inTable('${type}');`);
1458
- }
1459
- } else if (this.rawModels.some((m) => m.name === type && m.type === "enum")) {
1460
- list2 ? this.writer.write(`table.specificType('${name2}', '"${typeToField(type)}"[]');`) : this.writer.write(`table.enum('${name2}', null as any, `).inlineBlock(() => {
1461
- this.writer.writeLine(`useNative: true,`);
1462
- this.writer.writeLine(`existingType: true,`);
1463
- this.writer.writeLine(`enumName: '${typeToField(type)}',`);
1464
- }).write(")");
1465
- col();
1466
- } else {
1467
- switch (type) {
1468
- case "Boolean":
1469
- col(`table.boolean('${name2}')`);
1470
- break;
1471
- case "Int":
1472
- col(`table.integer('${name2}')`);
1473
- break;
1474
- case "Float":
1475
- if (field.double) {
1476
- col(`table.double('${name2}')`);
1477
- } else {
1478
- col(`table.decimal('${name2}', ${get(field, "precision")}, ${get(field, "scale")})`);
1479
- }
1480
- break;
1481
- case "String":
1482
- if (field.large) {
1483
- col(`table.text('${name2}')`);
1484
- } else {
1485
- col(`table.string('${name2}', ${field.maxLength})`);
1486
- }
1487
- break;
1488
- case "DateTime":
1489
- col(`table.timestamp('${name2}')`);
1490
- break;
1491
- case "ID":
1492
- if (field.maxLength) {
1493
- col(`table.string('${name2}', ${get(field, "maxLength")})`);
1494
- } else {
1495
- col(`table.uuid('${name2}')`);
1496
- }
1497
- break;
1498
- case "Upload":
1499
- break;
1500
- default:
1501
- throw new Error(`Unknown field type ${type}`);
1502
- }
1518
+ switch (field.type) {
1519
+ case "Boolean":
1520
+ col(`table.boolean('${name2}')`);
1521
+ break;
1522
+ case "Int":
1523
+ col(`table.integer('${name2}')`);
1524
+ break;
1525
+ case "Float":
1526
+ if (field.double) {
1527
+ col(`table.double('${name2}')`);
1528
+ } else {
1529
+ col(`table.decimal('${name2}', ${get(field, "precision")}, ${get(field, "scale")})`);
1530
+ }
1531
+ break;
1532
+ case "String":
1533
+ if (field.large) {
1534
+ col(`table.text('${name2}')`);
1535
+ } else {
1536
+ col(`table.string('${name2}', ${field.maxLength})`);
1537
+ }
1538
+ break;
1539
+ case "DateTime":
1540
+ col(`table.timestamp('${name2}')`);
1541
+ break;
1542
+ case "ID":
1543
+ col(`table.uuid('${name2}')`);
1544
+ break;
1545
+ case "Upload":
1546
+ break;
1547
+ case "relation":
1548
+ col(`table.uuid('${name2}Id')`);
1549
+ if (foreign && !alter) {
1550
+ this.writer.writeLine(`table.foreign('${name2}Id').references('id').inTable('${field.typeName}');`);
1551
+ }
1552
+ break;
1553
+ case "enum":
1554
+ if (list2) {
1555
+ this.writer.write(`table.specificType('${name2}', '"${typeToField(field.type)}"[]');`);
1556
+ } else {
1557
+ this.writer.write(`table.enum('${name2}', null as any, `).inlineBlock(() => {
1558
+ this.writer.writeLine(`useNative: true,`);
1559
+ this.writer.writeLine(`existingType: true,`);
1560
+ this.writer.writeLine(`enumName: '${typeToField(field.type)}',`);
1561
+ }).write(")");
1562
+ }
1563
+ col();
1564
+ break;
1565
+ default:
1566
+ throw new Error(`Unknown field type ${field.type}`);
1503
1567
  }
1504
1568
  }
1505
1569
  };
1506
1570
 
1507
1571
  // src/errors.ts
1508
- var import_graphql2 = require("graphql");
1509
- var GraphQLError = class extends import_graphql2.GraphQLError {
1572
+ var import_graphql3 = require("graphql");
1573
+ var GraphQLError = class extends import_graphql3.GraphQLError {
1510
1574
  constructor(message, extensions) {
1511
1575
  super(message, void 0, void 0, void 0, void 0, void 0, extensions);
1512
1576
  }
@@ -1534,7 +1598,7 @@ var PermissionError = class extends ForbiddenError {
1534
1598
 
1535
1599
  // src/resolvers/utils.ts
1536
1600
  var import_crypto = require("crypto");
1537
- var import_graphql3 = require("graphql");
1601
+ var import_graphql4 = require("graphql");
1538
1602
  var ID_ALIAS = "ID";
1539
1603
  var getTypeName = (t) => {
1540
1604
  switch (t.kind) {
@@ -1555,9 +1619,9 @@ var isListType = (type) => {
1555
1619
  return false;
1556
1620
  }
1557
1621
  };
1558
- var isFieldNode = (n) => n.kind === import_graphql3.Kind.FIELD;
1559
- var isInlineFragmentNode = (n) => n.kind === import_graphql3.Kind.INLINE_FRAGMENT;
1560
- var isFragmentSpreadNode = (n) => n.kind === import_graphql3.Kind.FRAGMENT_SPREAD;
1622
+ var isFieldNode = (n) => n.kind === import_graphql4.Kind.FIELD;
1623
+ var isInlineFragmentNode = (n) => n.kind === import_graphql4.Kind.INLINE_FRAGMENT;
1624
+ var isFragmentSpreadNode = (n) => n.kind === import_graphql4.Kind.FRAGMENT_SPREAD;
1561
1625
  var getType = (schema, name2) => get(schema.getType(name2), "astNode");
1562
1626
  var getFragmentTypeName = (node) => get(get(node.typeCondition, "name"), "value");
1563
1627
  function hydrate(node, raw) {
@@ -1717,7 +1781,7 @@ var checkCanWrite = async (ctx, model, data, action) => {
1717
1781
  }
1718
1782
  const query = ctx.knex.select(1).first();
1719
1783
  let linked = false;
1720
- for (const field of model.fields.filter(({ relation }) => relation).filter((field2) => field2.generated || (action === "CREATE" ? field2.creatable : field2.updatable))) {
1784
+ for (const field of model.fields.filter(isRelation).filter((field2) => field2.generated || (action === "CREATE" ? field2.creatable : field2.updatable))) {
1721
1785
  const foreignKey = field.foreignKey || `${field.name}Id`;
1722
1786
  const foreignId = data[foreignKey];
1723
1787
  if (!foreignId) {
@@ -1853,7 +1917,7 @@ var addPermissions = (models, permissions, links, block) => {
1853
1917
  }
1854
1918
  if (block.RELATIONS) {
1855
1919
  for (const [relation, subBlock] of Object.entries(block.RELATIONS)) {
1856
- const field = model.fields.find((field2) => field2.relation && field2.name === relation);
1920
+ const field = model.fields.filter(isRelation).find((field2) => field2.name === relation);
1857
1921
  let link;
1858
1922
  if (field) {
1859
1923
  link = {
@@ -1880,27 +1944,27 @@ var addPermissions = (models, permissions, links, block) => {
1880
1944
  };
1881
1945
 
1882
1946
  // src/resolvers/arguments.ts
1883
- var import_graphql4 = require("graphql");
1947
+ var import_graphql5 = require("graphql");
1884
1948
  function getRawValue(value2, values) {
1885
1949
  switch (value2.kind) {
1886
- case import_graphql4.Kind.LIST:
1950
+ case import_graphql5.Kind.LIST:
1887
1951
  if (!values) {
1888
1952
  return;
1889
1953
  }
1890
1954
  return value2.values.map((value3) => getRawValue(value3, values));
1891
- case import_graphql4.Kind.VARIABLE:
1955
+ case import_graphql5.Kind.VARIABLE:
1892
1956
  return values?.[value2.name.value];
1893
- case import_graphql4.Kind.INT:
1957
+ case import_graphql5.Kind.INT:
1894
1958
  return parseInt(value2.value, 10);
1895
- case import_graphql4.Kind.NULL:
1959
+ case import_graphql5.Kind.NULL:
1896
1960
  return null;
1897
- case import_graphql4.Kind.FLOAT:
1961
+ case import_graphql5.Kind.FLOAT:
1898
1962
  return parseFloat(value2.value);
1899
- case import_graphql4.Kind.STRING:
1900
- case import_graphql4.Kind.BOOLEAN:
1901
- case import_graphql4.Kind.ENUM:
1963
+ case import_graphql5.Kind.STRING:
1964
+ case import_graphql5.Kind.BOOLEAN:
1965
+ case import_graphql5.Kind.ENUM:
1902
1966
  return value2.value;
1903
- case import_graphql4.Kind.OBJECT: {
1967
+ case import_graphql5.Kind.OBJECT: {
1904
1968
  if (!value2.fields.length) {
1905
1969
  return;
1906
1970
  }
@@ -1932,7 +1996,7 @@ var normalizeArguments = (node) => {
1932
1996
  };
1933
1997
  function normalizeValue(value2, type, schema) {
1934
1998
  switch (type.kind) {
1935
- case import_graphql4.Kind.LIST_TYPE: {
1999
+ case import_graphql5.Kind.LIST_TYPE: {
1936
2000
  if (Array.isArray(value2)) {
1937
2001
  const res = [];
1938
2002
  for (const v of value2) {
@@ -1946,9 +2010,9 @@ function normalizeValue(value2, type, schema) {
1946
2010
  }
1947
2011
  return [normalizedValue];
1948
2012
  }
1949
- case import_graphql4.Kind.NON_NULL_TYPE:
2013
+ case import_graphql5.Kind.NON_NULL_TYPE:
1950
2014
  return normalizeValue(value2, type.type, schema);
1951
- case import_graphql4.Kind.NAMED_TYPE:
2015
+ case import_graphql5.Kind.NAMED_TYPE:
1952
2016
  return normalizeValueByTypeDefinition(
1953
2017
  value2,
1954
2018
  schema.getType(type.name.value)?.astNode,
@@ -1957,7 +2021,7 @@ function normalizeValue(value2, type, schema) {
1957
2021
  }
1958
2022
  }
1959
2023
  var normalizeValueByTypeDefinition = (value2, type, schema) => {
1960
- if (!type || type.kind !== import_graphql4.Kind.INPUT_OBJECT_TYPE_DEFINITION) {
2024
+ if (!type || type.kind !== import_graphql5.Kind.INPUT_OBJECT_TYPE_DEFINITION) {
1961
2025
  return value2;
1962
2026
  }
1963
2027
  if (!value2) {
@@ -2038,7 +2102,7 @@ var applyWhere2 = (node, where, ops, joins) => {
2038
2102
  }
2039
2103
  const field = summonByName(node.model.fields, key);
2040
2104
  const fullKey = `${node.shortTableAlias}.${key}`;
2041
- if (field.relation) {
2105
+ if (field.type === "relation") {
2042
2106
  const relation = get(node.model.relationsByName, field.name);
2043
2107
  const tableAlias = `${node.model.name}__W__${key}`;
2044
2108
  const subNode = {
@@ -2152,7 +2216,7 @@ var getSimpleFields = (node) => {
2152
2216
  if (!selection.selectionSet) {
2153
2217
  return true;
2154
2218
  }
2155
- return node.model.fields.some(({ json, name: name2 }) => json && name2 === selection.name.value);
2219
+ return node.model.fields.some(({ type, name: name2 }) => type === "json" && name2 === selection.name.value);
2156
2220
  });
2157
2221
  };
2158
2222
  var getInlineFragments = (node) => node.selectionSet.filter(isInlineFragmentNode).map(
@@ -2182,7 +2246,7 @@ var getJoins = (node, toMany) => {
2182
2246
  const fieldNameOrAlias = getNameOrAlias(subNode);
2183
2247
  const fieldDefinition = summonByKey(baseTypeDefinition.fields || [], "name.value", fieldName);
2184
2248
  const typeName = getTypeName(fieldDefinition.type);
2185
- if (isJsonObjectModel(summonByName(ctx.rawModels, typeName))) {
2249
+ if (isRawObjectModel(summonByName(ctx.rawModels, typeName))) {
2186
2250
  continue;
2187
2251
  }
2188
2252
  const baseModel = summonByName(ctx.models, baseTypeDefinition.name.value);
@@ -2195,7 +2259,7 @@ var getJoins = (node, toMany) => {
2195
2259
  foreignKey = reverseRelation.foreignKey;
2196
2260
  } else {
2197
2261
  const modelField = baseModel.fieldsByName[fieldName];
2198
- if (!modelField || modelField.raw) {
2262
+ if (modelField?.type !== "relation") {
2199
2263
  continue;
2200
2264
  }
2201
2265
  foreignKey = modelField.foreignKey;
@@ -2288,10 +2352,10 @@ var applySelects = (node, query, joins) => {
2288
2352
  { field: "id", alias: ID_ALIAS },
2289
2353
  ...getSimpleFields(node).filter((n) => {
2290
2354
  const field = node.model.fields.find(({ name: name2 }) => name2 === n.name.value);
2291
- if (!field || field.relation || field.raw) {
2355
+ if (!field || field.type === "relation" || field.type === "raw") {
2292
2356
  return false;
2293
2357
  }
2294
- if (field.queriableBy && !field.queriableBy.includes(node.ctx.user.role)) {
2358
+ if (typeof field.queriable === "object" && !field.queriable.roles?.includes(node.ctx.user.role)) {
2295
2359
  throw new PermissionError(
2296
2360
  "READ",
2297
2361
  `${node.model.name}'s field "${field.name}"`,
@@ -2590,8 +2654,8 @@ var createRevision = async (model, data, ctx) => {
2590
2654
  if (model.deletable) {
2591
2655
  revisionData.deleted = data.deleted || false;
2592
2656
  }
2593
- for (const { name: name2, relation, nonNull: nonNull2, ...field } of model.fields.filter(({ updatable }) => updatable)) {
2594
- const col = relation ? `${name2}Id` : name2;
2657
+ for (const { type, name: name2, nonNull: nonNull2, ...field } of model.fields.filter(({ updatable }) => updatable)) {
2658
+ const col = type === "relation" ? `${name2}Id` : name2;
2595
2659
  if (nonNull2 && (!(col in data) || col === void 0 || col === null)) {
2596
2660
  revisionData[col] = get(field, "default");
2597
2661
  } else {
@@ -2621,7 +2685,7 @@ var sanitize = (ctx, model, data) => {
2621
2685
  }
2622
2686
  }
2623
2687
  };
2624
- var isEndOfDay = (field) => field?.endOfDay === true && field?.dateTimeType === "date" && field?.type === "DateTime";
2688
+ var isEndOfDay = (field) => field.type === "DateTime" && field?.endOfDay === true && field?.dateTimeType === "date" && field?.type === "DateTime";
2625
2689
 
2626
2690
  // src/resolvers/resolvers.ts
2627
2691
  var getResolvers = (models) => ({
@@ -2675,6 +2739,7 @@ var getResolvers = (models) => ({
2675
2739
  displayField,
2676
2740
  document,
2677
2741
  enm,
2742
+ execute,
2678
2743
  fieldType,
2679
2744
  fields,
2680
2745
  generate,
@@ -2728,7 +2793,6 @@ var getResolvers = (models) => ({
2728
2793
  isFieldNode,
2729
2794
  isFragmentSpreadNode,
2730
2795
  isInlineFragmentNode,
2731
- isJsonObjectModel,
2732
2796
  isListType,
2733
2797
  isObjectModel,
2734
2798
  isQueriableBy,