@graphql-mesh/compose-cli
Version:
53 lines (52 loc) • 2.36 kB
JavaScript
import { composeSubgraphs } from '@graphql-mesh/fusion-composition';
import { DefaultLogger } from '@graphql-mesh/utils';
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(meshComposeCLIConfig, spinnies) {
const ctx = {
fetch: meshComposeCLIConfig.fetch || defaultFetch,
cwd: meshComposeCLIConfig.cwd || globalThis.process?.cwd?.(),
logger: new DefaultLogger(),
};
const subgraphConfigsForComposition = await Promise.all(meshComposeCLIConfig.subgraphs.map(async (subgraphCLIConfig) => {
const { name: subgraphName, schema$ } = subgraphCLIConfig.sourceHandler(ctx);
spinnies?.add(subgraphName, { text: `Loading subgraph ${subgraphName}` });
let subgraphSchema;
try {
subgraphSchema = await schema$;
}
catch (e) {
throw new Error(`Failed to load subgraph ${subgraphName} - ${e.stack}`);
}
spinnies?.succeed(subgraphName, { text: `Loaded subgraph ${subgraphName}` });
return {
name: subgraphName,
schema: subgraphSchema,
transforms: subgraphCLIConfig.transforms,
};
}));
spinnies?.add('composition', { text: `Composing fusiongraph` });
let additionalTypeDefs;
if (meshComposeCLIConfig.additionalTypeDefs != null) {
const result = await loadTypedefs(meshComposeCLIConfig.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 (meshComposeCLIConfig.transforms?.length) {
spinnies?.add('transforms', { text: `Applying transforms` });
for (const transform of meshComposeCLIConfig.transforms) {
composedSchema = transform(composedSchema);
}
spinnies?.succeed('transforms', { text: `Applied transforms` });
}
spinnies?.succeed('composition', { text: `Composed fusiongraph` });
return composedSchema;
}