import { makeExecutableSchema } from '@graphql-tools/schema'; import { introspectSchema, RenameTypes } from '@graphql-tools/wrap'; import { stitchSchemas } from '@graphql-tools/stitch'; import { GraphQLUpload } from 'graphql-upload-minimal'; //import GraphQLUpload from 'graphql-upload/GraphQLUpload.mjs'; import makeRemoteExecutor from './make-remote-executor'; import { Config } from '../app'; export default async function gatewaySchema(services: Config) { const localSchema = makeExecutableSchema({ typeDefs: /* GraphQL */ ` scalar Upload `, resolvers: { Upload: GraphQLUpload, }, }); const schemaList = []; const list = services.list; for await(const service of list) { try { const executor = await makeRemoteExecutor(service.url); const subschema = { schema: await introspectSchema(executor), executor: executor, transforms: [ new RenameTypes((name) => { if (name === 'Upload') { return name; } return `${service.prefix}${name}`; }), ], }; schemaList.push(subschema); } catch (err) { service._version = null; process.env.TEST !== 'true' && console.log('Could not connect to service: ' + service.name, err); } } return stitchSchemas({ subschemas: [ localSchema, schemaList ] }); }