@apollo/federation
Version:
Apollo Federation Utilities
171 lines • 6.93 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.stripCommonPrimitives = exports.replaceExtendedDefinitionsWithExtensions = exports.defaultRootOperationTypes = exports.normalizeTypeDefs = void 0;
const graphql_1 = require("graphql");
const utils_1 = require("./utils");
const directives_1 = require("@apollo/subgraph/dist/directives");
function normalizeTypeDefs(typeDefs) {
return stripCommonPrimitives(defaultRootOperationTypes(replaceExtendedDefinitionsWithExtensions(typeDefs)));
}
exports.normalizeTypeDefs = normalizeTypeDefs;
function defaultRootOperationTypes(typeDefs) {
const defaultRootOperationNames = Object.values(utils_1.defaultRootOperationNameLookup);
let rootOperationTypeMap = Object.create(null);
let hasSchemaDefinitionOrExtension = false;
(0, graphql_1.visit)(typeDefs, {
OperationTypeDefinition(node) {
hasSchemaDefinitionOrExtension = true;
rootOperationTypeMap[node.type.name.value] =
utils_1.defaultRootOperationNameLookup[node.operation];
},
});
if (!hasSchemaDefinitionOrExtension) {
rootOperationTypeMap = {
Query: 'Query',
Mutation: 'Mutation',
Subscription: 'Subscription',
};
}
let schemaWithoutConflictingDefaultDefinitions;
if (!hasSchemaDefinitionOrExtension) {
schemaWithoutConflictingDefaultDefinitions = typeDefs;
}
else {
schemaWithoutConflictingDefaultDefinitions = (0, graphql_1.visit)(typeDefs, {
ObjectTypeDefinition(node) {
if (defaultRootOperationNames.includes(node.name.value) &&
!rootOperationTypeMap[node.name.value]) {
return null;
}
return;
},
ObjectTypeExtension(node) {
if (defaultRootOperationNames.includes(node.name.value) &&
!rootOperationTypeMap[node.name.value]) {
return null;
}
return;
},
FieldDefinition(node) {
if (node.type.kind === graphql_1.Kind.NAMED_TYPE &&
defaultRootOperationNames.includes(node.type.name.value)) {
return null;
}
if (node.type.kind === graphql_1.Kind.NON_NULL_TYPE &&
node.type.type.kind === graphql_1.Kind.NAMED_TYPE &&
defaultRootOperationNames.includes(node.type.type.name.value)) {
return null;
}
return;
},
});
}
const schemaWithDefaultRootTypes = (0, graphql_1.visit)(schemaWithoutConflictingDefaultDefinitions, {
SchemaDefinition() {
return null;
},
SchemaExtension() {
return null;
},
ObjectTypeDefinition(node) {
if (node.name.value in rootOperationTypeMap ||
defaultRootOperationNames.includes(node.name.value)) {
return {
...node,
name: {
...node.name,
value: rootOperationTypeMap[node.name.value] || node.name.value,
},
kind: graphql_1.Kind.OBJECT_TYPE_EXTENSION,
};
}
return;
},
ObjectTypeExtension(node) {
if (node.name.value in rootOperationTypeMap ||
defaultRootOperationNames.includes(node.name.value)) {
return {
...node,
name: {
...node.name,
value: rootOperationTypeMap[node.name.value] || node.name.value,
},
};
}
return;
},
NamedType(node) {
if (node.name.value in rootOperationTypeMap) {
return {
...node,
name: {
...node.name,
value: rootOperationTypeMap[node.name.value],
},
};
}
return;
},
});
return schemaWithDefaultRootTypes;
}
exports.defaultRootOperationTypes = defaultRootOperationTypes;
function replaceExtendedDefinitionsWithExtensions(typeDefs) {
const typeDefsWithExtendedTypesReplaced = (0, graphql_1.visit)(typeDefs, {
ObjectTypeDefinition: visitor,
InterfaceTypeDefinition: visitor,
});
function visitor(node) {
const isExtensionDefinition = (0, utils_1.findDirectivesOnNode)(node, 'extends').length > 0;
if (!isExtensionDefinition) {
return node;
}
const filteredDirectives = node.directives &&
node.directives.filter(directive => directive.name.value !== 'extends');
return {
...node,
...(filteredDirectives && { directives: filteredDirectives }),
kind: utils_1.defKindToExtKind[node.kind],
};
}
return typeDefsWithExtendedTypesReplaced;
}
exports.replaceExtendedDefinitionsWithExtensions = replaceExtendedDefinitionsWithExtensions;
function stripCommonPrimitives(document) {
const typeDefinitionVisitor = (node) => {
var _a;
if (node.name.value === utils_1.defaultRootOperationNameLookup.query) {
const filteredFieldDefinitions = (_a = node.fields) === null || _a === void 0 ? void 0 : _a.filter((fieldDefinition) => !utils_1.reservedRootFields.includes(fieldDefinition.name.value));
if (!filteredFieldDefinitions || filteredFieldDefinitions.length === 0) {
return null;
}
return {
...node,
fields: filteredFieldDefinitions,
};
}
const isFederationType = node.name.value === '_Service';
return isFederationType ? null : node;
};
return (0, graphql_1.visit)(document, {
DirectiveDefinition(node) {
const isCommonDirective = [
...directives_1.knownSubgraphDirectives,
...graphql_1.specifiedDirectives,
].some((directive) => directive.name === node.name.value);
return isCommonDirective ? null : node;
},
ScalarTypeDefinition(node) {
const isFederationScalar = ['_Any', '_FieldSet'].includes(node.name.value);
return isFederationScalar ? null : node;
},
UnionTypeDefinition(node) {
const isFederationUnion = node.name.value === "_Entity";
return isFederationUnion ? null : node;
},
ObjectTypeDefinition: typeDefinitionVisitor,
ObjectTypeExtension: typeDefinitionVisitor,
});
}
exports.stripCommonPrimitives = stripCommonPrimitives;
//# sourceMappingURL=normalize.js.map
;