@backstage/plugin-bitbucket-cloud-common 0.3.5-next.0 → 0.3.5

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,33 @@
1
1
  # @backstage/plugin-bitbucket-cloud-common
2
2
 
3
+ ## 0.3.5
4
+
5
+ ### Patch Changes
6
+
7
+ - 37fba1d: Added support for Bitbucket Cloud OAuth. This introduces an alternative authentication method using a workspace OAuth consumer, alongside App Passwords (deprecated) and API tokens. OAuth does not require a bot or service account and avoids token expiry issues.
8
+
9
+ **BREAKING CHANGES**
10
+
11
+ - **@backstage/integration** (`src/bitbucketCloud/core.ts`)
12
+
13
+ - `getBitbucketCloudRequestOptions` now returns a `Promise` and **must** be awaited.
14
+
15
+ - **@backstage/plugin-scaffolder-backend-module-bitbucket-cloud** (`src/actions/helpers.ts`)
16
+ - `getBitbucketClient` now returns a `Promise` and **must** be awaited.
17
+ - `getAuthorizationHeader` now returns a `Promise` and **must** be awaited.
18
+
19
+ **OAuth usage example**
20
+
21
+ ```yaml
22
+ integrations:
23
+ bitbucketCloud:
24
+ - clientId: client-id
25
+ clientSecret: client-secret
26
+ ```
27
+
28
+ - Updated dependencies
29
+ - @backstage/integration@1.19.0
30
+
3
31
  ## 0.3.5-next.0
4
32
 
5
33
  ### Patch Changes
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var integration = require('@backstage/integration');
3
4
  var fetch = require('cross-fetch');
4
5
  var pagination = require('./pagination.cjs.js');
5
6
 
@@ -83,19 +84,26 @@ class BitbucketCloudClient {
83
84
  return this.request(new fetch.Request(url.toString(), { method: "GET" }));
84
85
  }
85
86
  async request(req) {
86
- return fetch__default.default(req, { headers: this.getAuthHeaders() }).then(
87
- (response) => {
88
- if (!response.ok) {
89
- throw new Error(
90
- `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`
91
- );
92
- }
93
- return response;
87
+ const headers = await this.getAuthHeaders();
88
+ return fetch__default.default(req, { headers }).then((response) => {
89
+ if (!response.ok) {
90
+ throw new Error(
91
+ `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`
92
+ );
94
93
  }
95
- );
94
+ return response;
95
+ });
96
96
  }
97
- getAuthHeaders() {
97
+ async getAuthHeaders() {
98
98
  const headers = {};
99
+ if (this.config.clientId && this.config.clientSecret) {
100
+ const token = await integration.getBitbucketCloudOAuthToken(
101
+ this.config.clientId,
102
+ this.config.clientSecret
103
+ );
104
+ headers.Authorization = `Bearer ${token}`;
105
+ return headers;
106
+ }
99
107
  if (this.config.username && (this.config.token ?? this.config.appPassword)) {
100
108
  const buffer = Buffer.from(
101
109
  `${this.config.username}:${this.config.token ?? this.config.appPassword}`,
@@ -1 +1 @@
1
- {"version":3,"file":"BitbucketCloudClient.cjs.js","sources":["../src/BitbucketCloudClient.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 { BitbucketCloudIntegrationConfig } from '@backstage/integration';\nimport fetch, { Request } from 'cross-fetch';\nimport { Models } from './models';\nimport { WithPagination } from './pagination';\nimport {\n FilterAndSortOptions,\n PartialResponseOptions,\n RequestOptions,\n} from './types';\n\n/** @public */\nexport class BitbucketCloudClient {\n static fromConfig(\n config: BitbucketCloudIntegrationConfig,\n ): BitbucketCloudClient {\n return new BitbucketCloudClient(config);\n }\n\n private constructor(\n private readonly config: BitbucketCloudIntegrationConfig,\n ) {}\n\n searchCode(\n workspace: string,\n query: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n pagelen?: number,\n ): WithPagination<Models.SearchResultPage, Models.SearchCodeSearchResult> {\n const workspaceEnc = encodeURIComponent(workspace);\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/workspaces/${workspaceEnc}/search/code`, {\n ...paginationOptions,\n ...options,\n search_query: query,\n }),\n url => this.getTypeMapped(url),\n pagelen,\n );\n }\n\n listRepositoriesByWorkspace(\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedRepositories, Models.Repository> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/repositories/${workspaceEnc}`, {\n ...paginationOptions,\n ...options,\n }),\n url => this.getTypeMapped(url),\n );\n }\n\n listProjectsByWorkspace(\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedProjects, Models.Project> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/workspaces/${workspaceEnc}/projects`, {\n ...paginationOptions,\n ...options,\n }),\n url => this.getTypeMapped(url),\n );\n }\n\n listWorkspaces(\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedWorkspaces, Models.Workspace> {\n return new WithPagination(\n paginationOptions =>\n this.createUrl('/workspaces', { ...paginationOptions, ...options }),\n url => this.getTypeMapped(url),\n );\n }\n\n listBranchesByRepository(\n repository: string,\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedBranches, Models.Branch> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(\n `/repositories/${workspaceEnc}/${repository}/refs/branches`,\n {\n ...paginationOptions,\n ...options,\n },\n ),\n url => this.getTypeMapped(url),\n );\n }\n\n private createUrl(endpoint: string, options?: RequestOptions): URL {\n const request = new URL(this.config.apiBaseUrl + endpoint);\n for (const key in options) {\n if (options[key]) {\n request.searchParams.append(key, options[key]!.toString());\n }\n }\n\n return request;\n }\n\n private async getTypeMapped<T = any>(url: URL): Promise<T> {\n return this.get(url).then(\n (response: Response) => response.json() as Promise<T>,\n );\n }\n\n private async get(url: URL): Promise<Response> {\n return this.request(new Request(url.toString(), { method: 'GET' }));\n }\n\n private async request(req: Request): Promise<Response> {\n return fetch(req, { headers: this.getAuthHeaders() }).then(\n (response: Response) => {\n if (!response.ok) {\n throw new Error(\n `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`,\n );\n }\n\n return response;\n },\n );\n }\n\n private getAuthHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (\n this.config.username &&\n (this.config.token ?? this.config.appPassword)\n ) {\n const buffer = Buffer.from(\n `${this.config.username}:${\n this.config.token ?? this.config.appPassword\n }`,\n 'utf8',\n );\n headers.Authorization = `Basic ${buffer.toString('base64')}`;\n }\n\n return headers;\n }\n}\n"],"names":["WithPagination","Request","fetch"],"mappings":"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"}
1
+ {"version":3,"file":"BitbucketCloudClient.cjs.js","sources":["../src/BitbucketCloudClient.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 BitbucketCloudIntegrationConfig,\n getBitbucketCloudOAuthToken,\n} from '@backstage/integration';\nimport fetch, { Request } from 'cross-fetch';\nimport { Models } from './models';\nimport { WithPagination } from './pagination';\nimport {\n FilterAndSortOptions,\n PartialResponseOptions,\n RequestOptions,\n} from './types';\n\n/** @public */\nexport class BitbucketCloudClient {\n static fromConfig(\n config: BitbucketCloudIntegrationConfig,\n ): BitbucketCloudClient {\n return new BitbucketCloudClient(config);\n }\n\n private constructor(\n private readonly config: BitbucketCloudIntegrationConfig,\n ) {}\n\n searchCode(\n workspace: string,\n query: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n pagelen?: number,\n ): WithPagination<Models.SearchResultPage, Models.SearchCodeSearchResult> {\n const workspaceEnc = encodeURIComponent(workspace);\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/workspaces/${workspaceEnc}/search/code`, {\n ...paginationOptions,\n ...options,\n search_query: query,\n }),\n url => this.getTypeMapped(url),\n pagelen,\n );\n }\n\n listRepositoriesByWorkspace(\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedRepositories, Models.Repository> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/repositories/${workspaceEnc}`, {\n ...paginationOptions,\n ...options,\n }),\n url => this.getTypeMapped(url),\n );\n }\n\n listProjectsByWorkspace(\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedProjects, Models.Project> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/workspaces/${workspaceEnc}/projects`, {\n ...paginationOptions,\n ...options,\n }),\n url => this.getTypeMapped(url),\n );\n }\n\n listWorkspaces(\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedWorkspaces, Models.Workspace> {\n return new WithPagination(\n paginationOptions =>\n this.createUrl('/workspaces', { ...paginationOptions, ...options }),\n url => this.getTypeMapped(url),\n );\n }\n\n listBranchesByRepository(\n repository: string,\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedBranches, Models.Branch> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(\n `/repositories/${workspaceEnc}/${repository}/refs/branches`,\n {\n ...paginationOptions,\n ...options,\n },\n ),\n url => this.getTypeMapped(url),\n );\n }\n\n private createUrl(endpoint: string, options?: RequestOptions): URL {\n const request = new URL(this.config.apiBaseUrl + endpoint);\n for (const key in options) {\n if (options[key]) {\n request.searchParams.append(key, options[key]!.toString());\n }\n }\n\n return request;\n }\n\n private async getTypeMapped<T = any>(url: URL): Promise<T> {\n return this.get(url).then(\n (response: Response) => response.json() as Promise<T>,\n );\n }\n\n private async get(url: URL): Promise<Response> {\n return this.request(new Request(url.toString(), { method: 'GET' }));\n }\n\n private async request(req: Request): Promise<Response> {\n const headers = await this.getAuthHeaders();\n return fetch(req, { headers }).then((response: Response) => {\n if (!response.ok) {\n throw new Error(\n `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`,\n );\n }\n\n return response;\n });\n }\n\n private async getAuthHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n\n // OAuth authentication (clientId/clientSecret)\n if (this.config.clientId && this.config.clientSecret) {\n const token = await getBitbucketCloudOAuthToken(\n this.config.clientId,\n this.config.clientSecret,\n );\n headers.Authorization = `Bearer ${token}`;\n return headers;\n }\n\n // Basic authentication (username/token or username/appPassword)\n if (\n this.config.username &&\n (this.config.token ?? this.config.appPassword)\n ) {\n const buffer = Buffer.from(\n `${this.config.username}:${\n this.config.token ?? this.config.appPassword\n }`,\n 'utf8',\n );\n headers.Authorization = `Basic ${buffer.toString('base64')}`;\n }\n\n return headers;\n }\n}\n"],"names":["WithPagination","Request","fetch","getBitbucketCloudOAuthToken"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { getBitbucketCloudOAuthToken } from '@backstage/integration';
1
2
  import fetch, { Request } from 'cross-fetch';
2
3
  import { WithPagination } from './pagination.esm.js';
3
4
 
@@ -77,19 +78,26 @@ class BitbucketCloudClient {
77
78
  return this.request(new Request(url.toString(), { method: "GET" }));
78
79
  }
79
80
  async request(req) {
80
- return fetch(req, { headers: this.getAuthHeaders() }).then(
81
- (response) => {
82
- if (!response.ok) {
83
- throw new Error(
84
- `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`
85
- );
86
- }
87
- return response;
81
+ const headers = await this.getAuthHeaders();
82
+ return fetch(req, { headers }).then((response) => {
83
+ if (!response.ok) {
84
+ throw new Error(
85
+ `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`
86
+ );
88
87
  }
89
- );
88
+ return response;
89
+ });
90
90
  }
91
- getAuthHeaders() {
91
+ async getAuthHeaders() {
92
92
  const headers = {};
93
+ if (this.config.clientId && this.config.clientSecret) {
94
+ const token = await getBitbucketCloudOAuthToken(
95
+ this.config.clientId,
96
+ this.config.clientSecret
97
+ );
98
+ headers.Authorization = `Bearer ${token}`;
99
+ return headers;
100
+ }
93
101
  if (this.config.username && (this.config.token ?? this.config.appPassword)) {
94
102
  const buffer = Buffer.from(
95
103
  `${this.config.username}:${this.config.token ?? this.config.appPassword}`,
@@ -1 +1 @@
1
- {"version":3,"file":"BitbucketCloudClient.esm.js","sources":["../src/BitbucketCloudClient.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 { BitbucketCloudIntegrationConfig } from '@backstage/integration';\nimport fetch, { Request } from 'cross-fetch';\nimport { Models } from './models';\nimport { WithPagination } from './pagination';\nimport {\n FilterAndSortOptions,\n PartialResponseOptions,\n RequestOptions,\n} from './types';\n\n/** @public */\nexport class BitbucketCloudClient {\n static fromConfig(\n config: BitbucketCloudIntegrationConfig,\n ): BitbucketCloudClient {\n return new BitbucketCloudClient(config);\n }\n\n private constructor(\n private readonly config: BitbucketCloudIntegrationConfig,\n ) {}\n\n searchCode(\n workspace: string,\n query: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n pagelen?: number,\n ): WithPagination<Models.SearchResultPage, Models.SearchCodeSearchResult> {\n const workspaceEnc = encodeURIComponent(workspace);\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/workspaces/${workspaceEnc}/search/code`, {\n ...paginationOptions,\n ...options,\n search_query: query,\n }),\n url => this.getTypeMapped(url),\n pagelen,\n );\n }\n\n listRepositoriesByWorkspace(\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedRepositories, Models.Repository> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/repositories/${workspaceEnc}`, {\n ...paginationOptions,\n ...options,\n }),\n url => this.getTypeMapped(url),\n );\n }\n\n listProjectsByWorkspace(\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedProjects, Models.Project> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/workspaces/${workspaceEnc}/projects`, {\n ...paginationOptions,\n ...options,\n }),\n url => this.getTypeMapped(url),\n );\n }\n\n listWorkspaces(\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedWorkspaces, Models.Workspace> {\n return new WithPagination(\n paginationOptions =>\n this.createUrl('/workspaces', { ...paginationOptions, ...options }),\n url => this.getTypeMapped(url),\n );\n }\n\n listBranchesByRepository(\n repository: string,\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedBranches, Models.Branch> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(\n `/repositories/${workspaceEnc}/${repository}/refs/branches`,\n {\n ...paginationOptions,\n ...options,\n },\n ),\n url => this.getTypeMapped(url),\n );\n }\n\n private createUrl(endpoint: string, options?: RequestOptions): URL {\n const request = new URL(this.config.apiBaseUrl + endpoint);\n for (const key in options) {\n if (options[key]) {\n request.searchParams.append(key, options[key]!.toString());\n }\n }\n\n return request;\n }\n\n private async getTypeMapped<T = any>(url: URL): Promise<T> {\n return this.get(url).then(\n (response: Response) => response.json() as Promise<T>,\n );\n }\n\n private async get(url: URL): Promise<Response> {\n return this.request(new Request(url.toString(), { method: 'GET' }));\n }\n\n private async request(req: Request): Promise<Response> {\n return fetch(req, { headers: this.getAuthHeaders() }).then(\n (response: Response) => {\n if (!response.ok) {\n throw new Error(\n `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`,\n );\n }\n\n return response;\n },\n );\n }\n\n private getAuthHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (\n this.config.username &&\n (this.config.token ?? this.config.appPassword)\n ) {\n const buffer = Buffer.from(\n `${this.config.username}:${\n this.config.token ?? this.config.appPassword\n }`,\n 'utf8',\n );\n headers.Authorization = `Basic ${buffer.toString('base64')}`;\n }\n\n return headers;\n }\n}\n"],"names":[],"mappings":";;;AA2BO,MAAM,oBAAA,CAAqB;AAAA,EAOxB,YACW,MAAA,EACjB;AADiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAChB;AAAA,EARH,OAAO,WACL,MAAA,EACsB;AACtB,IAAA,OAAO,IAAI,qBAAqB,MAAM,CAAA;AAAA,EACxC;AAAA,EAMA,UAAA,CACE,SAAA,EACA,KAAA,EACA,OAAA,EACA,OAAA,EACwE;AACxE,IAAA,MAAM,YAAA,GAAe,mBAAmB,SAAS,CAAA;AACjD,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,CAAA,iBAAA,KACE,IAAA,CAAK,SAAA,CAAU,CAAA,YAAA,EAAe,YAAY,CAAA,YAAA,CAAA,EAAgB;AAAA,QACxD,GAAG,iBAAA;AAAA,QACH,GAAG,OAAA;AAAA,QACH,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACH,CAAA,GAAA,KAAO,IAAA,CAAK,aAAA,CAAc,GAAG,CAAA;AAAA,MAC7B;AAAA,KACF;AAAA,EACF;AAAA,EAEA,2BAAA,CACE,WACA,OAAA,EACiE;AACjE,IAAA,MAAM,YAAA,GAAe,mBAAmB,SAAS,CAAA;AAEjD,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,CAAA,iBAAA,KACE,IAAA,CAAK,SAAA,CAAU,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA,EAAI;AAAA,QAC9C,GAAG,iBAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA,MACH,CAAA,GAAA,KAAO,IAAA,CAAK,aAAA,CAAc,GAAG;AAAA,KAC/B;AAAA,EACF;AAAA,EAEA,uBAAA,CACE,WACA,OAAA,EAC0D;AAC1D,IAAA,MAAM,YAAA,GAAe,mBAAmB,SAAS,CAAA;AAEjD,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,CAAA,iBAAA,KACE,IAAA,CAAK,SAAA,CAAU,CAAA,YAAA,EAAe,YAAY,CAAA,SAAA,CAAA,EAAa;AAAA,QACrD,GAAG,iBAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAAA,MACH,CAAA,GAAA,KAAO,IAAA,CAAK,aAAA,CAAc,GAAG;AAAA,KAC/B;AAAA,EACF;AAAA,EAEA,eACE,OAAA,EAC8D;AAC9D,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,CAAA,iBAAA,KACE,KAAK,SAAA,CAAU,aAAA,EAAe,EAAE,GAAG,iBAAA,EAAmB,GAAG,OAAA,EAAS,CAAA;AAAA,MACpE,CAAA,GAAA,KAAO,IAAA,CAAK,aAAA,CAAc,GAAG;AAAA,KAC/B;AAAA,EACF;AAAA,EAEA,wBAAA,CACE,UAAA,EACA,SAAA,EACA,OAAA,EACyD;AACzD,IAAA,MAAM,YAAA,GAAe,mBAAmB,SAAS,CAAA;AAEjD,IAAA,OAAO,IAAI,cAAA;AAAA,MACT,uBACE,IAAA,CAAK,SAAA;AAAA,QACH,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA,EAAI,UAAU,CAAA,cAAA,CAAA;AAAA,QAC3C;AAAA,UACE,GAAG,iBAAA;AAAA,UACH,GAAG;AAAA;AACL,OACF;AAAA,MACF,CAAA,GAAA,KAAO,IAAA,CAAK,aAAA,CAAc,GAAG;AAAA,KAC/B;AAAA,EACF;AAAA,EAEQ,SAAA,CAAU,UAAkB,OAAA,EAA+B;AACjE,IAAA,MAAM,UAAU,IAAI,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,aAAa,QAAQ,CAAA;AACzD,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,QAAA,OAAA,CAAQ,aAAa,MAAA,CAAO,GAAA,EAAK,QAAQ,GAAG,CAAA,CAAG,UAAU,CAAA;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,cAAuB,GAAA,EAAsB;AACzD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,CAAE,IAAA;AAAA,MACnB,CAAC,QAAA,KAAuB,QAAA,CAAS,IAAA;AAAK,KACxC;AAAA,EACF;AAAA,EAEA,MAAc,IAAI,GAAA,EAA6B;AAC7C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAS,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAC,CAAA;AAAA,EACpE;AAAA,EAEA,MAAc,QAAQ,GAAA,EAAiC;AACrD,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,OAAA,EAAS,KAAK,cAAA,EAAe,EAAG,CAAA,CAAE,IAAA;AAAA,MACpD,CAAC,QAAA,KAAuB;AACtB,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,wBAAA,EAA2B,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,GAAG,CAAA,uBAAA,EAA0B,QAAA,CAAS,MAAM,CAAA,GAAA,EAAM,QAAA,CAAS,UAAU,CAAA;AAAA,WACpH;AAAA,QACF;AAEA,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,cAAA,GAAyC;AAC/C,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,IACE,IAAA,CAAK,OAAO,QAAA,KACX,IAAA,CAAK,OAAO,KAAA,IAAS,IAAA,CAAK,OAAO,WAAA,CAAA,EAClC;AACA,MAAA,MAAM,SAAS,MAAA,CAAO,IAAA;AAAA,QACpB,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAA,EACrB,KAAK,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,WACnC,CAAA,CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAA,CAAQ,aAAA,GAAgB,CAAA,MAAA,EAAS,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;;;;"}
1
+ {"version":3,"file":"BitbucketCloudClient.esm.js","sources":["../src/BitbucketCloudClient.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 BitbucketCloudIntegrationConfig,\n getBitbucketCloudOAuthToken,\n} from '@backstage/integration';\nimport fetch, { Request } from 'cross-fetch';\nimport { Models } from './models';\nimport { WithPagination } from './pagination';\nimport {\n FilterAndSortOptions,\n PartialResponseOptions,\n RequestOptions,\n} from './types';\n\n/** @public */\nexport class BitbucketCloudClient {\n static fromConfig(\n config: BitbucketCloudIntegrationConfig,\n ): BitbucketCloudClient {\n return new BitbucketCloudClient(config);\n }\n\n private constructor(\n private readonly config: BitbucketCloudIntegrationConfig,\n ) {}\n\n searchCode(\n workspace: string,\n query: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n pagelen?: number,\n ): WithPagination<Models.SearchResultPage, Models.SearchCodeSearchResult> {\n const workspaceEnc = encodeURIComponent(workspace);\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/workspaces/${workspaceEnc}/search/code`, {\n ...paginationOptions,\n ...options,\n search_query: query,\n }),\n url => this.getTypeMapped(url),\n pagelen,\n );\n }\n\n listRepositoriesByWorkspace(\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedRepositories, Models.Repository> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/repositories/${workspaceEnc}`, {\n ...paginationOptions,\n ...options,\n }),\n url => this.getTypeMapped(url),\n );\n }\n\n listProjectsByWorkspace(\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedProjects, Models.Project> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(`/workspaces/${workspaceEnc}/projects`, {\n ...paginationOptions,\n ...options,\n }),\n url => this.getTypeMapped(url),\n );\n }\n\n listWorkspaces(\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedWorkspaces, Models.Workspace> {\n return new WithPagination(\n paginationOptions =>\n this.createUrl('/workspaces', { ...paginationOptions, ...options }),\n url => this.getTypeMapped(url),\n );\n }\n\n listBranchesByRepository(\n repository: string,\n workspace: string,\n options?: FilterAndSortOptions & PartialResponseOptions,\n ): WithPagination<Models.PaginatedBranches, Models.Branch> {\n const workspaceEnc = encodeURIComponent(workspace);\n\n return new WithPagination(\n paginationOptions =>\n this.createUrl(\n `/repositories/${workspaceEnc}/${repository}/refs/branches`,\n {\n ...paginationOptions,\n ...options,\n },\n ),\n url => this.getTypeMapped(url),\n );\n }\n\n private createUrl(endpoint: string, options?: RequestOptions): URL {\n const request = new URL(this.config.apiBaseUrl + endpoint);\n for (const key in options) {\n if (options[key]) {\n request.searchParams.append(key, options[key]!.toString());\n }\n }\n\n return request;\n }\n\n private async getTypeMapped<T = any>(url: URL): Promise<T> {\n return this.get(url).then(\n (response: Response) => response.json() as Promise<T>,\n );\n }\n\n private async get(url: URL): Promise<Response> {\n return this.request(new Request(url.toString(), { method: 'GET' }));\n }\n\n private async request(req: Request): Promise<Response> {\n const headers = await this.getAuthHeaders();\n return fetch(req, { headers }).then((response: Response) => {\n if (!response.ok) {\n throw new Error(\n `Unexpected response for ${req.method} ${req.url}. Expected 200 but got ${response.status} - ${response.statusText}`,\n );\n }\n\n return response;\n });\n }\n\n private async getAuthHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {};\n\n // OAuth authentication (clientId/clientSecret)\n if (this.config.clientId && this.config.clientSecret) {\n const token = await getBitbucketCloudOAuthToken(\n this.config.clientId,\n this.config.clientSecret,\n );\n headers.Authorization = `Bearer ${token}`;\n return headers;\n }\n\n // Basic authentication (username/token or username/appPassword)\n if (\n this.config.username &&\n (this.config.token ?? this.config.appPassword)\n ) {\n const buffer = Buffer.from(\n `${this.config.username}:${\n this.config.token ?? this.config.appPassword\n }`,\n 'utf8',\n );\n headers.Authorization = `Basic ${buffer.toString('base64')}`;\n }\n\n return headers;\n }\n}\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -687,4 +687,5 @@ declare namespace Events {
687
687
  }
688
688
  }
689
689
 
690
- export { BitbucketCloudClient, Events, type FilterAndSortOptions, Models, type PaginationOptions, type PartialResponseOptions, type RequestOptions, WithPagination };
690
+ export { BitbucketCloudClient, Events, Models, WithPagination };
691
+ export type { FilterAndSortOptions, PaginationOptions, PartialResponseOptions, RequestOptions };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-bitbucket-cloud-common",
3
- "version": "0.3.5-next.0",
3
+ "version": "0.3.5",
4
4
  "description": "Common functionalities for bitbucket-cloud plugins",
5
5
  "backstage": {
6
6
  "role": "common-library",
@@ -41,11 +41,11 @@
41
41
  "update-models": "yarn refresh-schema && yarn generate-models && yarn reduce-models"
42
42
  },
43
43
  "dependencies": {
44
- "@backstage/integration": "1.18.3-next.0",
44
+ "@backstage/integration": "^1.19.0",
45
45
  "cross-fetch": "^4.0.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@backstage/cli": "0.34.6-next.0",
48
+ "@backstage/cli": "^0.35.0",
49
49
  "@openapitools/openapi-generator-cli": "^2.4.26",
50
50
  "msw": "^1.0.0",
51
51
  "ts-morph": "^24.0.0"