UNPKG

@graphql-mesh/compose-cli

Version:
49 lines (48 loc) 1.85 kB
import { composeSubgraphs } from '@graphql-mesh/fusion-composition'; import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'; import { loadTypedefs } from '@graphql-tools/load'; import { fetch as defaultFetch } from '@whatwg-node/fetch'; export async function getComposedSchemaFromConfig(config, logger) { const ctx = { fetch: config.fetch || defaultFetch, cwd: config.cwd || globalThis.process?.cwd?.(), logger, }; const subgraphConfigsForComposition = await Promise.all(config.subgraphs.map(async (subgraphCLIConfig) => { const { name: subgraphName, schema$ } = subgraphCLIConfig.sourceHandler(ctx); const log = logger.child(`"${subgraphName}" subgraph`); log.info(`Loading`); let subgraphSchema; try { subgraphSchema = await schema$; } catch (e) { throw new Error(`Failed to load subgraph ${subgraphName} - ${e.stack}`); } return { name: subgraphName, schema: subgraphSchema, transforms: subgraphCLIConfig.transforms, }; })); let additionalTypeDefs; if (config.additionalTypeDefs != null) { const result = await loadTypedefs(config.additionalTypeDefs, { noLocation: true, assumeValid: true, assumeValidSDL: true, loaders: [new GraphQLFileLoader()], }); additionalTypeDefs = result.map(r => r.document || r.rawSDL); } let composedSchema = composeSubgraphs(subgraphConfigsForComposition, { typeDefs: additionalTypeDefs, }); if (config.transforms?.length) { logger.info('Applying transforms'); for (const transform of config.transforms) { composedSchema = transform(composedSchema); } } return composedSchema; }