@graphql-mesh/config 3.0.0-alpha-df3bd330e.0 → 3.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.
@@ -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
@@ -167,6 +167,73 @@ async function resolveLogger(loggerConfig, importFn, cwd, additionalPackagePrefi
167
167
  };
168
168
  }
169
169
 
170
+ function parseObject(ast) {
171
+ const value = Object.create(null);
172
+ ast.fields.forEach(field => {
173
+ // eslint-disable-next-line no-use-before-define
174
+ value[field.name.value] = parseLiteral(field.value);
175
+ });
176
+ return value;
177
+ }
178
+ function parseLiteral(ast) {
179
+ switch (ast.kind) {
180
+ case graphql.Kind.STRING:
181
+ case graphql.Kind.BOOLEAN:
182
+ return ast.value;
183
+ case graphql.Kind.INT:
184
+ case graphql.Kind.FLOAT:
185
+ return parseFloat(ast.value);
186
+ case graphql.Kind.OBJECT:
187
+ return parseObject(ast);
188
+ case graphql.Kind.LIST:
189
+ return ast.values.map(n => parseLiteral(n));
190
+ case graphql.Kind.NULL:
191
+ return null;
192
+ }
193
+ }
194
+ function getAdditionalResolversFromTypeDefs(additionalTypeDefs) {
195
+ const additionalResolversFromTypeDefs = [];
196
+ function handleFieldNode(targetTypeName, fieldNode) {
197
+ var _a;
198
+ if ((_a = fieldNode.directives) === null || _a === void 0 ? void 0 : _a.length) {
199
+ const resolveToDef = fieldNode.directives.find(d => d.name.value === 'resolveTo');
200
+ if (resolveToDef != null) {
201
+ const resolveToArgumentMap = {};
202
+ for (const resolveToArg of resolveToDef.arguments) {
203
+ const resolveToArgName = resolveToArg.name.value;
204
+ resolveToArgumentMap[resolveToArgName] = parseLiteral(resolveToArg.value);
205
+ }
206
+ additionalResolversFromTypeDefs.push({
207
+ targetTypeName,
208
+ targetFieldName: fieldNode.name.value,
209
+ ...resolveToArgumentMap,
210
+ });
211
+ }
212
+ }
213
+ }
214
+ additionalTypeDefs === null || additionalTypeDefs === void 0 ? void 0 : additionalTypeDefs.forEach(typeDefs => {
215
+ graphql.visit(typeDefs, {
216
+ ObjectTypeDefinition(objectNode) {
217
+ var _a;
218
+ (_a = objectNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(objectNode.name.value, fieldNode));
219
+ },
220
+ ObjectTypeExtension(objectNode) {
221
+ var _a;
222
+ (_a = objectNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(objectNode.name.value, fieldNode));
223
+ },
224
+ InterfaceTypeDefinition(interfaceNode) {
225
+ var _a;
226
+ (_a = interfaceNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(interfaceNode.name.value, fieldNode));
227
+ },
228
+ InterfaceTypeExtension(interfaceNode) {
229
+ var _a;
230
+ (_a = interfaceNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(interfaceNode.name.value, fieldNode));
231
+ },
232
+ });
233
+ });
234
+ return additionalResolversFromTypeDefs;
235
+ }
236
+
170
237
  const ENVELOP_CORE_PLUGINS_MAP = {
171
238
  maskedErrors: {
172
239
  moduleName: '@envelop/core',
@@ -481,6 +548,43 @@ async function processConfig(config, options) {
481
548
  codes.push(`const additionalResolvers = [] as any[]`);
482
549
  }
483
550
  }
551
+ if (additionalTypeDefs === null || additionalTypeDefs === void 0 ? void 0 : additionalTypeDefs.length) {
552
+ const additionalResolversConfigFromTypeDefs = getAdditionalResolversFromTypeDefs(additionalTypeDefs);
553
+ if (additionalResolversConfigFromTypeDefs === null || additionalResolversConfigFromTypeDefs === void 0 ? void 0 : additionalResolversConfigFromTypeDefs.length) {
554
+ const resolveToDirectiveDefinition = /* GraphQL */ `
555
+ scalar ResolveToSourceArgs
556
+ directive @resolveTo(
557
+ requiredSelectionSet: String
558
+ sourceName: String!
559
+ sourceTypeName: String!
560
+ sourceFieldName: String!
561
+ sourceSelectionSet: String
562
+ sourceArgs: ResolveToSourceArgs
563
+ keyField: String
564
+ keysArg: String
565
+ pubsubTopic: String
566
+ filterBy: String
567
+ additionalArgs: ResolveToSourceArgs
568
+ result: String
569
+ resultType: String
570
+ ) on FIELD_DEFINITION
571
+ `;
572
+ const resolvedAdditionalResolvers = await utils$1.resolveAdditionalResolvers(dir, additionalResolversConfigFromTypeDefs, importFn, pubsub);
573
+ additionalTypeDefs.unshift(graphql.parse(resolveToDirectiveDefinition));
574
+ additionalResolvers.push(...resolvedAdditionalResolvers);
575
+ if (options.generateCode && resolvedAdditionalResolvers.length) {
576
+ importCodes.push(`import { resolveAdditionalResolvers } from '@graphql-mesh/utils';`);
577
+ codes.push(`additionalTypeDefs.unshift(parse(/* GraphQL */\`${resolveToDirectiveDefinition}\`))`);
578
+ codes.push(`const additionalResolversFromTypeDefs = await resolveAdditionalResolvers(
579
+ baseDir,
580
+ ${JSON.stringify(additionalResolversConfigFromTypeDefs)},
581
+ importFn,
582
+ pubsub
583
+ );`);
584
+ codes.push(`additionalResolvers.push(additionalResolversFromTypeDefs)`);
585
+ }
586
+ }
587
+ }
484
588
  if (config.additionalEnvelopPlugins) {
485
589
  codes.push(`const importedAdditionalEnvelopPlugins = await import(${JSON.stringify(crossHelpers.path.join('..', config.additionalEnvelopPlugins).split('\\').join('/'))}).then(m => m.default || m);`);
486
590
  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';
@@ -163,6 +163,73 @@ async function resolveLogger(loggerConfig, importFn, cwd, additionalPackagePrefi
163
163
  };
164
164
  }
165
165
 
166
+ function parseObject(ast) {
167
+ const value = Object.create(null);
168
+ ast.fields.forEach(field => {
169
+ // eslint-disable-next-line no-use-before-define
170
+ value[field.name.value] = parseLiteral(field.value);
171
+ });
172
+ return value;
173
+ }
174
+ function parseLiteral(ast) {
175
+ switch (ast.kind) {
176
+ case Kind.STRING:
177
+ case Kind.BOOLEAN:
178
+ return ast.value;
179
+ case Kind.INT:
180
+ case Kind.FLOAT:
181
+ return parseFloat(ast.value);
182
+ case Kind.OBJECT:
183
+ return parseObject(ast);
184
+ case Kind.LIST:
185
+ return ast.values.map(n => parseLiteral(n));
186
+ case Kind.NULL:
187
+ return null;
188
+ }
189
+ }
190
+ function getAdditionalResolversFromTypeDefs(additionalTypeDefs) {
191
+ const additionalResolversFromTypeDefs = [];
192
+ function handleFieldNode(targetTypeName, fieldNode) {
193
+ var _a;
194
+ if ((_a = fieldNode.directives) === null || _a === void 0 ? void 0 : _a.length) {
195
+ const resolveToDef = fieldNode.directives.find(d => d.name.value === 'resolveTo');
196
+ if (resolveToDef != null) {
197
+ const resolveToArgumentMap = {};
198
+ for (const resolveToArg of resolveToDef.arguments) {
199
+ const resolveToArgName = resolveToArg.name.value;
200
+ resolveToArgumentMap[resolveToArgName] = parseLiteral(resolveToArg.value);
201
+ }
202
+ additionalResolversFromTypeDefs.push({
203
+ targetTypeName,
204
+ targetFieldName: fieldNode.name.value,
205
+ ...resolveToArgumentMap,
206
+ });
207
+ }
208
+ }
209
+ }
210
+ additionalTypeDefs === null || additionalTypeDefs === void 0 ? void 0 : additionalTypeDefs.forEach(typeDefs => {
211
+ visit(typeDefs, {
212
+ ObjectTypeDefinition(objectNode) {
213
+ var _a;
214
+ (_a = objectNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(objectNode.name.value, fieldNode));
215
+ },
216
+ ObjectTypeExtension(objectNode) {
217
+ var _a;
218
+ (_a = objectNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(objectNode.name.value, fieldNode));
219
+ },
220
+ InterfaceTypeDefinition(interfaceNode) {
221
+ var _a;
222
+ (_a = interfaceNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(interfaceNode.name.value, fieldNode));
223
+ },
224
+ InterfaceTypeExtension(interfaceNode) {
225
+ var _a;
226
+ (_a = interfaceNode.fields) === null || _a === void 0 ? void 0 : _a.forEach(fieldNode => handleFieldNode(interfaceNode.name.value, fieldNode));
227
+ },
228
+ });
229
+ });
230
+ return additionalResolversFromTypeDefs;
231
+ }
232
+
166
233
  const ENVELOP_CORE_PLUGINS_MAP = {
167
234
  maskedErrors: {
168
235
  moduleName: '@envelop/core',
@@ -477,6 +544,43 @@ async function processConfig(config, options) {
477
544
  codes.push(`const additionalResolvers = [] as any[]`);
478
545
  }
479
546
  }
547
+ if (additionalTypeDefs === null || additionalTypeDefs === void 0 ? void 0 : additionalTypeDefs.length) {
548
+ const additionalResolversConfigFromTypeDefs = getAdditionalResolversFromTypeDefs(additionalTypeDefs);
549
+ if (additionalResolversConfigFromTypeDefs === null || additionalResolversConfigFromTypeDefs === void 0 ? void 0 : additionalResolversConfigFromTypeDefs.length) {
550
+ const resolveToDirectiveDefinition = /* GraphQL */ `
551
+ scalar ResolveToSourceArgs
552
+ directive @resolveTo(
553
+ requiredSelectionSet: String
554
+ sourceName: String!
555
+ sourceTypeName: String!
556
+ sourceFieldName: String!
557
+ sourceSelectionSet: String
558
+ sourceArgs: ResolveToSourceArgs
559
+ keyField: String
560
+ keysArg: String
561
+ pubsubTopic: String
562
+ filterBy: String
563
+ additionalArgs: ResolveToSourceArgs
564
+ result: String
565
+ resultType: String
566
+ ) on FIELD_DEFINITION
567
+ `;
568
+ const resolvedAdditionalResolvers = await resolveAdditionalResolvers(dir, additionalResolversConfigFromTypeDefs, importFn, pubsub);
569
+ additionalTypeDefs.unshift(parse(resolveToDirectiveDefinition));
570
+ additionalResolvers.push(...resolvedAdditionalResolvers);
571
+ if (options.generateCode && resolvedAdditionalResolvers.length) {
572
+ importCodes.push(`import { resolveAdditionalResolvers } from '@graphql-mesh/utils';`);
573
+ codes.push(`additionalTypeDefs.unshift(parse(/* GraphQL */\`${resolveToDirectiveDefinition}\`))`);
574
+ codes.push(`const additionalResolversFromTypeDefs = await resolveAdditionalResolvers(
575
+ baseDir,
576
+ ${JSON.stringify(additionalResolversConfigFromTypeDefs)},
577
+ importFn,
578
+ pubsub
579
+ );`);
580
+ codes.push(`additionalResolvers.push(additionalResolversFromTypeDefs)`);
581
+ }
582
+ }
583
+ }
480
584
  if (config.additionalEnvelopPlugins) {
481
585
  codes.push(`const importedAdditionalEnvelopPlugins = await import(${JSON.stringify(path.join('..', config.additionalEnvelopPlugins).split('\\').join('/'))}).then(m => m.default || m);`);
482
586
  const importedAdditionalEnvelopPlugins = await importFn(path.isAbsolute(config.additionalEnvelopPlugins)
package/package.json CHANGED
@@ -1,26 +1,26 @@
1
1
  {
2
2
  "name": "@graphql-mesh/config",
3
- "version": "3.0.0-alpha-df3bd330e.0",
3
+ "version": "3.0.0",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
- "@graphql-mesh/runtime": "0.39.0-alpha-df3bd330e.0",
6
+ "@graphql-mesh/runtime": "^0.39.0",
7
7
  "graphql": "*"
8
8
  },
9
9
  "dependencies": {
10
10
  "@envelop/core": "2.3.3",
11
- "@graphql-mesh/cache-localforage": "0.6.14-alpha-df3bd330e.0",
11
+ "@graphql-mesh/cache-localforage": "0.6.14",
12
12
  "@graphql-mesh/cross-helpers": "0.1.6",
13
- "@graphql-mesh/merger-bare": "0.14.0-alpha-df3bd330e.0",
14
- "@graphql-mesh/merger-stitching": "0.15.58-alpha-df3bd330e.0",
15
- "@graphql-mesh/store": "0.8.17-alpha-df3bd330e.0",
16
- "@graphql-mesh/types": "0.76.0-alpha-df3bd330e.0",
17
- "@graphql-mesh/utils": "0.36.0-alpha-df3bd330e.0",
13
+ "@graphql-mesh/merger-bare": "0.14.0",
14
+ "@graphql-mesh/merger-stitching": "0.15.58",
15
+ "@graphql-mesh/store": "0.8.17",
16
+ "@graphql-mesh/types": "0.76.0",
17
+ "@graphql-mesh/utils": "0.36.0",
18
18
  "@graphql-tools/code-file-loader": "7.2.18",
19
19
  "@graphql-tools/graphql-file-loader": "7.3.15",
20
20
  "@graphql-tools/load": "7.5.14",
21
21
  "@graphql-tools/utils": "8.6.13",
22
22
  "camel-case": "4.1.2",
23
- "cross-undici-fetch": "0.4.7",
23
+ "cross-undici-fetch": "0.4.8",
24
24
  "fetchache": "0.1.2",
25
25
  "param-case": "3.0.4",
26
26
  "pascal-case": "3.1.2",