Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions packages/cli/src/lib/replay-search.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ const REPLAY_FIELD_RESOLVERS: Record<string, ReplayFieldResolver> = {
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,
Expand Down Expand Up @@ -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":
Expand Down
40 changes: 40 additions & 0 deletions packages/cli/test/lib/replay-search.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { describe, expect, test } from "vitest";
import {
getReplayFieldValue,
getReplayRequestFields,
isSupportedReplayField,
} from "../../src/lib/replay-search.js";
Expand Down Expand Up @@ -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<typeof getReplayFieldValue>[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<typeof getReplayFieldValue>[0];
expect(getReplayFieldValue(replay, "user.display")).toBe("jane");
});
});
Loading