@graphql-mesh/compose-cli
Version:
49 lines (48 loc) • 1.85 kB
JavaScript
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;
}