diff --git a/packages/cli/src/lib/replay-search.ts b/packages/cli/src/lib/replay-search.ts index 53b01305c..29272c6d2 100644 --- a/packages/cli/src/lib/replay-search.ts +++ b/packages/cli/src/lib/replay-search.ts @@ -129,6 +129,7 @@ const REPLAY_FIELD_RESOLVERS: Record = { url: (replay) => firstValue(replay.urls), urls: (replay) => replay.urls, user: (replay) => getReplayUserLabel(replay), + "user.display": (replay) => getReplayUserLabel(replay), "user.email": (replay) => replay.user?.email, "user.geo.city": (replay) => replay.user?.geo?.city, "user.geo.country_code": (replay) => replay.user?.geo?.country_code, @@ -176,6 +177,7 @@ function replayRequestRoot(field: string): string { case "trace": case "trace_id": return "trace_ids"; + case "user.display": case "user.email": case "user.geo.city": case "user.geo.country_code": diff --git a/packages/cli/test/lib/replay-search.test.ts b/packages/cli/test/lib/replay-search.test.ts index 743f39515..1ebb6026a 100644 --- a/packages/cli/test/lib/replay-search.test.ts +++ b/packages/cli/test/lib/replay-search.test.ts @@ -1,5 +1,6 @@ import { describe, expect, test } from "vitest"; import { + getReplayFieldValue, getReplayRequestFields, isSupportedReplayField, } from "../../src/lib/replay-search.js"; @@ -37,4 +38,43 @@ describe("isSupportedReplayField", () => { test("does not expose replay detail-only fields in replay explore", () => { expect(isSupportedReplayField("replay_type")).toBe(false); }); + + test("recognizes user.display as a supported replay field", () => { + expect(isSupportedReplayField("user.display")).toBe(true); + }); +}); + +describe("getReplayRequestFields", () => { + test("maps user.display to the user API root field", () => { + expect(getReplayRequestFields(["user.display"])).toEqual(["id", "user"]); + }); +}); + +describe("getReplayFieldValue", () => { + test("resolves user.display to the best available user label", () => { + const replay = { + id: "abc123", + user: { + display_name: "Jane Doe", + username: "jane", + email: "jane@example.com", + id: "1", + ip: "1.2.3.4", + }, + } as Parameters[0]; + expect(getReplayFieldValue(replay, "user.display")).toBe("Jane Doe"); + }); + + test("resolves user.display to username when display_name is absent", () => { + const replay = { + id: "abc123", + user: { + username: "jane", + email: "jane@example.com", + id: "1", + ip: "1.2.3.4", + }, + } as Parameters[0]; + expect(getReplayFieldValue(replay, "user.display")).toBe("jane"); + }); });