Skip to content

Commit 23cec1a

Browse files
betegonclaude
andcommitted
refactor: extract toNumericId helper to DRY up project ID conversion
The pattern `Number(x.id) || undefined` appeared 7 times and `cached.projectId ? Number(cached.projectId) : undefined` appeared 3 times across resolve-target.ts and list.ts. Extract a shared `toNumericId` helper to replace all 10 occurrences. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 30805de commit 23cec1a

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

src/commands/issue/list.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import {
5858
fetchProjectId,
5959
type ResolvedTarget,
6060
resolveAllTargets,
61+
toNumericId,
6162
} from "../../lib/resolve-target.js";
6263
import { getApiBaseUrl } from "../../lib/sentry-client.js";
6364
import type {
@@ -309,7 +310,7 @@ async function resolveTargetsFromParsedArg(
309310
const targets: ResolvedTarget[] = projects.map((p) => ({
310311
org: parsed.org,
311312
project: p.slug,
312-
projectId: Number(p.id) || undefined,
313+
projectId: toNumericId(p.id),
313314
orgDisplay: parsed.org,
314315
projectDisplay: p.name,
315316
}));
@@ -346,7 +347,7 @@ async function resolveTargetsFromParsedArg(
346347
const targets: ResolvedTarget[] = matches.map((m) => ({
347348
org: m.orgSlug,
348349
project: m.slug,
349-
projectId: Number(m.id) || undefined,
350+
projectId: toNumericId(m.id),
350351
orgDisplay: m.orgSlug,
351352
projectDisplay: m.name,
352353
}));

src/lib/resolve-target.ts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ import {
4747
import { warning } from "./formatters/colors.js";
4848
import { isAllDigits } from "./utils.js";
4949

50+
/** Convert a string or numeric ID to a number, or `undefined` if falsy/NaN. */
51+
export function toNumericId(
52+
id: string | number | undefined,
53+
): number | undefined {
54+
if (id == null) return undefined;
55+
return Number(id) || undefined;
56+
}
57+
5058
/**
5159
* Resolved organization and project target for API calls.
5260
*/
@@ -138,7 +146,7 @@ export async function resolveFromDsn(
138146
return {
139147
org: cached.orgSlug,
140148
project: cached.projectSlug,
141-
projectId: cached.projectId ? Number(cached.projectId) : undefined,
149+
projectId: toNumericId(cached.projectId),
142150
orgDisplay: cached.orgName,
143151
projectDisplay: cached.projectName,
144152
detectedFrom,
@@ -147,7 +155,6 @@ export async function resolveFromDsn(
147155

148156
// Cache miss — fetch project details and cache them
149157
const projectInfo = await getProject(dsn.orgId, dsn.projectId);
150-
const numericProjectId = Number(projectInfo.id) || undefined;
151158

152159
if (projectInfo.organization) {
153160
await setCachedProject(dsn.orgId, dsn.projectId, {
@@ -161,7 +168,7 @@ export async function resolveFromDsn(
161168
return {
162169
org: projectInfo.organization.slug,
163170
project: projectInfo.slug,
164-
projectId: numericProjectId,
171+
projectId: toNumericId(projectInfo.id),
165172
orgDisplay: projectInfo.organization.name,
166173
projectDisplay: projectInfo.name,
167174
detectedFrom,
@@ -172,7 +179,7 @@ export async function resolveFromDsn(
172179
return {
173180
org: dsn.orgId,
174181
project: dsn.projectId,
175-
projectId: numericProjectId,
182+
projectId: toNumericId(projectInfo.id),
176183
orgDisplay: dsn.orgId,
177184
projectDisplay: projectInfo.name,
178185
detectedFrom,
@@ -231,7 +238,7 @@ async function resolveDsnByPublicKey(
231238
return {
232239
org: cached.orgSlug,
233240
project: cached.projectSlug,
234-
projectId: cached.projectId ? Number(cached.projectId) : undefined,
241+
projectId: toNumericId(cached.projectId),
235242
orgDisplay: cached.orgName,
236243
projectDisplay: cached.projectName,
237244
detectedFrom,
@@ -259,7 +266,7 @@ async function resolveDsnByPublicKey(
259266
return {
260267
org: projectInfo.organization.slug,
261268
project: projectInfo.slug,
262-
projectId: Number(projectInfo.id) || undefined,
269+
projectId: toNumericId(projectInfo.id),
263270
orgDisplay: projectInfo.organization.name,
264271
projectDisplay: projectInfo.name,
265272
detectedFrom,
@@ -305,7 +312,7 @@ async function resolveDsnToTarget(
305312
return {
306313
org: cached.orgSlug,
307314
project: cached.projectSlug,
308-
projectId: cached.projectId ? Number(cached.projectId) : undefined,
315+
projectId: toNumericId(cached.projectId),
309316
orgDisplay: cached.orgName,
310317
projectDisplay: cached.projectName,
311318
detectedFrom,
@@ -316,7 +323,6 @@ async function resolveDsnToTarget(
316323
// Cache miss — fetch project details and cache them
317324
try {
318325
const projectInfo = await getProject(dsn.orgId, dsn.projectId);
319-
const numericProjectId = Number(projectInfo.id) || undefined;
320326

321327
if (projectInfo.organization) {
322328
await setCachedProject(dsn.orgId, dsn.projectId, {
@@ -330,7 +336,7 @@ async function resolveDsnToTarget(
330336
return {
331337
org: projectInfo.organization.slug,
332338
project: projectInfo.slug,
333-
projectId: numericProjectId,
339+
projectId: toNumericId(projectInfo.id),
334340
orgDisplay: projectInfo.organization.name,
335341
projectDisplay: projectInfo.name,
336342
detectedFrom,
@@ -342,7 +348,7 @@ async function resolveDsnToTarget(
342348
return {
343349
org: dsn.orgId,
344350
project: dsn.projectId,
345-
projectId: numericProjectId,
351+
projectId: toNumericId(projectInfo.id),
346352
orgDisplay: dsn.orgId,
347353
projectDisplay: projectInfo.name,
348354
detectedFrom,
@@ -472,7 +478,7 @@ async function inferFromDirectoryName(cwd: string): Promise<ResolvedTargets> {
472478
const targets: ResolvedTarget[] = matches.map((m) => ({
473479
org: m.orgSlug,
474480
project: m.slug,
475-
projectId: Number(m.id) || undefined,
481+
projectId: toNumericId(m.id),
476482
orgDisplay: m.organization?.name ?? m.orgSlug,
477483
projectDisplay: m.name,
478484
detectedFrom,
@@ -549,7 +555,7 @@ export async function fetchProjectId(
549555
): Promise<number | undefined> {
550556
try {
551557
const projectInfo = await getProject(org, project);
552-
return Number(projectInfo.id) || undefined;
558+
return toNumericId(projectInfo.id);
553559
} catch (error) {
554560
if (error instanceof AuthError) {
555561
throw error;

0 commit comments

Comments
 (0)