UNPKG

2.51 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6exports.UniqueUnionTypes = void 0;
7const graphql_1 = require("graphql");
8const lodash_xorby_1 = __importDefault(require("lodash.xorby"));
9const utils_1 = require("../../utils");
10const uniqueTypeNamesWithFields_1 = require("./uniqueTypeNamesWithFields");
11function UniqueUnionTypes(context) {
12 const knownTypes = Object.create(null);
13 const schema = context.getSchema();
14 return {
15 UnionTypeDefinition: validateUnionTypes,
16 };
17 function validateUnionTypes(node) {
18 const typeName = node.name.value;
19 const typeFromSchema = schema && schema.getType(typeName);
20 const typeNodeFromSchema = typeFromSchema &&
21 typeFromSchema.astNode;
22 const typeNodeFromDefs = knownTypes[typeName];
23 const duplicateTypeNode = typeNodeFromSchema || typeNodeFromDefs;
24 if (duplicateTypeNode) {
25 const unionDiff = (0, lodash_xorby_1.default)(node.types, duplicateTypeNode.types, 'name.value');
26 const diffLength = unionDiff.length;
27 if (diffLength > 0) {
28 context.reportError((0, utils_1.errorWithCode)('VALUE_TYPE_UNION_TYPES_MISMATCH', `${(0, utils_1.logServiceAndType)(duplicateTypeNode.serviceName, typeName)}The union \`${typeName}\` is defined in services \`${duplicateTypeNode.serviceName}\` and \`${node.serviceName}\`, however their types do not match. Union types with the same name must also consist of identical types. The type${diffLength > 1 ? 's' : ''} ${unionDiff.map(diffEntry => diffEntry.name.value).join(', ')} ${diffLength > 1 ? 'are' : 'is'} mismatched.`, [node, duplicateTypeNode]));
29 }
30 return false;
31 }
32 if (typeFromSchema) {
33 context.reportError(new graphql_1.GraphQLError((0, uniqueTypeNamesWithFields_1.existedTypeNameMessage)(typeName), node.name));
34 return;
35 }
36 if (knownTypes[typeName]) {
37 context.reportError(new graphql_1.GraphQLError((0, uniqueTypeNamesWithFields_1.duplicateTypeNameMessage)(typeName), [
38 knownTypes[typeName],
39 node.name,
40 ]));
41 }
42 else {
43 knownTypes[typeName] = node;
44 }
45 return false;
46 }
47}
48exports.UniqueUnionTypes = UniqueUnionTypes;
49//# sourceMappingURL=matchingUnions.js.map
\No newline at end of file