@graphql-mesh/config 2.0.0 → 2.1.0-alpha-72ee3dd9c.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.
@@ -0,0 +1,2 @@
1
+ import { DocumentNode } from 'graphql';
2
+ export declare function getAdditionalResolversFromTypeDefs(additionalTypeDefs: DocumentNode[]): (string | import("../../types/src/config").AdditionalStitchingResolverObject | import("../../types/src/config").AdditionalStitchingBatchResolverObject | import("../../types/src/config").AdditionalSubscriptionObject)[];
package/index.js CHANGED
@@ -165,6 +165,73 @@ async function resolveLogger(loggerConfig, importFn, cwd, additionalPackagePrefi
165
165
  };
166
166
  }
167
167
 
168
+ function parseObject(ast) {
169
+ const value = Object.create(null);
170
+ ast.fields.forEach(field => {
171
+ // eslint-disable-next-line no-use-before-define
172
+ value[field.name.value] = parseLiteral(field.value);
173
+ });
174
+ return value;
175
+ }
176
+ function parseLiteral(ast) {
177
+ switch (ast.kind) {
178
+ case graphql.Kind.STRING:
179
+ case graphql.Kind.BOOLEAN:
180
+ return ast.value;
181
+ case graphql.Kind.INT:
182
+ case graphql.Kind.FLOAT:
183
+ return parseFloat(ast.value);
184
+ case graphql.Kind.OBJECT:
185
+ return parseObject(ast);
186
+ case graphql.Kind.LIST:
187
+ return ast.values.map(n => parseLiteral(n));
188
+ case graphql.Kind.NULL:
189
+ return null;
190
+ }
191
+ }
192
+ function getAdditionalResolversFromTypeDefs(additionalTypeDefs) {
193
+ const additionalResolversFromTypeDefs = [];
194
+ function handleFieldNode(targetTypeName, fieldNode) {
195
+ var _a;
196
+ if ((_a = fieldNode.directives) === null || _a === void 0 ? void 0 : _a.length) {
197
+ const resolveToDef = fieldNode.directives.find(d => d.name.value === 'resolveTo');
198
+ if (resolveToDef != null) {
199
+ const resolveToArgumentMap = {};
200
+ for (const resolveToArg of resolveToDef.arguments) {
201
+ const resolveToArgName = resolveToArg.name.value;
202
+ resolveToArgumentMap[resolveToArgName] = parseLiteral(resolveToArg.value);
203
+ }
204
+ additionalResolversFromTypeDefs.push({
205
+ targetTypeName,
206
+ targetFieldName: fieldNode.name.value,
207
+ ...resolveToArgumentMap,
208
+ });
209
+ }
210
+ }
211
+ }
212
+ additionalTypeDefs === null || additionalTypeDefs === void 0 ? void 0 : additionalTypeDefs.forEach(typeDefs => {
213
+ graphql.visit(typeDefs, {
214
+ ObjectTypeDefinition(objectNode) {
215
+ var _a;
216
+ (_a = objectNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(objectNode.name.value, fieldNode));
217
+ },
218
+ ObjectTypeExtension(objectNode) {
219
+ var _a;
220
+ (_a = objectNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(objectNode.name.value, fieldNode));
221
+ },
222
+ InterfaceTypeDefinition(interfaceNode) {
223
+ var _a;
224
+ (_a = interfaceNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(interfaceNode.name.value, fieldNode));
225
+ },
226
+ InterfaceTypeExtension(interfaceNode) {
227
+ var _a;
228
+ (_a = interfaceNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(interfaceNode.name.value, fieldNode));
229
+ },
230
+ });
231
+ });
232
+ return additionalResolversFromTypeDefs;
233
+ }
234
+
168
235
  const ENVELOP_CORE_PLUGINS_MAP = {
169
236
  maskedErrors: {
170
237
  moduleName: '@envelop/core',
@@ -461,6 +528,41 @@ async function processConfig(config, options) {
461
528
  codes.push(`const additionalResolvers = [] as any[]`);
462
529
  }
463
530
  }
531
+ if (additionalTypeDefs === null || additionalTypeDefs === void 0 ? void 0 : additionalTypeDefs.length) {
532
+ const additionalResolversConfigFromTypeDefs = getAdditionalResolversFromTypeDefs(additionalTypeDefs);
533
+ if (additionalResolversConfigFromTypeDefs === null || additionalResolversConfigFromTypeDefs === void 0 ? void 0 : additionalResolversConfigFromTypeDefs.length) {
534
+ const resolveToDirectiveDefinition = /* GraphQL */ `
535
+ scalar ResolveToSourceArgs
536
+ directive @resolveTo(
537
+ requiredSelectionSet: String
538
+ sourceName: String!
539
+ sourceTypeName: String!
540
+ sourceFieldName: String!
541
+ sourceSelectionSet: String
542
+ sourceArgs: ResolveToSourceArgs
543
+ keyField: String
544
+ keysArg: String
545
+ additionalArgs: ResolveToSourceArgs
546
+ result: String
547
+ resultType: String
548
+ ) on FIELD_DEFINITION
549
+ `;
550
+ const resolvedAdditionalResolvers = await utils$1.resolveAdditionalResolvers(dir, additionalResolversConfigFromTypeDefs, importFn, pubsub);
551
+ additionalTypeDefs.unshift(graphql.parse(resolveToDirectiveDefinition));
552
+ additionalResolvers.push(...resolvedAdditionalResolvers);
553
+ if (options.generateCode && resolvedAdditionalResolvers.length) {
554
+ importCodes.push(`import { resolveAdditionalResolvers } from '@graphql-mesh/utils';`);
555
+ codes.push(`additionalTypeDefs.unshift(parse(/* GraphQL */\`${resolveToDirectiveDefinition}\`))`);
556
+ codes.push(`const additionalResolversFromTypeDefs = await resolveAdditionalResolvers(
557
+ baseDir,
558
+ ${JSON.stringify(additionalResolversConfigFromTypeDefs)},
559
+ importFn,
560
+ pubsub
561
+ );`);
562
+ codes.push(`additionalResolvers.push(additionalResolversFromTypeDefs)`);
563
+ }
564
+ }
565
+ }
464
566
  if (config.additionalEnvelopPlugins) {
465
567
  codes.push(`const importedAdditionalEnvelopPlugins = await import(${JSON.stringify(crossHelpers.path.join('..', config.additionalEnvelopPlugins).split('\\').join('/'))}).then(m => m.default || m);`);
466
568
  const importedAdditionalEnvelopPlugins = await importFn(crossHelpers.path.isAbsolute(config.additionalEnvelopPlugins)
package/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { path, process } from '@graphql-mesh/cross-helpers';
2
- import { print, concatAST, visit } from 'graphql';
2
+ import { visit, Kind, print, parse, concatAST } from 'graphql';
3
3
  import { printSchemaWithDirectives } from '@graphql-tools/utils';
4
4
  import { paramCase } from 'param-case';
5
5
  import { loadTypedefs, loadDocuments } from '@graphql-tools/load';
@@ -161,6 +161,73 @@ async function resolveLogger(loggerConfig, importFn, cwd, additionalPackagePrefi
161
161
  };
162
162
  }
163
163
 
164
+ function parseObject(ast) {
165
+ const value = Object.create(null);
166
+ ast.fields.forEach(field => {
167
+ // eslint-disable-next-line no-use-before-define
168
+ value[field.name.value] = parseLiteral(field.value);
169
+ });
170
+ return value;
171
+ }
172
+ function parseLiteral(ast) {
173
+ switch (ast.kind) {
174
+ case Kind.STRING:
175
+ case Kind.BOOLEAN:
176
+ return ast.value;
177
+ case Kind.INT:
178
+ case Kind.FLOAT:
179
+ return parseFloat(ast.value);
180
+ case Kind.OBJECT:
181
+ return parseObject(ast);
182
+ case Kind.LIST:
183
+ return ast.values.map(n => parseLiteral(n));
184
+ case Kind.NULL:
185
+ return null;
186
+ }
187
+ }
188
+ function getAdditionalResolversFromTypeDefs(additionalTypeDefs) {
189
+ const additionalResolversFromTypeDefs = [];
190
+ function handleFieldNode(targetTypeName, fieldNode) {
191
+ var _a;
192
+ if ((_a = fieldNode.directives) === null || _a === void 0 ? void 0 : _a.length) {
193
+ const resolveToDef = fieldNode.directives.find(d => d.name.value === 'resolveTo');
194
+ if (resolveToDef != null) {
195
+ const resolveToArgumentMap = {};
196
+ for (const resolveToArg of resolveToDef.arguments) {
197
+ const resolveToArgName = resolveToArg.name.value;
198
+ resolveToArgumentMap[resolveToArgName] = parseLiteral(resolveToArg.value);
199
+ }
200
+ additionalResolversFromTypeDefs.push({
201
+ targetTypeName,
202
+ targetFieldName: fieldNode.name.value,
203
+ ...resolveToArgumentMap,
204
+ });
205
+ }
206
+ }
207
+ }
208
+ additionalTypeDefs === null || additionalTypeDefs === void 0 ? void 0 : additionalTypeDefs.forEach(typeDefs => {
209
+ visit(typeDefs, {
210
+ ObjectTypeDefinition(objectNode) {
211
+ var _a;
212
+ (_a = objectNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(objectNode.name.value, fieldNode));
213
+ },
214
+ ObjectTypeExtension(objectNode) {
215
+ var _a;
216
+ (_a = objectNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(objectNode.name.value, fieldNode));
217
+ },
218
+ InterfaceTypeDefinition(interfaceNode) {
219
+ var _a;
220
+ (_a = interfaceNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(interfaceNode.name.value, fieldNode));
221
+ },
222
+ InterfaceTypeExtension(interfaceNode) {
223
+ var _a;
224
+ (_a = interfaceNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(interfaceNode.name.value, fieldNode));
225
+ },
226
+ });
227
+ });
228
+ return additionalResolversFromTypeDefs;
229
+ }
230
+
164
231
  const ENVELOP_CORE_PLUGINS_MAP = {
165
232
  maskedErrors: {
166
233
  moduleName: '@envelop/core',
@@ -457,6 +524,41 @@ async function processConfig(config, options) {
457
524
  codes.push(`const additionalResolvers = [] as any[]`);
458
525
  }
459
526
  }
527
+ if (additionalTypeDefs === null || additionalTypeDefs === void 0 ? void 0 : additionalTypeDefs.length) {
528
+ const additionalResolversConfigFromTypeDefs = getAdditionalResolversFromTypeDefs(additionalTypeDefs);
529
+ if (additionalResolversConfigFromTypeDefs === null || additionalResolversConfigFromTypeDefs === void 0 ? void 0 : additionalResolversConfigFromTypeDefs.length) {
530
+ const resolveToDirectiveDefinition = /* GraphQL */ `
531
+ scalar ResolveToSourceArgs
532
+ directive @resolveTo(
533
+ requiredSelectionSet: String
534
+ sourceName: String!
535
+ sourceTypeName: String!
536
+ sourceFieldName: String!
537
+ sourceSelectionSet: String
538
+ sourceArgs: ResolveToSourceArgs
539
+ keyField: String
540
+ keysArg: String
541
+ additionalArgs: ResolveToSourceArgs
542
+ result: String
543
+ resultType: String
544
+ ) on FIELD_DEFINITION
545
+ `;
546
+ const resolvedAdditionalResolvers = await resolveAdditionalResolvers(dir, additionalResolversConfigFromTypeDefs, importFn, pubsub);
547
+ additionalTypeDefs.unshift(parse(resolveToDirectiveDefinition));
548
+ additionalResolvers.push(...resolvedAdditionalResolvers);
549
+ if (options.generateCode && resolvedAdditionalResolvers.length) {
550
+ importCodes.push(`import { resolveAdditionalResolvers } from '@graphql-mesh/utils';`);
551
+ codes.push(`additionalTypeDefs.unshift(parse(/* GraphQL */\`${resolveToDirectiveDefinition}\`))`);
552
+ codes.push(`const additionalResolversFromTypeDefs = await resolveAdditionalResolvers(
553
+ baseDir,
554
+ ${JSON.stringify(additionalResolversConfigFromTypeDefs)},
555
+ importFn,
556
+ pubsub
557
+ );`);
558
+ codes.push(`additionalResolvers.push(additionalResolversFromTypeDefs)`);
559
+ }
560
+ }
561
+ }
460
562
  if (config.additionalEnvelopPlugins) {
461
563
  codes.push(`const importedAdditionalEnvelopPlugins = await import(${JSON.stringify(path.join('..', config.additionalEnvelopPlugins).split('\\').join('/'))}).then(m => m.default || m);`);
462
564
  const importedAdditionalEnvelopPlugins = await importFn(path.isAbsolute(config.additionalEnvelopPlugins)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphql-mesh/config",
3
- "version": "2.0.0",
3
+ "version": "2.1.0-alpha-72ee3dd9c.0",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
6
  "@graphql-mesh/runtime": "^0.38.0",