@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.
- package/.gqmrc.json +4 -2
- package/CHANGELOG.md +1 -6
- package/dist/bin/gqm.cjs +115 -42
- package/dist/cjs/index.cjs +111 -30
- package/dist/esm/api/execute.d.ts +1 -1
- package/dist/esm/context.d.ts +5 -4
- package/dist/esm/db/generate.d.ts +2 -1
- package/dist/esm/db/generate.js +13 -8
- package/dist/esm/db/generate.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/migrations/generate.d.ts +1 -0
- package/dist/esm/migrations/generate.js +28 -6
- package/dist/esm/migrations/generate.js.map +1 -1
- package/dist/esm/models/mutation-hook.d.ts +5 -12
- package/dist/esm/models/utils.d.ts +20 -7
- package/dist/esm/models/utils.js +8 -0
- package/dist/esm/models/utils.js.map +1 -1
- package/dist/esm/permissions/check.d.ts +2 -3
- package/dist/esm/permissions/check.js.map +1 -1
- package/dist/esm/resolvers/arguments.d.ts +1 -1
- package/dist/esm/resolvers/mutations.js +5 -2
- package/dist/esm/resolvers/mutations.js.map +1 -1
- package/dist/esm/schema/utils.js +19 -8
- package/dist/esm/schema/utils.js.map +1 -1
- package/dist/esm/utils/dates.d.ts +12 -0
- package/dist/esm/utils/dates.js +37 -0
- package/dist/esm/utils/dates.js.map +1 -0
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.js +3 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/values.d.ts +1 -3
- package/docker-compose.yml +0 -1
- package/docs/docs/1-tutorial.md +6 -6
- package/docs/docs/6-graphql-server.md +1 -3
- package/docs/docs/7-graphql-client.md +1 -1
- package/docs/docs/8-permissions.md +145 -0
- package/docs/package-lock.json +177 -177
- package/docs/package.json +6 -6
- package/knexfile.ts +2 -2
- package/migrations/20230912185644_setup.ts +37 -8
- package/package.json +5 -4
- package/src/bin/gqm/codegen.ts +4 -3
- package/src/bin/gqm/gqm.ts +4 -2
- package/src/bin/gqm/settings.ts +37 -2
- package/src/bin/gqm/templates.ts +19 -8
- package/src/context.ts +9 -5
- package/src/db/generate.ts +15 -8
- package/src/index.ts +1 -0
- package/src/migrations/generate.ts +34 -16
- package/src/models/mutation-hook.ts +5 -8
- package/src/models/utils.ts +24 -0
- package/src/permissions/check.ts +2 -3
- package/src/resolvers/mutations.ts +10 -6
- package/src/schema/utils.ts +14 -2
- package/src/utils/dates.ts +48 -0
- package/src/utils/index.ts +3 -0
- package/src/values.ts +1 -5
- package/tests/generated/client/index.ts +3 -1
- package/tests/generated/db/index.ts +43 -43
- package/tests/utils/database/seed.ts +9 -5
- package/tests/utils/server.ts +3 -3
package/dist/cjs/index.cjs
CHANGED
|
@@ -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(
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
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 ||
|
|
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].
|
|
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
|
|
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
|
|
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,
|
|
6
|
+
} & Omit<Context, 'document'>) => Promise<import("graphql").ExecutionResult<{
|
|
7
7
|
[key: string]: any;
|
|
8
8
|
}, {
|
|
9
9
|
[key: string]: any;
|
package/dist/esm/context.d.ts
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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;
|
package/dist/esm/db/generate.js
CHANGED
|
@@ -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(
|
|
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
|
|
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":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAe,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/db/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -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"}
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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();
|