@lenne.tech/nest-server 8.0.2 → 8.3.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/dist/config.env.js +3 -2
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +1 -1
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/decorators/restricted.decorator.d.ts +3 -0
- package/dist/core/common/decorators/restricted.decorator.js +14 -8
- package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
- package/dist/core/common/enums/role.enum.d.ts +3 -2
- package/dist/core/common/enums/role.enum.js +3 -2
- package/dist/core/common/enums/role.enum.js.map +1 -1
- package/dist/core/common/helpers/config.helper.d.ts +2 -1
- package/dist/core/common/helpers/config.helper.js +11 -7
- package/dist/core/common/helpers/config.helper.js.map +1 -1
- package/dist/core/common/helpers/context.helper.d.ts +7 -1
- package/dist/core/common/helpers/context.helper.js +33 -29
- package/dist/core/common/helpers/context.helper.js.map +1 -1
- package/dist/core/common/helpers/db.helper.d.ts +37 -0
- package/dist/core/common/helpers/db.helper.js +356 -0
- package/dist/core/common/helpers/db.helper.js.map +1 -0
- package/dist/core/common/helpers/file.helper.d.ts +8 -1
- package/dist/core/common/helpers/file.helper.js +43 -31
- package/dist/core/common/helpers/file.helper.js.map +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +3 -0
- package/dist/core/common/helpers/filter.helper.js +93 -81
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql.helper.d.ts +24 -1
- package/dist/core/common/helpers/graphql.helper.js +144 -96
- package/dist/core/common/helpers/graphql.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.d.ts +42 -4
- package/dist/core/common/helpers/input.helper.js +256 -97
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/model.helper.d.ts +11 -0
- package/dist/core/common/helpers/model.helper.js +41 -29
- package/dist/core/common/helpers/model.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.d.ts +21 -1
- package/dist/core/common/helpers/service.helper.js +80 -72
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +1 -1
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/core-input.input.js +1 -1
- package/dist/core/common/inputs/core-input.input.js.map +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/resolve-selector.interface.d.ts +5 -0
- package/dist/core/common/interfaces/resolve-selector.interface.js +3 -0
- package/dist/core/common/interfaces/resolve-selector.interface.js.map +1 -0
- package/dist/core/common/interfaces/service-options.interface.d.ts +36 -0
- package/dist/core/common/interfaces/service-options.interface.js +3 -0
- package/dist/core/common/interfaces/service-options.interface.js.map +1 -0
- package/dist/core/common/models/core-model.model.d.ts +5 -1
- package/dist/core/common/models/core-model.model.js +1 -1
- package/dist/core/common/models/core-model.model.js.map +1 -1
- package/dist/core/common/pipes/check-input.pipe.js +2 -2
- package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
- package/dist/core/common/services/crud.service.d.ts +13 -0
- package/dist/core/common/services/crud.service.js +57 -0
- package/dist/core/common/services/crud.service.js.map +1 -0
- package/dist/core/common/services/email.service.js +8 -8
- package/dist/core/common/services/email.service.js.map +1 -1
- package/dist/core/common/services/module.service.d.ts +40 -0
- package/dist/core/common/services/module.service.js +80 -0
- package/dist/core/common/services/module.service.js.map +1 -0
- package/dist/core/common/types/core-model-constructor.type.d.ts +21 -0
- package/dist/core/common/types/core-model-constructor.type.js +3 -0
- package/dist/core/common/types/core-model-constructor.type.js.map +1 -0
- package/dist/core/common/types/field-selection.type.d.ts +4 -0
- package/dist/core/common/types/field-selection.type.js +3 -0
- package/dist/core/common/types/field-selection.type.js.map +1 -0
- package/dist/core/common/types/ids.type.d.ts +8 -0
- package/dist/core/common/types/ids.type.js +3 -0
- package/dist/core/common/types/ids.type.js.map +1 -0
- package/dist/core/common/types/string-or-object-id.type.d.ts +2 -0
- package/dist/core/common/types/string-or-object-id.type.js +3 -0
- package/dist/core/common/types/string-or-object-id.type.js.map +1 -0
- package/dist/core/modules/auth/core-auth.resolver.d.ts +2 -1
- package/dist/core/modules/auth/core-auth.resolver.js +4 -3
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js +1 -2
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth-user.service.d.ts +3 -1
- package/dist/core/modules/auth/services/core-auth-user.service.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -1
- package/dist/core/modules/auth/services/core-auth.service.js +6 -4
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/user/core-user.model.js +1 -1
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +16 -25
- package/dist/core/modules/user/core-user.service.js +69 -90
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core.module.js +1 -1
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/server/modules/auth/auth.resolver.d.ts +2 -1
- package/dist/server/modules/auth/auth.resolver.js +4 -3
- package/dist/server/modules/auth/auth.resolver.js.map +1 -1
- package/dist/server/modules/file/file.controller.js +1 -1
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +2 -2
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/user.model.d.ts +2 -1
- package/dist/server/modules/user/user.module.js +7 -3
- package/dist/server/modules/user/user.module.js.map +1 -1
- package/dist/server/modules/user/user.resolver.d.ts +8 -7
- package/dist/server/modules/user/user.resolver.js +85 -49
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.d.ts +9 -18
- package/dist/server/modules/user/user.service.js +23 -30
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/test/test.helper.d.ts +1 -2
- package/dist/test/test.helper.js +1 -16
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +58 -59
- package/src/config.env.ts +3 -2
- package/src/core/common/args/pagination.args.ts +2 -2
- package/src/core/common/decorators/restricted.decorator.ts +24 -12
- package/src/core/common/enums/role.enum.ts +23 -5
- package/src/core/common/helpers/config.helper.ts +26 -6
- package/src/core/common/helpers/context.helper.ts +42 -33
- package/src/core/common/helpers/db.helper.ts +595 -0
- package/src/core/common/helpers/file.helper.ts +76 -49
- package/src/core/common/helpers/filter.helper.ts +119 -96
- package/src/core/common/helpers/graphql.helper.ts +219 -117
- package/src/core/common/helpers/input.helper.ts +349 -108
- package/src/core/common/helpers/model.helper.ts +102 -57
- package/src/core/common/helpers/service.helper.ts +149 -117
- package/src/core/common/inputs/combined-filter.input.ts +2 -2
- package/src/core/common/inputs/core-input.input.ts +2 -2
- package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
- package/src/core/common/interfaces/resolve-selector.interface.ts +9 -0
- package/src/core/common/interfaces/service-options.interface.ts +71 -0
- package/src/core/common/models/core-model.model.ts +7 -3
- package/src/core/common/pipes/check-input.pipe.ts +4 -4
- package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
- package/src/core/common/services/crud.service.ts +100 -0
- package/src/core/common/services/email.service.ts +9 -9
- package/src/core/common/services/module.service.ts +188 -0
- package/src/core/common/types/core-model-constructor.type.ts +30 -0
- package/src/core/common/types/field-selection.type.ts +8 -0
- package/src/core/common/types/ids.type.ts +7 -0
- package/src/core/common/types/string-or-object-id.type.ts +3 -0
- package/src/core/modules/auth/core-auth.module.ts +1 -1
- package/src/core/modules/auth/core-auth.resolver.ts +8 -3
- package/src/core/modules/auth/guards/roles.guard.ts +5 -7
- package/src/core/modules/auth/services/core-auth-user.service.ts +7 -1
- package/src/core/modules/auth/services/core-auth.service.ts +14 -4
- package/src/core/modules/user/core-user.model.ts +2 -1
- package/src/core/modules/user/core-user.service.ts +115 -185
- package/src/core.module.ts +2 -2
- package/src/index.ts +9 -1
- package/src/main.ts +1 -1
- package/src/server/modules/auth/auth.resolver.ts +8 -3
- package/src/server/modules/file/file.controller.ts +2 -2
- package/src/server/modules/user/avatar.controller.ts +3 -3
- package/src/server/modules/user/user.module.ts +7 -3
- package/src/server/modules/user/user.resolver.ts +74 -43
- package/src/server/modules/user/user.service.ts +30 -53
- package/src/test/test.helper.ts +31 -30
- package/dist/core/modules/user/core-basic-user.service.d.ts +0 -17
- package/dist/core/modules/user/core-basic-user.service.js +0 -73
- package/dist/core/modules/user/core-basic-user.service.js.map +0 -1
- package/src/core/modules/user/core-basic-user.service.ts +0 -138
|
@@ -33,20 +33,24 @@ export type ValueNodeWithValueField =
|
|
|
33
33
|
| BooleanValueNode
|
|
34
34
|
| EnumValueNode;
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
/**
|
|
37
|
+
* GraphQLHelper
|
|
38
|
+
* @deprecated use functions directly
|
|
39
|
+
*/
|
|
40
|
+
export default class GraphQLHelper {
|
|
37
41
|
/**
|
|
38
42
|
* Check if AST is a Field
|
|
39
43
|
* @param ast
|
|
40
44
|
*/
|
|
41
45
|
public static isFieldNode(ast: SelectionNode): ast is FieldNode {
|
|
42
|
-
return ast
|
|
46
|
+
return isFieldNode(ast);
|
|
43
47
|
}
|
|
44
48
|
|
|
45
49
|
/**
|
|
46
50
|
* Check if ValueNode has a value field
|
|
47
51
|
*/
|
|
48
52
|
public static isValueNodeWithValueField(value: ValueNode): value is ValueNodeWithValueField {
|
|
49
|
-
return value
|
|
53
|
+
return isValueNodeWithValueField(value);
|
|
50
54
|
}
|
|
51
55
|
|
|
52
56
|
/**
|
|
@@ -54,63 +58,36 @@ export class GraphQLHelper {
|
|
|
54
58
|
* @param value
|
|
55
59
|
*/
|
|
56
60
|
public static isListValueNode(value: ValueNode): value is ListValueNode {
|
|
57
|
-
return value
|
|
61
|
+
return isListValueNode(value);
|
|
58
62
|
}
|
|
59
63
|
|
|
60
64
|
/**
|
|
61
65
|
* Get selections of AST
|
|
66
|
+
* @deprecated use getASTSelections function
|
|
62
67
|
*/
|
|
63
68
|
public static getSelections(ast: FieldNode) {
|
|
64
|
-
|
|
65
|
-
return ast.selectionSet.selections;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return [];
|
|
69
|
+
return getASTSelections(ast);
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
/**
|
|
72
73
|
* Get AST
|
|
73
74
|
*/
|
|
74
75
|
public static getAST(ast, info) {
|
|
75
|
-
|
|
76
|
-
const fragmentName = ast.name.value;
|
|
77
|
-
return info.fragments[fragmentName];
|
|
78
|
-
}
|
|
79
|
-
return ast;
|
|
76
|
+
return getAST(ast, info);
|
|
80
77
|
}
|
|
81
78
|
|
|
82
79
|
/**
|
|
83
80
|
* Get arguments of AST
|
|
84
81
|
*/
|
|
85
82
|
public static getArguments(ast: FieldNode) {
|
|
86
|
-
return ast
|
|
87
|
-
const valueNode = argument.value;
|
|
88
|
-
const argumentValue = !GraphQLHelper.isListValueNode(valueNode)
|
|
89
|
-
? (valueNode as any).value
|
|
90
|
-
: (valueNode as any).values.map((value) => value.value);
|
|
91
|
-
|
|
92
|
-
return {
|
|
93
|
-
[argument.name.value]: {
|
|
94
|
-
kind: argument.value.kind,
|
|
95
|
-
value: argumentValue,
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
});
|
|
83
|
+
return getArguments(ast);
|
|
99
84
|
}
|
|
100
85
|
|
|
101
86
|
/**
|
|
102
87
|
* Get directive value from DirectiveNode for GraphQLResolveInfo
|
|
103
88
|
*/
|
|
104
89
|
public static getDirectiveValue(directive: DirectiveNode, info: GraphQLResolveInfo) {
|
|
105
|
-
|
|
106
|
-
if (!arg) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
if (arg.value.kind !== 'Variable') {
|
|
110
|
-
const valueNode = arg.value;
|
|
111
|
-
return GraphQLHelper.isValueNodeWithValueField(valueNode) ? !!valueNode.value : false;
|
|
112
|
-
}
|
|
113
|
-
return info.variableValues[arg.value.name.value];
|
|
90
|
+
return getDirectiveValue(directive, info);
|
|
114
91
|
}
|
|
115
92
|
|
|
116
93
|
/**
|
|
@@ -119,26 +96,7 @@ export class GraphQLHelper {
|
|
|
119
96
|
* @param info
|
|
120
97
|
*/
|
|
121
98
|
public static getDirectiveResults(ast: SelectionNode, info: GraphQLResolveInfo) {
|
|
122
|
-
|
|
123
|
-
shouldInclude: true,
|
|
124
|
-
shouldSkip: false,
|
|
125
|
-
};
|
|
126
|
-
return ast.directives?.reduce((result, directive) => {
|
|
127
|
-
switch (directive.name.value) {
|
|
128
|
-
case 'include':
|
|
129
|
-
return {
|
|
130
|
-
...result,
|
|
131
|
-
shouldInclude: GraphQLHelper.getDirectiveValue(directive, info),
|
|
132
|
-
};
|
|
133
|
-
case 'skip':
|
|
134
|
-
return {
|
|
135
|
-
...result,
|
|
136
|
-
shouldSkip: GraphQLHelper.getDirectiveValue(directive, info),
|
|
137
|
-
};
|
|
138
|
-
default:
|
|
139
|
-
return result;
|
|
140
|
-
}
|
|
141
|
-
}, directiveResult);
|
|
99
|
+
return getDirectiveResults(ast, info);
|
|
142
100
|
}
|
|
143
101
|
|
|
144
102
|
/**
|
|
@@ -150,51 +108,7 @@ export class GraphQLHelper {
|
|
|
150
108
|
obj: any = {},
|
|
151
109
|
config: Partial<GraphQLFieldsConfig> = {}
|
|
152
110
|
) {
|
|
153
|
-
|
|
154
|
-
config = Object.assign(
|
|
155
|
-
{
|
|
156
|
-
processArguments: false,
|
|
157
|
-
excludedFields: [],
|
|
158
|
-
},
|
|
159
|
-
config
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
return GraphQLHelper.getSelections(ast).reduce((flattened, a) => {
|
|
163
|
-
if (a.directives && a.directives.length) {
|
|
164
|
-
const { shouldInclude, shouldSkip } = GraphQLHelper.getDirectiveResults(a, info);
|
|
165
|
-
// Field/fragment is not included if either the @skip condition is true or the @include condition is false
|
|
166
|
-
// https://facebook.github.io/graphql/draft/#sec--include
|
|
167
|
-
if (shouldSkip || !shouldInclude) {
|
|
168
|
-
return flattened;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
if (GraphQLHelper.isFieldNode(a)) {
|
|
173
|
-
const name = a.name.value;
|
|
174
|
-
if (config.excludedFields.indexOf(name) !== -1) {
|
|
175
|
-
return flattened;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (flattened[name] && flattened[name] !== '__arguments') {
|
|
179
|
-
Object.assign(flattened[name], GraphQLHelper.flattenAST(a, info, flattened[name]));
|
|
180
|
-
} else {
|
|
181
|
-
flattened[name] = GraphQLHelper.flattenAST(a, info);
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (config.processArguments) {
|
|
185
|
-
// check if the current field has arguments
|
|
186
|
-
if (a.arguments && a.arguments.length) {
|
|
187
|
-
Object.assign(flattened[name], {
|
|
188
|
-
__arguments: GraphQLHelper.getArguments(a),
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
} else {
|
|
193
|
-
flattened = GraphQLHelper.flattenAST(GraphQLHelper.getAST(a, info), info, flattened);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
return flattened;
|
|
197
|
-
}, obj);
|
|
111
|
+
return flattenAST(ast, info, obj, config);
|
|
198
112
|
}
|
|
199
113
|
|
|
200
114
|
/**
|
|
@@ -205,33 +119,221 @@ export class GraphQLHelper {
|
|
|
205
119
|
obj: Record<string, any> = {},
|
|
206
120
|
config: Partial<GraphQLFieldsConfig> = {}
|
|
207
121
|
) {
|
|
208
|
-
|
|
209
|
-
if (!info || (!info.fieldNodes && !(info as any).fieldASTs)) {
|
|
210
|
-
return {};
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Get fields from GraphQL
|
|
214
|
-
const fields: ReadonlyArray<FieldNode> = info.fieldNodes || (info as any).fieldASTs;
|
|
215
|
-
|
|
216
|
-
// Process and return fields
|
|
217
|
-
return (
|
|
218
|
-
fields.reduce((o, ast) => {
|
|
219
|
-
return GraphQLHelper.flattenAST(ast, info, o, config);
|
|
220
|
-
}, obj) || {}
|
|
221
|
-
);
|
|
122
|
+
return getFields(info, obj, config);
|
|
222
123
|
}
|
|
223
124
|
|
|
224
125
|
/**
|
|
225
126
|
* Check if field is in GraphQLResolveInfo
|
|
226
127
|
*/
|
|
227
128
|
public static isInGraphQLResolveInfo(path: any, info: GraphQLResolveInfo, config: Partial<GraphQLFieldsConfig> = {}) {
|
|
228
|
-
return
|
|
129
|
+
return isInGraphQLResolveInfo(path, info, config);
|
|
229
130
|
}
|
|
230
131
|
|
|
231
132
|
/**
|
|
232
133
|
* Check if field is in GraphQL fields
|
|
233
134
|
*/
|
|
234
135
|
public static isInFields(path: any, fields: any) {
|
|
235
|
-
return
|
|
136
|
+
return isInFields(path, fields);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Check if AST is a Field
|
|
142
|
+
* @param ast
|
|
143
|
+
*/
|
|
144
|
+
export function isFieldNode(ast: SelectionNode): ast is FieldNode {
|
|
145
|
+
return ast.kind === 'Field';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Check if ValueNode has a value field
|
|
150
|
+
*/
|
|
151
|
+
export function isValueNodeWithValueField(value: ValueNode): value is ValueNodeWithValueField {
|
|
152
|
+
return value.kind !== 'NullValue' && value.kind !== 'ListValue' && value.kind !== 'ObjectValue';
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Check ValueNode is a ListValue
|
|
157
|
+
* @param value
|
|
158
|
+
*/
|
|
159
|
+
export function isListValueNode(value: ValueNode): value is ListValueNode {
|
|
160
|
+
return value.kind === 'ListValue';
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Get selections of AST
|
|
165
|
+
*/
|
|
166
|
+
export function getASTSelections(ast: FieldNode) {
|
|
167
|
+
if (ast && ast.selectionSet && ast.selectionSet.selections && ast.selectionSet.selections.length) {
|
|
168
|
+
return ast.selectionSet.selections;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return [];
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Get AST
|
|
176
|
+
*/
|
|
177
|
+
export function getAST(ast, info) {
|
|
178
|
+
if (ast.kind === 'FragmentSpread') {
|
|
179
|
+
const fragmentName = ast.name.value;
|
|
180
|
+
return info.fragments[fragmentName];
|
|
181
|
+
}
|
|
182
|
+
return ast;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Get arguments of AST
|
|
187
|
+
*/
|
|
188
|
+
export function getArguments(ast: FieldNode) {
|
|
189
|
+
return ast.arguments?.map((argument) => {
|
|
190
|
+
const valueNode = argument.value;
|
|
191
|
+
const argumentValue = !isListValueNode(valueNode)
|
|
192
|
+
? (valueNode as any).value
|
|
193
|
+
: (valueNode as any).values.map((value) => value.value);
|
|
194
|
+
|
|
195
|
+
return {
|
|
196
|
+
[argument.name.value]: {
|
|
197
|
+
kind: argument.value.kind,
|
|
198
|
+
value: argumentValue,
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Get directive value from DirectiveNode for GraphQLResolveInfo
|
|
206
|
+
*/
|
|
207
|
+
export function getDirectiveValue(directive: DirectiveNode, info: GraphQLResolveInfo) {
|
|
208
|
+
const arg = directive.arguments?.[0]; // only arg on an include or skip directive is "if"
|
|
209
|
+
if (!arg) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (arg.value.kind !== 'Variable') {
|
|
213
|
+
const valueNode = arg.value;
|
|
214
|
+
return isValueNodeWithValueField(valueNode) ? !!valueNode.value : false;
|
|
236
215
|
}
|
|
216
|
+
return info.variableValues[arg.value.name.value];
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Get directive results from SelectionNode for GraphQLResolveInfo
|
|
221
|
+
* @param ast
|
|
222
|
+
* @param info
|
|
223
|
+
*/
|
|
224
|
+
export function getDirectiveResults(ast: SelectionNode, info: GraphQLResolveInfo) {
|
|
225
|
+
const directiveResult = {
|
|
226
|
+
shouldInclude: true,
|
|
227
|
+
shouldSkip: false,
|
|
228
|
+
};
|
|
229
|
+
return ast.directives?.reduce((result, directive) => {
|
|
230
|
+
switch (directive.name.value) {
|
|
231
|
+
case 'include':
|
|
232
|
+
return {
|
|
233
|
+
...result,
|
|
234
|
+
shouldInclude: getDirectiveValue(directive, info),
|
|
235
|
+
};
|
|
236
|
+
case 'skip':
|
|
237
|
+
return {
|
|
238
|
+
...result,
|
|
239
|
+
shouldSkip: getDirectiveValue(directive, info),
|
|
240
|
+
};
|
|
241
|
+
default:
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
}, directiveResult);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Create flatten AST from FieldNode for GraphQLResolveInfo
|
|
249
|
+
*/
|
|
250
|
+
export function flattenAST(
|
|
251
|
+
ast: FieldNode,
|
|
252
|
+
info: GraphQLResolveInfo,
|
|
253
|
+
obj: any = {},
|
|
254
|
+
config: Partial<GraphQLFieldsConfig> = {}
|
|
255
|
+
) {
|
|
256
|
+
// Process configuration
|
|
257
|
+
config = Object.assign(
|
|
258
|
+
{
|
|
259
|
+
processArguments: false,
|
|
260
|
+
excludedFields: [],
|
|
261
|
+
},
|
|
262
|
+
config
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
return getASTSelections(ast).reduce((flattened, a) => {
|
|
266
|
+
if (a.directives && a.directives.length) {
|
|
267
|
+
const { shouldInclude, shouldSkip } = getDirectiveResults(a, info);
|
|
268
|
+
// Field/fragment is not included if either the @skip condition is true or the @include condition is false
|
|
269
|
+
// https://facebook.github.io/graphql/draft/#sec--include
|
|
270
|
+
if (shouldSkip || !shouldInclude) {
|
|
271
|
+
return flattened;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (isFieldNode(a)) {
|
|
276
|
+
const name = a.name.value;
|
|
277
|
+
if (config.excludedFields.indexOf(name) !== -1) {
|
|
278
|
+
return flattened;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (flattened[name] && flattened[name] !== '__arguments') {
|
|
282
|
+
Object.assign(flattened[name], flattenAST(a, info, flattened[name]));
|
|
283
|
+
} else {
|
|
284
|
+
flattened[name] = flattenAST(a, info);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (config.processArguments) {
|
|
288
|
+
// check if the current field has arguments
|
|
289
|
+
if (a.arguments && a.arguments.length) {
|
|
290
|
+
Object.assign(flattened[name], {
|
|
291
|
+
__arguments: getArguments(a),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
} else {
|
|
296
|
+
flattened = flattenAST(getAST(a, info), info, flattened);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return flattened;
|
|
300
|
+
}, obj);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Get requested fields from GraphQLResolveInfo
|
|
305
|
+
*/
|
|
306
|
+
export function getFields(
|
|
307
|
+
info: GraphQLResolveInfo,
|
|
308
|
+
obj: Record<string, any> = {},
|
|
309
|
+
config: Partial<GraphQLFieldsConfig> = {}
|
|
310
|
+
) {
|
|
311
|
+
// Check info
|
|
312
|
+
if (!info || (!info.fieldNodes && !(info as any).fieldASTs)) {
|
|
313
|
+
return {};
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Get fields from GraphQL
|
|
317
|
+
const fields: ReadonlyArray<FieldNode> = info.fieldNodes || (info as any).fieldASTs;
|
|
318
|
+
|
|
319
|
+
// Process and return fields
|
|
320
|
+
return (
|
|
321
|
+
fields.reduce((o, ast) => {
|
|
322
|
+
return flattenAST(ast, info, o, config);
|
|
323
|
+
}, obj) || {}
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Check if field is in GraphQLResolveInfo
|
|
329
|
+
*/
|
|
330
|
+
export function isInGraphQLResolveInfo(path: any, info: GraphQLResolveInfo, config: Partial<GraphQLFieldsConfig> = {}) {
|
|
331
|
+
return _.has(getFields(info, config), path);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Check if field is in GraphQL fields
|
|
336
|
+
*/
|
|
337
|
+
export function isInFields(path: any, fields: any) {
|
|
338
|
+
return _.has(fields, path);
|
|
237
339
|
}
|