@graphql-mesh/config 1.0.1 → 1.1.0-alpha-36b706abb.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',
@@ -212,7 +279,7 @@ async function processConfig(config, options) {
212
279
  `export const rawServeConfig: YamlConfig.Config['serve'] = ${JSON.stringify(config.serve)} as any`,
213
280
  `export async function getMeshOptions(): Promise<GetMeshOptions> {`,
214
281
  ];
215
- const { dir, importFn = utils$1.defaultImportFn, store: providedStore, artifactsDir, additionalPackagePrefixes, } = options || {};
282
+ const { dir, importFn = utils$1.defaultImportFn, store: providedStore, artifactsDir, additionalPackagePrefixes = [], } = options || {};
216
283
  if (config.require) {
217
284
  await Promise.all(config.require.map(mod => importFn(mod)));
218
285
  for (const mod of config.require) {
@@ -379,6 +446,7 @@ async function processConfig(config, options) {
379
446
  codes.push(`additionalEnvelopPlugins[${pluginIndex}] = ${importName}({
380
447
  ...(${JSON.stringify(pluginConfig, null, 2)}),
381
448
  logger: logger.child(${JSON.stringify(pluginName)}),
449
+ cache,
382
450
  })`);
383
451
  }
384
452
  }
@@ -396,6 +464,7 @@ async function processConfig(config, options) {
396
464
  return pluginFactory({
397
465
  ...pluginConfig,
398
466
  logger: logger.child(pluginName),
467
+ cache,
399
468
  });
400
469
  })) || []),
401
470
  resolveAdditionalTypeDefs(dir, config.additionalTypeDefs).then(additionalTypeDefs => {
@@ -459,6 +528,41 @@ async function processConfig(config, options) {
459
528
  codes.push(`const additionalResolvers = [] as any[]`);
460
529
  }
461
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
+ }
462
566
  if (config.additionalEnvelopPlugins) {
463
567
  codes.push(`const importedAdditionalEnvelopPlugins = await import(${JSON.stringify(crossHelpers.path.join('..', config.additionalEnvelopPlugins).split('\\').join('/'))}).then(m => m.default || m);`);
464
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',
@@ -208,7 +275,7 @@ async function processConfig(config, options) {
208
275
  `export const rawServeConfig: YamlConfig.Config['serve'] = ${JSON.stringify(config.serve)} as any`,
209
276
  `export async function getMeshOptions(): Promise<GetMeshOptions> {`,
210
277
  ];
211
- const { dir, importFn = defaultImportFn, store: providedStore, artifactsDir, additionalPackagePrefixes, } = options || {};
278
+ const { dir, importFn = defaultImportFn, store: providedStore, artifactsDir, additionalPackagePrefixes = [], } = options || {};
212
279
  if (config.require) {
213
280
  await Promise.all(config.require.map(mod => importFn(mod)));
214
281
  for (const mod of config.require) {
@@ -375,6 +442,7 @@ async function processConfig(config, options) {
375
442
  codes.push(`additionalEnvelopPlugins[${pluginIndex}] = ${importName}({
376
443
  ...(${JSON.stringify(pluginConfig, null, 2)}),
377
444
  logger: logger.child(${JSON.stringify(pluginName)}),
445
+ cache,
378
446
  })`);
379
447
  }
380
448
  }
@@ -392,6 +460,7 @@ async function processConfig(config, options) {
392
460
  return pluginFactory({
393
461
  ...pluginConfig,
394
462
  logger: logger.child(pluginName),
463
+ cache,
395
464
  });
396
465
  })) || []),
397
466
  resolveAdditionalTypeDefs(dir, config.additionalTypeDefs).then(additionalTypeDefs => {
@@ -455,6 +524,41 @@ async function processConfig(config, options) {
455
524
  codes.push(`const additionalResolvers = [] as any[]`);
456
525
  }
457
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
+ }
458
562
  if (config.additionalEnvelopPlugins) {
459
563
  codes.push(`const importedAdditionalEnvelopPlugins = await import(${JSON.stringify(path.join('..', config.additionalEnvelopPlugins).split('\\').join('/'))}).then(m => m.default || m);`);
460
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": "1.0.1",
3
+ "version": "1.1.0-alpha-36b706abb.0",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
6
  "@graphql-mesh/runtime": "^0.37.1",