diff --git a/.changeset/olive-mails-tell.md b/.changeset/olive-mails-tell.md new file mode 100644 index 0000000000..763338c6ff --- /dev/null +++ b/.changeset/olive-mails-tell.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-azure-devops': patch +'@backstage/plugin-devtools': patch +'@backstage/plugin-linguist': patch +--- + +Updated to use `fetchApi` as per [ADR013](https://backstage.io/docs/architecture-decisions/adrs-adr013) diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index cfff4348ee..3eeb4d8dca 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -12,6 +12,7 @@ import { BuildRunOptions } from '@backstage/plugin-azure-devops-common'; import { DashboardPullRequest } from '@backstage/plugin-azure-devops-common'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { Entity } from '@backstage/catalog-model'; +import { FetchApi } from '@backstage/core-plugin-api'; import { GitTag } from '@backstage/plugin-azure-devops-common'; import { IdentityApi } from '@backstage/core-plugin-api'; import { JSX as JSX_2 } from 'react'; @@ -124,6 +125,7 @@ export class AzureDevOpsClient implements AzureDevOpsApi { constructor(options: { discoveryApi: DiscoveryApi; identityApi: IdentityApi; + fetchApi: FetchApi; }); // (undocumented) getAllTeams(): Promise; diff --git a/plugins/azure-devops/src/alpha/plugin.tsx b/plugins/azure-devops/src/alpha/plugin.tsx index 40305c1714..54ac3469be 100644 --- a/plugins/azure-devops/src/alpha/plugin.tsx +++ b/plugins/azure-devops/src/alpha/plugin.tsx @@ -21,6 +21,7 @@ import { createPageExtension, createPlugin, discoveryApiRef, + fetchApiRef, identityApiRef, } from '@backstage/frontend-plugin-api'; import { azureDevOpsApiRef, AzureDevOpsClient } from '../api'; @@ -38,9 +39,13 @@ import { azurePullRequestDashboardRouteRef } from '../routes'; export const azureDevOpsApi = createApiExtension({ factory: createApiFactory({ api: azureDevOpsApiRef, - deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, - factory: ({ discoveryApi, identityApi }) => - new AzureDevOpsClient({ discoveryApi, identityApi }), + deps: { + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ discoveryApi, identityApi, fetchApi }) => + new AzureDevOpsClient({ discoveryApi, identityApi, fetchApi }), }), }); diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index 76e38b064c..f7f3564563 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -27,7 +27,11 @@ import { RepoBuildOptions, Team, } from '@backstage/plugin-azure-devops-common'; -import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +import { + DiscoveryApi, + FetchApi, + IdentityApi, +} from '@backstage/core-plugin-api'; import { ResponseError } from '@backstage/errors'; import { AzureDevOpsApi } from './AzureDevOpsApi'; @@ -35,13 +39,16 @@ import { AzureDevOpsApi } from './AzureDevOpsApi'; export class AzureDevOpsClient implements AzureDevOpsApi { private readonly discoveryApi: DiscoveryApi; private readonly identityApi: IdentityApi; + private readonly fetchApi: FetchApi; public constructor(options: { discoveryApi: DiscoveryApi; identityApi: IdentityApi; + fetchApi: FetchApi; }) { this.discoveryApi = options.discoveryApi; this.identityApi = options.identityApi; + this.fetchApi = options.fetchApi; } public async getRepoBuilds( @@ -201,7 +208,7 @@ export class AzureDevOpsClient implements AzureDevOpsApi { const url = new URL(path, baseUrl); const { token: idToken } = await this.identityApi.getCredentials(); - const response = await fetch(url.toString(), { + const response = await this.fetchApi.fetch(url.toString(), { headers: idToken ? { Authorization: `Bearer ${idToken}` } : {}, }); diff --git a/plugins/azure-devops/src/plugin.ts b/plugins/azure-devops/src/plugin.ts index 1e76c9e53a..e06ea8f5e0 100644 --- a/plugins/azure-devops/src/plugin.ts +++ b/plugins/azure-devops/src/plugin.ts @@ -27,6 +27,7 @@ import { createComponentExtension, discoveryApiRef, identityApiRef, + fetchApiRef, } from '@backstage/core-plugin-api'; import { AzureDevOpsClient } from './api/AzureDevOpsClient'; @@ -56,9 +57,13 @@ export const azureDevOpsPlugin = createPlugin({ apis: [ createApiFactory({ api: azureDevOpsApiRef, - deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, - factory: ({ discoveryApi, identityApi }) => - new AzureDevOpsClient({ discoveryApi, identityApi }), + deps: { + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ discoveryApi, identityApi, fetchApi }) => + new AzureDevOpsClient({ discoveryApi, identityApi, fetchApi }), }), ], }); diff --git a/plugins/devtools/src/alpha/plugin.tsx b/plugins/devtools/src/alpha/plugin.tsx index 746b90a50f..1854fbfbd9 100644 --- a/plugins/devtools/src/alpha/plugin.tsx +++ b/plugins/devtools/src/alpha/plugin.tsx @@ -22,6 +22,7 @@ import { createPageExtension, createPlugin, discoveryApiRef, + fetchApiRef, identityApiRef, } from '@backstage/frontend-plugin-api'; @@ -37,9 +38,13 @@ import { rootRouteRef } from '../routes'; export const devToolsApi = createApiExtension({ factory: createApiFactory({ api: devToolsApiRef, - deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, - factory: ({ discoveryApi, identityApi }) => - new DevToolsClient({ discoveryApi, identityApi }), + deps: { + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ discoveryApi, identityApi, fetchApi }) => + new DevToolsClient({ discoveryApi, identityApi, fetchApi }), }), }); diff --git a/plugins/devtools/src/api/DevToolsClient.ts b/plugins/devtools/src/api/DevToolsClient.ts index 0be8294b3f..1702333363 100644 --- a/plugins/devtools/src/api/DevToolsClient.ts +++ b/plugins/devtools/src/api/DevToolsClient.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +import { + DiscoveryApi, + FetchApi, + IdentityApi, +} from '@backstage/core-plugin-api'; import { ConfigInfo, DevToolsInfo, @@ -26,13 +30,16 @@ import { DevToolsApi } from './DevToolsApi'; export class DevToolsClient implements DevToolsApi { private readonly discoveryApi: DiscoveryApi; private readonly identityApi: IdentityApi; + private readonly fetchApi: FetchApi; public constructor(options: { discoveryApi: DiscoveryApi; identityApi: IdentityApi; + fetchApi: FetchApi; }) { this.discoveryApi = options.discoveryApi; this.identityApi = options.identityApi; + this.fetchApi = options.fetchApi; } public async getConfig(): Promise { @@ -65,7 +72,7 @@ export class DevToolsClient implements DevToolsApi { const url = new URL(path, baseUrl); const { token } = await this.identityApi.getCredentials(); - const response = await fetch(url.toString(), { + const response = await this.fetchApi.fetch(url.toString(), { headers: token ? { Authorization: `Bearer ${token}` } : {}, }); diff --git a/plugins/devtools/src/plugin.ts b/plugins/devtools/src/plugin.ts index df2aca3447..8bf61b1fba 100644 --- a/plugins/devtools/src/plugin.ts +++ b/plugins/devtools/src/plugin.ts @@ -19,6 +19,7 @@ import { createPlugin, createRoutableExtension, discoveryApiRef, + fetchApiRef, identityApiRef, } from '@backstage/core-plugin-api'; import { devToolsApiRef, DevToolsClient } from './api'; @@ -31,9 +32,13 @@ export const devToolsPlugin = createPlugin({ apis: [ createApiFactory({ api: devToolsApiRef, - deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, - factory: ({ discoveryApi, identityApi }) => - new DevToolsClient({ discoveryApi, identityApi }), + deps: { + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ discoveryApi, identityApi, fetchApi }) => + new DevToolsClient({ discoveryApi, identityApi, fetchApi }), }), ], routes: { diff --git a/plugins/linguist/src/alpha/plugin.tsx b/plugins/linguist/src/alpha/plugin.tsx index 36d635740f..fc552de26c 100644 --- a/plugins/linguist/src/alpha/plugin.tsx +++ b/plugins/linguist/src/alpha/plugin.tsx @@ -20,6 +20,7 @@ import { createApiFactory, createPlugin, discoveryApiRef, + fetchApiRef, identityApiRef, } from '@backstage/frontend-plugin-api'; @@ -40,9 +41,13 @@ export const entityLinguistCard = createEntityCardExtension({ export const linguistApi = createApiExtension({ factory: createApiFactory({ api: linguistApiRef, - deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, - factory: ({ discoveryApi, identityApi }) => - new LinguistClient({ discoveryApi, identityApi }), + deps: { + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ discoveryApi, identityApi, fetchApi }) => + new LinguistClient({ discoveryApi, identityApi, fetchApi }), }), }); diff --git a/plugins/linguist/src/api/LinguistClient.ts b/plugins/linguist/src/api/LinguistClient.ts index 3e327ff21e..0a8e547ccc 100644 --- a/plugins/linguist/src/api/LinguistClient.ts +++ b/plugins/linguist/src/api/LinguistClient.ts @@ -14,7 +14,11 @@ * limitations under the License. */ -import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +import { + DiscoveryApi, + FetchApi, + IdentityApi, +} from '@backstage/core-plugin-api'; import { ResponseError } from '@backstage/errors'; import { Languages } from '@backstage/plugin-linguist-common'; import { LinguistApi } from './LinguistApi'; @@ -22,13 +26,16 @@ import { LinguistApi } from './LinguistApi'; export class LinguistClient implements LinguistApi { private readonly discoveryApi: DiscoveryApi; private readonly identityApi: IdentityApi; + private readonly fetchApi: FetchApi; public constructor(options: { discoveryApi: DiscoveryApi; identityApi: IdentityApi; + fetchApi: FetchApi; }) { this.discoveryApi = options.discoveryApi; this.identityApi = options.identityApi; + this.fetchApi = options.fetchApi; } public async getLanguages(entityRef: string): Promise { @@ -46,7 +53,7 @@ export class LinguistClient implements LinguistApi { const url = new URL(path, baseUrl); const { token } = await this.identityApi.getCredentials(); - const response = await fetch(url.toString(), { + const response = await this.fetchApi.fetch(url.toString(), { headers: token ? { Authorization: `Bearer ${token}` } : {}, }); diff --git a/plugins/linguist/src/plugin.ts b/plugins/linguist/src/plugin.ts index 917a13ca9a..e93dc5eaa7 100644 --- a/plugins/linguist/src/plugin.ts +++ b/plugins/linguist/src/plugin.ts @@ -19,6 +19,7 @@ import { createComponentExtension, createPlugin, discoveryApiRef, + fetchApiRef, identityApiRef, } from '@backstage/core-plugin-api'; import { linguistApiRef, LinguistClient } from './api'; @@ -35,9 +36,13 @@ export const linguistPlugin = createPlugin({ apis: [ createApiFactory({ api: linguistApiRef, - deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, - factory: ({ discoveryApi, identityApi }) => - new LinguistClient({ discoveryApi, identityApi }), + deps: { + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ discoveryApi, identityApi, fetchApi }) => + new LinguistClient({ discoveryApi, identityApi, fetchApi }), }), ], });