From 7d25eef2af945bb15cea636d6d3e7d290eed2951 Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 22:52:01 +0000 Subject: [PATCH] fix(pull): Handle SegmentsResult union in ImpactedFileSchema --- .../PullFileDiff/PullFileDiff.tsx | 8 ++- .../PullFileDiff/PullFileDiff.tsx | 8 ++- src/services/pull/fragments.ts | 53 +++++++++++++------ .../utils/transformImpactedPullFileToDiff.ts | 5 +- 4 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/pages/PullRequestPage/PullCoverage/routes/FilesChangedTab/FilesChanged/PullFileDiff/PullFileDiff.tsx b/src/pages/PullRequestPage/PullCoverage/routes/FilesChangedTab/FilesChanged/PullFileDiff/PullFileDiff.tsx index 03b263edbe..32afa46c9b 100644 --- a/src/pages/PullRequestPage/PullCoverage/routes/FilesChangedTab/FilesChanged/PullFileDiff/PullFileDiff.tsx +++ b/src/pages/PullRequestPage/PullCoverage/routes/FilesChangedTab/FilesChanged/PullFileDiff/PullFileDiff.tsx @@ -2,10 +2,8 @@ import { Fragment, useMemo } from 'react' import { useLocation, useParams } from 'react-router-dom' import { useNavLinks } from 'services/navigation/useNavLinks' -import { - type PullImpactedFile, - useSingularImpactedFileComparison, -} from 'services/pull/useSingularImpactedFileComparison' +import { type Segment } from 'services/pull/fragments' +import { useSingularImpactedFileComparison } from 'services/pull/useSingularImpactedFileComparison' import { useRepoOverview } from 'services/repo' import A from 'ui/A' import CodeRendererInfoRow from 'ui/CodeRenderer/CodeRendererInfoRow' @@ -14,7 +12,7 @@ import { CoverageValue } from 'ui/VirtualRenderers/types' import { LineData } from 'ui/VirtualRenderers/VirtualDiffRenderer' function transformSegmentsToLineData( - segments: PullImpactedFile['segments']['results'] | undefined + segments: Segment[] | undefined ) { if (!segments) { return [] diff --git a/src/pages/PullRequestPage/PullCoverage/routes/IndirectChangesTab/PullFileDiff/PullFileDiff.tsx b/src/pages/PullRequestPage/PullCoverage/routes/IndirectChangesTab/PullFileDiff/PullFileDiff.tsx index c66cfa282c..0f6a2255b8 100644 --- a/src/pages/PullRequestPage/PullCoverage/routes/IndirectChangesTab/PullFileDiff/PullFileDiff.tsx +++ b/src/pages/PullRequestPage/PullCoverage/routes/IndirectChangesTab/PullFileDiff/PullFileDiff.tsx @@ -2,10 +2,8 @@ import { Fragment, useMemo } from 'react' import { useLocation, useParams } from 'react-router-dom' import { useNavLinks } from 'services/navigation/useNavLinks' -import { - PullImpactedFile, - useSingularImpactedFileComparison, -} from 'services/pull/useSingularImpactedFileComparison' +import { type Segment } from 'services/pull/fragments' +import { useSingularImpactedFileComparison } from 'services/pull/useSingularImpactedFileComparison' import { useRepoOverview } from 'services/repo' import A from 'ui/A' import CodeRendererInfoRow from 'ui/CodeRenderer/CodeRendererInfoRow' @@ -16,7 +14,7 @@ import { } from 'ui/VirtualRenderers/VirtualDiffRenderer' function transformSegmentsToLineData( - segments: PullImpactedFile['segments']['results'] | undefined + segments: Segment[] | undefined ) { if (!segments) { return [] diff --git a/src/services/pull/fragments.ts b/src/services/pull/fragments.ts index 6178319898..2f7b0e7705 100644 --- a/src/services/pull/fragments.ts +++ b/src/services/pull/fragments.ts @@ -228,6 +228,12 @@ fragment FileComparisonWithBase on Pull { } } } + ... on UnknownPath { + message + } + ... on ProviderError { + message + } } } } @@ -254,6 +260,22 @@ fragment FileComparisonWithBase on Pull { const CoverageLineSchema = z.enum(['H', 'M', 'P']) +export const SegmentSchema = z.object({ + header: z.string(), + hasUnintendedChanges: z.boolean(), + lines: z.array( + z.object({ + baseNumber: z.string().nullable(), + headNumber: z.string().nullable(), + baseCoverage: CoverageLineSchema.nullable(), + headCoverage: CoverageLineSchema.nullable(), + content: z.string().nullable(), + }) + ), +}) + +export type Segment = z.infer + export const ImpactedFileSchema = z.object({ headName: z.string().nullable(), hashedPath: z.string(), @@ -276,23 +298,20 @@ export const ImpactedFileSchema = z.object({ percentCovered: z.number().nullable(), }) .nullable(), - segments: z.object({ - results: z.array( - z.object({ - header: z.string(), - hasUnintendedChanges: z.boolean(), - lines: z.array( - z.object({ - baseNumber: z.string().nullable(), - headNumber: z.string().nullable(), - baseCoverage: CoverageLineSchema.nullable(), - headCoverage: CoverageLineSchema.nullable(), - content: z.string().nullable(), - }) - ), - }) - ), - }), + segments: z.discriminatedUnion('__typename', [ + z.object({ + __typename: z.literal('SegmentComparisons'), + results: z.array(SegmentSchema), + }), + z.object({ + __typename: z.literal('UnknownPath'), + message: z.string().nullable(), + }), + z.object({ + __typename: z.literal('ProviderError'), + message: z.string().nullable(), + }), + ]), }) export const ComparisonSchema = z.object({ diff --git a/src/services/pull/utils/transformImpactedPullFileToDiff.ts b/src/services/pull/utils/transformImpactedPullFileToDiff.ts index b2237a72be..1c4f1ab65a 100644 --- a/src/services/pull/utils/transformImpactedPullFileToDiff.ts +++ b/src/services/pull/utils/transformImpactedPullFileToDiff.ts @@ -35,7 +35,10 @@ export function transformImpactedPullFileToDiff( return { fileLabel, headName: impactedFile?.headName, - segments: impactedFile?.segments?.results, + segments: + impactedFile?.segments?.__typename === 'SegmentComparisons' + ? impactedFile.segments.results + : [], ...(!!hashedPath && { hashedPath }), } }