@backstage/core-components 0.11.0 → 0.11.1-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # @backstage/core-components
2
2
 
3
+ ## 0.11.1-next.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 667d917488: Updated dependency `msw` to `^0.47.0`.
8
+ - 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`.
9
+ - 13f23f6510: Allow custom images in the empty state component
10
+ - Updated dependencies
11
+ - @backstage/core-plugin-api@1.0.6-next.2
12
+
13
+ ## 0.11.1-next.1
14
+
15
+ ### Patch Changes
16
+
17
+ - 817f3196f6: Updated React Router dependencies to be peer dependencies.
18
+ - 37e8c5e128: The `RoutedTabs` component has been updated to be compatible with React Router v6 stable.
19
+ - Updated dependencies
20
+ - @backstage/core-plugin-api@1.0.6-next.1
21
+
22
+ ## 0.11.1-next.0
23
+
24
+ ### Patch Changes
25
+
26
+ - b29c44d895: Adds code to generate ids for headers parsed through the MarkdownContent component.
27
+ - bf5e9030eb: Updated dependency `msw` to `^0.45.0`.
28
+ - c8bb0ff8ce: Minor cleanup of the public API surface to reduce the number of warnings
29
+ - Updated dependencies
30
+ - @backstage/core-plugin-api@1.0.6-next.0
31
+
3
32
  ## 0.11.0
4
33
 
5
34
  ### Minor Changes
@@ -1 +1 @@
1
- {"version":3,"file":"RealLogViewer-22a2ee94.esm.js","sources":["../../src/components/LogViewer/AnsiProcessor.ts","../../src/components/LogViewer/styles.ts","../../src/components/LogViewer/LogLine.tsx","../../src/components/LogViewer/LogViewerControls.tsx","../../src/components/LogViewer/useLogViewerSearch.tsx","../../src/components/LogViewer/useLogViewerSelection.tsx","../../src/components/LogViewer/RealLogViewer.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ansiRegexMaker from 'ansi-regex';\n\nconst ansiRegex = ansiRegexMaker();\nconst newlineRegex = /\\n\\r?/g;\n\n// A mapping of how each escape code changes the modifiers\nconst codeModifiers = Object.fromEntries(\n Object.entries({\n 1: m => ({ ...m, bold: true }),\n 3: m => ({ ...m, italic: true }),\n 4: m => ({ ...m, underline: true }),\n 22: ({ bold: _, ...m }) => m,\n 23: ({ italic: _, ...m }) => m,\n 24: ({ underline: _, ...m }) => m,\n 30: m => ({ ...m, foreground: 'black' }),\n 31: m => ({ ...m, foreground: 'red' }),\n 32: m => ({ ...m, foreground: 'green' }),\n 33: m => ({ ...m, foreground: 'yellow' }),\n 34: m => ({ ...m, foreground: 'blue' }),\n 35: m => ({ ...m, foreground: 'magenta' }),\n 36: m => ({ ...m, foreground: 'cyan' }),\n 37: m => ({ ...m, foreground: 'white' }),\n 39: ({ foreground: _, ...m }) => m,\n 90: m => ({ ...m, foreground: 'grey' }),\n 40: m => ({ ...m, background: 'black' }),\n 41: m => ({ ...m, background: 'red' }),\n 42: m => ({ ...m, background: 'green' }),\n 43: m => ({ ...m, background: 'yellow' }),\n 44: m => ({ ...m, background: 'blue' }),\n 45: m => ({ ...m, background: 'magenta' }),\n 46: m => ({ ...m, background: 'cyan' }),\n 47: m => ({ ...m, background: 'white' }),\n 49: ({ background: _, ...m }) => m,\n } as Record<string, (m: ChunkModifiers) => ChunkModifiers>).map(\n ([code, modifier]) => [`\\x1b[${code}m`, modifier],\n ),\n);\n\nexport type AnsiColor =\n | 'black'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'cyan'\n | 'white'\n | 'grey';\n\nexport interface ChunkModifiers {\n foreground?: AnsiColor;\n background?: AnsiColor;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n}\n\nexport interface AnsiChunk {\n text: string;\n modifiers: ChunkModifiers;\n}\n\nexport class AnsiLine {\n text: string;\n\n constructor(\n readonly lineNumber: number = 1,\n readonly chunks: AnsiChunk[] = [],\n ) {\n this.text = chunks\n .map(c => c.text)\n .join('')\n .toLocaleLowerCase('en-US');\n }\n\n lastChunk(): AnsiChunk | undefined {\n return this.chunks[this.chunks.length - 1];\n }\n\n replaceLastChunk(newChunks?: AnsiChunk[]) {\n if (newChunks) {\n this.chunks.splice(this.chunks.length - 1, 1, ...newChunks);\n this.text = this.chunks\n .map(c => c.text)\n .join('')\n .toLocaleLowerCase('en-US');\n }\n }\n}\n\nexport class AnsiProcessor {\n private text: string = '';\n private lines: AnsiLine[] = [];\n\n /**\n * Processes a chunk of text while keeping internal state that optimizes\n * subsequent processing that appends to the text.\n */\n process(text: string): AnsiLine[] {\n if (this.text === text) {\n return this.lines;\n }\n\n if (text.startsWith(this.text)) {\n const lastLineIndex = this.lines.length > 0 ? this.lines.length - 1 : 0;\n const lastLine = this.lines[lastLineIndex] ?? new AnsiLine();\n const lastChunk = lastLine.lastChunk();\n\n const newLines = this.processLines(\n (lastChunk?.text ?? '') + text.slice(this.text.length),\n lastChunk?.modifiers,\n lastLine?.lineNumber,\n );\n lastLine.replaceLastChunk(newLines[0]?.chunks);\n\n this.lines[lastLineIndex] = lastLine;\n this.lines.push(...newLines.slice(1));\n } else {\n this.lines = this.processLines(text);\n }\n this.text = text;\n\n return this.lines;\n }\n\n // Split a chunk of text up into lines and process each line individually\n private processLines = (\n text: string,\n modifiers: ChunkModifiers = {},\n startingLineNumber: number = 1,\n ): AnsiLine[] => {\n const lines: AnsiLine[] = [];\n\n let currentModifiers = modifiers;\n let currentLineNumber = startingLineNumber;\n\n let prevIndex = 0;\n newlineRegex.lastIndex = 0;\n for (;;) {\n const match = newlineRegex.exec(text);\n if (!match) {\n const chunks = this.processText(\n text.slice(prevIndex),\n currentModifiers,\n );\n lines.push(new AnsiLine(currentLineNumber, chunks));\n return lines;\n }\n\n const line = text.slice(prevIndex, match.index);\n prevIndex = match.index + match[0].length;\n\n const chunks = this.processText(line, currentModifiers);\n lines.push(new AnsiLine(currentLineNumber, chunks));\n\n // Modifiers that are active in the last chunk are carried over to the next line\n currentModifiers =\n chunks[chunks.length - 1].modifiers ?? currentModifiers;\n currentLineNumber += 1;\n }\n };\n\n // Processing of a one individual text chunk\n private processText = (\n fullText: string,\n modifiers: ChunkModifiers,\n ): AnsiChunk[] => {\n const chunks: AnsiChunk[] = [];\n\n let currentModifiers = modifiers;\n\n let prevIndex = 0;\n ansiRegex.lastIndex = 0;\n for (;;) {\n const match = ansiRegex.exec(fullText);\n if (!match) {\n chunks.push({\n text: fullText.slice(prevIndex),\n modifiers: currentModifiers,\n });\n return chunks;\n }\n\n const text = fullText.slice(prevIndex, match.index);\n chunks.push({ text, modifiers: currentModifiers });\n\n // For every escape code that we encounter we keep track of where the\n // next chunk of text starts, and what modifiers it has\n prevIndex = match.index + match[0].length;\n currentModifiers = this.processCode(match[0], currentModifiers);\n }\n };\n\n private processCode = (\n code: string,\n modifiers: ChunkModifiers,\n ): ChunkModifiers => {\n return codeModifiers[code]?.(modifiers) ?? modifiers;\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 { alpha, makeStyles } from '@material-ui/core/styles';\nimport * as colors from '@material-ui/core/colors';\n\nexport const HEADER_SIZE = 40;\n\n/** @public Class keys for overriding LogViewer styles */\nexport type LogViewerClassKey =\n | 'root'\n | 'header'\n | 'log'\n | 'line'\n | 'lineSelected'\n | 'lineCopyButton'\n | 'lineNumber'\n | 'textHighlight'\n | 'textSelectedHighlight'\n | 'modifierBold'\n | 'modifierItalic'\n | 'modifierUnderline'\n | 'modifierForegroundBlack'\n | 'modifierForegroundRed'\n | 'modifierForegroundGreen'\n | 'modifierForegroundYellow'\n | 'modifierForegroundBlue'\n | 'modifierForegroundMagenta'\n | 'modifierForegroundCyan'\n | 'modifierForegroundWhite'\n | 'modifierForegroundGrey'\n | 'modifierBackgroundBlack'\n | 'modifierBackgroundRed'\n | 'modifierBackgroundGreen'\n | 'modifierBackgroundYellow'\n | 'modifierBackgroundBlue'\n | 'modifierBackgroundMagenta'\n | 'modifierBackgroundCyan'\n | 'modifierBackgroundWhite'\n | 'modifierBackgroundGrey';\n\nexport const useStyles = makeStyles(\n theme => ({\n root: {\n background: theme.palette.background.paper,\n },\n header: {\n height: HEADER_SIZE,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n },\n log: {\n fontFamily: '\"Monaco\", monospace',\n fontSize: theme.typography.pxToRem(12),\n },\n line: {\n position: 'relative',\n whiteSpace: 'pre',\n\n '&:hover': {\n background: theme.palette.action.hover,\n },\n },\n lineSelected: {\n background: theme.palette.action.selected,\n\n '&:hover': {\n background: theme.palette.action.selected,\n },\n },\n lineCopyButton: {\n position: 'absolute',\n paddingTop: 0,\n paddingBottom: 0,\n },\n lineNumber: {\n display: 'inline-block',\n textAlign: 'end',\n width: 60,\n marginRight: theme.spacing(1),\n cursor: 'pointer',\n },\n textHighlight: {\n background: alpha(theme.palette.info.main, 0.15),\n },\n textSelectedHighlight: {\n background: alpha(theme.palette.info.main, 0.4),\n },\n modifierBold: {\n fontWeight: theme.typography.fontWeightBold,\n },\n modifierItalic: {\n fontStyle: 'italic',\n },\n modifierUnderline: {\n textDecoration: 'underline',\n },\n modifierForegroundBlack: {\n color: colors.common.black,\n },\n modifierForegroundRed: {\n color: colors.red[500],\n },\n modifierForegroundGreen: {\n color: colors.green[500],\n },\n modifierForegroundYellow: {\n color: colors.yellow[500],\n },\n modifierForegroundBlue: {\n color: colors.blue[500],\n },\n modifierForegroundMagenta: {\n color: colors.purple[500],\n },\n modifierForegroundCyan: {\n color: colors.cyan[500],\n },\n modifierForegroundWhite: {\n color: colors.common.white,\n },\n modifierForegroundGrey: {\n color: colors.grey[500],\n },\n modifierBackgroundBlack: {\n background: colors.common.black,\n },\n modifierBackgroundRed: {\n background: colors.red[500],\n },\n modifierBackgroundGreen: {\n background: colors.green[500],\n },\n modifierBackgroundYellow: {\n background: colors.yellow[500],\n },\n modifierBackgroundBlue: {\n background: colors.blue[500],\n },\n modifierBackgroundMagenta: {\n background: colors.purple[500],\n },\n modifierBackgroundCyan: {\n background: colors.cyan[500],\n },\n modifierBackgroundWhite: {\n background: colors.common.white,\n },\n modifierBackgroundGrey: {\n background: colors.grey[500],\n },\n }),\n { name: 'BackstageLogViewer' },\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, { useMemo } from 'react';\nimport { AnsiChunk, AnsiLine, ChunkModifiers } from './AnsiProcessor';\nimport startCase from 'lodash/startCase';\nimport classnames from 'classnames';\nimport { useStyles } from './styles';\n\nexport function getModifierClasses(\n classes: ReturnType<typeof useStyles>,\n modifiers: ChunkModifiers,\n) {\n const classNames = new Array<string>();\n if (modifiers.bold) {\n classNames.push(classes.modifierBold);\n }\n if (modifiers.italic) {\n classNames.push(classes.modifierItalic);\n }\n if (modifiers.underline) {\n classNames.push(classes.modifierUnderline);\n }\n if (modifiers.foreground) {\n const key = `modifierForeground${startCase(\n modifiers.foreground,\n )}` as keyof typeof classes;\n classNames.push(classes[key]);\n }\n if (modifiers.background) {\n const key = `modifierBackground${startCase(\n modifiers.background,\n )}` as keyof typeof classes;\n classNames.push(classes[key]);\n }\n return classNames.length > 0 ? classNames.join(' ') : undefined;\n}\n\nexport function findSearchResults(text: string, searchText: string) {\n if (!searchText || !text.includes(searchText)) {\n return undefined;\n }\n const searchResults = new Array<{ start: number; end: number }>();\n let offset = 0;\n for (;;) {\n const start = text.indexOf(searchText, offset);\n if (start === -1) {\n break;\n }\n const end = start + searchText.length;\n searchResults.push({ start, end });\n offset = end;\n }\n return searchResults;\n}\n\nexport interface HighlightAnsiChunk extends AnsiChunk {\n highlight?: number;\n}\n\nexport function calculateHighlightedChunks(\n line: AnsiLine,\n searchText: string,\n): HighlightAnsiChunk[] {\n const results = findSearchResults(line.text, searchText);\n if (!results) {\n return line.chunks;\n }\n\n const chunks = new Array<HighlightAnsiChunk>();\n\n let lineOffset = 0;\n let resultIndex = 0;\n let result = results[resultIndex];\n for (const chunk of line.chunks) {\n const { text, modifiers } = chunk;\n if (!result || lineOffset + text.length < result.start) {\n chunks.push(chunk);\n lineOffset += text.length;\n continue;\n }\n\n let localOffset = 0;\n while (result) {\n const localStart = Math.max(result.start - lineOffset, 0);\n if (localStart > text.length) {\n break; // The next result is not in this chunk\n }\n\n const localEnd = Math.min(result.end - lineOffset, text.length);\n\n const hasTextBeforeResult = localStart > localOffset;\n if (hasTextBeforeResult) {\n chunks.push({ text: text.slice(localOffset, localStart), modifiers });\n }\n const hasResultText = localEnd > localStart;\n if (hasResultText) {\n chunks.push({\n modifiers,\n highlight: resultIndex,\n text: text.slice(localStart, localEnd),\n });\n }\n\n localOffset = localEnd;\n\n const foundCompleteResult = result.end - lineOffset === localEnd;\n if (foundCompleteResult) {\n resultIndex += 1;\n result = results[resultIndex];\n } else {\n break; // The rest of the result is in the following chunks\n }\n }\n\n const hasTextAfterResult = localOffset < text.length;\n if (hasTextAfterResult) {\n chunks.push({ text: text.slice(localOffset), modifiers });\n }\n\n lineOffset += text.length;\n }\n\n return chunks;\n}\n\nexport interface LogLineProps {\n line: AnsiLine;\n classes: ReturnType<typeof useStyles>;\n searchText: string;\n highlightResultIndex?: number;\n}\n\nexport function LogLine({\n line,\n classes,\n searchText,\n highlightResultIndex,\n}: LogLineProps) {\n const chunks = useMemo(\n () => calculateHighlightedChunks(line, searchText),\n [line, searchText],\n );\n\n const elements = useMemo(\n () =>\n chunks.map(({ text, modifiers, highlight }, index) => (\n <span\n key={index}\n className={classnames(\n getModifierClasses(classes, modifiers),\n highlight !== undefined &&\n (highlight === highlightResultIndex\n ? classes.textSelectedHighlight\n : classes.textHighlight),\n )}\n >\n {text}\n </span>\n )),\n [chunks, highlightResultIndex, classes],\n );\n\n return <>{elements}</>;\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 IconButton from '@material-ui/core/IconButton';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport { LogViewerSearch } from './useLogViewerSearch';\n\nexport interface LogViewerControlsProps extends LogViewerSearch {}\n\nexport function LogViewerControls(props: LogViewerControlsProps) {\n const { resultCount, resultIndexStep, toggleShouldFilter } = props;\n const resultIndex = props.resultIndex ?? 0;\n\n const handleKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n if (event.metaKey || event.ctrlKey || event.altKey) {\n toggleShouldFilter();\n } else {\n resultIndexStep(event.shiftKey);\n }\n }\n };\n\n return (\n <>\n {resultCount !== undefined && (\n <>\n <IconButton size=\"small\" onClick={() => resultIndexStep(true)}>\n <ChevronLeftIcon />\n </IconButton>\n <Typography>\n {Math.min(resultIndex + 1, resultCount)}/{resultCount}\n </Typography>\n <IconButton size=\"small\" onClick={() => resultIndexStep()}>\n <ChevronRightIcon />\n </IconButton>\n </>\n )}\n <TextField\n size=\"small\"\n variant=\"standard\"\n placeholder=\"Search\"\n value={props.searchInput}\n onKeyPress={handleKeyPress}\n onChange={e => props.setSearchInput(e.target.value)}\n />\n <IconButton size=\"small\" onClick={toggleShouldFilter}>\n {props.shouldFilter ? (\n <FilterListIcon color=\"primary\" />\n ) : (\n <FilterListIcon color=\"disabled\" />\n )}\n </IconButton>\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 { useMemo, useState } from 'react';\nimport { useToggle } from '@react-hookz/web';\nimport { AnsiLine } from './AnsiProcessor';\n\nexport function applySearchFilter(lines: AnsiLine[], searchText: string) {\n if (!searchText) {\n return { lines };\n }\n\n const matchingLines = [];\n const searchResults = [];\n for (const line of lines) {\n if (line.text.includes(searchText)) {\n matchingLines.push(line);\n\n let offset = 0;\n let lineResultIndex = 0;\n for (;;) {\n const start = line.text.indexOf(searchText, offset);\n if (start === -1) {\n break;\n }\n searchResults.push({\n lineNumber: line.lineNumber,\n lineIndex: lineResultIndex++,\n });\n offset = start + searchText.length;\n }\n }\n }\n\n return {\n lines: matchingLines,\n results: searchResults,\n };\n}\n\nexport interface LogViewerSearch {\n lines: AnsiLine[];\n\n searchText: string;\n searchInput: string;\n setSearchInput: (searchInput: string) => void;\n\n shouldFilter: boolean;\n toggleShouldFilter: () => void;\n\n resultCount: number | undefined;\n resultIndex: number | undefined;\n resultIndexStep: (decrement?: boolean) => void;\n\n resultLine: number | undefined;\n resultLineIndex: number | undefined;\n}\n\nexport function useLogViewerSearch(lines: AnsiLine[]): LogViewerSearch {\n const [searchInput, setSearchInput] = useState('');\n const searchText = searchInput.toLocaleLowerCase('en-US');\n\n const [resultIndex, setResultIndex] = useState<number>(0);\n\n const [shouldFilter, toggleShouldFilter] = useToggle(false);\n\n const filter = useMemo(\n () => applySearchFilter(lines, searchText),\n [lines, searchText],\n );\n\n const searchResult = filter.results\n ? filter.results[Math.min(resultIndex, filter.results.length - 1)]\n : undefined;\n const resultCount = filter.results?.length;\n\n const resultIndexStep = (decrement?: boolean) => {\n if (decrement) {\n if (resultCount !== undefined) {\n const next = Math.min(resultIndex - 1, resultCount - 2);\n setResultIndex(next < 0 ? resultCount - 1 : next);\n }\n } else {\n if (resultCount !== undefined) {\n const next = resultIndex + 1;\n setResultIndex(next >= resultCount ? 0 : next);\n }\n }\n };\n\n return {\n lines: shouldFilter ? filter.lines : lines,\n searchText,\n searchInput,\n setSearchInput,\n shouldFilter,\n toggleShouldFilter,\n resultCount,\n resultIndex,\n resultIndexStep,\n resultLine: searchResult?.lineNumber,\n resultLineIndex: searchResult?.lineIndex,\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 { errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useEffect, useState } from 'react';\nimport useCopyToClipboard from 'react-use/lib/useCopyToClipboard';\nimport { AnsiLine } from './AnsiProcessor';\n\nexport function useLogViewerSelection(lines: AnsiLine[]) {\n const errorApi = useApi(errorApiRef);\n const [sel, setSelection] = useState<{ start: number; end: number }>();\n const start = sel ? Math.min(sel.start, sel.end) : undefined;\n const end = sel ? Math.max(sel.start, sel.end) : undefined;\n\n const [{ error }, copyToClipboard] = useCopyToClipboard();\n\n useEffect(() => {\n if (error) {\n errorApi.post(error);\n }\n }, [error, errorApi]);\n\n return {\n shouldShowButton(line: number) {\n return start === line || end === line;\n },\n isSelected(line: number) {\n if (!sel) {\n return false;\n }\n return start! <= line && line <= end!;\n },\n setSelection(line: number, add: boolean) {\n if (add) {\n setSelection(s =>\n s ? { start: s.start, end: line } : { start: line, end: line },\n );\n } else {\n setSelection(s =>\n s?.start === line && s?.end === line\n ? undefined\n : { start: line, end: line },\n );\n }\n },\n copySelection() {\n if (sel) {\n const copyText = lines\n .slice(Math.min(sel.start, sel.end) - 1, Math.max(sel.start, sel.end))\n .map(l => l.chunks.map(c => c.text).join(''))\n .join('\\n');\n copyToClipboard(copyText);\n setSelection(undefined);\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, { useEffect, useMemo, useRef } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport IconButton from '@material-ui/core/IconButton';\nimport CopyIcon from '@material-ui/icons/FileCopy';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { FixedSizeList } from 'react-window';\nimport { AnsiProcessor } from './AnsiProcessor';\nimport { HEADER_SIZE, useStyles } from './styles';\nimport classnames from 'classnames';\nimport { LogLine } from './LogLine';\nimport { LogViewerControls } from './LogViewerControls';\nimport { useLogViewerSearch } from './useLogViewerSearch';\nimport { useLogViewerSelection } from './useLogViewerSelection';\n\nexport interface RealLogViewerProps {\n text: string;\n classes?: { root?: string };\n}\n\nexport function RealLogViewer(props: RealLogViewerProps) {\n const classes = useStyles({ classes: props.classes });\n const listRef = useRef<FixedSizeList | null>(null);\n\n // The processor keeps state that optimizes appending to the text\n const processor = useMemo(() => new AnsiProcessor(), []);\n const lines = processor.process(props.text);\n\n const search = useLogViewerSearch(lines);\n const selection = useLogViewerSelection(lines);\n const location = useLocation();\n\n useEffect(() => {\n if (search.resultLine !== undefined && listRef.current) {\n listRef.current.scrollToItem(search.resultLine - 1, 'center');\n }\n }, [search.resultLine]);\n\n useEffect(() => {\n if (location.hash) {\n // #line-6 -> 6\n const line = parseInt(location.hash.replace(/\\D/g, ''), 10);\n selection.setSelection(line, false);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleSelectLine = (\n line: number,\n event: { shiftKey: boolean; preventDefault: () => void },\n ) => {\n selection.setSelection(line, event.shiftKey);\n };\n\n return (\n <AutoSizer>\n {({ height, width }) => (\n <div style={{ width, height }} className={classes.root}>\n <div className={classes.header}>\n <LogViewerControls {...search} />\n </div>\n <FixedSizeList\n ref={listRef}\n className={classes.log}\n height={height - HEADER_SIZE}\n width={width}\n itemData={search.lines}\n itemSize={20}\n itemCount={search.lines.length}\n >\n {({ index, style, data }) => {\n const line = data[index];\n const { lineNumber } = line;\n return (\n <div\n style={{ ...style }}\n className={classnames(classes.line, {\n [classes.lineSelected]: selection.isSelected(lineNumber),\n })}\n >\n {selection.shouldShowButton(lineNumber) && (\n <IconButton\n data-testid=\"copy-button\"\n size=\"small\"\n className={classes.lineCopyButton}\n onClick={() => selection.copySelection()}\n >\n <CopyIcon fontSize=\"inherit\" />\n </IconButton>\n )}\n <a\n role=\"row\"\n target=\"_self\"\n href={`#line-${lineNumber}`}\n className={classes.lineNumber}\n onClick={event => handleSelectLine(lineNumber, event)}\n onKeyPress={event => handleSelectLine(lineNumber, event)}\n >\n {lineNumber}\n </a>\n <LogLine\n line={line}\n classes={classes}\n searchText={search.searchText}\n highlightResultIndex={\n search.resultLine === lineNumber\n ? search.resultLineIndex\n : undefined\n }\n />\n </div>\n );\n }}\n </FixedSizeList>\n </div>\n )}\n </AutoSizer>\n );\n}\n"],"names":["classnames","ChevronRightIcon","FilterListIcon"],"mappings":"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"}
1
+ {"version":3,"file":"RealLogViewer-22a2ee94.esm.js","sources":["../../src/components/LogViewer/AnsiProcessor.ts","../../src/components/LogViewer/styles.ts","../../src/components/LogViewer/LogLine.tsx","../../src/components/LogViewer/LogViewerControls.tsx","../../src/components/LogViewer/useLogViewerSearch.tsx","../../src/components/LogViewer/useLogViewerSelection.tsx","../../src/components/LogViewer/RealLogViewer.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport ansiRegexMaker from 'ansi-regex';\n\nconst ansiRegex = ansiRegexMaker();\nconst newlineRegex = /\\n\\r?/g;\n\n// A mapping of how each escape code changes the modifiers\nconst codeModifiers = Object.fromEntries(\n Object.entries({\n 1: m => ({ ...m, bold: true }),\n 3: m => ({ ...m, italic: true }),\n 4: m => ({ ...m, underline: true }),\n 22: ({ bold: _, ...m }) => m,\n 23: ({ italic: _, ...m }) => m,\n 24: ({ underline: _, ...m }) => m,\n 30: m => ({ ...m, foreground: 'black' }),\n 31: m => ({ ...m, foreground: 'red' }),\n 32: m => ({ ...m, foreground: 'green' }),\n 33: m => ({ ...m, foreground: 'yellow' }),\n 34: m => ({ ...m, foreground: 'blue' }),\n 35: m => ({ ...m, foreground: 'magenta' }),\n 36: m => ({ ...m, foreground: 'cyan' }),\n 37: m => ({ ...m, foreground: 'white' }),\n 39: ({ foreground: _, ...m }) => m,\n 90: m => ({ ...m, foreground: 'grey' }),\n 40: m => ({ ...m, background: 'black' }),\n 41: m => ({ ...m, background: 'red' }),\n 42: m => ({ ...m, background: 'green' }),\n 43: m => ({ ...m, background: 'yellow' }),\n 44: m => ({ ...m, background: 'blue' }),\n 45: m => ({ ...m, background: 'magenta' }),\n 46: m => ({ ...m, background: 'cyan' }),\n 47: m => ({ ...m, background: 'white' }),\n 49: ({ background: _, ...m }) => m,\n } as Record<string, (m: ChunkModifiers) => ChunkModifiers>).map(\n ([code, modifier]) => [`\\x1b[${code}m`, modifier],\n ),\n);\n\nexport type AnsiColor =\n | 'black'\n | 'red'\n | 'green'\n | 'yellow'\n | 'blue'\n | 'magenta'\n | 'cyan'\n | 'white'\n | 'grey';\n\nexport interface ChunkModifiers {\n foreground?: AnsiColor;\n background?: AnsiColor;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n}\n\nexport interface AnsiChunk {\n text: string;\n modifiers: ChunkModifiers;\n}\n\nexport class AnsiLine {\n text: string;\n\n constructor(\n readonly lineNumber: number = 1,\n readonly chunks: AnsiChunk[] = [],\n ) {\n this.text = chunks\n .map(c => c.text)\n .join('')\n .toLocaleLowerCase('en-US');\n }\n\n lastChunk(): AnsiChunk | undefined {\n return this.chunks[this.chunks.length - 1];\n }\n\n replaceLastChunk(newChunks?: AnsiChunk[]) {\n if (newChunks) {\n this.chunks.splice(this.chunks.length - 1, 1, ...newChunks);\n this.text = this.chunks\n .map(c => c.text)\n .join('')\n .toLocaleLowerCase('en-US');\n }\n }\n}\n\nexport class AnsiProcessor {\n private text: string = '';\n private lines: AnsiLine[] = [];\n\n /**\n * Processes a chunk of text while keeping internal state that optimizes\n * subsequent processing that appends to the text.\n */\n process(text: string): AnsiLine[] {\n if (this.text === text) {\n return this.lines;\n }\n\n if (text.startsWith(this.text)) {\n const lastLineIndex = this.lines.length > 0 ? this.lines.length - 1 : 0;\n const lastLine = this.lines[lastLineIndex] ?? new AnsiLine();\n const lastChunk = lastLine.lastChunk();\n\n const newLines = this.processLines(\n (lastChunk?.text ?? '') + text.slice(this.text.length),\n lastChunk?.modifiers,\n lastLine?.lineNumber,\n );\n lastLine.replaceLastChunk(newLines[0]?.chunks);\n\n this.lines[lastLineIndex] = lastLine;\n this.lines.push(...newLines.slice(1));\n } else {\n this.lines = this.processLines(text);\n }\n this.text = text;\n\n return this.lines;\n }\n\n // Split a chunk of text up into lines and process each line individually\n private processLines = (\n text: string,\n modifiers: ChunkModifiers = {},\n startingLineNumber: number = 1,\n ): AnsiLine[] => {\n const lines: AnsiLine[] = [];\n\n let currentModifiers = modifiers;\n let currentLineNumber = startingLineNumber;\n\n let prevIndex = 0;\n newlineRegex.lastIndex = 0;\n for (;;) {\n const match = newlineRegex.exec(text);\n if (!match) {\n const chunks = this.processText(\n text.slice(prevIndex),\n currentModifiers,\n );\n lines.push(new AnsiLine(currentLineNumber, chunks));\n return lines;\n }\n\n const line = text.slice(prevIndex, match.index);\n prevIndex = match.index + match[0].length;\n\n const chunks = this.processText(line, currentModifiers);\n lines.push(new AnsiLine(currentLineNumber, chunks));\n\n // Modifiers that are active in the last chunk are carried over to the next line\n currentModifiers =\n chunks[chunks.length - 1].modifiers ?? currentModifiers;\n currentLineNumber += 1;\n }\n };\n\n // Processing of a one individual text chunk\n private processText = (\n fullText: string,\n modifiers: ChunkModifiers,\n ): AnsiChunk[] => {\n const chunks: AnsiChunk[] = [];\n\n let currentModifiers = modifiers;\n\n let prevIndex = 0;\n ansiRegex.lastIndex = 0;\n for (;;) {\n const match = ansiRegex.exec(fullText);\n if (!match) {\n chunks.push({\n text: fullText.slice(prevIndex),\n modifiers: currentModifiers,\n });\n return chunks;\n }\n\n const text = fullText.slice(prevIndex, match.index);\n chunks.push({ text, modifiers: currentModifiers });\n\n // For every escape code that we encounter we keep track of where the\n // next chunk of text starts, and what modifiers it has\n prevIndex = match.index + match[0].length;\n currentModifiers = this.processCode(match[0], currentModifiers);\n }\n };\n\n private processCode = (\n code: string,\n modifiers: ChunkModifiers,\n ): ChunkModifiers => {\n return codeModifiers[code]?.(modifiers) ?? modifiers;\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 { alpha, makeStyles } from '@material-ui/core/styles';\nimport * as colors from '@material-ui/core/colors';\n\nexport const HEADER_SIZE = 40;\n\n/** @public Class keys for overriding LogViewer styles */\nexport type LogViewerClassKey =\n | 'root'\n | 'header'\n | 'log'\n | 'line'\n | 'lineSelected'\n | 'lineCopyButton'\n | 'lineNumber'\n | 'textHighlight'\n | 'textSelectedHighlight'\n | 'modifierBold'\n | 'modifierItalic'\n | 'modifierUnderline'\n | 'modifierForegroundBlack'\n | 'modifierForegroundRed'\n | 'modifierForegroundGreen'\n | 'modifierForegroundYellow'\n | 'modifierForegroundBlue'\n | 'modifierForegroundMagenta'\n | 'modifierForegroundCyan'\n | 'modifierForegroundWhite'\n | 'modifierForegroundGrey'\n | 'modifierBackgroundBlack'\n | 'modifierBackgroundRed'\n | 'modifierBackgroundGreen'\n | 'modifierBackgroundYellow'\n | 'modifierBackgroundBlue'\n | 'modifierBackgroundMagenta'\n | 'modifierBackgroundCyan'\n | 'modifierBackgroundWhite'\n | 'modifierBackgroundGrey';\n\nexport const useStyles = makeStyles(\n theme => ({\n root: {\n background: theme.palette.background.paper,\n },\n header: {\n height: HEADER_SIZE,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n },\n log: {\n fontFamily: '\"Monaco\", monospace',\n fontSize: theme.typography.pxToRem(12),\n },\n line: {\n position: 'relative',\n whiteSpace: 'pre',\n\n '&:hover': {\n background: theme.palette.action.hover,\n },\n },\n lineSelected: {\n background: theme.palette.action.selected,\n\n '&:hover': {\n background: theme.palette.action.selected,\n },\n },\n lineCopyButton: {\n position: 'absolute',\n paddingTop: 0,\n paddingBottom: 0,\n },\n lineNumber: {\n display: 'inline-block',\n textAlign: 'end',\n width: 60,\n marginRight: theme.spacing(1),\n cursor: 'pointer',\n },\n textHighlight: {\n background: alpha(theme.palette.info.main, 0.15),\n },\n textSelectedHighlight: {\n background: alpha(theme.palette.info.main, 0.4),\n },\n modifierBold: {\n fontWeight: theme.typography.fontWeightBold,\n },\n modifierItalic: {\n fontStyle: 'italic',\n },\n modifierUnderline: {\n textDecoration: 'underline',\n },\n modifierForegroundBlack: {\n color: colors.common.black,\n },\n modifierForegroundRed: {\n color: colors.red[500],\n },\n modifierForegroundGreen: {\n color: colors.green[500],\n },\n modifierForegroundYellow: {\n color: colors.yellow[500],\n },\n modifierForegroundBlue: {\n color: colors.blue[500],\n },\n modifierForegroundMagenta: {\n color: colors.purple[500],\n },\n modifierForegroundCyan: {\n color: colors.cyan[500],\n },\n modifierForegroundWhite: {\n color: colors.common.white,\n },\n modifierForegroundGrey: {\n color: colors.grey[500],\n },\n modifierBackgroundBlack: {\n background: colors.common.black,\n },\n modifierBackgroundRed: {\n background: colors.red[500],\n },\n modifierBackgroundGreen: {\n background: colors.green[500],\n },\n modifierBackgroundYellow: {\n background: colors.yellow[500],\n },\n modifierBackgroundBlue: {\n background: colors.blue[500],\n },\n modifierBackgroundMagenta: {\n background: colors.purple[500],\n },\n modifierBackgroundCyan: {\n background: colors.cyan[500],\n },\n modifierBackgroundWhite: {\n background: colors.common.white,\n },\n modifierBackgroundGrey: {\n background: colors.grey[500],\n },\n }),\n { name: 'BackstageLogViewer' },\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, { useMemo } from 'react';\nimport { AnsiChunk, AnsiLine, ChunkModifiers } from './AnsiProcessor';\nimport startCase from 'lodash/startCase';\nimport classnames from 'classnames';\nimport { useStyles } from './styles';\n\nexport function getModifierClasses(\n classes: ReturnType<typeof useStyles>,\n modifiers: ChunkModifiers,\n) {\n const classNames = new Array<string>();\n if (modifiers.bold) {\n classNames.push(classes.modifierBold);\n }\n if (modifiers.italic) {\n classNames.push(classes.modifierItalic);\n }\n if (modifiers.underline) {\n classNames.push(classes.modifierUnderline);\n }\n if (modifiers.foreground) {\n const key = `modifierForeground${startCase(\n modifiers.foreground,\n )}` as keyof typeof classes;\n classNames.push(classes[key]);\n }\n if (modifiers.background) {\n const key = `modifierBackground${startCase(\n modifiers.background,\n )}` as keyof typeof classes;\n classNames.push(classes[key]);\n }\n return classNames.length > 0 ? classNames.join(' ') : undefined;\n}\n\nexport function findSearchResults(text: string, searchText: string) {\n if (!searchText || !text.includes(searchText)) {\n return undefined;\n }\n const searchResults = new Array<{ start: number; end: number }>();\n let offset = 0;\n for (;;) {\n const start = text.indexOf(searchText, offset);\n if (start === -1) {\n break;\n }\n const end = start + searchText.length;\n searchResults.push({ start, end });\n offset = end;\n }\n return searchResults;\n}\n\nexport interface HighlightAnsiChunk extends AnsiChunk {\n highlight?: number;\n}\n\nexport function calculateHighlightedChunks(\n line: AnsiLine,\n searchText: string,\n): HighlightAnsiChunk[] {\n const results = findSearchResults(line.text, searchText);\n if (!results) {\n return line.chunks;\n }\n\n const chunks = new Array<HighlightAnsiChunk>();\n\n let lineOffset = 0;\n let resultIndex = 0;\n let result = results[resultIndex];\n for (const chunk of line.chunks) {\n const { text, modifiers } = chunk;\n if (!result || lineOffset + text.length < result.start) {\n chunks.push(chunk);\n lineOffset += text.length;\n continue;\n }\n\n let localOffset = 0;\n while (result) {\n const localStart = Math.max(result.start - lineOffset, 0);\n if (localStart > text.length) {\n break; // The next result is not in this chunk\n }\n\n const localEnd = Math.min(result.end - lineOffset, text.length);\n\n const hasTextBeforeResult = localStart > localOffset;\n if (hasTextBeforeResult) {\n chunks.push({ text: text.slice(localOffset, localStart), modifiers });\n }\n const hasResultText = localEnd > localStart;\n if (hasResultText) {\n chunks.push({\n modifiers,\n highlight: resultIndex,\n text: text.slice(localStart, localEnd),\n });\n }\n\n localOffset = localEnd;\n\n const foundCompleteResult = result.end - lineOffset === localEnd;\n if (foundCompleteResult) {\n resultIndex += 1;\n result = results[resultIndex];\n } else {\n break; // The rest of the result is in the following chunks\n }\n }\n\n const hasTextAfterResult = localOffset < text.length;\n if (hasTextAfterResult) {\n chunks.push({ text: text.slice(localOffset), modifiers });\n }\n\n lineOffset += text.length;\n }\n\n return chunks;\n}\n\nexport interface LogLineProps {\n line: AnsiLine;\n classes: ReturnType<typeof useStyles>;\n searchText: string;\n highlightResultIndex?: number;\n}\n\nexport function LogLine({\n line,\n classes,\n searchText,\n highlightResultIndex,\n}: LogLineProps) {\n const chunks = useMemo(\n () => calculateHighlightedChunks(line, searchText),\n [line, searchText],\n );\n\n const elements = useMemo(\n () =>\n chunks.map(({ text, modifiers, highlight }, index) => (\n <span\n key={index}\n className={classnames(\n getModifierClasses(classes, modifiers),\n highlight !== undefined &&\n (highlight === highlightResultIndex\n ? classes.textSelectedHighlight\n : classes.textHighlight),\n )}\n >\n {text}\n </span>\n )),\n [chunks, highlightResultIndex, classes],\n );\n\n return <>{elements}</>;\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 IconButton from '@material-ui/core/IconButton';\nimport TextField from '@material-ui/core/TextField';\nimport Typography from '@material-ui/core/Typography';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport { LogViewerSearch } from './useLogViewerSearch';\n\nexport interface LogViewerControlsProps extends LogViewerSearch {}\n\nexport function LogViewerControls(props: LogViewerControlsProps) {\n const { resultCount, resultIndexStep, toggleShouldFilter } = props;\n const resultIndex = props.resultIndex ?? 0;\n\n const handleKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter') {\n if (event.metaKey || event.ctrlKey || event.altKey) {\n toggleShouldFilter();\n } else {\n resultIndexStep(event.shiftKey);\n }\n }\n };\n\n return (\n <>\n {resultCount !== undefined && (\n <>\n <IconButton size=\"small\" onClick={() => resultIndexStep(true)}>\n <ChevronLeftIcon />\n </IconButton>\n <Typography>\n {Math.min(resultIndex + 1, resultCount)}/{resultCount}\n </Typography>\n <IconButton size=\"small\" onClick={() => resultIndexStep()}>\n <ChevronRightIcon />\n </IconButton>\n </>\n )}\n <TextField\n size=\"small\"\n variant=\"standard\"\n placeholder=\"Search\"\n value={props.searchInput}\n onKeyPress={handleKeyPress}\n onChange={e => props.setSearchInput(e.target.value)}\n />\n <IconButton size=\"small\" onClick={toggleShouldFilter}>\n {props.shouldFilter ? (\n <FilterListIcon color=\"primary\" />\n ) : (\n <FilterListIcon color=\"disabled\" />\n )}\n </IconButton>\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 { useMemo, useState } from 'react';\nimport { useToggle } from '@react-hookz/web';\nimport { AnsiLine } from './AnsiProcessor';\n\nexport function applySearchFilter(lines: AnsiLine[], searchText: string) {\n if (!searchText) {\n return { lines };\n }\n\n const matchingLines = [];\n const searchResults = [];\n for (const line of lines) {\n if (line.text.includes(searchText)) {\n matchingLines.push(line);\n\n let offset = 0;\n let lineResultIndex = 0;\n for (;;) {\n const start = line.text.indexOf(searchText, offset);\n if (start === -1) {\n break;\n }\n searchResults.push({\n lineNumber: line.lineNumber,\n lineIndex: lineResultIndex++,\n });\n offset = start + searchText.length;\n }\n }\n }\n\n return {\n lines: matchingLines,\n results: searchResults,\n };\n}\n\nexport interface LogViewerSearch {\n lines: AnsiLine[];\n\n searchText: string;\n searchInput: string;\n setSearchInput: (searchInput: string) => void;\n\n shouldFilter: boolean;\n toggleShouldFilter: () => void;\n\n resultCount: number | undefined;\n resultIndex: number | undefined;\n resultIndexStep: (decrement?: boolean) => void;\n\n resultLine: number | undefined;\n resultLineIndex: number | undefined;\n}\n\nexport function useLogViewerSearch(lines: AnsiLine[]): LogViewerSearch {\n const [searchInput, setSearchInput] = useState('');\n const searchText = searchInput.toLocaleLowerCase('en-US');\n\n const [resultIndex, setResultIndex] = useState<number>(0);\n\n const [shouldFilter, toggleShouldFilter] = useToggle(false);\n\n const filter = useMemo(\n () => applySearchFilter(lines, searchText),\n [lines, searchText],\n );\n\n const searchResult = filter.results\n ? filter.results[Math.min(resultIndex, filter.results.length - 1)]\n : undefined;\n const resultCount = filter.results?.length;\n\n const resultIndexStep = (decrement?: boolean) => {\n if (decrement) {\n if (resultCount !== undefined) {\n const next = Math.min(resultIndex - 1, resultCount - 2);\n setResultIndex(next < 0 ? resultCount - 1 : next);\n }\n } else {\n if (resultCount !== undefined) {\n const next = resultIndex + 1;\n setResultIndex(next >= resultCount ? 0 : next);\n }\n }\n };\n\n return {\n lines: shouldFilter ? filter.lines : lines,\n searchText,\n searchInput,\n setSearchInput,\n shouldFilter,\n toggleShouldFilter,\n resultCount,\n resultIndex,\n resultIndexStep,\n resultLine: searchResult?.lineNumber,\n resultLineIndex: searchResult?.lineIndex,\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 { errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useEffect, useState } from 'react';\nimport useCopyToClipboard from 'react-use/lib/useCopyToClipboard';\nimport { AnsiLine } from './AnsiProcessor';\n\nexport function useLogViewerSelection(lines: AnsiLine[]) {\n const errorApi = useApi(errorApiRef);\n const [sel, setSelection] = useState<{ start: number; end: number }>();\n const start = sel ? Math.min(sel.start, sel.end) : undefined;\n const end = sel ? Math.max(sel.start, sel.end) : undefined;\n\n const [{ error }, copyToClipboard] = useCopyToClipboard();\n\n useEffect(() => {\n if (error) {\n errorApi.post(error);\n }\n }, [error, errorApi]);\n\n return {\n shouldShowButton(line: number) {\n return start === line || end === line;\n },\n isSelected(line: number) {\n if (!sel) {\n return false;\n }\n return start! <= line && line <= end!;\n },\n setSelection(line: number, add: boolean) {\n if (add) {\n setSelection(s =>\n s ? { start: s.start, end: line } : { start: line, end: line },\n );\n } else {\n setSelection(s =>\n s?.start === line && s?.end === line\n ? undefined\n : { start: line, end: line },\n );\n }\n },\n copySelection() {\n if (sel) {\n const copyText = lines\n .slice(Math.min(sel.start, sel.end) - 1, Math.max(sel.start, sel.end))\n .map(l => l.chunks.map(c => c.text).join(''))\n .join('\\n');\n copyToClipboard(copyText);\n setSelection(undefined);\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, { useEffect, useMemo, useRef } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport IconButton from '@material-ui/core/IconButton';\nimport CopyIcon from '@material-ui/icons/FileCopy';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { FixedSizeList } from 'react-window';\nimport { AnsiProcessor } from './AnsiProcessor';\nimport { HEADER_SIZE, useStyles } from './styles';\nimport classnames from 'classnames';\nimport { LogLine } from './LogLine';\nimport { LogViewerControls } from './LogViewerControls';\nimport { useLogViewerSearch } from './useLogViewerSearch';\nimport { useLogViewerSelection } from './useLogViewerSelection';\n\nexport interface RealLogViewerProps {\n text: string;\n classes?: { root?: string };\n}\n\nexport function RealLogViewer(props: RealLogViewerProps) {\n const classes = useStyles({ classes: props.classes });\n const listRef = useRef<FixedSizeList | null>(null);\n\n // The processor keeps state that optimizes appending to the text\n const processor = useMemo(() => new AnsiProcessor(), []);\n const lines = processor.process(props.text);\n\n const search = useLogViewerSearch(lines);\n const selection = useLogViewerSelection(lines);\n const location = useLocation();\n\n useEffect(() => {\n if (search.resultLine !== undefined && listRef.current) {\n listRef.current.scrollToItem(search.resultLine - 1, 'center');\n }\n }, [search.resultLine]);\n\n useEffect(() => {\n if (location.hash) {\n // #line-6 -> 6\n const line = parseInt(location.hash.replace(/\\D/g, ''), 10);\n selection.setSelection(line, false);\n }\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleSelectLine = (\n line: number,\n event: { shiftKey: boolean; preventDefault: () => void },\n ) => {\n selection.setSelection(line, event.shiftKey);\n };\n\n return (\n <AutoSizer>\n {({ height, width }) => (\n <div style={{ width, height }} className={classes.root}>\n <div className={classes.header}>\n <LogViewerControls {...search} />\n </div>\n <FixedSizeList\n ref={listRef}\n className={classes.log}\n height={height - HEADER_SIZE}\n width={width}\n itemData={search.lines}\n itemSize={20}\n itemCount={search.lines.length}\n >\n {({ index, style, data }) => {\n const line = data[index];\n const { lineNumber } = line;\n return (\n <div\n style={{ ...style }}\n className={classnames(classes.line, {\n [classes.lineSelected]: selection.isSelected(lineNumber),\n })}\n >\n {selection.shouldShowButton(lineNumber) && (\n <IconButton\n data-testid=\"copy-button\"\n size=\"small\"\n className={classes.lineCopyButton}\n onClick={() => selection.copySelection()}\n >\n <CopyIcon fontSize=\"inherit\" />\n </IconButton>\n )}\n <a\n role=\"row\"\n target=\"_self\"\n href={`#line-${lineNumber}`}\n className={classes.lineNumber}\n onClick={event => handleSelectLine(lineNumber, event)}\n onKeyPress={event => handleSelectLine(lineNumber, event)}\n >\n {lineNumber}\n </a>\n <LogLine\n line={line}\n classes={classes}\n searchText={search.searchText}\n highlightResultIndex={\n search.resultLine === lineNumber\n ? search.resultLineIndex\n : undefined\n }\n />\n </div>\n );\n }}\n </FixedSizeList>\n </div>\n )}\n </AutoSizer>\n );\n}\n"],"names":["chunks","classnames","ChevronRightIcon","FilterListIcon"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -97,7 +97,7 @@ declare type ButtonProps = ButtonProps$1 & Omit<LinkProps, 'variant' | 'color'>;
97
97
  * @public
98
98
  * @remarks
99
99
  *
100
- * Makes the Button to utilise react-router
100
+ * Makes the Button to utilize react-router
101
101
  */
102
102
  declare const Button: (props: ButtonProps) => JSX.Element;
103
103
 
@@ -550,7 +550,9 @@ declare type EmptyStateClassKey = 'root' | 'action' | 'imageContainer';
550
550
  declare type Props$h = {
551
551
  title: string;
552
552
  description?: string | JSX.Element;
553
- missing: 'field' | 'info' | 'content' | 'data';
553
+ missing: 'field' | 'info' | 'content' | 'data' | {
554
+ customImage: JSX.Element;
555
+ };
554
556
  action?: JSX.Element;
555
557
  };
556
558
  /**
@@ -1710,10 +1712,10 @@ declare const LegacySidebarContext: React__default.Context<SidebarContextType>;
1710
1712
  *
1711
1713
  * @public
1712
1714
  */
1713
- declare const SidebarOpenStateProvider: ({ children, value, }: {
1715
+ declare function SidebarOpenStateProvider(props: {
1714
1716
  children: ReactNode;
1715
1717
  value: SidebarOpenState;
1716
- }) => JSX.Element;
1718
+ }): JSX.Element;
1717
1719
  /**
1718
1720
  * Hook to read and update the sidebar's open state, which controls whether or
1719
1721
  * not the sidebar is open and full-width, or closed and only displaying icons.
@@ -1725,8 +1727,8 @@ declare const useSidebarOpenState: () => SidebarOpenState;
1725
1727
  /**
1726
1728
  * Type of `SidebarPinStateContext`
1727
1729
  *
1728
- * @public @deprecated
1729
- * Use `SidebarPinState` instead.
1730
+ * @public
1731
+ * @deprecated Use `SidebarPinState` instead.
1730
1732
  */
1731
1733
  declare type SidebarPinStateContextType = {
1732
1734
  isPinned: boolean;
@@ -1767,10 +1769,10 @@ declare const LegacySidebarPinStateContext: React__default.Context<SidebarPinSta
1767
1769
  *
1768
1770
  * @public
1769
1771
  */
1770
- declare const SidebarPinStateProvider: ({ children, value, }: {
1772
+ declare function SidebarPinStateProvider(props: {
1771
1773
  children: ReactNode;
1772
1774
  value: SidebarPinStateContextType;
1773
- }) => JSX.Element;
1775
+ }): JSX.Element;
1774
1776
  /**
1775
1777
  * Hook to read and update sidebar pin state, which controls whether or not the
1776
1778
  * sidebar is pinned open.
package/dist/index.esm.js CHANGED
@@ -1027,9 +1027,9 @@ function EmptyState(props) {
1027
1027
  xs: 12,
1028
1028
  md: 6,
1029
1029
  className: classes.imageContainer
1030
- }, /* @__PURE__ */ React.createElement(EmptyStateImage, {
1030
+ }, typeof missing === "string" ? /* @__PURE__ */ React.createElement(EmptyStateImage, {
1031
1031
  missing
1032
- })));
1032
+ }) : missing.customImage));
1033
1033
  }
1034
1034
 
1035
1035
  const COMPONENT_YAML = `apiVersion: backstage.io/v1alpha1
@@ -1846,6 +1846,17 @@ const useStyles$B = makeStyles(
1846
1846
  }),
1847
1847
  { name: "BackstageMarkdownContent" }
1848
1848
  );
1849
+ const flatten = (text, child) => {
1850
+ if (!child)
1851
+ return text;
1852
+ return typeof child === "string" ? text + child : React.Children.toArray(child.props.children).reduce(flatten, text);
1853
+ };
1854
+ const headingRenderer = ({ level, children }) => {
1855
+ const childrenArray = React.Children.toArray(children);
1856
+ const text = childrenArray.reduce(flatten, "");
1857
+ const slug = text.toLocaleLowerCase("en-US").replace(/\W/g, "-");
1858
+ return React.createElement(`h${level}`, { id: slug }, children);
1859
+ };
1849
1860
  const components = {
1850
1861
  code: ({ inline, className, children, ...props }) => {
1851
1862
  const text = String(children).replace(/\n+$/, "");
@@ -1857,7 +1868,13 @@ const components = {
1857
1868
  className,
1858
1869
  ...props
1859
1870
  }, children);
1860
- }
1871
+ },
1872
+ h1: headingRenderer,
1873
+ h2: headingRenderer,
1874
+ h3: headingRenderer,
1875
+ h4: headingRenderer,
1876
+ h5: headingRenderer,
1877
+ h6: headingRenderer
1861
1878
  };
1862
1879
  function MarkdownContent(props) {
1863
1880
  const {
@@ -3340,14 +3357,14 @@ const defaultSidebarPinStateContext = {
3340
3357
  };
3341
3358
  const LegacySidebarPinStateContext = createContext(defaultSidebarPinStateContext);
3342
3359
  const VersionedSidebarPinStateContext = createVersionedContext("sidebar-pin-state-context");
3343
- const SidebarPinStateProvider = ({
3344
- children,
3345
- value
3346
- }) => /* @__PURE__ */ React.createElement(LegacySidebarPinStateContext.Provider, {
3347
- value
3348
- }, /* @__PURE__ */ React.createElement(VersionedSidebarPinStateContext.Provider, {
3349
- value: createVersionedValueMap({ 1: value })
3350
- }, children));
3360
+ function SidebarPinStateProvider(props) {
3361
+ const { children, value } = props;
3362
+ return /* @__PURE__ */ React.createElement(LegacySidebarPinStateContext.Provider, {
3363
+ value
3364
+ }, /* @__PURE__ */ React.createElement(VersionedSidebarPinStateContext.Provider, {
3365
+ value: createVersionedValueMap({ 1: value })
3366
+ }, children));
3367
+ }
3351
3368
  const useSidebarPinState = () => {
3352
3369
  const versionedPinStateContext = useContext(VersionedSidebarPinStateContext);
3353
3370
  const legacyPinStateContext = useContext(LegacySidebarPinStateContext);
@@ -3442,14 +3459,14 @@ const LegacySidebarContext = createContext(
3442
3459
  defaultSidebarOpenStateContext
3443
3460
  );
3444
3461
  const VersionedSidebarContext = createVersionedContext("sidebar-open-state-context");
3445
- const SidebarOpenStateProvider = ({
3446
- children,
3447
- value
3448
- }) => /* @__PURE__ */ React.createElement(LegacySidebarContext.Provider, {
3449
- value
3450
- }, /* @__PURE__ */ React.createElement(VersionedSidebarContext.Provider, {
3451
- value: createVersionedValueMap({ 1: value })
3452
- }, children));
3462
+ function SidebarOpenStateProvider(props) {
3463
+ const { children, value } = props;
3464
+ return /* @__PURE__ */ React.createElement(LegacySidebarContext.Provider, {
3465
+ value
3466
+ }, /* @__PURE__ */ React.createElement(VersionedSidebarContext.Provider, {
3467
+ value: createVersionedValueMap({ 1: value })
3468
+ }, children));
3469
+ }
3453
3470
  const useSidebarOpenState = () => {
3454
3471
  const versionedOpenStateContext = useContext(VersionedSidebarContext);
3455
3472
  const legacyOpenStateContext = useContext(LegacySidebarContext);
@@ -4750,7 +4767,7 @@ function HeaderTabs(props) {
4750
4767
  }
4751
4768
 
4752
4769
  function useSelectedSubRoute(subRoutes) {
4753
- var _a, _b, _c;
4770
+ var _a, _b, _c, _d;
4754
4771
  const params = useParams();
4755
4772
  const routes = subRoutes.map(({ path, children }) => ({
4756
4773
  caseSensitive: false,
@@ -4761,12 +4778,16 @@ function useSelectedSubRoute(subRoutes) {
4761
4778
  (a, b) => b.path.replace(/\/\*$/, "").localeCompare(a.path.replace(/\/\*$/, ""))
4762
4779
  );
4763
4780
  const element = (_a = useRoutes(sortedRoutes)) != null ? _a : subRoutes[0].children;
4764
- const [matchedRoute] = (_b = matchRoutes(sortedRoutes, `/${params["*"]}`)) != null ? _b : [];
4781
+ let currentRoute = (_b = params["*"]) != null ? _b : "";
4782
+ if (!currentRoute.startsWith("/")) {
4783
+ currentRoute = `/${currentRoute}`;
4784
+ }
4785
+ const [matchedRoute] = (_c = matchRoutes(sortedRoutes, currentRoute)) != null ? _c : [];
4765
4786
  const foundIndex = matchedRoute ? subRoutes.findIndex((t) => `${t.path}/*` === matchedRoute.route.path) : 0;
4766
4787
  return {
4767
4788
  index: foundIndex === -1 ? 0 : foundIndex,
4768
4789
  element,
4769
- route: (_c = subRoutes[foundIndex]) != null ? _c : subRoutes[0]
4790
+ route: (_d = subRoutes[foundIndex]) != null ? _d : subRoutes[0]
4770
4791
  };
4771
4792
  }
4772
4793
  function RoutedTabs(props) {
@@ -4781,7 +4802,12 @@ function RoutedTabs(props) {
4781
4802
  })),
4782
4803
  [routes]
4783
4804
  );
4784
- const onTabChange = (tabIndex) => navigate(routes[tabIndex].path.replace(/\/\*$/, "").replace(/^\//, ""));
4805
+ const onTabChange = (tabIndex) => {
4806
+ let { path } = routes[tabIndex];
4807
+ path = path.replace(/\/\*$/, "");
4808
+ path = path.replace(/^\//, "");
4809
+ navigate(path);
4810
+ };
4785
4811
  return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(HeaderTabs, {
4786
4812
  tabs: headerTabs,
4787
4813
  selectedIndex: index,