Change merge system to avoid ref bugs (#6791)
This commit is contained in:
@@ -200,6 +200,22 @@ class ParseGraphQLSchema {
|
|||||||
|
|
||||||
if (typeof this.graphQLCustomTypeDefs.getTypeMap === 'function') {
|
if (typeof this.graphQLCustomTypeDefs.getTypeMap === 'function') {
|
||||||
const customGraphQLSchemaTypeMap = this.graphQLCustomTypeDefs.getTypeMap();
|
const customGraphQLSchemaTypeMap = this.graphQLCustomTypeDefs.getTypeMap();
|
||||||
|
const findAndReplaceLastType = (parent, key) => {
|
||||||
|
if (parent[key].name) {
|
||||||
|
if (
|
||||||
|
this.graphQLAutoSchema.getType(parent[key].name) &&
|
||||||
|
this.graphQLAutoSchema.getType(parent[key].name) !== parent[key]
|
||||||
|
) {
|
||||||
|
// To avoid unresolved field on overloaded schema
|
||||||
|
// replace the final type with the auto schema one
|
||||||
|
parent[key] = this.graphQLAutoSchema.getType(parent[key].name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (parent[key].ofType) {
|
||||||
|
findAndReplaceLastType(parent[key], 'ofType');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
Object.values(customGraphQLSchemaTypeMap).forEach(
|
Object.values(customGraphQLSchemaTypeMap).forEach(
|
||||||
(customGraphQLSchemaType) => {
|
(customGraphQLSchemaType) => {
|
||||||
if (
|
if (
|
||||||
@@ -212,30 +228,30 @@ class ParseGraphQLSchema {
|
|||||||
const autoGraphQLSchemaType = this.graphQLAutoSchema.getType(
|
const autoGraphQLSchemaType = this.graphQLAutoSchema.getType(
|
||||||
customGraphQLSchemaType.name
|
customGraphQLSchemaType.name
|
||||||
);
|
);
|
||||||
|
if (!autoGraphQLSchemaType) {
|
||||||
|
this.graphQLAutoSchema._typeMap[
|
||||||
|
customGraphQLSchemaType.name
|
||||||
|
] = customGraphQLSchemaType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
Object.values(customGraphQLSchemaTypeMap).forEach(
|
||||||
|
(customGraphQLSchemaType) => {
|
||||||
|
if (
|
||||||
|
!customGraphQLSchemaType ||
|
||||||
|
!customGraphQLSchemaType.name ||
|
||||||
|
customGraphQLSchemaType.name.startsWith('__')
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const autoGraphQLSchemaType = this.graphQLAutoSchema.getType(
|
||||||
|
customGraphQLSchemaType.name
|
||||||
|
);
|
||||||
|
|
||||||
if (
|
if (
|
||||||
autoGraphQLSchemaType &&
|
autoGraphQLSchemaType &&
|
||||||
typeof customGraphQLSchemaType.getFields === 'function'
|
typeof customGraphQLSchemaType.getFields === 'function'
|
||||||
) {
|
) {
|
||||||
const findAndReplaceLastType = (parent, key) => {
|
|
||||||
if (parent[key].name) {
|
|
||||||
if (
|
|
||||||
this.graphQLAutoSchema.getType(parent[key].name) &&
|
|
||||||
this.graphQLAutoSchema.getType(parent[key].name) !==
|
|
||||||
parent[key]
|
|
||||||
) {
|
|
||||||
// To avoid unresolved field on overloaded schema
|
|
||||||
// replace the final type with the auto schema one
|
|
||||||
parent[key] = this.graphQLAutoSchema.getType(
|
|
||||||
parent[key].name
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (parent[key].ofType) {
|
|
||||||
findAndReplaceLastType(parent[key], 'ofType');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Object.values(customGraphQLSchemaType.getFields()).forEach(
|
Object.values(customGraphQLSchemaType.getFields()).forEach(
|
||||||
(field) => {
|
(field) => {
|
||||||
findAndReplaceLastType(field, 'type');
|
findAndReplaceLastType(field, 'type');
|
||||||
@@ -245,10 +261,6 @@ class ParseGraphQLSchema {
|
|||||||
...autoGraphQLSchemaType.getFields(),
|
...autoGraphQLSchemaType.getFields(),
|
||||||
...customGraphQLSchemaType.getFields(),
|
...customGraphQLSchemaType.getFields(),
|
||||||
};
|
};
|
||||||
} else {
|
|
||||||
this.graphQLAutoSchema._typeMap[
|
|
||||||
customGraphQLSchemaType.name
|
|
||||||
] = customGraphQLSchemaType;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user