1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | exports.UniqueUnionTypes = void 0;
|
7 | const graphql_1 = require("graphql");
|
8 | const lodash_xorby_1 = __importDefault(require("lodash.xorby"));
|
9 | const utils_1 = require("../../utils");
|
10 | const uniqueTypeNamesWithFields_1 = require("./uniqueTypeNamesWithFields");
|
11 | function 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 | }
|
48 | exports.UniqueUnionTypes = UniqueUnionTypes;
|
49 |
|
\ | No newline at end of file |