diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md
new file mode 100644
index 0000000000..5ab3682508
--- /dev/null
+++ b/packages/core-components/api-report.md
@@ -0,0 +1,581 @@
+## API Report File for "@backstage/core-components"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+
+///
+
+import { ApiRef } from '@backstage/core-plugin-api';
+import { BackstageIdentityApi } from '@backstage/core-plugin-api';
+import { Breadcrumbs as Breadcrumbs_2 } from '@material-ui/core';
+import { ButtonProps } from '@material-ui/core';
+import { ButtonTypeMap } from '@material-ui/core';
+import { CardHeaderProps } from '@material-ui/core';
+import { Column } from 'material-table';
+import { CommonProps } from '@material-ui/core/OverridableComponent';
+import { ComponentClass } from 'react';
+import { ComponentProps } from 'react';
+import { ComponentType } from 'react';
+import { Context } from 'react';
+import { default as CSS_2 } from 'csstype';
+import { CSSProperties } from 'react';
+import { default as dagre_2 } from 'dagre';
+import { ElementType } from 'react';
+import { ErrorInfo } from 'react';
+import { IconComponent } from '@backstage/core-plugin-api';
+import { LinearProgressProps } from '@material-ui/core';
+import { LinkProps as LinkProps_2 } from '@material-ui/core';
+import { LinkProps as LinkProps_3 } from 'react-router-dom';
+import { MaterialTableProps } from 'material-table';
+import { NavLinkProps } from 'react-router-dom';
+import { ProfileInfoApi } from '@backstage/core-plugin-api';
+import { PropsWithChildren } from 'react';
+import PropTypes from 'prop-types';
+import { default as React_2 } from 'react';
+import * as React_3 from 'react';
+import { ReactElement } from 'react';
+import { ReactNode } from 'react';
+import { SessionApi } from '@backstage/core-plugin-api';
+import { SignInPageProps } from '@backstage/core-plugin-api';
+import { SparklinesLineProps } from 'react-sparklines';
+import { SparklinesProps } from 'react-sparklines';
+import { StyledComponentProps } from '@material-ui/core';
+import { StyleRules } from '@material-ui/styles';
+import { TabProps } from '@material-ui/core';
+import { TextTruncateProps } from 'react-text-truncate';
+import { Theme } from '@material-ui/core';
+import { TooltipProps } from '@material-ui/core';
+import { WithStyles } from '@material-ui/core';
+
+// @public (undocumented)
+export const AlertDisplay: () => JSX.Element | null;
+
+// @public (undocumented)
+enum Alignment {
+ // (undocumented)
+ DOWN_LEFT = "DL",
+ // (undocumented)
+ DOWN_RIGHT = "DR",
+ // (undocumented)
+ UP_LEFT = "UL",
+ // (undocumented)
+ UP_RIGHT = "UR"
+}
+
+// @public (undocumented)
+export const Avatar: ({ displayName, picture, customStyles }: AvatarProps) => JSX.Element;
+
+// @public (undocumented)
+export const Breadcrumbs: ({ children, ...props }: Props_25) => JSX.Element;
+
+// @public (undocumented)
+export const BrokenImageIcon: IconComponent;
+
+// @public
+export const Button: React_2.ForwardRefExoticComponent>> & React_2.RefAttributes>;
+
+// @public (undocumented)
+export const CardTab: ({ children, ...props }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const CatalogIcon: IconComponent;
+
+// @public (undocumented)
+export const ChatIcon: IconComponent;
+
+// @public (undocumented)
+export const CodeSnippet: ({ text, language, showLineNumbers, showCopyCodeButton, highlightedNumbers, customStyle, }: Props_2) => JSX.Element;
+
+// @public (undocumented)
+export const Content: ({ className, stretch, noPadding, children, ...props }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const ContentHeader: ({ description, title, titleComponent: TitleComponent, children, textAlign, }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const CopyTextButton: {
+ (props: Props_3): JSX.Element;
+ propTypes: {
+ text: PropTypes.Validator;
+ tooltipDelay: PropTypes.Requireable;
+ tooltipText: PropTypes.Requireable;
+ };
+};
+
+// @public (undocumented)
+export const DashboardIcon: IconComponent;
+
+// @public (undocumented)
+type DependencyEdge = T & {
+ from: string;
+ to: string;
+ label?: string;
+};
+
+// @public (undocumented)
+export function DependencyGraph({ edges, nodes, renderNode, direction, align, nodeMargin, edgeMargin, rankMargin, paddingX, paddingY, acyclicer, ranker, labelPosition, labelOffset, edgeRanks, edgeWeight, renderLabel, defs, ...svgProps }: DependencyGraphProps): JSX.Element;
+
+declare namespace DependencyGraphTypes {
+ export {
+ DependencyEdge,
+ GraphEdge,
+ RenderLabelProps,
+ RenderLabelFunction,
+ DependencyNode,
+ GraphNode,
+ RenderNodeProps,
+ RenderNodeFunction,
+ EdgeProperties,
+ Direction,
+ Alignment,
+ Ranker,
+ LabelPosition
+ }
+}
+export { DependencyGraphTypes }
+
+// @public (undocumented)
+type DependencyNode = T & {
+ id: string;
+};
+
+// @public (undocumented)
+enum Direction {
+ // (undocumented)
+ BOTTOM_TOP = "BT",
+ // (undocumented)
+ LEFT_RIGHT = "LR",
+ // (undocumented)
+ RIGHT_LEFT = "RL",
+ // (undocumented)
+ TOP_BOTTOM = "TB"
+}
+
+// @public (undocumented)
+export const DismissableBanner: ({ variant, message, id, fixed, }: Props_4) => JSX.Element;
+
+// @public (undocumented)
+export const DocsIcon: IconComponent;
+
+// @public (undocumented)
+type EdgeProperties = {
+ label?: string;
+ width?: number;
+ height?: number;
+ labeloffset?: number;
+ labelpos?: LabelPosition;
+ minlen?: number;
+ weight?: number;
+ [customKey: string]: any;
+};
+
+// @public (undocumented)
+export const EmailIcon: IconComponent;
+
+// @public (undocumented)
+export const EmptyState: ({ title, description, missing, action }: Props_5) => JSX.Element;
+
+// @public (undocumented)
+export const ErrorBoundary: ComponentClass;
+
+// @public (undocumented)
+export type ErrorBoundaryProps = {
+ slackChannel?: string | SlackChannel;
+ onError?: (error: Error, errorInfo: string) => null;
+};
+
+// @public (undocumented)
+export const ErrorPage: ({ status, statusMessage, additionalInfo, }: IErrorPageProps) => JSX.Element;
+
+// @public
+export const ErrorPanel: ({ title, error, defaultExpanded, children, }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export type ErrorPanelProps = {
+ error: Error;
+ defaultExpanded?: boolean;
+ title?: string;
+};
+
+// @public (undocumented)
+export const FeatureCalloutCircular: ({ featureId, title, description, children, }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const Gauge: (props: Props_14) => JSX.Element;
+
+// @public (undocumented)
+export const GaugeCard: (props: Props_13) => JSX.Element;
+
+// @public (undocumented)
+export const GitHubIcon: IconComponent;
+
+// @public (undocumented)
+type GraphEdge = DependencyEdge & dagre_2.GraphEdge & EdgeProperties;
+
+// @public (undocumented)
+type GraphNode = dagre_2.Node>;
+
+// @public (undocumented)
+export const GroupIcon: IconComponent;
+
+// @public (undocumented)
+export const Header: ({ children, pageTitleOverride, style, subtitle, title, tooltip, type, typeLink, }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const HeaderIconLinkRow: ({ links }: Props_8) => JSX.Element;
+
+// @public (undocumented)
+export const HeaderLabel: ({ label, value, url }: HeaderLabelProps) => JSX.Element;
+
+// @public (undocumented)
+export const HeaderTabs: ({ tabs, onChange, selectedIndex, }: HeaderTabsProps) => JSX.Element;
+
+// @public (undocumented)
+export const HelpIcon: IconComponent;
+
+// @public (undocumented)
+export const HomepageTimer: () => JSX.Element | null;
+
+// @public (undocumented)
+export const HorizontalScrollGrid: (props: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export type IconLinkVerticalProps = {
+ color?: 'primary' | 'secondary';
+ disabled?: boolean;
+ href?: string;
+ icon?: React_2.ReactNode;
+ label: string;
+ onClick?: React_2.MouseEventHandler;
+ title?: string;
+};
+
+// @public (undocumented)
+export const InfoCard: ({ title, subheader, divider, deepLink, slackChannel, errorBoundaryProps, variant, children, headerStyle, headerProps, action, actionsClassName, actions, cardClassName, actionsTopRight, className, noPadding, titleTypographyProps, }: Props_20) => JSX.Element;
+
+// @public (undocumented)
+export type InfoCardVariants = 'flex' | 'fullHeight' | 'gridItem';
+
+// @public (undocumented)
+export const IntroCard: (props: IntroCardProps) => JSX.Element;
+
+// @public @deprecated
+export const ItemCard: ({ description, tags, title, type, subtitle, label, onClick, href, }: ItemCardProps) => JSX.Element;
+
+// @public
+export const ItemCardGrid: (props: ItemCardGridProps) => JSX.Element;
+
+// @public (undocumented)
+export type ItemCardGridProps = Partial> & {
+ children?: React_2.ReactNode;
+};
+
+// @public
+export const ItemCardHeader: (props: ItemCardHeaderProps) => JSX.Element;
+
+// @public (undocumented)
+export type ItemCardHeaderProps = Partial> & {
+ title?: React_2.ReactNode;
+ subtitle?: React_2.ReactNode;
+ children?: React_2.ReactNode;
+};
+
+// @public (undocumented)
+enum LabelPosition {
+ // (undocumented)
+ CENTER = "c",
+ // (undocumented)
+ LEFT = "l",
+ // (undocumented)
+ RIGHT = "r"
+}
+
+// @public (undocumented)
+export const Lifecycle: (props: Props_10) => JSX.Element;
+
+// @public (undocumented)
+export const LinearGauge: ({ value }: Props_15) => JSX.Element | null;
+
+// @public
+export const Link: React_2.ForwardRefExoticComponent & React_2.RefAttributes>;
+
+// @public (undocumented)
+export type LinkProps = LinkProps_2 & LinkProps_3 & {
+ component?: ElementType;
+};
+
+// @public
+export const MarkdownContent: ({ content, dialect }: Props_11) => JSX.Element;
+
+// @public (undocumented)
+export const MissingAnnotationEmptyState: ({ annotation }: Props_6) => JSX.Element;
+
+// @public (undocumented)
+export const OAuthRequestDialog: () => JSX.Element;
+
+// @public (undocumented)
+export const OverflowTooltip: (props: Props_12) => JSX.Element;
+
+// @public (undocumented)
+export const Page: ({ themeId, children }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const Progress: (props: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+enum Ranker {
+ // (undocumented)
+ LONGEST_PATH = "longest-path",
+ // (undocumented)
+ NETWORK_SIMPLEX = "network-simplex",
+ // (undocumented)
+ TIGHT_TREE = "tight-tree"
+}
+
+// @public (undocumented)
+type RenderLabelFunction = (props: RenderLabelProps) => React.ReactNode;
+
+// @public (undocumented)
+type RenderLabelProps = {
+ edge: DependencyEdge;
+};
+
+// @public (undocumented)
+type RenderNodeFunction = (props: RenderNodeProps) => React.ReactNode;
+
+// @public (undocumented)
+type RenderNodeProps = {
+ node: DependencyNode;
+};
+
+// @public
+export const ResponseErrorPanel: ({ title, error, defaultExpanded, }: ErrorPanelProps) => JSX.Element;
+
+// @public (undocumented)
+export const RoutedTabs: ({ routes }: {
+ routes: SubRoute_2[];
+}) => JSX.Element;
+
+// @public (undocumented)
+export const Select: ({ multiple, items, label, placeholder, selected, onChange, triggerReset, }: SelectProps) => JSX.Element;
+
+// @public (undocumented)
+export const Sidebar: ({ openDelayMs, closeDelayMs, children, }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const SIDEBAR_INTRO_LOCAL_STORAGE = "@backstage/core/sidebar-intro-dismissed";
+
+// @public (undocumented)
+export const sidebarConfig: {
+ drawerWidthClosed: number;
+ drawerWidthOpen: number;
+ defaultOpenDelayMs: number;
+ defaultCloseDelayMs: number;
+ defaultFadeDuration: number;
+ logoHeight: number;
+ iconContainerWidth: number;
+ iconSize: number;
+ iconPadding: number;
+ selectedIndicatorWidth: number;
+ userBadgePadding: number;
+ userBadgeDiameter: number;
+};
+
+// @public (undocumented)
+export const SidebarContext: Context;
+
+// @public (undocumented)
+export type SidebarContextType = {
+ isOpen: boolean;
+};
+
+// @public (undocumented)
+export const SidebarDivider: React_2.ComponentType, HTMLHRElement>, "children" | "slot" | "style" | "title" | "id" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | keyof React_2.ClassAttributes> & StyledComponentProps<"root"> & {
+ className?: string | undefined;
+}>;
+
+// @public (undocumented)
+export const SidebarIntro: () => JSX.Element | null;
+
+// @public (undocumented)
+export const SidebarItem: React_2.ForwardRefExoticComponent>;
+
+// @public (undocumented)
+export const SidebarPage: (props: PropsWithChildren<{}>) => JSX.Element;
+
+// @public (undocumented)
+export const SidebarPinStateContext: React_2.Context;
+
+// @public (undocumented)
+export type SidebarPinStateContextType = {
+ isPinned: boolean;
+ toggleSidebarPinState: () => any;
+};
+
+// @public (undocumented)
+export const SidebarScrollWrapper: React_2.ComponentType, HTMLDivElement>, "children" | "slot" | "style" | "title" | "id" | keyof React_2.ClassAttributes | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture"> & StyledComponentProps<"root"> & {
+ className?: string | undefined;
+}>;
+
+// @public (undocumented)
+export const SidebarSearchField: (props: SidebarSearchFieldProps) => JSX.Element;
+
+// @public (undocumented)
+export const SidebarSpace: React_2.ComponentType, HTMLDivElement>, "children" | "slot" | "style" | "title" | "id" | keyof React_2.ClassAttributes | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture"> & StyledComponentProps<"root"> & {
+ className?: string | undefined;
+}>;
+
+// @public (undocumented)
+export const SidebarSpacer: React_2.ComponentType, HTMLDivElement>, "children" | "slot" | "style" | "title" | "id" | keyof React_2.ClassAttributes | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "lang" | "placeholder" | "spellCheck" | "tabIndex" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture"> & StyledComponentProps<"root"> & {
+ className?: string | undefined;
+}>;
+
+// @public (undocumented)
+export const SignInPage: (props: Props_23) => JSX.Element;
+
+// @public (undocumented)
+export type SignInProviderConfig = {
+ id: string;
+ title: string;
+ message: string;
+ apiRef: ApiRef;
+};
+
+// @public (undocumented)
+export const SimpleStepper: ({ children, elevated, onStepChange, activeStep, }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const SimpleStepperStep: ({ title, children, end, actions, ...muiProps }: PropsWithChildren) => JSX.Element;
+
+// @public (undocumented)
+export const StatusAborted: (props: PropsWithChildren<{}>) => JSX.Element;
+
+// @public (undocumented)
+export const StatusError: (props: PropsWithChildren<{}>) => JSX.Element;
+
+// @public (undocumented)
+export const StatusOK: (props: PropsWithChildren<{}>) => JSX.Element;
+
+// @public (undocumented)
+export const StatusPending: (props: PropsWithChildren<{}>) => JSX.Element;
+
+// @public (undocumented)
+export const StatusRunning: (props: PropsWithChildren<{}>) => JSX.Element;
+
+// @public (undocumented)
+export const StatusWarning: (props: PropsWithChildren<{}>) => JSX.Element;
+
+// @public (undocumented)
+export const StructuredMetadataTable: ({ metadata, dense, options, }: Props_16) => JSX.Element;
+
+// @public (undocumented)
+export const SubvalueCell: ({ value, subvalue }: SubvalueCellProps) => JSX.Element;
+
+// @public (undocumented)
+export const SupportButton: ({ title, children }: SupportButtonProps) => JSX.Element;
+
+// @public (undocumented)
+export type SupportConfig = {
+ url: string;
+ items: SupportItem[];
+};
+
+// @public (undocumented)
+export type SupportItem = {
+ title: string;
+ icon?: string;
+ links: SupportItemLink[];
+};
+
+// @public (undocumented)
+export type SupportItemLink = {
+ url: string;
+ title: string;
+};
+
+// @public (undocumented)
+export type Tab = {
+ id: string;
+ label: string;
+ tabProps?: TabProps;
+};
+
+// @public (undocumented)
+export const TabbedCard: ({ slackChannel, errorBoundaryProps, children, title, deepLink, value, onChange, }: PropsWithChildren) => JSX.Element;
+
+// @public
+export const TabbedLayout: {
+ ({ children }: PropsWithChildren<{}>): JSX.Element;
+ Route: (props: SubRoute) => null;
+};
+
+// @public (undocumented)
+export function Table({ columns, options, title, subtitle, filters, initialState, emptyContent, onStateChange, ...props }: TableProps): JSX.Element;
+
+// @public (undocumented)
+export interface TableColumn extends Column {
+ // (undocumented)
+ highlight?: boolean;
+ // (undocumented)
+ width?: string;
+}
+
+// @public (undocumented)
+export type TableFilter = {
+ column: string;
+ type: 'select' | 'multiple-select' | 'checkbox-tree';
+};
+
+// @public (undocumented)
+export interface TableProps extends MaterialTableProps {
+ // (undocumented)
+ columns: TableColumn[];
+ // (undocumented)
+ emptyContent?: ReactNode;
+ // (undocumented)
+ filters?: TableFilter[];
+ // (undocumented)
+ initialState?: TableState;
+ // (undocumented)
+ onStateChange?: (state: TableState) => any;
+ // (undocumented)
+ subtitle?: string;
+}
+
+// @public (undocumented)
+export type TableState = {
+ search?: string;
+ filtersOpen?: boolean;
+ filters?: SelectedFilters;
+};
+
+// @public (undocumented)
+export const Tabs: ({ tabs }: TabsProps) => JSX.Element;
+
+// @public (undocumented)
+export const TrendLine: (props: SparklinesProps & Pick & {
+ title?: string;
+}) => JSX.Element | null;
+
+// @public (undocumented)
+export function useQueryParamState(stateName: string,
+debounceTime?: number): [T | undefined, SetQueryParams];
+
+// @public (undocumented)
+export const UserIcon: IconComponent;
+
+// @public (undocumented)
+export function useSupportConfig(): SupportConfig;
+
+// @public (undocumented)
+export const WarningIcon: IconComponent;
+
+// @public
+export const WarningPanel: (props: Props_17) => JSX.Element;
+
+// (No @packageDocumentation comment for this package)
+
+```
diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md
new file mode 100644
index 0000000000..a2c7e0b3a7
--- /dev/null
+++ b/plugins/catalog-backend/api-report.md
@@ -0,0 +1,671 @@
+## API Report File for "@backstage/plugin-catalog-backend"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+
+///
+
+import { Account } from 'aws-sdk/clients/organizations';
+import { BitbucketIntegration } from '@backstage/integration';
+import { Config } from '@backstage/config';
+import { DocumentCollator } from '@backstage/search-common';
+import { Entity } from '@backstage/catalog-model';
+import { EntityName } from '@backstage/catalog-model';
+import { EntityPolicy } from '@backstage/catalog-model';
+import { EntityRelationSpec } from '@backstage/catalog-model';
+import express from 'express';
+import { IndexableDocument } from '@backstage/search-common';
+import { JsonObject } from '@backstage/config';
+import { JsonValue } from '@backstage/config';
+import { Knex } from 'knex';
+import { Location as Location_2 } from '@backstage/catalog-model';
+import { LocationSpec } from '@backstage/catalog-model';
+import { Logger as Logger_2 } from 'winston';
+import { Organizations } from 'aws-sdk';
+import { PluginDatabaseManager } from '@backstage/backend-common';
+import { PluginEndpointDiscovery } from '@backstage/backend-common';
+import { ResourceEntityV1alpha1 } from '@backstage/catalog-model';
+import { ScmIntegrationRegistry } from '@backstage/integration';
+import { ScmIntegrations } from '@backstage/integration';
+import { UrlReader } from '@backstage/backend-common';
+import { Validators } from '@backstage/catalog-model';
+
+// @public (undocumented)
+export type AddLocationResult = {
+ location: Location_2;
+ entities: Entity[];
+};
+
+// @public (undocumented)
+export type AnalyzeLocationRequest = {
+ location: LocationSpec;
+};
+
+// @public (undocumented)
+export type AnalyzeLocationResponse = {
+ existingEntityFiles: AnalyzeLocationExistingEntity[];
+ generateEntities: AnalyzeLocationGenerateEntity[];
+};
+
+// @public (undocumented)
+export class AnnotateLocationEntityProcessor implements CatalogProcessor {
+ constructor(options: Options_2);
+ // (undocumented)
+ preProcessEntity(entity: Entity, location: LocationSpec, _: CatalogProcessorEmit, originLocation: LocationSpec): Promise;
+}
+
+// @public (undocumented)
+export class AnnotateScmSlugEntityProcessor implements CatalogProcessor {
+ constructor(opts: {
+ scmIntegrationRegistry: ScmIntegrationRegistry;
+ });
+ // (undocumented)
+ static fromConfig(config: Config): AnnotateScmSlugEntityProcessor;
+ // (undocumented)
+ preProcessEntity(entity: Entity, location: LocationSpec): Promise;
+}
+
+// @public
+export class AwsOrganizationCloudAccountProcessor implements CatalogProcessor {
+ constructor(options: {
+ provider: AwsOrganizationProviderConfig;
+ logger: Logger_2;
+ });
+ // (undocumented)
+ extractInformationFromArn(arn: string): {
+ accountId: string;
+ organizationId: string;
+ };
+ // (undocumented)
+ static fromConfig(config: Config, options: {
+ logger: Logger_2;
+ }): AwsOrganizationCloudAccountProcessor;
+ // (undocumented)
+ getAwsAccounts(): Promise;
+ // (undocumented)
+ logger: Logger_2;
+ // (undocumented)
+ mapAccountToComponent(account: Account): ResourceEntityV1alpha1;
+ // (undocumented)
+ normalizeName(name: string): string;
+ // (undocumented)
+ organizations: Organizations;
+ // (undocumented)
+ provider: AwsOrganizationProviderConfig;
+ // (undocumented)
+ readLocation(location: LocationSpec, _optional: boolean, emit: CatalogProcessorEmit): Promise;
+}
+
+// @public (undocumented)
+export class BitbucketDiscoveryProcessor implements CatalogProcessor {
+ constructor(options: {
+ integrations: ScmIntegrationRegistry;
+ parser?: BitbucketRepositoryParser;
+ logger: Logger_2;
+ });
+ // (undocumented)
+ static fromConfig(config: Config, options: {
+ parser?: BitbucketRepositoryParser;
+ logger: Logger_2;
+ }): BitbucketDiscoveryProcessor;
+ // (undocumented)
+ readLocation(location: LocationSpec, _optional: boolean, emit: CatalogProcessorEmit): Promise;
+}
+
+// @public (undocumented)
+export type BitbucketRepositoryParser = (options: {
+ integration: BitbucketIntegration;
+ target: string;
+ logger: Logger_2;
+}) => AsyncIterable;
+
+// @public (undocumented)
+export class BuiltinKindsEntityProcessor implements CatalogProcessor {
+ // (undocumented)
+ postProcessEntity(entity: Entity, _location: LocationSpec, emit: CatalogProcessorEmit): Promise;
+ // (undocumented)
+ validateEntityKind(entity: Entity): Promise;
+}
+
+// @public
+export class CatalogBuilder {
+ constructor(env: CatalogEnvironment);
+ addEntityPolicy(...policies: EntityPolicy[]): CatalogBuilder;
+ addProcessor(...processors: CatalogProcessor[]): CatalogBuilder;
+ build(): Promise<{
+ entitiesCatalog: EntitiesCatalog;
+ locationsCatalog: LocationsCatalog;
+ higherOrderOperation: HigherOrderOperation;
+ locationAnalyzer: LocationAnalyzer;
+ }>;
+ // (undocumented)
+ static create(env: CatalogEnvironment): Promise;
+ replaceEntityPolicies(policies: EntityPolicy[]): CatalogBuilder;
+ replaceProcessors(processors: CatalogProcessor[]): CatalogBuilder;
+ setEntityDataParser(parser: CatalogProcessorParser): CatalogBuilder;
+ setFieldFormatValidators(validators: Partial): CatalogBuilder;
+ setPlaceholderResolver(key: string, resolver: PlaceholderResolver): CatalogBuilder;
+}
+
+// @public (undocumented)
+export interface CatalogEntityDocument extends IndexableDocument {
+ // (undocumented)
+ componentType: string;
+ // (undocumented)
+ kind: string;
+ // (undocumented)
+ lifecycle: string;
+ // (undocumented)
+ namespace: string;
+ // (undocumented)
+ owner: string;
+}
+
+// @public (undocumented)
+export interface CatalogProcessingOrchestrator {
+ // (undocumented)
+ process(request: EntityProcessingRequest): Promise;
+}
+
+// @public (undocumented)
+export type CatalogProcessor = {
+ readLocation?(location: LocationSpec, optional: boolean, emit: CatalogProcessorEmit, parser: CatalogProcessorParser): Promise;
+ preProcessEntity?(entity: Entity, location: LocationSpec, emit: CatalogProcessorEmit, originLocation: LocationSpec): Promise;
+ validateEntityKind?(entity: Entity): Promise;
+ postProcessEntity?(entity: Entity, location: LocationSpec, emit: CatalogProcessorEmit): Promise;
+ handleError?(error: Error, location: LocationSpec, emit: CatalogProcessorEmit): Promise;
+};
+
+// @public (undocumented)
+export type CatalogProcessorEmit = (generated: CatalogProcessorResult) => void;
+
+// @public (undocumented)
+export type CatalogProcessorEntityResult = {
+ type: 'entity';
+ entity: Entity;
+ location: LocationSpec;
+};
+
+// @public (undocumented)
+export type CatalogProcessorErrorResult = {
+ type: 'error';
+ error: Error;
+ location: LocationSpec;
+};
+
+// @public (undocumented)
+export type CatalogProcessorLocationResult = {
+ type: 'location';
+ location: LocationSpec;
+ optional: boolean;
+};
+
+// @public
+export type CatalogProcessorParser = (options: {
+ data: Buffer;
+ location: LocationSpec;
+}) => AsyncIterable;
+
+// @public (undocumented)
+export type CatalogProcessorRelationResult = {
+ type: 'relation';
+ relation: EntityRelationSpec;
+ entityRef?: string;
+};
+
+// @public (undocumented)
+export type CatalogProcessorResult = CatalogProcessorLocationResult | CatalogProcessorEntityResult | CatalogProcessorRelationResult | CatalogProcessorErrorResult;
+
+// @public (undocumented)
+export class CodeOwnersProcessor implements CatalogProcessor {
+ constructor(options: {
+ integrations: ScmIntegrations;
+ logger: Logger_2;
+ reader: UrlReader;
+ });
+ // (undocumented)
+ static fromConfig(config: Config, options: {
+ logger: Logger_2;
+ reader: UrlReader;
+ }): CodeOwnersProcessor;
+ // (undocumented)
+ preProcessEntity(entity: Entity, location: LocationSpec): Promise;
+}
+
+// @public
+export class CommonDatabase implements Database {
+ constructor(database: Knex, logger: Logger_2);
+ // (undocumented)
+ addEntities(txOpaque: Transaction, request: DbEntityRequest[]): Promise;
+ // (undocumented)
+ addLocation(txOpaque: Transaction, location: Location_2): Promise;
+ // (undocumented)
+ addLocationUpdateLogEvent(locationId: string, status: DatabaseLocationUpdateLogStatus, entityName?: string | string[], message?: string): Promise;
+ // (undocumented)
+ entities(txOpaque: Transaction, request?: DbEntitiesRequest): Promise;
+ // (undocumented)
+ entityByName(txOpaque: Transaction, name: EntityName): Promise;
+ // (undocumented)
+ entityByUid(txOpaque: Transaction, uid: string): Promise;
+ // (undocumented)
+ location(id: string): Promise;
+ // (undocumented)
+ locationHistory(id: string): Promise;
+ // (undocumented)
+ locations(): Promise;
+ // (undocumented)
+ removeEntityByUid(txOpaque: Transaction, uid: string): Promise;
+ // (undocumented)
+ removeLocation(txOpaque: Transaction, id: string): Promise;
+ // (undocumented)
+ setRelations(txOpaque: Transaction, originatingEntityId: string, relations: EntityRelationSpec[]): Promise;
+ // (undocumented)
+ transaction(fn: (tx: Transaction) => Promise): Promise;
+ // (undocumented)
+ updateEntity(txOpaque: Transaction, request: DbEntityRequest, matchingEtag?: string, matchingGeneration?: number): Promise;
+}
+
+// @public (undocumented)
+export function createNextRouter(options: RouterOptions_2): Promise;
+
+// @public (undocumented)
+export function createRouter(options: RouterOptions): Promise;
+
+// @public
+export type Database = {
+ transaction(fn: (tx: Transaction) => Promise): Promise;
+ addEntities(tx: Transaction, request: DbEntityRequest[]): Promise;
+ updateEntity(tx: Transaction, request: DbEntityRequest, matchingEtag?: string, matchingGeneration?: number): Promise;
+ entities(tx: Transaction, request?: DbEntitiesRequest): Promise;
+ entityByName(tx: Transaction, name: EntityName): Promise;
+ entityByUid(tx: Transaction, uid: string): Promise;
+ removeEntityByUid(tx: Transaction, uid: string): Promise;
+ setRelations(tx: Transaction, entityUid: string, relations: EntityRelationSpec[]): Promise;
+ addLocation(tx: Transaction, location: Location_2): Promise;
+ removeLocation(tx: Transaction, id: string): Promise;
+ location(id: string): Promise;
+ locations(): Promise;
+ locationHistory(id: string): Promise;
+ addLocationUpdateLogEvent(locationId: string, status: DatabaseLocationUpdateLogStatus, entityName?: string | string[], message?: string): Promise;
+};
+
+// @public (undocumented)
+export class DatabaseEntitiesCatalog implements EntitiesCatalog {
+ constructor(database: Database, logger: Logger_2);
+ // (undocumented)
+ batchAddOrUpdateEntities(requests: EntityUpsertRequest[], options?: {
+ locationId?: string;
+ dryRun?: boolean;
+ outputEntities?: boolean;
+ }): Promise;
+ // (undocumented)
+ entities(request?: EntitiesRequest): Promise;
+ // (undocumented)
+ removeEntityByUid(uid: string): Promise;
+}
+
+// @public (undocumented)
+export class DatabaseLocationsCatalog implements LocationsCatalog {
+ constructor(database: Database);
+ // (undocumented)
+ addLocation(location: Location_2): Promise;
+ // (undocumented)
+ location(id: string): Promise;
+ // (undocumented)
+ locationHistory(id: string): Promise;
+ // (undocumented)
+ locations(): Promise;
+ // (undocumented)
+ logUpdateFailure(locationId: string, error?: Error, entityName?: string): Promise;
+ // (undocumented)
+ logUpdateSuccess(locationId: string, entityName?: string | string[]): Promise;
+ // (undocumented)
+ removeLocation(id: string): Promise;
+}
+
+// @public (undocumented)
+export class DatabaseManager {
+ // (undocumented)
+ static createDatabase(knex: Knex, options?: Partial): Promise;
+ // (undocumented)
+ static createInMemoryDatabase(): Promise;
+ // (undocumented)
+ static createInMemoryDatabaseConnection(): Promise;
+ // (undocumented)
+ static createTestDatabase(): Promise;
+ // (undocumented)
+ static createTestDatabaseConnection(): Promise;
+}
+
+// @public (undocumented)
+export type DbEntityRequest = {
+ locationId?: string;
+ entity: Entity;
+ relations: EntityRelationSpec[];
+};
+
+// @public (undocumented)
+export type DbEntityResponse = {
+ locationId?: string;
+ entity: Entity;
+};
+
+// @public (undocumented)
+export class DefaultCatalogCollator implements DocumentCollator {
+ constructor({ discovery, locationTemplate, }: {
+ discovery: PluginEndpointDiscovery;
+ locationTemplate?: string;
+ });
+ // (undocumented)
+ protected applyArgsToFormat(format: string, args: Record): string;
+ // (undocumented)
+ protected discovery: PluginEndpointDiscovery;
+ // (undocumented)
+ execute(): Promise;
+ // (undocumented)
+ protected locationTemplate: string;
+ // (undocumented)
+ readonly type: string;
+}
+
+// @public (undocumented)
+export class DefaultCatalogProcessingOrchestrator implements CatalogProcessingOrchestrator {
+ constructor(options: {
+ processors: CatalogProcessor[];
+ integrations: ScmIntegrationRegistry;
+ logger: Logger_2;
+ parser: CatalogProcessorParser;
+ policy: EntityPolicy;
+ });
+ // (undocumented)
+ process(request: EntityProcessingRequest): Promise;
+}
+
+// @public
+export function durationText(startTimestamp: [number, number]): string;
+
+// @public (undocumented)
+export type EntitiesCatalog = {
+ entities(request?: EntitiesRequest): Promise;
+ removeEntityByUid(uid: string): Promise;
+ batchAddOrUpdateEntities(requests: EntityUpsertRequest[], options?: {
+ locationId?: string;
+ dryRun?: boolean;
+ outputEntities?: boolean;
+ }): Promise;
+};
+
+// @public
+export type EntitiesSearchFilter = {
+ key: string;
+ matchValueIn?: string[];
+};
+
+// @public (undocumented)
+function entity(atLocation: LocationSpec, newEntity: Entity): CatalogProcessorResult;
+
+// @public
+export type EntityFilter = {
+ anyOf: {
+ allOf: EntitiesSearchFilter[];
+ }[];
+};
+
+// @public
+export type EntityPagination = {
+ limit?: number;
+ offset?: number;
+ after?: string;
+};
+
+// @public (undocumented)
+export type EntityProcessingRequest = {
+ entity: Entity;
+ state: Map;
+};
+
+// @public (undocumented)
+export type EntityProcessingResult = {
+ ok: true;
+ state: Map;
+ completedEntity: Entity;
+ deferredEntities: DeferredEntity[];
+ relations: EntityRelationSpec[];
+ errors: Error[];
+} | {
+ ok: false;
+ errors: Error[];
+};
+
+// @public (undocumented)
+export class FileReaderProcessor implements CatalogProcessor {
+ // (undocumented)
+ readLocation(location: LocationSpec, optional: boolean, emit: CatalogProcessorEmit): Promise;
+}
+
+// @public (undocumented)
+function generalError(atLocation: LocationSpec, message: string): CatalogProcessorResult;
+
+// @public
+export class GithubDiscoveryProcessor implements CatalogProcessor {
+ constructor(options: {
+ integrations: ScmIntegrations;
+ logger: Logger_2;
+ });
+ // (undocumented)
+ static fromConfig(config: Config, options: {
+ logger: Logger_2;
+ }): GithubDiscoveryProcessor;
+ // (undocumented)
+ readLocation(location: LocationSpec, _optional: boolean, emit: CatalogProcessorEmit): Promise;
+}
+
+// @alpha
+export class GithubMultiOrgReaderProcessor implements CatalogProcessor {
+ constructor(options: {
+ integrations: ScmIntegrations;
+ logger: Logger_2;
+ orgs: GithubMultiOrgConfig;
+ });
+ // (undocumented)
+ static fromConfig(config: Config, options: {
+ logger: Logger_2;
+ }): GithubMultiOrgReaderProcessor;
+ // (undocumented)
+ readLocation(location: LocationSpec, _optional: boolean, emit: CatalogProcessorEmit): Promise;
+}
+
+// @public
+export class GithubOrgReaderProcessor implements CatalogProcessor {
+ constructor(options: {
+ integrations: ScmIntegrations;
+ logger: Logger_2;
+ });
+ // (undocumented)
+ static fromConfig(config: Config, options: {
+ logger: Logger_2;
+ }): GithubOrgReaderProcessor;
+ // (undocumented)
+ readLocation(location: LocationSpec, _optional: boolean, emit: CatalogProcessorEmit): Promise;
+}
+
+// @public (undocumented)
+export type HigherOrderOperation = {
+ addLocation(spec: LocationSpec, options?: {
+ dryRun?: boolean;
+ }): Promise;
+ refreshAllLocations(): Promise;
+};
+
+// @public
+export class HigherOrderOperations implements HigherOrderOperation {
+ constructor(entitiesCatalog: EntitiesCatalog, locationsCatalog: LocationsCatalog, locationReader: LocationReader, logger: Logger_2);
+ addLocation(spec: LocationSpec, options?: {
+ dryRun?: boolean;
+ }): Promise;
+ refreshAllLocations(): Promise;
+}
+
+// @public (undocumented)
+function inputError(atLocation: LocationSpec, message: string): CatalogProcessorResult;
+
+// @public (undocumented)
+function location_2(newLocation: LocationSpec, optional: boolean): CatalogProcessorResult;
+
+// @public (undocumented)
+export type LocationAnalyzer = {
+ analyzeLocation(location: AnalyzeLocationRequest): Promise;
+};
+
+// @public (undocumented)
+export class LocationEntityProcessor implements CatalogProcessor {
+ constructor(options: Options_3);
+ // (undocumented)
+ postProcessEntity(entity: Entity, location: LocationSpec, emit: CatalogProcessorEmit): Promise;
+}
+
+// @public (undocumented)
+export type LocationReader = {
+ read(location: LocationSpec): Promise;
+};
+
+// @public
+export class LocationReaders implements LocationReader {
+ constructor(options: Options);
+ // (undocumented)
+ read(location: LocationSpec): Promise;
+}
+
+// @public (undocumented)
+export type LocationsCatalog = {
+ addLocation(location: Location_2): Promise;
+ removeLocation(id: string): Promise;
+ locations(): Promise;
+ location(id: string): Promise;
+ locationHistory(id: string): Promise;
+ logUpdateSuccess(locationId: string, entityName?: string | string[]): Promise;
+ logUpdateFailure(locationId: string, error?: Error, entityName?: string): Promise;
+};
+
+// @public
+export class NextCatalogBuilder {
+ constructor(env: CatalogEnvironment_2);
+ addEntityPolicy(...policies: EntityPolicy[]): NextCatalogBuilder;
+ addEntityProvider(...providers: EntityProvider[]): NextCatalogBuilder;
+ addProcessor(...processors: CatalogProcessor[]): NextCatalogBuilder;
+ build(): Promise<{
+ entitiesCatalog: EntitiesCatalog;
+ locationsCatalog: LocationsCatalog;
+ locationAnalyzer: LocationAnalyzer;
+ processingEngine: CatalogProcessingEngine;
+ locationService: LocationService;
+ }>;
+ replaceEntityPolicies(policies: EntityPolicy[]): NextCatalogBuilder;
+ replaceProcessors(processors: CatalogProcessor[]): NextCatalogBuilder;
+ setEntityDataParser(parser: CatalogProcessorParser): NextCatalogBuilder;
+ setFieldFormatValidators(validators: Partial): NextCatalogBuilder;
+ setPlaceholderResolver(key: string, resolver: PlaceholderResolver): NextCatalogBuilder;
+ setRefreshIntervalSeconds(seconds: number): NextCatalogBuilder;
+}
+
+// @public (undocumented)
+function notFoundError(atLocation: LocationSpec, message: string): CatalogProcessorResult;
+
+// @public (undocumented)
+export function parseEntityYaml(data: Buffer, location: LocationSpec): Iterable;
+
+// @public
+export class PlaceholderProcessor implements CatalogProcessor {
+ constructor(options: Options_4);
+ // (undocumented)
+ preProcessEntity(entity: Entity, location: LocationSpec): Promise;
+}
+
+// @public (undocumented)
+export type PlaceholderResolver = (params: ResolverParams) => Promise;
+
+// @public (undocumented)
+export type ReadLocationEntity = {
+ location: LocationSpec;
+ entity: Entity;
+ relations: EntityRelationSpec[];
+};
+
+// @public (undocumented)
+export type ReadLocationError = {
+ location: LocationSpec;
+ error: Error;
+};
+
+// @public (undocumented)
+export type ReadLocationResult = {
+ entities: ReadLocationEntity[];
+ errors: ReadLocationError[];
+};
+
+// @public
+export type RecursivePartial = {
+ [P in keyof T]?: T[P] extends (infer U)[] ? RecursivePartial[] : T[P] extends object ? RecursivePartial : T[P];
+};
+
+// @public (undocumented)
+function relation(spec: EntityRelationSpec): CatalogProcessorResult;
+
+declare namespace results {
+ export {
+ notFoundError,
+ inputError,
+ generalError,
+ location_2 as location,
+ entity,
+ relation
+ }
+}
+export { results }
+
+// @public (undocumented)
+export interface RouterOptions {
+ // (undocumented)
+ config: Config;
+ // (undocumented)
+ entitiesCatalog?: EntitiesCatalog;
+ // (undocumented)
+ higherOrderOperation?: HigherOrderOperation;
+ // (undocumented)
+ locationAnalyzer?: LocationAnalyzer;
+ // (undocumented)
+ locationsCatalog?: LocationsCatalog;
+ // (undocumented)
+ locationService?: LocationService;
+ // (undocumented)
+ logger: Logger_2;
+}
+
+// @public
+export function runPeriodically(fn: () => any, delayMs: number): () => void;
+
+// @public (undocumented)
+export class StaticLocationProcessor implements StaticLocationProcessor {
+ constructor(staticLocations: LocationSpec[]);
+ // (undocumented)
+ static fromConfig(config: Config): StaticLocationProcessor;
+ // (undocumented)
+ readLocation(location: LocationSpec, _optional: boolean, emit: CatalogProcessorEmit): Promise;
+}
+
+// @public
+export type Transaction = {
+ rollback(): Promise;
+};
+
+// @public (undocumented)
+export class UrlReaderProcessor implements CatalogProcessor {
+ constructor(options: Options_5);
+ // (undocumented)
+ readLocation(location: LocationSpec, optional: boolean, emit: CatalogProcessorEmit, parser: CatalogProcessorParser): Promise;
+}
+
+// (No @packageDocumentation comment for this package)
+
+```
diff --git a/plugins/catalog-react/api-report.md b/plugins/catalog-react/api-report.md
new file mode 100644
index 0000000000..38fe62bc41
--- /dev/null
+++ b/plugins/catalog-react/api-report.md
@@ -0,0 +1,329 @@
+## API Report File for "@backstage/plugin-catalog-react"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+
+///
+
+import { ApiRef } from '@backstage/core-plugin-api';
+import { AsyncState } from 'react-use/lib/useAsync';
+import { CatalogApi } from '@backstage/catalog-client';
+import { ComponentEntity } from '@backstage/catalog-model';
+import { Context } from 'react';
+import { Entity } from '@backstage/catalog-model';
+import { EntityName } from '@backstage/catalog-model';
+import { LinkProps } from '@backstage/core-components';
+import { PropsWithChildren } from 'react';
+import { default as React_2 } from 'react';
+import { ReactNode } from 'react';
+import { RouteRef } from '@backstage/core-plugin-api';
+import { ScmIntegrationRegistry } from '@backstage/integration';
+import { SystemEntity } from '@backstage/catalog-model';
+import { TableColumn } from '@backstage/core-components';
+import { UserEntity } from '@backstage/catalog-model';
+
+export { CatalogApi }
+
+// @public (undocumented)
+export const catalogApiRef: ApiRef;
+
+// @public (undocumented)
+export const catalogRouteRef: RouteRef;
+
+// @public (undocumented)
+function createDomainColumn(): TableColumn;
+
+// @public (undocumented)
+function createEntityRefColumn({ defaultKind, }: {
+ defaultKind?: string;
+}): TableColumn;
+
+// @public (undocumented)
+function createEntityRelationColumn({ title, relation, defaultKind, filter: entityFilter, }: {
+ title: string;
+ relation: string;
+ defaultKind?: string;
+ filter?: {
+ kind: string;
+ };
+}): TableColumn;
+
+// @public (undocumented)
+function createMetadataDescriptionColumn(): TableColumn;
+
+// @public (undocumented)
+function createOwnerColumn(): TableColumn;
+
+// @public (undocumented)
+function createSpecLifecycleColumn(): TableColumn;
+
+// @public (undocumented)
+function createSpecTypeColumn(): TableColumn;
+
+// @public (undocumented)
+function createSystemColumn(): TableColumn;
+
+// @public (undocumented)
+export type DefaultEntityFilters = {
+ kind?: EntityKindFilter;
+ type?: EntityTypeFilter;
+ user?: UserListFilter;
+ owners?: EntityOwnerFilter;
+ lifecycles?: EntityLifecycleFilter;
+ tags?: EntityTagFilter;
+ text?: EntityTextFilter;
+};
+
+// @public (undocumented)
+export const EntityContext: Context;
+
+// @public (undocumented)
+export type EntityFilter = {
+ getCatalogFilters?: () => Record;
+ filterEntity?: (entity: Entity) => boolean;
+ toQueryValue?: () => string | string[];
+};
+
+// @public (undocumented)
+export class EntityKindFilter implements EntityFilter {
+ constructor(value: string);
+ // (undocumented)
+ getCatalogFilters(): Record;
+ // (undocumented)
+ toQueryValue(): string;
+ // (undocumented)
+ readonly value: string;
+}
+
+// @public (undocumented)
+export const EntityKindPicker: ({ initialFilter, hidden, }: EntityKindFilterProps) => JSX.Element | null;
+
+// @public (undocumented)
+export class EntityLifecycleFilter implements EntityFilter {
+ constructor(values: string[]);
+ // (undocumented)
+ filterEntity(entity: Entity): boolean;
+ // (undocumented)
+ toQueryValue(): string[];
+ // (undocumented)
+ readonly values: string[];
+}
+
+// @public (undocumented)
+export const EntityLifecyclePicker: () => JSX.Element | null;
+
+// @public (undocumented)
+export const EntityListContext: React_2.Context | undefined>;
+
+// @public (undocumented)
+export const EntityListProvider: ({ children, }: PropsWithChildren<{}>) => JSX.Element;
+
+// @public (undocumented)
+export class EntityOwnerFilter implements EntityFilter {
+ constructor(values: string[]);
+ // (undocumented)
+ filterEntity(entity: Entity): boolean;
+ // (undocumented)
+ toQueryValue(): string[];
+ // (undocumented)
+ readonly values: string[];
+}
+
+// @public (undocumented)
+export const EntityOwnerPicker: () => JSX.Element | null;
+
+// @public (undocumented)
+export const EntityProvider: ({ entity, children }: EntityProviderProps) => JSX.Element;
+
+// @public (undocumented)
+export const EntityRefLink: React_2.ForwardRefExoticComponent & React_2.RefAttributes>;
+
+// @public (undocumented)
+export const EntityRefLinks: ({ entityRefs, defaultKind, ...linkProps }: EntityRefLinksProps) => JSX.Element;
+
+// @public (undocumented)
+export const entityRoute: RouteRef< {
+name: string;
+kind: string;
+namespace: string;
+}>;
+
+// @public (undocumented)
+export function entityRouteParams(entity: Entity): {
+ readonly kind: string;
+ readonly namespace: string;
+ readonly name: string;
+};
+
+// @public (undocumented)
+export const entityRouteRef: RouteRef< {
+name: string;
+kind: string;
+namespace: string;
+}>;
+
+// @public (undocumented)
+export const EntitySearchBar: () => JSX.Element;
+
+// @public (undocumented)
+export type EntitySourceLocation = {
+ locationTargetUrl: string;
+ integrationType?: string;
+};
+
+// @public (undocumented)
+export function EntityTable({ entities, title, emptyContent, variant, columns, }: Props): JSX.Element;
+
+// @public (undocumented)
+export namespace EntityTable {
+ var // (undocumented)
+ columns: typeof columnFactories;
+ var // (undocumented)
+ systemEntityColumns: TableColumn[];
+ var // (undocumented)
+ componentEntityColumns: TableColumn[];
+}
+
+// @public (undocumented)
+export class EntityTagFilter implements EntityFilter {
+ constructor(values: string[]);
+ // (undocumented)
+ filterEntity(entity: Entity): boolean;
+ // (undocumented)
+ toQueryValue(): string[];
+ // (undocumented)
+ readonly values: string[];
+}
+
+// @public (undocumented)
+export const EntityTagPicker: () => JSX.Element | null;
+
+// @public (undocumented)
+export class EntityTextFilter implements EntityFilter {
+ constructor(value: string);
+ // (undocumented)
+ filterEntity(entity: Entity): boolean;
+ // (undocumented)
+ readonly value: string;
+}
+
+// @public (undocumented)
+export class EntityTypeFilter implements EntityFilter {
+ constructor(value: string | string[]);
+ // (undocumented)
+ getCatalogFilters(): Record;
+ // (undocumented)
+ getTypes(): string[];
+ // (undocumented)
+ toQueryValue(): string[];
+ // (undocumented)
+ readonly value: string | string[];
+}
+
+// @public (undocumented)
+export const EntityTypePicker: () => JSX.Element | null;
+
+// @public (undocumented)
+export function formatEntityRefTitle(entityRef: Entity | EntityName, opts?: {
+ defaultKind?: string;
+}): string;
+
+// @public (undocumented)
+export function getEntityMetadataEditUrl(entity: Entity): string | undefined;
+
+// @public (undocumented)
+export function getEntityMetadataViewUrl(entity: Entity): string | undefined;
+
+// @public
+export function getEntityRelations(entity: Entity | undefined, relationType: string, filter?: {
+ kind: string;
+}): EntityName[];
+
+// @public (undocumented)
+export function getEntitySourceLocation(entity: Entity, scmIntegrationsApi: ScmIntegrationRegistry): EntitySourceLocation | undefined;
+
+// @public
+export function isOwnerOf(owner: Entity, owned: Entity): boolean;
+
+// @public (undocumented)
+export const MockEntityListContextProvider: ({ children, value, }: React_2.PropsWithChildren<{
+ value: Partial;
+}>) => JSX.Element;
+
+// @public (undocumented)
+export function reduceCatalogFilters(filters: EntityFilter[]): Record;
+
+// @public (undocumented)
+export function reduceEntityFilters(filters: EntityFilter[]): (entity: Entity) => boolean;
+
+// @public (undocumented)
+export const rootRoute: RouteRef;
+
+// @public
+export function useEntity(): {
+ entity: T;
+ loading: boolean;
+ error: Error | undefined;
+};
+
+// @public
+export const useEntityCompoundName: () => {
+ kind: string;
+ namespace: string;
+ name: string;
+};
+
+// @public (undocumented)
+export const useEntityFromUrl: () => EntityLoadingStatus;
+
+// @public (undocumented)
+export function useEntityListProvider(): EntityListContextProps;
+
+// @public
+export function useEntityTypeFilter(): EntityTypeReturn;
+
+// @public
+export function useOwnUser(): AsyncState;
+
+// @public (undocumented)
+export function useRelatedEntities(entity: Entity, { type, kind }: {
+ type?: string;
+ kind?: string;
+}): {
+ entities: Entity[] | undefined;
+ loading: boolean;
+ error: Error | undefined;
+};
+
+// @public (undocumented)
+export class UserListFilter implements EntityFilter {
+ constructor(value: UserListFilterKind, user: UserEntity | undefined, isStarredEntity: (entity: Entity) => boolean);
+ // (undocumented)
+ filterEntity(entity: Entity): boolean;
+ // (undocumented)
+ readonly isStarredEntity: (entity: Entity) => boolean;
+ // (undocumented)
+ toQueryValue(): string;
+ // (undocumented)
+ readonly user: UserEntity | undefined;
+ // (undocumented)
+ readonly value: UserListFilterKind;
+}
+
+// @public (undocumented)
+export type UserListFilterKind = 'owned' | 'starred' | 'all';
+
+// @public (undocumented)
+export const UserListPicker: ({ initialFilter, availableFilters, }: UserListPickerProps) => JSX.Element;
+
+// @public (undocumented)
+export const useStarredEntities: () => {
+ starredEntities: Set;
+ toggleStarredEntity: (entity: Entity) => void;
+ isStarredEntity: (entity: Entity) => boolean;
+};
+
+// (No @packageDocumentation comment for this package)
+
+```
diff --git a/plugins/catalog/api-report.md b/plugins/catalog/api-report.md
new file mode 100644
index 0000000000..7bfd286440
--- /dev/null
+++ b/plugins/catalog/api-report.md
@@ -0,0 +1,198 @@
+## API Report File for "@backstage/plugin-catalog"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+
+///
+
+import { BackstagePlugin } from '@backstage/core-plugin-api';
+import { Entity } from '@backstage/catalog-model';
+import { EntityName } from '@backstage/catalog-model';
+import { ExternalRouteRef } from '@backstage/core-plugin-api';
+import { IconComponent } from '@backstage/core-plugin-api';
+import { InfoCardVariants } from '@backstage/core-components';
+import { PropsWithChildren } from 'react';
+import { default as React_2 } from 'react';
+import { ReactNode } from 'react';
+import { RouteRef } from '@backstage/core-plugin-api';
+import { TableColumn } from '@backstage/core-components';
+import { TableProps } from '@backstage/core-components';
+import { TabProps } from '@material-ui/core';
+import { UserListFilterKind } from '@backstage/plugin-catalog-react';
+
+// @public (undocumented)
+export function AboutCard({ variant }: AboutCardProps): JSX.Element;
+
+// @public (undocumented)
+export const AboutContent: ({ entity }: Props_2) => JSX.Element;
+
+// @public (undocumented)
+export const AboutField: ({ label, value, gridSizes, children }: Props_3) => JSX.Element;
+
+// @public (undocumented)
+export const CatalogEntityPage: () => JSX.Element;
+
+// @public (undocumented)
+export const CatalogIndexPage: ({ initiallySelectedFilter, columns, actions, }: CatalogPageProps) => JSX.Element;
+
+// @public (undocumented)
+export const CatalogLayout: ({ children }: Props) => JSX.Element;
+
+// @public (undocumented)
+const catalogPlugin: BackstagePlugin< {
+catalogIndex: RouteRef;
+catalogEntity: RouteRef< {
+name: string;
+kind: string;
+namespace: string;
+}>;
+}, {
+createComponent: ExternalRouteRef;
+}>;
+export { catalogPlugin }
+export { catalogPlugin as plugin }
+
+// @public (undocumented)
+export const CatalogResultListItem: ({ result }: any) => JSX.Element;
+
+// @public (undocumented)
+export const CatalogTable: {
+ ({ columns, actions }: CatalogTableProps): JSX.Element;
+ columns: typeof columnFactories;
+};
+
+// @public (undocumented)
+export type CatalogTableRow = {
+ entity: Entity;
+ resolved: {
+ name: string;
+ partOfSystemRelationTitle?: string;
+ partOfSystemRelations: EntityName[];
+ ownedByRelationsTitle?: string;
+ ownedByRelations: EntityName[];
+ };
+};
+
+// @public (undocumented)
+export const CreateComponentButton: () => JSX.Element | null;
+
+// @public (undocumented)
+export function createMetadataDescriptionColumn(): TableColumn;
+
+// @public (undocumented)
+export function createNameColumn(props?: NameColumnProps): TableColumn;
+
+// @public (undocumented)
+export function createOwnerColumn(): TableColumn;
+
+// @public (undocumented)
+export function createSpecLifecycleColumn(): TableColumn;
+
+// @public (undocumented)
+export function createSpecTypeColumn(): TableColumn;
+
+// @public (undocumented)
+export function createSystemColumn(): TableColumn;
+
+// @public (undocumented)
+export function createTagsColumn(): TableColumn;
+
+// @public (undocumented)
+export const EntityAboutCard: AboutCard;
+
+// @public (undocumented)
+export const EntityDependencyOfComponentsCard: ({ variant, title, }: {
+ variant?: "gridItem" | undefined;
+ title?: string | undefined;
+}) => JSX.Element;
+
+// @public (undocumented)
+export const EntityDependsOnComponentsCard: ({ variant, title, }: {
+ variant?: "gridItem" | undefined;
+ title?: string | undefined;
+}) => JSX.Element;
+
+// @public (undocumented)
+export const EntityDependsOnResourcesCard: ({ variant }: {
+ variant?: "gridItem" | undefined;
+}) => JSX.Element;
+
+// @public (undocumented)
+export const EntityHasComponentsCard: ({ variant }: {
+ variant?: "gridItem" | undefined;
+}) => JSX.Element;
+
+// @public (undocumented)
+export const EntityHasResourcesCard: ({ variant }: {
+ variant?: "gridItem" | undefined;
+}) => JSX.Element;
+
+// @public (undocumented)
+export const EntityHasSubcomponentsCard: ({ variant }: {
+ variant?: "gridItem" | undefined;
+}) => JSX.Element;
+
+// @public (undocumented)
+export const EntityHasSystemsCard: ({ variant }: {
+ variant?: "gridItem" | undefined;
+}) => JSX.Element;
+
+// @public
+export const EntityLayout: {
+ ({ UNSTABLE_extraContextMenuItems, children, }: EntityLayoutProps): JSX.Element;
+ Route: (props: SubRoute) => null;
+};
+
+// @public (undocumented)
+export const EntityLinksCard: ({ cols, variant }: {
+ entity?: Entity | undefined;
+ cols?: number | ColumnBreakpoints | undefined;
+ variant?: "gridItem" | undefined;
+}) => JSX.Element;
+
+// @public
+export const EntityOrphanWarning: () => JSX.Element;
+
+// @public (undocumented)
+export const EntityPageLayout: {
+ ({ children, UNSTABLE_extraContextMenuItems, }: EntityPageLayoutProps): JSX.Element;
+ Content: (_props: {
+ path: string;
+ title: string;
+ element: JSX.Element;
+ }) => null;
+};
+
+// @public (undocumented)
+export const EntitySwitch: {
+ ({ children }: PropsWithChildren<{}>): JSX.Element | null;
+ Case: (_: {
+ if?: ((entity: Entity) => boolean) | undefined;
+ children: ReactNode;
+ }) => null;
+};
+
+// @public (undocumented)
+export const EntitySystemDiagramCard: SystemDiagramCard;
+
+// @public (undocumented)
+export function isComponentType(type: string): (entity: Entity) => boolean;
+
+// @public (undocumented)
+export function isKind(kind: string): (entity: Entity) => boolean;
+
+// @public (undocumented)
+export function isNamespace(namespace: string): (entity: Entity) => boolean;
+
+// @public (undocumented)
+export const isOrphan: (entity: Entity) => boolean;
+
+// @public (undocumented)
+export const Router: ({ EntityPage, }: {
+ EntityPage?: React_2.ComponentType<{}> | undefined;
+}) => JSX.Element;
+
+// (No @packageDocumentation comment for this package)
+
+```
diff --git a/plugins/github-deployments/api-report.md b/plugins/github-deployments/api-report.md
new file mode 100644
index 0000000000..09007e5dde
--- /dev/null
+++ b/plugins/github-deployments/api-report.md
@@ -0,0 +1,59 @@
+## API Report File for "@backstage/plugin-github-deployments"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+
+///
+
+import { BackstagePlugin } from '@backstage/core-plugin-api';
+import { Entity } from '@backstage/catalog-model';
+import { TableColumn } from '@backstage/core-components';
+
+// @public (undocumented)
+function createCommitColumn(): TableColumn;
+
+// @public (undocumented)
+function createCreatorColumn(): TableColumn;
+
+// @public (undocumented)
+function createEnvironmentColumn(): TableColumn;
+
+// @public (undocumented)
+function createLastUpdatedColumn(): TableColumn;
+
+// @public (undocumented)
+function createStatusColumn(): TableColumn;
+
+// @public (undocumented)
+export const EntityGithubDeploymentsCard: ({ last, lastStatuses, columns, }: {
+ last?: number | undefined;
+ lastStatuses?: number | undefined;
+ columns?: TableColumn[] | undefined;
+}) => JSX.Element;
+
+// @public (undocumented)
+export const githubDeploymentsPlugin: BackstagePlugin< {}, {}>;
+
+// @public (undocumented)
+export function GithubDeploymentsTable({ deployments, isLoading, reload, columns, }: GithubDeploymentsTableProps): JSX.Element;
+
+// @public (undocumented)
+export namespace GithubDeploymentsTable {
+ var // (undocumented)
+ columns: typeof columnFactories;
+ var // (undocumented)
+ defaultDeploymentColumns: TableColumn[];
+}
+
+// @public (undocumented)
+const GithubStateIndicator: ({ state }: {
+ state: string;
+}) => JSX.Element;
+
+// @public (undocumented)
+export const isGithubDeploymentsAvailable: (entity: Entity) => boolean;
+
+// (No @packageDocumentation comment for this package)
+
+```
diff --git a/scripts/api-extractor.ts b/scripts/api-extractor.ts
index 2631f7de93..ab302606df 100644
--- a/scripts/api-extractor.ts
+++ b/scripts/api-extractor.ts
@@ -73,14 +73,6 @@ const SKIPPED_PACKAGES = [
'packages/e2e-test',
'packages/storybook',
'packages/techdocs-cli',
-
- // TODO(Rugvip): Enable these once `import * as ...` and `import()` PRs have landed, #1796 & #1916.
- 'packages/core-components',
- 'plugins/catalog',
- 'plugins/catalog-backend',
- 'plugins/catalog-react',
- 'plugins/github-deployments',
- 'plugins/sentry-backend',
];
async function findPackageDirs() {