@backstage/plugin-techdocs 1.0.1-next.1 → 1.1.0-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/api.ts","../src/client.ts","../src/reader/transformers/addBaseUrl.ts","../src/reader/transformers/addGitFeedbackLink.ts","../src/reader/transformers/addSidebarToggle.ts","../src/reader/transformers/rewriteDocLinks.ts","../src/reader/transformers/addLinkClickListener.ts","../src/reader/transformers/copyToClipboard.tsx","../src/reader/transformers/removeMkdocsHeader.ts","../src/reader/transformers/simplifyMkdocsFooter.ts","../src/reader/transformers/onCssReady.ts","../src/reader/transformers/sanitizeDOM.ts","../src/reader/transformers/injectCss.ts","../src/reader/transformers/scrollIntoAnchor.ts","../src/reader/transformers/transformer.ts","../src/search/components/TechDocsSearchResultListItem.tsx","../src/search/components/TechDocsSearch.tsx","../src/reader/components/TechDocsBuildLogs.tsx","../src/reader/components/TechDocsNotFound.tsx","../src/reader/components/TechDocsStateIndicator.tsx","../src/reader/components/useReaderState.ts","../src/reader/components/Reader.tsx","../src/routes.ts","../src/reader/components/TechDocsReaderPageHeader.tsx","../src/helpers.ts","../src/home/components/Grids/DocsCardGrid.tsx","../src/home/components/Grids/EntityListDocsGrid.tsx","../src/home/components/Tables/actions.tsx","../src/home/components/Tables/columns.tsx","../src/home/components/Tables/DocsTable.tsx","../src/home/components/Tables/EntityListDocsTable.tsx","../src/home/components/TechDocsPageWrapper.tsx","../src/home/components/TechDocsPicker.tsx","../src/home/components/DefaultTechDocsHome.tsx","../src/plugin.ts","../src/home/components/TechDocsIndexPage.tsx","../src/reader/components/TechDocsReaderPage.tsx","../src/EntityPageDocs.tsx","../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 { CompoundEntityRef } from '@backstage/catalog-model';\nimport { TechDocsEntityMetadata, TechDocsMetadata } from './types';\nimport { createApiRef } from '@backstage/core-plugin-api';\n\n/**\n * Utility API reference for the {@link TechDocsStorageApi}.\n *\n * @public\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 */\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 */\nexport type SyncResult = 'cached' | 'updated';\n\n/**\n * API which talks to TechDocs storage to fetch files to render.\n *\n * @public\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 */\nexport interface TechDocsApi {\n getApiOrigin(): Promise<string>;\n getTechDocsMetadata(entityId: CompoundEntityRef): Promise<TechDocsMetadata>;\n getEntityMetadata(\n entityId: CompoundEntityRef,\n ): Promise<TechDocsEntityMetadata>;\n}\n","/*\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 { EventSourcePolyfill } from 'event-source-polyfill';\nimport { SyncResult, TechDocsApi, TechDocsStorageApi } from './api';\nimport { TechDocsEntityMetadata, TechDocsMetadata } from './types';\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 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","/*\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 */\nimport { CompoundEntityRef } from '@backstage/catalog-model';\nimport { TechDocsStorageApi } from '../../api';\nimport type { Transformer } from './transformer';\n\ntype AddBaseUrlOptions = {\n techdocsStorageApi: TechDocsStorageApi;\n entityId: CompoundEntityRef;\n path: string;\n};\n\n/**\n * TechDocs backend serves SVGs with text/plain content-type for security. This\n * helper determines if an SVG is being loaded from the backend, and thus needs\n * inlining to be displayed properly.\n */\nconst isSvgNeedingInlining = (\n attrName: string,\n attrVal: string,\n apiOrigin: string,\n) => {\n const isSrcToSvg = attrName === 'src' && attrVal.endsWith('.svg');\n const isRelativeUrl = !attrVal.match(/^([a-z]*:)?\\/\\//i);\n const pointsToOurBackend = attrVal.startsWith(apiOrigin);\n return isSrcToSvg && (isRelativeUrl || pointsToOurBackend);\n};\n\nexport const addBaseUrl = ({\n techdocsStorageApi,\n entityId,\n path,\n}: AddBaseUrlOptions): Transformer => {\n return async dom => {\n const apiOrigin = await techdocsStorageApi.getApiOrigin();\n\n const updateDom = async <T extends Element>(\n list: HTMLCollectionOf<T> | NodeListOf<T>,\n attributeName: string,\n ) => {\n for (const elem of list) {\n if (elem.hasAttribute(attributeName)) {\n const elemAttribute = elem.getAttribute(attributeName);\n if (!elemAttribute) return;\n\n // Special handling for SVG images.\n const newValue = await techdocsStorageApi.getBaseUrl(\n elemAttribute,\n entityId,\n path,\n );\n\n if (isSvgNeedingInlining(attributeName, elemAttribute, apiOrigin)) {\n try {\n const svg = await fetch(newValue, { credentials: 'include' });\n const svgContent = await svg.text();\n elem.setAttribute(\n attributeName,\n `data:image/svg+xml;base64,${btoa(svgContent)}`,\n );\n } catch (e) {\n elem.setAttribute('alt', `Error: ${elemAttribute}`);\n }\n } else {\n elem.setAttribute(attributeName, newValue);\n }\n }\n }\n };\n\n await Promise.all([\n updateDom<HTMLImageElement>(dom.querySelectorAll('img'), 'src'),\n updateDom<HTMLScriptElement>(dom.querySelectorAll('script'), 'src'),\n updateDom<HTMLSourceElement>(dom.querySelectorAll('source'), 'src'),\n updateDom<HTMLLinkElement>(dom.querySelectorAll('link'), 'href'),\n updateDom<HTMLAnchorElement>(dom.querySelectorAll('a[download]'), 'href'),\n ]);\n\n return dom;\n };\n};\n","/*\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 type { Transformer } from './index';\nimport {\n replaceGitHubUrlType,\n ScmIntegrationRegistry,\n} from '@backstage/integration';\nimport FeedbackOutlinedIcon from '@material-ui/icons/FeedbackOutlined';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport parseGitUrl from 'git-url-parse';\n\n// requires repo\nexport const addGitFeedbackLink = (\n scmIntegrationsApi: ScmIntegrationRegistry,\n): Transformer => {\n return dom => {\n // attempting to use selectors that are more likely to be static as MkDocs updates over time\n const sourceAnchor = dom.querySelector(\n '[title=\"Edit this page\"]',\n ) as HTMLAnchorElement;\n\n // don't show if edit link not available in raw page\n if (!sourceAnchor || !sourceAnchor.href) {\n return dom;\n }\n\n const sourceURL = new URL(sourceAnchor.href);\n const integration = scmIntegrationsApi.byUrl(sourceURL);\n\n // don't show if can't identify edit link hostname as a gitlab/github hosting\n if (integration?.type !== 'github' && integration?.type !== 'gitlab') {\n return dom;\n }\n\n // topmost h1 only contains title for whole page\n const title = (dom.querySelector('article>h1') as HTMLElement).childNodes[0]\n .textContent;\n const issueTitle = encodeURIComponent(`Documentation Feedback: ${title}`);\n const issueDesc = encodeURIComponent(\n `Page source:\\n${sourceAnchor.href}\\n\\nFeedback:`,\n );\n\n // Convert GitHub edit url to blob type so it can be parsed by git-url-parse correctly\n const gitUrl =\n integration?.type === 'github'\n ? replaceGitHubUrlType(sourceURL.href, 'blob')\n : sourceURL.href;\n const gitInfo = parseGitUrl(gitUrl);\n const repoPath = `/${gitInfo.organization}/${gitInfo.name}`;\n\n const feedbackLink = sourceAnchor.cloneNode() as HTMLAnchorElement;\n switch (integration?.type) {\n case 'gitlab':\n feedbackLink.href = `${sourceURL.origin}${repoPath}/issues/new?issue[title]=${issueTitle}&issue[description]=${issueDesc}`;\n break;\n case 'github':\n feedbackLink.href = `${sourceURL.origin}${repoPath}/issues/new?title=${issueTitle}&body=${issueDesc}`;\n break;\n default:\n return dom;\n }\n ReactDOM.render(React.createElement(FeedbackOutlinedIcon), feedbackLink);\n feedbackLink.style.paddingLeft = '5px';\n feedbackLink.title = 'Leave feedback for this page';\n feedbackLink.id = 'git-feedback-link';\n sourceAnchor?.insertAdjacentElement('beforebegin', feedbackLink);\n return dom;\n };\n};\n","/*\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 type { Transformer } from './index';\nimport MenuIcon from '@material-ui/icons/Menu';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nexport const addSidebarToggle = (): Transformer => {\n return dom => {\n // attempting to use selectors that are more likely to be static as MkDocs updates over time\n const mkdocsToggleSidebar = dom.querySelector(\n '.md-header label[for=\"__drawer\"]',\n ) as HTMLLabelElement;\n const article = dom.querySelector('article') as HTMLElement;\n\n // Fail gracefully\n if (!mkdocsToggleSidebar || !article) {\n return dom;\n }\n\n const toggleSidebar = mkdocsToggleSidebar.cloneNode() as HTMLLabelElement;\n ReactDOM.render(React.createElement(MenuIcon), toggleSidebar);\n toggleSidebar.id = 'toggle-sidebar';\n toggleSidebar.title = 'Toggle Sidebar';\n toggleSidebar.classList.add('md-content__button');\n toggleSidebar.style.setProperty('padding', '0 0 0 5px');\n toggleSidebar.style.setProperty('margin', '0.4rem 0 0.4rem 0.4rem');\n article?.prepend(toggleSidebar);\n return dom;\n };\n};\n","/*\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 type { Transformer } from './transformer';\n\nexport const rewriteDocLinks = (): Transformer => {\n return dom => {\n const updateDom = <T extends Element>(\n list: Array<T>,\n attributeName: string,\n ): void => {\n Array.from(list)\n .filter(elem => elem.hasAttribute(attributeName))\n .forEach((elem: T) => {\n const elemAttribute = elem.getAttribute(attributeName);\n if (elemAttribute) {\n // if link is external, add target to open in a new window or tab\n if (elemAttribute.match(/^https?:\\/\\//i)) {\n elem.setAttribute('target', '_blank');\n }\n\n try {\n const normalizedWindowLocation = normalizeUrl(\n window.location.href,\n );\n elem.setAttribute(\n attributeName,\n new URL(elemAttribute, normalizedWindowLocation).toString(),\n );\n } catch (_e) {\n // Non-parseable links should be re-written as plain text.\n elem.replaceWith(elem.textContent || elemAttribute);\n }\n }\n });\n };\n\n updateDom(Array.from(dom.getElementsByTagName('a')), 'href');\n\n return dom;\n };\n};\n\n/** Make sure that the input url always ends with a '/' */\nexport function normalizeUrl(input: string): string {\n const url = new URL(input);\n\n if (!url.pathname.endsWith('/') && !url.pathname.endsWith('.html')) {\n url.pathname += '/';\n }\n\n return url.toString();\n}\n","/*\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 type { Transformer } from './transformer';\n\ntype AddLinkClickListenerOptions = {\n baseUrl: string;\n onClick: (e: MouseEvent, newUrl: string) => void;\n};\n\nexport const addLinkClickListener = ({\n baseUrl,\n onClick,\n}: AddLinkClickListenerOptions): Transformer => {\n return dom => {\n Array.from(dom.getElementsByTagName('a')).forEach(elem => {\n elem.addEventListener('click', (e: MouseEvent) => {\n const target = elem as HTMLAnchorElement;\n const href = target.getAttribute('href');\n\n if (!href) return;\n if (href.startsWith(baseUrl) && !elem.hasAttribute('download')) {\n e.preventDefault();\n onClick(e, href);\n }\n });\n });\n\n return dom;\n };\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useState, useCallback } from 'react';\nimport ReactDom from 'react-dom';\nimport {\n withStyles,\n Theme,\n ThemeProvider,\n SvgIcon,\n Tooltip,\n} from '@material-ui/core';\n\nconst CopyToClipboardTooltip = withStyles(theme => ({\n tooltip: {\n fontSize: 'inherit',\n color: theme.palette.text.primary,\n margin: 0,\n padding: theme.spacing(0.5),\n backgroundColor: 'transparent',\n boxShadow: 'none',\n },\n}))(Tooltip);\n\nconst CopyToClipboardIcon = () => (\n <SvgIcon>\n <path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\" />\n </SvgIcon>\n);\n\ntype CopyToClipboardButtonProps = {\n text: string;\n};\n\nconst CopyToClipboardButton = ({ text }: CopyToClipboardButtonProps) => {\n const [open, setOpen] = useState(false);\n\n const handleClick = useCallback(() => {\n navigator.clipboard.writeText(text);\n setOpen(true);\n }, [text]);\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n return (\n <CopyToClipboardTooltip\n title=\"Copied to clipboard\"\n placement=\"left\"\n open={open}\n onClose={handleClose}\n leaveDelay={1000}\n >\n <button className=\"md-clipboard md-icon\" onClick={handleClick}>\n <CopyToClipboardIcon />\n </button>\n </CopyToClipboardTooltip>\n );\n};\n\nimport type { Transformer } from './transformer';\n\n/**\n * Recreates copy-to-clipboard functionality attached to <code> snippets that\n * is native to mkdocs-material theme.\n */\nexport const copyToClipboard = (theme: Theme): Transformer => {\n return dom => {\n const codes = dom.querySelectorAll('pre > code');\n for (const code of codes) {\n const text = code.textContent || '';\n const container = document.createElement('div');\n code?.parentElement?.prepend(container);\n ReactDom.render(\n <ThemeProvider theme={theme}>\n <CopyToClipboardButton text={text} />\n </ThemeProvider>,\n container,\n );\n }\n return dom;\n };\n};\n","/*\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 type { Transformer } from './transformer';\n\nexport const removeMkdocsHeader = (): Transformer => {\n return dom => {\n // Remove the header\n dom.querySelector('.md-header')?.remove();\n\n return dom;\n };\n};\n","/*\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 type { Transformer } from './transformer';\n\nexport const simplifyMkdocsFooter = (): Transformer => {\n return dom => {\n // Remove new mkdocs copyright\n dom.querySelector('.md-footer .md-copyright')?.remove();\n // Remove old mkdocs copyright\n dom.querySelector('.md-footer-copyright')?.remove();\n return dom;\n };\n};\n","/*\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 type { Transformer } from './transformer';\n\ntype OnCssReadyOptions = {\n docStorageUrl: string;\n onLoading: (dom: Element) => void;\n onLoaded: (dom: Element) => void;\n};\n\nexport const onCssReady = ({\n docStorageUrl,\n onLoading,\n onLoaded,\n}: OnCssReadyOptions): Transformer => {\n return dom => {\n const cssPages = Array.from(\n dom.querySelectorAll('head > link[rel=\"stylesheet\"]'),\n ).filter(elem => elem.getAttribute('href')?.startsWith(docStorageUrl));\n\n let count = cssPages.length;\n\n if (count > 0) {\n onLoading(dom);\n }\n\n cssPages.forEach(cssPage =>\n cssPage.addEventListener('load', () => {\n count -= 1;\n\n if (count === 0) {\n onLoaded(dom);\n }\n }),\n );\n\n return dom;\n };\n};\n","/*\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\nconst TECHDOCS_CSS = /main\\.[A-Fa-f0-9]{8}\\.min\\.css$/;\nconst GOOGLE_FONTS = /^https:\\/\\/fonts\\.googleapis\\.com/;\nconst GSTATIC_FONTS = /^https:\\/\\/fonts\\.gstatic\\.com/;\n\nexport const safeLinksHook = (node: Element) => {\n if (node.nodeName && node.nodeName === 'LINK') {\n const href = node.getAttribute('href') || '';\n if (href.match(TECHDOCS_CSS)) {\n node.setAttribute('rel', 'stylesheet');\n }\n if (href.match(GOOGLE_FONTS)) {\n node.setAttribute('rel', 'stylesheet');\n }\n if (href.match(GSTATIC_FONTS)) {\n node.setAttribute('rel', 'preconnect');\n }\n }\n return node;\n};\n\nconst filterIframeHook = (allowedIframeHosts: string[]) => (node: Element) => {\n if (node.nodeName === 'IFRAME') {\n const src = node.getAttribute('src');\n if (!src) {\n node.remove();\n return node;\n }\n\n try {\n const srcUrl = new URL(src);\n const isMatch = allowedIframeHosts.some(host => srcUrl.host === host);\n if (!isMatch) {\n node.remove();\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(`Invalid iframe src, ${error}`);\n node.remove();\n }\n }\n return node;\n};\n\nimport { Config } from '@backstage/config';\nimport DOMPurify from 'dompurify';\nimport type { Transformer } from './transformer';\n\nexport const sanitizeDOM = (config?: Config): Transformer => {\n const allowedIframeHosts =\n config?.getOptionalStringArray('allowedIframeHosts') || [];\n\n return dom => {\n DOMPurify.addHook('afterSanitizeAttributes', safeLinksHook);\n const addTags = ['link'];\n\n if (allowedIframeHosts.length > 0) {\n DOMPurify.addHook(\n 'beforeSanitizeElements',\n filterIframeHook(allowedIframeHosts),\n );\n addTags.push('iframe');\n }\n\n return DOMPurify.sanitize(dom.innerHTML, {\n ADD_TAGS: addTags,\n FORBID_TAGS: ['style'],\n WHOLE_DOCUMENT: true,\n RETURN_DOM: true,\n });\n };\n};\n","/*\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 type { Transformer } from './transformer';\n\ntype InjectCssOptions = {\n css: string;\n};\n\nexport const injectCss = ({ css }: InjectCssOptions): Transformer => {\n return dom => {\n dom\n .getElementsByTagName('head')[0]\n .insertAdjacentHTML('beforeend', `<style>${css}</style>`);\n\n return dom;\n };\n};\n","/*\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 type { Transformer } from './transformer';\n\nexport const scrollIntoAnchor = (): Transformer => {\n return dom => {\n setTimeout(() => {\n // Scroll to the desired anchor on initial navigation\n if (window.location.hash) {\n const hash = window.location.hash.slice(1);\n // fix invalid selector error for anchor starting with number\n dom?.querySelector(`[id=\"${hash}\"]`)?.scrollIntoView();\n }\n }, 200);\n return dom;\n };\n};\n","/*\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\nexport type Transformer = (dom: Element) => Element | Promise<Element>;\n\nexport const transform = async (\n html: string | Element,\n transformers: Transformer[],\n): Promise<Element> => {\n let dom: Element;\n\n if (typeof html === 'string') {\n dom = new DOMParser().parseFromString(html, 'text/html').documentElement;\n } else if (html instanceof Element) {\n dom = html;\n } else {\n throw new Error('dom is not a recognized type');\n }\n\n for (const transformer of transformers) {\n dom = await transformer(dom);\n }\n\n return dom;\n};\n","/*\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, { PropsWithChildren } from 'react';\nimport { Divider, ListItem, ListItemText, makeStyles } from '@material-ui/core';\nimport { Link } from '@backstage/core-components';\nimport TextTruncate from 'react-text-truncate';\n\nconst useStyles = makeStyles({\n flexContainer: {\n flexWrap: 'wrap',\n },\n itemText: {\n width: '100%',\n marginBottom: '1rem',\n },\n});\n\n/**\n * Props for {@link TechDocsSearchResultListItem}.\n *\n * @public\n */\nexport type TechDocsSearchResultListItemProps = {\n result: any;\n lineClamp?: number;\n asListItem?: boolean;\n asLink?: boolean;\n title?: string;\n};\n\n/**\n * Component which renders documentation and related metadata.\n *\n * @public\n */\nexport const TechDocsSearchResultListItem = (\n props: TechDocsSearchResultListItemProps,\n) => {\n const {\n result,\n lineClamp = 5,\n asListItem = true,\n asLink = true,\n title,\n } = props;\n const classes = useStyles();\n const TextItem = () => (\n <ListItemText\n className={classes.itemText}\n primaryTypographyProps={{ variant: 'h6' }}\n primary={\n title\n ? title\n : `${result.title} | ${result.entityTitle ?? result.name} docs`\n }\n secondary={\n <TextTruncate\n line={lineClamp}\n truncateText=\"…\"\n text={result.text}\n element=\"span\"\n />\n }\n />\n );\n\n const LinkWrapper = ({ children }: PropsWithChildren<{}>) =>\n asLink ? <Link to={result.location}>{children}</Link> : <>{children}</>;\n\n const ListItemWrapper = ({ children }: PropsWithChildren<{}>) =>\n asListItem ? (\n <>\n <ListItem alignItems=\"flex-start\" className={classes.flexContainer}>\n {children}\n </ListItem>\n <Divider component=\"li\" />\n </>\n ) : (\n <>{children}</>\n );\n\n return (\n <LinkWrapper>\n <ListItemWrapper>\n <TextItem />\n </ListItemWrapper>\n </LinkWrapper>\n );\n};\n","/*\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 { CompoundEntityRef } from '@backstage/catalog-model';\nimport { SearchContextProvider, useSearch } from '@backstage/plugin-search';\nimport {\n makeStyles,\n CircularProgress,\n IconButton,\n InputAdornment,\n TextField,\n} from '@material-ui/core';\nimport SearchIcon from '@material-ui/icons/Search';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport React, { ChangeEvent, useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { TechDocsSearchResultListItem } from './TechDocsSearchResultListItem';\n\nconst useStyles = makeStyles({\n root: {\n width: '100%',\n },\n});\n\n/**\n * Props for {@link TechDocsSearch}\n *\n * @public\n */\nexport type TechDocsSearchProps = {\n entityId: CompoundEntityRef;\n debounceTime?: number;\n};\n\ntype TechDocsDoc = {\n namespace: string;\n kind: string;\n name: string;\n path: string;\n location: string;\n title: string;\n};\n\ntype TechDocsSearchResult = {\n type: string;\n document: TechDocsDoc;\n};\n\nconst TechDocsSearchBar = (props: TechDocsSearchProps) => {\n const { entityId, debounceTime = 150 } = props;\n const [open, setOpen] = useState(false);\n const navigate = useNavigate();\n const {\n term,\n setTerm,\n setFilters,\n result: { loading, value: searchVal },\n } = useSearch();\n const classes = useStyles();\n const [options, setOptions] = useState<any[]>([]);\n useEffect(() => {\n let mounted = true;\n\n if (mounted && searchVal) {\n // TODO: Change this into getting only subset of search results from the BE in the first place\n // once pagination is implemented for search engines\n // See: https://github.com/backstage/backstage/issues/6062\n const searchResults = searchVal.results.slice(0, 10);\n setOptions(searchResults);\n }\n return () => {\n mounted = false;\n };\n }, [loading, searchVal]);\n\n const [value, setValue] = useState<string>(term);\n\n useDebounce(() => setTerm(value), debounceTime, [value]);\n\n // Update the filter context when the entityId changes, e.g. when the search\n // bar continues to be rendered, navigating between different TechDocs sites.\n const { kind, name, namespace } = entityId;\n useEffect(() => {\n setFilters(prevFilters => {\n return {\n ...prevFilters,\n kind,\n namespace,\n name,\n };\n });\n }, [kind, namespace, name, setFilters]);\n\n const handleQuery = (e: ChangeEvent<HTMLInputElement>) => {\n if (!open) {\n setOpen(true);\n }\n setValue(e.target.value);\n };\n\n const handleSelection = (_: any, selection: TechDocsSearchResult | null) => {\n if (selection?.document) {\n const { location } = selection.document;\n navigate(location);\n }\n };\n\n return (\n <Autocomplete\n classes={{ root: classes.root }}\n data-testid=\"techdocs-search-bar\"\n size=\"small\"\n open={open}\n getOptionLabel={() => ''}\n filterOptions={x => {\n return x; // This is needed to get renderOption to be called after options change. Bug in material-ui?\n }}\n onClose={() => {\n setOpen(false);\n }}\n onFocus={() => {\n setOpen(true);\n }}\n onChange={handleSelection}\n blurOnSelect\n noOptionsText=\"No results found\"\n value={null}\n options={options}\n renderOption={({ document }) => (\n <TechDocsSearchResultListItem\n result={document}\n lineClamp={3}\n asListItem={false}\n asLink={false}\n title={document.title}\n />\n )}\n loading={loading}\n renderInput={params => (\n <TextField\n {...params}\n data-testid=\"techdocs-search-bar-input\"\n variant=\"outlined\"\n fullWidth\n placeholder={`Search ${entityId.name} docs`}\n value={value}\n onChange={handleQuery}\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <IconButton aria-label=\"Query\" disabled>\n <SearchIcon />\n </IconButton>\n </InputAdornment>\n ),\n endAdornment: (\n <React.Fragment>\n {loading ? (\n <CircularProgress color=\"inherit\" size={20} />\n ) : null}\n {params.InputProps.endAdornment}\n </React.Fragment>\n ),\n }}\n />\n )}\n />\n );\n};\n\n/**\n * Component used to render search bar on TechDocs page, scoped to\n *\n * @public\n */\nexport const TechDocsSearch = (props: TechDocsSearchProps) => {\n const initialState = {\n term: '',\n types: ['techdocs'],\n pageCursor: '',\n filters: props.entityId,\n };\n return (\n <SearchContextProvider initialState={initialState}>\n <TechDocsSearchBar {...props} />\n </SearchContextProvider>\n );\n};\n","/*\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 { LogViewer } from '@backstage/core-components';\nimport {\n Button,\n createStyles,\n Drawer,\n Grid,\n IconButton,\n makeStyles,\n Theme,\n Typography,\n} from '@material-ui/core';\nimport Close from '@material-ui/icons/Close';\nimport React, { useState } from 'react';\n\nconst useDrawerStyles = makeStyles((theme: Theme) =>\n createStyles({\n paper: {\n width: '100%',\n [theme.breakpoints.up('sm')]: {\n width: '75%',\n },\n [theme.breakpoints.up('md')]: {\n width: '50%',\n },\n padding: theme.spacing(2.5),\n },\n root: {\n height: '100%',\n overflow: 'hidden',\n },\n logs: {\n background: theme.palette.background.default,\n },\n }),\n);\n\nexport const TechDocsBuildLogsDrawerContent = ({\n buildLog,\n onClose,\n}: {\n buildLog: string[];\n onClose: () => void;\n}) => {\n const classes = useDrawerStyles();\n const logText =\n buildLog.length === 0 ? 'Waiting for logs...' : buildLog.join('\\n');\n return (\n <Grid\n container\n direction=\"column\"\n className={classes.root}\n spacing={0}\n wrap=\"nowrap\"\n >\n <Grid\n item\n container\n justifyContent=\"space-between\"\n alignItems=\"center\"\n spacing={0}\n wrap=\"nowrap\"\n >\n <Typography variant=\"h5\">Build Details</Typography>\n <IconButton\n key=\"dismiss\"\n title=\"Close the drawer\"\n onClick={onClose}\n color=\"inherit\"\n >\n <Close />\n </IconButton>\n </Grid>\n <LogViewer text={logText} classes={{ root: classes.logs }} />\n </Grid>\n );\n};\n\nexport const TechDocsBuildLogs = ({ buildLog }: { buildLog: string[] }) => {\n const classes = useDrawerStyles();\n const [open, setOpen] = useState(false);\n\n return (\n <>\n <Button color=\"inherit\" onClick={() => setOpen(true)}>\n Show Build Logs\n </Button>\n <Drawer\n classes={{ paper: classes.paper }}\n anchor=\"right\"\n open={open}\n onClose={() => setOpen(false)}\n >\n <TechDocsBuildLogsDrawerContent\n buildLog={buildLog}\n onClose={() => setOpen(false)}\n />\n </Drawer>\n </>\n );\n};\n","/*\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 from 'react';\nimport { useApi, configApiRef } from '@backstage/core-plugin-api';\nimport { ErrorPage } from '@backstage/core-components';\n\ntype Props = {\n errorMessage?: string;\n};\n\nexport const TechDocsNotFound = ({ errorMessage }: Props) => {\n const techdocsBuilder =\n useApi(configApiRef).getOptionalString('techdocs.builder');\n\n let additionalInfo = '';\n if (techdocsBuilder !== 'local') {\n additionalInfo =\n \"Note that techdocs.builder is not set to 'local' in your config, which means this Backstage app will not \" +\n \"generate docs if they are not found. Make sure the project's docs are generated and published by some external \" +\n \"process (e.g. CI/CD pipeline). Or change techdocs.builder to 'local' to generate docs from this Backstage \" +\n 'instance.';\n }\n\n return (\n <ErrorPage\n status=\"404\"\n statusMessage={errorMessage || 'Documentation not found'}\n additionalInfo={additionalInfo}\n />\n );\n};\n","/*\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 { Progress } from '@backstage/core-components';\nimport { CircularProgress, Button, makeStyles } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\n\nimport { TechDocsBuildLogs } from './TechDocsBuildLogs';\nimport { TechDocsNotFound } from './TechDocsNotFound';\nimport { useTechDocsReader } from './Reader';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n marginBottom: theme.spacing(2),\n },\n message: {\n // `word-break: break-word` is deprecated, but gives legacy support to browsers not supporting `overflow-wrap` yet\n // https://developer.mozilla.org/en-US/docs/Web/CSS/word-break\n wordBreak: 'break-word',\n overflowWrap: 'anywhere',\n },\n}));\n\n/**\n * Note: this component is currently being exported so that we can rapidly\n * iterate on alternative <Reader /> implementations that extend core\n * functionality. There is no guarantee that this component will continue to be\n * exported by the package in the future!\n *\n * todo: Make public or stop exporting (ctrl+f \"altReaderExperiments\")\n * @internal\n */\nexport const TechDocsStateIndicator = () => {\n let StateAlert: JSX.Element | null = null;\n const classes = useStyles();\n\n const {\n state,\n contentReload,\n contentErrorMessage,\n syncErrorMessage,\n buildLog,\n } = useTechDocsReader();\n\n const ReaderProgress = state === 'CHECKING' ? <Progress /> : null;\n\n if (state === 'INITIAL_BUILD') {\n StateAlert = (\n <Alert\n classes={{ root: classes.root }}\n variant=\"outlined\"\n severity=\"info\"\n icon={<CircularProgress size=\"24px\" />}\n action={<TechDocsBuildLogs buildLog={buildLog} />}\n >\n Documentation is accessed for the first time and is being prepared. The\n subsequent loads are much faster.\n </Alert>\n );\n }\n\n if (state === 'CONTENT_STALE_REFRESHING') {\n StateAlert = (\n <Alert\n variant=\"outlined\"\n severity=\"info\"\n icon={<CircularProgress size=\"24px\" />}\n action={<TechDocsBuildLogs buildLog={buildLog} />}\n classes={{ root: classes.root }}\n >\n A newer version of this documentation is being prepared and will be\n available shortly.\n </Alert>\n );\n }\n\n if (state === 'CONTENT_STALE_READY') {\n StateAlert = (\n <Alert\n variant=\"outlined\"\n severity=\"success\"\n action={\n <Button color=\"inherit\" onClick={() => contentReload()}>\n Refresh\n </Button>\n }\n classes={{ root: classes.root }}\n >\n A newer version of this documentation is now available, please refresh\n to view.\n </Alert>\n );\n }\n\n if (state === 'CONTENT_STALE_ERROR') {\n StateAlert = (\n <Alert\n variant=\"outlined\"\n severity=\"error\"\n action={<TechDocsBuildLogs buildLog={buildLog} />}\n classes={{ root: classes.root, message: classes.message }}\n >\n Building a newer version of this documentation failed.{' '}\n {syncErrorMessage}\n </Alert>\n );\n }\n\n if (state === 'CONTENT_NOT_FOUND') {\n StateAlert = (\n <>\n {syncErrorMessage && (\n <Alert\n variant=\"outlined\"\n severity=\"error\"\n action={<TechDocsBuildLogs buildLog={buildLog} />}\n classes={{ root: classes.root, message: classes.message }}\n >\n Building a newer version of this documentation failed.{' '}\n {syncErrorMessage}\n </Alert>\n )}\n <TechDocsNotFound errorMessage={contentErrorMessage} />\n </>\n );\n }\n\n return (\n <>\n {ReaderProgress}\n {StateAlert}\n </>\n );\n};\n","/*\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 { useApi } from '@backstage/core-plugin-api';\nimport { useMemo, useReducer, useRef } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\nimport { techdocsStorageApiRef } from '../../api';\n\n/**\n * A state representation that is used to configure the UI of <Reader />\n */\ntype ContentStateTypes =\n /** There is nothing to display but a loading indicator */\n | 'CHECKING'\n\n /** There is no content yet -> present a full screen loading page */\n | 'INITIAL_BUILD'\n\n /** There is content, but the backend is about to update it */\n | 'CONTENT_STALE_REFRESHING'\n\n /** There is content, but after a reload, the content will be different */\n | 'CONTENT_STALE_READY'\n\n /** There is content, the backend tried to update it, but failed */\n | 'CONTENT_STALE_ERROR'\n\n /** There is nothing to see but a \"not found\" page. Is also shown on page load errors */\n | 'CONTENT_NOT_FOUND'\n\n /** There is only the latest and greatest content */\n | 'CONTENT_FRESH';\n\n/**\n * Calculate the state that should be reported to the display component.\n */\nexport function calculateDisplayState({\n contentLoading,\n content,\n activeSyncState,\n}: Pick<\n ReducerState,\n 'contentLoading' | 'content' | 'activeSyncState'\n>): ContentStateTypes {\n // we have nothing to display yet\n if (contentLoading) {\n return 'CHECKING';\n }\n\n // the build is ready, but it triggered a content reload and the content variable is not trusted\n if (activeSyncState === 'BUILD_READY_RELOAD') {\n return 'CHECKING';\n }\n\n // there is no content, but the sync process is still evaluating\n if (!content && activeSyncState === 'CHECKING') {\n return 'CHECKING';\n }\n\n // there is no content yet so we assume that we are building it for the first time\n if (!content && activeSyncState === 'BUILDING') {\n return 'INITIAL_BUILD';\n }\n\n // if there is still no content after building, it might just not exist\n if (!content) {\n return 'CONTENT_NOT_FOUND';\n }\n\n // we are still building, but we already show stale content\n if (activeSyncState === 'BUILDING') {\n return 'CONTENT_STALE_REFRESHING';\n }\n\n // the build is ready, but the content is still stale\n if (activeSyncState === 'BUILD_READY') {\n return 'CONTENT_STALE_READY';\n }\n\n // the build failed, but the content is still stale\n if (activeSyncState === 'ERROR') {\n return 'CONTENT_STALE_ERROR';\n }\n\n // seems like the content is up-to-date (or we don't know yet and the sync process is still evaluating in the background)\n return 'CONTENT_FRESH';\n}\n\n/**\n * The state of the synchronization task. It checks whether the docs are\n * up-to-date. If they aren't, it triggers a build.\n */\ntype SyncStates =\n /** Checking if it should be synced */\n | 'CHECKING'\n\n /** Building the documentation */\n | 'BUILDING'\n\n /** Finished building the documentation */\n | 'BUILD_READY'\n\n /**\n * Finished building the documentation and triggered a content reload.\n * This state is left toward UP_TO_DATE when the content loading has finished.\n */\n | 'BUILD_READY_RELOAD'\n\n /** No need for a sync. The content was already up-to-date. */\n | 'UP_TO_DATE'\n\n /** An error occurred */\n | 'ERROR';\n\ntype ReducerActions =\n | {\n type: 'sync';\n state: SyncStates;\n syncError?: Error;\n }\n | { type: 'contentLoading' }\n | {\n type: 'content';\n path?: string;\n content?: string;\n contentError?: Error;\n }\n | { type: 'buildLog'; log: string };\n\ntype ReducerState = {\n /**\n * The path of the current page\n */\n path: string;\n\n /**\n * The current sync state\n */\n activeSyncState: SyncStates;\n\n /**\n * If true, the content is downloading from the storage.\n */\n contentLoading: boolean;\n /**\n * The content that has been downloaded and should be displayed.\n */\n content?: string;\n\n contentError?: Error;\n syncError?: Error;\n\n /**\n * A list of log messages that were emitted by the build process.\n */\n buildLog: string[];\n};\n\nexport function reducer(\n oldState: ReducerState,\n action: ReducerActions,\n): ReducerState {\n const newState = { ...oldState };\n\n switch (action.type) {\n case 'sync':\n // reset the build log when a new check starts\n if (action.state === 'CHECKING') {\n newState.buildLog = [];\n }\n\n newState.activeSyncState = action.state;\n newState.syncError = action.syncError;\n break;\n\n case 'contentLoading':\n newState.contentLoading = true;\n\n // only reset errors but keep the old content until it is replaced by the 'content' action\n newState.contentError = undefined;\n break;\n\n case 'content':\n // only override the path if it is part of the action\n if (typeof action.path === 'string') {\n newState.path = action.path;\n }\n\n newState.contentLoading = false;\n newState.content = action.content;\n newState.contentError = action.contentError;\n break;\n\n case 'buildLog':\n newState.buildLog = newState.buildLog.concat(action.log);\n break;\n\n default:\n throw new Error();\n }\n\n // a content update loads fresh content so the build is updated to being up-to-date\n if (\n ['BUILD_READY', 'BUILD_READY_RELOAD'].includes(newState.activeSyncState) &&\n ['contentLoading', 'content'].includes(action.type)\n ) {\n newState.activeSyncState = 'UP_TO_DATE';\n newState.buildLog = [];\n }\n\n return newState;\n}\n\nexport function useReaderState(\n kind: string,\n namespace: string,\n name: string,\n path: string,\n): {\n state: ContentStateTypes;\n path: string;\n contentReload: () => void;\n content?: string;\n contentErrorMessage?: string;\n syncErrorMessage?: string;\n buildLog: string[];\n} {\n const [state, dispatch] = useReducer(reducer, {\n activeSyncState: 'CHECKING',\n path,\n contentLoading: true,\n buildLog: [],\n });\n\n const techdocsStorageApi = useApi(techdocsStorageApiRef);\n\n // try to load the content. the function will fire events and we don't care for the return values\n const { retry: contentReload } = useAsyncRetry(async () => {\n dispatch({ type: 'contentLoading' });\n\n try {\n const entityDocs = await techdocsStorageApi.getEntityDocs(\n { kind, namespace, name },\n path,\n );\n\n // update content and path at the same time\n dispatch({ type: 'content', content: entityDocs, path });\n\n return entityDocs;\n } catch (e) {\n dispatch({ type: 'content', contentError: e, path });\n }\n\n return undefined;\n }, [techdocsStorageApi, kind, namespace, name, path]);\n\n // create a ref that holds the latest content. This provides a useAsync hook\n // with the latest content without restarting the useAsync hook.\n const contentRef = useRef<{ content?: string; reload: () => void }>({\n content: undefined,\n reload: () => {},\n });\n contentRef.current = { content: state.content, reload: contentReload };\n\n // try to derive the state. the function will fire events and we don't care for the return values\n useAsync(async () => {\n dispatch({ type: 'sync', state: 'CHECKING' });\n\n // should only switch to BUILDING if the request takes more than 1 seconds\n const buildingTimeout = setTimeout(() => {\n dispatch({ type: 'sync', state: 'BUILDING' });\n }, 1000);\n\n try {\n const result = await techdocsStorageApi.syncEntityDocs(\n {\n kind,\n namespace,\n name,\n },\n log => {\n dispatch({ type: 'buildLog', log });\n },\n );\n\n switch (result) {\n case 'updated':\n // if there was no content prior to building, retry the loading\n if (!contentRef.current.content) {\n contentRef.current.reload();\n dispatch({ type: 'sync', state: 'BUILD_READY_RELOAD' });\n } else {\n dispatch({ type: 'sync', state: 'BUILD_READY' });\n }\n break;\n case 'cached':\n dispatch({ type: 'sync', state: 'UP_TO_DATE' });\n break;\n\n default:\n dispatch({\n type: 'sync',\n state: 'ERROR',\n syncError: new Error('Unexpected return state'),\n });\n break;\n }\n } catch (e) {\n dispatch({ type: 'sync', state: 'ERROR', syncError: e });\n } finally {\n // Cancel the timer that sets the state \"BUILDING\"\n clearTimeout(buildingTimeout);\n }\n }, [kind, name, namespace, techdocsStorageApi, dispatch, contentRef]);\n\n const displayState = useMemo(\n () =>\n calculateDisplayState({\n activeSyncState: state.activeSyncState,\n contentLoading: state.contentLoading,\n content: state.content,\n }),\n [state.activeSyncState, state.content, state.contentLoading],\n );\n\n return {\n state: displayState,\n contentReload,\n path: state.path,\n content: state.content,\n contentErrorMessage: state.contentError?.toString(),\n syncErrorMessage: state.syncError?.toString(),\n buildLog: state.buildLog,\n };\n}\n","/*\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, {\n PropsWithChildren,\n ComponentType,\n createContext,\n useContext,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport {\n Grid,\n makeStyles,\n useTheme,\n Theme,\n lighten,\n alpha,\n} from '@material-ui/core';\n\nimport { CompoundEntityRef } from '@backstage/catalog-model';\nimport { useApi, configApiRef } from '@backstage/core-plugin-api';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n sidebarConfig,\n SidebarPinStateContext,\n} from '@backstage/core-components';\n\nimport { techdocsStorageApiRef } from '../../api';\n\nimport {\n addBaseUrl,\n addGitFeedbackLink,\n addLinkClickListener,\n addSidebarToggle,\n injectCss,\n onCssReady,\n removeMkdocsHeader,\n rewriteDocLinks,\n sanitizeDOM,\n simplifyMkdocsFooter,\n scrollIntoAnchor,\n transform as transformer,\n copyToClipboard,\n} from '../transformers';\n\nimport { TechDocsSearch } from '../../search';\nimport { TechDocsStateIndicator } from './TechDocsStateIndicator';\nimport { useReaderState } from './useReaderState';\n\n/**\n * Props for {@link Reader}\n *\n * @public\n */\nexport type ReaderProps = {\n entityRef: CompoundEntityRef;\n withSearch?: boolean;\n onReady?: () => void;\n};\n\nconst useStyles = makeStyles<BackstageTheme>(theme => ({\n searchBar: {\n maxWidth: 'calc(100% - 16rem * 2 - 2.4rem)',\n marginTop: 0,\n marginBottom: theme.spacing(1),\n marginLeft: 'calc(16rem + 1.2rem)',\n '@media screen and (max-width: 76.1875em)': {\n marginLeft: '0',\n maxWidth: '100%',\n },\n },\n}));\n\ntype TechDocsReaderValue = ReturnType<typeof useReaderState>;\n\nconst TechDocsReaderContext = createContext<TechDocsReaderValue>(\n {} as TechDocsReaderValue,\n);\n\nconst TechDocsReaderProvider = ({\n children,\n entityRef,\n}: PropsWithChildren<{ entityRef: CompoundEntityRef }>) => {\n const { '*': path } = useParams();\n const { kind, namespace, name } = entityRef;\n const value = useReaderState(kind, namespace, name, path);\n return (\n <TechDocsReaderContext.Provider value={value}>\n {children}\n </TechDocsReaderContext.Provider>\n );\n};\n\n/**\n * Note: this HOC is currently being exported so that we can rapidly\n * iterate on alternative <Reader /> implementations that extend core\n * functionality. There is no guarantee that this HOC will continue to be\n * exported by the package in the future!\n *\n * todo: Make public or stop exporting (ctrl+f \"altReaderExperiments\")\n * @internal\n */\nexport const withTechDocsReaderProvider =\n <T extends {}>(Component: ComponentType<T>, entityRef: CompoundEntityRef) =>\n (props: T) =>\n (\n <TechDocsReaderProvider entityRef={entityRef}>\n <Component {...props} />\n </TechDocsReaderProvider>\n );\n\n/**\n * Note: this hook is currently being exported so that we can rapidly\n * iterate on alternative <Reader /> implementations that extend core\n * functionality. There is no guarantee that this hook will continue to be\n * exported by the package in the future!\n *\n * todo: Make public or stop exporting (ctrl+f \"altReaderExperiments\")\n * @internal\n */\nexport const useTechDocsReader = () => useContext(TechDocsReaderContext);\n\ntype TypographyHeadings = Pick<\n Theme['typography'],\n 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n>;\n\ntype TypographyHeadingsKeys = keyof TypographyHeadings;\n\nconst headings: TypographyHeadingsKeys[] = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];\n\n/**\n * Hook that encapsulates the behavior of getting raw HTML and applying\n * transforms to it in order to make it function at a basic level in the\n * Backstage UI.\n *\n * Note: this hook is currently being exported so that we can rapidly iterate\n * on alternative <Reader /> implementations that extend core functionality.\n * There is no guarantee that this hook will continue to be exported by the\n * package in the future!\n *\n * todo: Make public or stop exporting (see others: \"altReaderExperiments\")\n * @internal\n */\nexport const useTechDocsReaderDom = (\n entityRef: CompoundEntityRef,\n): Element | null => {\n const navigate = useNavigate();\n const theme = useTheme<BackstageTheme>();\n const techdocsStorageApi = useApi(techdocsStorageApiRef);\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n const techdocsSanitizer = useApi(configApiRef);\n const { namespace = '', kind = '', name = '' } = entityRef;\n const { state, path, content: rawPage } = useTechDocsReader();\n const isDarkTheme = theme.palette.type === 'dark';\n\n const [sidebars, setSidebars] = useState<HTMLElement[]>();\n const [dom, setDom] = useState<HTMLElement | null>(null);\n\n // sidebar pinned status to be used in computing CSS style injections\n const { isPinned } = useContext(SidebarPinStateContext);\n\n const updateSidebarPosition = useCallback(() => {\n if (!dom || !sidebars) return;\n // set sidebar height so they don't initially render in wrong position\n const mdTabs = dom.querySelector('.md-container > .md-tabs');\n const sidebarsCollapsed = window.matchMedia(\n 'screen and (max-width: 76.1875em)',\n ).matches;\n const newTop = Math.max(dom.getBoundingClientRect().top, 0);\n sidebars.forEach(sidebar => {\n if (sidebarsCollapsed) {\n sidebar.style.top = '0px';\n } else if (mdTabs) {\n sidebar.style.top = `${\n newTop + mdTabs.getBoundingClientRect().height\n }px`;\n } else {\n sidebar.style.top = `${newTop}px`;\n }\n });\n }, [dom, sidebars]);\n\n useEffect(() => {\n updateSidebarPosition();\n window.addEventListener('scroll', updateSidebarPosition, true);\n window.addEventListener('resize', updateSidebarPosition);\n return () => {\n window.removeEventListener('scroll', updateSidebarPosition, true);\n window.removeEventListener('resize', updateSidebarPosition);\n };\n // an update to \"state\" might lead to an updated UI so we include it as a trigger\n }, [updateSidebarPosition, state]);\n\n // dynamically set width of footer to accommodate for pinning of the sidebar\n const updateFooterWidth = useCallback(() => {\n if (!dom) return;\n const footer = dom.querySelector('.md-footer') as HTMLElement;\n if (footer) {\n footer.style.width = `${dom.getBoundingClientRect().width}px`;\n }\n }, [dom]);\n\n useEffect(() => {\n updateFooterWidth();\n window.addEventListener('resize', updateFooterWidth);\n return () => {\n window.removeEventListener('resize', updateFooterWidth);\n };\n });\n\n // a function that performs transformations that are executed prior to adding it to the DOM\n const preRender = useCallback(\n (rawContent: string, contentPath: string) =>\n transformer(rawContent, [\n sanitizeDOM(techdocsSanitizer.getOptionalConfig('techdocs.sanitizer')),\n addBaseUrl({\n techdocsStorageApi,\n entityId: {\n kind,\n name,\n namespace,\n },\n path: contentPath,\n }),\n rewriteDocLinks(),\n addSidebarToggle(),\n removeMkdocsHeader(),\n simplifyMkdocsFooter(),\n addGitFeedbackLink(scmIntegrationsApi),\n injectCss({\n // Variables\n css: `\n /*\n As the MkDocs output is rendered in shadow DOM, the CSS variable definitions on the root selector are not applied. Instead, they have to be applied on :host.\n As there is no way to transform the served main*.css yet (for example in the backend), we have to copy from main*.css and modify them.\n */\n :host {\n /* FONT */\n --md-default-fg-color: ${theme.palette.text.primary};\n --md-default-fg-color--light: ${theme.palette.text.secondary};\n --md-default-fg-color--lighter: ${lighten(\n theme.palette.text.secondary,\n 0.7,\n )};\n --md-default-fg-color--lightest: ${lighten(\n theme.palette.text.secondary,\n 0.3,\n )};\n\n /* BACKGROUND */\n --md-default-bg-color:${theme.palette.background.default};\n --md-default-bg-color--light: ${theme.palette.background.paper};\n --md-default-bg-color--lighter: ${lighten(\n theme.palette.background.paper,\n 0.7,\n )};\n --md-default-bg-color--lightest: ${lighten(\n theme.palette.background.paper,\n 0.3,\n )};\n\n /* PRIMARY */\n --md-primary-fg-color: ${theme.palette.primary.main};\n --md-primary-fg-color--light: ${theme.palette.primary.light};\n --md-primary-fg-color--dark: ${theme.palette.primary.dark};\n --md-primary-bg-color: ${theme.palette.primary.contrastText};\n --md-primary-bg-color--light: ${lighten(\n theme.palette.primary.contrastText,\n 0.7,\n )};\n\n /* ACCENT */\n --md-accent-fg-color: var(--md-primary-fg-color);\n\n /* SHADOW */\n --md-shadow-z1: ${theme.shadows[1]};\n --md-shadow-z2: ${theme.shadows[2]};\n --md-shadow-z3: ${theme.shadows[3]};\n\n /* EXTENSIONS */\n --md-admonition-fg-color: var(--md-default-fg-color);\n --md-admonition-bg-color: var(--md-default-bg-color);\n /* Admonitions and others are using SVG masks to define icons. These masks are defined as CSS variables. */\n --md-admonition-icon--note: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z\"/></svg>');\n --md-admonition-icon--abstract: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M4 5h16v2H4V5m0 4h16v2H4V9m0 4h16v2H4v-2m0 4h10v2H4v-2z\"/></svg>');\n --md-admonition-icon--info: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 002 12a10 10 0 0010 10 10 10 0 0010-10A10 10 0 0012 2z\"/></svg>');\n --md-admonition-icon--tip: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M17.55 11.2c-.23-.3-.5-.56-.76-.82-.65-.6-1.4-1.03-2.03-1.66C13.3 7.26 13 4.85 13.91 3c-.91.23-1.75.75-2.45 1.32-2.54 2.08-3.54 5.75-2.34 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.22.1-.46.04-.64-.12a.83.83 0 01-.15-.17c-1.1-1.43-1.28-3.48-.53-5.12C5.89 10 5 12.3 5.14 14.47c.04.5.1 1 .27 1.5.14.6.4 1.2.72 1.73 1.04 1.73 2.87 2.97 4.84 3.22 2.1.27 4.35-.12 5.96-1.6 1.8-1.66 2.45-4.32 1.5-6.6l-.13-.26c-.2-.46-.47-.87-.8-1.25l.05-.01m-3.1 6.3c-.28.24-.73.5-1.08.6-1.1.4-2.2-.16-2.87-.82 1.19-.28 1.89-1.16 2.09-2.05.17-.8-.14-1.46-.27-2.23-.12-.74-.1-1.37.18-2.06.17.38.37.76.6 1.06.76 1 1.95 1.44 2.2 2.8.04.14.06.28.06.43.03.82-.32 1.72-.92 2.27h.01z\"/></svg>');\n --md-admonition-icon--success: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2m-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>');\n --md-admonition-icon--question: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M15.07 11.25l-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 00-2-2 2 2 0 00-2 2H8a4 4 0 014-4 4 4 0 014 4 3.2 3.2 0 01-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 002 12a10 10 0 0010 10 10 10 0 0010-10c0-5.53-4.5-10-10-10z\"/></svg>');\n --md-admonition-icon--warning: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M13 14h-2v-4h2m0 8h-2v-2h2M1 21h22L12 2 1 21z\"/></svg>');\n --md-admonition-icon--failure: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2c5.53 0 10 4.47 10 10s-4.47 10-10 10S2 17.53 2 12 6.47 2 12 2m3.59 5L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41 15.59 7z\"/></svg>');\n --md-admonition-icon--danger: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M11.5 20l4.86-9.73H13V4l-5 9.73h3.5V20M12 2c2.75 0 5.1 1 7.05 2.95C21 6.9 22 9.25 22 12s-1 5.1-2.95 7.05C17.1 21 14.75 22 12 22s-5.1-1-7.05-2.95C3 17.1 2 14.75 2 12s1-5.1 2.95-7.05C6.9 3 9.25 2 12 2z\"/></svg>');\n --md-admonition-icon--bug: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a5.985 5.985 0 00-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 0 00-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8z\"/></svg>');\n --md-admonition-icon--example: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M7 13v-2h14v2H7m0 6v-2h14v2H7M7 7V5h14v2H7M3 8V5H2V4h2v4H3m-1 9v-1h3v4H2v-1h2v-.5H3v-1h1V17H2m2.25-7a.75.75 0 01.75.75c0 .2-.08.39-.21.52L3.12 13H5v1H2v-.92L4 11H2v-1h2.25z\"/></svg>');\n --md-admonition-icon--quote: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3l-2 4z\"/></svg>');\n --md-footnotes-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.42L5.83 13H21V7h-2z\"/></svg>');\n --md-details-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z\"/></svg>');\n --md-tasklist-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z\"/></svg>');\n --md-tasklist-icon--checked: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M0 0h24v24H0z\" fill=\"none\"/><path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"/></svg>');\n --md-nav-icon--prev: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z\"/></svg>');\n --md-nav-icon--next: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M8.59 16.58 13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z\"/></svg>');\n --md-toc-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 9h14V7H3v2m0 4h14v-2H3v2m0 4h14v-2H3v2m16 0h2v-2h-2v2m0-10v2h2V7h-2m0 6h2v-2h-2v2z\"/></svg>');\n --md-clipboard-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1z\"/></svg>');\n --md-search-result-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h7c-.41-.25-.8-.56-1.14-.9-.33-.33-.61-.7-.86-1.1H6V4h7v5h5v1.18c.71.16 1.39.43 2 .82V8l-6-6m6.31 16.9c1.33-2.11.69-4.9-1.4-6.22-2.11-1.33-4.91-.68-6.22 1.4-1.34 2.11-.69 4.89 1.4 6.22 1.46.93 3.32.93 4.79.02L22 23.39 23.39 22l-3.08-3.1m-3.81.1a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5z\"/></svg>');\n --md-source-forks-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M5 3.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0zm0 2.122a2.25 2.25 0 1 0-1.5 0v.878A2.25 2.25 0 0 0 5.75 8.5h1.5v2.128a2.251 2.251 0 1 0 1.5 0V8.5h1.5a2.25 2.25 0 0 0 2.25-2.25v-.878a2.25 2.25 0 1 0-1.5 0v.878a.75.75 0 0 1-.75.75h-4.5A.75.75 0 0 1 5 6.25v-.878zm3.75 7.378a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0zm3-8.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5z\"/></svg>');\n --md-source-repositories-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 1 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 0 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5v-9zm10.5-1V9h-8c-.356 0-.694.074-1 .208V2.5a1 1 0 0 1 1-1h8zM5 12.25v3.25a.25.25 0 0 0 .4.2l1.45-1.087a.25.25 0 0 1 .3 0L8.6 15.7a.25.25 0 0 0 .4-.2v-3.25a.25.25 0 0 0-.25-.25h-3.5a.25.25 0 0 0-.25.25z\"/></svg>');\n --md-source-stars-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.75.75 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694v.001z\"/></svg>');\n --md-source-version-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M2.5 7.775V2.75a.25.25 0 0 1 .25-.25h5.025a.25.25 0 0 1 .177.073l6.25 6.25a.25.25 0 0 1 0 .354l-5.025 5.025a.25.25 0 0 1-.354 0l-6.25-6.25a.25.25 0 0 1-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.75 1.75 0 0 1 1 7.775zM6 5a1 1 0 1 0 0 2 1 1 0 0 0 0-2z\"/></svg>');\n --md-version-icon: url('data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"><!--! Font Awesome Free 6.0.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d=\"m310.6 246.6-127.1 128c-7.1 6.3-15.3 9.4-23.5 9.4s-16.38-3.125-22.63-9.375l-127.1-128C.224 237.5-2.516 223.7 2.438 211.8S19.07 192 32 192h255.1c12.94 0 24.62 7.781 29.58 19.75s3.12 25.75-6.08 34.85z\"/></svg>');\n }\n\n :host > * {\n /* CODE */\n --md-code-fg-color: ${theme.palette.text.primary};\n --md-code-bg-color: ${theme.palette.background.paper};\n --md-code-hl-color: ${alpha(theme.palette.warning.main, 0.5)};\n --md-code-hl-keyword-color: ${\n isDarkTheme\n ? theme.palette.primary.light\n : theme.palette.primary.dark\n };\n --md-code-hl-function-color: ${\n isDarkTheme\n ? theme.palette.secondary.light\n : theme.palette.secondary.dark\n };\n --md-code-hl-string-color: ${\n isDarkTheme\n ? theme.palette.success.light\n : theme.palette.success.dark\n };\n --md-code-hl-number-color: ${\n isDarkTheme ? theme.palette.error.light : theme.palette.error.dark\n };\n --md-code-hl-constant-color: var(--md-code-hl-function-color);\n --md-code-hl-special-color: var(--md-code-hl-function-color);\n --md-code-hl-name-color: var(--md-code-fg-color);\n --md-code-hl-comment-color: var(--md-default-fg-color--light);\n --md-code-hl-generic-color: var(--md-default-fg-color--light);\n --md-code-hl-variable-color: var(--md-default-fg-color--light);\n --md-code-hl-operator-color: var(--md-default-fg-color--light);\n --md-code-hl-punctuation-color: var(--md-default-fg-color--light);\n\n /* TYPESET */\n --md-typeset-font-size: 1rem;\n --md-typeset-color: var(--md-default-fg-color);\n --md-typeset-a-color: var(--md-accent-fg-color);\n --md-typeset-table-color: ${theme.palette.text.primary};\n --md-typeset-del-color: ${\n isDarkTheme\n ? alpha(theme.palette.error.dark, 0.5)\n : alpha(theme.palette.error.light, 0.5)\n };\n --md-typeset-ins-color: ${\n isDarkTheme\n ? alpha(theme.palette.success.dark, 0.5)\n : alpha(theme.palette.success.light, 0.5)\n };\n --md-typeset-mark-color: ${\n isDarkTheme\n ? alpha(theme.palette.warning.dark, 0.5)\n : alpha(theme.palette.warning.light, 0.5)\n };\n }\n\n @media screen and (max-width: 76.1875em) {\n :host > * {\n /* TYPESET */\n --md-typeset-font-size: .9rem;\n }\n }\n\n @media screen and (max-width: 600px) {\n :host > * {\n /* TYPESET */\n --md-typeset-font-size: .7rem;\n }\n }\n `,\n }),\n injectCss({\n // Reset\n css: `\n body {\n --md-text-color: var(--md-default-fg-color);\n --md-text-link-color: var(--md-accent-fg-color);\n --md-text-font-family: ${theme.typography.fontFamily};\n font-family: var(--md-text-font-family);\n background-color: unset;\n }\n `,\n }),\n injectCss({\n // Layout\n css: `\n .md-grid {\n max-width: 100%;\n margin: 0;\n }\n\n .md-nav {\n font-size: calc(var(--md-typeset-font-size) * 0.9);\n }\n .md-nav__link {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n .md-nav__icon {\n height: 20px !important;\n width: 20px !important;\n margin-left:${theme.spacing(1)}px;\n }\n .md-nav__icon svg {\n margin: 0;\n width: 20px !important;\n height: 20px !important;\n }\n .md-nav__icon:after {\n width: 20px !important;\n height: 20px !important;\n }\n\n .md-main__inner {\n margin-top: 0;\n }\n\n .md-sidebar {\n bottom: 75px;\n position: fixed;\n width: 16rem;\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-color: rgb(193, 193, 193) #eee;\n scrollbar-width: thin;\n }\n .md-sidebar::-webkit-scrollbar {\n width: 5px;\n }\n .md-sidebar::-webkit-scrollbar-button {\n width: 5px;\n height: 5px;\n }\n .md-sidebar::-webkit-scrollbar-track {\n background: #eee;\n border: 1 px solid rgb(250, 250, 250);\n box-shadow: 0px 0px 3px #dfdfdf inset;\n border-radius: 3px;\n }\n .md-sidebar::-webkit-scrollbar-thumb {\n width: 5px;\n background: rgb(193, 193, 193);\n border: transparent;\n border-radius: 3px;\n }\n .md-sidebar::-webkit-scrollbar-thumb:hover {\n background: rgb(125, 125, 125);\n }\n .md-sidebar--secondary {\n right: ${theme.spacing(3)}px;\n }\n .md-sidebar__scrollwrap {\n overflow: unset !important;\n }\n\n .md-content {\n max-width: calc(100% - 16rem * 2);\n margin-left: 16rem;\n margin-bottom: 50px;\n }\n\n .md-footer {\n position: fixed;\n bottom: 0px;\n }\n .md-footer__title {\n background-color: unset;\n }\n .md-footer__link, .md-footer-nav__link {\n width: 16rem;\n }\n\n .md-dialog {\n background-color: unset;\n }\n\n @media screen and (min-width: 76.25em) {\n .md-sidebar {\n height: auto;\n }\n }\n \n @media screen and (max-width: 76.1875em) {\n .md-nav {\n transition: none !important;\n background-color: var(--md-default-bg-color)\n }\n .md-nav--primary .md-nav__title {\n cursor: auto;\n color: var(--md-default-fg-color);\n font-weight: 700;\n white-space: normal;\n line-height: 1rem;\n height: auto;\n display: flex;\n flex-flow: column;\n row-gap: 1.6rem;\n padding: 1.2rem .8rem .8rem;\n background-color: var(--md-default-bg-color);\n }\n .md-nav--primary .md-nav__title~.md-nav__list {\n box-shadow: none;\n }\n .md-nav--primary .md-nav__title ~ .md-nav__list > :first-child {\n border-top: none;\n }\n .md-nav--primary .md-nav__title .md-nav__button {\n display: none;\n }\n .md-nav--primary .md-nav__title .md-nav__icon {\n color: var(--md-default-fg-color);\n position: static;\n height: auto;\n margin: 0 0 0 -0.2rem;\n }\n .md-nav--primary > .md-nav__title [for=\"none\"] {\n padding-top: 0;\n }\n .md-nav--primary .md-nav__item {\n border-top: none;\n }\n .md-nav--primary :is(.md-nav__title,.md-nav__item) {\n font-size : var(--md-typeset-font-size);\n }\n .md-nav .md-source {\n display: none;\n }\n\n .md-sidebar {\n height: 100%;\n }\n .md-sidebar--primary {\n width: 16rem !important;\n z-index: 200;\n left: ${\n isPinned\n ? `calc(-16rem + ${sidebarConfig.drawerWidthOpen}px)`\n : `calc(-16rem + ${sidebarConfig.drawerWidthClosed}px)`\n } !important;\n }\n .md-sidebar--secondary:not([hidden]) {\n display: none;\n }\n [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary {\n transform: translateX(16rem);\n }\n\n .md-content {\n max-width: 100%;\n margin-left: 0;\n }\n .md-content__inner {\n margin: 0;\n }\n .md-content__inner .highlighttable {\n max-width: 100%;\n margin: 1em 0;\n }\n\n .md-header__button {\n margin: 0.4rem 0;\n margin-left: 0.4rem;\n padding: 0;\n }\n\n .md-overlay {\n left: 0;\n }\n\n .md-footer {\n position: static;\n padding-left: 0;\n }\n .md-footer__link, .md-footer-nav__link {\n /* footer links begin to overlap at small sizes without setting width */\n width: 50%;\n }\n }\n\n @media screen and (max-width: 600px) {\n .md-sidebar--primary {\n left: -16rem !important;\n width: 16rem;\n }\n .md-sidebar--primary .md-sidebar__scrollwrap {\n bottom: ${sidebarConfig.mobileSidebarHeight}px;\n }\n }\n `,\n }),\n injectCss({\n // Typeset\n css: `\n .md-typeset {\n font-size: var(--md-typeset-font-size);\n }\n\n ${headings.reduce<string>((style, heading) => {\n const styles = theme.typography[heading];\n const { lineHeight, fontFamily, fontWeight, fontSize } = styles;\n const calculate = (value: typeof fontSize) => {\n let factor: number | string = 1;\n if (typeof value === 'number') {\n // 60% of the size defined because it is too big\n factor = (value / 16) * 0.6;\n }\n if (typeof value === 'string') {\n factor = value.replace('rem', '');\n }\n return `calc(${factor} * var(--md-typeset-font-size))`;\n };\n return style.concat(`\n .md-typeset ${heading} {\n color: var(--md-default-fg-color);\n line-height: ${lineHeight};\n font-family: ${fontFamily};\n font-weight: ${fontWeight};\n font-size: ${calculate(fontSize)};\n }\n `);\n }, '')}\n\n .md-typeset .md-content__button {\n color: var(--md-default-fg-color);\n }\n\n .md-typeset hr {\n border-bottom: 0.05rem dotted ${theme.palette.divider};\n }\n\n .md-typeset details {\n font-size: var(--md-typeset-font-size) !important;\n }\n .md-typeset details summary {\n padding-left: 2.5rem !important;\n }\n .md-typeset details summary:before,\n .md-typeset details summary:after {\n top: 50% !important;\n width: 20px !important;\n height: 20px !important;\n transform: rotate(0deg) translateY(-50%) !important;\n }\n .md-typeset details[open] > summary:after {\n transform: rotate(90deg) translateX(-50%) !important;\n }\n\n .md-typeset blockquote {\n color: var(--md-default-fg-color--light);\n border-left: 0.2rem solid var(--md-default-fg-color--light);\n }\n\n .md-typeset table:not([class]) {\n font-size: var(--md-typeset-font-size);\n border: 1px solid var(--md-default-fg-color);\n border-bottom: none;\n border-collapse: collapse;\n }\n .md-typeset table:not([class]) th {\n font-weight: bold;\n }\n .md-typeset table:not([class]) td, .md-typeset table:not([class]) th {\n border-bottom: 1px solid var(--md-default-fg-color);\n }\n\n .md-typeset pre > code::-webkit-scrollbar-thumb {\n background-color: hsla(0, 0%, 0%, 0.32);\n }\n .md-typeset pre > code::-webkit-scrollbar-thumb:hover {\n background-color: hsla(0, 0%, 0%, 0.87);\n }\n `,\n }),\n injectCss({\n // Animations\n css: `\n /*\n Disable CSS animations on link colors as they lead to issues in dark mode.\n The dark mode color theme is applied later and theirfore there is always an animation from light to dark mode when navigation between pages.\n */\n .md-dialog, .md-nav__link, .md-footer__link, .md-typeset a, .md-typeset a::before, .md-typeset .headerlink {\n transition: none;\n }\n `,\n }),\n injectCss({\n // Extensions\n css: `\n /* HIGHLIGHT */\n .highlight .md-clipboard:after {\n content: unset;\n }\n \n .highlight .nx {\n color: ${isDarkTheme ? '#ff53a3' : '#ec407a'};\n }\n\n /* CODE HILITE */\n .codehilite .gd {\n background-color: ${\n isDarkTheme ? 'rgba(248,81,73,0.65)' : '#fdd'\n };\n }\n\n .codehilite .gi {\n background-color: ${\n isDarkTheme ? 'rgba(46,160,67,0.65)' : '#dfd'\n };\n }\n\n /* TABBED */\n .tabbed-set>input:nth-child(1):checked~.tabbed-labels>:nth-child(1),\n .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),\n .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),\n .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),\n .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),\n .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),\n .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),\n .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),\n .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),\n .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),\n .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),\n .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),\n .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),\n .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),\n .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),\n .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),\n .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),\n .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),\n .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),\n .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20) {\n color: var(--md-accent-fg-color);\n border-color: var(--md-accent-fg-color);\n }\n\n /* TASK-LIST */\n .task-list-control .task-list-indicator::before {\n background-color: ${theme.palette.action.disabledBackground};\n }\n .task-list-control [type=\"checkbox\"]:checked + .task-list-indicator:before {\n background-color: ${theme.palette.success.main};\n }\n\n /* ADMONITION */\n .admonition {\n font-size: var(--md-typeset-font-size) !important;\n }\n .admonition .admonition-title {\n padding-left: 2.5rem !important;\n }\n\n .admonition .admonition-title:before {\n top: 50% !important;\n width: 20px !important;\n height: 20px !important;\n transform: translateY(-50%) !important;\n }\n `,\n }),\n ]),\n [\n kind,\n name,\n namespace,\n scmIntegrationsApi,\n techdocsSanitizer,\n techdocsStorageApi,\n theme,\n isDarkTheme,\n isPinned,\n ],\n );\n\n // a function that performs transformations that are executed after adding it to the DOM\n const postRender = useCallback(\n async (transformedElement: Element) =>\n transformer(transformedElement, [\n scrollIntoAnchor(),\n copyToClipboard(theme),\n addLinkClickListener({\n baseUrl: window.location.origin,\n onClick: (event: MouseEvent, url: string) => {\n // detect if CTRL or META keys are pressed so that links can be opened in a new tab with `window.open`\n const modifierActive = event.ctrlKey || event.metaKey;\n const parsedUrl = new URL(url);\n\n // hash exists when anchor is clicked on secondary sidebar\n if (parsedUrl.hash) {\n if (modifierActive) {\n window.open(`${parsedUrl.pathname}${parsedUrl.hash}`, '_blank');\n } else {\n navigate(`${parsedUrl.pathname}${parsedUrl.hash}`);\n // Scroll to hash if it's on the current page\n transformedElement\n ?.querySelector(`#${parsedUrl.hash.slice(1)}`)\n ?.scrollIntoView();\n }\n } else {\n if (modifierActive) {\n window.open(parsedUrl.pathname, '_blank');\n } else {\n navigate(parsedUrl.pathname);\n // Scroll to top of reader if primary sidebar link is clicked\n transformedElement\n ?.querySelector('.md-content__inner')\n ?.scrollIntoView();\n }\n }\n },\n }),\n onCssReady({\n docStorageUrl: await techdocsStorageApi.getApiOrigin(),\n onLoading: (renderedElement: Element) => {\n (renderedElement as HTMLElement).style.setProperty('opacity', '0');\n },\n onLoaded: (renderedElement: Element) => {\n (renderedElement as HTMLElement).style.removeProperty('opacity');\n // disable MkDocs drawer toggling ('for' attribute => checkbox mechanism)\n renderedElement\n .querySelector('.md-nav__title')\n ?.removeAttribute('for');\n setSidebars(\n Array.from(renderedElement.querySelectorAll('.md-sidebar')),\n );\n },\n }),\n ]),\n [theme, navigate, techdocsStorageApi],\n );\n\n useEffect(() => {\n if (!rawPage) return () => {};\n\n // if false, there is already a newer execution of this effect\n let shouldReplaceContent = true;\n\n // Pre-render\n preRender(rawPage, path).then(async preTransformedDomElement => {\n if (!preTransformedDomElement?.innerHTML) {\n return; // An unexpected error occurred\n }\n\n // don't manipulate the shadow dom if this isn't the latest effect execution\n if (!shouldReplaceContent) {\n return;\n }\n\n // Scroll to top after render\n window.scroll({ top: 0 });\n\n // Post-render\n const postTransformedDomElement = await postRender(\n preTransformedDomElement,\n );\n setDom(postTransformedDomElement as HTMLElement);\n });\n\n // cancel this execution\n return () => {\n shouldReplaceContent = false;\n };\n }, [rawPage, path, preRender, postRender]);\n\n return dom;\n};\n\nconst TheReader = ({\n entityRef,\n onReady = () => {},\n withSearch = true,\n}: ReaderProps) => {\n const classes = useStyles();\n const dom = useTechDocsReaderDom(entityRef);\n const shadowDomRef = useRef<HTMLDivElement>(null);\n\n const onReadyRef = useRef<() => void>(onReady);\n useEffect(() => {\n onReadyRef.current = onReady;\n }, [onReady]);\n\n useEffect(() => {\n if (!dom || !shadowDomRef.current) return;\n const shadowDiv = shadowDomRef.current;\n const shadowRoot =\n shadowDiv.shadowRoot || shadowDiv.attachShadow({ mode: 'open' });\n Array.from(shadowRoot.children).forEach(child =>\n shadowRoot.removeChild(child),\n );\n shadowRoot.appendChild(dom);\n onReadyRef.current();\n\n // this hook must ONLY be triggered by a changed dom\n }, [dom]);\n\n return (\n <>\n <TechDocsStateIndicator />\n {withSearch && shadowDomRef?.current?.shadowRoot?.innerHTML && (\n <Grid container className={classes.searchBar}>\n <TechDocsSearch entityId={entityRef} />\n </Grid>\n )}\n <div data-testid=\"techdocs-content-shadowroot\" ref={shadowDomRef} />\n </>\n );\n};\n\n/**\n * Component responsible for rendering TechDocs documentation\n *\n * @public\n */\nexport const Reader = (props: ReaderProps) => {\n const { entityRef, onReady = () => {}, withSearch = true } = props;\n return (\n <TechDocsReaderProvider entityRef={entityRef}>\n <TheReader\n entityRef={entityRef}\n onReady={onReady}\n withSearch={withSearch}\n />\n </TechDocsReaderProvider>\n );\n};\n","/*\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 { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'techdocs:index-page',\n});\n\nexport const rootDocsRouteRef = createRouteRef({\n id: 'techdocs:reader-page',\n params: ['namespace', 'kind', 'name'],\n});\n\nexport const rootCatalogDocsRouteRef = createRouteRef({\n id: 'techdocs:catalog-reader-view',\n});\n","/*\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 CodeIcon from '@material-ui/icons/Code';\n\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { Header, HeaderLabel } from '@backstage/core-components';\nimport { CompoundEntityRef, RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport {\n EntityRefLink,\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\n\nimport { rootRouteRef } from '../../routes';\nimport { TechDocsEntityMetadata, TechDocsMetadata } from '../../types';\n\n/**\n * Props for {@link TechDocsReaderPageHeader}\n *\n * @public\n */\nexport type TechDocsReaderPageHeaderProps = PropsWithChildren<{\n entityRef: CompoundEntityRef;\n entityMetadata?: TechDocsEntityMetadata;\n techDocsMetadata?: TechDocsMetadata;\n}>;\n\n/**\n * Component responsible for rendering a Header with metadata on TechDocs reader page.\n *\n * @public\n */\nexport const TechDocsReaderPageHeader = (\n props: TechDocsReaderPageHeaderProps,\n) => {\n const { entityRef, entityMetadata, techDocsMetadata, children } = props;\n const { name } = entityRef;\n\n const { site_name: siteName, site_description: siteDescription } =\n techDocsMetadata || {};\n\n const { locationMetadata, spec } = entityMetadata || {};\n const lifecycle = spec?.lifecycle;\n\n const ownedByRelations = entityMetadata\n ? getEntityRelations(entityMetadata, RELATION_OWNED_BY)\n : [];\n\n const docsRootLink = useRouteRef(rootRouteRef)();\n\n const labels = (\n <>\n <HeaderLabel\n label=\"Component\"\n value={\n <EntityRefLink\n color=\"inherit\"\n entityRef={entityRef}\n defaultKind=\"Component\"\n />\n }\n />\n {ownedByRelations.length > 0 && (\n <HeaderLabel\n label=\"Owner\"\n value={\n <EntityRefLinks\n color=\"inherit\"\n entityRefs={ownedByRelations}\n defaultKind=\"group\"\n />\n }\n />\n )}\n {lifecycle ? <HeaderLabel label=\"Lifecycle\" value={lifecycle} /> : null}\n {locationMetadata &&\n locationMetadata.type !== 'dir' &&\n locationMetadata.type !== 'file' ? (\n <HeaderLabel\n label=\"\"\n value={\n <a\n href={locationMetadata.target}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <CodeIcon style={{ marginTop: '-25px', fill: '#fff' }} />\n </a>\n }\n />\n ) : null}\n </>\n );\n\n return (\n <Header\n title={siteName ? siteName : '.'}\n pageTitleOverride={siteName || name}\n subtitle={\n siteDescription && siteDescription !== 'None' ? siteDescription : ''\n }\n type=\"Docs\"\n typeLink={docsRootLink}\n >\n {labels}\n {children}\n </Header>\n );\n};\n","/*\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","/*\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 Button,\n ItemCardGrid,\n ItemCardHeader,\n} from '@backstage/core-components';\nimport { Card, CardActions, CardContent, CardMedia } from '@material-ui/core';\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 <Button\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 </Button>\n </CardActions>\n </Card>\n ))}\n </ItemCardGrid>\n );\n};\n","/*\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 {\n CodeSnippet,\n Progress,\n WarningPanel,\n} from '@backstage/core-components';\nimport { useEntityList } from '@backstage/plugin-catalog-react';\nimport React from 'react';\n\n/**\n * Component responsible to get entities from entity list context and pass down to DocsCardGrid\n *\n * @public\n */\nexport const EntityListDocsGrid = () => {\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 || !entities) {\n return <Progress />;\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 <DocsCardGrid entities={entities} />;\n};\n","/*\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 ShareIcon from '@material-ui/icons/Share';\nimport { DocsTableRow } from './types';\nimport { withStyles } from '@material-ui/styles';\nimport Star from '@material-ui/icons/Star';\nimport StarBorder from '@material-ui/icons/StarBorder';\n\nconst YellowStar = withStyles({\n root: {\n color: '#f3ba37',\n },\n})(Star);\n\n/**\n * Not directly exported, but through DocsTable.actions and EntityListDocsTable.actions\n *\n * @public\n */\nexport const actionFactories = {\n createCopyDocsUrlAction(copyToClipboard: Function) {\n return (row: DocsTableRow) => {\n return {\n icon: () => <ShareIcon fontSize=\"small\" />,\n tooltip: 'Click to copy documentation link to clipboard',\n onClick: () =>\n copyToClipboard(`${window.location.origin}${row.resolved.docsUrl}`),\n };\n };\n },\n createStarEntityAction(\n isStarredEntity: Function,\n toggleStarredEntity: Function,\n ) {\n return ({ entity }: DocsTableRow) => {\n const isStarred = isStarredEntity(entity);\n return {\n cellStyle: { paddingLeft: '1em' },\n icon: () => (isStarred ? <YellowStar /> : <StarBorder />),\n tooltip: isStarred ? 'Remove from favorites' : 'Add to favorites',\n onClick: () => toggleStarredEntity(entity),\n };\n };\n },\n};\n","/*\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 { Link, SubvalueCell, TableColumn } from '@backstage/core-components';\nimport { EntityRefLinks } from '@backstage/plugin-catalog-react';\nimport { Entity } from '@backstage/catalog-model';\nimport { DocsTableRow } from './types';\n\nfunction customTitle(entity: Entity): string {\n return entity.metadata.title || entity.metadata.name;\n}\n\n/**\n * Not directly exported, but through DocsTable.columns and EntityListDocsTable.columns\n *\n * @public\n */\nexport const columnFactories = {\n createNameColumn(): TableColumn<DocsTableRow> {\n return {\n title: 'Document',\n field: 'entity.metadata.name',\n highlight: true,\n render: (row: DocsTableRow) => (\n <SubvalueCell\n value={\n <Link to={row.resolved.docsUrl}>{customTitle(row.entity)}</Link>\n }\n subvalue={row.entity.metadata.description}\n />\n ),\n };\n },\n createOwnerColumn(): TableColumn<DocsTableRow> {\n return {\n title: 'Owner',\n field: 'resolved.ownedByRelationsTitle',\n render: ({ resolved }) => (\n <EntityRefLinks\n entityRefs={resolved.ownedByRelations}\n defaultKind=\"group\"\n />\n ),\n };\n },\n createTypeColumn(): TableColumn<DocsTableRow> {\n return {\n title: 'Type',\n field: 'entity.spec.type',\n };\n },\n};\n","/*\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/lib/useCopyToClipboard';\n\nimport { useRouteRef, useApi, configApiRef } from '@backstage/core-plugin-api';\nimport { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport {\n humanizeEntityRef,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { rootDocsRouteRef } from '../../../routes';\nimport {\n Button,\n EmptyState,\n Table,\n TableColumn,\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};\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 } = 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.createTypeColumn(),\n ];\n\n const defaultActions: TableProps<DocsTableRow>['actions'] = [\n actionFactories.createCopyDocsUrlAction(copyToClipboard),\n ];\n\n return (\n <>\n {loading || (documents && documents.length > 0) ? (\n <Table<DocsTableRow>\n isLoading={loading}\n options={{\n paging: true,\n pageSize: 20,\n search: true,\n actionsColumnIndex: -1,\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 <Button\n color=\"primary\"\n to=\"https://backstage.io/docs/features/techdocs/getting-started\"\n variant=\"contained\"\n >\n DOCS\n </Button>\n }\n />\n )}\n </>\n );\n};\n\nDocsTable.columns = columnFactories;\nDocsTable.actions = actionFactories;\n","/*\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/lib/useCopyToClipboard';\nimport { capitalize } from 'lodash';\nimport {\n CodeSnippet,\n TableColumn,\n TableProps,\n WarningPanel,\n} from '@backstage/core-components';\nimport {\n useEntityList,\n useStarredEntities,\n} from '@backstage/plugin-catalog-react';\nimport { DocsTable } from './DocsTable';\nimport { actionFactories } from './actions';\nimport { columnFactories } from './columns';\nimport { DocsTableRow } from './types';\n\n/**\n * Props for {@link EntityListDocsTable}.\n *\n * @public\n */\nexport type EntityListDocsTableProps = {\n columns?: TableColumn<DocsTableRow>[];\n actions?: TableProps<DocsTableRow>['actions'];\n};\n\n/**\n * Component which renders a table with entities from catalog.\n *\n * @public\n */\nexport const EntityListDocsTable = (props: EntityListDocsTableProps) => {\n const { columns, actions } = props;\n const { loading, error, entities, filters } = useEntityList();\n const { isStarredEntity, toggleStarredEntity } = useStarredEntities();\n const [, copyToClipboard] = useCopyToClipboard();\n\n const title = capitalize(filters.user?.value ?? 'all');\n\n const defaultActions = [\n actionFactories.createCopyDocsUrlAction(copyToClipboard),\n actionFactories.createStarEntityAction(\n isStarredEntity,\n toggleStarredEntity,\n ),\n ];\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 return (\n <DocsTable\n title={title}\n entities={entities}\n loading={loading}\n actions={actions || defaultActions}\n columns={columns}\n />\n );\n};\n\nEntityListDocsTable.columns = columnFactories;\nEntityListDocsTable.actions = actionFactories;\n","/*\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';\n\nimport { PageWithHeader } from '@backstage/core-components';\nimport { useApi, configApiRef } from '@backstage/core-plugin-api';\n\n/**\n * Props for {@link TechDocsPageWrapper}\n *\n * @public\n */\nexport type TechDocsPageWrapperProps = {\n children?: React.ReactNode;\n};\n\n/**\n * Component wrapping a techdocs page with Page and Header components\n *\n * @public\n */\nexport const TechDocsPageWrapper = (props: TechDocsPageWrapperProps) => {\n const { children } = props;\n const configApi = useApi(configApiRef);\n const generatedSubtitle = `Documentation available in ${\n configApi.getOptionalString('organization.name') ?? 'Backstage'\n }`;\n\n return (\n <PageWithHeader\n title=\"Documentation\"\n subtitle={generatedSubtitle}\n themeId=\"documentation\"\n >\n {children}\n </PageWithHeader>\n );\n};\n","/*\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 { useEffect } from 'react';\nimport {\n CATALOG_FILTER_EXISTS,\n DefaultEntityFilters,\n EntityFilter,\n useEntityList,\n} from '@backstage/plugin-catalog-react';\n\nclass TechDocsFilter implements EntityFilter {\n getCatalogFilters(): Record<string, string | symbol | (string | symbol)[]> {\n return {\n 'metadata.annotations.backstage.io/techdocs-ref': CATALOG_FILTER_EXISTS,\n };\n }\n}\n\ntype CustomFilters = DefaultEntityFilters & {\n techdocs?: TechDocsFilter;\n};\n\n/**\n * Component responsible for updating TechDocs filters\n *\n * @public\n */\nexport const TechDocsPicker = () => {\n const { updateFilters } = useEntityList<CustomFilters>();\n\n useEffect(() => {\n updateFilters({\n techdocs: new TechDocsFilter(),\n });\n }, [updateFilters]);\n\n return null;\n};\n","/*\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 TableColumn,\n TableProps,\n} from '@backstage/core-components';\nimport {\n CatalogFilterLayout,\n EntityListProvider,\n EntityOwnerPicker,\n EntityTagPicker,\n UserListFilterKind,\n UserListPicker,\n} from '@backstage/plugin-catalog-react';\nimport { TechDocsPageWrapper } from './TechDocsPageWrapper';\nimport { TechDocsPicker } from './TechDocsPicker';\nimport { DocsTableRow, EntityListDocsTable } from './Tables';\n\n/**\n * Props for {@link DefaultTechDocsHome}\n *\n * @public\n */\nexport type DefaultTechDocsHomeProps = {\n initialFilter?: UserListFilterKind;\n columns?: TableColumn<DocsTableRow>[];\n actions?: TableProps<DocsTableRow>['actions'];\n};\n\n/**\n * Component which renders a default documentation landing page.\n *\n * @public\n */\nexport const DefaultTechDocsHome = (props: DefaultTechDocsHomeProps) => {\n const { initialFilter = 'all', 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","/*\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 { techdocsApiRef, techdocsStorageApiRef } from './api';\nimport { TechDocsClient, TechDocsStorageClient } from './client';\nimport {\n rootDocsRouteRef,\n rootRouteRef,\n rootCatalogDocsRouteRef,\n} from './routes';\nimport {\n configApiRef,\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\n\n/**\n * The Backstage plugin that renders technical documentation for your components\n *\n * @public\n */\nexport const techdocsPlugin = createPlugin({\n id: 'techdocs',\n apis: [\n 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 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 routes: {\n root: rootRouteRef,\n docRoot: rootDocsRouteRef,\n entityContent: rootCatalogDocsRouteRef,\n },\n});\n\n/**\n * Routable extension used to render docs\n *\n * @public\n */\nexport const TechdocsPage = techdocsPlugin.provide(\n createRoutableExtension({\n name: 'TechdocsPage',\n component: () => import('./Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * Routable extension used to render docs on Entity page\n *\n * @public\n */\nexport const EntityTechdocsContent = techdocsPlugin.provide(\n createRoutableExtension({\n name: 'EntityTechdocsContent',\n component: () => import('./Router').then(m => m.EmbeddedDocsRouter),\n mountPoint: rootCatalogDocsRouteRef,\n }),\n);\n\n/**\n * Component which takes a custom tabs config object and renders a documentation landing page.\n *\n * @public\n */\nexport const TechDocsCustomHome = techdocsPlugin.provide(\n createRoutableExtension({\n name: 'TechDocsCustomHome',\n component: () =>\n import('./home/components/TechDocsCustomHome').then(\n m => m.TechDocsCustomHome,\n ),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * Responsible for rendering the provided router element\n *\n * @public\n */\nexport const TechDocsIndexPage = techdocsPlugin.provide(\n createRoutableExtension({\n name: 'TechDocsIndexPage',\n component: () =>\n import('./home/components/TechDocsIndexPage').then(\n m => m.TechDocsIndexPage,\n ),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * Component responsible for composing a TechDocs reader page experience\n *\n * @public\n */\nexport const TechDocsReaderPage = techdocsPlugin.provide(\n createRoutableExtension({\n name: 'TechDocsReaderPage',\n component: () =>\n import('./reader/components/TechDocsReaderPage').then(\n m => m.TechDocsReaderPage,\n ),\n mountPoint: rootDocsRouteRef,\n }),\n);\n","/*\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 { useOutlet } from 'react-router';\nimport { DefaultTechDocsHome } from './DefaultTechDocsHome';\n\nexport const TechDocsIndexPage = () => {\n const outlet = useOutlet();\n\n return outlet || <DefaultTechDocsHome />;\n};\n","/*\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, { useCallback, useState } from 'react';\nimport { useOutlet } from 'react-router';\nimport { useParams } from 'react-router-dom';\nimport useAsync from 'react-use/lib/useAsync';\nimport { Reader } from './Reader';\nimport { TechDocsReaderPageHeader } from './TechDocsReaderPageHeader';\nimport { techdocsApiRef } from '../../api';\nimport { TechDocsEntityMetadata, TechDocsMetadata } from '../../types';\nimport { CompoundEntityRef } from '@backstage/catalog-model';\nimport { useApi, useApp } from '@backstage/core-plugin-api';\nimport { Page, Content } from '@backstage/core-components';\n\n/**\n * Helper function that gives the children of {@link TechDocsReaderPage} access to techdocs and entity metadata\n *\n * @public\n */\nexport type TechDocsReaderPageRenderFunction = ({\n techdocsMetadataValue,\n entityMetadataValue,\n entityRef,\n}: {\n techdocsMetadataValue?: TechDocsMetadata | undefined;\n entityMetadataValue?: TechDocsEntityMetadata | undefined;\n entityRef: CompoundEntityRef;\n onReady: () => void;\n}) => JSX.Element;\n\n/**\n * Props for {@link TechDocsReaderPage}\n *\n * @public\n */\nexport type TechDocsReaderPageProps = {\n children?: TechDocsReaderPageRenderFunction | React.ReactNode;\n};\n\nexport const TechDocsReaderPage = (props: TechDocsReaderPageProps) => {\n const { children } = props;\n const { NotFoundErrorPage } = useApp().getComponents();\n const outlet = useOutlet();\n\n const [documentReady, setDocumentReady] = useState<boolean>(false);\n const { namespace, kind, name } = useParams();\n\n const techdocsApi = useApi(techdocsApiRef);\n\n const { value: techdocsMetadataValue } = useAsync(() => {\n if (documentReady) {\n return techdocsApi.getTechDocsMetadata({ kind, namespace, name });\n }\n\n return Promise.resolve(undefined);\n }, [kind, namespace, name, techdocsApi, documentReady]);\n\n const { value: entityMetadataValue, error: entityMetadataError } =\n useAsync(() => {\n return techdocsApi.getEntityMetadata({ kind, namespace, name });\n }, [kind, namespace, name, techdocsApi]);\n\n const onReady = useCallback(() => {\n setDocumentReady(true);\n }, [setDocumentReady]);\n\n if (entityMetadataError) return <NotFoundErrorPage />;\n\n if (!children)\n return (\n outlet || (\n <Page themeId=\"documentation\">\n <TechDocsReaderPageHeader\n techDocsMetadata={techdocsMetadataValue}\n entityMetadata={entityMetadataValue}\n entityRef={{\n kind,\n namespace,\n name,\n }}\n />\n <Content data-testid=\"techdocs-content\">\n <Reader\n onReady={onReady}\n entityRef={{\n kind,\n namespace,\n name,\n }}\n />\n </Content>\n </Page>\n )\n );\n\n return (\n <Page themeId=\"documentation\">\n {children instanceof Function\n ? children({\n techdocsMetadataValue,\n entityMetadataValue,\n entityRef: { kind, namespace, name },\n onReady,\n })\n : children}\n </Page>\n );\n};\n","/*\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 from 'react';\nimport { Entity } from '@backstage/catalog-model';\nimport { Reader } from './reader';\nimport { toLowerMaybe } from './helpers';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\n\nexport const EntityPageDocs = ({ entity }: { entity: Entity }) => {\n const config = useApi(configApiRef);\n return (\n <Reader\n withSearch={false}\n entityRef={{\n namespace: toLowerMaybe(entity.metadata.namespace ?? 'default', config),\n kind: toLowerMaybe(entity.kind, config),\n name: toLowerMaybe(entity.metadata.name, config),\n }}\n />\n );\n};\n","/*\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 from 'react';\nimport { Entity } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { Route, Routes } from 'react-router-dom';\nimport { TechDocsIndexPage } from './home/components/TechDocsIndexPage';\nimport { TechDocsReaderPage } from './reader/components/TechDocsReaderPage';\nimport { EntityPageDocs } from './EntityPageDocs';\nimport { MissingAnnotationEmptyState } from '@backstage/core-components';\n\nconst TECHDOCS_ANNOTATION = 'backstage.io/techdocs-ref';\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\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 = () => {\n const { entity } = useEntity();\n\n const projectId = entity.metadata.annotations?.[TECHDOCS_ANNOTATION];\n\n if (!projectId) {\n return <MissingAnnotationEmptyState annotation={TECHDOCS_ANNOTATION} />;\n }\n\n return (\n <Routes>\n <Route path=\"/*\" element={<EntityPageDocs entity={entity} />} />\n </Routes>\n );\n};\n"],"names":["ReactDom","useStyles","useNavigate","transformer","Button","withStyles","TechDocsIndexPage","TechDocsReaderPage"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@backstage/plugin-techdocs",
3
3
  "description": "The Backstage plugin that renders technical documentation for your components",
4
- "version": "1.0.1-next.1",
4
+ "version": "1.1.0-next.3",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "Apache-2.0",
@@ -35,15 +35,17 @@
35
35
  "clean": "backstage-cli package clean"
36
36
  },
37
37
  "dependencies": {
38
- "@backstage/catalog-model": "^1.0.1-next.0",
38
+ "@backstage/catalog-model": "^1.0.1-next.1",
39
39
  "@backstage/config": "^1.0.0",
40
- "@backstage/core-components": "^0.9.3-next.0",
41
- "@backstage/core-plugin-api": "^1.0.0",
40
+ "@backstage/core-app-api": "^1.0.1-next.1",
41
+ "@backstage/core-components": "^0.9.3-next.2",
42
+ "@backstage/core-plugin-api": "^1.0.1-next.0",
42
43
  "@backstage/errors": "^1.0.0",
43
- "@backstage/integration": "^1.1.0-next.1",
44
- "@backstage/integration-react": "^1.0.1-next.1",
45
- "@backstage/plugin-catalog-react": "^1.0.1-next.1",
46
- "@backstage/plugin-search": "^0.7.5-next.0",
44
+ "@backstage/integration": "^1.1.0-next.2",
45
+ "@backstage/integration-react": "^1.0.1-next.2",
46
+ "@backstage/plugin-catalog-react": "^1.0.1-next.3",
47
+ "@backstage/plugin-search-react": "^0.1.0-next.0",
48
+ "@backstage/plugin-techdocs-react": "^0.1.0-next.0",
47
49
  "@backstage/theme": "^0.2.15",
48
50
  "@material-ui/core": "^4.12.2",
49
51
  "@material-ui/icons": "^4.9.1",
@@ -52,7 +54,9 @@
52
54
  "dompurify": "^2.2.9",
53
55
  "event-source-polyfill": "^1.0.25",
54
56
  "git-url-parse": "^11.6.0",
57
+ "jss": "~10.8.2",
55
58
  "lodash": "^4.17.21",
59
+ "react-helmet": "6.1.0",
56
60
  "react-router": "6.0.0-beta.0",
57
61
  "react-router-dom": "6.0.0-beta.0",
58
62
  "react-text-truncate": "^0.18.0",
@@ -64,17 +68,18 @@
64
68
  "react-dom": "^16.13.1 || ^17.0.0"
65
69
  },
66
70
  "devDependencies": {
67
- "@backstage/cli": "^0.17.0-next.1",
68
- "@backstage/core-app-api": "^1.0.1-next.0",
69
- "@backstage/dev-utils": "^1.0.1-next.0",
70
- "@backstage/test-utils": "^1.0.1-next.1",
71
+ "@backstage/cli": "^0.17.0-next.3",
72
+ "@backstage/core-app-api": "^1.0.1-next.1",
73
+ "@backstage/dev-utils": "^1.0.1-next.1",
74
+ "@backstage/test-utils": "^1.0.1-next.2",
71
75
  "@testing-library/jest-dom": "^5.10.1",
72
76
  "@testing-library/react": "^12.1.3",
73
77
  "@testing-library/react-hooks": "^7.0.2",
74
- "@testing-library/user-event": "^13.1.8",
78
+ "@testing-library/user-event": "^14.0.0",
75
79
  "@types/dompurify": "^2.2.2",
80
+ "@types/event-source-polyfill": "^1.0.0",
76
81
  "@types/jest": "^26.0.7",
77
- "@types/node": "^14.14.32",
82
+ "@types/node": "^16.11.26",
78
83
  "canvas": "^2.6.1",
79
84
  "cross-fetch": "^3.1.5",
80
85
  "msw": "^0.35.0"
@@ -84,5 +89,5 @@
84
89
  "config.d.ts"
85
90
  ],
86
91
  "configSchema": "config.d.ts",
87
- "gitHead": "57d12dcc35aeb6c33b09e51d1efc3408c574f109"
92
+ "gitHead": "2eca57d93ef1081f4a76a19fc994a8e9e1a19e00"
88
93
  }