From deb9a8374687c6d27ebb66ed411c295b79b342f4 Mon Sep 17 00:00:00 2001 From: Lokesh Kaki Date: Tue, 17 Mar 2026 22:31:07 -0500 Subject: [PATCH] fix(catalog-backend-module-bitbucket-cloud): remove unused isRelevantPath options parameter from analyzer Signed-off-by: Lokesh Kaki --- .../report-alpha.api.md | 6 - .../src/alpha.ts | 1 - .../events/BitbucketCloudScmEventsBridge.ts | 4 - .../analyzeBitbucketCloudWebhookEvent.test.ts | 215 ++++++++---------- .../analyzeBitbucketCloudWebhookEvent.ts | 20 +- 5 files changed, 94 insertions(+), 152 deletions(-) diff --git a/plugins/catalog-backend-module-bitbucket-cloud/report-alpha.api.md b/plugins/catalog-backend-module-bitbucket-cloud/report-alpha.api.md index 67c166912d..31762b83a2 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/report-alpha.api.md +++ b/plugins/catalog-backend-module-bitbucket-cloud/report-alpha.api.md @@ -10,14 +10,8 @@ import { CatalogScmEvent } from '@backstage/plugin-catalog-node/alpha'; export function analyzeBitbucketCloudWebhookEvent( eventType: string, eventPayload: unknown, - _options: AnalyzeBitbucketCloudWebhookEventOptions, ): Promise; -// @alpha -export interface AnalyzeBitbucketCloudWebhookEventOptions { - isRelevantPath: (path: string) => boolean; -} - // @alpha export type AnalyzeBitbucketCloudWebhookEventResult = | { diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts index 19212727a4..a4945aff93 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/alpha.ts @@ -22,6 +22,5 @@ export default _feature; export { analyzeBitbucketCloudWebhookEvent, - type AnalyzeBitbucketCloudWebhookEventOptions, type AnalyzeBitbucketCloudWebhookEventResult, } from './events/analyzeBitbucketCloudWebhookEvent'; diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/events/BitbucketCloudScmEventsBridge.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/events/BitbucketCloudScmEventsBridge.ts index 4ae59f7ed7..16d7c2fc5c 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/events/BitbucketCloudScmEventsBridge.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/events/BitbucketCloudScmEventsBridge.ts @@ -78,10 +78,6 @@ export class BitbucketCloudScmEventsBridge { const output = await analyzeBitbucketCloudWebhookEvent( eventType, params.eventPayload, - { - isRelevantPath: path => - path.endsWith('.yaml') || path.endsWith('.yml'), - }, ); if (output.result === 'ok') { diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/events/analyzeBitbucketCloudWebhookEvent.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/events/analyzeBitbucketCloudWebhookEvent.test.ts index fbbd7c9a4f..6ddb8f15a9 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/events/analyzeBitbucketCloudWebhookEvent.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/events/analyzeBitbucketCloudWebhookEvent.test.ts @@ -16,9 +16,6 @@ import { analyzeBitbucketCloudWebhookEvent } from './analyzeBitbucketCloudWebhookEvent'; -const isRelevantPath = (path: string): boolean => - path.endsWith('.yaml') || path.endsWith('.yml'); - const baseRepository = { type: 'repository', full_name: 'test-ws/test-repo', @@ -37,15 +34,11 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { describe('repo:push', () => { it('emits repository.updated for a push event', async () => { await expect( - analyzeBitbucketCloudWebhookEvent( - 'repo:push', - { - actor: { type: 'user' }, - repository: baseRepository, - push: { changes: [] }, - }, - { isRelevantPath }, - ), + analyzeBitbucketCloudWebhookEvent('repo:push', { + actor: { type: 'user' }, + repository: baseRepository, + push: { changes: [] }, + }), ).resolves.toEqual({ result: 'ok', events: [ @@ -59,15 +52,11 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { it('aborts when repository URL is missing', async () => { await expect( - analyzeBitbucketCloudWebhookEvent( - 'repo:push', - { - actor: { type: 'user' }, - repository: { type: 'repository' }, - push: { changes: [] }, - }, - { isRelevantPath }, - ), + analyzeBitbucketCloudWebhookEvent('repo:push', { + actor: { type: 'user' }, + repository: { type: 'repository' }, + push: { changes: [] }, + }), ).resolves.toEqual({ result: 'aborted', reason: @@ -79,41 +68,37 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { describe('repo:updated', () => { it('emits repository.moved when the URL changes', async () => { await expect( - analyzeBitbucketCloudWebhookEvent( - 'repo:updated', - { - actor: { type: 'user' }, - repository: { - ...baseRepository, - full_name: 'test-ws/test-repo-new', - links: { + analyzeBitbucketCloudWebhookEvent('repo:updated', { + actor: { type: 'user' }, + repository: { + ...baseRepository, + full_name: 'test-ws/test-repo-new', + links: { + html: { + href: 'https://bitbucket.org/test-ws/test-repo-new', + }, + }, + }, + changes: { + name: { new: 'test-repo-new', old: 'test-repo-old' }, + full_name: { + new: 'test-ws/test-repo-new', + old: 'test-ws/test-repo-old', + }, + links: { + new: { html: { href: 'https://bitbucket.org/test-ws/test-repo-new', }, }, - }, - changes: { - name: { new: 'test-repo-new', old: 'test-repo-old' }, - full_name: { - new: 'test-ws/test-repo-new', - old: 'test-ws/test-repo-old', - }, - links: { - new: { - html: { - href: 'https://bitbucket.org/test-ws/test-repo-new', - }, - }, - old: { - html: { - href: 'https://bitbucket.org/test-ws/test-repo-old', - }, + old: { + html: { + href: 'https://bitbucket.org/test-ws/test-repo-old', }, }, }, }, - { isRelevantPath }, - ), + }), ).resolves.toEqual({ result: 'ok', events: [ @@ -128,28 +113,24 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { it('falls back to full_name for old URL when links.old is missing', async () => { await expect( - analyzeBitbucketCloudWebhookEvent( - 'repo:updated', - { - actor: { type: 'user' }, - repository: { - ...baseRepository, - full_name: 'test-ws/test-repo-new', - links: { - html: { - href: 'https://bitbucket.org/test-ws/test-repo-new', - }, - }, - }, - changes: { - full_name: { - new: 'test-ws/test-repo-new', - old: 'test-ws/test-repo-old', + analyzeBitbucketCloudWebhookEvent('repo:updated', { + actor: { type: 'user' }, + repository: { + ...baseRepository, + full_name: 'test-ws/test-repo-new', + links: { + html: { + href: 'https://bitbucket.org/test-ws/test-repo-new', }, }, }, - { isRelevantPath }, - ), + changes: { + full_name: { + new: 'test-ws/test-repo-new', + old: 'test-ws/test-repo-old', + }, + }, + }), ).resolves.toEqual({ result: 'ok', events: [ @@ -164,17 +145,13 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { it('emits repository.updated when no URL change is detected', async () => { await expect( - analyzeBitbucketCloudWebhookEvent( - 'repo:updated', - { - actor: { type: 'user' }, - repository: baseRepository, - changes: { - description: { new: 'new desc', old: 'old desc' }, - }, + analyzeBitbucketCloudWebhookEvent('repo:updated', { + actor: { type: 'user' }, + repository: baseRepository, + changes: { + description: { new: 'new desc', old: 'old desc' }, }, - { isRelevantPath }, - ), + }), ).resolves.toEqual({ result: 'ok', events: [ @@ -190,44 +167,40 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { describe('repo:transfer', () => { it('emits repository.moved when transferred to a new workspace', async () => { await expect( - analyzeBitbucketCloudWebhookEvent( - 'repo:transfer', - { - actor: { type: 'user' }, - repository: { - ...baseRepository, - full_name: 'new-ws/test-repo', - links: { + analyzeBitbucketCloudWebhookEvent('repo:transfer', { + actor: { type: 'user' }, + repository: { + ...baseRepository, + full_name: 'new-ws/test-repo', + links: { + html: { + href: 'https://bitbucket.org/new-ws/test-repo', + }, + }, + workspace: { + type: 'workspace', + slug: 'new-ws', + }, + }, + changes: { + full_name: { + new: 'new-ws/test-repo', + old: 'test-ws/test-repo', + }, + links: { + new: { html: { href: 'https://bitbucket.org/new-ws/test-repo', }, }, - workspace: { - type: 'workspace', - slug: 'new-ws', - }, - }, - changes: { - full_name: { - new: 'new-ws/test-repo', - old: 'test-ws/test-repo', - }, - links: { - new: { - html: { - href: 'https://bitbucket.org/new-ws/test-repo', - }, - }, - old: { - html: { - href: 'https://bitbucket.org/test-ws/test-repo', - }, + old: { + html: { + href: 'https://bitbucket.org/test-ws/test-repo', }, }, }, }, - { isRelevantPath }, - ), + }), ).resolves.toEqual({ result: 'ok', events: [ @@ -244,14 +217,10 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { describe('repo:deleted', () => { it('emits repository.deleted', async () => { await expect( - analyzeBitbucketCloudWebhookEvent( - 'repo:deleted', - { - actor: { type: 'user' }, - repository: baseRepository, - }, - { isRelevantPath }, - ), + analyzeBitbucketCloudWebhookEvent('repo:deleted', { + actor: { type: 'user' }, + repository: baseRepository, + }), ).resolves.toEqual({ result: 'ok', events: [ @@ -267,17 +236,13 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { describe('general behavior', () => { it('throws on non-object payloads', async () => { await expect( - analyzeBitbucketCloudWebhookEvent('repo:push', undefined, { - isRelevantPath, - }), + analyzeBitbucketCloudWebhookEvent('repo:push', undefined), ).rejects.toThrow( 'Bitbucket Cloud webhook event payload is not an object', ); await expect( - analyzeBitbucketCloudWebhookEvent('repo:push', [], { - isRelevantPath, - }), + analyzeBitbucketCloudWebhookEvent('repo:push', []), ).rejects.toThrow( 'Bitbucket Cloud webhook event payload is not an object', ); @@ -285,11 +250,9 @@ describe('analyzeBitbucketCloudWebhookEvent', () => { it('returns unsupported-event for unknown event types', async () => { await expect( - analyzeBitbucketCloudWebhookEvent( - 'pullrequest:created', - { actor: { type: 'user' } }, - { isRelevantPath }, - ), + analyzeBitbucketCloudWebhookEvent('pullrequest:created', { + actor: { type: 'user' }, + }), ).resolves.toEqual({ result: 'unsupported-event', event: 'pullrequest:created', diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/events/analyzeBitbucketCloudWebhookEvent.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/events/analyzeBitbucketCloudWebhookEvent.ts index 93b1b41934..68ce66d03d 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/events/analyzeBitbucketCloudWebhookEvent.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/events/analyzeBitbucketCloudWebhookEvent.ts @@ -17,18 +17,6 @@ import { InputError } from '@backstage/errors'; import { CatalogScmEvent } from '@backstage/plugin-catalog-node/alpha'; -/** - * Options for {@link analyzeBitbucketCloudWebhookEvent}. - * @alpha - */ -export interface AnalyzeBitbucketCloudWebhookEventOptions { - /** - * Predicate that returns true for file paths that are relevant to the - * catalog (e.g. paths ending in `.yaml` or `.yml`). - */ - isRelevantPath: (path: string) => boolean; -} - /** * The result of analyzing a Bitbucket Cloud webhook event. * @@ -213,10 +201,13 @@ async function onRepoDeletedEvent( * Analyzes a Bitbucket Cloud webhook event and translates it into zero or more * catalog SCM events that entity providers can act on. * + * Bitbucket Cloud push payloads do not include file-level change data, so only + * repository-level events are produced (unlike GitLab and Azure DevOps + * analyzers which can emit fine-grained `location.*` events). + * * Supported event types: * - `repo:push` — emits a `repository.updated` event to trigger catalog - * refresh for the repository. Bitbucket Cloud push payloads do not include - * file-level change data, so only repository-level events are produced. + * refresh for the repository. * - `repo:updated` — translates repository renames into `repository.moved` * events, or emits `repository.updated` for other metadata changes. * - `repo:transfer` — translates repository transfers into `repository.moved` @@ -228,7 +219,6 @@ async function onRepoDeletedEvent( export async function analyzeBitbucketCloudWebhookEvent( eventType: string, eventPayload: unknown, - _options: AnalyzeBitbucketCloudWebhookEventOptions, ): Promise { const payload = asObject(eventPayload); if (!payload) {