UNPKG

@theguild/federation-composition

Version:
89 lines (88 loc) 4.82 kB
import { visitSupergraphState } from '../composition/visitor.js'; import { DefaultValueUsesInaccessibleRule } from './rules/default-value-uses-inaccessible-rule.js'; import { DirectiveCompositionRule } from './rules/directive-composition-rule.js'; import { EnumValuesRule } from './rules/enum-values-rule.js'; import { ExtensionWithBaseRule } from './rules/extension-with-base.js'; import { ExternalArgumentMissingRule } from './rules/external-argument-missing-rule.js'; import { ExternalMissingOnBaseRule } from './rules/external-missing-on-base-rule.js'; import { ExternalTypeMismatchRule } from './rules/external-type-mismatch-rule.js'; import { FieldArgumentDefaultMismatchRule } from './rules/field-argument-default-mismatch-rule.js'; import { FieldArgumentsOfTheSameTypeRule } from './rules/field-arguments-of-the-same-type-rule.js'; import { FieldsOfTheSameTypeRule } from './rules/fields-of-the-same-type-rule.js'; import { InputFieldDefaultMismatchRule } from './rules/input-field-default-mismatch-rule.js'; import { InputObjectValuesRule } from './rules/input-object-values-rule.js'; import { InterfaceFieldNoImplementationRule } from './rules/interface-field-no-implementation-rule.js'; import { InterfaceKeyMissingImplementationTypeRule } from './rules/interface-key-missing-implementation-type.js'; import { InterfaceObjectUsageErrorRule } from './rules/interface-object-usage-error.js'; import { InterfaceSubtypeRule } from './rules/interface-subtype-rule.js'; import { InvalidFieldSharingRule } from './rules/invalid-field-sharing-rule.js'; import { LinkImportNameMismatchRule } from './rules/link-import-name-mismatch-rule.js'; import { NoInaccessibleOnImplementedInterfaceFieldsRule } from './rules/no-inaccessible-on-implemented-interface-fields-rule.js'; import { OnlyInaccessibleChildrenRule } from './rules/only-inaccessible-children-rule.js'; import { OverrideSourceHasOverrideRule } from './rules/override-source-has-override.js'; import { ReferencedInaccessibleRule } from './rules/referenced-inaccessible-rule.js'; import { RequiredArgumentMissingInSomeSubgraph } from './rules/required-argument-missing-in-some-subgraph-rule.js'; import { RequiredArgumentOrFieldIsNotInaccessibleRule } from './rules/required-argument-or-field-is-not-inaccessible-rule.js'; import { RequiredInputFieldMissingInSomeSubgraphRule } from './rules/required-input-field-missing-in-some-subgraph-rule.js'; import { RequiredQueryRule } from './rules/required-query-rule.js'; import { SatisfiabilityRule } from './rules/satisfiablity-rule.js'; import { SubgraphNameRule } from './rules/subgraph-name-rule.js'; import { TypesOfTheSameKindRule } from './rules/types-of-the-same-kind-rule.js'; import { createSupergraphValidationContext } from './validation-context.js'; export function validateSupergraph(subgraphStates, state, __internal) { const context = createSupergraphValidationContext(subgraphStates); for (const subgraphState of subgraphStates.values()) { state.addSubgraph(subgraphState); } const preSupergraphRules = [ RequiredQueryRule, TypesOfTheSameKindRule, LinkImportNameMismatchRule, ]; const rulesToSkip = __internal?.disableValidationRules ?? []; for (const rule of preSupergraphRules) { if (rulesToSkip.includes(rule.name)) { continue; } rule(context); } for (const subgraphState of subgraphStates.values()) { state.visitSubgraphState(subgraphState); } const postSupergraphRules = [ InterfaceFieldNoImplementationRule, ExtensionWithBaseRule, FieldsOfTheSameTypeRule, FieldArgumentsOfTheSameTypeRule, EnumValuesRule, OverrideSourceHasOverrideRule, ExternalMissingOnBaseRule, InputObjectValuesRule, RequiredArgumentMissingInSomeSubgraph, RequiredInputFieldMissingInSomeSubgraphRule, ExternalArgumentMissingRule, InputFieldDefaultMismatchRule, FieldArgumentDefaultMismatchRule, DefaultValueUsesInaccessibleRule, OnlyInaccessibleChildrenRule, ReferencedInaccessibleRule, DirectiveCompositionRule, InterfaceObjectUsageErrorRule, InterfaceKeyMissingImplementationTypeRule, ExternalTypeMismatchRule, InvalidFieldSharingRule, SatisfiabilityRule, SubgraphNameRule, RequiredArgumentOrFieldIsNotInaccessibleRule, InterfaceSubtypeRule, NoInaccessibleOnImplementedInterfaceFieldsRule, ]; const supergraph = state.getSupergraphState(); visitSupergraphState(supergraph, postSupergraphRules.map(rule => { if (rulesToSkip.includes(rule.name)) { return {}; } return rule(context, supergraph); })); return context.collectReportedErrors(); }