diff --git a/packages/services/api/src/modules/schema/resolvers.ts b/packages/services/api/src/modules/schema/resolvers.ts index aff55888a..70b13bb17 100644 --- a/packages/services/api/src/modules/schema/resolvers.ts +++ b/packages/services/api/src/modules/schema/resolvers.ts @@ -8,6 +8,7 @@ import { isInputObjectType, isScalarType, GraphQLNamedType, + GraphQLError, } from 'graphql'; import type { SchemaModule } from './__generated__/types'; import { SchemaManager } from './providers/schema-manager'; @@ -575,7 +576,26 @@ export const resolvers: SchemaModule.Resolvers = { return []; } - return injector.get(Inspector).diff(buildSchema(before), buildSchema(after)); + const previousSchema = buildSchema( + before, + error => + new GraphQLError( + `Failed to build the previous version: ${ + error instanceof GraphQLError ? error.message : error + }`, + ), + ); + const currentSchema = buildSchema( + after, + error => + new GraphQLError( + `Failed to build the selected version: ${ + error instanceof GraphQLError ? error.message : error + }`, + ), + ); + + return injector.get(Inspector).diff(previousSchema, currentSchema); }, diff([before, after]) { return { diff --git a/packages/services/api/src/shared/schema.ts b/packages/services/api/src/shared/schema.ts index 0fc4c2beb..530a6a2b1 100644 --- a/packages/services/api/src/shared/schema.ts +++ b/packages/services/api/src/shared/schema.ts @@ -24,13 +24,20 @@ export function hashSchema(schema: Schema): string { /** * Builds GraphQLSchema without validation of SDL */ -export function buildSchema(schema: SchemaObject): GraphQLSchema { - return lexicographicSortSchema( - buildASTSchema(schema.document, { - assumeValid: true, - assumeValidSDL: true, - }), - ); +export function buildSchema( + schema: SchemaObject, + transformError = (error: unknown) => error, +): GraphQLSchema { + try { + return lexicographicSortSchema( + buildASTSchema(schema.document, { + assumeValid: true, + assumeValidSDL: true, + }), + ); + } catch (error) { + throw transformError(error); + } } export function findSchema(schemas: readonly Schema[], expected: Schema): Schema | undefined { diff --git a/packages/web/app/pages/[orgId]/[projectId]/[targetId]/history.tsx b/packages/web/app/pages/[orgId]/[projectId]/[targetId]/history.tsx index 331c726a4..07edf14fd 100644 --- a/packages/web/app/pages/[orgId]/[projectId]/[targetId]/history.tsx +++ b/packages/web/app/pages/[orgId]/[projectId]/[targetId]/history.tsx @@ -95,6 +95,24 @@ const DiffView = ({ }, }); const comparison = compareQuery.data?.schemaCompareToPrevious; + const error = compareQuery.error; + + if (error) { + return ( +
+
+ +

Failed to compare schemas

+
+

+ Previous or current schema is most likely incomplete and was force published +

+
+          {error.graphQLErrors[0].message}
+        
+
+ ); + } if (!comparison) { return null; @@ -108,8 +126,11 @@ const DiffView = ({

Failed to build GraphQL Schema

- Schema is most likely incomplete and was force published + Previous or current schema is most likely incomplete and was force published

+
+          {comparison.message}
+        
); }