@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.
- package/getAdditionalResolversFromTypeDefs.d.ts +2 -0
- package/index.js +105 -1
- package/index.mjs +106 -2
- package/package.json +1 -1
|
@@ -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,
|
|
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)
|