@backstage/plugin-techdocs 1.10.4-next.1 → 1.10.5-next.0
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 +45 -0
- package/README.md +1 -1
- package/alpha/package.json +1 -1
- package/dist/EntityPageDocs.esm.js +23 -0
- package/dist/EntityPageDocs.esm.js.map +1 -0
- package/dist/Router.esm.js +47 -0
- package/dist/Router.esm.js.map +1 -0
- package/dist/alpha.esm.js +6 -7
- package/dist/alpha.esm.js.map +1 -1
- package/dist/api.esm.js +11 -0
- package/dist/api.esm.js.map +1 -0
- package/dist/{esm/routes-VopnMGN0.esm.js → client.esm.js} +2 -14
- package/dist/client.esm.js.map +1 -0
- package/dist/helpers.esm.js +8 -0
- package/dist/helpers.esm.js.map +1 -0
- package/dist/home/components/DefaultTechDocsHome.esm.js +15 -0
- package/dist/home/components/DefaultTechDocsHome.esm.js.map +1 -0
- package/dist/{esm/DocsCardGrid-AWTYz1vR.esm.js → home/components/Grids/DocsCardGrid.esm.js} +4 -4
- package/dist/home/components/Grids/DocsCardGrid.esm.js.map +1 -0
- package/dist/home/components/Grids/EntityListDocsGrid.esm.js +68 -0
- package/dist/home/components/Grids/EntityListDocsGrid.esm.js.map +1 -0
- package/dist/home/components/Tables/DocsTable.esm.js +87 -0
- package/dist/home/components/Tables/DocsTable.esm.js.map +1 -0
- package/dist/home/components/Tables/EntityListDocsTable.esm.js +50 -0
- package/dist/home/components/Tables/EntityListDocsTable.esm.js.map +1 -0
- package/dist/home/components/Tables/actions.esm.js +37 -0
- package/dist/home/components/Tables/actions.esm.js.map +1 -0
- package/dist/home/components/Tables/columns.esm.js +51 -0
- package/dist/home/components/Tables/columns.esm.js.map +1 -0
- package/dist/{esm/TechDocsCustomHome-CTmEWYTg.esm.js → home/components/TechDocsCustomHome.esm.js} +5 -17
- package/dist/home/components/TechDocsCustomHome.esm.js.map +1 -0
- package/dist/home/components/TechDocsIndexPage.esm.js +11 -0
- package/dist/home/components/TechDocsIndexPage.esm.js.map +1 -0
- package/dist/home/components/TechDocsPageWrapper.esm.js +22 -0
- package/dist/home/components/TechDocsPageWrapper.esm.js.map +1 -0
- package/dist/home/components/TechDocsPicker.esm.js +22 -0
- package/dist/home/components/TechDocsPicker.esm.js.map +1 -0
- package/dist/index.esm.js +17 -125
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +97 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/reader/components/TechDocsBuildLogs.esm.js +94 -0
- package/dist/reader/components/TechDocsBuildLogs.esm.js.map +1 -0
- package/dist/reader/components/TechDocsNotFound.esm.js +33 -0
- package/dist/reader/components/TechDocsNotFound.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderPage/TechDocsReaderPage.esm.js +42 -0
- package/dist/reader/components/TechDocsReaderPage/TechDocsReaderPage.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderPage/index.esm.js +2 -0
- package/dist/reader/components/TechDocsReaderPage/index.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js +77 -0
- package/dist/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons.esm.js +43 -0
- package/dist/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderPageContent/dom.esm.js +203 -0
- package/dist/reader/components/TechDocsReaderPageContent/dom.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderPageContent/useNavigateUrl.esm.js +36 -0
- package/dist/reader/components/TechDocsReaderPageContent/useNavigateUrl.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.esm.js +101 -0
- package/dist/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.esm.js +77 -0
- package/dist/reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.esm.js.map +1 -0
- package/dist/reader/components/TechDocsReaderProvider.esm.js +19 -0
- package/dist/reader/components/TechDocsReaderProvider.esm.js.map +1 -0
- package/dist/reader/components/TechDocsStateIndicator.esm.js +101 -0
- package/dist/reader/components/TechDocsStateIndicator.esm.js.map +1 -0
- package/dist/reader/components/useReaderState.esm.js +163 -0
- package/dist/reader/components/useReaderState.esm.js.map +1 -0
- package/dist/reader/transformers/addBaseUrl.esm.js +56 -0
- package/dist/reader/transformers/addBaseUrl.esm.js.map +1 -0
- package/dist/reader/transformers/addGitFeedbackLink.esm.js +53 -0
- package/dist/reader/transformers/addGitFeedbackLink.esm.js.map +1 -0
- package/dist/reader/transformers/addLinkClickListener.esm.js +23 -0
- package/dist/reader/transformers/addLinkClickListener.esm.js.map +1 -0
- package/dist/reader/transformers/addSidebarToggle.esm.js +27 -0
- package/dist/reader/transformers/addSidebarToggle.esm.js.map +1 -0
- package/dist/reader/transformers/copyToClipboard.esm.js +68 -0
- package/dist/reader/transformers/copyToClipboard.esm.js.map +1 -0
- package/dist/reader/transformers/html/hooks/iframes.esm.js +19 -0
- package/dist/reader/transformers/html/hooks/iframes.esm.js.map +1 -0
- package/dist/reader/transformers/html/hooks/links.esm.js +20 -0
- package/dist/reader/transformers/html/hooks/links.esm.js.map +1 -0
- package/dist/reader/transformers/html/transformer.esm.js +36 -0
- package/dist/reader/transformers/html/transformer.esm.js.map +1 -0
- package/dist/reader/transformers/onCssReady.esm.js +24 -0
- package/dist/reader/transformers/onCssReady.esm.js.map +1 -0
- package/dist/reader/transformers/removeMkdocsHeader.esm.js +10 -0
- package/dist/reader/transformers/removeMkdocsHeader.esm.js.map +1 -0
- package/dist/reader/transformers/renderReactElement.esm.js +18 -0
- package/dist/reader/transformers/renderReactElement.esm.js.map +1 -0
- package/dist/reader/transformers/rewriteDocLinks.esm.js +37 -0
- package/dist/reader/transformers/rewriteDocLinks.esm.js.map +1 -0
- package/dist/reader/transformers/scrollIntoNavigation.esm.js +21 -0
- package/dist/reader/transformers/scrollIntoNavigation.esm.js.map +1 -0
- package/dist/reader/transformers/simplifyMkdocsFooter.esm.js +11 -0
- package/dist/reader/transformers/simplifyMkdocsFooter.esm.js.map +1 -0
- package/dist/reader/transformers/styles/rules/animations.esm.js +13 -0
- package/dist/reader/transformers/styles/rules/animations.esm.js.map +1 -0
- package/dist/reader/transformers/styles/rules/extensions.esm.js +72 -0
- package/dist/reader/transformers/styles/rules/extensions.esm.js.map +1 -0
- package/dist/reader/transformers/styles/rules/layout.esm.js +224 -0
- package/dist/reader/transformers/styles/rules/layout.esm.js.map +1 -0
- package/dist/reader/transformers/styles/rules/reset.esm.js +14 -0
- package/dist/reader/transformers/styles/rules/reset.esm.js.map +1 -0
- package/dist/reader/transformers/styles/rules/rules.esm.js +18 -0
- package/dist/reader/transformers/styles/rules/rules.esm.js.map +1 -0
- package/dist/reader/transformers/styles/rules/typeset.esm.js +91 -0
- package/dist/reader/transformers/styles/rules/typeset.esm.js.map +1 -0
- package/dist/reader/transformers/styles/rules/variables.esm.js +126 -0
- package/dist/reader/transformers/styles/rules/variables.esm.js.map +1 -0
- package/dist/reader/transformers/styles/transformer.esm.js +27 -0
- package/dist/reader/transformers/styles/transformer.esm.js.map +1 -0
- package/dist/reader/transformers/transformer.esm.js +17 -0
- package/dist/reader/transformers/transformer.esm.js.map +1 -0
- package/dist/routes.esm.js +15 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/search/components/TechDocsSearch.esm.js +95 -0
- package/dist/search/components/TechDocsSearch.esm.js.map +1 -0
- package/dist/{esm/TechDocsSearchResultListItem-4Qzh5-3s.esm.js → search/components/TechDocsSearchResultListItem.esm.js} +1 -1
- package/dist/search/components/TechDocsSearchResultListItem.esm.js.map +1 -0
- package/package.json +20 -20
- package/dist/esm/DocsCardGrid-AWTYz1vR.esm.js.map +0 -1
- package/dist/esm/Router-jrzAl2lO.esm.js +0 -162
- package/dist/esm/Router-jrzAl2lO.esm.js.map +0 -1
- package/dist/esm/TechDocsCustomHome-CTmEWYTg.esm.js.map +0 -1
- package/dist/esm/TechDocsIndexPage-BCP1ggek.esm.js +0 -257
- package/dist/esm/TechDocsIndexPage-BCP1ggek.esm.js.map +0 -1
- package/dist/esm/TechDocsReaderPage-jsKVX28r.esm.js +0 -1925
- package/dist/esm/TechDocsReaderPage-jsKVX28r.esm.js.map +0 -1
- package/dist/esm/TechDocsSearchResultListItem-4Qzh5-3s.esm.js.map +0 -1
- package/dist/esm/index-up5BptkF.esm.js +0 -47
- package/dist/esm/index-up5BptkF.esm.js.map +0 -1
- package/dist/esm/routes-VopnMGN0.esm.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# @backstage/plugin-techdocs
|
|
2
2
|
|
|
3
|
+
## 1.10.5-next.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- d2cc139: Update path in Readme for Plugin Techdocs to show the correct setup information.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/core-compat-api@0.2.5-next.0
|
|
10
|
+
- @backstage/catalog-model@1.5.0-next.0
|
|
11
|
+
- @backstage/plugin-auth-react@0.1.1-next.0
|
|
12
|
+
- @backstage/theme@0.5.4-next.0
|
|
13
|
+
- @backstage/core-components@0.14.5-next.0
|
|
14
|
+
- @backstage/plugin-catalog-react@1.11.4-next.0
|
|
15
|
+
- @backstage/plugin-techdocs-react@1.2.4-next.0
|
|
16
|
+
- @backstage/config@1.2.0
|
|
17
|
+
- @backstage/core-plugin-api@1.9.2
|
|
18
|
+
- @backstage/errors@1.2.4
|
|
19
|
+
- @backstage/frontend-plugin-api@0.6.5-next.0
|
|
20
|
+
- @backstage/integration@1.10.0
|
|
21
|
+
- @backstage/integration-react@1.1.26
|
|
22
|
+
- @backstage/plugin-search-common@1.2.11
|
|
23
|
+
- @backstage/plugin-search-react@1.7.11-next.0
|
|
24
|
+
|
|
25
|
+
## 1.10.4
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- abfbcfc: Updated dependency `@testing-library/react` to `^15.0.0`.
|
|
30
|
+
- cb1e3b0: Updated dependency `@testing-library/dom` to `^10.0.0`.
|
|
31
|
+
- Updated dependencies
|
|
32
|
+
- @backstage/plugin-techdocs-react@1.2.3
|
|
33
|
+
- @backstage/plugin-search-react@1.7.10
|
|
34
|
+
- @backstage/plugin-auth-react@0.1.0
|
|
35
|
+
- @backstage/plugin-catalog-react@1.11.3
|
|
36
|
+
- @backstage/core-compat-api@0.2.4
|
|
37
|
+
- @backstage/core-components@0.14.4
|
|
38
|
+
- @backstage/core-plugin-api@1.9.2
|
|
39
|
+
- @backstage/frontend-plugin-api@0.6.4
|
|
40
|
+
- @backstage/theme@0.5.3
|
|
41
|
+
- @backstage/integration-react@1.1.26
|
|
42
|
+
- @backstage/integration@1.10.0
|
|
43
|
+
- @backstage/catalog-model@1.4.5
|
|
44
|
+
- @backstage/config@1.2.0
|
|
45
|
+
- @backstage/errors@1.2.4
|
|
46
|
+
- @backstage/plugin-search-common@1.2.11
|
|
47
|
+
|
|
3
48
|
## 1.10.4-next.1
|
|
4
49
|
|
|
5
50
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -10,4 +10,4 @@ Refer to our [configuration reference](../../docs/features/techdocs/configuratio
|
|
|
10
10
|
|
|
11
11
|
### TechDocs Storage API
|
|
12
12
|
|
|
13
|
-
The default setup of TechDocs assumes that your documentation is accessed by reading a page with the format of `<storageUrl>/<entity
|
|
13
|
+
The default setup of TechDocs assumes that your documentation is accessed by reading a page with the format of `<storageUrl>/<entity namespace>/<entity kind>/<entity name>`. This can be configured by [implementing a new techdocs storage API](https://backstage.io/docs/features/techdocs/how-to-guides#how-to-implement-your-own-techdocs-apis).
|
package/alpha/package.json
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getCompoundEntityRef, parseEntityRef } from '@backstage/catalog-model';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { TechDocsReaderPage } from './plugin.esm.js';
|
|
4
|
+
import { TechDocsReaderPageContent } from './reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js';
|
|
5
|
+
import { TechDocsReaderPageSubheader } from './reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.esm.js';
|
|
6
|
+
|
|
7
|
+
const TECHDOCS_EXTERNAL_ANNOTATION = "backstage.io/techdocs-entity";
|
|
8
|
+
const EntityPageDocs = ({ entity }) => {
|
|
9
|
+
var _a, _b;
|
|
10
|
+
let entityRef = getCompoundEntityRef(entity);
|
|
11
|
+
if ((_a = entity.metadata.annotations) == null ? void 0 : _a[TECHDOCS_EXTERNAL_ANNOTATION]) {
|
|
12
|
+
try {
|
|
13
|
+
entityRef = parseEntityRef(
|
|
14
|
+
(_b = entity.metadata.annotations) == null ? void 0 : _b[TECHDOCS_EXTERNAL_ANNOTATION]
|
|
15
|
+
);
|
|
16
|
+
} catch {
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return /* @__PURE__ */ React.createElement(TechDocsReaderPage, { entityRef }, /* @__PURE__ */ React.createElement(TechDocsReaderPageSubheader, null), /* @__PURE__ */ React.createElement(TechDocsReaderPageContent, { withSearch: false }));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { EntityPageDocs };
|
|
23
|
+
//# sourceMappingURL=EntityPageDocs.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityPageDocs.esm.js","sources":["../src/EntityPageDocs.tsx"],"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 {\n Entity,\n getCompoundEntityRef,\n parseEntityRef,\n} from '@backstage/catalog-model';\n\nimport React from 'react';\nimport { TechDocsReaderPage } from './plugin';\nimport { TechDocsReaderPageContent } from './reader/components/TechDocsReaderPageContent';\nimport { TechDocsReaderPageSubheader } from './reader/components/TechDocsReaderPageSubheader';\n\nconst TECHDOCS_EXTERNAL_ANNOTATION = 'backstage.io/techdocs-entity';\n\ntype EntityPageDocsProps = { entity: Entity };\n\nexport const EntityPageDocs = ({ entity }: EntityPageDocsProps) => {\n let entityRef = getCompoundEntityRef(entity);\n\n if (entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION]) {\n try {\n entityRef = parseEntityRef(\n entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION],\n );\n } catch {\n // not a fan of this but we don't care if the parseEntityRef fails\n }\n }\n\n return (\n <TechDocsReaderPage entityRef={entityRef}>\n <TechDocsReaderPageSubheader />\n <TechDocsReaderPageContent withSearch={false} />\n </TechDocsReaderPage>\n );\n};\n"],"names":[],"mappings":";;;;;;AA2BA,MAAM,4BAA+B,GAAA,8BAAA,CAAA;AAI9B,MAAM,cAAiB,GAAA,CAAC,EAAE,MAAA,EAAkC,KAAA;AA/BnE,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAgCE,EAAI,IAAA,SAAA,GAAY,qBAAqB,MAAM,CAAA,CAAA;AAE3C,EAAA,IAAA,CAAI,EAAO,GAAA,MAAA,CAAA,QAAA,CAAS,WAAhB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA8B,4BAA+B,CAAA,EAAA;AAC/D,IAAI,IAAA;AACF,MAAY,SAAA,GAAA,cAAA;AAAA,QACV,CAAA,EAAA,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,KAAhB,IAA8B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,4BAAA,CAAA;AAAA,OAChC,CAAA;AAAA,KACM,CAAA,MAAA;AAAA,KAER;AAAA,GACF;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,kBAAmB,EAAA,EAAA,SAAA,EAAA,kBACjB,KAAA,CAAA,aAAA,CAAA,2BAAA,EAAA,IAA4B,mBAC5B,KAAA,CAAA,aAAA,CAAA,yBAAA,EAAA,EAA0B,UAAY,EAAA,KAAA,EAAO,CAChD,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Routes, Route, useRoutes } from 'react-router-dom';
|
|
3
|
+
import { EntityPageDocs } from './EntityPageDocs.esm.js';
|
|
4
|
+
import { TechDocsIndexPage } from './home/components/TechDocsIndexPage.esm.js';
|
|
5
|
+
import { TechDocsReaderPage } from './reader/components/TechDocsReaderPage/TechDocsReaderPage.esm.js';
|
|
6
|
+
import { useEntity, MissingAnnotationEmptyState } from '@backstage/plugin-catalog-react';
|
|
7
|
+
|
|
8
|
+
const TECHDOCS_ANNOTATION = "backstage.io/techdocs-ref";
|
|
9
|
+
const TECHDOCS_EXTERNAL_ANNOTATION = "backstage.io/techdocs-entity";
|
|
10
|
+
const isTechDocsAvailable = (entity) => {
|
|
11
|
+
var _a, _b, _c, _d;
|
|
12
|
+
return Boolean((_b = (_a = entity == null ? void 0 : entity.metadata) == null ? void 0 : _a.annotations) == null ? void 0 : _b[TECHDOCS_ANNOTATION]) || Boolean((_d = (_c = entity == null ? void 0 : entity.metadata) == null ? void 0 : _c.annotations) == null ? void 0 : _d[TECHDOCS_EXTERNAL_ANNOTATION]);
|
|
13
|
+
};
|
|
14
|
+
const Router = () => {
|
|
15
|
+
return /* @__PURE__ */ React.createElement(Routes, null, /* @__PURE__ */ React.createElement(Route, { path: "/", element: /* @__PURE__ */ React.createElement(TechDocsIndexPage, null) }), /* @__PURE__ */ React.createElement(
|
|
16
|
+
Route,
|
|
17
|
+
{
|
|
18
|
+
path: "/:namespace/:kind/:name/*",
|
|
19
|
+
element: /* @__PURE__ */ React.createElement(TechDocsReaderPage, null)
|
|
20
|
+
}
|
|
21
|
+
));
|
|
22
|
+
};
|
|
23
|
+
const EmbeddedDocsRouter = (props) => {
|
|
24
|
+
var _a, _b;
|
|
25
|
+
const { children } = props;
|
|
26
|
+
const { entity } = useEntity();
|
|
27
|
+
const element = useRoutes([
|
|
28
|
+
{
|
|
29
|
+
path: "/*",
|
|
30
|
+
element: /* @__PURE__ */ React.createElement(EntityPageDocs, { entity }),
|
|
31
|
+
children: [
|
|
32
|
+
{
|
|
33
|
+
path: "*",
|
|
34
|
+
element: children
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
]);
|
|
39
|
+
const projectId = ((_a = entity.metadata.annotations) == null ? void 0 : _a[TECHDOCS_ANNOTATION]) || ((_b = entity.metadata.annotations) == null ? void 0 : _b[TECHDOCS_EXTERNAL_ANNOTATION]);
|
|
40
|
+
if (!projectId) {
|
|
41
|
+
return /* @__PURE__ */ React.createElement(MissingAnnotationEmptyState, { annotation: [TECHDOCS_ANNOTATION] });
|
|
42
|
+
}
|
|
43
|
+
return element;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export { EmbeddedDocsRouter, Router, isTechDocsAvailable };
|
|
47
|
+
//# sourceMappingURL=Router.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Router.esm.js","sources":["../src/Router.tsx"],"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 React, { PropsWithChildren } from 'react';\nimport { Route, Routes, useRoutes } from 'react-router-dom';\n\nimport { Entity } from '@backstage/catalog-model';\nimport { EntityPageDocs } from './EntityPageDocs';\nimport { TechDocsIndexPage } from './home/components/TechDocsIndexPage';\nimport { TechDocsReaderPage } from './reader/components/TechDocsReaderPage';\nimport {\n useEntity,\n MissingAnnotationEmptyState,\n} from '@backstage/plugin-catalog-react';\n\nconst TECHDOCS_ANNOTATION = 'backstage.io/techdocs-ref';\n\nconst TECHDOCS_EXTERNAL_ANNOTATION = 'backstage.io/techdocs-entity';\n\n/**\n * Helper that takes in entity and returns true/false if TechDocs is available for the entity\n *\n * @public\n */\nexport const isTechDocsAvailable = (entity: Entity) =>\n Boolean(entity?.metadata?.annotations?.[TECHDOCS_ANNOTATION]) ||\n Boolean(entity?.metadata?.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION]);\n\n/**\n * Responsible for registering routes for TechDocs, TechDocs Homepage and separate TechDocs page\n *\n * @public\n */\nexport const Router = () => {\n return (\n <Routes>\n <Route path=\"/\" element={<TechDocsIndexPage />} />\n <Route\n path=\"/:namespace/:kind/:name/*\"\n element={<TechDocsReaderPage />}\n />\n </Routes>\n );\n};\n\n/**\n * Responsible for registering route to view docs on Entity page\n *\n * @public\n */\nexport const EmbeddedDocsRouter = (props: PropsWithChildren<{}>) => {\n const { children } = props;\n const { entity } = useEntity();\n\n // Using objects instead of <Route> elements, otherwise \"outlet\" will be null on sub-pages and add-ons won't render\n const element = useRoutes([\n {\n path: '/*',\n element: <EntityPageDocs entity={entity} />,\n children: [\n {\n path: '*',\n element: children,\n },\n ],\n },\n ]);\n\n const projectId =\n entity.metadata.annotations?.[TECHDOCS_ANNOTATION] ||\n entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION];\n\n if (!projectId) {\n return <MissingAnnotationEmptyState annotation={[TECHDOCS_ANNOTATION]} />;\n }\n\n return element;\n};\n"],"names":[],"mappings":";;;;;;;AA4BA,MAAM,mBAAsB,GAAA,2BAAA,CAAA;AAE5B,MAAM,4BAA+B,GAAA,8BAAA,CAAA;AAOxB,MAAA,mBAAA,GAAsB,CAAC,MAAgB,KAAA;AArCpD,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAsCE,EAAA,OAAA,OAAA,CAAA,CAAQ,EAAQ,GAAA,CAAA,EAAA,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,QAAA,KAAR,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAlB,IAAgC,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,mBAAA,CAAoB,CAC5D,IAAA,OAAA,CAAA,CAAQ,EAAQ,GAAA,CAAA,EAAA,GAAA,MAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,MAAA,CAAA,QAAA,KAAR,IAAkB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,KAAlB,mBAAgC,4BAA6B,CAAA,CAAA,CAAA;AAAA,EAAA;AAOhE,MAAM,SAAS,MAAM;AAC1B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,MACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,EAAA,EAAA,IAAA,EAAK,KAAI,OAAS,kBAAA,KAAA,CAAA,aAAA,CAAC,iBAAkB,EAAA,IAAA,CAAA,EAAI,CAChD,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,2BAAA;AAAA,MACL,OAAA,sCAAU,kBAAmB,EAAA,IAAA,CAAA;AAAA,KAAA;AAAA,GAEjC,CAAA,CAAA;AAEJ,EAAA;AAOa,MAAA,kBAAA,GAAqB,CAAC,KAAiC,KAAA;AA/DpE,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAgEE,EAAM,MAAA,EAAE,UAAa,GAAA,KAAA,CAAA;AACrB,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA,CAAA;AAG7B,EAAA,MAAM,UAAU,SAAU,CAAA;AAAA,IACxB;AAAA,MACE,IAAM,EAAA,IAAA;AAAA,MACN,OAAA,kBAAU,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,MAAgB,EAAA,CAAA;AAAA,MACzC,QAAU,EAAA;AAAA,QACR;AAAA,UACE,IAAM,EAAA,GAAA;AAAA,UACN,OAAS,EAAA,QAAA;AAAA,SACX;AAAA,OACF;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AAED,EAAM,MAAA,SAAA,GAAA,CAAA,CACJ,YAAO,QAAS,CAAA,WAAA,KAAhB,mBAA8B,mBAC9B,CAAA,MAAA,CAAA,EAAA,GAAA,MAAA,CAAO,QAAS,CAAA,WAAA,KAAhB,IAA8B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,4BAAA,CAAA,CAAA,CAAA;AAEhC,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,2BAAA,EAAA,EAA4B,UAAY,EAAA,CAAC,mBAAmB,CAAG,EAAA,CAAA,CAAA;AAAA,GACzE;AAEA,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
package/dist/alpha.esm.js
CHANGED
|
@@ -5,10 +5,9 @@ import { createSearchResultListItemExtension } from '@backstage/plugin-search-re
|
|
|
5
5
|
import { createApiFactory, configApiRef, discoveryApiRef, identityApiRef, fetchApiRef } from '@backstage/core-plugin-api';
|
|
6
6
|
import { compatWrapper, convertLegacyRouteRef, convertLegacyRouteRefs } from '@backstage/core-compat-api';
|
|
7
7
|
import { techdocsStorageApiRef, techdocsApiRef } from '@backstage/plugin-techdocs-react';
|
|
8
|
-
import {
|
|
8
|
+
import { TechDocsStorageClient, TechDocsClient } from './client.esm.js';
|
|
9
|
+
import { rootRouteRef, rootDocsRouteRef, rootCatalogDocsRouteRef } from './routes.esm.js';
|
|
9
10
|
import { createEntityContentExtension } from '@backstage/plugin-catalog-react/alpha';
|
|
10
|
-
import '@backstage/errors';
|
|
11
|
-
import 'event-source-polyfill';
|
|
12
11
|
|
|
13
12
|
const techDocsStorageApi = createApiExtension({
|
|
14
13
|
factory: createApiFactory({
|
|
@@ -55,14 +54,14 @@ const techDocsSearchResultListItemExtension = createSearchResultListItemExtensio
|
|
|
55
54
|
),
|
|
56
55
|
predicate: (result) => result.type === "techdocs",
|
|
57
56
|
component: async ({ config }) => {
|
|
58
|
-
const { TechDocsSearchResultListItem } = await import('./
|
|
57
|
+
const { TechDocsSearchResultListItem } = await import('./search/components/TechDocsSearchResultListItem.esm.js');
|
|
59
58
|
return (props) => compatWrapper(/* @__PURE__ */ React.createElement(TechDocsSearchResultListItem, { ...props, ...config }));
|
|
60
59
|
}
|
|
61
60
|
});
|
|
62
61
|
const techDocsPage = createPageExtension({
|
|
63
62
|
defaultPath: "/docs",
|
|
64
63
|
routeRef: convertLegacyRouteRef(rootRouteRef),
|
|
65
|
-
loader: () => import('./
|
|
64
|
+
loader: () => import('./home/components/TechDocsIndexPage.esm.js').then(
|
|
66
65
|
(m) => compatWrapper(/* @__PURE__ */ React.createElement(m.TechDocsIndexPage, null))
|
|
67
66
|
)
|
|
68
67
|
});
|
|
@@ -70,14 +69,14 @@ const techDocsReaderPage = createPageExtension({
|
|
|
70
69
|
name: "reader",
|
|
71
70
|
defaultPath: "/docs/:namespace/:kind/:name",
|
|
72
71
|
routeRef: convertLegacyRouteRef(rootDocsRouteRef),
|
|
73
|
-
loader: () => import('./
|
|
72
|
+
loader: () => import('./reader/components/TechDocsReaderPage/index.esm.js').then(
|
|
74
73
|
(m) => compatWrapper(/* @__PURE__ */ React.createElement(m.TechDocsReaderPage, null))
|
|
75
74
|
)
|
|
76
75
|
});
|
|
77
76
|
const techDocsEntityContent = createEntityContentExtension({
|
|
78
77
|
defaultPath: "docs",
|
|
79
78
|
defaultTitle: "TechDocs",
|
|
80
|
-
loader: () => import('./
|
|
79
|
+
loader: () => import('./Router.esm.js').then((m) => compatWrapper(/* @__PURE__ */ React.createElement(m.EmbeddedDocsRouter, null)))
|
|
81
80
|
});
|
|
82
81
|
const techDocsNavItem = createNavItemExtension({
|
|
83
82
|
icon: LibraryBooks,
|
package/dist/alpha.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"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 React from 'react';\nimport LibraryBooks from '@material-ui/icons/LibraryBooks';\nimport {\n createPlugin,\n createSchemaFromZod,\n createApiExtension,\n createPageExtension,\n createNavItemExtension,\n} from '@backstage/frontend-plugin-api';\nimport { createSearchResultListItemExtension } from '@backstage/plugin-search-react/alpha';\nimport {\n configApiRef,\n createApiFactory,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n compatWrapper,\n convertLegacyRouteRef,\n convertLegacyRouteRefs,\n} from '@backstage/core-compat-api';\nimport {\n techdocsApiRef,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\nimport { TechDocsClient, TechDocsStorageClient } from './client';\nimport {\n rootCatalogDocsRouteRef,\n rootDocsRouteRef,\n rootRouteRef,\n} from './routes';\nimport { createEntityContentExtension } from '@backstage/plugin-catalog-react/alpha';\n\n/** @alpha */\nconst techDocsStorageApi = createApiExtension({\n factory: createApiFactory({\n api: techdocsStorageApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, identityApi, fetchApi }) =>\n new TechDocsStorageClient({\n configApi,\n discoveryApi,\n identityApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nconst techDocsClientApi = createApiExtension({\n factory: createApiFactory({\n api: techdocsApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n new TechDocsClient({\n configApi,\n discoveryApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nexport const techDocsSearchResultListItemExtension =\n createSearchResultListItemExtension({\n configSchema: createSchemaFromZod(z =>\n z.object({\n // TODO: Define how the icon can be configurable\n title: z.string().optional(),\n lineClamp: z.number().default(5),\n asLink: z.boolean().default(true),\n asListItem: z.boolean().default(true),\n noTrack: z.boolean().default(false),\n }),\n ),\n predicate: result => result.type === 'techdocs',\n component: async ({ config }) => {\n const { TechDocsSearchResultListItem } = await import(\n './search/components/TechDocsSearchResultListItem'\n );\n return props =>\n compatWrapper(<TechDocsSearchResultListItem {...props} {...config} />);\n },\n });\n\n/**\n * Responsible for rendering the provided router element\n *\n * @alpha\n */\nconst techDocsPage = createPageExtension({\n defaultPath: '/docs',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n loader: () =>\n import('./home/components/TechDocsIndexPage').then(m =>\n compatWrapper(<m.TechDocsIndexPage />),\n ),\n});\n\n/**\n * Component responsible for composing a TechDocs reader page experience\n *\n * @alpha\n */\nconst techDocsReaderPage = createPageExtension({\n name: 'reader',\n defaultPath: '/docs/:namespace/:kind/:name',\n routeRef: convertLegacyRouteRef(rootDocsRouteRef),\n loader: () =>\n import('./reader/components/TechDocsReaderPage').then(m =>\n compatWrapper(<m.TechDocsReaderPage />),\n ),\n});\n\n/**\n * Component responsible for rendering techdocs on entity pages\n *\n * @alpha\n */\nconst techDocsEntityContent = createEntityContentExtension({\n defaultPath: 'docs',\n defaultTitle: 'TechDocs',\n loader: () =>\n import('./Router').then(m => compatWrapper(<m.EmbeddedDocsRouter />)),\n});\n\n/** @alpha */\nconst techDocsNavItem = createNavItemExtension({\n icon: LibraryBooks,\n title: 'Docs',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n});\n\n/** @alpha */\nexport default createPlugin({\n id: 'techdocs',\n extensions: [\n techDocsClientApi,\n techDocsStorageApi,\n techDocsNavItem,\n techDocsPage,\n techDocsReaderPage,\n techDocsEntityContent,\n techDocsSearchResultListItemExtension,\n ],\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n docRoot: rootDocsRouteRef,\n entityContent: rootCatalogDocsRouteRef,\n }),\n});\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.tsx"],"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 React from 'react';\nimport LibraryBooks from '@material-ui/icons/LibraryBooks';\nimport {\n createPlugin,\n createSchemaFromZod,\n createApiExtension,\n createPageExtension,\n createNavItemExtension,\n} from '@backstage/frontend-plugin-api';\nimport { createSearchResultListItemExtension } from '@backstage/plugin-search-react/alpha';\nimport {\n configApiRef,\n createApiFactory,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n compatWrapper,\n convertLegacyRouteRef,\n convertLegacyRouteRefs,\n} from '@backstage/core-compat-api';\nimport {\n techdocsApiRef,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\nimport { TechDocsClient, TechDocsStorageClient } from './client';\nimport {\n rootCatalogDocsRouteRef,\n rootDocsRouteRef,\n rootRouteRef,\n} from './routes';\nimport { createEntityContentExtension } from '@backstage/plugin-catalog-react/alpha';\n\n/** @alpha */\nconst techDocsStorageApi = createApiExtension({\n factory: createApiFactory({\n api: techdocsStorageApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n identityApi: identityApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, identityApi, fetchApi }) =>\n new TechDocsStorageClient({\n configApi,\n discoveryApi,\n identityApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nconst techDocsClientApi = createApiExtension({\n factory: createApiFactory({\n api: techdocsApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n new TechDocsClient({\n configApi,\n discoveryApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nexport const techDocsSearchResultListItemExtension =\n createSearchResultListItemExtension({\n configSchema: createSchemaFromZod(z =>\n z.object({\n // TODO: Define how the icon can be configurable\n title: z.string().optional(),\n lineClamp: z.number().default(5),\n asLink: z.boolean().default(true),\n asListItem: z.boolean().default(true),\n noTrack: z.boolean().default(false),\n }),\n ),\n predicate: result => result.type === 'techdocs',\n component: async ({ config }) => {\n const { TechDocsSearchResultListItem } = await import(\n './search/components/TechDocsSearchResultListItem'\n );\n return props =>\n compatWrapper(<TechDocsSearchResultListItem {...props} {...config} />);\n },\n });\n\n/**\n * Responsible for rendering the provided router element\n *\n * @alpha\n */\nconst techDocsPage = createPageExtension({\n defaultPath: '/docs',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n loader: () =>\n import('./home/components/TechDocsIndexPage').then(m =>\n compatWrapper(<m.TechDocsIndexPage />),\n ),\n});\n\n/**\n * Component responsible for composing a TechDocs reader page experience\n *\n * @alpha\n */\nconst techDocsReaderPage = createPageExtension({\n name: 'reader',\n defaultPath: '/docs/:namespace/:kind/:name',\n routeRef: convertLegacyRouteRef(rootDocsRouteRef),\n loader: () =>\n import('./reader/components/TechDocsReaderPage').then(m =>\n compatWrapper(<m.TechDocsReaderPage />),\n ),\n});\n\n/**\n * Component responsible for rendering techdocs on entity pages\n *\n * @alpha\n */\nconst techDocsEntityContent = createEntityContentExtension({\n defaultPath: 'docs',\n defaultTitle: 'TechDocs',\n loader: () =>\n import('./Router').then(m => compatWrapper(<m.EmbeddedDocsRouter />)),\n});\n\n/** @alpha */\nconst techDocsNavItem = createNavItemExtension({\n icon: LibraryBooks,\n title: 'Docs',\n routeRef: convertLegacyRouteRef(rootRouteRef),\n});\n\n/** @alpha */\nexport default createPlugin({\n id: 'techdocs',\n extensions: [\n techDocsClientApi,\n techDocsStorageApi,\n techDocsNavItem,\n techDocsPage,\n techDocsReaderPage,\n techDocsEntityContent,\n techDocsSearchResultListItemExtension,\n ],\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n docRoot: rootDocsRouteRef,\n entityContent: rootCatalogDocsRouteRef,\n }),\n});\n"],"names":[],"mappings":"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"}
|
package/dist/api.esm.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createApiRef } from '@backstage/core-plugin-api';
|
|
2
|
+
|
|
3
|
+
const techdocsStorageApiRef = createApiRef({
|
|
4
|
+
id: "plugin.techdocs.storageservice"
|
|
5
|
+
});
|
|
6
|
+
const techdocsApiRef = createApiRef({
|
|
7
|
+
id: "plugin.techdocs.service"
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
export { techdocsApiRef, techdocsStorageApiRef };
|
|
11
|
+
//# sourceMappingURL=api.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.esm.js","sources":["../src/api.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 {\n TechDocsEntityMetadata,\n TechDocsMetadata,\n} from '@backstage/plugin-techdocs-react';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\n/**\n * Utility API reference for the {@link TechDocsStorageApi}.\n *\n * @public\n * @deprecated Import from `@backstage/plugin-techdocs-react` instead\n */\nexport const techdocsStorageApiRef = createApiRef<TechDocsStorageApi>({\n id: 'plugin.techdocs.storageservice',\n});\n\n/**\n * Utility API reference for the {@link TechDocsApi}.\n *\n * @public\n * @deprecated Import from `@backstage/plugin-techdocs-react` instead\n */\nexport const techdocsApiRef = createApiRef<TechDocsApi>({\n id: 'plugin.techdocs.service',\n});\n\n/**\n * The outcome of a docs sync operation.\n *\n * @public\n * @deprecated Import from `@backstage/plugin-techdocs-react` instead\n */\nexport type SyncResult = 'cached' | 'updated';\n\n/**\n * API which talks to TechDocs storage to fetch files to render.\n *\n * @public\n * @deprecated Import from `@backstage/plugin-techdocs-react` instead\n */\nexport interface TechDocsStorageApi {\n getApiOrigin(): Promise<string>;\n getStorageUrl(): Promise<string>;\n getBuilder(): Promise<string>;\n getEntityDocs(entityId: CompoundEntityRef, path: string): Promise<string>;\n syncEntityDocs(\n entityId: CompoundEntityRef,\n logHandler?: (line: string) => void,\n ): Promise<SyncResult>;\n getBaseUrl(\n oldBaseUrl: string,\n entityId: CompoundEntityRef,\n path: string,\n ): Promise<string>;\n}\n\n/**\n * API to talk to techdocs-backend.\n *\n * @public\n * @deprecated Import from `@backstage/plugin-techdocs-react` instead\n */\nexport interface TechDocsApi {\n getApiOrigin(): Promise<string>;\n getTechDocsMetadata(entityId: CompoundEntityRef): Promise<TechDocsMetadata>;\n getEntityMetadata(\n entityId: CompoundEntityRef,\n ): Promise<TechDocsEntityMetadata>;\n}\n"],"names":[],"mappings":";;AA6BO,MAAM,wBAAwB,YAAiC,CAAA;AAAA,EACpE,EAAI,EAAA,gCAAA;AACN,CAAC,EAAA;AAQM,MAAM,iBAAiB,YAA0B,CAAA;AAAA,EACtD,EAAI,EAAA,yBAAA;AACN,CAAC;;;;"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ResponseError, NotFoundError } from '@backstage/errors';
|
|
2
2
|
import { EventSourcePolyfill } from 'event-source-polyfill';
|
|
3
|
-
import { createRouteRef } from '@backstage/core-plugin-api';
|
|
4
3
|
|
|
5
4
|
var __defProp = Object.defineProperty;
|
|
6
5
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
@@ -174,16 +173,5 @@ class TechDocsStorageClient {
|
|
|
174
173
|
}
|
|
175
174
|
}
|
|
176
175
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
});
|
|
180
|
-
const rootDocsRouteRef = createRouteRef({
|
|
181
|
-
id: "techdocs:reader-page",
|
|
182
|
-
params: ["namespace", "kind", "name"]
|
|
183
|
-
});
|
|
184
|
-
const rootCatalogDocsRouteRef = createRouteRef({
|
|
185
|
-
id: "techdocs:catalog-reader-view"
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
export { TechDocsStorageClient as T, TechDocsClient as a, rootDocsRouteRef as b, rootCatalogDocsRouteRef as c, rootRouteRef as r };
|
|
189
|
-
//# sourceMappingURL=routes-VopnMGN0.esm.js.map
|
|
176
|
+
export { TechDocsClient, TechDocsStorageClient };
|
|
177
|
+
//# sourceMappingURL=client.esm.js.map
|
|
@@ -0,0 +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 { EventSourcePolyfill } from 'event-source-polyfill';\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 public identityApi: IdentityApi;\n private fetchApi: FetchApi;\n\n constructor(options: {\n configApi: Config;\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n fetchApi: FetchApi;\n }) {\n this.configApi = options.configApi;\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\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.getString('techdocs.builder');\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 const { token } = await this.identityApi.getCredentials();\n\n return new Promise((resolve, reject) => {\n // Polyfill is used to add support for custom headers and auth\n const source = new EventSourcePolyfill(url, {\n withCredentials: true,\n headers: token ? { Authorization: `Bearer ${token}` } : {},\n });\n\n source.addEventListener('log', (e: any) => {\n if (e.data) {\n logHandler(JSON.parse(e.data));\n }\n });\n\n source.addEventListener('finish', (e: any) => {\n let updated: boolean = false;\n\n if (e.data) {\n ({ updated } = JSON.parse(e.data));\n }\n\n resolve(updated ? 'updated' : 'cached');\n });\n\n source.onerror = (e: any) => {\n source.close();\n\n switch (e.status) {\n // the endpoint returned a 404 status\n case 404:\n reject(new NotFoundError(e.message));\n return;\n\n // also handles the event-stream close. the reject is ignored if the Promise was already\n // resolved by a finish event.\n default:\n reject(new Error(e.data));\n return;\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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.esm.js","sources":["../src/helpers.ts"],"sourcesContent":["/*\n * Copyright 2021 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 { Config } from '@backstage/config';\n\n// Lower-case entity triplets by default, but allow override.\nexport function toLowerMaybe(str: string, config: Config) {\n return config.getOptionalBoolean(\n 'techdocs.legacyUseCaseSensitiveTripletPaths',\n )\n ? str\n : str.toLocaleLowerCase('en-US');\n}\n"],"names":[],"mappings":"AAmBgB,SAAA,YAAA,CAAa,KAAa,MAAgB,EAAA;AACxD,EAAA,OAAO,MAAO,CAAA,kBAAA;AAAA,IACZ,6CAAA;AAAA,GAEE,GAAA,GAAA,GACA,GAAI,CAAA,iBAAA,CAAkB,OAAO,CAAA,CAAA;AACnC;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Content, ContentHeader, SupportButton } from '@backstage/core-components';
|
|
3
|
+
import { EntityListProvider, CatalogFilterLayout, UserListPicker, EntityOwnerPicker, EntityTagPicker } from '@backstage/plugin-catalog-react';
|
|
4
|
+
import { TechDocsPageWrapper } from './TechDocsPageWrapper.esm.js';
|
|
5
|
+
import { TechDocsPicker } from './TechDocsPicker.esm.js';
|
|
6
|
+
import { EntityListDocsTable } from './Tables/EntityListDocsTable.esm.js';
|
|
7
|
+
import './Tables/DocsTable.esm.js';
|
|
8
|
+
|
|
9
|
+
const DefaultTechDocsHome = (props) => {
|
|
10
|
+
const { initialFilter = "owned", columns, actions } = props;
|
|
11
|
+
return /* @__PURE__ */ React.createElement(TechDocsPageWrapper, null, /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, { title: "" }, /* @__PURE__ */ React.createElement(SupportButton, null, "Discover documentation in your ecosystem.")), /* @__PURE__ */ React.createElement(EntityListProvider, null, /* @__PURE__ */ React.createElement(CatalogFilterLayout, null, /* @__PURE__ */ React.createElement(CatalogFilterLayout.Filters, null, /* @__PURE__ */ React.createElement(TechDocsPicker, null), /* @__PURE__ */ React.createElement(UserListPicker, { initialFilter }), /* @__PURE__ */ React.createElement(EntityOwnerPicker, null), /* @__PURE__ */ React.createElement(EntityTagPicker, null)), /* @__PURE__ */ React.createElement(CatalogFilterLayout.Content, null, /* @__PURE__ */ React.createElement(EntityListDocsTable, { actions, columns }))))));
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { DefaultTechDocsHome };
|
|
15
|
+
//# sourceMappingURL=DefaultTechDocsHome.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultTechDocsHome.esm.js","sources":["../../../src/home/components/DefaultTechDocsHome.tsx"],"sourcesContent":["/*\n * Copyright 2021 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 React from 'react';\nimport {\n Content,\n ContentHeader,\n SupportButton,\n} from '@backstage/core-components';\nimport {\n CatalogFilterLayout,\n EntityListProvider,\n EntityOwnerPicker,\n EntityTagPicker,\n UserListPicker,\n} from '@backstage/plugin-catalog-react';\nimport { TechDocsPageWrapper } from './TechDocsPageWrapper';\nimport { TechDocsPicker } from './TechDocsPicker';\nimport { EntityListDocsTable } from './Tables';\nimport { TechDocsIndexPageProps } from './TechDocsIndexPage';\n\n/**\n * Props for {@link DefaultTechDocsHome}\n *\n * @public\n * @deprecated Please use `TechDocsIndexPageProps` instead.\n */\nexport type DefaultTechDocsHomeProps = TechDocsIndexPageProps;\n\n/**\n * Component which renders a default documentation landing page.\n *\n * @public\n */\nexport const DefaultTechDocsHome = (props: TechDocsIndexPageProps) => {\n const { initialFilter = 'owned', columns, actions } = props;\n return (\n <TechDocsPageWrapper>\n <Content>\n <ContentHeader title=\"\">\n <SupportButton>\n Discover documentation in your ecosystem.\n </SupportButton>\n </ContentHeader>\n <EntityListProvider>\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <TechDocsPicker />\n <UserListPicker initialFilter={initialFilter} />\n <EntityOwnerPicker />\n <EntityTagPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <EntityListDocsTable actions={actions} columns={columns} />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </EntityListProvider>\n </Content>\n </TechDocsPageWrapper>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AA+Ca,MAAA,mBAAA,GAAsB,CAAC,KAAkC,KAAA;AACpE,EAAA,MAAM,EAAE,aAAA,GAAgB,OAAS,EAAA,OAAA,EAAS,SAAY,GAAA,KAAA,CAAA;AACtD,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,2CACE,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,sCACE,aAAc,EAAA,EAAA,KAAA,EAAM,sBAClB,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EAAc,2CAEf,CACF,CAAA,sCACC,kBACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,2CACE,KAAA,CAAA,aAAA,CAAA,mBAAA,CAAoB,OAApB,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,IAAe,mBACf,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,eAA8B,CAC9C,kBAAA,KAAA,CAAA,aAAA,CAAC,uBAAkB,CACnB,kBAAA,KAAA,CAAA,aAAA,CAAC,eAAgB,EAAA,IAAA,CACnB,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,oBAAoB,OAApB,EAAA,IAAA,sCACE,mBAAoB,EAAA,EAAA,OAAA,EAAkB,SAAkB,CAC3D,CACF,CACF,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { rootDocsRouteRef } from '../../../routes.esm.js';
|
|
2
|
+
import { toLowerMaybe } from '../../../helpers.esm.js';
|
|
3
3
|
import { useRouteRef, useApi, configApiRef } from '@backstage/core-plugin-api';
|
|
4
4
|
import { ItemCardGrid, ItemCardHeader, LinkButton } from '@backstage/core-components';
|
|
5
5
|
import Card from '@material-ui/core/Card';
|
|
@@ -40,5 +40,5 @@ const DocsCardGrid = (props) => {
|
|
|
40
40
|
}));
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
export { DocsCardGrid
|
|
44
|
-
//# sourceMappingURL=DocsCardGrid
|
|
43
|
+
export { DocsCardGrid };
|
|
44
|
+
//# sourceMappingURL=DocsCardGrid.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocsCardGrid.esm.js","sources":["../../../../src/home/components/Grids/DocsCardGrid.tsx"],"sourcesContent":["/*\n * Copyright 2021 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 { rootDocsRouteRef } from '../../../routes';\nimport { toLowerMaybe } from '../../../helpers';\nimport { Entity } from '@backstage/catalog-model';\nimport { useApi, useRouteRef, configApiRef } from '@backstage/core-plugin-api';\nimport {\n LinkButton,\n ItemCardGrid,\n ItemCardHeader,\n} from '@backstage/core-components';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardMedia from '@material-ui/core/CardMedia';\nimport React from 'react';\n\n/**\n * Props for {@link DocsCardGrid}\n *\n * @public\n */\nexport type DocsCardGridProps = {\n entities: Entity[] | undefined;\n};\n\n/**\n * Component which accepts a list of entities and renders a item card for each entity\n *\n * @public\n */\nexport const DocsCardGrid = (props: DocsCardGridProps) => {\n const { entities } = props;\n const getRouteToReaderPageFor = useRouteRef(rootDocsRouteRef);\n const config = useApi(configApiRef);\n if (!entities) return null;\n return (\n <ItemCardGrid data-testid=\"docs-explore\">\n {!entities?.length\n ? null\n : entities.map((entity, index: number) => (\n <Card key={index}>\n <CardMedia>\n <ItemCardHeader\n title={entity.metadata.title ?? entity.metadata.name}\n />\n </CardMedia>\n <CardContent>{entity.metadata.description}</CardContent>\n <CardActions>\n <LinkButton\n to={getRouteToReaderPageFor({\n namespace: toLowerMaybe(\n entity.metadata.namespace ?? 'default',\n config,\n ),\n kind: toLowerMaybe(entity.kind, config),\n name: toLowerMaybe(entity.metadata.name, config),\n })}\n color=\"primary\"\n data-testid=\"read_docs\"\n >\n Read Docs\n </LinkButton>\n </CardActions>\n </Card>\n ))}\n </ItemCardGrid>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AA6Ca,MAAA,YAAA,GAAe,CAAC,KAA6B,KAAA;AACxD,EAAM,MAAA,EAAE,UAAa,GAAA,KAAA,CAAA;AACrB,EAAM,MAAA,uBAAA,GAA0B,YAAY,gBAAgB,CAAA,CAAA;AAC5D,EAAM,MAAA,MAAA,GAAS,OAAO,YAAY,CAAA,CAAA;AAClC,EAAA,IAAI,CAAC,QAAA;AAAU,IAAO,OAAA,IAAA,CAAA;AACtB,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,aAAY,EAAA,cAAA,EAAA,EACvB,EAAC,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAU,MACR,CAAA,GAAA,IAAA,GACA,QAAS,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAe,KAAA;AAtD/C,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AAuDY,IAAA,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,GAAA,EAAK,KACT,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,SACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,QAAO,EAAO,GAAA,MAAA,CAAA,QAAA,CAAS,KAAhB,KAAA,IAAA,GAAA,EAAA,GAAyB,OAAO,QAAS,CAAA,IAAA;AAAA,OAAA;AAAA,KAEpD,mBACC,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAA,EAAa,OAAO,QAAS,CAAA,WAAY,CAC1C,kBAAA,KAAA,CAAA,aAAA,CAAC,WACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAI,uBAAwB,CAAA;AAAA,UAC1B,SAAW,EAAA,YAAA;AAAA,YACT,CAAA,EAAA,GAAA,MAAA,CAAO,QAAS,CAAA,SAAA,KAAhB,IAA6B,GAAA,EAAA,GAAA,SAAA;AAAA,YAC7B,MAAA;AAAA,WACF;AAAA,UACA,IAAM,EAAA,YAAA,CAAa,MAAO,CAAA,IAAA,EAAM,MAAM,CAAA;AAAA,UACtC,IAAM,EAAA,YAAA,CAAa,MAAO,CAAA,QAAA,CAAS,MAAM,MAAM,CAAA;AAAA,SAChD,CAAA;AAAA,QACD,KAAM,EAAA,SAAA;AAAA,QACN,aAAY,EAAA,WAAA;AAAA,OAAA;AAAA,MACb,WAAA;AAAA,KAGH,CACF,CAAA,CAAA;AAAA,GACD,CACP,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { DocsCardGrid } from './DocsCardGrid.esm.js';
|
|
2
|
+
import { WarningPanel, CodeSnippet, Progress, Link, Content, ContentHeader } from '@backstage/core-components';
|
|
3
|
+
import { useEntityList, useEntityOwnership } from '@backstage/plugin-catalog-react';
|
|
4
|
+
import Typography from '@material-ui/core/Typography';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
const allEntitiesGroup = {
|
|
8
|
+
title: "All Documentation",
|
|
9
|
+
filterPredicate: () => true
|
|
10
|
+
};
|
|
11
|
+
const EntityListDocsGridGroup = (props) => {
|
|
12
|
+
const { entities, group } = props;
|
|
13
|
+
const { loading: loadingOwnership, isOwnedEntity } = useEntityOwnership();
|
|
14
|
+
const shownEntities = entities.filter((entity) => {
|
|
15
|
+
if (group.filterPredicate === "ownedByUser") {
|
|
16
|
+
if (loadingOwnership) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return isOwnedEntity(entity);
|
|
20
|
+
}
|
|
21
|
+
return typeof group.filterPredicate === "function" && group.filterPredicate(entity);
|
|
22
|
+
});
|
|
23
|
+
const titleComponent = (() => {
|
|
24
|
+
return typeof group.title === "string" ? /* @__PURE__ */ React.createElement(ContentHeader, { title: group.title }) : group.title;
|
|
25
|
+
})();
|
|
26
|
+
if (shownEntities.length === 0) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return /* @__PURE__ */ React.createElement(Content, null, titleComponent, /* @__PURE__ */ React.createElement(DocsCardGrid, { entities: shownEntities }));
|
|
30
|
+
};
|
|
31
|
+
const EntityListDocsGrid = (props) => {
|
|
32
|
+
const { loading, error, entities } = useEntityList();
|
|
33
|
+
if (error) {
|
|
34
|
+
return /* @__PURE__ */ React.createElement(
|
|
35
|
+
WarningPanel,
|
|
36
|
+
{
|
|
37
|
+
severity: "error",
|
|
38
|
+
title: "Could not load available documentation."
|
|
39
|
+
},
|
|
40
|
+
/* @__PURE__ */ React.createElement(CodeSnippet, { language: "text", text: error.toString() })
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
if (loading) {
|
|
44
|
+
return /* @__PURE__ */ React.createElement(Progress, null);
|
|
45
|
+
}
|
|
46
|
+
if (entities.length === 0) {
|
|
47
|
+
return /* @__PURE__ */ React.createElement("div", { "data-testid": "doc-not-found" }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, "No documentation found that match your filter. Learn more about", " ", /* @__PURE__ */ React.createElement(Link, { to: "https://backstage.io/docs/features/techdocs/creating-and-publishing" }, "publishing documentation"), "."));
|
|
48
|
+
}
|
|
49
|
+
entities.sort(
|
|
50
|
+
(a, b) => {
|
|
51
|
+
var _a, _b;
|
|
52
|
+
return ((_a = a.metadata.title) != null ? _a : a.metadata.name).localeCompare(
|
|
53
|
+
(_b = b.metadata.title) != null ? _b : b.metadata.name
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
return /* @__PURE__ */ React.createElement(Content, null, (props.groups || [allEntitiesGroup]).map((group, index) => /* @__PURE__ */ React.createElement(
|
|
58
|
+
EntityListDocsGridGroup,
|
|
59
|
+
{
|
|
60
|
+
entities,
|
|
61
|
+
group,
|
|
62
|
+
key: `${group.title}-${index}`
|
|
63
|
+
}
|
|
64
|
+
)));
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export { EntityListDocsGrid };
|
|
68
|
+
//# sourceMappingURL=EntityListDocsGrid.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityListDocsGrid.esm.js","sources":["../../../../src/home/components/Grids/EntityListDocsGrid.tsx"],"sourcesContent":["/*\n * Copyright 2021 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 { DocsCardGrid } from './DocsCardGrid';\nimport { Entity } from '@backstage/catalog-model';\nimport {\n CodeSnippet,\n Content,\n ContentHeader,\n Link,\n Progress,\n WarningPanel,\n} from '@backstage/core-components';\nimport {\n useEntityList,\n useEntityOwnership,\n} from '@backstage/plugin-catalog-react';\nimport Typography from '@material-ui/core/Typography';\nimport React from 'react';\n\n/**\n * Props for {@link EntityListDocsGrid}\n *\n * @public\n */\nexport type DocsGroupConfig = {\n title: React.ReactNode;\n filterPredicate: ((entity: Entity) => boolean) | string;\n};\n\n/**\n * Props for {@link EntityListDocsGrid}\n *\n * @public\n */\nexport type EntityListDocsGridPageProps = {\n groups?: DocsGroupConfig[];\n};\n\nconst allEntitiesGroup: DocsGroupConfig = {\n title: 'All Documentation',\n filterPredicate: () => true,\n};\n\nconst EntityListDocsGridGroup = (props: {\n group: DocsGroupConfig;\n entities: Entity[];\n}) => {\n const { entities, group } = props;\n const { loading: loadingOwnership, isOwnedEntity } = useEntityOwnership();\n\n const shownEntities = entities.filter(entity => {\n if (group.filterPredicate === 'ownedByUser') {\n if (loadingOwnership) {\n return false;\n }\n return isOwnedEntity(entity);\n }\n\n return (\n typeof group.filterPredicate === 'function' &&\n group.filterPredicate(entity)\n );\n });\n\n const titleComponent: React.ReactNode = (() => {\n return typeof group.title === 'string' ? (\n <ContentHeader title={group.title} />\n ) : (\n group.title\n );\n })();\n\n if (shownEntities.length === 0) {\n return null;\n }\n\n return (\n <Content>\n {titleComponent}\n <DocsCardGrid entities={shownEntities} />\n </Content>\n );\n};\n\n/**\n * Component responsible to get entities from entity list context and pass down to DocsCardGrid\n *\n * @public\n */\nexport const EntityListDocsGrid = (props: EntityListDocsGridPageProps) => {\n const { loading, error, entities } = useEntityList();\n\n if (error) {\n return (\n <WarningPanel\n severity=\"error\"\n title=\"Could not load available documentation.\"\n >\n <CodeSnippet language=\"text\" text={error.toString()} />\n </WarningPanel>\n );\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (entities.length === 0) {\n return (\n <div data-testid=\"doc-not-found\">\n <Typography variant=\"body2\">\n No documentation found that match your filter. Learn more about{' '}\n <Link to=\"https://backstage.io/docs/features/techdocs/creating-and-publishing\">\n publishing documentation\n </Link>\n .\n </Typography>\n </div>\n );\n }\n\n entities.sort((a, b) =>\n (a.metadata.title ?? a.metadata.name).localeCompare(\n b.metadata.title ?? b.metadata.name,\n ),\n );\n\n return (\n <Content>\n {(props.groups || [allEntitiesGroup]).map((group, index: number) => (\n <EntityListDocsGridGroup\n entities={entities}\n group={group}\n key={`${group.title}-${index}`}\n />\n ))}\n </Content>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import useCopyToClipboard from 'react-use/esm/useCopyToClipboard';
|
|
3
|
+
import { useRouteRef, useApi, configApiRef } from '@backstage/core-plugin-api';
|
|
4
|
+
import { RELATION_OWNED_BY } from '@backstage/catalog-model';
|
|
5
|
+
import { getEntityRelations, humanizeEntityRef } from '@backstage/plugin-catalog-react';
|
|
6
|
+
import { rootDocsRouteRef } from '../../../routes.esm.js';
|
|
7
|
+
import { Table, EmptyState, LinkButton } from '@backstage/core-components';
|
|
8
|
+
import { actionFactories } from './actions.esm.js';
|
|
9
|
+
import { columnFactories } from './columns.esm.js';
|
|
10
|
+
import { toLowerMaybe } from '../../../helpers.esm.js';
|
|
11
|
+
|
|
12
|
+
const DocsTable = (props) => {
|
|
13
|
+
const { entities, title, loading, columns, actions, options } = props;
|
|
14
|
+
const [, copyToClipboard] = useCopyToClipboard();
|
|
15
|
+
const getRouteToReaderPageFor = useRouteRef(rootDocsRouteRef);
|
|
16
|
+
const config = useApi(configApiRef);
|
|
17
|
+
if (!entities)
|
|
18
|
+
return null;
|
|
19
|
+
const documents = entities.map((entity) => {
|
|
20
|
+
var _a;
|
|
21
|
+
const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY);
|
|
22
|
+
return {
|
|
23
|
+
entity,
|
|
24
|
+
resolved: {
|
|
25
|
+
docsUrl: getRouteToReaderPageFor({
|
|
26
|
+
namespace: toLowerMaybe(
|
|
27
|
+
(_a = entity.metadata.namespace) != null ? _a : "default",
|
|
28
|
+
config
|
|
29
|
+
),
|
|
30
|
+
kind: toLowerMaybe(entity.kind, config),
|
|
31
|
+
name: toLowerMaybe(entity.metadata.name, config)
|
|
32
|
+
}),
|
|
33
|
+
ownedByRelations,
|
|
34
|
+
ownedByRelationsTitle: ownedByRelations.map((r) => humanizeEntityRef(r, { defaultKind: "group" })).join(", ")
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
const defaultColumns = [
|
|
39
|
+
columnFactories.createNameColumn(),
|
|
40
|
+
columnFactories.createOwnerColumn(),
|
|
41
|
+
columnFactories.createKindColumn(),
|
|
42
|
+
columnFactories.createTypeColumn()
|
|
43
|
+
];
|
|
44
|
+
const defaultActions = [
|
|
45
|
+
actionFactories.createCopyDocsUrlAction(copyToClipboard)
|
|
46
|
+
];
|
|
47
|
+
const pageSize = 20;
|
|
48
|
+
const paging = documents && documents.length > pageSize;
|
|
49
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, loading || documents && documents.length > 0 ? /* @__PURE__ */ React.createElement(
|
|
50
|
+
Table,
|
|
51
|
+
{
|
|
52
|
+
isLoading: loading,
|
|
53
|
+
options: {
|
|
54
|
+
paging,
|
|
55
|
+
pageSize,
|
|
56
|
+
search: true,
|
|
57
|
+
actionsColumnIndex: -1,
|
|
58
|
+
...options
|
|
59
|
+
},
|
|
60
|
+
data: documents,
|
|
61
|
+
columns: columns || defaultColumns,
|
|
62
|
+
actions: actions || defaultActions,
|
|
63
|
+
title: title ? `${title} (${documents.length})` : `All (${documents.length})`
|
|
64
|
+
}
|
|
65
|
+
) : /* @__PURE__ */ React.createElement(
|
|
66
|
+
EmptyState,
|
|
67
|
+
{
|
|
68
|
+
missing: "data",
|
|
69
|
+
title: "No documents to show",
|
|
70
|
+
description: "Create your own document. Check out our Getting Started Information",
|
|
71
|
+
action: /* @__PURE__ */ React.createElement(
|
|
72
|
+
LinkButton,
|
|
73
|
+
{
|
|
74
|
+
color: "primary",
|
|
75
|
+
to: "https://backstage.io/docs/features/techdocs/getting-started",
|
|
76
|
+
variant: "contained"
|
|
77
|
+
},
|
|
78
|
+
"DOCS"
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
));
|
|
82
|
+
};
|
|
83
|
+
DocsTable.columns = columnFactories;
|
|
84
|
+
DocsTable.actions = actionFactories;
|
|
85
|
+
|
|
86
|
+
export { DocsTable };
|
|
87
|
+
//# sourceMappingURL=DocsTable.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocsTable.esm.js","sources":["../../../../src/home/components/Tables/DocsTable.tsx"],"sourcesContent":["/*\n * Copyright 2021 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 React from 'react';\nimport useCopyToClipboard from 'react-use/esm/useCopyToClipboard';\n\nimport { configApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport {\n getEntityRelations,\n humanizeEntityRef,\n} from '@backstage/plugin-catalog-react';\nimport { rootDocsRouteRef } from '../../../routes';\nimport {\n EmptyState,\n LinkButton,\n Table,\n TableColumn,\n TableOptions,\n TableProps,\n} from '@backstage/core-components';\nimport { actionFactories } from './actions';\nimport { columnFactories } from './columns';\nimport { toLowerMaybe } from '../../../helpers';\nimport { DocsTableRow } from './types';\n\n/**\n * Props for {@link DocsTable}.\n *\n * @public\n */\nexport type DocsTableProps = {\n entities: Entity[] | undefined;\n title?: string | undefined;\n loading?: boolean | undefined;\n columns?: TableColumn<DocsTableRow>[];\n actions?: TableProps<DocsTableRow>['actions'];\n options?: TableOptions<DocsTableRow>;\n};\n\n/**\n * Component which renders a table documents\n *\n * @public\n */\nexport const DocsTable = (props: DocsTableProps) => {\n const { entities, title, loading, columns, actions, options } = props;\n const [, copyToClipboard] = useCopyToClipboard();\n const getRouteToReaderPageFor = useRouteRef(rootDocsRouteRef);\n const config = useApi(configApiRef);\n if (!entities) return null;\n\n const documents = entities.map(entity => {\n const ownedByRelations = getEntityRelations(entity, RELATION_OWNED_BY);\n return {\n entity,\n resolved: {\n docsUrl: getRouteToReaderPageFor({\n namespace: toLowerMaybe(\n entity.metadata.namespace ?? 'default',\n config,\n ),\n kind: toLowerMaybe(entity.kind, config),\n name: toLowerMaybe(entity.metadata.name, config),\n }),\n ownedByRelations,\n ownedByRelationsTitle: ownedByRelations\n .map(r => humanizeEntityRef(r, { defaultKind: 'group' }))\n .join(', '),\n },\n };\n });\n\n const defaultColumns: TableColumn<DocsTableRow>[] = [\n columnFactories.createNameColumn(),\n columnFactories.createOwnerColumn(),\n columnFactories.createKindColumn(),\n columnFactories.createTypeColumn(),\n ];\n\n const defaultActions: TableProps<DocsTableRow>['actions'] = [\n actionFactories.createCopyDocsUrlAction(copyToClipboard),\n ];\n\n const pageSize = 20;\n const paging = documents && documents.length > pageSize;\n\n return (\n <>\n {loading || (documents && documents.length > 0) ? (\n <Table<DocsTableRow>\n isLoading={loading}\n options={{\n paging,\n pageSize,\n search: true,\n actionsColumnIndex: -1,\n ...options,\n }}\n data={documents}\n columns={columns || defaultColumns}\n actions={actions || defaultActions}\n title={\n title\n ? `${title} (${documents.length})`\n : `All (${documents.length})`\n }\n />\n ) : (\n <EmptyState\n missing=\"data\"\n title=\"No documents to show\"\n description=\"Create your own document. Check out our Getting Started Information\"\n action={\n <LinkButton\n color=\"primary\"\n to=\"https://backstage.io/docs/features/techdocs/getting-started\"\n variant=\"contained\"\n >\n DOCS\n </LinkButton>\n }\n />\n )}\n </>\n );\n};\n\nDocsTable.columns = columnFactories;\nDocsTable.actions = actionFactories;\n"],"names":[],"mappings":"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"}
|