@backstage/plugin-catalog-backend-module-bitbucket-cloud 0.5.10-next.0 → 0.5.10-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @backstage/plugin-catalog-backend-module-bitbucket-cloud
2
2
 
3
+ ## 0.5.10-next.2
4
+
5
+ ### Patch Changes
6
+
7
+ - f215863: Added Bitbucket Cloud SCM event translation layer for the catalog backend module. The module now subscribes to Bitbucket Cloud webhook events and translates them into generic catalog SCM events, enabling instant catalog reprocessing when repositories are pushed to, renamed, transferred, or deleted. The `analyzeBitbucketCloudWebhookEvent` function is exported from the alpha entry point for custom integrations.
8
+ - Updated dependencies
9
+ - @backstage/errors@1.3.0-next.0
10
+ - @backstage/plugin-catalog-node@2.2.0-next.2
11
+ - @backstage/integration@2.0.1-next.0
12
+ - @backstage/backend-plugin-api@1.9.0-next.2
13
+ - @backstage/catalog-model@1.7.8-next.0
14
+ - @backstage/config@1.3.7-next.0
15
+ - @backstage/plugin-events-node@0.4.21-next.2
16
+ - @backstage/plugin-bitbucket-cloud-common@0.3.9-next.0
17
+ - @backstage/plugin-catalog-common@1.1.9-next.0
18
+
19
+ ## 0.5.10-next.1
20
+
21
+ ### Patch Changes
22
+
23
+ - Updated dependencies
24
+ - @backstage/backend-plugin-api@1.9.0-next.1
25
+ - @backstage/plugin-catalog-node@2.1.1-next.1
26
+ - @backstage/plugin-events-node@0.4.21-next.1
27
+
3
28
  ## 0.5.10-next.0
4
29
 
5
30
  ### Patch Changes
package/dist/alpha.cjs.js CHANGED
@@ -3,8 +3,10 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var catalogModuleBitbucketCloudEntityProvider = require('./module/catalogModuleBitbucketCloudEntityProvider.cjs.js');
6
+ var analyzeBitbucketCloudWebhookEvent = require('./events/analyzeBitbucketCloudWebhookEvent.cjs.js');
6
7
 
7
8
  const _feature = catalogModuleBitbucketCloudEntityProvider.catalogModuleBitbucketCloudEntityProvider;
8
9
 
10
+ exports.analyzeBitbucketCloudWebhookEvent = analyzeBitbucketCloudWebhookEvent.analyzeBitbucketCloudWebhookEvent;
9
11
  exports.default = _feature;
10
12
  //# sourceMappingURL=alpha.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.cjs.js","sources":["../src/alpha.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { default as feature } from './module';\n\n/** @alpha */\nconst _feature = feature;\nexport default _feature;\n"],"names":["feature"],"mappings":";;;;;;AAmBA,MAAM,QAAA,GAAWA;;;;"}
1
+ {"version":3,"file":"alpha.cjs.js","sources":["../src/alpha.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { default as feature } from './module';\n\n/** @alpha */\nconst _feature = feature;\nexport default _feature;\n\nexport {\n analyzeBitbucketCloudWebhookEvent,\n type AnalyzeBitbucketCloudWebhookEventResult,\n} from './events/analyzeBitbucketCloudWebhookEvent';\n"],"names":["feature"],"mappings":";;;;;;;AAmBA,MAAM,QAAA,GAAWA;;;;;"}
package/dist/alpha.d.ts CHANGED
@@ -1,6 +1,52 @@
1
1
  import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+ import { CatalogScmEvent } from '@backstage/plugin-catalog-node/alpha';
3
+
4
+ /**
5
+ * The result of analyzing a Bitbucket Cloud webhook event.
6
+ *
7
+ * - `ok` — one or more catalog SCM events were produced.
8
+ * - `ignored` — the event was valid but not relevant.
9
+ * - `aborted` — the event could not be fully processed due to missing data.
10
+ * - `unsupported-event` — the event type is not handled by this analyzer.
11
+ *
12
+ * @alpha
13
+ */
14
+ type AnalyzeBitbucketCloudWebhookEventResult = {
15
+ result: 'unsupported-event';
16
+ event: string;
17
+ } | {
18
+ result: 'ignored';
19
+ reason: string;
20
+ } | {
21
+ result: 'aborted';
22
+ reason: string;
23
+ } | {
24
+ result: 'ok';
25
+ events: CatalogScmEvent[];
26
+ };
27
+ /**
28
+ * Analyzes a Bitbucket Cloud webhook event and translates it into zero or more
29
+ * catalog SCM events that entity providers can act on.
30
+ *
31
+ * Bitbucket Cloud push payloads do not include file-level change data, so only
32
+ * repository-level events are produced (unlike GitLab and Azure DevOps
33
+ * analyzers which can emit fine-grained `location.*` events).
34
+ *
35
+ * Supported event types:
36
+ * - `repo:push` — emits a `repository.updated` event to trigger catalog
37
+ * refresh for the repository.
38
+ * - `repo:updated` — translates repository renames into `repository.moved`
39
+ * events, or emits `repository.updated` for other metadata changes.
40
+ * - `repo:transfer` — translates repository transfers into `repository.moved`
41
+ * events.
42
+ * - `repo:deleted` — emits a `repository.deleted` event.
43
+ *
44
+ * @alpha
45
+ */
46
+ declare function analyzeBitbucketCloudWebhookEvent(eventType: string, eventPayload: unknown): Promise<AnalyzeBitbucketCloudWebhookEventResult>;
2
47
 
3
48
  /** @alpha */
4
49
  declare const _feature: _backstage_backend_plugin_api.BackendFeature;
5
50
 
6
- export { _feature as default };
51
+ export { analyzeBitbucketCloudWebhookEvent, _feature as default };
52
+ export type { AnalyzeBitbucketCloudWebhookEventResult };
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ var analyzeBitbucketCloudWebhookEvent = require('./analyzeBitbucketCloudWebhookEvent.cjs.js');
4
+
5
+ class BitbucketCloudScmEventsBridge {
6
+ #logger;
7
+ #events;
8
+ #catalogScmEvents;
9
+ #shuttingDown;
10
+ #pendingPublish;
11
+ constructor(options) {
12
+ this.#logger = options.logger;
13
+ this.#events = options.events;
14
+ this.#catalogScmEvents = options.catalogScmEvents;
15
+ this.#shuttingDown = false;
16
+ }
17
+ async start() {
18
+ await this.#events.subscribe({
19
+ id: "catalog-bitbucket-cloud-scm-events-bridge",
20
+ topics: ["bitbucketCloud"],
21
+ onEvent: this.#onEvent.bind(this)
22
+ });
23
+ }
24
+ async stop() {
25
+ this.#shuttingDown = true;
26
+ await this.#pendingPublish;
27
+ }
28
+ async #onEvent(params) {
29
+ const eventType = params.metadata?.["x-event-key"] ?? this.#extractEventTypeFromTopic(params.topic);
30
+ if (!eventType || !params.eventPayload) {
31
+ return;
32
+ }
33
+ while (this.#pendingPublish) {
34
+ await this.#pendingPublish;
35
+ }
36
+ if (this.#shuttingDown) {
37
+ this.#logger.warn(
38
+ `Skipping Bitbucket Cloud webhook event of type "${eventType}" on topic "${params.topic}" because the bridge is shutting down`
39
+ );
40
+ return;
41
+ }
42
+ this.#pendingPublish = Promise.resolve().then(async () => {
43
+ try {
44
+ const output = await analyzeBitbucketCloudWebhookEvent.analyzeBitbucketCloudWebhookEvent(
45
+ eventType,
46
+ params.eventPayload
47
+ );
48
+ if (output.result === "ok") {
49
+ await this.#catalogScmEvents.publish(output.events);
50
+ } else if (output.result === "ignored") {
51
+ this.#logger.debug(
52
+ `Skipping Bitbucket Cloud webhook event of type "${eventType}" on topic "${params.topic}" because it is ignored: ${output.reason}`
53
+ );
54
+ } else if (output.result === "aborted") {
55
+ this.#logger.warn(
56
+ `Skipping Bitbucket Cloud webhook event of type "${eventType}" on topic "${params.topic}" because it is aborted: ${output.reason}`
57
+ );
58
+ } else if (output.result === "unsupported-event") {
59
+ this.#logger.debug(
60
+ `Skipping Bitbucket Cloud webhook event of type "${eventType}" on topic "${params.topic}" because it is unsupported: ${output.event}`
61
+ );
62
+ }
63
+ } catch (error) {
64
+ this.#logger.warn(
65
+ `Failed to handle Bitbucket Cloud webhook event of type "${eventType}"`,
66
+ error
67
+ );
68
+ } finally {
69
+ this.#pendingPublish = void 0;
70
+ }
71
+ });
72
+ await this.#pendingPublish;
73
+ }
74
+ #extractEventTypeFromTopic(topic) {
75
+ if (topic.startsWith("bitbucketCloud.")) {
76
+ return topic.slice("bitbucketCloud.".length);
77
+ }
78
+ return void 0;
79
+ }
80
+ }
81
+
82
+ exports.BitbucketCloudScmEventsBridge = BitbucketCloudScmEventsBridge;
83
+ //# sourceMappingURL=BitbucketCloudScmEventsBridge.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BitbucketCloudScmEventsBridge.cjs.js","sources":["../../src/events/BitbucketCloudScmEventsBridge.ts"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\nimport { CatalogScmEventsService } from '@backstage/plugin-catalog-node/alpha';\nimport { EventParams, EventsService } from '@backstage/plugin-events-node';\nimport { analyzeBitbucketCloudWebhookEvent } from './analyzeBitbucketCloudWebhookEvent';\n\n/**\n * Takes Bitbucket Cloud webhook events, analyzes them, and publishes them as\n * catalog SCM events that entity providers and others can subscribe to.\n */\nexport class BitbucketCloudScmEventsBridge {\n readonly #logger: LoggerService;\n readonly #events: EventsService;\n readonly #catalogScmEvents: CatalogScmEventsService;\n #shuttingDown: boolean;\n #pendingPublish: Promise<void> | undefined;\n\n constructor(options: {\n logger: LoggerService;\n events: EventsService;\n catalogScmEvents: CatalogScmEventsService;\n }) {\n this.#logger = options.logger;\n this.#events = options.events;\n this.#catalogScmEvents = options.catalogScmEvents;\n this.#shuttingDown = false;\n }\n\n async start() {\n await this.#events.subscribe({\n id: 'catalog-bitbucket-cloud-scm-events-bridge',\n topics: ['bitbucketCloud'],\n onEvent: this.#onEvent.bind(this),\n });\n }\n\n async stop() {\n this.#shuttingDown = true;\n await this.#pendingPublish;\n }\n\n async #onEvent(params: EventParams): Promise<void> {\n const eventType =\n (params.metadata?.['x-event-key'] as string | undefined) ??\n this.#extractEventTypeFromTopic(params.topic);\n if (!eventType || !params.eventPayload) {\n return;\n }\n\n while (this.#pendingPublish) {\n await this.#pendingPublish;\n }\n\n if (this.#shuttingDown) {\n this.#logger.warn(\n `Skipping Bitbucket Cloud webhook event of type \"${eventType}\" on topic \"${params.topic}\" because the bridge is shutting down`,\n );\n return;\n }\n\n this.#pendingPublish = Promise.resolve().then(async () => {\n try {\n const output = await analyzeBitbucketCloudWebhookEvent(\n eventType,\n params.eventPayload,\n );\n\n if (output.result === 'ok') {\n await this.#catalogScmEvents.publish(output.events);\n } else if (output.result === 'ignored') {\n this.#logger.debug(\n `Skipping Bitbucket Cloud webhook event of type \"${eventType}\" on topic \"${params.topic}\" because it is ignored: ${output.reason}`,\n );\n } else if (output.result === 'aborted') {\n this.#logger.warn(\n `Skipping Bitbucket Cloud webhook event of type \"${eventType}\" on topic \"${params.topic}\" because it is aborted: ${output.reason}`,\n );\n } else if (output.result === 'unsupported-event') {\n this.#logger.debug(\n `Skipping Bitbucket Cloud webhook event of type \"${eventType}\" on topic \"${params.topic}\" because it is unsupported: ${output.event}`,\n );\n }\n } catch (error) {\n this.#logger.warn(\n `Failed to handle Bitbucket Cloud webhook event of type \"${eventType}\"`,\n error,\n );\n } finally {\n this.#pendingPublish = undefined;\n }\n });\n\n await this.#pendingPublish;\n }\n\n #extractEventTypeFromTopic(topic: string): string | undefined {\n if (topic.startsWith('bitbucketCloud.')) {\n return topic.slice('bitbucketCloud.'.length);\n }\n return undefined;\n }\n}\n"],"names":["analyzeBitbucketCloudWebhookEvent"],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ 'use strict';
2
+
3
+ var errors = require('@backstage/errors');
4
+
5
+ function asObject(value) {
6
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
7
+ return void 0;
8
+ }
9
+ return value;
10
+ }
11
+ function asString(value) {
12
+ return typeof value === "string" ? value : void 0;
13
+ }
14
+ function getRepositoryUrl(payload) {
15
+ const repository = asObject(payload.repository);
16
+ if (!repository) {
17
+ return void 0;
18
+ }
19
+ const links = asObject(repository.links);
20
+ const html = asObject(links?.html);
21
+ return asString(html?.href);
22
+ }
23
+ function getOldRepositoryUrl(payload) {
24
+ const changes = asObject(payload.changes);
25
+ if (!changes) {
26
+ return void 0;
27
+ }
28
+ const linksChange = asObject(changes.links);
29
+ if (linksChange) {
30
+ const oldLinks = asObject(linksChange.old);
31
+ const html = asObject(oldLinks?.html);
32
+ const href = asString(html?.href);
33
+ if (href) {
34
+ return href;
35
+ }
36
+ }
37
+ const fullNameChange = asObject(changes.full_name);
38
+ const oldFullName = asString(fullNameChange?.old);
39
+ if (oldFullName) {
40
+ return `https://bitbucket.org/${oldFullName}`;
41
+ }
42
+ return void 0;
43
+ }
44
+ async function onPushEvent(payload) {
45
+ const repositoryUrl = getRepositoryUrl(payload);
46
+ if (!repositoryUrl) {
47
+ return {
48
+ result: "aborted",
49
+ reason: "Bitbucket Cloud repo:push event did not include repository.links.html.href"
50
+ };
51
+ }
52
+ return {
53
+ result: "ok",
54
+ events: [{ type: "repository.updated", url: repositoryUrl }]
55
+ };
56
+ }
57
+ async function onRepoUpdatedEvent(payload) {
58
+ const repositoryUrl = getRepositoryUrl(payload);
59
+ const oldRepositoryUrl = getOldRepositoryUrl(payload);
60
+ if (!repositoryUrl) {
61
+ return {
62
+ result: "aborted",
63
+ reason: "Bitbucket Cloud repo:updated event did not include repository.links.html.href"
64
+ };
65
+ }
66
+ if (oldRepositoryUrl && oldRepositoryUrl !== repositoryUrl) {
67
+ return {
68
+ result: "ok",
69
+ events: [
70
+ {
71
+ type: "repository.moved",
72
+ fromUrl: oldRepositoryUrl,
73
+ toUrl: repositoryUrl
74
+ }
75
+ ]
76
+ };
77
+ }
78
+ return {
79
+ result: "ok",
80
+ events: [{ type: "repository.updated", url: repositoryUrl }]
81
+ };
82
+ }
83
+ async function onRepoTransferEvent(payload) {
84
+ const repositoryUrl = getRepositoryUrl(payload);
85
+ const oldRepositoryUrl = getOldRepositoryUrl(payload);
86
+ if (!repositoryUrl) {
87
+ return {
88
+ result: "aborted",
89
+ reason: "Bitbucket Cloud repo:transfer event did not include repository.links.html.href"
90
+ };
91
+ }
92
+ if (oldRepositoryUrl && oldRepositoryUrl !== repositoryUrl) {
93
+ return {
94
+ result: "ok",
95
+ events: [
96
+ {
97
+ type: "repository.moved",
98
+ fromUrl: oldRepositoryUrl,
99
+ toUrl: repositoryUrl
100
+ }
101
+ ]
102
+ };
103
+ }
104
+ return {
105
+ result: "ok",
106
+ events: [{ type: "repository.updated", url: repositoryUrl }]
107
+ };
108
+ }
109
+ async function onRepoDeletedEvent(payload) {
110
+ const repositoryUrl = getRepositoryUrl(payload);
111
+ if (!repositoryUrl) {
112
+ return {
113
+ result: "aborted",
114
+ reason: "Bitbucket Cloud repo:deleted event did not include repository.links.html.href"
115
+ };
116
+ }
117
+ return {
118
+ result: "ok",
119
+ events: [{ type: "repository.deleted", url: repositoryUrl }]
120
+ };
121
+ }
122
+ async function analyzeBitbucketCloudWebhookEvent(eventType, eventPayload) {
123
+ const payload = asObject(eventPayload);
124
+ if (!payload) {
125
+ throw new errors.InputError(
126
+ "Bitbucket Cloud webhook event payload is not an object"
127
+ );
128
+ }
129
+ switch (eventType) {
130
+ case "repo:push":
131
+ return onPushEvent(payload);
132
+ case "repo:updated":
133
+ return onRepoUpdatedEvent(payload);
134
+ case "repo:transfer":
135
+ return onRepoTransferEvent(payload);
136
+ case "repo:deleted":
137
+ return onRepoDeletedEvent(payload);
138
+ default:
139
+ return { result: "unsupported-event", event: eventType };
140
+ }
141
+ }
142
+
143
+ exports.analyzeBitbucketCloudWebhookEvent = analyzeBitbucketCloudWebhookEvent;
144
+ //# sourceMappingURL=analyzeBitbucketCloudWebhookEvent.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeBitbucketCloudWebhookEvent.cjs.js","sources":["../../src/events/analyzeBitbucketCloudWebhookEvent.ts"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { CatalogScmEvent } from '@backstage/plugin-catalog-node/alpha';\n\n/**\n * The result of analyzing a Bitbucket Cloud webhook event.\n *\n * - `ok` — one or more catalog SCM events were produced.\n * - `ignored` — the event was valid but not relevant.\n * - `aborted` — the event could not be fully processed due to missing data.\n * - `unsupported-event` — the event type is not handled by this analyzer.\n *\n * @alpha\n */\nexport type AnalyzeBitbucketCloudWebhookEventResult =\n | {\n result: 'unsupported-event';\n event: string;\n }\n | {\n result: 'ignored';\n reason: string;\n }\n | {\n result: 'aborted';\n reason: string;\n }\n | {\n result: 'ok';\n events: CatalogScmEvent[];\n };\n\ntype JsonObject = Record<string, unknown>;\n\nfunction asObject(value: unknown): JsonObject | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n return value as JsonObject;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction getRepositoryUrl(payload: JsonObject): string | undefined {\n const repository = asObject(payload.repository);\n if (!repository) {\n return undefined;\n }\n const links = asObject(repository.links);\n const html = asObject(links?.html);\n return asString(html?.href);\n}\n\nfunction getOldRepositoryUrl(payload: JsonObject): string | undefined {\n const changes = asObject(payload.changes);\n if (!changes) {\n return undefined;\n }\n\n const linksChange = asObject(changes.links);\n if (linksChange) {\n const oldLinks = asObject(linksChange.old);\n const html = asObject(oldLinks?.html);\n const href = asString(html?.href);\n if (href) {\n return href;\n }\n }\n\n const fullNameChange = asObject(changes.full_name);\n const oldFullName = asString(fullNameChange?.old);\n if (oldFullName) {\n return `https://bitbucket.org/${oldFullName}`;\n }\n\n return undefined;\n}\n\nasync function onPushEvent(\n payload: JsonObject,\n): Promise<AnalyzeBitbucketCloudWebhookEventResult> {\n const repositoryUrl = getRepositoryUrl(payload);\n\n if (!repositoryUrl) {\n return {\n result: 'aborted',\n reason:\n 'Bitbucket Cloud repo:push event did not include repository.links.html.href',\n };\n }\n\n return {\n result: 'ok',\n events: [{ type: 'repository.updated', url: repositoryUrl }],\n };\n}\n\nasync function onRepoUpdatedEvent(\n payload: JsonObject,\n): Promise<AnalyzeBitbucketCloudWebhookEventResult> {\n const repositoryUrl = getRepositoryUrl(payload);\n const oldRepositoryUrl = getOldRepositoryUrl(payload);\n\n if (!repositoryUrl) {\n return {\n result: 'aborted',\n reason:\n 'Bitbucket Cloud repo:updated event did not include repository.links.html.href',\n };\n }\n\n if (oldRepositoryUrl && oldRepositoryUrl !== repositoryUrl) {\n return {\n result: 'ok',\n events: [\n {\n type: 'repository.moved',\n fromUrl: oldRepositoryUrl,\n toUrl: repositoryUrl,\n },\n ],\n };\n }\n\n return {\n result: 'ok',\n events: [{ type: 'repository.updated', url: repositoryUrl }],\n };\n}\n\nasync function onRepoTransferEvent(\n payload: JsonObject,\n): Promise<AnalyzeBitbucketCloudWebhookEventResult> {\n const repositoryUrl = getRepositoryUrl(payload);\n const oldRepositoryUrl = getOldRepositoryUrl(payload);\n\n if (!repositoryUrl) {\n return {\n result: 'aborted',\n reason:\n 'Bitbucket Cloud repo:transfer event did not include repository.links.html.href',\n };\n }\n\n if (oldRepositoryUrl && oldRepositoryUrl !== repositoryUrl) {\n return {\n result: 'ok',\n events: [\n {\n type: 'repository.moved',\n fromUrl: oldRepositoryUrl,\n toUrl: repositoryUrl,\n },\n ],\n };\n }\n\n return {\n result: 'ok',\n events: [{ type: 'repository.updated', url: repositoryUrl }],\n };\n}\n\nasync function onRepoDeletedEvent(\n payload: JsonObject,\n): Promise<AnalyzeBitbucketCloudWebhookEventResult> {\n const repositoryUrl = getRepositoryUrl(payload);\n\n if (!repositoryUrl) {\n return {\n result: 'aborted',\n reason:\n 'Bitbucket Cloud repo:deleted event did not include repository.links.html.href',\n };\n }\n\n return {\n result: 'ok',\n events: [{ type: 'repository.deleted', url: repositoryUrl }],\n };\n}\n\n/**\n * Analyzes a Bitbucket Cloud webhook event and translates it into zero or more\n * catalog SCM events that entity providers can act on.\n *\n * Bitbucket Cloud push payloads do not include file-level change data, so only\n * repository-level events are produced (unlike GitLab and Azure DevOps\n * analyzers which can emit fine-grained `location.*` events).\n *\n * Supported event types:\n * - `repo:push` — emits a `repository.updated` event to trigger catalog\n * refresh for the repository.\n * - `repo:updated` — translates repository renames into `repository.moved`\n * events, or emits `repository.updated` for other metadata changes.\n * - `repo:transfer` — translates repository transfers into `repository.moved`\n * events.\n * - `repo:deleted` — emits a `repository.deleted` event.\n *\n * @alpha\n */\nexport async function analyzeBitbucketCloudWebhookEvent(\n eventType: string,\n eventPayload: unknown,\n): Promise<AnalyzeBitbucketCloudWebhookEventResult> {\n const payload = asObject(eventPayload);\n if (!payload) {\n throw new InputError(\n 'Bitbucket Cloud webhook event payload is not an object',\n );\n }\n\n switch (eventType) {\n case 'repo:push':\n return onPushEvent(payload);\n case 'repo:updated':\n return onRepoUpdatedEvent(payload);\n case 'repo:transfer':\n return onRepoTransferEvent(payload);\n case 'repo:deleted':\n return onRepoDeletedEvent(payload);\n default:\n return { result: 'unsupported-event', event: eventType };\n }\n}\n"],"names":["InputError"],"mappings":"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"}
@@ -2,8 +2,10 @@
2
2
 
3
3
  var backendPluginApi = require('@backstage/backend-plugin-api');
4
4
  var pluginCatalogNode = require('@backstage/plugin-catalog-node');
5
+ var alpha = require('@backstage/plugin-catalog-node/alpha');
5
6
  var pluginEventsNode = require('@backstage/plugin-events-node');
6
7
  var BitbucketCloudEntityProvider = require('../providers/BitbucketCloudEntityProvider.cjs.js');
8
+ var BitbucketCloudScmEventsBridge = require('../events/BitbucketCloudScmEventsBridge.cjs.js');
7
9
 
8
10
  const catalogModuleBitbucketCloudEntityProvider = backendPluginApi.createBackendModule({
9
11
  pluginId: "catalog",
@@ -17,7 +19,9 @@ const catalogModuleBitbucketCloudEntityProvider = backendPluginApi.createBackend
17
19
  config: backendPluginApi.coreServices.rootConfig,
18
20
  events: pluginEventsNode.eventsServiceRef,
19
21
  logger: backendPluginApi.coreServices.logger,
20
- scheduler: backendPluginApi.coreServices.scheduler
22
+ scheduler: backendPluginApi.coreServices.scheduler,
23
+ catalogScmEvents: alpha.catalogScmEventsServiceRef,
24
+ lifecycle: backendPluginApi.coreServices.lifecycle
21
25
  },
22
26
  async init({
23
27
  auth,
@@ -26,7 +30,9 @@ const catalogModuleBitbucketCloudEntityProvider = backendPluginApi.createBackend
26
30
  config,
27
31
  events,
28
32
  logger,
29
- scheduler
33
+ scheduler,
34
+ catalogScmEvents,
35
+ lifecycle
30
36
  }) {
31
37
  const providers = BitbucketCloudEntityProvider.BitbucketCloudEntityProvider.fromConfig(config, {
32
38
  auth,
@@ -36,6 +42,17 @@ const catalogModuleBitbucketCloudEntityProvider = backendPluginApi.createBackend
36
42
  scheduler
37
43
  });
38
44
  catalogProcessing.addEntityProvider(providers);
45
+ const bridge = new BitbucketCloudScmEventsBridge.BitbucketCloudScmEventsBridge({
46
+ logger,
47
+ events,
48
+ catalogScmEvents
49
+ });
50
+ lifecycle.addStartupHook(async () => {
51
+ await bridge.start();
52
+ });
53
+ lifecycle.addShutdownHook(async () => {
54
+ await bridge.stop();
55
+ });
39
56
  }
40
57
  });
41
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"catalogModuleBitbucketCloudEntityProvider.cjs.js","sources":["../../src/module/catalogModuleBitbucketCloudEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node';\nimport { eventsServiceRef } from '@backstage/plugin-events-node';\nimport { BitbucketCloudEntityProvider } from '../providers/BitbucketCloudEntityProvider';\n\n/**\n * @public\n */\nexport const catalogModuleBitbucketCloudEntityProvider = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'bitbucket-cloud-entity-provider',\n register(env) {\n env.registerInit({\n deps: {\n auth: coreServices.auth,\n catalogProcessing: catalogProcessingExtensionPoint,\n catalog: catalogServiceRef,\n config: coreServices.rootConfig,\n events: eventsServiceRef,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n },\n async init({\n auth,\n catalogProcessing,\n catalog,\n config,\n events,\n logger,\n scheduler,\n }) {\n const providers = BitbucketCloudEntityProvider.fromConfig(config, {\n auth,\n catalog,\n events,\n logger,\n scheduler,\n });\n\n catalogProcessing.addEntityProvider(providers);\n },\n });\n },\n});\n"],"names":["createBackendModule","coreServices","catalogProcessingExtensionPoint","catalogServiceRef","eventsServiceRef","BitbucketCloudEntityProvider"],"mappings":";;;;;;;AA4BO,MAAM,4CAA4CA,oCAAA,CAAoB;AAAA,EAC3E,QAAA,EAAU,SAAA;AAAA,EACV,QAAA,EAAU,iCAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,MAAMC,6BAAA,CAAa,IAAA;AAAA,QACnB,iBAAA,EAAmBC,iDAAA;AAAA,QACnB,OAAA,EAASC,mCAAA;AAAA,QACT,QAAQF,6BAAA,CAAa,UAAA;AAAA,QACrB,MAAA,EAAQG,iCAAA;AAAA,QACR,QAAQH,6BAAA,CAAa,MAAA;AAAA,QACrB,WAAWA,6BAAA,CAAa;AAAA,OAC1B;AAAA,MACA,MAAM,IAAA,CAAK;AAAA,QACT,IAAA;AAAA,QACA,iBAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF,EAAG;AACD,QAAA,MAAM,SAAA,GAAYI,yDAAA,CAA6B,UAAA,CAAW,MAAA,EAAQ;AAAA,UAChE,IAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,iBAAA,CAAkB,kBAAkB,SAAS,CAAA;AAAA,MAC/C;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
1
+ {"version":3,"file":"catalogModuleBitbucketCloudEntityProvider.cjs.js","sources":["../../src/module/catalogModuleBitbucketCloudEntityProvider.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node';\nimport { catalogScmEventsServiceRef } from '@backstage/plugin-catalog-node/alpha';\nimport { eventsServiceRef } from '@backstage/plugin-events-node';\nimport { BitbucketCloudEntityProvider } from '../providers/BitbucketCloudEntityProvider';\nimport { BitbucketCloudScmEventsBridge } from '../events/BitbucketCloudScmEventsBridge';\n\n/**\n * @public\n */\nexport const catalogModuleBitbucketCloudEntityProvider = createBackendModule({\n pluginId: 'catalog',\n moduleId: 'bitbucket-cloud-entity-provider',\n register(env) {\n env.registerInit({\n deps: {\n auth: coreServices.auth,\n catalogProcessing: catalogProcessingExtensionPoint,\n catalog: catalogServiceRef,\n config: coreServices.rootConfig,\n events: eventsServiceRef,\n logger: coreServices.logger,\n scheduler: coreServices.scheduler,\n catalogScmEvents: catalogScmEventsServiceRef,\n lifecycle: coreServices.lifecycle,\n },\n async init({\n auth,\n catalogProcessing,\n catalog,\n config,\n events,\n logger,\n scheduler,\n catalogScmEvents,\n lifecycle,\n }) {\n const providers = BitbucketCloudEntityProvider.fromConfig(config, {\n auth,\n catalog,\n events,\n logger,\n scheduler,\n });\n\n catalogProcessing.addEntityProvider(providers);\n\n const bridge = new BitbucketCloudScmEventsBridge({\n logger,\n events,\n catalogScmEvents,\n });\n lifecycle.addStartupHook(async () => {\n await bridge.start();\n });\n lifecycle.addShutdownHook(async () => {\n await bridge.stop();\n });\n },\n });\n },\n});\n"],"names":["createBackendModule","coreServices","catalogProcessingExtensionPoint","catalogServiceRef","eventsServiceRef","catalogScmEventsServiceRef","BitbucketCloudEntityProvider","BitbucketCloudScmEventsBridge"],"mappings":";;;;;;;;;AA8BO,MAAM,4CAA4CA,oCAAA,CAAoB;AAAA,EAC3E,QAAA,EAAU,SAAA;AAAA,EACV,QAAA,EAAU,iCAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,MAAMC,6BAAA,CAAa,IAAA;AAAA,QACnB,iBAAA,EAAmBC,iDAAA;AAAA,QACnB,OAAA,EAASC,mCAAA;AAAA,QACT,QAAQF,6BAAA,CAAa,UAAA;AAAA,QACrB,MAAA,EAAQG,iCAAA;AAAA,QACR,QAAQH,6BAAA,CAAa,MAAA;AAAA,QACrB,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,gBAAA,EAAkBI,gCAAA;AAAA,QAClB,WAAWJ,6BAAA,CAAa;AAAA,OAC1B;AAAA,MACA,MAAM,IAAA,CAAK;AAAA,QACT,IAAA;AAAA,QACA,iBAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACF,EAAG;AACD,QAAA,MAAM,SAAA,GAAYK,yDAAA,CAA6B,UAAA,CAAW,MAAA,EAAQ;AAAA,UAChE,IAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,iBAAA,CAAkB,kBAAkB,SAAS,CAAA;AAE7C,QAAA,MAAM,MAAA,GAAS,IAAIC,2DAAA,CAA8B;AAAA,UAC/C,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,SAAA,CAAU,eAAe,YAAY;AACnC,UAAA,MAAM,OAAO,KAAA,EAAM;AAAA,QACrB,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,gBAAgB,YAAY;AACpC,UAAA,MAAM,OAAO,IAAA,EAAK;AAAA,QACpB,CAAC,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog-backend-module-bitbucket-cloud",
3
- "version": "0.5.10-next.0",
3
+ "version": "0.5.10-next.2",
4
4
  "description": "A Backstage catalog backend module that helps integrate towards Bitbucket Cloud",
5
5
  "backstage": {
6
6
  "role": "backend-plugin-module",
@@ -65,19 +65,20 @@
65
65
  "test": "backstage-cli package test"
66
66
  },
67
67
  "dependencies": {
68
- "@backstage/backend-plugin-api": "1.8.1-next.0",
69
- "@backstage/catalog-model": "1.7.7",
70
- "@backstage/config": "1.3.6",
71
- "@backstage/integration": "2.0.0",
72
- "@backstage/plugin-bitbucket-cloud-common": "0.3.8",
73
- "@backstage/plugin-catalog-common": "1.1.8",
74
- "@backstage/plugin-catalog-node": "2.1.1-next.0",
75
- "@backstage/plugin-events-node": "0.4.21-next.0",
68
+ "@backstage/backend-plugin-api": "1.9.0-next.2",
69
+ "@backstage/catalog-model": "1.7.8-next.0",
70
+ "@backstage/config": "1.3.7-next.0",
71
+ "@backstage/errors": "1.3.0-next.0",
72
+ "@backstage/integration": "2.0.1-next.0",
73
+ "@backstage/plugin-bitbucket-cloud-common": "0.3.9-next.0",
74
+ "@backstage/plugin-catalog-common": "1.1.9-next.0",
75
+ "@backstage/plugin-catalog-node": "2.2.0-next.2",
76
+ "@backstage/plugin-events-node": "0.4.21-next.2",
76
77
  "uuid": "^11.0.0"
77
78
  },
78
79
  "devDependencies": {
79
- "@backstage/backend-test-utils": "1.11.2-next.0",
80
- "@backstage/cli": "0.36.1-next.0",
80
+ "@backstage/backend-test-utils": "1.11.2-next.2",
81
+ "@backstage/cli": "0.36.1-next.2",
81
82
  "@backstage/plugin-events-backend-test-utils": "0.1.54-next.0",
82
83
  "msw": "^1.0.0"
83
84
  },