@theguild/federation-composition
Version:
Open Source Composition library for Apollo Federation
34 lines (33 loc) • 1.67 kB
JavaScript
import { Logger, LoggerContext } from '../../../../utils/logger.js';
import { SUPERGRAPH_ID } from './constants.js';
import { Graph } from './graph.js';
import { MoveValidator } from './move-validator.js';
import { SelectionResolver } from './selection.js';
import { Walker } from './walker.js';
export class Supergraph {
supergraph;
mergedGraph;
selectionResolver;
moveRequirementChecker;
logger = new Logger('Supergraph', new LoggerContext());
constructor(supergraphState) {
this.selectionResolver = new SelectionResolver(supergraphState);
this.supergraph = new Graph(this.logger, SUPERGRAPH_ID, 'supergraph', supergraphState, this.selectionResolver, true);
this.mergedGraph = new Graph(this.logger, SUPERGRAPH_ID, 'merged', supergraphState, this.selectionResolver);
for (const [id, subgraphState] of supergraphState.subgraphs) {
this.mergedGraph.addSubgraph(new Graph(this.logger, id, subgraphState.graph.name, supergraphState, this.selectionResolver, false)
.addFromRoots()
.addFromEntities()
.addUnreachableTypes());
}
this.mergedGraph.joinSubgraphs();
this.supergraph.addFromRoots().addInterfaceObjectFields();
this.moveRequirementChecker = new MoveValidator(this.logger, this.mergedGraph);
}
validate() {
return new Walker(this.logger, this.moveRequirementChecker, this.supergraph, this.mergedGraph).walk('dfs');
}
validateOperation(operation, steps) {
return new Walker(this.logger, this.moveRequirementChecker, this.supergraph, this.mergedGraph).walkTrail(operation, steps);
}
}