@backstage/plugin-techdocs 1.12.3-next.2 → 1.12.3
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 +161 -0
- package/dist/client.esm.js +1 -0
- package/dist/client.esm.js.map +1 -1
- package/package.json +24 -24
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,166 @@
|
|
|
1
1
|
# @backstage/plugin-techdocs
|
|
2
2
|
|
|
3
|
+
## 1.12.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- eb3d91a: Use the custom error page if provided for displaying errors instead of the default error page
|
|
8
|
+
- 524f0af: Add missing route ref to the `/alpha` entity content extension.
|
|
9
|
+
- f4be934: Changed the base URL in addLinkClickListener from window.location.origin to app.baseUrl for improved path handling. This fixes an issue where Backstage, when running on a subpath, was unable to handle non-Backstage URLs of the same origin correctly.
|
|
10
|
+
- 1f40e6b: Add optional props to `TechDocCustomHome` to allow for more flexibility:
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
import { TechDocsCustomHome } from '@backstage/plugin-techdocs';
|
|
14
|
+
//...
|
|
15
|
+
|
|
16
|
+
const options = { emptyRowsWhenPaging: false };
|
|
17
|
+
const linkDestination = (entity: Entity): string | undefined => {
|
|
18
|
+
return entity.metadata.annotations?.['external-docs'];
|
|
19
|
+
};
|
|
20
|
+
const techDocsTabsConfig = [
|
|
21
|
+
{
|
|
22
|
+
label: 'Recommended Documentation',
|
|
23
|
+
panels: [
|
|
24
|
+
{
|
|
25
|
+
title: 'Golden Path',
|
|
26
|
+
description: 'Documentation about standards to follow',
|
|
27
|
+
panelType: 'DocsCardGrid',
|
|
28
|
+
panelProps: { CustomHeader: () => <ContentHeader title='Golden Path'/> },
|
|
29
|
+
filterPredicate: entity =>
|
|
30
|
+
entity?.metadata?.tags?.includes('golden-path') ?? false,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
title: 'Recommended',
|
|
34
|
+
description: 'Useful documentation',
|
|
35
|
+
panelType: 'InfoCardGrid',
|
|
36
|
+
panelProps: {
|
|
37
|
+
CustomHeader: () => <ContentHeader title='Recommended' />
|
|
38
|
+
linkDestination: linkDestination,
|
|
39
|
+
},
|
|
40
|
+
filterPredicate: entity =>
|
|
41
|
+
entity?.metadata?.tags?.includes('recommended') ?? false,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
label: 'Browse All',
|
|
47
|
+
panels: [
|
|
48
|
+
{
|
|
49
|
+
description: 'Browse all docs',
|
|
50
|
+
filterPredicate: filterEntity,
|
|
51
|
+
panelType: 'TechDocsIndexPage',
|
|
52
|
+
title: 'All',
|
|
53
|
+
panelProps: { PageWrapper: React.Fragment, CustomHeader: React.Fragment, options: options },
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
|
|
59
|
+
const AppRoutes = () => {
|
|
60
|
+
<FlatRoutes>
|
|
61
|
+
<Route
|
|
62
|
+
path="/docs"
|
|
63
|
+
element={
|
|
64
|
+
<TechDocsCustomHome
|
|
65
|
+
tabsConfig={techDocsTabsConfig}
|
|
66
|
+
filter={{
|
|
67
|
+
kind: ['Location', 'Resource', 'Component'],
|
|
68
|
+
'metadata.annotations.featured-docs': CATALOG_FILTER_EXISTS,
|
|
69
|
+
}}
|
|
70
|
+
CustomPageWrapper={({ children }: React.PropsWithChildren<{}>) => (<PageWithHeader title="Docs" themeId="documentation">{children}</PageWithHeader>)}
|
|
71
|
+
/>
|
|
72
|
+
}
|
|
73
|
+
/>
|
|
74
|
+
</FlatRoutes>;
|
|
75
|
+
};
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Add new Grid option called `InfoCardGrid` which is a more customizable card option for the Docs grid.
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
<InfoCardGrid
|
|
82
|
+
entities={entities}
|
|
83
|
+
linkContent="Learn more"
|
|
84
|
+
linkDestination={entity => entity.metadata['external-docs']}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Expose existing `CustomDocsPanel` so that it can be used independently if desired.
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
const panels: PanelConfig[] = [
|
|
92
|
+
{
|
|
93
|
+
description: '',
|
|
94
|
+
filterPredicate: entity => {},
|
|
95
|
+
panelType: 'InfoCardGrid',
|
|
96
|
+
title: 'Standards',
|
|
97
|
+
panelProps: {
|
|
98
|
+
CustomHeader: () => <ContentHeader title='Recommended' />
|
|
99
|
+
linkDestination: linkDestination,
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
description: '',
|
|
104
|
+
filterPredicate: entity => {},
|
|
105
|
+
panelType: 'DocsCardGrid',
|
|
106
|
+
title: 'Contribute',
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
{
|
|
110
|
+
panels.map((config, index) => (
|
|
111
|
+
<CustomDocsPanel
|
|
112
|
+
key={index}
|
|
113
|
+
config={config}
|
|
114
|
+
entities={!!entities ? entities : []}
|
|
115
|
+
index={index}
|
|
116
|
+
/>
|
|
117
|
+
));
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
- 58ec9e7: Removed older versions of React packages as a preparatory step for upgrading to React 19. This commit does not introduce any functional changes, but removes dependencies on previous React versions, allowing for a cleaner upgrade path in subsequent commits.
|
|
122
|
+
- Updated dependencies
|
|
123
|
+
- @backstage/plugin-search-react@1.8.6
|
|
124
|
+
- @backstage/core-components@0.16.4
|
|
125
|
+
- @backstage/plugin-catalog-react@1.15.2
|
|
126
|
+
- @backstage/frontend-plugin-api@0.9.5
|
|
127
|
+
- @backstage/integration-react@1.2.4
|
|
128
|
+
- @backstage/core-compat-api@0.3.6
|
|
129
|
+
- @backstage/core-plugin-api@1.10.4
|
|
130
|
+
- @backstage/plugin-techdocs-react@1.2.14
|
|
131
|
+
- @backstage/plugin-auth-react@0.1.12
|
|
132
|
+
- @backstage/theme@0.6.4
|
|
133
|
+
- @backstage/catalog-client@1.9.1
|
|
134
|
+
- @backstage/catalog-model@1.7.3
|
|
135
|
+
- @backstage/config@1.3.2
|
|
136
|
+
- @backstage/errors@1.2.7
|
|
137
|
+
- @backstage/integration@1.16.1
|
|
138
|
+
- @backstage/plugin-search-common@1.2.17
|
|
139
|
+
- @backstage/plugin-techdocs-common@0.1.0
|
|
140
|
+
|
|
141
|
+
## 1.12.3-next.3
|
|
142
|
+
|
|
143
|
+
### Patch Changes
|
|
144
|
+
|
|
145
|
+
- Updated dependencies
|
|
146
|
+
- @backstage/frontend-plugin-api@0.9.5-next.3
|
|
147
|
+
- @backstage/core-compat-api@0.3.6-next.3
|
|
148
|
+
- @backstage/catalog-client@1.9.1
|
|
149
|
+
- @backstage/catalog-model@1.7.3
|
|
150
|
+
- @backstage/config@1.3.2
|
|
151
|
+
- @backstage/core-components@0.16.4-next.1
|
|
152
|
+
- @backstage/core-plugin-api@1.10.4-next.0
|
|
153
|
+
- @backstage/errors@1.2.7
|
|
154
|
+
- @backstage/integration@1.16.1
|
|
155
|
+
- @backstage/integration-react@1.2.4-next.0
|
|
156
|
+
- @backstage/theme@0.6.4-next.0
|
|
157
|
+
- @backstage/plugin-auth-react@0.1.12-next.1
|
|
158
|
+
- @backstage/plugin-catalog-react@1.15.2-next.3
|
|
159
|
+
- @backstage/plugin-search-common@1.2.17
|
|
160
|
+
- @backstage/plugin-search-react@1.8.6-next.3
|
|
161
|
+
- @backstage/plugin-techdocs-common@0.1.0
|
|
162
|
+
- @backstage/plugin-techdocs-react@1.2.14-next.1
|
|
163
|
+
|
|
3
164
|
## 1.12.3-next.2
|
|
4
165
|
|
|
5
166
|
### Patch Changes
|
package/dist/client.esm.js
CHANGED
package/dist/client.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.esm.js","sources":["../src/client.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { CompoundEntityRef } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport {\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { NotFoundError, ResponseError } from '@backstage/errors';\nimport {\n SyncResult,\n TechDocsApi,\n TechDocsEntityMetadata,\n TechDocsMetadata,\n TechDocsStorageApi,\n} from '@backstage/plugin-techdocs-react';\nimport { fetchEventSource } from '@microsoft/fetch-event-source';\n\n/**\n * API to talk to `techdocs-backend`.\n *\n * @public\n */\nexport class TechDocsClient implements TechDocsApi {\n public configApi: Config;\n public discoveryApi: DiscoveryApi;\n private fetchApi: FetchApi;\n\n constructor(options: {\n configApi: Config;\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n }) {\n this.configApi = options.configApi;\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n public async getCookie(): Promise<{ expiresAt: string }> {\n const apiOrigin = await this.getApiOrigin();\n const requestUrl = `${apiOrigin}/cookie`;\n const response = await this.fetchApi.fetch(`${requestUrl}`, {\n credentials: 'include',\n });\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n return await response.json();\n }\n\n async getApiOrigin(): Promise<string> {\n return await this.discoveryApi.getBaseUrl('techdocs');\n }\n\n /**\n * Retrieve TechDocs metadata.\n *\n * When docs are built, we generate a techdocs_metadata.json and store it along with the generated\n * static files. It includes necessary data about the docs site. This method requests techdocs-backend\n * which retrieves the TechDocs metadata.\n *\n * @param entityId - Object containing entity data like name, namespace, etc.\n */\n async getTechDocsMetadata(\n entityId: CompoundEntityRef,\n ): Promise<TechDocsMetadata> {\n const { kind, namespace, name } = entityId;\n\n const apiOrigin = await this.getApiOrigin();\n const requestUrl = `${apiOrigin}/metadata/techdocs/${namespace}/${kind}/${name}`;\n const request = await this.fetchApi.fetch(`${requestUrl}`);\n if (!request.ok) {\n throw await ResponseError.fromResponse(request);\n }\n\n return await request.json();\n }\n\n /**\n * Retrieve metadata about an entity.\n *\n * This method requests techdocs-backend which uses the catalog APIs to respond with filtered\n * information required here.\n *\n * @param entityId - Object containing entity data like name, namespace, etc.\n */\n async getEntityMetadata(\n entityId: CompoundEntityRef,\n ): Promise<TechDocsEntityMetadata> {\n const { kind, namespace, name } = entityId;\n\n const apiOrigin = await this.getApiOrigin();\n const requestUrl = `${apiOrigin}/metadata/entity/${namespace}/${kind}/${name}`;\n\n const request = await this.fetchApi.fetch(`${requestUrl}`);\n if (!request.ok) {\n throw await ResponseError.fromResponse(request);\n }\n\n return await request.json();\n }\n}\n\n/**\n * API which talks to TechDocs storage to fetch files to render.\n *\n * @public\n */\nexport class TechDocsStorageClient implements TechDocsStorageApi {\n public configApi: Config;\n public discoveryApi: DiscoveryApi;\n private fetchApi: FetchApi;\n\n constructor(options: {\n configApi: Config;\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n /** @deprecated identityApi is not needed any more */\n identityApi?: IdentityApi;\n }) {\n this.configApi = options.configApi;\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n async getApiOrigin(): Promise<string> {\n return await this.discoveryApi.getBaseUrl('techdocs');\n }\n\n async getStorageUrl(): Promise<string> {\n return (\n this.configApi.getOptionalString('techdocs.storageUrl') ??\n `${await this.discoveryApi.getBaseUrl('techdocs')}/static/docs`\n );\n }\n\n async getBuilder(): Promise<string> {\n return this.configApi.getOptionalString('techdocs.builder') || 'local';\n }\n\n /**\n * Fetch HTML content as text for an individual docs page in an entity's docs site.\n *\n * @param entityId - Object containing entity data like name, namespace, etc.\n * @param path - The unique path to an individual docs page e.g. overview/what-is-new\n * @returns HTML content of the docs page as string\n * @throws Throws error when the page is not found.\n */\n async getEntityDocs(\n entityId: CompoundEntityRef,\n path: string,\n ): Promise<string> {\n const { kind, namespace, name } = entityId;\n\n const storageUrl = await this.getStorageUrl();\n const url = `${storageUrl}/${namespace}/${kind}/${name}/${path}`;\n\n const request = await this.fetchApi.fetch(\n `${url.endsWith('/') ? url : `${url}/`}index.html`,\n );\n\n let errorMessage = '';\n switch (request.status) {\n case 404:\n errorMessage = 'Page not found. ';\n // path is empty for the home page of an entity's docs site\n if (!path) {\n errorMessage +=\n 'This could be because there is no index.md file in the root of the docs directory of this repository.';\n }\n throw new NotFoundError(errorMessage);\n case 500:\n errorMessage =\n 'Could not generate documentation or an error in the TechDocs backend. ';\n throw new Error(errorMessage);\n default:\n // Do nothing\n break;\n }\n\n return request.text();\n }\n\n /**\n * Check if docs are on the latest version and trigger rebuild if not\n *\n * @param entityId - Object containing entity data like name, namespace, etc.\n * @param logHandler - Callback to receive log messages from the build process\n * @returns Whether documents are currently synchronized to newest version\n * @throws Throws error on error from sync endpoint in TechDocs Backend\n */\n async syncEntityDocs(\n entityId: CompoundEntityRef,\n logHandler: (line: string) => void = () => {},\n ): Promise<SyncResult> {\n const { kind, namespace, name } = entityId;\n\n const apiOrigin = await this.getApiOrigin();\n const url = `${apiOrigin}/sync/${namespace}/${kind}/${name}`;\n\n return new Promise((resolve, reject) => {\n const ctrl = new AbortController();\n fetchEventSource(url, {\n fetch: this.fetchApi.fetch,\n signal: ctrl.signal,\n onmessage(e: any) {\n if (e.event === 'log') {\n if (e.data) {\n logHandler(JSON.parse(e.data));\n }\n } else if (e.event === 'finish') {\n let updated: boolean = false;\n if (e.data) {\n ({ updated } = JSON.parse(e.data));\n }\n resolve(updated ? 'updated' : 'cached');\n } else if (e.event === 'error') {\n reject(new Error(e.data));\n }\n },\n onerror(err) {\n ctrl.abort();\n reject(err);\n },\n });\n });\n }\n\n async getBaseUrl(\n oldBaseUrl: string,\n entityId: CompoundEntityRef,\n path: string,\n ): Promise<string> {\n const { kind, namespace, name } = entityId;\n\n const apiOrigin = await this.getApiOrigin();\n const newBaseUrl = `${apiOrigin}/static/docs/${namespace}/${kind}/${name}/${path}`;\n\n return new URL(\n oldBaseUrl,\n newBaseUrl.endsWith('/') ? newBaseUrl : `${newBaseUrl}/`,\n ).toString();\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.esm.js","sources":["../src/client.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { CompoundEntityRef } from '@backstage/catalog-model';\nimport { Config } from '@backstage/config';\nimport {\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { NotFoundError, ResponseError } from '@backstage/errors';\nimport {\n SyncResult,\n TechDocsApi,\n TechDocsEntityMetadata,\n TechDocsMetadata,\n TechDocsStorageApi,\n} from '@backstage/plugin-techdocs-react';\nimport { fetchEventSource } from '@microsoft/fetch-event-source';\n\n/**\n * API to talk to `techdocs-backend`.\n *\n * @public\n */\nexport class TechDocsClient implements TechDocsApi {\n public configApi: Config;\n public discoveryApi: DiscoveryApi;\n private fetchApi: FetchApi;\n\n constructor(options: {\n configApi: Config;\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n }) {\n this.configApi = options.configApi;\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n public async getCookie(): Promise<{ expiresAt: string }> {\n const apiOrigin = await this.getApiOrigin();\n const requestUrl = `${apiOrigin}/cookie`;\n const response = await this.fetchApi.fetch(`${requestUrl}`, {\n credentials: 'include',\n });\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n return await response.json();\n }\n\n async getApiOrigin(): Promise<string> {\n return await this.discoveryApi.getBaseUrl('techdocs');\n }\n\n /**\n * Retrieve TechDocs metadata.\n *\n * When docs are built, we generate a techdocs_metadata.json and store it along with the generated\n * static files. It includes necessary data about the docs site. This method requests techdocs-backend\n * which retrieves the TechDocs metadata.\n *\n * @param entityId - Object containing entity data like name, namespace, etc.\n */\n async getTechDocsMetadata(\n entityId: CompoundEntityRef,\n ): Promise<TechDocsMetadata> {\n const { kind, namespace, name } = entityId;\n\n const apiOrigin = await this.getApiOrigin();\n const requestUrl = `${apiOrigin}/metadata/techdocs/${namespace}/${kind}/${name}`;\n const request = await this.fetchApi.fetch(`${requestUrl}`);\n if (!request.ok) {\n throw await ResponseError.fromResponse(request);\n }\n\n return await request.json();\n }\n\n /**\n * Retrieve metadata about an entity.\n *\n * This method requests techdocs-backend which uses the catalog APIs to respond with filtered\n * information required here.\n *\n * @param entityId - Object containing entity data like name, namespace, etc.\n */\n async getEntityMetadata(\n entityId: CompoundEntityRef,\n ): Promise<TechDocsEntityMetadata> {\n const { kind, namespace, name } = entityId;\n\n const apiOrigin = await this.getApiOrigin();\n const requestUrl = `${apiOrigin}/metadata/entity/${namespace}/${kind}/${name}`;\n\n const request = await this.fetchApi.fetch(`${requestUrl}`);\n if (!request.ok) {\n throw await ResponseError.fromResponse(request);\n }\n\n return await request.json();\n }\n}\n\n/**\n * API which talks to TechDocs storage to fetch files to render.\n *\n * @public\n */\nexport class TechDocsStorageClient implements TechDocsStorageApi {\n public configApi: Config;\n public discoveryApi: DiscoveryApi;\n private fetchApi: FetchApi;\n\n constructor(options: {\n configApi: Config;\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n /** @deprecated identityApi is not needed any more */\n identityApi?: IdentityApi;\n }) {\n this.configApi = options.configApi;\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n async getApiOrigin(): Promise<string> {\n return await this.discoveryApi.getBaseUrl('techdocs');\n }\n\n async getStorageUrl(): Promise<string> {\n return (\n this.configApi.getOptionalString('techdocs.storageUrl') ??\n `${await this.discoveryApi.getBaseUrl('techdocs')}/static/docs`\n );\n }\n\n async getBuilder(): Promise<string> {\n return this.configApi.getOptionalString('techdocs.builder') || 'local';\n }\n\n /**\n * Fetch HTML content as text for an individual docs page in an entity's docs site.\n *\n * @param entityId - Object containing entity data like name, namespace, etc.\n * @param path - The unique path to an individual docs page e.g. overview/what-is-new\n * @returns HTML content of the docs page as string\n * @throws Throws error when the page is not found.\n */\n async getEntityDocs(\n entityId: CompoundEntityRef,\n path: string,\n ): Promise<string> {\n const { kind, namespace, name } = entityId;\n\n const storageUrl = await this.getStorageUrl();\n const url = `${storageUrl}/${namespace}/${kind}/${name}/${path}`;\n\n const request = await this.fetchApi.fetch(\n `${url.endsWith('/') ? url : `${url}/`}index.html`,\n );\n\n let errorMessage = '';\n switch (request.status) {\n case 404:\n errorMessage = 'Page not found. ';\n // path is empty for the home page of an entity's docs site\n if (!path) {\n errorMessage +=\n 'This could be because there is no index.md file in the root of the docs directory of this repository.';\n }\n throw new NotFoundError(errorMessage);\n case 500:\n errorMessage =\n 'Could not generate documentation or an error in the TechDocs backend. ';\n throw new Error(errorMessage);\n default:\n // Do nothing\n break;\n }\n\n return request.text();\n }\n\n /**\n * Check if docs are on the latest version and trigger rebuild if not\n *\n * @param entityId - Object containing entity data like name, namespace, etc.\n * @param logHandler - Callback to receive log messages from the build process\n * @returns Whether documents are currently synchronized to newest version\n * @throws Throws error on error from sync endpoint in TechDocs Backend\n */\n async syncEntityDocs(\n entityId: CompoundEntityRef,\n logHandler: (line: string) => void = () => {},\n ): Promise<SyncResult> {\n const { kind, namespace, name } = entityId;\n\n const apiOrigin = await this.getApiOrigin();\n const url = `${apiOrigin}/sync/${namespace}/${kind}/${name}`;\n\n return new Promise((resolve, reject) => {\n const ctrl = new AbortController();\n fetchEventSource(url, {\n fetch: this.fetchApi.fetch,\n signal: ctrl.signal,\n onmessage(e: any) {\n if (e.event === 'log') {\n if (e.data) {\n logHandler(JSON.parse(e.data));\n }\n } else if (e.event === 'finish') {\n let updated: boolean = false;\n if (e.data) {\n ({ updated } = JSON.parse(e.data));\n }\n resolve(updated ? 'updated' : 'cached');\n } else if (e.event === 'error') {\n reject(new Error(e.data));\n }\n },\n onerror(err) {\n ctrl.abort();\n reject(err);\n throw err; // rethrow to stop the operation\n },\n });\n });\n }\n\n async getBaseUrl(\n oldBaseUrl: string,\n entityId: CompoundEntityRef,\n path: string,\n ): Promise<string> {\n const { kind, namespace, name } = entityId;\n\n const apiOrigin = await this.getApiOrigin();\n const newBaseUrl = `${apiOrigin}/static/docs/${namespace}/${kind}/${name}/${path}`;\n\n return new URL(\n oldBaseUrl,\n newBaseUrl.endsWith('/') ? newBaseUrl : `${newBaseUrl}/`,\n ).toString();\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-techdocs",
|
|
3
|
-
"version": "1.12.3
|
|
3
|
+
"version": "1.12.3",
|
|
4
4
|
"description": "The Backstage plugin that renders technical documentation for your components",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin",
|
|
@@ -71,23 +71,23 @@
|
|
|
71
71
|
"test": "backstage-cli package test"
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@backstage/catalog-client": "1.9.1",
|
|
75
|
-
"@backstage/catalog-model": "1.7.3",
|
|
76
|
-
"@backstage/config": "1.3.2",
|
|
77
|
-
"@backstage/core-compat-api": "0.3.6
|
|
78
|
-
"@backstage/core-components": "0.16.4
|
|
79
|
-
"@backstage/core-plugin-api": "1.10.4
|
|
80
|
-
"@backstage/errors": "1.2.7",
|
|
81
|
-
"@backstage/frontend-plugin-api": "0.9.5
|
|
82
|
-
"@backstage/integration": "1.16.1",
|
|
83
|
-
"@backstage/integration-react": "1.2.4
|
|
84
|
-
"@backstage/plugin-auth-react": "0.1.12
|
|
85
|
-
"@backstage/plugin-catalog-react": "1.15.2
|
|
86
|
-
"@backstage/plugin-search-common": "1.2.17",
|
|
87
|
-
"@backstage/plugin-search-react": "1.8.6
|
|
88
|
-
"@backstage/plugin-techdocs-common": "0.1.0",
|
|
89
|
-
"@backstage/plugin-techdocs-react": "1.2.14
|
|
90
|
-
"@backstage/theme": "0.6.4
|
|
74
|
+
"@backstage/catalog-client": "^1.9.1",
|
|
75
|
+
"@backstage/catalog-model": "^1.7.3",
|
|
76
|
+
"@backstage/config": "^1.3.2",
|
|
77
|
+
"@backstage/core-compat-api": "^0.3.6",
|
|
78
|
+
"@backstage/core-components": "^0.16.4",
|
|
79
|
+
"@backstage/core-plugin-api": "^1.10.4",
|
|
80
|
+
"@backstage/errors": "^1.2.7",
|
|
81
|
+
"@backstage/frontend-plugin-api": "^0.9.5",
|
|
82
|
+
"@backstage/integration": "^1.16.1",
|
|
83
|
+
"@backstage/integration-react": "^1.2.4",
|
|
84
|
+
"@backstage/plugin-auth-react": "^0.1.12",
|
|
85
|
+
"@backstage/plugin-catalog-react": "^1.15.2",
|
|
86
|
+
"@backstage/plugin-search-common": "^1.2.17",
|
|
87
|
+
"@backstage/plugin-search-react": "^1.8.6",
|
|
88
|
+
"@backstage/plugin-techdocs-common": "^0.1.0",
|
|
89
|
+
"@backstage/plugin-techdocs-react": "^1.2.14",
|
|
90
|
+
"@backstage/theme": "^0.6.4",
|
|
91
91
|
"@material-ui/core": "^4.12.2",
|
|
92
92
|
"@material-ui/icons": "^4.9.1",
|
|
93
93
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
@@ -101,12 +101,12 @@
|
|
|
101
101
|
"react-use": "^17.2.4"
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
|
-
"@backstage/cli": "0.30.0
|
|
105
|
-
"@backstage/core-app-api": "1.15.5
|
|
106
|
-
"@backstage/dev-utils": "1.1.7
|
|
107
|
-
"@backstage/plugin-catalog": "1.27.0
|
|
108
|
-
"@backstage/plugin-techdocs-module-addons-contrib": "1.1.21
|
|
109
|
-
"@backstage/test-utils": "1.7.5
|
|
104
|
+
"@backstage/cli": "^0.30.0",
|
|
105
|
+
"@backstage/core-app-api": "^1.15.5",
|
|
106
|
+
"@backstage/dev-utils": "^1.1.7",
|
|
107
|
+
"@backstage/plugin-catalog": "^1.27.0",
|
|
108
|
+
"@backstage/plugin-techdocs-module-addons-contrib": "^1.1.21",
|
|
109
|
+
"@backstage/test-utils": "^1.7.5",
|
|
110
110
|
"@testing-library/dom": "^10.0.0",
|
|
111
111
|
"@testing-library/jest-dom": "^6.0.0",
|
|
112
112
|
"@testing-library/react": "^16.0.0",
|