diff --git a/packages/core/src/__tests__/contexts.test.ts b/packages/core/src/__tests__/contexts.test.ts new file mode 100644 index 0000000000..6ba8d490aa --- /dev/null +++ b/packages/core/src/__tests__/contexts.test.ts @@ -0,0 +1,16 @@ +import { MeasureMetricsContext } from '../measurements' + +describe('context tests', () => { + it('check withLog proper catch', async () => { + const ctx = new MeasureMetricsContext('test', {}) + + try { + await ctx.withLog('failed op', {}, async () => { + throw new Error('failed') + }) + expect(true).toBe(false) + } catch (err: any) { + expect(err.message).toBe('failed') + } + }) +}) diff --git a/packages/core/src/measurements/context.ts b/packages/core/src/measurements/context.ts index 8883d8af87..8d5e7e4d53 100644 --- a/packages/core/src/measurements/context.ts +++ b/packages/core/src/measurements/context.ts @@ -168,7 +168,9 @@ export class MeasureMetricsContext implements MeasureContext { ): Promise { const st = platformNow() const r = this.with(name, params, op, fullParams) - void r.finally(() => { + r.catch(() => { + // Ignore logging errors to prevent unhandled rejections + }).finally(() => { this.logger.logOperation(name, platformNowDiff(st), { ...params, ...fullParams }) }) return r diff --git a/packages/rank/src/__tests__/utils.test.ts b/packages/rank/src/__tests__/utils.test.ts index c48137fe2a..d077ea93e7 100644 --- a/packages/rank/src/__tests__/utils.test.ts +++ b/packages/rank/src/__tests__/utils.test.ts @@ -20,6 +20,10 @@ describe('makeRank', () => { expect(makeRank(undefined, undefined)).toBe('0|hzzzzz:') }) + it('check rank on empty string', () => { + expect(makeRank(undefined, '')).toBe('0|hzzzzz:') + }) + it.each([ ['0|hzzzzz:', '0|i00007:'], ['0|i00007:', '0|i0000f:'], diff --git a/packages/rank/src/utils.ts b/packages/rank/src/utils.ts index b6654052ad..4f43e8925b 100644 --- a/packages/rank/src/utils.ts +++ b/packages/rank/src/utils.ts @@ -35,6 +35,12 @@ export function genRanks (count: number): Rank[] { /** @public */ export function makeRank (prev: Rank | undefined, next: Rank | undefined): Rank { try { + if (prev != null && prev.trim() === '') { + prev = undefined + } + if (next != null && next.trim() === '') { + next = undefined + } if (prev !== undefined && next !== undefined) { const prevLexoRank = LexoRank.parse(prev) const nextLexoRank = LexoRank.parse(next) diff --git a/services/github/pod-github/src/sync/issueBase.ts b/services/github/pod-github/src/sync/issueBase.ts index c75ac5ebc0..7aabfac777 100644 --- a/services/github/pod-github/src/sync/issueBase.ts +++ b/services/github/pod-github/src/sync/issueBase.ts @@ -99,7 +99,7 @@ export abstract class IssueSyncManagerBase { // Find Assignees and reviewers const assignees: PersonId[] = [] - for (const o of issue.assignees.nodes) { + for (const o of issue.assignees.nodes ?? []) { const acc = await this.provider.getAccount(o) if (acc !== undefined) { assignees.push(acc) @@ -477,7 +477,7 @@ export abstract class IssueSyncManagerBase { : undefined // Check external - const currentAssignees = issueExternal.assignees.nodes.map((it) => it.id) + const currentAssignees = (issueExternal.assignees.nodes ?? []).map((it) => it.id) currentAssignees.sort((a, b) => a.localeCompare(b)) issueUpdate.assigneeIds = info !== undefined ? [info.id] : [] diff --git a/services/github/pod-github/src/sync/pullrequests.ts b/services/github/pod-github/src/sync/pullrequests.ts index fa3710ed6e..b9a018495f 100644 --- a/services/github/pod-github/src/sync/pullrequests.ts +++ b/services/github/pod-github/src/sync/pullrequests.ts @@ -299,7 +299,7 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS async getReviewers (issue: PullRequestExternalData): Promise { // Find Assignees and reviewers - const ids: UserInfo[] = issue.reviewRequests.nodes.map((it: any) => it.requestedReviewer) + const ids: UserInfo[] = (issue.reviewRequests.nodes ?? []).map((it: any) => it.requestedReviewer) const values: PersonId[] = [] @@ -310,7 +310,7 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS } } - for (const n of issue.latestReviews.nodes) { + for (const n of issue.latestReviews.nodes ?? []) { const acc = await this.provider.getAccount(n.author) if (acc !== undefined) { values.push(acc) @@ -629,14 +629,14 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS const approvedOrChangesRequested = new Map() const reviewStates = new Map() - const sortedReviews: (Review & { date: number })[] = external.reviews.nodes + const sortedReviews: (Review & { date: number })[] = (external.reviews.nodes ?? []) .filter((it) => it != null) .map((it) => ({ ...it, date: new Date(it.updatedAt ?? it.submittedAt ?? it.createdAt).getTime() })) - for (const it of external.latestReviews.nodes) { + for (const it of external.latestReviews.nodes ?? []) { if (sortedReviews.some((qt) => it.id === qt.id)) { continue } @@ -700,7 +700,7 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS const changeRequestPersons = await this.getPersonsFromId(Array.from(changeRequestPersonsIds)) let allResolved = true - for (const r of external.reviewThreads.nodes) { + for (const r of external.reviewThreads.nodes ?? []) { if (!r.isResolved) { allResolved = false for (const c of changeRequestPersons) { @@ -1209,11 +1209,11 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS if (ext == null) { continue } - if (ext.reviews.nodes.length < ext.reviews.totalCount) { + if ((ext.reviews.nodes ?? []).length < ext.reviews.totalCount) { // TODO: We need to fetch missing items. } - if (ext.reviewThreads.nodes.length < ext.reviewThreads.totalCount) { + if ((ext.reviewThreads.nodes ?? []).length < ext.reviewThreads.totalCount) { // TODO: We need to fetch missing items. } @@ -1225,10 +1225,10 @@ export class PullRequestSyncManager extends IssueSyncManagerBase implements DocS repo, github.class.GithubReview, {}, - (ext) => ext.reviews.nodes + (ext) => ext.reviews.nodes ?? [] ) await syncDerivedDocuments(derivedClient, d, ext, prj, repo, github.class.GithubReviewThread, {}, (ext) => - ext.reviewThreads.nodes.map((it) => ({ + (ext.reviewThreads.nodes ?? []).map((it) => ({ ...it, url: it.id, createdAt: new Date(it.comments.nodes[0].createdAt ?? Date.now()).toISOString(),