@smartive/graphql-magic 12.0.0 → 13.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 -1
- package/dist/bin/gqm.cjs +0 -3
- package/dist/cjs/index.cjs +28 -21
- package/dist/esm/client/queries.d.ts +3 -1
- package/dist/esm/client/queries.js +23 -14
- package/dist/esm/client/queries.js.map +1 -1
- package/dist/esm/models/utils.d.ts +1 -1
- package/dist/esm/models/utils.js +3 -1
- package/dist/esm/models/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/client/queries.ts +35 -22
- package/src/models/utils.ts +9 -5
- package/tests/unit/__snapshots__/queries.spec.ts.snap +2 -3
- package/tests/unit/queries.spec.ts +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
# [
|
|
1
|
+
# [13.0.0](https://github.com/smartive/graphql-magic/compare/v12.0.0...v13.0.0) (2024-02-08)
|
package/dist/bin/gqm.cjs
CHANGED
|
@@ -87,9 +87,6 @@ var generateMutations = (models, gqmModule = "@smartive/graphql-magic") => {
|
|
|
87
87
|
${parts.join("\n\n")}`;
|
|
88
88
|
};
|
|
89
89
|
|
|
90
|
-
// src/client/queries.ts
|
|
91
|
-
var import_upperFirst = __toESM(require("lodash/upperFirst"), 1);
|
|
92
|
-
|
|
93
90
|
// src/models/utils.ts
|
|
94
91
|
var import_lodash3 = require("lodash");
|
|
95
92
|
var import_get = __toESM(require("lodash/get"), 1);
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -52,7 +52,6 @@ __export(src_exports, {
|
|
|
52
52
|
ScalarModel: () => ScalarModel,
|
|
53
53
|
TYPE_ALIAS: () => TYPE_ALIAS,
|
|
54
54
|
UserInputError: () => UserInputError,
|
|
55
|
-
actionableRelations: () => actionableRelations,
|
|
56
55
|
addJoin: () => addJoin,
|
|
57
56
|
and: () => and,
|
|
58
57
|
apply: () => apply,
|
|
@@ -68,6 +67,7 @@ __export(src_exports, {
|
|
|
68
67
|
document: () => document,
|
|
69
68
|
enm: () => enm,
|
|
70
69
|
execute: () => execute,
|
|
70
|
+
fieldIsSearchable: () => fieldIsSearchable,
|
|
71
71
|
fieldType: () => fieldType,
|
|
72
72
|
fields: () => fields,
|
|
73
73
|
generate: () => generate,
|
|
@@ -77,9 +77,9 @@ __export(src_exports, {
|
|
|
77
77
|
generateMutations: () => generateMutations,
|
|
78
78
|
generatePermissions: () => generatePermissions,
|
|
79
79
|
get: () => get,
|
|
80
|
+
getActionableRelations: () => getActionableRelations,
|
|
80
81
|
getColumn: () => getColumn,
|
|
81
82
|
getColumnName: () => getColumnName,
|
|
82
|
-
getEditEntityRelationsQuery: () => getEditEntityRelationsQuery,
|
|
83
83
|
getEntityListQuery: () => getEntityListQuery,
|
|
84
84
|
getEntityQuery: () => getEntityQuery,
|
|
85
85
|
getEntityToMutate: () => getEntityToMutate,
|
|
@@ -97,6 +97,7 @@ __export(src_exports, {
|
|
|
97
97
|
getResolverNode: () => getResolverNode,
|
|
98
98
|
getResolvers: () => getResolvers,
|
|
99
99
|
getRootFieldNode: () => getRootFieldNode,
|
|
100
|
+
getSelectEntityRelationsQuery: () => getSelectEntityRelationsQuery,
|
|
100
101
|
getSimpleFields: () => getSimpleFields,
|
|
101
102
|
getString: () => getString,
|
|
102
103
|
getType: () => getType,
|
|
@@ -267,9 +268,6 @@ var generateMutations = (models, gqmModule = "@smartive/graphql-magic") => {
|
|
|
267
268
|
${parts.join("\n\n")}`;
|
|
268
269
|
};
|
|
269
270
|
|
|
270
|
-
// src/client/queries.ts
|
|
271
|
-
var import_upperFirst = __toESM(require("lodash/upperFirst"), 1);
|
|
272
|
-
|
|
273
271
|
// src/models/utils.ts
|
|
274
272
|
var import_assert = __toESM(require("assert"), 1);
|
|
275
273
|
var import_lodash3 = require("lodash");
|
|
@@ -717,9 +715,9 @@ var isCreatable = ({ creatable }) => !!creatable;
|
|
|
717
715
|
var isQueriableBy = (role) => (field) => field.queriable !== false && (field.queriable === void 0 || field.queriable === true || !field.queriable.roles || field.queriable.roles.includes(role));
|
|
718
716
|
var isUpdatableBy = (role) => (field) => field.updatable && (field.updatable === true || !field.updatable.roles || field.updatable.roles.includes(role));
|
|
719
717
|
var isCreatableBy = (role) => (field) => field.creatable && (field.creatable === true || !field.creatable.roles || field.creatable.roles.includes(role));
|
|
720
|
-
var
|
|
718
|
+
var getActionableRelations = (model, action) => model.relations.filter(
|
|
721
719
|
(relation) => relation.field[`${action === "filter" ? action : action.slice(0, -1)}able`]
|
|
722
|
-
);
|
|
720
|
+
).map(({ name: name2 }) => name2);
|
|
723
721
|
var summonByName = (array, value2) => summonByKey(array, "name", value2);
|
|
724
722
|
var summonByKey = (array, key, value2) => summon(array, (element) => (0, import_get.default)(element, key) === value2, `No element found with ${key} ${value2}`);
|
|
725
723
|
var summon = (array, cb, errorMessage) => {
|
|
@@ -771,27 +769,35 @@ var getUpdateEntityQuery = (model, role, fields2, additionalFields = "") => `que
|
|
|
771
769
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
772
770
|
id
|
|
773
771
|
${model.fields.filter(({ name: name2 }) => !fields2 || fields2.includes(name2)).filter(not(isRelation)).filter(isUpdatableBy(role)).map(({ name: name2 }) => name2).join(" ")}
|
|
774
|
-
${
|
|
772
|
+
${getActionableRelations(model, "update").filter((name2) => !fields2 || fields2.includes(name2)).map((name2) => `${name2} { id }`)}
|
|
775
773
|
${additionalFields}
|
|
776
774
|
}
|
|
777
775
|
}`;
|
|
778
|
-
var
|
|
779
|
-
const
|
|
780
|
-
|
|
781
|
-
);
|
|
782
|
-
return
|
|
776
|
+
var fieldIsSearchable = (model, fieldName) => {
|
|
777
|
+
const relation = model.getRelation(fieldName);
|
|
778
|
+
const targetModel = relation.targetModel;
|
|
779
|
+
const displayField2 = targetModel.getField(targetModel.displayField || "id");
|
|
780
|
+
return displayField2.searchable;
|
|
781
|
+
};
|
|
782
|
+
var getSelectEntityRelationsQuery = (model, relationNames) => {
|
|
783
|
+
const relations = relationNames.map((name2) => model.getRelation(name2));
|
|
784
|
+
return !!relations.length && `query Select${model.name}Relations(${relations.map(
|
|
785
|
+
(relation) => `$${relation.name}Where: ${relation.targetModel.name}Where, $${relation.name}Limit: Int${fieldIsSearchable(model, relation.name) ? `, $${relation.name}Search: String` : ""}`
|
|
786
|
+
).join(", ")}) {
|
|
783
787
|
${relations.map((relation) => {
|
|
784
788
|
let filters = "";
|
|
785
789
|
if (relation.targetModel.displayField) {
|
|
786
790
|
const displayField2 = relation.targetModel.fieldsByName[relation.targetModel.displayField];
|
|
787
|
-
if (displayField2.orderable) {
|
|
788
|
-
filters
|
|
791
|
+
if ("orderable" in displayField2 && displayField2.orderable) {
|
|
792
|
+
filters += `, orderBy: [{ ${relation.targetModel.displayField}: ASC }]`;
|
|
789
793
|
}
|
|
790
794
|
}
|
|
791
|
-
|
|
795
|
+
if (fieldIsSearchable(model, relation.name)) {
|
|
796
|
+
filters += `, search: $${relation.name}Search`;
|
|
797
|
+
}
|
|
798
|
+
return `${relation.name}: ${relation.targetModel.pluralField}(where: $${relation.name}Where, limit: $${relation.name}Limit${filters}) {
|
|
792
799
|
id
|
|
793
800
|
display: ${relation.targetModel.displayField || "id"}
|
|
794
|
-
${additionalFields[relation.name] || ""}
|
|
795
801
|
}`;
|
|
796
802
|
}).join(" ")}
|
|
797
803
|
}`;
|
|
@@ -847,10 +853,10 @@ var getEntityListQuery = (model, role, visibleRelationsByRole, typesWithSubRelat
|
|
|
847
853
|
${root ? "$id: ID!," : ""}
|
|
848
854
|
$limit: Int!,
|
|
849
855
|
$where: ${model.name}Where!,
|
|
850
|
-
${model.
|
|
856
|
+
${model.relations.some(({ field: { searchable } }) => searchable) ? "$search: String," : ""}
|
|
851
857
|
) {
|
|
852
858
|
${root ? `root: ${typeToField(root.model.name)}(where: { id: $id }) {` : ""}
|
|
853
|
-
data: ${root ? root.reverseRelationName : model.pluralField}(limit: $limit, where: $where, ${model.
|
|
859
|
+
data: ${root ? root.reverseRelationName : model.pluralField}(limit: $limit, where: $where, ${model.relations.some(({ field: { searchable } }) => searchable) ? ", search: $search" : ""}) {
|
|
854
860
|
${displayField(model)}
|
|
855
861
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name: name2 }) => name2)}
|
|
856
862
|
${additionalFields}
|
|
@@ -3250,7 +3256,6 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
3250
3256
|
ScalarModel,
|
|
3251
3257
|
TYPE_ALIAS,
|
|
3252
3258
|
UserInputError,
|
|
3253
|
-
actionableRelations,
|
|
3254
3259
|
addJoin,
|
|
3255
3260
|
and,
|
|
3256
3261
|
apply,
|
|
@@ -3266,6 +3271,7 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
3266
3271
|
document,
|
|
3267
3272
|
enm,
|
|
3268
3273
|
execute,
|
|
3274
|
+
fieldIsSearchable,
|
|
3269
3275
|
fieldType,
|
|
3270
3276
|
fields,
|
|
3271
3277
|
generate,
|
|
@@ -3275,9 +3281,9 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
3275
3281
|
generateMutations,
|
|
3276
3282
|
generatePermissions,
|
|
3277
3283
|
get,
|
|
3284
|
+
getActionableRelations,
|
|
3278
3285
|
getColumn,
|
|
3279
3286
|
getColumnName,
|
|
3280
|
-
getEditEntityRelationsQuery,
|
|
3281
3287
|
getEntityListQuery,
|
|
3282
3288
|
getEntityQuery,
|
|
3283
3289
|
getEntityToMutate,
|
|
@@ -3295,6 +3301,7 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
3295
3301
|
getResolverNode,
|
|
3296
3302
|
getResolvers,
|
|
3297
3303
|
getRootFieldNode,
|
|
3304
|
+
getSelectEntityRelationsQuery,
|
|
3298
3305
|
getSimpleFields,
|
|
3299
3306
|
getString,
|
|
3300
3307
|
getType,
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { ManyToManyRelation } from '..';
|
|
2
2
|
import { EntityModel, Model, Models, Relation } from '../models/models';
|
|
3
3
|
export declare const getUpdateEntityQuery: (model: EntityModel, role: any, fields?: string[] | undefined, additionalFields?: string) => string;
|
|
4
|
-
export
|
|
4
|
+
export type RelationConstraints = Record<string, (source: any) => any>;
|
|
5
|
+
export declare const fieldIsSearchable: (model: EntityModel, fieldName: string) => boolean;
|
|
6
|
+
export declare const getSelectEntityRelationsQuery: (model: EntityModel, relationNames: string[]) => string;
|
|
5
7
|
export declare const getManyToManyRelationsQuery: (model: Model, action: 'create' | 'update', manyToManyRelations: ManyToManyRelation[]) => string;
|
|
6
8
|
export type MutationQuery = {
|
|
7
9
|
mutated: {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { actionableRelations, and, isQueriableBy, isRelation, isSimpleField, isToOneRelation, isUpdatableBy, not, typeToField, } from '../models/utils';
|
|
1
|
+
import { and, getActionableRelations, isQueriableBy, isRelation, isSimpleField, isToOneRelation, isUpdatableBy, not, typeToField, } from '../models/utils';
|
|
3
2
|
export const getUpdateEntityQuery = (model, role, fields, additionalFields = '') => `query Update${model.name}Fields ($id: ID!) {
|
|
4
3
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
5
4
|
id
|
|
@@ -9,29 +8,39 @@ export const getUpdateEntityQuery = (model, role, fields, additionalFields = '')
|
|
|
9
8
|
.filter(isUpdatableBy(role))
|
|
10
9
|
.map(({ name }) => name)
|
|
11
10
|
.join(' ')}
|
|
12
|
-
${
|
|
13
|
-
.filter((
|
|
14
|
-
.map((
|
|
11
|
+
${getActionableRelations(model, 'update')
|
|
12
|
+
.filter((name) => !fields || fields.includes(name))
|
|
13
|
+
.map((name) => `${name} { id }`)}
|
|
15
14
|
${additionalFields}
|
|
16
15
|
}
|
|
17
16
|
}`;
|
|
18
|
-
export const
|
|
19
|
-
const
|
|
17
|
+
export const fieldIsSearchable = (model, fieldName) => {
|
|
18
|
+
const relation = model.getRelation(fieldName);
|
|
19
|
+
const targetModel = relation.targetModel;
|
|
20
|
+
const displayField = targetModel.getField(targetModel.displayField || 'id');
|
|
21
|
+
return displayField.searchable;
|
|
22
|
+
};
|
|
23
|
+
export const getSelectEntityRelationsQuery = (model, relationNames) => {
|
|
24
|
+
const relations = relationNames.map((name) => model.getRelation(name));
|
|
20
25
|
return (!!relations.length &&
|
|
21
|
-
`query ${
|
|
26
|
+
`query Select${model.name}Relations(${relations
|
|
27
|
+
.map((relation) => `$${relation.name}Where: ${relation.targetModel.name}Where, $${relation.name}Limit: Int${fieldIsSearchable(model, relation.name) ? `, $${relation.name}Search: String` : ''}`)
|
|
28
|
+
.join(', ')}) {
|
|
22
29
|
${relations
|
|
23
30
|
.map((relation) => {
|
|
24
31
|
let filters = '';
|
|
25
32
|
if (relation.targetModel.displayField) {
|
|
26
33
|
const displayField = relation.targetModel.fieldsByName[relation.targetModel.displayField];
|
|
27
|
-
if (displayField.orderable) {
|
|
28
|
-
filters
|
|
34
|
+
if ('orderable' in displayField && displayField.orderable) {
|
|
35
|
+
filters += `, orderBy: [{ ${relation.targetModel.displayField}: ASC }]`;
|
|
29
36
|
}
|
|
30
37
|
}
|
|
31
|
-
|
|
38
|
+
if (fieldIsSearchable(model, relation.name)) {
|
|
39
|
+
filters += `, search: $${relation.name}Search`;
|
|
40
|
+
}
|
|
41
|
+
return `${relation.name}: ${relation.targetModel.pluralField}(where: $${relation.name}Where, limit: $${relation.name}Limit${filters}) {
|
|
32
42
|
id
|
|
33
43
|
display: ${relation.targetModel.displayField || 'id'}
|
|
34
|
-
${additionalFields[relation.name] || ''}
|
|
35
44
|
}`;
|
|
36
45
|
})
|
|
37
46
|
.join(' ')}
|
|
@@ -101,10 +110,10 @@ export const getEntityListQuery = (model, role, visibleRelationsByRole, typesWit
|
|
|
101
110
|
${root ? '$id: ID!,' : ''}
|
|
102
111
|
$limit: Int!,
|
|
103
112
|
$where: ${model.name}Where!,
|
|
104
|
-
${model.
|
|
113
|
+
${model.relations.some(({ field: { searchable } }) => searchable) ? '$search: String,' : ''}
|
|
105
114
|
) {
|
|
106
115
|
${root ? `root: ${typeToField(root.model.name)}(where: { id: $id }) {` : ''}
|
|
107
|
-
data: ${root ? root.reverseRelationName : model.pluralField}(limit: $limit, where: $where, ${model.
|
|
116
|
+
data: ${root ? root.reverseRelationName : model.pluralField}(limit: $limit, where: $where, ${model.relations.some(({ field: { searchable } }) => searchable) ? ', search: $search' : ''}) {
|
|
108
117
|
${displayField(model)}
|
|
109
118
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
|
110
119
|
${additionalFields}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/client/queries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/client/queries.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,7 +115,7 @@ export declare const isCreatable: ({ creatable }: EntityField) => boolean;
|
|
|
115
115
|
export declare const isQueriableBy: (role: string) => (field: EntityField) => boolean;
|
|
116
116
|
export declare const isUpdatableBy: (role: string) => (field: EntityField) => boolean;
|
|
117
117
|
export declare const isCreatableBy: (role: string) => (field: EntityField) => boolean;
|
|
118
|
-
export declare const
|
|
118
|
+
export declare const getActionableRelations: (model: EntityModel, action: 'create' | 'update' | 'filter') => string[];
|
|
119
119
|
export declare const summonByName: <T extends {
|
|
120
120
|
name: string;
|
|
121
121
|
}>(array: T[], value: string) => T;
|
package/dist/esm/models/utils.js
CHANGED
|
@@ -41,7 +41,9 @@ export const isQueriableBy = (role) => (field) => field.queriable !== false &&
|
|
|
41
41
|
field.queriable.roles.includes(role));
|
|
42
42
|
export const isUpdatableBy = (role) => (field) => field.updatable && (field.updatable === true || !field.updatable.roles || field.updatable.roles.includes(role));
|
|
43
43
|
export const isCreatableBy = (role) => (field) => field.creatable && (field.creatable === true || !field.creatable.roles || field.creatable.roles.includes(role));
|
|
44
|
-
export const
|
|
44
|
+
export const getActionableRelations = (model, action) => model.relations
|
|
45
|
+
.filter((relation) => relation.field[`${action === 'filter' ? action : action.slice(0, -1)}able`])
|
|
46
|
+
.map(({ name }) => name);
|
|
45
47
|
export const summonByName = (array, value) => summonByKey(array, 'name', value);
|
|
46
48
|
export const summonByKey = (array, key, value) => summon(array, (element) => lodashGet(element, key) === value, `No element found with ${key} ${value}`);
|
|
47
49
|
export const summon = (array, cb, errorMessage) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/models/utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/models/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/client/queries.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import upperFirst from 'lodash/upperFirst';
|
|
2
1
|
import { ManyToManyRelation } from '..';
|
|
3
2
|
import { EntityModel, Model, Models, Relation } from '../models/models';
|
|
4
3
|
import {
|
|
5
|
-
actionableRelations,
|
|
6
4
|
and,
|
|
5
|
+
getActionableRelations,
|
|
7
6
|
isQueriableBy,
|
|
8
7
|
isRelation,
|
|
9
8
|
isSimpleField,
|
|
@@ -27,41 +26,55 @@ export const getUpdateEntityQuery = (
|
|
|
27
26
|
.filter(isUpdatableBy(role))
|
|
28
27
|
.map(({ name }) => name)
|
|
29
28
|
.join(' ')}
|
|
30
|
-
${
|
|
31
|
-
.filter((
|
|
32
|
-
.map((
|
|
29
|
+
${getActionableRelations(model, 'update')
|
|
30
|
+
.filter((name) => !fields || fields.includes(name))
|
|
31
|
+
.map((name) => `${name} { id }`)}
|
|
33
32
|
${additionalFields}
|
|
34
33
|
}
|
|
35
34
|
}`;
|
|
36
35
|
|
|
37
|
-
export
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
export type RelationConstraints = Record<string, (source: any) => any>;
|
|
37
|
+
|
|
38
|
+
export const fieldIsSearchable = (model: EntityModel, fieldName: string) => {
|
|
39
|
+
const relation = model.getRelation(fieldName);
|
|
40
|
+
const targetModel = relation.targetModel;
|
|
41
|
+
const displayField = targetModel.getField(targetModel.displayField || 'id');
|
|
42
|
+
return displayField.searchable;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const getSelectEntityRelationsQuery = (model: EntityModel, relationNames: string[]) => {
|
|
46
|
+
const relations = relationNames.map((name) => model.getRelation(name));
|
|
47
47
|
|
|
48
48
|
return (
|
|
49
49
|
!!relations.length &&
|
|
50
|
-
`query ${
|
|
50
|
+
`query Select${model.name}Relations(${relations
|
|
51
|
+
.map(
|
|
52
|
+
(relation) =>
|
|
53
|
+
`$${relation.name}Where: ${relation.targetModel.name}Where, $${relation.name}Limit: Int${
|
|
54
|
+
fieldIsSearchable(model, relation.name) ? `, $${relation.name}Search: String` : ''
|
|
55
|
+
}`
|
|
56
|
+
)
|
|
57
|
+
.join(', ')}) {
|
|
51
58
|
${relations
|
|
52
59
|
.map((relation) => {
|
|
53
60
|
let filters = '';
|
|
61
|
+
|
|
54
62
|
if (relation.targetModel.displayField) {
|
|
55
63
|
const displayField = relation.targetModel.fieldsByName[relation.targetModel.displayField];
|
|
56
|
-
if (displayField.orderable) {
|
|
57
|
-
filters
|
|
64
|
+
if ('orderable' in displayField && displayField.orderable) {
|
|
65
|
+
filters += `, orderBy: [{ ${relation.targetModel.displayField}: ASC }]`;
|
|
58
66
|
}
|
|
59
67
|
}
|
|
60
68
|
|
|
61
|
-
|
|
69
|
+
if (fieldIsSearchable(model, relation.name)) {
|
|
70
|
+
filters += `, search: $${relation.name}Search`;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return `${relation.name}: ${relation.targetModel.pluralField}(where: $${relation.name}Where, limit: $${
|
|
74
|
+
relation.name
|
|
75
|
+
}Limit${filters}) {
|
|
62
76
|
id
|
|
63
77
|
display: ${relation.targetModel.displayField || 'id'}
|
|
64
|
-
${additionalFields[relation.name] || ''}
|
|
65
78
|
}`;
|
|
66
79
|
})
|
|
67
80
|
.join(' ')}
|
|
@@ -160,11 +173,11 @@ export const getEntityListQuery = (
|
|
|
160
173
|
${root ? '$id: ID!,' : ''}
|
|
161
174
|
$limit: Int!,
|
|
162
175
|
$where: ${model.name}Where!,
|
|
163
|
-
${model.
|
|
176
|
+
${model.relations.some(({ field: { searchable } }) => searchable) ? '$search: String,' : ''}
|
|
164
177
|
) {
|
|
165
178
|
${root ? `root: ${typeToField(root.model.name)}(where: { id: $id }) {` : ''}
|
|
166
179
|
data: ${root ? root.reverseRelationName : model.pluralField}(limit: $limit, where: $where, ${
|
|
167
|
-
model.
|
|
180
|
+
model.relations.some(({ field: { searchable } }) => searchable) ? ', search: $search' : ''
|
|
168
181
|
}) {
|
|
169
182
|
${displayField(model)}
|
|
170
183
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
package/src/models/utils.ts
CHANGED
|
@@ -104,11 +104,15 @@ export const isUpdatableBy = (role: string) => (field: EntityField) =>
|
|
|
104
104
|
export const isCreatableBy = (role: string) => (field: EntityField) =>
|
|
105
105
|
field.creatable && (field.creatable === true || !field.creatable.roles || field.creatable.roles.includes(role));
|
|
106
106
|
|
|
107
|
-
export const
|
|
108
|
-
model.relations
|
|
109
|
-
(
|
|
110
|
-
relation
|
|
111
|
-
|
|
107
|
+
export const getActionableRelations = (model: EntityModel, action: 'create' | 'update' | 'filter') =>
|
|
108
|
+
model.relations
|
|
109
|
+
.filter(
|
|
110
|
+
(relation) =>
|
|
111
|
+
relation.field[
|
|
112
|
+
`${action === 'filter' ? action : action.slice(0, -1)}able` as 'filterable' | 'creatable' | 'updatable'
|
|
113
|
+
]
|
|
114
|
+
)
|
|
115
|
+
.map(({ name }) => name);
|
|
112
116
|
|
|
113
117
|
export const summonByName = <T extends { name: string }>(array: T[], value: string) => summonByKey(array, 'name', value);
|
|
114
118
|
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
3
|
exports[`queries getEntityRelationsQuery applies filters 1`] = `
|
|
4
|
-
"query
|
|
5
|
-
another: anotherObjects(orderBy: [{ name: ASC }]) {
|
|
4
|
+
"query SelectSomeObjectRelations($anotherWhere: AnotherObjectWhere, $anotherLimit: Int) {
|
|
5
|
+
another: anotherObjects(where: $anotherWhere, limit: $anotherLimit, orderBy: [{ name: ASC }]) {
|
|
6
6
|
id
|
|
7
7
|
display: name
|
|
8
|
-
|
|
9
8
|
}
|
|
10
9
|
}"
|
|
11
10
|
`;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getActionableRelations, getSelectEntityRelationsQuery } from '../../src';
|
|
2
2
|
import { models } from '../utils/models';
|
|
3
3
|
|
|
4
4
|
describe('queries', () => {
|
|
5
5
|
describe('getEntityRelationsQuery', () => {
|
|
6
6
|
it('applies filters', () => {
|
|
7
|
-
|
|
7
|
+
const model = models.getModel('SomeObject', 'entity');
|
|
8
|
+
expect(getSelectEntityRelationsQuery(model, getActionableRelations(model, 'update'))).toMatchSnapshot();
|
|
8
9
|
});
|
|
9
10
|
});
|
|
10
11
|
});
|