@backstage/plugin-techdocs 1.17.1-next.2 → 1.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/dist/alpha/components/TechDocsIndexPageContent.esm.js +36 -0
- package/dist/alpha/components/TechDocsIndexPageContent.esm.js.map +1 -0
- package/dist/alpha/components/TechDocsReaderContent.esm.js +35 -0
- package/dist/alpha/components/TechDocsReaderContent.esm.js.map +1 -0
- package/dist/alpha/components/TechDocsReaderEntityCard.esm.js +59 -0
- package/dist/alpha/components/TechDocsReaderEntityCard.esm.js.map +1 -0
- package/dist/alpha/components/TechDocsReaderEntityCard.module.css.esm.js +8 -0
- package/dist/alpha/components/TechDocsReaderEntityCard.module.css.esm.js.map +1 -0
- package/dist/alpha/components/TechDocsReaderHeader.esm.js +49 -0
- package/dist/alpha/components/TechDocsReaderHeader.esm.js.map +1 -0
- package/dist/alpha/components/TechDocsReaderLayout.esm.js +21 -0
- package/dist/alpha/components/TechDocsReaderLayout.esm.js.map +1 -0
- package/dist/alpha/components/TechDocsReaderSearch.esm.js +82 -0
- package/dist/alpha/components/TechDocsReaderSearch.esm.js.map +1 -0
- package/dist/alpha.d.ts +13 -0
- package/dist/alpha.esm.js +15 -20
- package/dist/alpha.esm.js.map +1 -1
- package/dist/hooks/useTechDocsReaderContentData.esm.js +63 -0
- package/dist/hooks/useTechDocsReaderContentData.esm.js.map +1 -0
- package/dist/hooks/useTechDocsReaderHeaderData.esm.js +70 -0
- package/dist/hooks/useTechDocsReaderHeaderData.esm.js.map +1 -0
- package/dist/hooks/useTechDocsSearch.esm.js +46 -0
- package/dist/hooks/useTechDocsSearch.esm.js.map +1 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +29 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -0
- package/dist/{package.json.esm.js → plugins/techdocs/package.json.esm.js} +3 -1
- package/dist/{package.json.esm.js.map → plugins/techdocs/package.json.esm.js.map} +1 -1
- package/dist/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js +18 -40
- package/dist/reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js.map +1 -1
- package/dist/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.esm.js +17 -43
- package/dist/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.esm.js.map +1 -1
- package/dist/search/components/TechDocsSearch.esm.js +5 -30
- package/dist/search/components/TechDocsSearch.esm.js.map +1 -1
- package/package.json +25 -23
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# @backstage/plugin-techdocs
|
|
2
2
|
|
|
3
|
+
## 1.17.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- f46c17d: Migrated the TechDocs alpha plugin pages to use BUI components. The index page and reader page now use BUI `Header` and `Container` instead of legacy `Page`/`Content`/`ContentHeader` wrappers. Added a `SupportButton` as a plugin header action. Changed plugin title to "Documentation" and icon to `RiArticleLine`.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @backstage/ui@0.13.1
|
|
10
|
+
- @backstage/frontend-plugin-api@0.15.1
|
|
11
|
+
|
|
12
|
+
## 1.17.1
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- 9795d30: chore(deps): bump `dompurify` from 3.3.1 to 3.3.2
|
|
17
|
+
- 30e08df: Added `documentation` as the default entity content group for the TechDocs entity content tab.
|
|
18
|
+
- 3f36ce1: Updated alpha plugin icons to follow the new frontend icon sizing rules when rendered in plugin and navigation surfaces.
|
|
19
|
+
- Updated dependencies
|
|
20
|
+
- @backstage/plugin-catalog-react@2.1.0
|
|
21
|
+
- @backstage/core-plugin-api@1.12.4
|
|
22
|
+
- @backstage/core-components@0.18.8
|
|
23
|
+
- @backstage/frontend-plugin-api@0.15.0
|
|
24
|
+
- @backstage/plugin-search-react@1.11.0
|
|
25
|
+
- @backstage/catalog-client@1.14.0
|
|
26
|
+
- @backstage/integration@2.0.0
|
|
27
|
+
- @backstage/catalog-model@1.7.7
|
|
28
|
+
- @backstage/integration-react@1.2.16
|
|
29
|
+
- @backstage/plugin-auth-react@0.1.25
|
|
30
|
+
- @backstage/plugin-techdocs-react@1.3.9
|
|
31
|
+
|
|
3
32
|
## 1.17.1-next.2
|
|
4
33
|
|
|
5
34
|
### Patch Changes
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Container } from '@backstage/ui';
|
|
3
|
+
import { EntityListProvider, CatalogFilterLayout, UserListPicker, EntityOwnerPicker, EntityTagPicker } from '@backstage/plugin-catalog-react';
|
|
4
|
+
import { TechDocsPicker } from '../../home/components/TechDocsPicker.esm.js';
|
|
5
|
+
import { EntityListDocsTable } from '../../home/components/Tables/EntityListDocsTable.esm.js';
|
|
6
|
+
import '../../home/components/Tables/DocsTable.esm.js';
|
|
7
|
+
|
|
8
|
+
const TechDocsIndexPageContent = (props) => {
|
|
9
|
+
const {
|
|
10
|
+
initialFilter = "owned",
|
|
11
|
+
columns,
|
|
12
|
+
actions,
|
|
13
|
+
ownerPickerMode,
|
|
14
|
+
pagination,
|
|
15
|
+
options
|
|
16
|
+
} = props;
|
|
17
|
+
return /* @__PURE__ */ jsx(Container, { mt: "6", children: /* @__PURE__ */ jsx(EntityListProvider, { pagination, children: /* @__PURE__ */ jsxs(CatalogFilterLayout, { children: [
|
|
18
|
+
/* @__PURE__ */ jsxs(CatalogFilterLayout.Filters, { children: [
|
|
19
|
+
/* @__PURE__ */ jsx(TechDocsPicker, {}),
|
|
20
|
+
/* @__PURE__ */ jsx(UserListPicker, { initialFilter }),
|
|
21
|
+
/* @__PURE__ */ jsx(EntityOwnerPicker, { mode: ownerPickerMode }),
|
|
22
|
+
/* @__PURE__ */ jsx(EntityTagPicker, {})
|
|
23
|
+
] }),
|
|
24
|
+
/* @__PURE__ */ jsx(CatalogFilterLayout.Content, { children: /* @__PURE__ */ jsx(
|
|
25
|
+
EntityListDocsTable,
|
|
26
|
+
{
|
|
27
|
+
actions,
|
|
28
|
+
columns,
|
|
29
|
+
options
|
|
30
|
+
}
|
|
31
|
+
) })
|
|
32
|
+
] }) }) });
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export { TechDocsIndexPageContent };
|
|
36
|
+
//# sourceMappingURL=TechDocsIndexPageContent.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TechDocsIndexPageContent.esm.js","sources":["../../../src/alpha/components/TechDocsIndexPageContent.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Container } from '@backstage/ui';\nimport {\n CatalogFilterLayout,\n EntityListProvider,\n EntityOwnerPicker,\n EntityTagPicker,\n UserListPicker,\n} from '@backstage/plugin-catalog-react';\nimport { TechDocsPicker } from '../../home/components/TechDocsPicker';\nimport { EntityListDocsTable } from '../../home/components/Tables';\nimport type { TechDocsIndexPageProps } from '../../home/components/TechDocsIndexPage';\n\nexport const TechDocsIndexPageContent = (props: TechDocsIndexPageProps) => {\n const {\n initialFilter = 'owned',\n columns,\n actions,\n ownerPickerMode,\n pagination,\n options,\n } = props;\n\n return (\n <Container mt=\"6\">\n <EntityListProvider pagination={pagination}>\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <TechDocsPicker />\n <UserListPicker initialFilter={initialFilter} />\n <EntityOwnerPicker mode={ownerPickerMode} />\n <EntityTagPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <EntityListDocsTable\n actions={actions}\n columns={columns}\n options={options}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </EntityListProvider>\n </Container>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA4BO,MAAM,wBAAA,GAA2B,CAAC,KAAA,KAAkC;AACzE,EAAA,MAAM;AAAA,IACJ,aAAA,GAAgB,OAAA;AAAA,IAChB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,uBACE,GAAA,CAAC,aAAU,EAAA,EAAG,GAAA,EACZ,8BAAC,kBAAA,EAAA,EAAmB,UAAA,EAClB,+BAAC,mBAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,mBAAA,CAAoB,SAApB,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,CAAA;AAAA,sBAChB,GAAA,CAAC,kBAAe,aAAA,EAA8B,CAAA;AAAA,sBAC9C,GAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,eAAA,EAAiB,CAAA;AAAA,0BACzC,eAAA,EAAA,EAAgB;AAAA,KAAA,EACnB,CAAA;AAAA,oBACA,GAAA,CAAC,mBAAA,CAAoB,OAAA,EAApB,EACC,QAAA,kBAAA,GAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA;AAAA,KACF,EACF;AAAA,GAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { TechDocsShadowDom } from '@backstage/plugin-techdocs-react';
|
|
3
|
+
import { Progress } from '@backstage/core-components';
|
|
4
|
+
import { TechDocsStateIndicator } from '../../reader/components/TechDocsStateIndicator.esm.js';
|
|
5
|
+
import { withTechDocsReaderProvider } from '../../reader/components/TechDocsReaderProvider.esm.js';
|
|
6
|
+
import { TechDocsReaderPageContentAddons } from '../../reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons.esm.js';
|
|
7
|
+
import { useTechDocsReaderContentData } from '../../hooks/useTechDocsReaderContentData.esm.js';
|
|
8
|
+
|
|
9
|
+
const TechDocsReaderContent = withTechDocsReaderProvider(
|
|
10
|
+
(props) => {
|
|
11
|
+
const {
|
|
12
|
+
dom,
|
|
13
|
+
handleAppend,
|
|
14
|
+
isNotFound,
|
|
15
|
+
isDomReady,
|
|
16
|
+
showProgress,
|
|
17
|
+
NotFoundErrorPage
|
|
18
|
+
} = useTechDocsReaderContentData({
|
|
19
|
+
defaultPath: props.defaultPath,
|
|
20
|
+
onReady: props.onReady
|
|
21
|
+
});
|
|
22
|
+
if (isNotFound) return /* @__PURE__ */ jsx(NotFoundErrorPage, {});
|
|
23
|
+
if (!isDomReady) {
|
|
24
|
+
return /* @__PURE__ */ jsx(TechDocsStateIndicator, {});
|
|
25
|
+
}
|
|
26
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
27
|
+
/* @__PURE__ */ jsx(TechDocsStateIndicator, {}),
|
|
28
|
+
showProgress && /* @__PURE__ */ jsx(Progress, {}),
|
|
29
|
+
/* @__PURE__ */ jsx(TechDocsShadowDom, { element: dom, onAppend: handleAppend, children: /* @__PURE__ */ jsx(TechDocsReaderPageContentAddons, {}) })
|
|
30
|
+
] });
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
export { TechDocsReaderContent };
|
|
35
|
+
//# sourceMappingURL=TechDocsReaderContent.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TechDocsReaderContent.esm.js","sources":["../../../src/alpha/components/TechDocsReaderContent.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TechDocsShadowDom } from '@backstage/plugin-techdocs-react';\nimport { Progress } from '@backstage/core-components';\n\nimport { TechDocsStateIndicator } from '../../reader/components/TechDocsStateIndicator';\nimport { withTechDocsReaderProvider } from '../../reader/components/TechDocsReaderProvider';\nimport { TechDocsReaderPageContentAddons } from '../../reader/components/TechDocsReaderPageContent/TechDocsReaderPageContentAddons';\nimport type { TechDocsReaderPageContentProps } from '../../reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent';\nimport { useTechDocsReaderContentData } from '../../hooks/useTechDocsReaderContentData';\n\nexport const TechDocsReaderContent = withTechDocsReaderProvider(\n (props: TechDocsReaderPageContentProps) => {\n const {\n dom,\n handleAppend,\n isNotFound,\n isDomReady,\n showProgress,\n NotFoundErrorPage,\n } = useTechDocsReaderContentData({\n defaultPath: props.defaultPath,\n onReady: props.onReady,\n });\n\n if (isNotFound) return <NotFoundErrorPage />;\n\n if (!isDomReady) {\n return <TechDocsStateIndicator />;\n }\n\n return (\n <>\n <TechDocsStateIndicator />\n {showProgress && <Progress />}\n <TechDocsShadowDom element={dom!} onAppend={handleAppend}>\n <TechDocsReaderPageContentAddons />\n </TechDocsShadowDom>\n </>\n );\n },\n);\n"],"names":[],"mappings":";;;;;;;;AAyBO,MAAM,qBAAA,GAAwB,0BAAA;AAAA,EACnC,CAAC,KAAA,KAA0C;AACzC,IAAA,MAAM;AAAA,MACJ,GAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,QACE,4BAAA,CAA6B;AAAA,MAC/B,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,SAAS,KAAA,CAAM;AAAA,KAChB,CAAA;AAED,IAAA,IAAI,UAAA,EAAY,uBAAO,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA;AAE1C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,2BAAQ,sBAAA,EAAA,EAAuB,CAAA;AAAA,IACjC;AAEA,IAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,sBAAA,EAAA,EAAuB,CAAA;AAAA,MACvB,YAAA,wBAAiB,QAAA,EAAA,EAAS,CAAA;AAAA,sBAC3B,GAAA,CAAC,qBAAkB,OAAA,EAAS,GAAA,EAAM,UAAU,YAAA,EAC1C,QAAA,kBAAA,GAAA,CAAC,mCAAgC,CAAA,EACnC;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useTechDocsReaderPage } from '@backstage/plugin-techdocs-react';
|
|
3
|
+
import { getEntityRelations, EntityRefLink, EntityRefLinks } from '@backstage/plugin-catalog-react';
|
|
4
|
+
import { RELATION_OWNED_BY } from '@backstage/catalog-model';
|
|
5
|
+
import { Card, CardBody, Text } from '@backstage/ui';
|
|
6
|
+
import capitalize from 'lodash/capitalize';
|
|
7
|
+
import styles from './TechDocsReaderEntityCard.module.css.esm.js';
|
|
8
|
+
import { TechDocsReaderSearch } from './TechDocsReaderSearch.esm.js';
|
|
9
|
+
|
|
10
|
+
const TechDocsReaderEntityCard = (props) => {
|
|
11
|
+
const { withSearch } = props;
|
|
12
|
+
const {
|
|
13
|
+
entityRef,
|
|
14
|
+
entityMetadata: { value: entityMetadata, loading: entityMetadataLoading }
|
|
15
|
+
} = useTechDocsReaderPage();
|
|
16
|
+
if (entityMetadataLoading || !entityMetadata) return null;
|
|
17
|
+
const { spec } = entityMetadata;
|
|
18
|
+
const lifecycle = spec?.lifecycle;
|
|
19
|
+
const ownedByRelations = getEntityRelations(
|
|
20
|
+
entityMetadata,
|
|
21
|
+
RELATION_OWNED_BY
|
|
22
|
+
);
|
|
23
|
+
return /* @__PURE__ */ jsx(Card, { className: styles.entityCard, children: /* @__PURE__ */ jsxs(CardBody, { className: styles.cardBody, children: [
|
|
24
|
+
/* @__PURE__ */ jsxs("dl", { className: styles.definitionList, children: [
|
|
25
|
+
/* @__PURE__ */ jsxs("div", { className: styles.definitionGroup, children: [
|
|
26
|
+
/* @__PURE__ */ jsx("dt", { children: /* @__PURE__ */ jsxs(Text, { variant: "body-small", weight: "bold", children: [
|
|
27
|
+
capitalize(entityMetadata.kind),
|
|
28
|
+
":"
|
|
29
|
+
] }) }),
|
|
30
|
+
/* @__PURE__ */ jsx("dd", { className: styles.definitionValue, children: /* @__PURE__ */ jsx(
|
|
31
|
+
EntityRefLink,
|
|
32
|
+
{
|
|
33
|
+
entityRef,
|
|
34
|
+
title: entityMetadata.metadata.title,
|
|
35
|
+
defaultKind: "Component"
|
|
36
|
+
}
|
|
37
|
+
) })
|
|
38
|
+
] }),
|
|
39
|
+
ownedByRelations.length > 0 && /* @__PURE__ */ jsxs("div", { className: styles.definitionGroup, children: [
|
|
40
|
+
/* @__PURE__ */ jsx("dt", { children: /* @__PURE__ */ jsx(Text, { variant: "body-small", weight: "bold", children: "Owner:" }) }),
|
|
41
|
+
/* @__PURE__ */ jsx("dd", { className: styles.definitionValue, children: /* @__PURE__ */ jsx(
|
|
42
|
+
EntityRefLinks,
|
|
43
|
+
{
|
|
44
|
+
entityRefs: ownedByRelations,
|
|
45
|
+
defaultKind: "group"
|
|
46
|
+
}
|
|
47
|
+
) })
|
|
48
|
+
] }),
|
|
49
|
+
lifecycle && /* @__PURE__ */ jsxs("div", { className: styles.definitionGroup, children: [
|
|
50
|
+
/* @__PURE__ */ jsx("dt", { children: /* @__PURE__ */ jsx(Text, { variant: "body-small", weight: "bold", children: "Lifecycle:" }) }),
|
|
51
|
+
/* @__PURE__ */ jsx("dd", { className: styles.definitionValue, children: /* @__PURE__ */ jsx(Text, { variant: "body-small", children: String(lifecycle) }) })
|
|
52
|
+
] })
|
|
53
|
+
] }),
|
|
54
|
+
withSearch && /* @__PURE__ */ jsx("div", { className: styles.searchWrapper, children: /* @__PURE__ */ jsx(TechDocsReaderSearch, { entityId: entityRef }) })
|
|
55
|
+
] }) });
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export { TechDocsReaderEntityCard };
|
|
59
|
+
//# sourceMappingURL=TechDocsReaderEntityCard.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TechDocsReaderEntityCard.esm.js","sources":["../../../src/alpha/components/TechDocsReaderEntityCard.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useTechDocsReaderPage } from '@backstage/plugin-techdocs-react';\nimport {\n EntityRefLink,\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport { Card, CardBody, Text } from '@backstage/ui';\nimport capitalize from 'lodash/capitalize';\nimport styles from './TechDocsReaderEntityCard.module.css';\nimport { TechDocsReaderSearch } from './TechDocsReaderSearch';\n\nexport type TechDocsReaderEntityCardProps = {\n withSearch?: boolean;\n};\n\nexport const TechDocsReaderEntityCard = (\n props: TechDocsReaderEntityCardProps,\n) => {\n const { withSearch } = props;\n const {\n entityRef,\n entityMetadata: { value: entityMetadata, loading: entityMetadataLoading },\n } = useTechDocsReaderPage();\n\n if (entityMetadataLoading || !entityMetadata) return null;\n\n const { spec } = entityMetadata;\n const lifecycle = spec?.lifecycle;\n const ownedByRelations = getEntityRelations(\n entityMetadata,\n RELATION_OWNED_BY,\n );\n\n return (\n <Card className={styles.entityCard}>\n <CardBody className={styles.cardBody}>\n <dl className={styles.definitionList}>\n <div className={styles.definitionGroup}>\n <dt>\n <Text variant=\"body-small\" weight=\"bold\">\n {capitalize(entityMetadata.kind)}:\n </Text>\n </dt>\n <dd className={styles.definitionValue}>\n <EntityRefLink\n entityRef={entityRef}\n title={entityMetadata.metadata.title}\n defaultKind=\"Component\"\n />\n </dd>\n </div>\n {ownedByRelations.length > 0 && (\n <div className={styles.definitionGroup}>\n <dt>\n <Text variant=\"body-small\" weight=\"bold\">\n Owner:\n </Text>\n </dt>\n <dd className={styles.definitionValue}>\n <EntityRefLinks\n entityRefs={ownedByRelations}\n defaultKind=\"group\"\n />\n </dd>\n </div>\n )}\n {lifecycle && (\n <div className={styles.definitionGroup}>\n <dt>\n <Text variant=\"body-small\" weight=\"bold\">\n Lifecycle:\n </Text>\n </dt>\n <dd className={styles.definitionValue}>\n <Text variant=\"body-small\">{String(lifecycle)}</Text>\n </dd>\n </div>\n )}\n </dl>\n {withSearch && (\n <div className={styles.searchWrapper}>\n <TechDocsReaderSearch entityId={entityRef} />\n </div>\n )}\n </CardBody>\n </Card>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".TechDocsReaderEntityCard_entityCard__d9e940aed2 {\n margin-bottom: var(--bui-space-6);\n}\n\n.TechDocsReaderEntityCard_cardBody__d9e940aed2 {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: var(--bui-space-4);\n}\n\n.TechDocsReaderEntityCard_definitionList__d9e940aed2 {\n display: flex;\n flex-wrap: wrap;\n gap: var(--bui-space-6);\n margin: 0;\n padding: 0;\n flex: 1 1 0;\n align-self: center;\n}\n\n.TechDocsReaderEntityCard_definitionGroup__d9e940aed2 {\n display: flex;\n align-items: baseline;\n gap: var(--bui-space-2);\n}\n\n.TechDocsReaderEntityCard_definitionValue__d9e940aed2 {\n margin: 0;\n}\n\n.TechDocsReaderEntityCard_searchWrapper__d9e940aed2 {\n flex: 1 1 200px;\n max-width: 240px;\n}\n";
|
|
4
|
+
var styles = {"entityCard":"TechDocsReaderEntityCard_entityCard__d9e940aed2","cardBody":"TechDocsReaderEntityCard_cardBody__d9e940aed2","definitionList":"TechDocsReaderEntityCard_definitionList__d9e940aed2","definitionGroup":"TechDocsReaderEntityCard_definitionGroup__d9e940aed2","definitionValue":"TechDocsReaderEntityCard_definitionValue__d9e940aed2","searchWrapper":"TechDocsReaderEntityCard_searchWrapper__d9e940aed2"};
|
|
5
|
+
styleInject(css_248z);
|
|
6
|
+
|
|
7
|
+
export { styles as default };
|
|
8
|
+
//# sourceMappingURL=TechDocsReaderEntityCard.module.css.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TechDocsReaderEntityCard.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import Helmet from 'react-helmet';
|
|
3
|
+
import { Header, ButtonLink } from '@backstage/ui';
|
|
4
|
+
import { RiCodeLine } from '@remixicon/react';
|
|
5
|
+
import { TechDocsAddonLocations } from '@backstage/plugin-techdocs-react';
|
|
6
|
+
import { TechDocsReaderSearch } from './TechDocsReaderSearch.esm.js';
|
|
7
|
+
import { useTechDocsReaderHeaderData } from '../../hooks/useTechDocsReaderHeaderData.esm.js';
|
|
8
|
+
|
|
9
|
+
const TechDocsReaderHeader = (props) => {
|
|
10
|
+
const { withSearch = true } = props;
|
|
11
|
+
const {
|
|
12
|
+
title,
|
|
13
|
+
entityRef,
|
|
14
|
+
tabTitle,
|
|
15
|
+
hidden,
|
|
16
|
+
showSourceLink,
|
|
17
|
+
sourceLink,
|
|
18
|
+
addons
|
|
19
|
+
} = useTechDocsReaderHeaderData();
|
|
20
|
+
if (hidden) return null;
|
|
21
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
22
|
+
/* @__PURE__ */ jsx(Helmet, { titleTemplate: "%s", children: /* @__PURE__ */ jsx("title", { children: tabTitle }) }),
|
|
23
|
+
/* @__PURE__ */ jsx(
|
|
24
|
+
Header,
|
|
25
|
+
{
|
|
26
|
+
title: title || "",
|
|
27
|
+
customActions: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
28
|
+
withSearch && /* @__PURE__ */ jsx(TechDocsReaderSearch, { entityId: entityRef }),
|
|
29
|
+
showSourceLink && /* @__PURE__ */ jsx(
|
|
30
|
+
ButtonLink,
|
|
31
|
+
{
|
|
32
|
+
href: sourceLink,
|
|
33
|
+
target: "_blank",
|
|
34
|
+
rel: "noopener noreferrer",
|
|
35
|
+
variant: "secondary",
|
|
36
|
+
size: "small",
|
|
37
|
+
iconStart: /* @__PURE__ */ jsx(RiCodeLine, {}),
|
|
38
|
+
"aria-label": "View source"
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
addons.renderComponentsByLocation(TechDocsAddonLocations.Header)
|
|
42
|
+
] })
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
] });
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export { TechDocsReaderHeader };
|
|
49
|
+
//# sourceMappingURL=TechDocsReaderHeader.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TechDocsReaderHeader.esm.js","sources":["../../../src/alpha/components/TechDocsReaderHeader.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Helmet from 'react-helmet';\nimport { Header, ButtonLink } from '@backstage/ui';\nimport { RiCodeLine } from '@remixicon/react';\nimport { TechDocsAddonLocations as locations } from '@backstage/plugin-techdocs-react';\nimport { TechDocsReaderSearch } from './TechDocsReaderSearch';\nimport { useTechDocsReaderHeaderData } from '../../hooks/useTechDocsReaderHeaderData';\n\nexport type TechDocsReaderHeaderProps = {\n withSearch?: boolean;\n};\n\nexport const TechDocsReaderHeader = (props: TechDocsReaderHeaderProps) => {\n const { withSearch = true } = props;\n const {\n title,\n entityRef,\n tabTitle,\n hidden,\n showSourceLink,\n sourceLink,\n addons,\n } = useTechDocsReaderHeaderData();\n\n if (hidden) return null;\n\n return (\n <>\n <Helmet titleTemplate=\"%s\">\n <title>{tabTitle}</title>\n </Helmet>\n <Header\n title={title || ''}\n customActions={\n <>\n {withSearch && <TechDocsReaderSearch entityId={entityRef} />}\n {showSourceLink && (\n <ButtonLink\n href={sourceLink!}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n variant=\"secondary\"\n size=\"small\"\n iconStart={<RiCodeLine />}\n aria-label=\"View source\"\n />\n )}\n {addons.renderComponentsByLocation(locations.Header)}\n </>\n }\n />\n </>\n );\n};\n"],"names":["locations"],"mappings":";;;;;;;;AA2BO,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAqC;AACxE,EAAA,MAAM,EAAE,UAAA,GAAa,IAAA,EAAK,GAAI,KAAA;AAC9B,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE,2BAAA,EAA4B;AAEhC,EAAA,IAAI,QAAQ,OAAO,IAAA;AAEnB,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAO,aAAA,EAAc,IAAA,EACpB,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EAAO,oBAAS,CAAA,EACnB,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,+BACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,UAAA,oBAAc,GAAA,CAAC,oBAAA,EAAA,EAAqB,QAAA,EAAU,SAAA,EAAW,CAAA;AAAA,UACzD,cAAA,oBACC,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAM,UAAA;AAAA,cACN,MAAA,EAAO,QAAA;AAAA,cACP,GAAA,EAAI,qBAAA;AAAA,cACJ,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,OAAA;AAAA,cACL,SAAA,sBAAY,UAAA,EAAA,EAAW,CAAA;AAAA,cACvB,YAAA,EAAW;AAAA;AAAA,WACb;AAAA,UAED,MAAA,CAAO,0BAAA,CAA2BA,sBAAA,CAAU,MAAM;AAAA,SAAA,EACrD;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Container } from '@backstage/ui';
|
|
3
|
+
import { TechDocsReaderHeader } from './TechDocsReaderHeader.esm.js';
|
|
4
|
+
import { TechDocsReaderEntityCard } from './TechDocsReaderEntityCard.esm.js';
|
|
5
|
+
import { TechDocsReaderPageSubheader } from '../../reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.esm.js';
|
|
6
|
+
import { TechDocsReaderContent } from './TechDocsReaderContent.esm.js';
|
|
7
|
+
|
|
8
|
+
const TechDocsReaderLayout = (props) => {
|
|
9
|
+
const { withSearch, withHeader = true } = props;
|
|
10
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
11
|
+
withHeader && /* @__PURE__ */ jsx(TechDocsReaderHeader, { withSearch }),
|
|
12
|
+
/* @__PURE__ */ jsxs(Container, { mt: "6", children: [
|
|
13
|
+
/* @__PURE__ */ jsx(TechDocsReaderEntityCard, { withSearch: !withHeader && withSearch }),
|
|
14
|
+
/* @__PURE__ */ jsx(TechDocsReaderPageSubheader, {}),
|
|
15
|
+
/* @__PURE__ */ jsx(TechDocsReaderContent, {})
|
|
16
|
+
] })
|
|
17
|
+
] });
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { TechDocsReaderLayout };
|
|
21
|
+
//# sourceMappingURL=TechDocsReaderLayout.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TechDocsReaderLayout.esm.js","sources":["../../../src/alpha/components/TechDocsReaderLayout.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Container } from '@backstage/ui';\nimport { TechDocsReaderHeader } from './TechDocsReaderHeader';\nimport { TechDocsReaderEntityCard } from './TechDocsReaderEntityCard';\nimport { TechDocsReaderPageSubheader } from '../../reader/components/TechDocsReaderPageSubheader';\nimport { TechDocsReaderContent } from './TechDocsReaderContent';\n\nexport type TechDocsReaderLayoutProps = {\n withHeader?: boolean;\n withSearch?: boolean;\n};\n\nexport const TechDocsReaderLayout = (props: TechDocsReaderLayoutProps) => {\n const { withSearch, withHeader = true } = props;\n return (\n <>\n {withHeader && <TechDocsReaderHeader withSearch={withSearch} />}\n <Container mt=\"6\">\n <TechDocsReaderEntityCard withSearch={!withHeader && withSearch} />\n <TechDocsReaderPageSubheader />\n <TechDocsReaderContent />\n </Container>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA2BO,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAqC;AACxE,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,GAAa,IAAA,EAAK,GAAI,KAAA;AAC1C,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,UAAA,oBAAc,GAAA,CAAC,wBAAqB,UAAA,EAAwB,CAAA;AAAA,oBAC7D,IAAA,CAAC,SAAA,EAAA,EAAU,EAAA,EAAG,GAAA,EACZ,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,wBAAA,EAAA,EAAyB,UAAA,EAAY,CAAC,UAAA,IAAc,UAAA,EAAY,CAAA;AAAA,0BAChE,2BAAA,EAAA,EAA4B,CAAA;AAAA,0BAC5B,qBAAA,EAAA,EAAsB;AAAA,KAAA,EACzB;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useNavigate } from 'react-router-dom';
|
|
3
|
+
import { SearchAutocomplete, SearchAutocompleteItem, Flex, Text } from '@backstage/ui';
|
|
4
|
+
import { SearchContextProvider, HighlightedSearchResultText } from '@backstage/plugin-search-react';
|
|
5
|
+
import { useTechDocsSearch } from '../../hooks/useTechDocsSearch.esm.js';
|
|
6
|
+
|
|
7
|
+
const TechDocsReaderSearchBar = (props) => {
|
|
8
|
+
const { entityId } = props;
|
|
9
|
+
const navigate = useNavigate();
|
|
10
|
+
const { results, term, setTerm, deferredLoading } = useTechDocsSearch(entityId);
|
|
11
|
+
return /* @__PURE__ */ jsx(
|
|
12
|
+
SearchAutocomplete,
|
|
13
|
+
{
|
|
14
|
+
"aria-label": "Search docs",
|
|
15
|
+
placeholder: "Search docs",
|
|
16
|
+
size: "small",
|
|
17
|
+
inputValue: term,
|
|
18
|
+
onInputChange: setTerm,
|
|
19
|
+
isLoading: deferredLoading,
|
|
20
|
+
popoverWidth: "min(720px, calc(100vw - 32px))",
|
|
21
|
+
popoverPlacement: "bottom end",
|
|
22
|
+
children: results.map((result, index) => /* @__PURE__ */ jsx(
|
|
23
|
+
SearchAutocompleteItem,
|
|
24
|
+
{
|
|
25
|
+
id: String(index),
|
|
26
|
+
textValue: result.document.title,
|
|
27
|
+
onAction: () => {
|
|
28
|
+
setTerm("");
|
|
29
|
+
navigate(result.document.location);
|
|
30
|
+
requestAnimationFrame(() => {
|
|
31
|
+
document.activeElement?.blur();
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "1", children: [
|
|
35
|
+
/* @__PURE__ */ jsx(Text, { weight: "bold", children: result.highlight?.fields.title ? /* @__PURE__ */ jsx(
|
|
36
|
+
HighlightedSearchResultText,
|
|
37
|
+
{
|
|
38
|
+
text: result.highlight.fields.title,
|
|
39
|
+
preTag: result.highlight.preTag,
|
|
40
|
+
postTag: result.highlight.postTag
|
|
41
|
+
}
|
|
42
|
+
) : result.document.title }),
|
|
43
|
+
(result.highlight?.fields.text || result.document.text) && /* @__PURE__ */ jsx(
|
|
44
|
+
Text,
|
|
45
|
+
{
|
|
46
|
+
variant: "body-small",
|
|
47
|
+
color: "secondary",
|
|
48
|
+
style: {
|
|
49
|
+
display: "-webkit-box",
|
|
50
|
+
WebkitLineClamp: 3,
|
|
51
|
+
WebkitBoxOrient: "vertical",
|
|
52
|
+
overflow: "hidden"
|
|
53
|
+
},
|
|
54
|
+
children: result.highlight?.fields.text ? /* @__PURE__ */ jsx(
|
|
55
|
+
HighlightedSearchResultText,
|
|
56
|
+
{
|
|
57
|
+
text: result.highlight.fields.text,
|
|
58
|
+
preTag: result.highlight.preTag,
|
|
59
|
+
postTag: result.highlight.postTag
|
|
60
|
+
}
|
|
61
|
+
) : result.document.text
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
] })
|
|
65
|
+
},
|
|
66
|
+
index
|
|
67
|
+
))
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
const TechDocsReaderSearch = (props) => {
|
|
72
|
+
const initialState = {
|
|
73
|
+
term: "",
|
|
74
|
+
types: ["techdocs"],
|
|
75
|
+
pageCursor: "",
|
|
76
|
+
filters: props.entityId
|
|
77
|
+
};
|
|
78
|
+
return /* @__PURE__ */ jsx(SearchContextProvider, { initialState, children: /* @__PURE__ */ jsx(TechDocsReaderSearchBar, { ...props }) });
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export { TechDocsReaderSearch };
|
|
82
|
+
//# sourceMappingURL=TechDocsReaderSearch.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TechDocsReaderSearch.esm.js","sources":["../../../src/alpha/components/TechDocsReaderSearch.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useNavigate } from 'react-router-dom';\nimport {\n Text,\n Flex,\n SearchAutocomplete,\n SearchAutocompleteItem,\n} from '@backstage/ui';\nimport { SearchContextProvider } from '@backstage/plugin-search-react';\nimport { CompoundEntityRef } from '@backstage/catalog-model';\nimport { HighlightedSearchResultText } from '@backstage/plugin-search-react';\nimport { useTechDocsSearch } from '../../hooks/useTechDocsSearch';\n\ntype TechDocsReaderSearchBarProps = {\n entityId: CompoundEntityRef;\n};\n\nconst TechDocsReaderSearchBar = (props: TechDocsReaderSearchBarProps) => {\n const { entityId } = props;\n const navigate = useNavigate();\n const { results, term, setTerm, deferredLoading } =\n useTechDocsSearch(entityId);\n\n return (\n <SearchAutocomplete\n aria-label=\"Search docs\"\n placeholder=\"Search docs\"\n size=\"small\"\n inputValue={term}\n onInputChange={setTerm}\n isLoading={deferredLoading}\n popoverWidth=\"min(720px, calc(100vw - 32px))\"\n popoverPlacement=\"bottom end\"\n >\n {results.map((result, index) => (\n <SearchAutocompleteItem\n key={index}\n id={String(index)}\n textValue={result.document.title}\n onAction={() => {\n setTerm('');\n navigate(result.document.location);\n requestAnimationFrame(() => {\n (document.activeElement as HTMLElement)?.blur();\n });\n }}\n >\n <Flex direction=\"column\" gap=\"1\">\n <Text weight=\"bold\">\n {result.highlight?.fields.title ? (\n <HighlightedSearchResultText\n text={result.highlight.fields.title}\n preTag={result.highlight.preTag}\n postTag={result.highlight.postTag}\n />\n ) : (\n result.document.title\n )}\n </Text>\n {(result.highlight?.fields.text || result.document.text) && (\n <Text\n variant=\"body-small\"\n color=\"secondary\"\n style={{\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {result.highlight?.fields.text ? (\n <HighlightedSearchResultText\n text={result.highlight.fields.text}\n preTag={result.highlight.preTag}\n postTag={result.highlight.postTag}\n />\n ) : (\n result.document.text\n )}\n </Text>\n )}\n </Flex>\n </SearchAutocompleteItem>\n ))}\n </SearchAutocomplete>\n );\n};\n\nexport type TechDocsReaderSearchProps = {\n entityId: CompoundEntityRef;\n};\n\nexport const TechDocsReaderSearch = (props: TechDocsReaderSearchProps) => {\n const initialState = {\n term: '',\n types: ['techdocs'],\n pageCursor: '',\n filters: props.entityId,\n };\n return (\n <SearchContextProvider initialState={initialState}>\n <TechDocsReaderSearchBar {...props} />\n </SearchContextProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;AAgCA,MAAM,uBAAA,GAA0B,CAAC,KAAA,KAAwC;AACvE,EAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AACrB,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,SAAS,eAAA,EAAgB,GAC9C,kBAAkB,QAAQ,CAAA;AAE5B,EAAA,uBACE,GAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAW,aAAA;AAAA,MACX,WAAA,EAAY,aAAA;AAAA,MACZ,IAAA,EAAK,OAAA;AAAA,MACL,UAAA,EAAY,IAAA;AAAA,MACZ,aAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAW,eAAA;AAAA,MACX,YAAA,EAAa,gCAAA;AAAA,MACb,gBAAA,EAAiB,YAAA;AAAA,MAEhB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpB,GAAA;AAAA,QAAC,sBAAA;AAAA,QAAA;AAAA,UAEC,EAAA,EAAI,OAAO,KAAK,CAAA;AAAA,UAChB,SAAA,EAAW,OAAO,QAAA,CAAS,KAAA;AAAA,UAC3B,UAAU,MAAM;AACd,YAAA,OAAA,CAAQ,EAAE,CAAA;AACV,YAAA,QAAA,CAAS,MAAA,CAAO,SAAS,QAAQ,CAAA;AACjC,YAAA,qBAAA,CAAsB,MAAM;AAC1B,cAAC,QAAA,CAAS,eAA+B,IAAA,EAAK;AAAA,YAChD,CAAC,CAAA;AAAA,UACH,CAAA;AAAA,UAEA,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,KAAI,GAAA,EAC3B,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,QAAK,MAAA,EAAO,MAAA,EACV,QAAA,EAAA,MAAA,CAAO,SAAA,EAAW,OAAO,KAAA,mBACxB,GAAA;AAAA,cAAC,2BAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,KAAA;AAAA,gBAC9B,MAAA,EAAQ,OAAO,SAAA,CAAU,MAAA;AAAA,gBACzB,OAAA,EAAS,OAAO,SAAA,CAAU;AAAA;AAAA,aAC5B,GAEA,MAAA,CAAO,QAAA,CAAS,KAAA,EAEpB,CAAA;AAAA,YAAA,CACE,OAAO,SAAA,EAAW,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,SAAS,IAAA,qBACjD,GAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,YAAA;AAAA,gBACR,KAAA,EAAM,WAAA;AAAA,gBACN,KAAA,EAAO;AAAA,kBACL,OAAA,EAAS,aAAA;AAAA,kBACT,eAAA,EAAiB,CAAA;AAAA,kBACjB,eAAA,EAAiB,UAAA;AAAA,kBACjB,QAAA,EAAU;AAAA,iBACZ;AAAA,gBAEC,QAAA,EAAA,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,IAAA,mBACxB,GAAA;AAAA,kBAAC,2BAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAM,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,IAAA;AAAA,oBAC9B,MAAA,EAAQ,OAAO,SAAA,CAAU,MAAA;AAAA,oBACzB,OAAA,EAAS,OAAO,SAAA,CAAU;AAAA;AAAA,iBAC5B,GAEA,OAAO,QAAA,CAAS;AAAA;AAAA;AAEpB,WAAA,EAEJ;AAAA,SAAA;AAAA,QA7CK;AAAA,OA+CR;AAAA;AAAA,GACH;AAEJ,CAAA;AAMO,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAAqC;AACxE,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,CAAC,UAAU,CAAA;AAAA,IAClB,UAAA,EAAY,EAAA;AAAA,IACZ,SAAS,KAAA,CAAM;AAAA,GACjB;AACA,EAAA,2BACG,qBAAA,EAAA,EAAsB,YAAA,EACrB,8BAAC,uBAAA,EAAA,EAAyB,GAAG,OAAO,CAAA,EACtC,CAAA;AAEJ;;;;"}
|
package/dist/alpha.d.ts
CHANGED
|
@@ -279,6 +279,19 @@ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin
|
|
|
279
279
|
noHeader?: boolean;
|
|
280
280
|
};
|
|
281
281
|
}>;
|
|
282
|
+
"plugin-header-action:techdocs": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
283
|
+
kind: "plugin-header-action";
|
|
284
|
+
name: undefined;
|
|
285
|
+
config: {};
|
|
286
|
+
configInput: {};
|
|
287
|
+
output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}>;
|
|
288
|
+
inputs: {};
|
|
289
|
+
params: (params: {
|
|
290
|
+
loader: () => Promise<JSX.Element>;
|
|
291
|
+
}) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<{
|
|
292
|
+
loader: () => Promise<JSX.Element>;
|
|
293
|
+
}>;
|
|
294
|
+
}>;
|
|
282
295
|
"search-result-list-item:techdocs": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
283
296
|
config: {
|
|
284
297
|
title: string | undefined;
|
package/dist/alpha.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { Suspense } from 'react';
|
|
3
|
-
import
|
|
4
|
-
import { ApiBlueprint, PageBlueprint, createExtensionInput, coreExtensionData, createExtension, NavItemBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
|
|
3
|
+
import { RiArticleLine } from '@remixicon/react';
|
|
4
|
+
import { ApiBlueprint, PageBlueprint, createExtensionInput, coreExtensionData, createExtension, NavItemBlueprint, PluginHeaderActionBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
|
|
5
5
|
import { fetchApiRef, discoveryApiRef, configApiRef } from '@backstage/core-plugin-api';
|
|
6
6
|
import { EntityIconLinkBlueprint, EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
|
|
7
7
|
import { SearchResultListItemBlueprint } from '@backstage/plugin-search-react/alpha';
|
|
@@ -9,21 +9,10 @@ import { AddonBlueprint, attachTechDocsAddonComponentData } from '@backstage/plu
|
|
|
9
9
|
import { techdocsAddonsApiRef, TechDocsAddonsApiExtension } from './alpha/addonsApi.esm.js';
|
|
10
10
|
import { TechDocsStorageClient, TechDocsClient } from './client.esm.js';
|
|
11
11
|
import { rootRouteRef, rootDocsRouteRef, rootCatalogDocsRouteRef } from './routes.esm.js';
|
|
12
|
-
import './
|
|
13
|
-
import { TechDocsReaderLayout } from './reader/components/TechDocsReaderPage/TechDocsReaderPage.esm.js';
|
|
14
|
-
import 'react-helmet';
|
|
15
|
-
import '@material-ui/core/Grid';
|
|
16
|
-
import '@material-ui/lab/Skeleton';
|
|
17
|
-
import '@material-ui/icons/Code';
|
|
12
|
+
import { TechDocsReaderLayout } from './alpha/components/TechDocsReaderLayout.esm.js';
|
|
18
13
|
import { techdocsStorageApiRef, techdocsApiRef, TechDocsAddons } from '@backstage/plugin-techdocs-react';
|
|
19
|
-
import '@backstage/plugin-catalog-react';
|
|
20
|
-
import '@backstage/catalog-model';
|
|
21
|
-
import { DocsIcon } from '@backstage/core-components';
|
|
22
|
-
import 'lodash/capitalize';
|
|
23
|
-
import 'react-router-dom';
|
|
24
|
-
import './reader/components/TechDocsReaderPageContent/TechDocsReaderPageContent.esm.js';
|
|
25
|
-
import './reader/components/TechDocsReaderPageSubheader/TechDocsReaderPageSubheader.esm.js';
|
|
26
14
|
import { useTechdocsReaderIconLinkProps } from './alpha/hooks/useTechdocsReaderIconLinkProps.esm.js';
|
|
15
|
+
import { DocsIcon, SupportButton } from '@backstage/core-components';
|
|
27
16
|
|
|
28
17
|
const techdocsEntityIconLink = EntityIconLinkBlueprint.make({
|
|
29
18
|
name: "read-docs",
|
|
@@ -86,7 +75,7 @@ const techDocsPage = PageBlueprint.make({
|
|
|
86
75
|
params: {
|
|
87
76
|
path: "/docs",
|
|
88
77
|
routeRef: rootRouteRef,
|
|
89
|
-
loader: () => import('./
|
|
78
|
+
loader: () => import('./alpha/components/TechDocsIndexPageContent.esm.js').then((m) => /* @__PURE__ */ jsx(m.TechDocsIndexPageContent, {}))
|
|
90
79
|
}
|
|
91
80
|
});
|
|
92
81
|
const techDocsReaderPage = PageBlueprint.makeWithOverrides({
|
|
@@ -184,21 +173,27 @@ const techDocsEntityContentEmptyState = createExtension({
|
|
|
184
173
|
});
|
|
185
174
|
const techDocsNavItem = NavItemBlueprint.make({
|
|
186
175
|
params: {
|
|
187
|
-
icon:
|
|
176
|
+
icon: () => /* @__PURE__ */ jsx(RiArticleLine, {}),
|
|
188
177
|
title: "Docs",
|
|
189
178
|
routeRef: rootRouteRef
|
|
190
179
|
}
|
|
191
180
|
});
|
|
181
|
+
const techDocsSupportAction = PluginHeaderActionBlueprint.make({
|
|
182
|
+
params: (defineParams) => defineParams({
|
|
183
|
+
loader: async () => /* @__PURE__ */ jsx(SupportButton, { children: "Discover documentation in your ecosystem." })
|
|
184
|
+
})
|
|
185
|
+
});
|
|
192
186
|
var index = createFrontendPlugin({
|
|
193
187
|
pluginId: "techdocs",
|
|
194
|
-
title: "
|
|
195
|
-
icon: /* @__PURE__ */ jsx(
|
|
196
|
-
info: { packageJson: () => import('./package.json.esm.js') },
|
|
188
|
+
title: "Documentation",
|
|
189
|
+
icon: /* @__PURE__ */ jsx(RiArticleLine, {}),
|
|
190
|
+
info: { packageJson: () => import('./plugins/techdocs/package.json.esm.js') },
|
|
197
191
|
extensions: [
|
|
198
192
|
techDocsClientApi,
|
|
199
193
|
techDocsStorageApi,
|
|
200
194
|
TechDocsAddonsApiExtension,
|
|
201
195
|
techDocsNavItem,
|
|
196
|
+
techDocsSupportAction,
|
|
202
197
|
techDocsPage,
|
|
203
198
|
techDocsReaderPage,
|
|
204
199
|
techdocsEntityIconLink,
|
package/dist/alpha.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha/index.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 { Suspense } from 'react';\nimport LibraryBooks from '@material-ui/icons/LibraryBooks';\nimport {\n createFrontendPlugin,\n ApiBlueprint,\n PageBlueprint,\n NavItemBlueprint,\n createExtensionInput,\n coreExtensionData,\n createExtension,\n} from '@backstage/frontend-plugin-api';\nimport {\n configApiRef,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n EntityContentBlueprint,\n EntityIconLinkBlueprint,\n} from '@backstage/plugin-catalog-react/alpha';\nimport { SearchResultListItemBlueprint } from '@backstage/plugin-search-react/alpha';\nimport {\n AddonBlueprint,\n attachTechDocsAddonComponentData,\n} from '@backstage/plugin-techdocs-react/alpha';\nimport { TechDocsAddonsApiExtension, techdocsAddonsApiRef } from './addonsApi';\nimport { TechDocsClient, TechDocsStorageClient } from '../client';\nimport {\n rootCatalogDocsRouteRef,\n rootDocsRouteRef,\n rootRouteRef,\n} from '../routes';\nimport { TechDocsReaderLayout } from '../reader';\nimport {\n TechDocsAddons,\n techdocsApiRef,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\n\nimport { useTechdocsReaderIconLinkProps } from './hooks/useTechdocsReaderIconLinkProps';\nimport { DocsIcon } from '@backstage/core-components';\n\n/** @alpha */\nconst techdocsEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'read-docs',\n params: {\n useProps: useTechdocsReaderIconLinkProps,\n },\n});\n\n/** @alpha */\nconst techDocsStorageApi = ApiBlueprint.make({\n name: 'storage',\n params: defineParams =>\n defineParams({\n api: techdocsStorageApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n new TechDocsStorageClient({\n configApi,\n discoveryApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nconst techDocsClientApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\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 SearchResultListItemBlueprint.makeWithOverrides({\n config: {\n schema: {\n title: z => z.string().optional(),\n lineClamp: z => z.number().default(5),\n asLink: z => z.boolean().default(true),\n asListItem: z => z.boolean().default(true),\n },\n },\n factory(originalFactory, { config }) {\n return originalFactory({\n icon: <DocsIcon />,\n predicate: result => result.type === 'techdocs',\n component: async () => {\n const { TechDocsSearchResultListItem } = await import(\n '../search/components/TechDocsSearchResultListItem'\n );\n return props => (\n <TechDocsSearchResultListItem {...props} {...config} />\n );\n },\n });\n },\n });\n\n/**\n * Responsible for rendering the provided router element\n *\n * @alpha\n */\nconst techDocsPage = PageBlueprint.make({\n params: {\n path: '/docs',\n routeRef: rootRouteRef,\n loader: () =>\n import('../home/components/TechDocsIndexPage').then(m => (\n <m.TechDocsIndexPage />\n )),\n },\n});\n\n/**\n * Component responsible for composing a TechDocs reader page experience\n *\n * @alpha\n */\nconst techDocsReaderPage = PageBlueprint.makeWithOverrides({\n name: 'reader',\n inputs: {\n addons: createExtensionInput([AddonBlueprint.dataRefs.addon]),\n },\n config: {\n schema: {\n withoutSearch: z => z.boolean().default(false),\n withoutHeader: z => z.boolean().default(false),\n },\n },\n factory(originalFactory, { apis, inputs, config }) {\n const addonsApi = apis.get(techdocsAddonsApiRef);\n\n return originalFactory({\n path: '/docs/:namespace/:kind/:name',\n routeRef: rootDocsRouteRef,\n loader: async () => {\n // Merge addons from the API with old-style direct attachments\n const apiAddons = addonsApi?.getAddons() ?? [];\n const directAddons = inputs.addons.map(output =>\n output.get(AddonBlueprint.dataRefs.addon),\n );\n const addonOptions = [...apiAddons, ...directAddons];\n\n const addons = addonOptions.map(options => {\n const Addon = options.component;\n attachTechDocsAddonComponentData(Addon, options);\n return (\n <Suspense key={options.name} fallback={null}>\n <Addon />\n </Suspense>\n );\n });\n\n return import('../Router').then(({ TechDocsReaderRouter }) => (\n <TechDocsReaderRouter>\n <TechDocsReaderLayout\n withSearch={!config.withoutSearch}\n withHeader={!config.withoutHeader}\n />\n <TechDocsAddons>{addons}</TechDocsAddons>\n </TechDocsReaderRouter>\n ));\n },\n });\n },\n});\n\n/**\n * Component responsible for rendering techdocs on entity pages\n *\n * @alpha\n */\nconst techDocsEntityContent = EntityContentBlueprint.makeWithOverrides({\n inputs: {\n addons: createExtensionInput([AddonBlueprint.dataRefs.addon]),\n emptyState: createExtensionInput(\n [coreExtensionData.reactElement.optional()],\n {\n singleton: true,\n optional: true,\n },\n ),\n },\n factory(originalFactory, context) {\n const addonsApi = context.apis.get(techdocsAddonsApiRef);\n\n return originalFactory(\n {\n path: 'docs',\n title: 'TechDocs',\n group: 'documentation',\n routeRef: rootCatalogDocsRouteRef,\n loader: () => {\n // Merge addons from the API with old-style direct attachments\n const apiAddons = addonsApi?.getAddons() ?? [];\n const directAddons = context.inputs.addons.map(output =>\n output.get(AddonBlueprint.dataRefs.addon),\n );\n const addonOptions = [...apiAddons, ...directAddons];\n\n const addons = addonOptions.map(options => {\n const Addon = options.component;\n attachTechDocsAddonComponentData(Addon, options);\n return (\n <Suspense key={options.name} fallback={null}>\n <Addon />\n </Suspense>\n );\n });\n\n return import('../Router').then(({ EmbeddedDocsRouter }) => (\n <EmbeddedDocsRouter\n emptyState={context.inputs.emptyState?.get(\n coreExtensionData.reactElement,\n )}\n >\n <TechDocsAddons>{addons}</TechDocsAddons>\n </EmbeddedDocsRouter>\n ));\n },\n },\n context,\n );\n },\n});\n\nconst techDocsEntityContentEmptyState = createExtension({\n kind: 'empty-state',\n name: 'entity-content',\n attachTo: { id: 'entity-content:techdocs', input: 'emptyState' },\n output: [coreExtensionData.reactElement.optional()],\n factory: () => [],\n});\n\n/** @alpha */\nconst techDocsNavItem = NavItemBlueprint.make({\n params: {\n icon: LibraryBooks,\n title: 'Docs',\n routeRef: rootRouteRef,\n },\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'techdocs',\n title: 'Docs',\n icon: <LibraryBooks />,\n info: { packageJson: () => import('../../package.json') },\n extensions: [\n techDocsClientApi,\n techDocsStorageApi,\n TechDocsAddonsApiExtension,\n techDocsNavItem,\n techDocsPage,\n techDocsReaderPage,\n techdocsEntityIconLink,\n techDocsEntityContent,\n techDocsEntityContentEmptyState,\n techDocsSearchResultListItemExtension,\n ],\n routes: {\n root: rootRouteRef,\n docRoot: rootDocsRouteRef,\n entityContent: rootCatalogDocsRouteRef,\n },\n});\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha/index.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 { Suspense } from 'react';\nimport { RiArticleLine } from '@remixicon/react';\nimport {\n createFrontendPlugin,\n ApiBlueprint,\n PageBlueprint,\n NavItemBlueprint,\n PluginHeaderActionBlueprint,\n createExtensionInput,\n coreExtensionData,\n createExtension,\n} from '@backstage/frontend-plugin-api';\nimport {\n configApiRef,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n EntityContentBlueprint,\n EntityIconLinkBlueprint,\n} from '@backstage/plugin-catalog-react/alpha';\nimport { SearchResultListItemBlueprint } from '@backstage/plugin-search-react/alpha';\nimport {\n AddonBlueprint,\n attachTechDocsAddonComponentData,\n} from '@backstage/plugin-techdocs-react/alpha';\nimport { TechDocsAddonsApiExtension, techdocsAddonsApiRef } from './addonsApi';\nimport { TechDocsClient, TechDocsStorageClient } from '../client';\nimport {\n rootCatalogDocsRouteRef,\n rootDocsRouteRef,\n rootRouteRef,\n} from '../routes';\nimport { TechDocsReaderLayout } from './components/TechDocsReaderLayout';\nimport {\n TechDocsAddons,\n techdocsApiRef,\n techdocsStorageApiRef,\n} from '@backstage/plugin-techdocs-react';\n\nimport { useTechdocsReaderIconLinkProps } from './hooks/useTechdocsReaderIconLinkProps';\nimport { DocsIcon, SupportButton } from '@backstage/core-components';\n\n/** @alpha */\nconst techdocsEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'read-docs',\n params: {\n useProps: useTechdocsReaderIconLinkProps,\n },\n});\n\n/** @alpha */\nconst techDocsStorageApi = ApiBlueprint.make({\n name: 'storage',\n params: defineParams =>\n defineParams({\n api: techdocsStorageApiRef,\n deps: {\n configApi: configApiRef,\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory: ({ configApi, discoveryApi, fetchApi }) =>\n new TechDocsStorageClient({\n configApi,\n discoveryApi,\n fetchApi,\n }),\n }),\n});\n\n/** @alpha */\nconst techDocsClientApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\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 SearchResultListItemBlueprint.makeWithOverrides({\n config: {\n schema: {\n title: z => z.string().optional(),\n lineClamp: z => z.number().default(5),\n asLink: z => z.boolean().default(true),\n asListItem: z => z.boolean().default(true),\n },\n },\n factory(originalFactory, { config }) {\n return originalFactory({\n icon: <DocsIcon />,\n predicate: result => result.type === 'techdocs',\n component: async () => {\n const { TechDocsSearchResultListItem } = await import(\n '../search/components/TechDocsSearchResultListItem'\n );\n return props => (\n <TechDocsSearchResultListItem {...props} {...config} />\n );\n },\n });\n },\n });\n\n/**\n * Responsible for rendering the provided router element\n *\n * @alpha\n */\nconst techDocsPage = PageBlueprint.make({\n params: {\n path: '/docs',\n routeRef: rootRouteRef,\n loader: () =>\n import('./components/TechDocsIndexPageContent').then(m => (\n <m.TechDocsIndexPageContent />\n )),\n },\n});\n\n/**\n * Component responsible for composing a TechDocs reader page experience\n *\n * @alpha\n */\nconst techDocsReaderPage = PageBlueprint.makeWithOverrides({\n name: 'reader',\n inputs: {\n addons: createExtensionInput([AddonBlueprint.dataRefs.addon]),\n },\n config: {\n schema: {\n withoutSearch: z => z.boolean().default(false),\n withoutHeader: z => z.boolean().default(false),\n },\n },\n factory(originalFactory, { apis, inputs, config }) {\n const addonsApi = apis.get(techdocsAddonsApiRef);\n\n return originalFactory({\n path: '/docs/:namespace/:kind/:name',\n routeRef: rootDocsRouteRef,\n loader: async () => {\n // Merge addons from the API with old-style direct attachments\n const apiAddons = addonsApi?.getAddons() ?? [];\n const directAddons = inputs.addons.map(output =>\n output.get(AddonBlueprint.dataRefs.addon),\n );\n const addonOptions = [...apiAddons, ...directAddons];\n\n const addons = addonOptions.map(options => {\n const Addon = options.component;\n attachTechDocsAddonComponentData(Addon, options);\n return (\n <Suspense key={options.name} fallback={null}>\n <Addon />\n </Suspense>\n );\n });\n\n return import('../Router').then(({ TechDocsReaderRouter }) => (\n <TechDocsReaderRouter>\n <TechDocsReaderLayout\n withSearch={!config.withoutSearch}\n withHeader={!config.withoutHeader}\n />\n <TechDocsAddons>{addons}</TechDocsAddons>\n </TechDocsReaderRouter>\n ));\n },\n });\n },\n});\n\n/**\n * Component responsible for rendering techdocs on entity pages\n *\n * @alpha\n */\nconst techDocsEntityContent = EntityContentBlueprint.makeWithOverrides({\n inputs: {\n addons: createExtensionInput([AddonBlueprint.dataRefs.addon]),\n emptyState: createExtensionInput(\n [coreExtensionData.reactElement.optional()],\n {\n singleton: true,\n optional: true,\n },\n ),\n },\n factory(originalFactory, context) {\n const addonsApi = context.apis.get(techdocsAddonsApiRef);\n\n return originalFactory(\n {\n path: 'docs',\n title: 'TechDocs',\n group: 'documentation',\n routeRef: rootCatalogDocsRouteRef,\n loader: () => {\n // Merge addons from the API with old-style direct attachments\n const apiAddons = addonsApi?.getAddons() ?? [];\n const directAddons = context.inputs.addons.map(output =>\n output.get(AddonBlueprint.dataRefs.addon),\n );\n const addonOptions = [...apiAddons, ...directAddons];\n\n const addons = addonOptions.map(options => {\n const Addon = options.component;\n attachTechDocsAddonComponentData(Addon, options);\n return (\n <Suspense key={options.name} fallback={null}>\n <Addon />\n </Suspense>\n );\n });\n\n return import('../Router').then(({ EmbeddedDocsRouter }) => (\n <EmbeddedDocsRouter\n emptyState={context.inputs.emptyState?.get(\n coreExtensionData.reactElement,\n )}\n >\n <TechDocsAddons>{addons}</TechDocsAddons>\n </EmbeddedDocsRouter>\n ));\n },\n },\n context,\n );\n },\n});\n\nconst techDocsEntityContentEmptyState = createExtension({\n kind: 'empty-state',\n name: 'entity-content',\n attachTo: { id: 'entity-content:techdocs', input: 'emptyState' },\n output: [coreExtensionData.reactElement.optional()],\n factory: () => [],\n});\n\n/** @alpha */\nconst techDocsNavItem = NavItemBlueprint.make({\n params: {\n icon: () => <RiArticleLine />,\n title: 'Docs',\n routeRef: rootRouteRef,\n },\n});\n\nconst techDocsSupportAction = PluginHeaderActionBlueprint.make({\n params: defineParams =>\n defineParams({\n loader: async () => (\n <SupportButton>Discover documentation in your ecosystem.</SupportButton>\n ),\n }),\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'techdocs',\n title: 'Documentation',\n icon: <RiArticleLine />,\n info: { packageJson: () => import('../../package.json') },\n extensions: [\n techDocsClientApi,\n techDocsStorageApi,\n TechDocsAddonsApiExtension,\n techDocsNavItem,\n techDocsSupportAction,\n techDocsPage,\n techDocsReaderPage,\n techdocsEntityIconLink,\n techDocsEntityContent,\n techDocsEntityContentEmptyState,\n techDocsSearchResultListItemExtension,\n ],\n routes: {\n root: rootRouteRef,\n docRoot: rootDocsRouteRef,\n entityContent: rootCatalogDocsRouteRef,\n },\n});\n"],"names":[],"mappings":"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"}
|