@smartive/graphql-magic 11.3.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 -6
- package/dist/bin/gqm.cjs +0 -3
- package/dist/cjs/index.cjs +38 -23
- package/dist/esm/client/queries.d.ts +5 -3
- package/dist/esm/client/queries.js +28 -16
- 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 +7 -7
- package/src/client/queries.ts +47 -23
- 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,6 +1 @@
|
|
|
1
|
-
# [
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
### Features
|
|
5
|
-
|
|
6
|
-
* Reverse filter none ([b5c1478](https://github.com/smartive/graphql-magic/commit/b5c14787b97b72b2891ae2705f9675651ebd3542))
|
|
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
|
}`;
|
|
@@ -843,17 +849,24 @@ var getMutationQuery = (model, action) => action === "create" ? `
|
|
|
843
849
|
var displayField = (model) => `
|
|
844
850
|
${model.displayField ? `display: ${model.displayField}` : ""}
|
|
845
851
|
`;
|
|
846
|
-
var getEntityListQuery = (model, role, additionalFields = "", root) => `query ${model.plural}List(
|
|
852
|
+
var getEntityListQuery = (model, role, visibleRelationsByRole, typesWithSubRelations, additionalFields = "", root) => `query ${model.plural}List(
|
|
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}
|
|
863
|
+
${queryRelations(
|
|
864
|
+
model.models,
|
|
865
|
+
model.relations.filter(isVisibleRelation(visibleRelationsByRole, model.name, role)),
|
|
866
|
+
role,
|
|
867
|
+
typesWithSubRelations
|
|
868
|
+
)}
|
|
869
|
+
${additionalFields}
|
|
857
870
|
}
|
|
858
871
|
${root ? "}" : ""}
|
|
859
872
|
}`;
|
|
@@ -861,7 +874,7 @@ var isVisibleRelation = (visibleRelationsByRole, modelName, role) => {
|
|
|
861
874
|
const whitelist = visibleRelationsByRole[role]?.[modelName];
|
|
862
875
|
return (relation) => whitelist ? whitelist.includes(relation.name) : true;
|
|
863
876
|
};
|
|
864
|
-
var getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations) => `query Get${model.name}Entity ($id: ID!) {
|
|
877
|
+
var getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations, additionalFields = "") => `query Get${model.name}Entity ($id: ID!) {
|
|
865
878
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
866
879
|
${displayField(model)}
|
|
867
880
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name: name2 }) => name2)}
|
|
@@ -879,6 +892,7 @@ var getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations
|
|
|
879
892
|
role,
|
|
880
893
|
typesWithSubRelations
|
|
881
894
|
)}
|
|
895
|
+
${additionalFields}
|
|
882
896
|
}
|
|
883
897
|
}`;
|
|
884
898
|
var getFindEntityQuery = (model, role) => `query Find${model.name}($where: ${model.name}Where!, $orderBy: [${model.name}OrderBy!]) {
|
|
@@ -3242,7 +3256,6 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
3242
3256
|
ScalarModel,
|
|
3243
3257
|
TYPE_ALIAS,
|
|
3244
3258
|
UserInputError,
|
|
3245
|
-
actionableRelations,
|
|
3246
3259
|
addJoin,
|
|
3247
3260
|
and,
|
|
3248
3261
|
apply,
|
|
@@ -3258,6 +3271,7 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
3258
3271
|
document,
|
|
3259
3272
|
enm,
|
|
3260
3273
|
execute,
|
|
3274
|
+
fieldIsSearchable,
|
|
3261
3275
|
fieldType,
|
|
3262
3276
|
fields,
|
|
3263
3277
|
generate,
|
|
@@ -3267,9 +3281,9 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
3267
3281
|
generateMutations,
|
|
3268
3282
|
generatePermissions,
|
|
3269
3283
|
get,
|
|
3284
|
+
getActionableRelations,
|
|
3270
3285
|
getColumn,
|
|
3271
3286
|
getColumnName,
|
|
3272
|
-
getEditEntityRelationsQuery,
|
|
3273
3287
|
getEntityListQuery,
|
|
3274
3288
|
getEntityQuery,
|
|
3275
3289
|
getEntityToMutate,
|
|
@@ -3287,6 +3301,7 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
3287
3301
|
getResolverNode,
|
|
3288
3302
|
getResolvers,
|
|
3289
3303
|
getRootFieldNode,
|
|
3304
|
+
getSelectEntityRelationsQuery,
|
|
3290
3305
|
getSimpleFields,
|
|
3291
3306
|
getString,
|
|
3292
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: {
|
|
@@ -10,13 +12,13 @@ export type MutationQuery = {
|
|
|
10
12
|
};
|
|
11
13
|
export declare const getMutationQuery: (model: Model, action: 'create' | 'update' | 'delete') => string;
|
|
12
14
|
export declare const displayField: (model: EntityModel) => string;
|
|
13
|
-
export declare const getEntityListQuery: (model: EntityModel, role: string, additionalFields?: string, root?: {
|
|
15
|
+
export declare const getEntityListQuery: (model: EntityModel, role: string, visibleRelationsByRole: VisibleRelationsByRole, typesWithSubRelations: string[], additionalFields?: string, root?: {
|
|
14
16
|
model: EntityModel;
|
|
15
17
|
entity: any;
|
|
16
18
|
reverseRelationName: string;
|
|
17
19
|
}) => string;
|
|
18
20
|
export type VisibleRelationsByRole = Record<string, Record<string, string[]>>;
|
|
19
21
|
export declare const isVisibleRelation: (visibleRelationsByRole: VisibleRelationsByRole, modelName: string, role: string) => (relation: Relation) => boolean;
|
|
20
|
-
export declare const getEntityQuery: (model: EntityModel, role: string, visibleRelationsByRole: VisibleRelationsByRole, typesWithSubRelations: string[]) => string;
|
|
22
|
+
export declare const getEntityQuery: (model: EntityModel, role: string, visibleRelationsByRole: VisibleRelationsByRole, typesWithSubRelations: string[], additionalFields?: string) => string;
|
|
21
23
|
export declare const getFindEntityQuery: (model: EntityModel, role: string) => string;
|
|
22
24
|
export declare const queryRelations: (models: Models, relations: Relation[], role: string, typesWithSubRelations: string[]) => string;
|
|
@@ -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(' ')}
|
|
@@ -97,17 +106,19 @@ export const getMutationQuery = (model, action) => action === 'create'
|
|
|
97
106
|
export const displayField = (model) => `
|
|
98
107
|
${model.displayField ? `display: ${model.displayField}` : ''}
|
|
99
108
|
`;
|
|
100
|
-
export const getEntityListQuery = (model, role, additionalFields = '', root) => `query ${model.plural}List(
|
|
109
|
+
export const getEntityListQuery = (model, role, visibleRelationsByRole, typesWithSubRelations, additionalFields = '', root) => `query ${model.plural}List(
|
|
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}
|
|
120
|
+
${queryRelations(model.models, model.relations.filter(isVisibleRelation(visibleRelationsByRole, model.name, role)), role, typesWithSubRelations)}
|
|
121
|
+
${additionalFields}
|
|
111
122
|
}
|
|
112
123
|
${root ? '}' : ''}
|
|
113
124
|
}`;
|
|
@@ -115,13 +126,14 @@ export const isVisibleRelation = (visibleRelationsByRole, modelName, role) => {
|
|
|
115
126
|
const whitelist = visibleRelationsByRole[role]?.[modelName];
|
|
116
127
|
return (relation) => (whitelist ? whitelist.includes(relation.name) : true);
|
|
117
128
|
};
|
|
118
|
-
export const getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations) => `query Get${model.name}Entity ($id: ID!) {
|
|
129
|
+
export const getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations, additionalFields = '') => `query Get${model.name}Entity ($id: ID!) {
|
|
119
130
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
120
131
|
${displayField(model)}
|
|
121
132
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
|
122
133
|
${queryRelations(model.models, model.relations.filter(isVisibleRelation(visibleRelationsByRole, model.name, role)), role, typesWithSubRelations)}
|
|
123
134
|
${queryRelations(model.models, model.reverseRelations.filter((reverseRelation) => isToOneRelation(reverseRelation.field) &&
|
|
124
135
|
isVisibleRelation(visibleRelationsByRole, model.name, role)(reverseRelation)), role, typesWithSubRelations)}
|
|
136
|
+
${additionalFields}
|
|
125
137
|
}
|
|
126
138
|
}`;
|
|
127
139
|
export const getFindEntityQuery = (model, role) => `query Find${model.name}($where: ${model.name}Where!, $orderBy: [${model.name}OrderBy!]) {
|
|
@@ -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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartive/graphql-magic",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"source": "src/index.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -70,20 +70,20 @@
|
|
|
70
70
|
"devDependencies": {
|
|
71
71
|
"@smartive/eslint-config": "3.3.0",
|
|
72
72
|
"@smartive/prettier-config": "3.1.2",
|
|
73
|
-
"@types/jest": "29.5.
|
|
73
|
+
"@types/jest": "29.5.12",
|
|
74
74
|
"@types/lodash": "4.14.202",
|
|
75
|
-
"@types/luxon": "3.
|
|
76
|
-
"@types/pg": "8.
|
|
77
|
-
"@types/uuid": "9.0.
|
|
75
|
+
"@types/luxon": "3.4.2",
|
|
76
|
+
"@types/pg": "8.11.0",
|
|
77
|
+
"@types/uuid": "9.0.8",
|
|
78
78
|
"create-ts-index": "1.14.0",
|
|
79
79
|
"del-cli": "5.1.0",
|
|
80
|
-
"esbuild": "0.
|
|
80
|
+
"esbuild": "0.20.0",
|
|
81
81
|
"eslint": "8.56.0",
|
|
82
82
|
"graphql-request": "6.1.0",
|
|
83
83
|
"jest": "29.7.0",
|
|
84
84
|
"mock-knex": "0.4.13",
|
|
85
85
|
"prettier": "2.8.8",
|
|
86
|
-
"ts-jest": "29.1.
|
|
86
|
+
"ts-jest": "29.1.2",
|
|
87
87
|
"ts-node": "10.9.2",
|
|
88
88
|
"typescript": "5.3.3"
|
|
89
89
|
}
|
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(' ')}
|
|
@@ -147,6 +160,8 @@ ${model.displayField ? `display: ${model.displayField}` : ''}
|
|
|
147
160
|
export const getEntityListQuery = (
|
|
148
161
|
model: EntityModel,
|
|
149
162
|
role: string,
|
|
163
|
+
visibleRelationsByRole: VisibleRelationsByRole,
|
|
164
|
+
typesWithSubRelations: string[],
|
|
150
165
|
additionalFields = '',
|
|
151
166
|
root?: {
|
|
152
167
|
model: EntityModel;
|
|
@@ -158,15 +173,22 @@ export const getEntityListQuery = (
|
|
|
158
173
|
${root ? '$id: ID!,' : ''}
|
|
159
174
|
$limit: Int!,
|
|
160
175
|
$where: ${model.name}Where!,
|
|
161
|
-
${model.
|
|
176
|
+
${model.relations.some(({ field: { searchable } }) => searchable) ? '$search: String,' : ''}
|
|
162
177
|
) {
|
|
163
178
|
${root ? `root: ${typeToField(root.model.name)}(where: { id: $id }) {` : ''}
|
|
164
179
|
data: ${root ? root.reverseRelationName : model.pluralField}(limit: $limit, where: $where, ${
|
|
165
|
-
model.
|
|
180
|
+
model.relations.some(({ field: { searchable } }) => searchable) ? ', search: $search' : ''
|
|
166
181
|
}) {
|
|
167
182
|
${displayField(model)}
|
|
168
183
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
|
169
184
|
${additionalFields}
|
|
185
|
+
${queryRelations(
|
|
186
|
+
model.models,
|
|
187
|
+
model.relations.filter(isVisibleRelation(visibleRelationsByRole, model.name, role)),
|
|
188
|
+
role,
|
|
189
|
+
typesWithSubRelations
|
|
190
|
+
)}
|
|
191
|
+
${additionalFields}
|
|
170
192
|
}
|
|
171
193
|
${root ? '}' : ''}
|
|
172
194
|
}`;
|
|
@@ -182,7 +204,8 @@ export const getEntityQuery = (
|
|
|
182
204
|
model: EntityModel,
|
|
183
205
|
role: string,
|
|
184
206
|
visibleRelationsByRole: VisibleRelationsByRole,
|
|
185
|
-
typesWithSubRelations: string[]
|
|
207
|
+
typesWithSubRelations: string[],
|
|
208
|
+
additionalFields = ''
|
|
186
209
|
) => `query Get${model.name}Entity ($id: ID!) {
|
|
187
210
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
188
211
|
${displayField(model)}
|
|
@@ -203,6 +226,7 @@ export const getEntityQuery = (
|
|
|
203
226
|
role,
|
|
204
227
|
typesWithSubRelations
|
|
205
228
|
)}
|
|
229
|
+
${additionalFields}
|
|
206
230
|
}
|
|
207
231
|
}`;
|
|
208
232
|
|
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
|
});
|