@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.
- package/CHANGELOG.md +1 -6
- package/README.md +46 -0
- package/dist/cjs/index.cjs +260 -196
- package/dist/esm/api/execute.d.ts +10 -0
- package/dist/esm/api/execute.js +32 -0
- package/dist/esm/api/execute.js.map +1 -0
- package/dist/esm/api/index.d.ts +1 -0
- package/dist/esm/api/index.js +3 -0
- package/dist/esm/api/index.js.map +1 -0
- package/dist/esm/client/queries.d.ts +4 -1
- package/dist/esm/client/queries.js +7 -4
- package/dist/esm/client/queries.js.map +1 -1
- package/dist/esm/context.d.ts +1 -4
- package/dist/esm/db/generate.js +21 -13
- package/dist/esm/db/generate.js.map +1 -1
- package/dist/esm/generate/generate.d.ts +1 -1
- package/dist/esm/generate/generate.js +17 -22
- package/dist/esm/generate/generate.js.map +1 -1
- package/dist/esm/generate/mutations.d.ts +1 -1
- package/dist/esm/generate/utils.d.ts +10 -1
- package/dist/esm/generate/utils.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/migrations/generate.d.ts +1 -1
- package/dist/esm/migrations/generate.js +82 -89
- package/dist/esm/migrations/generate.js.map +1 -1
- package/dist/esm/models/index.d.ts +2 -0
- package/dist/esm/models/index.js +4 -0
- package/dist/esm/models/index.js.map +1 -0
- package/dist/esm/models/models.d.ts +192 -0
- package/dist/esm/models/models.js +2 -0
- package/dist/esm/models/models.js.map +1 -0
- package/dist/esm/models/utils.d.ts +205 -0
- package/dist/esm/{utils.js → models/utils.js} +69 -21
- package/dist/esm/models/utils.js.map +1 -0
- package/dist/esm/permissions/check.d.ts +1 -1
- package/dist/esm/permissions/check.js +2 -2
- package/dist/esm/permissions/check.js.map +1 -1
- package/dist/esm/permissions/generate.d.ts +1 -1
- package/dist/esm/permissions/generate.js +2 -2
- package/dist/esm/permissions/generate.js.map +1 -1
- package/dist/esm/resolvers/arguments.js +1 -1
- package/dist/esm/resolvers/arguments.js.map +1 -1
- package/dist/esm/resolvers/filters.js +2 -2
- package/dist/esm/resolvers/filters.js.map +1 -1
- package/dist/esm/resolvers/mutations.js +5 -6
- package/dist/esm/resolvers/mutations.js.map +1 -1
- package/dist/esm/resolvers/node.d.ts +1 -1
- package/dist/esm/resolvers/node.js +4 -5
- package/dist/esm/resolvers/node.js.map +1 -1
- package/dist/esm/resolvers/resolver.js +3 -3
- package/dist/esm/resolvers/resolver.js.map +1 -1
- package/dist/esm/resolvers/resolvers.d.ts +1 -1
- package/dist/esm/resolvers/resolvers.js +1 -1
- package/dist/esm/resolvers/resolvers.js.map +1 -1
- package/dist/esm/resolvers/utils.js +1 -1
- package/dist/esm/resolvers/utils.js.map +1 -1
- package/package.json +5 -5
- package/src/api/execute.ts +45 -0
- package/src/api/index.ts +3 -0
- package/src/client/queries.ts +16 -10
- package/src/context.ts +1 -3
- package/src/db/generate.ts +22 -15
- package/src/generate/generate.ts +26 -34
- package/src/generate/mutations.ts +1 -1
- package/src/generate/utils.ts +11 -1
- package/src/index.ts +2 -2
- package/src/migrations/generate.ts +84 -82
- package/src/models/index.ts +4 -0
- package/src/models/models.ts +184 -0
- package/src/models/utils.ts +288 -0
- package/src/permissions/check.ts +3 -3
- package/src/permissions/generate.ts +3 -3
- package/src/resolvers/arguments.ts +1 -1
- package/src/resolvers/filters.ts +2 -2
- package/src/resolvers/mutations.ts +10 -9
- package/src/resolvers/node.ts +6 -6
- package/src/resolvers/resolver.ts +3 -3
- package/src/resolvers/resolvers.ts +2 -2
- package/src/resolvers/utils.ts +1 -1
- package/tests/unit/resolve.spec.ts +4 -19
- package/tests/utils/models.ts +8 -7
- package/tests/utils/server.ts +13 -33
- package/dist/esm/models.d.ts +0 -170
- package/dist/esm/models.js +0 -27
- package/dist/esm/models.js.map +0 -1
- package/dist/esm/utils.d.ts +0 -25
- package/dist/esm/utils.js.map +0 -1
- package/src/models.ts +0 -228
- package/src/utils.ts +0 -187
package/dist/cjs/index.cjs
CHANGED
|
@@ -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
|
-
{
|
|
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: "
|
|
227
|
-
|
|
228
|
-
nonNull:
|
|
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
|
-
{
|
|
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: "
|
|
238
|
-
|
|
239
|
-
nonNull:
|
|
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:
|
|
251
|
-
|
|
252
|
-
|
|
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: "
|
|
258
|
-
|
|
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((
|
|
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
|
|
277
|
-
|
|
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
|
-
|
|
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,
|
|
360
|
-
const model2 = summonByName(models,
|
|
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((
|
|
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((
|
|
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((
|
|
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((
|
|
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 = (
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
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
|
|
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
|
-
|
|
784
|
-
|
|
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
|
|
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
|
|
877
|
+
...model.fields.filter(isRelation).filter(({ filterable }) => filterable).map(({ name: name2, typeName }) => ({
|
|
817
878
|
name: name2,
|
|
818
|
-
type: `${
|
|
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,
|
|
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,
|
|
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,
|
|
962
|
-
...Object.values(schema.getTypeMap()).filter((t) => !t.name.match(/^__/)).sort((a, b) => a.name > b.name ? 1 : -1).map((t) => t.astNode && (0,
|
|
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
|
|
966
|
-
var
|
|
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,
|
|
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,
|
|
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 !
|
|
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,
|
|
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,
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
col(`table.
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
}
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
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
|
|
1509
|
-
var GraphQLError = class extends
|
|
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
|
|
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 ===
|
|
1559
|
-
var isInlineFragmentNode = (n) => n.kind ===
|
|
1560
|
-
var isFragmentSpreadNode = (n) => n.kind ===
|
|
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(
|
|
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.
|
|
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
|
|
1947
|
+
var import_graphql5 = require("graphql");
|
|
1884
1948
|
function getRawValue(value2, values) {
|
|
1885
1949
|
switch (value2.kind) {
|
|
1886
|
-
case
|
|
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
|
|
1955
|
+
case import_graphql5.Kind.VARIABLE:
|
|
1892
1956
|
return values?.[value2.name.value];
|
|
1893
|
-
case
|
|
1957
|
+
case import_graphql5.Kind.INT:
|
|
1894
1958
|
return parseInt(value2.value, 10);
|
|
1895
|
-
case
|
|
1959
|
+
case import_graphql5.Kind.NULL:
|
|
1896
1960
|
return null;
|
|
1897
|
-
case
|
|
1961
|
+
case import_graphql5.Kind.FLOAT:
|
|
1898
1962
|
return parseFloat(value2.value);
|
|
1899
|
-
case
|
|
1900
|
-
case
|
|
1901
|
-
case
|
|
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
|
|
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
|
|
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
|
|
2013
|
+
case import_graphql5.Kind.NON_NULL_TYPE:
|
|
1950
2014
|
return normalizeValue(value2, type.type, schema);
|
|
1951
|
-
case
|
|
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 !==
|
|
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(({
|
|
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 (
|
|
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 (
|
|
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.
|
|
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,
|
|
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,
|