@smartive/graphql-magic 15.4.0 → 16.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 (63) hide show
  1. package/.gqmrc.json +4 -2
  2. package/CHANGELOG.md +1 -6
  3. package/dist/bin/gqm.cjs +115 -42
  4. package/dist/cjs/index.cjs +111 -30
  5. package/dist/esm/api/execute.d.ts +1 -1
  6. package/dist/esm/context.d.ts +5 -4
  7. package/dist/esm/db/generate.d.ts +2 -1
  8. package/dist/esm/db/generate.js +13 -8
  9. package/dist/esm/db/generate.js.map +1 -1
  10. package/dist/esm/index.d.ts +1 -0
  11. package/dist/esm/index.js +1 -0
  12. package/dist/esm/index.js.map +1 -1
  13. package/dist/esm/migrations/generate.d.ts +1 -0
  14. package/dist/esm/migrations/generate.js +28 -6
  15. package/dist/esm/migrations/generate.js.map +1 -1
  16. package/dist/esm/models/mutation-hook.d.ts +5 -12
  17. package/dist/esm/models/utils.d.ts +20 -7
  18. package/dist/esm/models/utils.js +8 -0
  19. package/dist/esm/models/utils.js.map +1 -1
  20. package/dist/esm/permissions/check.d.ts +2 -3
  21. package/dist/esm/permissions/check.js.map +1 -1
  22. package/dist/esm/resolvers/arguments.d.ts +1 -1
  23. package/dist/esm/resolvers/mutations.js +5 -2
  24. package/dist/esm/resolvers/mutations.js.map +1 -1
  25. package/dist/esm/schema/utils.js +19 -8
  26. package/dist/esm/schema/utils.js.map +1 -1
  27. package/dist/esm/utils/dates.d.ts +12 -0
  28. package/dist/esm/utils/dates.js +37 -0
  29. package/dist/esm/utils/dates.js.map +1 -0
  30. package/dist/esm/utils/index.d.ts +1 -0
  31. package/dist/esm/utils/index.js +3 -0
  32. package/dist/esm/utils/index.js.map +1 -0
  33. package/dist/esm/values.d.ts +1 -3
  34. package/docker-compose.yml +0 -1
  35. package/docs/docs/1-tutorial.md +6 -6
  36. package/docs/docs/6-graphql-server.md +1 -3
  37. package/docs/docs/7-graphql-client.md +1 -1
  38. package/docs/docs/8-permissions.md +145 -0
  39. package/docs/package-lock.json +177 -177
  40. package/docs/package.json +6 -6
  41. package/knexfile.ts +2 -2
  42. package/migrations/20230912185644_setup.ts +37 -8
  43. package/package.json +5 -4
  44. package/src/bin/gqm/codegen.ts +4 -3
  45. package/src/bin/gqm/gqm.ts +4 -2
  46. package/src/bin/gqm/settings.ts +37 -2
  47. package/src/bin/gqm/templates.ts +19 -8
  48. package/src/context.ts +9 -5
  49. package/src/db/generate.ts +15 -8
  50. package/src/index.ts +1 -0
  51. package/src/migrations/generate.ts +34 -16
  52. package/src/models/mutation-hook.ts +5 -8
  53. package/src/models/utils.ts +24 -0
  54. package/src/permissions/check.ts +2 -3
  55. package/src/resolvers/mutations.ts +10 -6
  56. package/src/schema/utils.ts +14 -2
  57. package/src/utils/dates.ts +48 -0
  58. package/src/utils/index.ts +3 -0
  59. package/src/values.ts +1 -5
  60. package/tests/generated/client/index.ts +3 -1
  61. package/tests/generated/db/index.ts +43 -43
  62. package/tests/utils/database/seed.ts +9 -5
  63. package/tests/utils/server.ts +3 -3
@@ -30,6 +30,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
30
30
  var src_exports = {};
31
31
  __export(src_exports, {
32
32
  AliasGenerator: () => AliasGenerator,
33
+ DATE_CLASS: () => DATE_CLASS,
34
+ DATE_CLASS_IMPORT: () => DATE_CLASS_IMPORT,
33
35
  EntityModel: () => EntityModel,
34
36
  EnumModel: () => EnumModel,
35
37
  ForbiddenError: () => ForbiddenError,
@@ -54,12 +56,14 @@ __export(src_exports, {
54
56
  UserInputError: () => UserInputError,
55
57
  addJoin: () => addJoin,
56
58
  and: () => and,
59
+ anyDateToLuxon: () => anyDateToLuxon,
57
60
  apply: () => apply,
58
61
  applyFilters: () => applyFilters,
59
62
  applyJoins: () => applyJoins,
60
63
  applyPermissions: () => applyPermissions,
61
64
  applySelects: () => applySelects,
62
65
  args: () => args,
66
+ as: () => as,
63
67
  checkCanWrite: () => checkCanWrite,
64
68
  directive: () => directive,
65
69
  directives: () => directives,
@@ -114,6 +118,8 @@ __export(src_exports, {
114
118
  inputValues: () => inputValues,
115
119
  isCreatable: () => isCreatable,
116
120
  isCreatableBy: () => isCreatableBy,
121
+ isCreatableField: () => isCreatableField,
122
+ isCreatableModel: () => isCreatableModel,
117
123
  isCustomField: () => isCustomField,
118
124
  isEntityModel: () => isEntityModel,
119
125
  isEnum: () => isEnum,
@@ -696,7 +702,9 @@ var isScalarModel = (model) => model instanceof ScalarModel;
696
702
  var isObjectModel = (model) => model instanceof ObjectModel;
697
703
  var isInputModel = (model) => model instanceof InputModel;
698
704
  var isInterfaceModel = (model) => model instanceof InterfaceModel;
705
+ var isCreatableModel = (model) => model.creatable && model.fields.some(isCreatableField);
699
706
  var isUpdatableModel = (model) => model.updatable && model.fields.some(isUpdatableField);
707
+ var isCreatableField = (field) => !field.inherited && !!field.creatable;
700
708
  var isUpdatableField = (field) => !field.inherited && !!field.updatable;
701
709
  var modelNeedsTable = (model) => model.fields.some((field) => !field.inherited);
702
710
  var hasName = (name2) => (field) => field.name == name2;
@@ -763,6 +771,12 @@ var retry = async (cb, condition) => {
763
771
  }
764
772
  }
765
773
  };
774
+ var as = (value2, type) => {
775
+ if (typeof value2 !== type) {
776
+ throw new Error(`No string`);
777
+ }
778
+ return value2;
779
+ };
766
780
 
767
781
  // src/client/queries.ts
768
782
  var getUpdateEntityQuery = (model, role, fields2, additionalFields = "") => `query Update${model.name}Fields ($id: ID!) {
@@ -899,22 +913,60 @@ var queryRelations = (models, relations) => relations.map(
899
913
 
900
914
  // src/db/generate.ts
901
915
  var import_code_block_writer = __toESM(require("code-block-writer"), 1);
916
+
917
+ // src/utils/dates.ts
918
+ var import_dayjs = require("dayjs");
919
+ var import_luxon = require("luxon");
920
+ var DATE_CLASS = {
921
+ luxon: "DateTime",
922
+ dayjs: "Dayjs"
923
+ };
924
+ var DATE_CLASS_IMPORT = {
925
+ luxon: `import { DateTime } from 'luxon';`,
926
+ dayjs: `import { Dayjs } from 'dayjs';`
927
+ };
928
+ var anyDateToLuxon = (date, zone, fallbackToNow = false) => {
929
+ if (!date) {
930
+ if (fallbackToNow) {
931
+ return import_luxon.DateTime.local({ zone });
932
+ } else {
933
+ return void 0;
934
+ }
935
+ }
936
+ if (import_luxon.DateTime.isDateTime(date)) {
937
+ return date.setZone(zone);
938
+ }
939
+ if ((0, import_dayjs.isDayjs)(date)) {
940
+ return import_luxon.DateTime.fromISO(date.toISOString(), { zone });
941
+ }
942
+ if (date instanceof Date) {
943
+ return import_luxon.DateTime.fromJSDate(date, { zone });
944
+ }
945
+ if (typeof date === "string" && date) {
946
+ return import_luxon.DateTime.fromISO(date, { zone });
947
+ }
948
+ if (typeof date === "number") {
949
+ return import_luxon.DateTime.fromMillis(date, { zone });
950
+ }
951
+ throw new Error(`Unsupported date format: ${date} (${date.constructor.name})`);
952
+ };
953
+
954
+ // src/db/generate.ts
902
955
  var PRIMITIVE_TYPES = {
903
956
  ID: "string",
904
957
  Boolean: "boolean",
905
958
  Upload: "string",
906
959
  Int: "number",
907
960
  Float: "number",
908
- String: "string",
909
- DateTime: "DateTime | string"
961
+ String: "string"
910
962
  };
911
963
  var OPTIONAL_SEED_FIELDS = ["createdAt", "createdById", "updatedAt", "updatedById", "deletedAt", "deletedById"];
912
- var generateDBModels = (models) => {
964
+ var generateDBModels = (models, dateLibrary) => {
913
965
  const writer = new import_code_block_writer.default["default"]({
914
966
  useSingleQuote: true,
915
967
  indentNumberOfSpaces: 2
916
968
  });
917
- writer.write(`import { DateTime } from 'luxon';`).blankLine();
969
+ writer.write(DATE_CLASS_IMPORT[dateLibrary]).blankLine();
918
970
  for (const enm2 of models.enums) {
919
971
  writer.write(`export type ${enm2.name} = ${enm2.values.map((v) => `'${v}'`).join(" | ")};`).blankLine();
920
972
  }
@@ -922,14 +974,16 @@ var generateDBModels = (models) => {
922
974
  const fields2 = model.relations.some((relation) => relation.field.foreignKey === "id") ? model.fields.filter((field) => field.name !== "id") : model.fields;
923
975
  writer.write(`export type ${model.name} = `).inlineBlock(() => {
924
976
  for (const field of fields2.filter(not(isCustomField))) {
925
- writer.write(`'${getColumnName(field)}': ${getFieldType(field)}${field.nonNull ? "" : " | null"};`).newLine();
977
+ writer.write(`'${getColumnName(field)}': ${getFieldType(field, dateLibrary)}${field.nonNull ? "" : " | null"};`).newLine();
926
978
  }
927
979
  }).blankLine();
928
980
  writer.write(`export type ${model.name}Initializer = `).inlineBlock(() => {
929
981
  for (const field of fields2.filter(not(isCustomField)).filter(isInTable)) {
930
982
  writer.write(
931
983
  `'${getColumnName(field)}'${field.nonNull && field.defaultValue === void 0 ? "" : "?"}: ${getFieldType(
932
- field
984
+ field,
985
+ dateLibrary,
986
+ true
933
987
  )}${field.list ? " | string" : ""}${field.nonNull ? "" : " | null"};`
934
988
  ).newLine();
935
989
  }
@@ -937,7 +991,7 @@ var generateDBModels = (models) => {
937
991
  writer.write(`export type ${model.name}Mutator = `).inlineBlock(() => {
938
992
  for (const field of fields2.filter(not(isCustomField)).filter(isInTable)) {
939
993
  writer.write(
940
- `'${getColumnName(field)}'?: ${getFieldType(field)}${field.list ? " | string" : ""}${field.nonNull ? "" : " | null"};`
994
+ `'${getColumnName(field)}'?: ${getFieldType(field, dateLibrary, true)}${field.list ? " | string" : ""}${field.nonNull ? "" : " | null"};`
941
995
  ).newLine();
942
996
  }
943
997
  }).blankLine();
@@ -949,7 +1003,7 @@ var generateDBModels = (models) => {
949
1003
  }
950
1004
  const fieldName = getColumnName(field);
951
1005
  writer.write(
952
- `'${getColumnName(field)}'${field.nonNull && field.defaultValue === void 0 && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? "" : "?"}: ${field.kind === "enum" ? field.list ? "string[]" : "string" : getFieldType(field)}${field.list ? " | string" : ""}${field.nonNull ? "" : " | null"};`
1006
+ `'${getColumnName(field)}'${field.nonNull && field.defaultValue === void 0 && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? "" : "?"}: ${field.kind === "enum" ? field.list ? "string[]" : "string" : getFieldType(field, dateLibrary, true)}${field.list ? " | string" : ""}${field.nonNull ? "" : " | null"};`
953
1007
  ).newLine();
954
1008
  }
955
1009
  }).blankLine();
@@ -962,7 +1016,7 @@ var generateDBModels = (models) => {
962
1016
  });
963
1017
  return writer.toString();
964
1018
  };
965
- var getFieldType = (field) => {
1019
+ var getFieldType = (field, dateLibrary, input2) => {
966
1020
  const kind = field.kind;
967
1021
  switch (kind) {
968
1022
  case "json":
@@ -975,6 +1029,9 @@ var getFieldType = (field) => {
975
1029
  throw new Error(`Custom fields are not in the db.`);
976
1030
  case "primitive":
977
1031
  case void 0:
1032
+ if (field.type === "DateTime") {
1033
+ return (input2 ? `(${DATE_CLASS[dateLibrary]} | string)` : DATE_CLASS[dateLibrary]) + (field.list ? "[]" : "");
1034
+ }
978
1035
  return get(PRIMITIVE_TYPES, field.type) + (field.list ? "[]" : "");
979
1036
  default: {
980
1037
  const exhaustiveCheck = kind;
@@ -1111,15 +1168,13 @@ var MigrationGenerator = class {
1111
1168
  this.createFields(
1112
1169
  model,
1113
1170
  model.fields.filter(not(isInherited)).filter(
1114
- ({ name: name2, ...field }) => field.kind !== "custom" && !this.columns[model.name].some(
1115
- (col) => col.name === (field.kind === "relation" ? field.foreignKey || `${name2}Id` : name2)
1116
- )
1171
+ ({ name: name2, ...field }) => field.kind !== "custom" && !this.getColumn(model.name, field.kind === "relation" ? field.foreignKey || `${name2}Id` : name2)
1117
1172
  ),
1118
1173
  up,
1119
1174
  down
1120
1175
  );
1121
1176
  const existingFields = model.fields.filter(({ name: name2, kind, nonNull: nonNull2 }) => {
1122
- const col = this.columns[model.name].find((col2) => col2.name === (kind === "relation" ? `${name2}Id` : name2));
1177
+ const col = this.getColumn(model.name, kind === "relation" ? `${name2}Id` : name2);
1123
1178
  if (!col) {
1124
1179
  return false;
1125
1180
  }
@@ -1161,15 +1216,11 @@ var MigrationGenerator = class {
1161
1216
  } else {
1162
1217
  const revisionTable = `${model.name}Revision`;
1163
1218
  const missingRevisionFields = model.fields.filter(isUpdatableField).filter(
1164
- ({ name: name2, ...field }) => field.kind !== "custom" && !this.columns[revisionTable].some(
1165
- (col) => col.name === (field.kind === "relation" ? field.foreignKey || `${name2}Id` : name2)
1166
- )
1219
+ ({ name: name2, ...field }) => field.kind !== "custom" && !this.getColumn(revisionTable, field.kind === "relation" ? field.foreignKey || `${name2}Id` : name2)
1167
1220
  );
1168
1221
  this.createRevisionFields(model, missingRevisionFields, up, down);
1169
1222
  const revisionFieldsToRemove = model.fields.filter(
1170
- ({ name: name2, updatable, generated, ...field }) => !generated && field.kind !== "custom" && !updatable && !(field.kind === "relation" && field.foreignKey === "id") && this.columns[revisionTable].some(
1171
- (col) => col.name === (field.kind === "relation" ? field.foreignKey || `${name2}Id` : name2)
1172
- )
1223
+ ({ name: name2, updatable, generated, ...field }) => !generated && field.kind !== "custom" && !updatable && !(field.kind === "relation" && field.foreignKey === "id") && this.getColumn(revisionTable, field.kind === "relation" ? field.foreignKey || `${name2}Id` : name2)
1173
1224
  );
1174
1225
  this.createRevisionFields(model, revisionFieldsToRemove, down, up);
1175
1226
  }
@@ -1178,12 +1229,26 @@ var MigrationGenerator = class {
1178
1229
  }
1179
1230
  for (const model of models.entities) {
1180
1231
  if (tables.includes(model.name)) {
1181
- this.createFields(
1182
- model,
1183
- model.fields.filter(({ name: name2, deleted }) => deleted && this.columns[model.name].some((col) => col.name === name2)),
1184
- down,
1185
- up
1186
- );
1232
+ const fieldsToDelete = model.fields.filter(({ name: name2, deleted }) => deleted && this.getColumn(model.name, name2));
1233
+ if (!isCreatableModel(model)) {
1234
+ if (this.getColumn(model.name, "createdAt")) {
1235
+ fieldsToDelete.push({ name: "createdAt", type: "DateTime", nonNull: true });
1236
+ }
1237
+ if (this.getColumn(model.name, "createdBy")) {
1238
+ fieldsToDelete.push({ name: "createdBy", kind: "relation", type: "User", nonNull: true });
1239
+ }
1240
+ }
1241
+ if (!isUpdatableModel(model)) {
1242
+ if (this.getColumn(model.name, "updatedAt")) {
1243
+ fieldsToDelete.push({ name: "updatedAt", type: "DateTime", nonNull: true });
1244
+ }
1245
+ if (this.getColumn(model.name, "updatedBy")) {
1246
+ fieldsToDelete.push({ name: "updatedBy", kind: "relation", type: "User", nonNull: true });
1247
+ }
1248
+ }
1249
+ if (fieldsToDelete.length) {
1250
+ this.createFields(model, fieldsToDelete, down, up);
1251
+ }
1187
1252
  if (isUpdatableModel(model)) {
1188
1253
  this.createRevisionFields(
1189
1254
  model,
@@ -1519,6 +1584,9 @@ var MigrationGenerator = class {
1519
1584
  }
1520
1585
  }
1521
1586
  }
1587
+ getColumn(tableName, columnName) {
1588
+ return this.columns[tableName].find((col) => col.name === columnName);
1589
+ }
1522
1590
  };
1523
1591
  var getMigrationDate = () => {
1524
1592
  const date = /* @__PURE__ */ new Date();
@@ -2707,7 +2775,7 @@ var restore = async (model, { where }, ctx) => {
2707
2775
  const mutations = [];
2708
2776
  const afterHooks = [];
2709
2777
  const restoreCascade = async (currentModel, relatedEntity) => {
2710
- if (!relatedEntity.deleted || !relatedEntity.deletedAt || !relatedEntity.deletedAt.equals(entity.deletedAt)) {
2778
+ if (!relatedEntity.deleted || !relatedEntity.deletedAt || anyDateToLuxon(relatedEntity.deletedAt, ctx.timeZone).equals(anyDateToLuxon(entity.deletedAt, ctx.timeZone))) {
2711
2779
  return;
2712
2780
  }
2713
2781
  const normalizedInput = { deleted: false, deletedAt: null, deletedById: null };
@@ -2790,7 +2858,7 @@ var sanitize = (ctx, model, data) => {
2790
2858
  continue;
2791
2859
  }
2792
2860
  if (isEndOfDay(field) && data[key]) {
2793
- data[key] = data[key].endOf("day");
2861
+ data[key] = anyDateToLuxon(data[key], ctx.timeZone);
2794
2862
  continue;
2795
2863
  }
2796
2864
  if (field.list && field.kind === "enum" && Array.isArray(data[key])) {
@@ -2843,7 +2911,8 @@ var getResolvers = (models) => {
2843
2911
  var import_graphql5 = require("graphql");
2844
2912
 
2845
2913
  // src/schema/utils.ts
2846
- var import_luxon = require("luxon");
2914
+ var import_dayjs2 = require("dayjs");
2915
+ var import_luxon2 = require("luxon");
2847
2916
  var document = (definitions) => ({
2848
2917
  kind: "Document",
2849
2918
  definitions
@@ -2977,10 +3046,13 @@ var value = (val = null) => val === null ? {
2977
3046
  } : Array.isArray(val) ? {
2978
3047
  kind: "ListValue",
2979
3048
  values: val.map(value)
2980
- } : val instanceof import_luxon.DateTime ? {
3049
+ } : val instanceof import_luxon2.DateTime ? {
2981
3050
  kind: "StringValue",
2982
3051
  value: val.toString()
2983
- } : {
3052
+ } : val instanceof import_dayjs2.Dayjs ? {
3053
+ kind: "StringValue",
3054
+ value: val.toISOString()
3055
+ } : typeof val === "object" ? {
2984
3056
  kind: "ObjectValue",
2985
3057
  fields: Object.keys(val).map(
2986
3058
  (nme) => ({
@@ -2989,6 +3061,9 @@ var value = (val = null) => val === null ? {
2989
3061
  value: value(val[nme])
2990
3062
  })
2991
3063
  )
3064
+ } : doThrow(`Unsupported value ${val}`);
3065
+ var doThrow = (message) => {
3066
+ throw new Error(message);
2992
3067
  };
2993
3068
 
2994
3069
  // src/schema/generate.ts
@@ -3235,6 +3310,8 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
3235
3310
  // Annotate the CommonJS export names for ESM import in node:
3236
3311
  0 && (module.exports = {
3237
3312
  AliasGenerator,
3313
+ DATE_CLASS,
3314
+ DATE_CLASS_IMPORT,
3238
3315
  EntityModel,
3239
3316
  EnumModel,
3240
3317
  ForbiddenError,
@@ -3259,12 +3336,14 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
3259
3336
  UserInputError,
3260
3337
  addJoin,
3261
3338
  and,
3339
+ anyDateToLuxon,
3262
3340
  apply,
3263
3341
  applyFilters,
3264
3342
  applyJoins,
3265
3343
  applyPermissions,
3266
3344
  applySelects,
3267
3345
  args,
3346
+ as,
3268
3347
  checkCanWrite,
3269
3348
  directive,
3270
3349
  directives,
@@ -3319,6 +3398,8 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
3319
3398
  inputValues,
3320
3399
  isCreatable,
3321
3400
  isCreatableBy,
3401
+ isCreatableField,
3402
+ isCreatableModel,
3322
3403
  isCustomField,
3323
3404
  isEntityModel,
3324
3405
  isEnum,
@@ -3,7 +3,7 @@ import { Context } from '..';
3
3
  export declare const execute: ({ additionalResolvers, body, ...ctx }: {
4
4
  additionalResolvers?: IResolvers<any, any>;
5
5
  body: any;
6
- } & Omit<Context, "document">) => Promise<import("graphql").ExecutionResult<{
6
+ } & Omit<Context, 'document'>) => Promise<import("graphql").ExecutionResult<{
7
7
  [key: string]: any;
8
8
  }, {
9
9
  [key: string]: any;
@@ -2,18 +2,19 @@
2
2
  import { DocumentNode, GraphQLResolveInfo } from 'graphql';
3
3
  import { IncomingMessage } from 'http';
4
4
  import { Knex } from 'knex';
5
- import { DateTime } from 'luxon';
6
5
  import { Models } from './models/models';
7
6
  import { Entity, MutationHook } from './models/mutation-hook';
8
7
  import { Permissions } from './permissions/generate';
9
8
  import { AliasGenerator } from './resolvers/utils';
9
+ import { AnyDateType } from './utils';
10
10
  export type User = {
11
11
  id: string;
12
12
  role: string;
13
13
  };
14
- export type Context = {
14
+ export type Context<DateType extends AnyDateType = AnyDateType> = {
15
15
  req: IncomingMessage;
16
- now: DateTime;
16
+ now: DateType;
17
+ timeZone?: string;
17
18
  knex: Knex;
18
19
  document: DocumentNode;
19
20
  locale: string;
@@ -21,7 +22,7 @@ export type Context = {
21
22
  user?: User;
22
23
  models: Models;
23
24
  permissions: Permissions;
24
- mutationHook?: MutationHook;
25
+ mutationHook?: MutationHook<DateType>;
25
26
  handleUploads?: (data: Entity) => Promise<void>;
26
27
  };
27
28
  export type FullContext = Context & {
@@ -1,3 +1,4 @@
1
1
  import { Models } from '../models/models';
2
- export declare const generateDBModels: (models: Models) => string;
2
+ import { DateLibrary } from '../utils/dates';
3
+ export declare const generateDBModels: (models: Models, dateLibrary: DateLibrary) => string;
3
4
  export declare const generateKnexTables: (models: Models) => string;
@@ -1,5 +1,6 @@
1
1
  import CodeBlockWriter from 'code-block-writer';
2
2
  import { get, getColumnName, isCustomField, isInTable, isRootModel, not } from '..';
3
+ import { DATE_CLASS, DATE_CLASS_IMPORT } from '../utils/dates';
3
4
  const PRIMITIVE_TYPES = {
4
5
  ID: 'string',
5
6
  Boolean: 'boolean',
@@ -7,15 +8,14 @@ const PRIMITIVE_TYPES = {
7
8
  Int: 'number',
8
9
  Float: 'number',
9
10
  String: 'string',
10
- DateTime: 'DateTime | string',
11
11
  };
12
12
  const OPTIONAL_SEED_FIELDS = ['createdAt', 'createdById', 'updatedAt', 'updatedById', 'deletedAt', 'deletedById'];
13
- export const generateDBModels = (models) => {
13
+ export const generateDBModels = (models, dateLibrary) => {
14
14
  const writer = new CodeBlockWriter['default']({
15
15
  useSingleQuote: true,
16
16
  indentNumberOfSpaces: 2,
17
17
  });
18
- writer.write(`import { DateTime } from 'luxon';`).blankLine();
18
+ writer.write(DATE_CLASS_IMPORT[dateLibrary]).blankLine();
19
19
  for (const enm of models.enums) {
20
20
  writer.write(`export type ${enm.name} = ${enm.values.map((v) => `'${v}'`).join(' | ')};`).blankLine();
21
21
  }
@@ -28,7 +28,9 @@ export const generateDBModels = (models) => {
28
28
  .write(`export type ${model.name} = `)
29
29
  .inlineBlock(() => {
30
30
  for (const field of fields.filter(not(isCustomField))) {
31
- writer.write(`'${getColumnName(field)}': ${getFieldType(field)}${field.nonNull ? '' : ' | null'};`).newLine();
31
+ writer
32
+ .write(`'${getColumnName(field)}': ${getFieldType(field, dateLibrary)}${field.nonNull ? '' : ' | null'};`)
33
+ .newLine();
32
34
  }
33
35
  })
34
36
  .blankLine();
@@ -37,7 +39,7 @@ export const generateDBModels = (models) => {
37
39
  .inlineBlock(() => {
38
40
  for (const field of fields.filter(not(isCustomField)).filter(isInTable)) {
39
41
  writer
40
- .write(`'${getColumnName(field)}'${field.nonNull && field.defaultValue === undefined ? '' : '?'}: ${getFieldType(field)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
42
+ .write(`'${getColumnName(field)}'${field.nonNull && field.defaultValue === undefined ? '' : '?'}: ${getFieldType(field, dateLibrary, true)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
41
43
  .newLine();
42
44
  }
43
45
  })
@@ -47,7 +49,7 @@ export const generateDBModels = (models) => {
47
49
  .inlineBlock(() => {
48
50
  for (const field of fields.filter(not(isCustomField)).filter(isInTable)) {
49
51
  writer
50
- .write(`'${getColumnName(field)}'?: ${getFieldType(field)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
52
+ .write(`'${getColumnName(field)}'?: ${getFieldType(field, dateLibrary, true)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
51
53
  .newLine();
52
54
  }
53
55
  })
@@ -62,7 +64,7 @@ export const generateDBModels = (models) => {
62
64
  }
63
65
  const fieldName = getColumnName(field);
64
66
  writer
65
- .write(`'${getColumnName(field)}'${field.nonNull && field.defaultValue === undefined && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? '' : '?'}: ${field.kind === 'enum' ? (field.list ? 'string[]' : 'string') : getFieldType(field)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
67
+ .write(`'${getColumnName(field)}'${field.nonNull && field.defaultValue === undefined && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? '' : '?'}: ${field.kind === 'enum' ? (field.list ? 'string[]' : 'string') : getFieldType(field, dateLibrary, true)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
66
68
  .newLine();
67
69
  }
68
70
  })
@@ -76,7 +78,7 @@ export const generateDBModels = (models) => {
76
78
  });
77
79
  return writer.toString();
78
80
  };
79
- const getFieldType = (field) => {
81
+ const getFieldType = (field, dateLibrary, input) => {
80
82
  const kind = field.kind;
81
83
  switch (kind) {
82
84
  case 'json':
@@ -91,6 +93,9 @@ const getFieldType = (field) => {
91
93
  throw new Error(`Custom fields are not in the db.`);
92
94
  case 'primitive':
93
95
  case undefined:
96
+ if (field.type === 'DateTime') {
97
+ return (input ? `(${DATE_CLASS[dateLibrary]} | string)` : DATE_CLASS[dateLibrary]) + (field.list ? '[]' : '');
98
+ }
94
99
  return get(PRIMITIVE_TYPES, field.type) + (field.list ? '[]' : '');
95
100
  default: {
96
101
  const exhaustiveCheck = kind;
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/db/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/db/generate.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAe,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AAEjG,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAe,MAAM,gBAAgB,CAAC;AAE5E,MAAM,eAAe,GAAG;IACtB,EAAE,EAAE,QAAQ;IACZ,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,QAAQ;IACb,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,QAAQ;CACjB,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAElH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAE,WAAwB,EAAE,EAAE;IAC3E,MAAM,MAAM,GAAoB,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7D,cAAc,EAAE,IAAI;QACpB,oBAAoB,EAAE,CAAC;KACxB,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAEzD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IACxG,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,gDAAgD;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;YACnF,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;YACrD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAEjB,MAAM;aACH,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,KAAK,CAAC;aACrC,WAAW,CAAC,GAAG,EAAE;YAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;gBACtD,MAAM;qBACH,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC;qBACzG,OAAO,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC;aACD,SAAS,EAAE,CAAC;QAEf,MAAM;aACH,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,gBAAgB,CAAC;aAChD,WAAW,CAAC,GAAG,EAAE;YAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxE,MAAM;qBACH,KAAK,CACJ,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CACvG,KAAK,EACL,WAAW,EACX,IAAI,CACL,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CACtE;qBACA,OAAO,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC;aACD,SAAS,EAAE,CAAC;QAEf,MAAM;aACH,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,YAAY,CAAC;aAC5C,WAAW,CAAC,GAAG,EAAE;YAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxE,MAAM;qBACH,KAAK,CACJ,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GACnG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SACvB,GAAG,CACJ;qBACA,OAAO,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC;aACD,SAAS,EAAE,CAAC;QAEf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM;iBACH,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,SAAS,CAAC;iBACzC,WAAW,CAAC,GAAG,EAAE;gBAChB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;oBACtD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC1C,SAAS;oBACX,CAAC;oBACD,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;oBACvC,MAAM;yBACH,KAAK,CACJ,IAAI,aAAa,CAAC,KAAK,CAAC,IACtB,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACxG,KAAK,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,GACxG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAC7B,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CACrC;yBACA,OAAO,EAAE,CAAC;gBACf,CAAC;YACH,CAAC,CAAC;iBACD,SAAS,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;QACvD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAE,WAAwB,EAAE,KAAe,EAAE,EAAE;IACrF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,gCAAgC;YAChC,OAAO,QAAQ,CAAC;QAClB,KAAK,UAAU;YACb,8BAA8B;YAC9B,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,KAAK,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS;YACZ,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChH,CAAC;YACD,OAAO,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,eAAe,GAAU,IAAI,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAE,EAAE;IACnD,MAAM,MAAM,GAAoB,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC;QAC7D,cAAc,EAAE,IAAI;QACpB,oBAAoB,EAAE,CAAC;KACxB,CAAC,CAAC;IAEH,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,OAAO,EAAE,CAAC;IACvD,MAAM;SACH,KAAK,CACJ,YAAY,MAAM,CAAC,QAAQ;SACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,IAAI,SAAS,CAAC;SAC/E,IAAI,CAAC,IAAI,CAAC,cAAc,CAC5B;SACA,SAAS,EAAE,CAAC;IAEf,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;QACnE,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;YACjD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpC,MAAM;qBACH,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,8BAA8B,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,IAAI,WAAW,CAAC;qBACjH,OAAO,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC,CAAC"}
@@ -6,6 +6,7 @@ export * from './models';
6
6
  export * from './permissions';
7
7
  export * from './resolvers';
8
8
  export * from './schema';
9
+ export * from './utils';
9
10
  export * from './context';
10
11
  export * from './errors';
11
12
  export * from './values';
package/dist/esm/index.js CHANGED
@@ -7,6 +7,7 @@ export * from './models';
7
7
  export * from './permissions';
8
8
  export * from './resolvers';
9
9
  export * from './schema';
10
+ export * from './utils';
10
11
  export * from './context';
11
12
  export * from './errors';
12
13
  export * from './values';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
@@ -24,5 +24,6 @@ export declare class MigrationGenerator {
24
24
  private renameColumn;
25
25
  private value;
26
26
  private column;
27
+ private getColumn;
27
28
  }
28
29
  export declare const getMigrationDate: () => string;
@@ -1,7 +1,7 @@
1
1
  import CodeBlockWriter from 'code-block-writer';
2
2
  import { SchemaInspector } from 'knex-schema-inspector';
3
3
  import lowerFirst from 'lodash/lowerFirst';
4
- import { and, get, isInherited, isUpdatableField, isUpdatableModel, modelNeedsTable, not, summonByName, typeToField, } from '../models/utils';
4
+ import { and, get, isCreatableModel, isInherited, isUpdatableField, isUpdatableModel, modelNeedsTable, not, summonByName, typeToField, } from '../models/utils';
5
5
  export class MigrationGenerator {
6
6
  models;
7
7
  writer = new CodeBlockWriter['default']({
@@ -106,10 +106,10 @@ export class MigrationGenerator {
106
106
  this.createFields(model, model.fields
107
107
  .filter(not(isInherited))
108
108
  .filter(({ name, ...field }) => field.kind !== 'custom' &&
109
- !this.columns[model.name].some((col) => col.name === (field.kind === 'relation' ? field.foreignKey || `${name}Id` : name))), up, down);
109
+ !this.getColumn(model.name, field.kind === 'relation' ? field.foreignKey || `${name}Id` : name)), up, down);
110
110
  // Update fields
111
111
  const existingFields = model.fields.filter(({ name, kind, nonNull }) => {
112
- const col = this.columns[model.name].find((col) => col.name === (kind === 'relation' ? `${name}Id` : name));
112
+ const col = this.getColumn(model.name, kind === 'relation' ? `${name}Id` : name);
113
113
  if (!col) {
114
114
  return false;
115
115
  }
@@ -161,13 +161,13 @@ export class MigrationGenerator {
161
161
  const missingRevisionFields = model.fields
162
162
  .filter(isUpdatableField)
163
163
  .filter(({ name, ...field }) => field.kind !== 'custom' &&
164
- !this.columns[revisionTable].some((col) => col.name === (field.kind === 'relation' ? field.foreignKey || `${name}Id` : name)));
164
+ !this.getColumn(revisionTable, field.kind === 'relation' ? field.foreignKey || `${name}Id` : name));
165
165
  this.createRevisionFields(model, missingRevisionFields, up, down);
166
166
  const revisionFieldsToRemove = model.fields.filter(({ name, updatable, generated, ...field }) => !generated &&
167
167
  field.kind !== 'custom' &&
168
168
  !updatable &&
169
169
  !(field.kind === 'relation' && field.foreignKey === 'id') &&
170
- this.columns[revisionTable].some((col) => col.name === (field.kind === 'relation' ? field.foreignKey || `${name}Id` : name)));
170
+ this.getColumn(revisionTable, field.kind === 'relation' ? field.foreignKey || `${name}Id` : name));
171
171
  this.createRevisionFields(model, revisionFieldsToRemove, down, up);
172
172
  }
173
173
  }
@@ -175,7 +175,26 @@ export class MigrationGenerator {
175
175
  }
176
176
  for (const model of models.entities) {
177
177
  if (tables.includes(model.name)) {
178
- this.createFields(model, model.fields.filter(({ name, deleted }) => deleted && this.columns[model.name].some((col) => col.name === name)), down, up);
178
+ const fieldsToDelete = model.fields.filter(({ name, deleted }) => deleted && this.getColumn(model.name, name));
179
+ if (!isCreatableModel(model)) {
180
+ if (this.getColumn(model.name, 'createdAt')) {
181
+ fieldsToDelete.push({ name: 'createdAt', type: 'DateTime', nonNull: true });
182
+ }
183
+ if (this.getColumn(model.name, 'createdBy')) {
184
+ fieldsToDelete.push({ name: 'createdBy', kind: 'relation', type: 'User', nonNull: true });
185
+ }
186
+ }
187
+ if (!isUpdatableModel(model)) {
188
+ if (this.getColumn(model.name, 'updatedAt')) {
189
+ fieldsToDelete.push({ name: 'updatedAt', type: 'DateTime', nonNull: true });
190
+ }
191
+ if (this.getColumn(model.name, 'updatedBy')) {
192
+ fieldsToDelete.push({ name: 'updatedBy', kind: 'relation', type: 'User', nonNull: true });
193
+ }
194
+ }
195
+ if (fieldsToDelete.length) {
196
+ this.createFields(model, fieldsToDelete, down, up);
197
+ }
179
198
  if (isUpdatableModel(model)) {
180
199
  this.createRevisionFields(model, model.fields.filter(isUpdatableField).filter(({ deleted }) => deleted), down, up);
181
200
  }
@@ -525,6 +544,9 @@ export class MigrationGenerator {
525
544
  }
526
545
  }
527
546
  }
547
+ getColumn(tableName, columnName) {
548
+ return this.columns[tableName].find((col) => col.name === columnName);
549
+ }
528
550
  }
529
551
  export const getMigrationDate = () => {
530
552
  const date = new Date();