@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.
Files changed (166) hide show
  1. package/dist/config.env.js +3 -2
  2. package/dist/config.env.js.map +1 -1
  3. package/dist/core/common/args/pagination.args.js +1 -1
  4. package/dist/core/common/args/pagination.args.js.map +1 -1
  5. package/dist/core/common/decorators/restricted.decorator.d.ts +3 -0
  6. package/dist/core/common/decorators/restricted.decorator.js +14 -8
  7. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  8. package/dist/core/common/enums/role.enum.d.ts +3 -2
  9. package/dist/core/common/enums/role.enum.js +3 -2
  10. package/dist/core/common/enums/role.enum.js.map +1 -1
  11. package/dist/core/common/helpers/config.helper.d.ts +2 -1
  12. package/dist/core/common/helpers/config.helper.js +11 -7
  13. package/dist/core/common/helpers/config.helper.js.map +1 -1
  14. package/dist/core/common/helpers/context.helper.d.ts +7 -1
  15. package/dist/core/common/helpers/context.helper.js +33 -29
  16. package/dist/core/common/helpers/context.helper.js.map +1 -1
  17. package/dist/core/common/helpers/db.helper.d.ts +37 -0
  18. package/dist/core/common/helpers/db.helper.js +356 -0
  19. package/dist/core/common/helpers/db.helper.js.map +1 -0
  20. package/dist/core/common/helpers/file.helper.d.ts +8 -1
  21. package/dist/core/common/helpers/file.helper.js +43 -31
  22. package/dist/core/common/helpers/file.helper.js.map +1 -1
  23. package/dist/core/common/helpers/filter.helper.d.ts +3 -0
  24. package/dist/core/common/helpers/filter.helper.js +93 -81
  25. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  26. package/dist/core/common/helpers/graphql.helper.d.ts +24 -1
  27. package/dist/core/common/helpers/graphql.helper.js +144 -96
  28. package/dist/core/common/helpers/graphql.helper.js.map +1 -1
  29. package/dist/core/common/helpers/input.helper.d.ts +42 -4
  30. package/dist/core/common/helpers/input.helper.js +256 -97
  31. package/dist/core/common/helpers/input.helper.js.map +1 -1
  32. package/dist/core/common/helpers/model.helper.d.ts +11 -0
  33. package/dist/core/common/helpers/model.helper.js +41 -29
  34. package/dist/core/common/helpers/model.helper.js.map +1 -1
  35. package/dist/core/common/helpers/service.helper.d.ts +21 -1
  36. package/dist/core/common/helpers/service.helper.js +80 -72
  37. package/dist/core/common/helpers/service.helper.js.map +1 -1
  38. package/dist/core/common/inputs/combined-filter.input.js +1 -1
  39. package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
  40. package/dist/core/common/inputs/core-input.input.js +1 -1
  41. package/dist/core/common/inputs/core-input.input.js.map +1 -1
  42. package/dist/core/common/interceptors/check-response.interceptor.js +1 -1
  43. package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
  44. package/dist/core/common/interfaces/resolve-selector.interface.d.ts +5 -0
  45. package/dist/core/common/interfaces/resolve-selector.interface.js +3 -0
  46. package/dist/core/common/interfaces/resolve-selector.interface.js.map +1 -0
  47. package/dist/core/common/interfaces/service-options.interface.d.ts +36 -0
  48. package/dist/core/common/interfaces/service-options.interface.js +3 -0
  49. package/dist/core/common/interfaces/service-options.interface.js.map +1 -0
  50. package/dist/core/common/models/core-model.model.d.ts +5 -1
  51. package/dist/core/common/models/core-model.model.js +1 -1
  52. package/dist/core/common/models/core-model.model.js.map +1 -1
  53. package/dist/core/common/pipes/check-input.pipe.js +2 -2
  54. package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
  55. package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
  56. package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
  57. package/dist/core/common/services/crud.service.d.ts +13 -0
  58. package/dist/core/common/services/crud.service.js +57 -0
  59. package/dist/core/common/services/crud.service.js.map +1 -0
  60. package/dist/core/common/services/email.service.js +8 -8
  61. package/dist/core/common/services/email.service.js.map +1 -1
  62. package/dist/core/common/services/module.service.d.ts +40 -0
  63. package/dist/core/common/services/module.service.js +80 -0
  64. package/dist/core/common/services/module.service.js.map +1 -0
  65. package/dist/core/common/types/core-model-constructor.type.d.ts +21 -0
  66. package/dist/core/common/types/core-model-constructor.type.js +3 -0
  67. package/dist/core/common/types/core-model-constructor.type.js.map +1 -0
  68. package/dist/core/common/types/field-selection.type.d.ts +4 -0
  69. package/dist/core/common/types/field-selection.type.js +3 -0
  70. package/dist/core/common/types/field-selection.type.js.map +1 -0
  71. package/dist/core/common/types/ids.type.d.ts +8 -0
  72. package/dist/core/common/types/ids.type.js +3 -0
  73. package/dist/core/common/types/ids.type.js.map +1 -0
  74. package/dist/core/common/types/string-or-object-id.type.d.ts +2 -0
  75. package/dist/core/common/types/string-or-object-id.type.js +3 -0
  76. package/dist/core/common/types/string-or-object-id.type.js.map +1 -0
  77. package/dist/core/modules/auth/core-auth.resolver.d.ts +2 -1
  78. package/dist/core/modules/auth/core-auth.resolver.js +4 -3
  79. package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
  80. package/dist/core/modules/auth/guards/roles.guard.js +1 -2
  81. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  82. package/dist/core/modules/auth/services/core-auth-user.service.d.ts +3 -1
  83. package/dist/core/modules/auth/services/core-auth-user.service.js.map +1 -1
  84. package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -1
  85. package/dist/core/modules/auth/services/core-auth.service.js +6 -4
  86. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  87. package/dist/core/modules/user/core-user.model.js +1 -1
  88. package/dist/core/modules/user/core-user.model.js.map +1 -1
  89. package/dist/core/modules/user/core-user.service.d.ts +16 -25
  90. package/dist/core/modules/user/core-user.service.js +69 -90
  91. package/dist/core/modules/user/core-user.service.js.map +1 -1
  92. package/dist/core.module.js +1 -1
  93. package/dist/core.module.js.map +1 -1
  94. package/dist/index.d.ts +9 -1
  95. package/dist/index.js +9 -1
  96. package/dist/index.js.map +1 -1
  97. package/dist/server/modules/auth/auth.resolver.d.ts +2 -1
  98. package/dist/server/modules/auth/auth.resolver.js +4 -3
  99. package/dist/server/modules/auth/auth.resolver.js.map +1 -1
  100. package/dist/server/modules/file/file.controller.js +1 -1
  101. package/dist/server/modules/file/file.controller.js.map +1 -1
  102. package/dist/server/modules/user/avatar.controller.js +2 -2
  103. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  104. package/dist/server/modules/user/user.model.d.ts +2 -1
  105. package/dist/server/modules/user/user.module.js +7 -3
  106. package/dist/server/modules/user/user.module.js.map +1 -1
  107. package/dist/server/modules/user/user.resolver.d.ts +8 -7
  108. package/dist/server/modules/user/user.resolver.js +85 -49
  109. package/dist/server/modules/user/user.resolver.js.map +1 -1
  110. package/dist/server/modules/user/user.service.d.ts +9 -18
  111. package/dist/server/modules/user/user.service.js +23 -30
  112. package/dist/server/modules/user/user.service.js.map +1 -1
  113. package/dist/test/test.helper.d.ts +1 -2
  114. package/dist/test/test.helper.js +1 -16
  115. package/dist/test/test.helper.js.map +1 -1
  116. package/dist/tsconfig.build.tsbuildinfo +1 -1
  117. package/package.json +58 -59
  118. package/src/config.env.ts +3 -2
  119. package/src/core/common/args/pagination.args.ts +2 -2
  120. package/src/core/common/decorators/restricted.decorator.ts +24 -12
  121. package/src/core/common/enums/role.enum.ts +23 -5
  122. package/src/core/common/helpers/config.helper.ts +26 -6
  123. package/src/core/common/helpers/context.helper.ts +42 -33
  124. package/src/core/common/helpers/db.helper.ts +595 -0
  125. package/src/core/common/helpers/file.helper.ts +76 -49
  126. package/src/core/common/helpers/filter.helper.ts +119 -96
  127. package/src/core/common/helpers/graphql.helper.ts +219 -117
  128. package/src/core/common/helpers/input.helper.ts +349 -108
  129. package/src/core/common/helpers/model.helper.ts +102 -57
  130. package/src/core/common/helpers/service.helper.ts +149 -117
  131. package/src/core/common/inputs/combined-filter.input.ts +2 -2
  132. package/src/core/common/inputs/core-input.input.ts +2 -2
  133. package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
  134. package/src/core/common/interfaces/resolve-selector.interface.ts +9 -0
  135. package/src/core/common/interfaces/service-options.interface.ts +71 -0
  136. package/src/core/common/models/core-model.model.ts +7 -3
  137. package/src/core/common/pipes/check-input.pipe.ts +4 -4
  138. package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
  139. package/src/core/common/services/crud.service.ts +100 -0
  140. package/src/core/common/services/email.service.ts +9 -9
  141. package/src/core/common/services/module.service.ts +188 -0
  142. package/src/core/common/types/core-model-constructor.type.ts +30 -0
  143. package/src/core/common/types/field-selection.type.ts +8 -0
  144. package/src/core/common/types/ids.type.ts +7 -0
  145. package/src/core/common/types/string-or-object-id.type.ts +3 -0
  146. package/src/core/modules/auth/core-auth.module.ts +1 -1
  147. package/src/core/modules/auth/core-auth.resolver.ts +8 -3
  148. package/src/core/modules/auth/guards/roles.guard.ts +5 -7
  149. package/src/core/modules/auth/services/core-auth-user.service.ts +7 -1
  150. package/src/core/modules/auth/services/core-auth.service.ts +14 -4
  151. package/src/core/modules/user/core-user.model.ts +2 -1
  152. package/src/core/modules/user/core-user.service.ts +115 -185
  153. package/src/core.module.ts +2 -2
  154. package/src/index.ts +9 -1
  155. package/src/main.ts +1 -1
  156. package/src/server/modules/auth/auth.resolver.ts +8 -3
  157. package/src/server/modules/file/file.controller.ts +2 -2
  158. package/src/server/modules/user/avatar.controller.ts +3 -3
  159. package/src/server/modules/user/user.module.ts +7 -3
  160. package/src/server/modules/user/user.resolver.ts +74 -43
  161. package/src/server/modules/user/user.service.ts +30 -53
  162. package/src/test/test.helper.ts +31 -30
  163. package/dist/core/modules/user/core-basic-user.service.d.ts +0 -17
  164. package/dist/core/modules/user/core-basic-user.service.js +0 -73
  165. package/dist/core/modules/user/core-basic-user.service.js.map +0 -1
  166. 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
- export class GraphQLHelper {
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.kind === 'Field';
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.kind !== 'NullValue' && value.kind !== 'ListValue' && value.kind !== 'ObjectValue';
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.kind === 'ListValue';
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
- if (ast && ast.selectionSet && ast.selectionSet.selections && ast.selectionSet.selections.length) {
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
- if (ast.kind === 'FragmentSpread') {
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.arguments?.map((argument) => {
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
- const arg = directive.arguments?.[0]; // only arg on an include or skip directive is "if"
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
- const directiveResult = {
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
- // Process configuration
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
- // Check info
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 _.has(GraphQLHelper.getFields(info, config), path);
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 _.has(fields, path);
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
  }