@kuadrant/kuadrant-backstage-plugin-frontend 0.2.0 → 0.2.1
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/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +21 -3
- package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +1 -7
- package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
- package/dist/components/KuadrantIcon/KuadrantIcon.esm.js +22 -0
- package/dist/components/KuadrantIcon/KuadrantIcon.esm.js.map +1 -0
- package/dist/components/icons.esm.js +11 -0
- package/dist/components/icons.esm.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -1
- package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js +2 -0
- package/dist-scalprum/internal.plugin-kuadrant.c4fb9c2347d3ad03a5d0.js.map +1 -0
- package/dist-scalprum/plugin-manifest.json +3 -3
- package/dist-scalprum/static/{1037.58dd29ad.chunk.js → 1037.25758556.chunk.js} +1 -1
- package/dist-scalprum/static/{1037.58dd29ad.chunk.js.map → 1037.25758556.chunk.js.map} +1 -1
- package/dist-scalprum/static/{1584.ae3779f0.chunk.js → 1584.1e45e570.chunk.js} +2 -2
- package/dist-scalprum/static/{1584.ae3779f0.chunk.js.map → 1584.1e45e570.chunk.js.map} +1 -1
- package/dist-scalprum/static/1719.246c020d.chunk.js +2 -0
- package/dist-scalprum/static/1719.246c020d.chunk.js.map +1 -0
- package/dist-scalprum/static/{1881.8221c002.chunk.js → 1881.56cde36b.chunk.js} +1 -1
- package/dist-scalprum/static/{1881.8221c002.chunk.js.map → 1881.56cde36b.chunk.js.map} +1 -1
- package/dist-scalprum/static/286.ee43f560.chunk.js +2 -0
- package/dist-scalprum/static/286.ee43f560.chunk.js.map +1 -0
- package/dist-scalprum/static/2952.b54bd390.chunk.js +2 -0
- package/dist-scalprum/static/2952.b54bd390.chunk.js.map +1 -0
- package/dist-scalprum/static/2967.0c2ef90e.chunk.js +2 -0
- package/dist-scalprum/static/2967.0c2ef90e.chunk.js.map +1 -0
- package/dist-scalprum/static/3015.1fe097c2.chunk.js +3 -0
- package/dist-scalprum/static/3015.1fe097c2.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/3015.1fe097c2.chunk.js.map +1 -0
- package/dist-scalprum/static/{3581.b5b97f08.chunk.js → 3581.ebe5968a.chunk.js} +1 -1
- package/dist-scalprum/static/{3581.b5b97f08.chunk.js.map → 3581.ebe5968a.chunk.js.map} +1 -1
- package/dist-scalprum/static/3657.882640ca.chunk.js +3 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/3657.882640ca.chunk.js.map +1 -0
- package/dist-scalprum/static/{3897.ef4554b5.chunk.js → 3897.6e9c07c0.chunk.js} +1 -1
- package/dist-scalprum/static/{3897.ef4554b5.chunk.js.map → 3897.6e9c07c0.chunk.js.map} +1 -1
- package/dist-scalprum/static/{3947.ad129ba4.chunk.js → 3947.4f4aa8c2.chunk.js} +1 -1
- package/dist-scalprum/static/{3947.ad129ba4.chunk.js.map → 3947.4f4aa8c2.chunk.js.map} +1 -1
- package/dist-scalprum/static/{3976.e0873210.chunk.js → 3976.e8a8fda2.chunk.js} +2 -2
- package/dist-scalprum/static/{3976.e0873210.chunk.js.map → 3976.e8a8fda2.chunk.js.map} +1 -1
- package/dist-scalprum/static/{4083.488ff7a9.chunk.js → 4083.811c4e7a.chunk.js} +2 -2
- package/dist-scalprum/static/{4083.488ff7a9.chunk.js.map → 4083.811c4e7a.chunk.js.map} +1 -1
- package/dist-scalprum/static/4908.196a4425.chunk.js +2 -0
- package/dist-scalprum/static/{5453.3c20d0a6.chunk.js.map → 4908.196a4425.chunk.js.map} +1 -1
- package/dist-scalprum/static/{5010.6241b64f.chunk.js → 5010.4f67737b.chunk.js} +2 -2
- package/dist-scalprum/static/{5010.6241b64f.chunk.js.map → 5010.4f67737b.chunk.js.map} +1 -1
- package/dist-scalprum/static/{512.f1c51799.chunk.js → 512.d592d164.chunk.js} +1 -1
- package/dist-scalprum/static/{512.f1c51799.chunk.js.map → 512.d592d164.chunk.js.map} +1 -1
- package/dist-scalprum/static/{5289.2e686027.chunk.js → 5289.55069930.chunk.js} +2 -2
- package/dist-scalprum/static/{5289.2e686027.chunk.js.map → 5289.55069930.chunk.js.map} +1 -1
- package/dist-scalprum/static/5605.430f697e.chunk.js +2 -0
- package/dist-scalprum/static/5605.430f697e.chunk.js.map +1 -0
- package/dist-scalprum/static/5978.bf347a09.chunk.js +2 -0
- package/dist-scalprum/static/5978.bf347a09.chunk.js.map +1 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js +3 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js.LICENSE.txt +8 -0
- package/dist-scalprum/static/6038.63d1f832.chunk.js.map +1 -0
- package/dist-scalprum/static/{6272.b5645dc2.chunk.js → 6272.3ed14ea4.chunk.js} +1 -1
- package/dist-scalprum/static/{6272.b5645dc2.chunk.js.map → 6272.3ed14ea4.chunk.js.map} +1 -1
- package/dist-scalprum/static/635.f63679a5.chunk.js +3 -0
- package/dist-scalprum/static/635.f63679a5.chunk.js.map +1 -0
- package/dist-scalprum/static/6371.7b57ac27.chunk.js +3 -0
- package/dist-scalprum/static/6371.7b57ac27.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/6371.7b57ac27.chunk.js.map +1 -0
- package/dist-scalprum/static/{6386.2d20c412.chunk.js → 6386.5922f271.chunk.js} +3 -3
- package/dist-scalprum/static/{6386.2d20c412.chunk.js.map → 6386.5922f271.chunk.js.map} +1 -1
- package/dist-scalprum/static/{6426.bf20c588.chunk.js → 6426.4c18bab5.chunk.js} +1 -1
- package/dist-scalprum/static/{6426.bf20c588.chunk.js.map → 6426.4c18bab5.chunk.js.map} +1 -1
- package/dist-scalprum/static/6777.a2b77ec5.chunk.js +2 -0
- package/dist-scalprum/static/6777.a2b77ec5.chunk.js.map +1 -0
- package/dist-scalprum/static/{6800.ddabed69.chunk.js → 6800.a45da2f4.chunk.js} +2 -2
- package/dist-scalprum/static/{6800.ddabed69.chunk.js.map → 6800.a45da2f4.chunk.js.map} +1 -1
- package/dist-scalprum/static/{6972.e47ec97e.chunk.js → 6972.f22b9446.chunk.js} +1 -1
- package/dist-scalprum/static/{6972.e47ec97e.chunk.js.map → 6972.f22b9446.chunk.js.map} +1 -1
- package/dist-scalprum/static/7005.8190ad95.chunk.js +2 -0
- package/dist-scalprum/static/7005.8190ad95.chunk.js.map +1 -0
- package/dist-scalprum/static/7164.5dc4bc72.chunk.js +2 -0
- package/dist-scalprum/static/7164.5dc4bc72.chunk.js.map +1 -0
- package/dist-scalprum/static/{7266.e760b8c3.chunk.js → 7266.3c4174cc.chunk.js} +1 -1
- package/dist-scalprum/static/{7266.e760b8c3.chunk.js.map → 7266.3c4174cc.chunk.js.map} +1 -1
- package/dist-scalprum/static/7270.d52407cd.chunk.js +2 -0
- package/dist-scalprum/static/7270.d52407cd.chunk.js.map +1 -0
- package/dist-scalprum/static/7717.6f5b9dd7.chunk.js +3 -0
- package/dist-scalprum/static/7717.6f5b9dd7.chunk.js.map +1 -0
- package/dist-scalprum/static/{7791.8f84478d.chunk.js → 7791.ad31cf6d.chunk.js} +2 -2
- package/dist-scalprum/static/{7791.8f84478d.chunk.js.map → 7791.ad31cf6d.chunk.js.map} +1 -1
- package/dist-scalprum/static/{8563.46f1a3e1.chunk.js → 8563.6501eafb.chunk.js} +2 -2
- package/dist-scalprum/static/{8563.46f1a3e1.chunk.js.map → 8563.6501eafb.chunk.js.map} +1 -1
- package/dist-scalprum/static/{9079.b6d5c19c.chunk.js → 9079.2ddaea57.chunk.js} +1 -1
- package/dist-scalprum/static/{9079.b6d5c19c.chunk.js.map → 9079.2ddaea57.chunk.js.map} +1 -1
- package/dist-scalprum/static/9239.1acfe112.chunk.js +2 -0
- package/dist-scalprum/static/9239.1acfe112.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js +3 -0
- package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js.LICENSE.txt +9 -0
- package/dist-scalprum/static/exposed-KuadrantIcon.08abbb96.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js +2 -0
- package/dist-scalprum/static/exposed-KuadrantPage.5ae00605.chunk.js.map +1 -0
- package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js +2 -0
- package/dist-scalprum/static/exposed-PluginRoot.949381c2.chunk.js.map +1 -0
- package/package.json +6 -3
- package/dist-scalprum/internal.plugin-kuadrant.b3d35dc8b21ce867aa09.js +0 -2
- package/dist-scalprum/internal.plugin-kuadrant.b3d35dc8b21ce867aa09.js.map +0 -1
- package/dist-scalprum/static/1319.ac195ac2.chunk.js +0 -2
- package/dist-scalprum/static/1319.ac195ac2.chunk.js.map +0 -1
- package/dist-scalprum/static/2967.7c6a34cd.chunk.js +0 -2
- package/dist-scalprum/static/2967.7c6a34cd.chunk.js.map +0 -1
- package/dist-scalprum/static/3118.daee3324.chunk.js +0 -3
- package/dist-scalprum/static/3118.daee3324.chunk.js.map +0 -1
- package/dist-scalprum/static/483.d55d6ab2.chunk.js +0 -2
- package/dist-scalprum/static/483.d55d6ab2.chunk.js.map +0 -1
- package/dist-scalprum/static/5203.3df62d7e.chunk.js +0 -2
- package/dist-scalprum/static/5203.3df62d7e.chunk.js.map +0 -1
- package/dist-scalprum/static/5453.3c20d0a6.chunk.js +0 -2
- package/dist-scalprum/static/6371.f183dddb.chunk.js +0 -3
- package/dist-scalprum/static/6371.f183dddb.chunk.js.map +0 -1
- package/dist-scalprum/static/7005.d548f8f1.chunk.js +0 -2
- package/dist-scalprum/static/7005.d548f8f1.chunk.js.map +0 -1
- package/dist-scalprum/static/7270.301a3c46.chunk.js +0 -2
- package/dist-scalprum/static/7270.301a3c46.chunk.js.map +0 -1
- package/dist-scalprum/static/9051.f095a8a1.chunk.js +0 -2
- package/dist-scalprum/static/9051.f095a8a1.chunk.js.map +0 -1
- package/dist-scalprum/static/9838.589f2156.chunk.js +0 -2
- package/dist-scalprum/static/9838.589f2156.chunk.js.map +0 -1
- package/dist-scalprum/static/exposed-PluginRoot.a8448fcc.chunk.js +0 -2
- package/dist-scalprum/static/exposed-PluginRoot.a8448fcc.chunk.js.map +0 -1
- /package/dist-scalprum/static/{1584.ae3779f0.chunk.js.LICENSE.txt → 1584.1e45e570.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{4083.488ff7a9.chunk.js.LICENSE.txt → 4083.811c4e7a.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{5010.6241b64f.chunk.js.LICENSE.txt → 5010.4f67737b.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6371.f183dddb.chunk.js.LICENSE.txt → 635.f63679a5.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{6386.2d20c412.chunk.js.LICENSE.txt → 6386.5922f271.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{3118.daee3324.chunk.js.LICENSE.txt → 7717.6f5b9dd7.chunk.js.LICENSE.txt} +0 -0
- /package/dist-scalprum/static/{8563.46f1a3e1.chunk.js.LICENSE.txt → 8563.6501eafb.chunk.js.LICENSE.txt} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static/6800.ddabed69.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-catalog-react/dist/hooks/useEntity.esm.js","webpack://internal.plugin-kuadrant/./src/components/EntityApiApprovalTab/EntityApiApprovalTab.tsx"],"sourcesContent":["import { jsx } from 'react/jsx-runtime';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { AnalyticsContext } from '@backstage/core-plugin-api';\nimport { createVersionedContext, useVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';\n\nconst NewEntityContext = createVersionedContext(\n \"entity-context\"\n);\nconst AsyncEntityProvider = (props) => {\n const { children, entity, loading, error, refresh } = props;\n const value = { entity, loading, error, refresh };\n return /* @__PURE__ */ jsx(NewEntityContext.Provider, { value: createVersionedValueMap({ 1: value }), children: /* @__PURE__ */ jsx(\n AnalyticsContext,\n {\n attributes: {\n ...entity ? { entityRef: stringifyEntityRef(entity) } : void 0\n },\n children\n }\n ) });\n};\nconst EntityProvider = (props) => /* @__PURE__ */ jsx(\n AsyncEntityProvider,\n {\n entity: props.entity,\n loading: !Boolean(props.entity),\n error: void 0,\n refresh: void 0,\n children: props.children\n }\n);\nfunction useEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n if (!value.entity) {\n throw new Error(\n \"useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.\"\n );\n }\n return { entity: value.entity };\n}\nfunction useAsyncEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n const { entity, loading, error, refresh } = value;\n return { entity, loading, error, refresh };\n}\n\nexport { AsyncEntityProvider, EntityProvider, useAsyncEntity, useEntity };\n//# sourceMappingURL=useEntity.esm.js.map\n","import React, { useState } from \"react\";\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n ResponseErrorPanel,\n} from \"@backstage/core-components\";\nimport { kuadrantApiKeyApprovePermission } from \"../../permissions\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport {\n Box,\n Typography,\n Chip,\n IconButton,\n Tooltip,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n CircularProgress,\n makeStyles,\n} from \"@material-ui/core\";\nimport { Skeleton } from \"@material-ui/lab\";\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport { APIKey } from \"../../types/api-management\";\nimport { getApprovalQueueStatusChipStyle } from \"../../utils/styles\";\n\nconst useStyles = makeStyles((theme) => ({\n useCasePanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n useCaseLabel: {\n fontWeight: 600,\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n textTransform: \"uppercase\",\n fontSize: \"0.75rem\",\n },\n}));\n\ninterface ExpandedRowProps {\n request: APIKey;\n}\n\nconst ExpandedRowContent = ({ request }: ExpandedRowProps) => {\n const classes = useStyles();\n\n return (\n <Box className={classes.useCasePanel} onClick={(e) => e.stopPropagation()}>\n <Typography className={classes.useCaseLabel}>Use Case</Typography>\n <Typography variant=\"body2\">\n {request.spec.useCase || \"No use case provided\"}\n </Typography>\n </Box>\n );\n};\n\ninterface ApprovalDialogProps {\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: (confirmText: string) => void;\n}\n\nconst ApprovalDialog = ({\n open,\n request,\n action,\n processing,\n onClose,\n onConfirm,\n}: ApprovalDialogProps) => {\n const [confirmText, setConfirmText] = useState(\"\");\n\n const handleClose = () => {\n setConfirmText(\"\");\n onClose();\n };\n\n const handleConfirm = () => {\n onConfirm(confirmText);\n setConfirmText(\"\");\n };\n\n const isReject = action === \"reject\";\n const expectedText = request?.metadata.name || \"\";\n const isConfirmValid = confirmText === expectedText;\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : handleClose}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {isReject ? \"Reject API key\" : \"Approve API key\"}\n </DialogTitle>\n <DialogContent>\n {request && (\n <>\n <Typography variant=\"body2\" paragraph>\n <strong>Requester:</strong> {request.spec.requestedBy.userId}\n </Typography>\n <Typography variant=\"body2\" paragraph>\n <strong>Tier:</strong> {request.spec.planTier}\n </Typography>\n {request.spec.useCase && (\n <Typography variant=\"body2\" paragraph>\n <strong>Use Case:</strong> {request.spec.useCase}\n </Typography>\n )}\n {isReject && (\n <Box mt={2} p={2} bgcolor=\"error.light\" borderRadius={1}>\n <Typography variant=\"body2\">\n This action will permanently deny access. The user will need\n to submit a new request.\n </Typography>\n </Box>\n )}\n <Box mt={2}>\n <TextField\n fullWidth\n label={`Type \"${expectedText}\" to confirm`}\n value={confirmText}\n onChange={(e) => setConfirmText(e.target.value)}\n disabled={processing}\n autoFocus\n />\n </Box>\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n color={isReject ? \"secondary\" : \"primary\"}\n variant=\"contained\"\n disabled={!isConfirmValid || processing}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing\n ? isReject\n ? \"Rejecting...\"\n : \"Approving...\"\n : isReject\n ? \"Reject\"\n : \"Approve\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport const EntityApiApprovalTab = () => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n\n const apiProductName =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] || \"default\";\n\n const [refresh, setRefresh] = useState(0);\n const [dialogState, setDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n\n const {\n allowed: canApprove,\n loading: permissionLoading,\n error: permissionError,\n } = useKuadrantPermission(kuadrantApiKeyApprovePermission);\n\n const { value, loading, error } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const reviewedBy = identity.userEntityRef;\n\n const data = await kuadrantApi.getRequests();\n const allRequests: APIKey[] = data.items || [];\n\n // filter to this API product only\n const filtered = allRequests.filter(\n (r) =>\n r.spec.apiProductRef?.name === apiProductName &&\n r.metadata.namespace === namespace,\n );\n\n return { requests: filtered, reviewedBy };\n }, [kuadrantApi, identityApi, apiProductName, namespace, refresh]);\n\n const handleApprove = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleReject = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleConfirm = async () => {\n if (!dialogState.request || !value) return;\n\n setDialogState((prev) => ({ ...prev, processing: true }));\n\n const isApprove = dialogState.action === \"approve\"\n const requestFn = isApprove\n ? (ns: string, n: string, r: string) => kuadrantApi.approveRequest(ns, n, r)\n : (ns: string, n: string, r: string) => kuadrantApi.rejectRequest(ns, n, r)\n\n try {\n await requestFn(dialogState.request.metadata.namespace, dialogState.request.metadata.name, value.reviewedBy);\n\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n setRefresh((r) => r + 1);\n alertApi.post({\n message: `API key ${isApprove ? \"approved\" : \"rejected\"}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`Error ${dialogState.action}ing request:`, err);\n setDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to ${dialogState.action} APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n }\n };\n\n if (loading || permissionLoading) {\n return (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n </Box>\n );\n }\n\n if (!canApprove) {\n return (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n You don't have permission to view the approval queue for this API.\n </Typography>\n </Box>\n );\n }\n\n const requests = value?.requests || [];\n const pendingRequests = requests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = requests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = requests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const columns: TableColumn<APIKey>[] = [\n {\n title: \"Requester\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n const label = phase === \"Approved\" ? \"Active\" : phase;\n return (\n <Chip label={label} size=\"small\" style={getApprovalQueueStatusChipStyle(phase)} />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row) => (\n <Chip label={row.spec.planTier} size=\"small\" variant=\"outlined\" />\n ),\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row) => {\n if (!row.metadata.creationTimestamp)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.metadata.creationTimestamp).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"Actions\",\n filtering: false,\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n if (phase !== \"Pending\") return null;\n return (\n <Box display=\"flex\" style={{ gap: 4 }}>\n <Tooltip title=\"Approve\">\n <IconButton size=\"small\" onClick={() => handleApprove(row)}>\n <CheckCircleIcon color=\"primary\" />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Reject\">\n <IconButton size=\"small\" onClick={() => handleReject(row)}>\n <CancelIcon color=\"error\" />\n </IconButton>\n </Tooltip>\n </Box>\n );\n },\n },\n ];\n\n const detailPanelConfig = [\n {\n render: (data: any) => {\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) return <Box />;\n return <ExpandedRowContent request={request} />;\n },\n },\n ];\n\n return (\n <Box p={2}>\n <Box mb={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {pendingRequests.length} pending, {approvedRequests.length} approved,{\" \"}\n {rejectedRequests.length} rejected\n </Typography>\n </Box>\n\n {requests.length === 0 ? (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys for this API.\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n paging: requests.length > 10,\n pageSize: 20,\n search: true,\n filtering: false,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={requests.map((item) => ({ ...item, id: item.metadata.name }))}\n detailPanel={detailPanelConfig}\n />\n )}\n\n <ApprovalDialog\n open={dialogState.open}\n request={dialogState.request}\n action={dialogState.action}\n processing={dialogState.processing}\n onClose={() =>\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleConfirm}\n />\n </Box>\n );\n};\n"],"names":["useEntity","versionedHolder","useVersionedContext","Error","value","atVersion","entity","createVersionedContext","useStyles","makeStyles","theme","useCasePanel","padding","spacing","backgroundColor","palette","background","default","useCaseLabel","fontWeight","marginBottom","color","text","secondary","textTransform","fontSize","ExpandedRowContent","request","classes","Box","className","onClick","e","stopPropagation","Typography","variant","spec","useCase","ApprovalDialog","open","action","processing","onClose","onConfirm","confirmText","setConfirmText","useState","handleClose","isReject","expectedText","metadata","name","isConfirmValid","Dialog","undefined","maxWidth","fullWidth","DialogTitle","DialogContent","paragraph","strong","requestedBy","userId","planTier","mt","p","bgcolor","borderRadius","TextField","label","onChange","target","disabled","autoFocus","DialogActions","Button","startIcon","CircularProgress","size","EntityApiApprovalTab","kuadrantApi","useApi","kuadrantApiRef","identityApi","identityApiRef","alertApi","alertApiRef","apiProductName","annotations","namespace","refresh","setRefresh","dialogState","setDialogState","allowed","canApprove","loading","permissionLoading","error","permissionError","useKuadrantPermission","kuadrantApiKeyApprovePermission","useAsync","async","reviewedBy","getBackstageIdentity","userEntityRef","requests","getRequests","items","filter","r","apiProductRef","Array","map","_","i","Skeleton","width","ResponseErrorPanel","message","textAlign","pendingRequests","status","phase","approvedRequests","rejectedRequests","columns","title","field","render","row","Chip","style","getApprovalQueueStatusChipStyle","creationTimestamp","Date","toLocaleDateString","filtering","display","gap","Tooltip","IconButton","CheckCircleIcon","CancelIcon","detailPanelConfig","data","rowData","mb","length","Table","options","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","item","id","detailPanel","prev","isApprove","requestFn","ns","n","approveRequest","rejectRequest","post","severity","err","console","errorMessage"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"static/6800.a45da2f4.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-catalog-react/dist/hooks/useEntity.esm.js","webpack://internal.plugin-kuadrant/./src/components/EntityApiApprovalTab/EntityApiApprovalTab.tsx"],"sourcesContent":["import { jsx } from 'react/jsx-runtime';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { AnalyticsContext } from '@backstage/core-plugin-api';\nimport { createVersionedContext, useVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';\n\nconst NewEntityContext = createVersionedContext(\n \"entity-context\"\n);\nconst AsyncEntityProvider = (props) => {\n const { children, entity, loading, error, refresh } = props;\n const value = { entity, loading, error, refresh };\n return /* @__PURE__ */ jsx(NewEntityContext.Provider, { value: createVersionedValueMap({ 1: value }), children: /* @__PURE__ */ jsx(\n AnalyticsContext,\n {\n attributes: {\n ...entity ? { entityRef: stringifyEntityRef(entity) } : void 0\n },\n children\n }\n ) });\n};\nconst EntityProvider = (props) => /* @__PURE__ */ jsx(\n AsyncEntityProvider,\n {\n entity: props.entity,\n loading: !Boolean(props.entity),\n error: void 0,\n refresh: void 0,\n children: props.children\n }\n);\nfunction useEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n if (!value.entity) {\n throw new Error(\n \"useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.\"\n );\n }\n return { entity: value.entity };\n}\nfunction useAsyncEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n const { entity, loading, error, refresh } = value;\n return { entity, loading, error, refresh };\n}\n\nexport { AsyncEntityProvider, EntityProvider, useAsyncEntity, useEntity };\n//# sourceMappingURL=useEntity.esm.js.map\n","import React, { useState } from \"react\";\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport {\n useApi,\n identityApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { kuadrantApiRef } from '../../api';\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n ResponseErrorPanel,\n} from \"@backstage/core-components\";\nimport { kuadrantApiKeyApprovePermission } from \"../../permissions\";\nimport { useKuadrantPermission } from \"../../utils/permissions\";\nimport {\n Box,\n Typography,\n Chip,\n IconButton,\n Tooltip,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n CircularProgress,\n makeStyles,\n} from \"@material-ui/core\";\nimport { Skeleton } from \"@material-ui/lab\";\nimport CheckCircleIcon from \"@material-ui/icons/CheckCircle\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport { APIKey } from \"../../types/api-management\";\nimport { getApprovalQueueStatusChipStyle } from \"../../utils/styles\";\n\nconst useStyles = makeStyles((theme) => ({\n useCasePanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n useCaseLabel: {\n fontWeight: 600,\n marginBottom: theme.spacing(1),\n color: theme.palette.text.secondary,\n textTransform: \"uppercase\",\n fontSize: \"0.75rem\",\n },\n}));\n\ninterface ExpandedRowProps {\n request: APIKey;\n}\n\nconst ExpandedRowContent = ({ request }: ExpandedRowProps) => {\n const classes = useStyles();\n\n return (\n <Box className={classes.useCasePanel} onClick={(e) => e.stopPropagation()}>\n <Typography className={classes.useCaseLabel}>Use Case</Typography>\n <Typography variant=\"body2\">\n {request.spec.useCase || \"No use case provided\"}\n </Typography>\n </Box>\n );\n};\n\ninterface ApprovalDialogProps {\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n onClose: () => void;\n onConfirm: (confirmText: string) => void;\n}\n\nconst ApprovalDialog = ({\n open,\n request,\n action,\n processing,\n onClose,\n onConfirm,\n}: ApprovalDialogProps) => {\n const [confirmText, setConfirmText] = useState(\"\");\n\n const handleClose = () => {\n setConfirmText(\"\");\n onClose();\n };\n\n const handleConfirm = () => {\n onConfirm(confirmText);\n setConfirmText(\"\");\n };\n\n const isReject = action === \"reject\";\n const expectedText = request?.metadata.name || \"\";\n const isConfirmValid = confirmText === expectedText;\n\n return (\n <Dialog\n open={open}\n onClose={processing ? undefined : handleClose}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>\n {isReject ? \"Reject API key\" : \"Approve API key\"}\n </DialogTitle>\n <DialogContent>\n {request && (\n <>\n <Typography variant=\"body2\" paragraph>\n <strong>Requester:</strong> {request.spec.requestedBy.userId}\n </Typography>\n <Typography variant=\"body2\" paragraph>\n <strong>Tier:</strong> {request.spec.planTier}\n </Typography>\n {request.spec.useCase && (\n <Typography variant=\"body2\" paragraph>\n <strong>Use Case:</strong> {request.spec.useCase}\n </Typography>\n )}\n {isReject && (\n <Box mt={2} p={2} bgcolor=\"error.light\" borderRadius={1}>\n <Typography variant=\"body2\">\n This action will permanently deny access. The user will need\n to submit a new request.\n </Typography>\n </Box>\n )}\n <Box mt={2}>\n <TextField\n fullWidth\n label={`Type \"${expectedText}\" to confirm`}\n value={confirmText}\n onChange={(e) => setConfirmText(e.target.value)}\n disabled={processing}\n autoFocus\n />\n </Box>\n </>\n )}\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} disabled={processing}>\n Cancel\n </Button>\n <Button\n onClick={handleConfirm}\n color={isReject ? \"secondary\" : \"primary\"}\n variant=\"contained\"\n disabled={!isConfirmValid || processing}\n startIcon={\n processing ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {processing\n ? isReject\n ? \"Rejecting...\"\n : \"Approving...\"\n : isReject\n ? \"Reject\"\n : \"Approve\"}\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport const EntityApiApprovalTab = () => {\n const { entity } = useEntity();\n const kuadrantApi = useApi(kuadrantApiRef);\n const identityApi = useApi(identityApiRef);\n const alertApi = useApi(alertApiRef);\n\n const apiProductName =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] || \"default\";\n\n const [refresh, setRefresh] = useState(0);\n const [dialogState, setDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n action: \"approve\" | \"reject\";\n processing: boolean;\n }>({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n\n const {\n allowed: canApprove,\n loading: permissionLoading,\n error: permissionError,\n } = useKuadrantPermission(kuadrantApiKeyApprovePermission);\n\n const { value, loading, error } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const reviewedBy = identity.userEntityRef;\n\n const data = await kuadrantApi.getRequests();\n const allRequests: APIKey[] = data.items || [];\n\n // filter to this API product only\n const filtered = allRequests.filter(\n (r) =>\n r.spec.apiProductRef?.name === apiProductName &&\n r.metadata.namespace === namespace,\n );\n\n return { requests: filtered, reviewedBy };\n }, [kuadrantApi, identityApi, apiProductName, namespace, refresh]);\n\n const handleApprove = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"approve\",\n processing: false,\n });\n };\n\n const handleReject = (request: APIKey) => {\n setDialogState({\n open: true,\n request,\n action: \"reject\",\n processing: false,\n });\n };\n\n const handleConfirm = async () => {\n if (!dialogState.request || !value) return;\n\n setDialogState((prev) => ({ ...prev, processing: true }));\n\n const isApprove = dialogState.action === \"approve\"\n const requestFn = isApprove\n ? (ns: string, n: string, r: string) => kuadrantApi.approveRequest(ns, n, r)\n : (ns: string, n: string, r: string) => kuadrantApi.rejectRequest(ns, n, r)\n\n try {\n await requestFn(dialogState.request.metadata.namespace, dialogState.request.metadata.name, value.reviewedBy);\n\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n });\n setRefresh((r) => r + 1);\n alertApi.post({\n message: `API key ${isApprove ? \"approved\" : \"rejected\"}`,\n severity: \"success\",\n display: \"transient\",\n });\n } catch (err) {\n console.error(`Error ${dialogState.action}ing request:`, err);\n setDialogState((prev) => ({ ...prev, processing: false }));\n const errorMessage = err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to ${dialogState.action} APIKey. ${errorMessage}`,\n severity: 'error',\n display: 'transient',\n });\n }\n };\n\n if (loading || permissionLoading) {\n return (\n <Box p={2}>\n {[...Array(5)].map((_, i) => (\n <Box key={i} p={2}>\n <Skeleton variant=\"text\" width=\"100%\" />\n </Box>\n ))}\n </Box>\n );\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n </Box>\n );\n }\n\n if (!canApprove) {\n return (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n You don't have permission to view the approval queue for this API.\n </Typography>\n </Box>\n );\n }\n\n const requests = value?.requests || [];\n const pendingRequests = requests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = requests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = requests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const columns: TableColumn<APIKey>[] = [\n {\n title: \"Requester\",\n field: \"spec.requestedBy.userId\",\n render: (row) => (\n <Typography variant=\"body2\">{row.spec.requestedBy.userId}</Typography>\n ),\n },\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n const label = phase === \"Approved\" ? \"Active\" : phase;\n return (\n <Chip label={label} size=\"small\" style={getApprovalQueueStatusChipStyle(phase)} />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row) => (\n <Chip label={row.spec.planTier} size=\"small\" variant=\"outlined\" />\n ),\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row) => {\n if (!row.metadata.creationTimestamp)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.metadata.creationTimestamp).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"Actions\",\n filtering: false,\n render: (row) => {\n const phase = row.status?.phase || \"Pending\";\n if (phase !== \"Pending\") return null;\n return (\n <Box display=\"flex\" style={{ gap: 4 }}>\n <Tooltip title=\"Approve\">\n <IconButton size=\"small\" onClick={() => handleApprove(row)}>\n <CheckCircleIcon color=\"primary\" />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Reject\">\n <IconButton size=\"small\" onClick={() => handleReject(row)}>\n <CancelIcon color=\"error\" />\n </IconButton>\n </Tooltip>\n </Box>\n );\n },\n },\n ];\n\n const detailPanelConfig = [\n {\n render: (data: any) => {\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) return <Box />;\n return <ExpandedRowContent request={request} />;\n },\n },\n ];\n\n return (\n <Box p={2}>\n <Box mb={2}>\n <Typography variant=\"body2\" color=\"textSecondary\">\n {pendingRequests.length} pending, {approvedRequests.length} approved,{\" \"}\n {rejectedRequests.length} rejected\n </Typography>\n </Box>\n\n {requests.length === 0 ? (\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys for this API.\n </Typography>\n </Box>\n ) : (\n <Table\n options={{\n paging: requests.length > 10,\n pageSize: 20,\n search: true,\n filtering: false,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={columns}\n data={requests.map((item) => ({ ...item, id: item.metadata.name }))}\n detailPanel={detailPanelConfig}\n />\n )}\n\n <ApprovalDialog\n open={dialogState.open}\n request={dialogState.request}\n action={dialogState.action}\n processing={dialogState.processing}\n onClose={() =>\n setDialogState({\n open: false,\n request: null,\n action: \"approve\",\n processing: false,\n })\n }\n onConfirm={handleConfirm}\n />\n </Box>\n );\n};\n"],"names":["useEntity","versionedHolder","useVersionedContext","Error","value","atVersion","entity","createVersionedContext","useStyles","makeStyles","theme","useCasePanel","padding","spacing","backgroundColor","palette","background","default","useCaseLabel","fontWeight","marginBottom","color","text","secondary","textTransform","fontSize","ExpandedRowContent","request","classes","Box","className","onClick","e","stopPropagation","Typography","variant","spec","useCase","ApprovalDialog","open","action","processing","onClose","onConfirm","confirmText","setConfirmText","useState","handleClose","isReject","expectedText","metadata","name","isConfirmValid","Dialog","undefined","maxWidth","fullWidth","DialogTitle","DialogContent","paragraph","strong","requestedBy","userId","planTier","mt","p","bgcolor","borderRadius","TextField","label","onChange","target","disabled","autoFocus","DialogActions","Button","startIcon","CircularProgress","size","EntityApiApprovalTab","kuadrantApi","useApi","kuadrantApiRef","identityApi","identityApiRef","alertApi","alertApiRef","apiProductName","annotations","namespace","refresh","setRefresh","dialogState","setDialogState","allowed","canApprove","loading","permissionLoading","error","permissionError","useKuadrantPermission","kuadrantApiKeyApprovePermission","useAsync","async","reviewedBy","getBackstageIdentity","userEntityRef","requests","getRequests","items","filter","r","apiProductRef","Array","map","_","i","Skeleton","width","ResponseErrorPanel","message","textAlign","pendingRequests","status","phase","approvedRequests","rejectedRequests","columns","title","field","render","row","Chip","style","getApprovalQueueStatusChipStyle","creationTimestamp","Date","toLocaleDateString","filtering","display","gap","Tooltip","IconButton","CheckCircleIcon","CancelIcon","detailPanelConfig","data","rowData","mb","length","Table","options","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","item","id","detailPanel","prev","isApprove","requestFn","ns","n","approveRequest","rejectRequest","post","severity","err","console","errorMessage"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[6972],{46972:(e,t,n)=>{n.r(t),n.d(t,{AnalyticsContext:()=>c,AnalyticsImplementationBlueprint:()=>N,ApiBlueprint:()=>V,AppRootElementBlueprint:()=>q,AppRootWrapperBlueprint:()=>L,ErrorDisplay:()=>te,ExtensionBoundary:()=>ce,IconBundleBlueprint:()=>_,NavContentBlueprint:()=>H,NavItemBlueprint:()=>J,NotFoundErrorPage:()=>ee,PageBlueprint:()=>ue,Progress:()=>Z,RouterBlueprint:()=>le,SessionState:()=>p.SessionState,SignInPageBlueprint:()=>he,SwappableComponentBlueprint:()=>we,ThemeBlueprint:()=>me,TranslationBlueprint:()=>Re,alertApiRef:()=>p.alertApiRef,analyticsApiRef:()=>u,appThemeApiRef:()=>p.appThemeApiRef,appTreeApiRef:()=>h,atlassianAuthApiRef:()=>p.atlassianAuthApiRef,bitbucketAuthApiRef:()=>p.bitbucketAuthApiRef,bitbucketServerAuthApiRef:()=>p.bitbucketServerAuthApiRef,configApiRef:()=>p.configApiRef,coreExtensionData:()=>G,createApiFactory:()=>p.createApiFactory,createApiRef:()=>p.createApiRef,createExtension:()=>I,createExtensionBlueprint:()=>B,createExtensionBlueprintParams:()=>C,createExtensionDataRef:()=>w,createExtensionInput:()=>Me,createExternalRouteRef:()=>Ie,createFrontendFeatureLoader:()=>Le,createFrontendModule:()=>ze,createFrontendPlugin:()=>qe,createRouteRef:()=>Ee,createSubRouteRef:()=>je,createSwappableComponent:()=>Y,createTranslationMessages:()=>Fe.W,createTranslationRef:()=>Be.h,createTranslationResource:()=>De.o,dialogApiRef:()=>y,discoveryApiRef:()=>p.discoveryApiRef,errorApiRef:()=>p.errorApiRef,featureFlagsApiRef:()=>p.featureFlagsApiRef,fetchApiRef:()=>p.fetchApiRef,githubAuthApiRef:()=>p.githubAuthApiRef,gitlabAuthApiRef:()=>p.gitlabAuthApiRef,googleAuthApiRef:()=>p.googleAuthApiRef,iconsApiRef:()=>m,identityApiRef:()=>p.identityApiRef,microsoftAuthApiRef:()=>p.microsoftAuthApiRef,oauthRequestApiRef:()=>p.oauthRequestApiRef,oktaAuthApiRef:()=>p.oktaAuthApiRef,oneloginAuthApiRef:()=>p.oneloginAuthApiRef,routeResolutionApiRef:()=>R,storageApiRef:()=>p.storageApiRef,swappableComponentsApiRef:()=>g,useAnalytics:()=>f,useApi:()=>p.useApi,useApiHolder:()=>p.useApiHolder,useAppNode:()=>ae,useRouteRef:()=>Ce,useRouteRefParams:()=>Oe,useTranslationRef:()=>Ne.i,vmwareCloudAuthApiRef:()=>p.vmwareCloudAuthApiRef,withApis:()=>p.withApis});var i=n(31085),o=n(15427),r=n(95478);const a=(0,o.createVersionedContext)("analytics-context"),s=()=>{const e=(0,r.useContext)(a);if(void 0===e)return{pluginId:"app",extensionId:"app"};const t=e.atVersion(1);if(void 0===t)throw new Error("No context found for version 1.");return t},c=e=>{const{attributes:t,children:n}=e,r={...s(),...t},c=(0,o.createVersionedValueMap)({1:r});return(0,i.jsx)(a.Provider,{value:c,children:n})};var p=n(22097);const u=(0,p.createApiRef)({id:"core.analytics"}),d=(0,o.getOrCreateGlobalSingleton)("core-plugin-api:analytics-tracker-events",()=>({mostRecentGatheredNavigation:void 0,mostRecentRoutableExtensionRender:void 0,beforeUnloadRegistered:!1}));class l{constructor(e,t={pluginId:"root",extensionId:"App"}){this.analyticsApi=e,this.context=t,d.beforeUnloadRegistered||(addEventListener("beforeunload",()=>{d.mostRecentGatheredNavigation&&(this.analyticsApi.captureEvent({...d.mostRecentGatheredNavigation,...d.mostRecentRoutableExtensionRender}),d.mostRecentGatheredNavigation=void 0,d.mostRecentRoutableExtensionRender=void 0)},{once:!0,passive:!0}),d.beforeUnloadRegistered=!0)}setContext(e){this.context=e}captureEvent(e,t,{value:n,attributes:i}={}){const o=this.context;if("_ROUTABLE-EXTENSION-RENDERED"!==e){if(d.mostRecentGatheredNavigation){try{this.analyticsApi.captureEvent({...d.mostRecentGatheredNavigation,...d.mostRecentRoutableExtensionRender})}catch(e){console.warn("Error during analytics event capture. %o",e)}d.mostRecentGatheredNavigation=void 0,d.mostRecentRoutableExtensionRender=void 0}if("navigate"!==e||"root"!==o.pluginId)try{this.analyticsApi.captureEvent({action:e,subject:t,value:n,attributes:i,context:o})}catch(e){console.warn("Error during analytics event capture. %o",e)}else d.mostRecentGatheredNavigation={action:e,subject:t,value:n,attributes:i,context:o}}else d.mostRecentGatheredNavigation&&(d.mostRecentRoutableExtensionRender={context:{...o,extensionId:"App"}})}}function f(){const e=(0,r.useRef)(null),t=s(),n=function(){try{return(0,p.useApi)(u)}catch(e){if("NotImplementedError"===e.name)return{captureEvent:()=>{}};throw e}}(),i=(null===e.current&&(e.current=new l(n)),e.current);return i.setContext(t),i}const h=(0,p.createApiRef)({id:"core.app-tree"}),g=(0,p.createApiRef)({id:"core.swappable-components"}),m=(0,p.createApiRef)({id:"core.icons"}),y=(0,p.createApiRef)({id:"core.dialog"}),R=(0,p.createApiRef)({id:"core.route-resolution"});var v=n(20569);function w(){const e=e=>Object.assign(t=>({$$type:"@backstage/ExtensionDataValue",id:e,value:t}),{id:e,$$type:"@backstage/ExtensionDataRef",config:{},optional(){return{...this,config:{...this.config,optional:!0}}},toString(){const t=Boolean(this.config.optional);return`ExtensionDataRef{id=${e},optional=${t}}`}});return{with:t=>e(t.id)}}function b(e,t,n){if("object"!=typeof e||!e?.[Symbol.iterator])throw new Error(`${t} did not provide an iterable object`);const i=new Map,o=n&&new Map(n.map(e=>[e.id,e]));for(const t of e){if(o&&!o.delete(t.id))throw new Error(`extension data '${t.id}' was provided but not declared`);i.set(t.id,t)}const r=o&&Array.from(o.values()).filter(e=>!e.config.optional);if(r&&r.length>0)throw new Error(`missing required extension data value(s) '${r.map(e=>e.id).join(", ")}'`);return{get:e=>i.get(e.id)?.value,[Symbol.iterator]:()=>i.values()}}function A(e){return e}function x(e){return e}function $(e,t,n){if(!e||!t||!n)return t;const i={};for(const o in e){if(!Object.hasOwn(e,o))continue;const r=e[o],a=n[o];if(r.config.singleton){const e=x(t[o]);if(a){const t=b(a,"extension input override",r.extensionData);if(!e)throw new Error(`attempted to override data of input '${o}' but it is not present in the original inputs`);i[o]=Object.assign(t,{node:e.node})}}else{const e=A(t[o]);if(!Array.isArray(a))throw new Error(`override data provided for input '${o}' must be an array`);if(0===a.length)i[o]=[];else{const t=a.filter(e=>"node"in e).length;if(0===t){if(e.length!==a.length)throw new Error(`override data provided for input '${o}' must match the length of the original inputs`);i[o]=a.map((t,n)=>{const i=b(t,"extension input override",r.extensionData);return Object.assign(i,{node:e[n].node})})}else{if(t!==a.length)throw new Error(`override data for input '${o}' may not mix forwarded inputs with data overrides`);i[o]=a}}}}return i}var E=n(33587);function k(e){if("invalid_union"===e.code)return k(e.unionErrors[0].issues[0]);let t=e.message;return"Required"===t&&(t="Missing required value"),e.path.length&&(t+=` at '${e.path.join(".")}'`),t}class T{static create(e){return new T(e.type,new Set(e.versions))}#e;#t;constructor(e,t){this.#e=e,this.#t=t}TPublic=void 0;TInternal=void 0;isType=e=>this.#n(e);toInternal=e=>{if(!this.#n(e))throw new TypeError(`Invalid opaque type, expected '${this.#e}', but got '${this.#i(e)}'`);if(!this.#t.has(e.version)){const t=Array.from(this.#t).map(this.#o);t.length>1&&(t[t.length-1]=`or ${t[t.length-1]}`);const n=t.length>2?t.join(", "):t.join(" ");throw new TypeError(`Invalid opaque type instance, got version ${this.#o(e.version)}, expected ${n}`)}return e};createInstance(e,t){return Object.assign(t,{$$type:this.#e,...e&&{version:e}})}#n(e){return null!==e&&"object"==typeof e&&e.$$type===this.#e}#i(e){return"object"!=typeof e?`<${typeof e}>`:null===e?"<null>":String("$$type"in e?e.$$type:e)}#o=e=>e?`'${e}'`:"undefined"}const j=T.create({type:"@backstage/ExtensionDefinition",versions:["v1","v2"]}),S=Symbol("params");function I(e){const t=e.config?.schema,n=t&&function(){const e=(n=E).object(Object.fromEntries(Object.entries(t).map(([e,t])=>[e,t(n)])));var n;return{parse:t=>{const n=e.safeParse(t);if(n.success)return n.data;throw new Error(n.error.issues.map(k).join("; "))},schema:(0,v.Ay)(e)}}();return j.createInstance("v2",{T:void 0,kind:e.kind,name:e.name,attachTo:e.attachTo,disabled:e.disabled??!1,inputs:e.inputs??{},output:e.output,configSchema:n,factory:e.factory,toString(){const t=[];return e.kind&&t.push(`kind=${e.kind}`),e.name&&t.push(`name=${e.name}`),t.push(`attachTo=${[e.attachTo].flat().map(e=>`${e.id}@${e.input}`).join("+")}`),`ExtensionDefinition{${t.join(",")}}`},override(t){if(!Array.isArray(e.output))throw new Error("Cannot override an extension that is not declared using the new format with outputs as an array");if(t.output&&!t.factory)throw new Error("Refused to override output without also overriding factory");if(t.params&&t.factory)throw new Error("Refused to override params and factory at the same time");return I({kind:e.kind,name:e.name,attachTo:t.attachTo??e.attachTo,disabled:t.disabled??e.disabled,inputs:{...t.inputs,...e.inputs},output:t.output??e.output,config:e.config||t.config?{schema:{...e.config?.schema,...t.config?.schema}}:void 0,factory:({node:n,apis:i,config:o,inputs:r})=>{if(!t.factory)return e.factory({node:n,apis:i,config:o,inputs:r,[S]:t.params});const a=t.factory(t=>b(e.factory({node:n,apis:i,config:t?.config??o,inputs:$(e.inputs,r,t?.inputs),[S]:t?.params}),"original extension factory",e.output),{node:n,apis:i,config:o,inputs:r});if("object"!=typeof a||!a?.[Symbol.iterator])throw new Error("extension factory override did not provide an iterable object");const s=new Map;for(const e of a)s.set(e.id,e);return s.values()}})}})}const P=T.create({type:"@backstage/BlueprintParams",versions:["v1"]});function C(e){return P.createInstance("v1",{T:null,params:e})}function O(e,t,n){const i=e(t);try{return P.toInternal(i).params}catch(e){throw new TypeError(`Invalid invocation of blueprint with kind '${n}', the parameter definition callback function did not return a valid parameter definition object; Caused by: ${e.message}`)}}function F(e,t,n,i){const o=t[S];if(n){if(o){if("function"!=typeof o)throw new TypeError(`Invalid extension override of blueprint with kind '${i}', the override params were passed as a plain object, but this blueprint requires them to be passed in callback form`);return O(o,n,i)}if("function"!=typeof e)throw new TypeError(`Invalid invocation of blueprint with kind '${i}', the parameters where passed as a plain object, but this blueprint requires them to be passed in callback form`);return O(e,n,i)}return{..."function"==typeof e?O(e,C,i):e,..."function"==typeof o?O(o,C,i):o}}function B(e){const t=e.defineParams;return{dataRefs:e.dataRefs,make:n=>I({kind:e.kind,name:n.name,attachTo:n.attachTo??e.attachTo,disabled:n.disabled??e.disabled,inputs:e.inputs,output:e.output,config:e.config,factory:i=>e.factory(F(n.params,i,t,e.kind),i)}),makeWithOverrides:n=>I({kind:e.kind,name:n.name,attachTo:n.attachTo??e.attachTo,disabled:n.disabled??e.disabled,inputs:{...n.inputs,...e.inputs},output:n.output??e.output,config:e.config||n.config?{schema:{...e.config?.schema,...n.config?.schema}}:void 0,factory:i=>{const{node:o,config:r,inputs:a,apis:s}=i;return n.factory((n,c)=>b(e.factory(F(n,i,t,e.kind),{apis:s,node:o,config:c?.config??r,inputs:$(e.inputs,a,c?.inputs)}),"original blueprint factory",e.output),{apis:s,node:o,config:r,inputs:a})}})}}const D=w().with({id:"core.analytics.factory"}),N=B({kind:"analytics",attachTo:[{id:"api:app/analytics",input:"implementations"}],output:[D],dataRefs:{factory:D},defineParams:e=>C(e),*factory(e){yield D(e)}}),M=w().with({id:"core.api.factory"}),V=B({kind:"api",attachTo:{id:"root",input:"apis"},output:[M],dataRefs:{factory:M},defineParams:e=>C(e),*factory(e){yield M(e)}}),G={reactElement:w().with({id:"core.reactElement"}),routePath:w().with({id:"core.routing.path"}),routeRef:w().with({id:"core.routing.ref"})},q=B({kind:"app-root-element",attachTo:{id:"app/root",input:"elements"},output:[G.reactElement],*factory(e){yield G.reactElement(e.element)}}),z=w().with({id:"app.root.wrapper"}),L=B({kind:"app-root-wrapper",attachTo:{id:"app/root",input:"wrappers"},output:[z],dataRefs:{component:z},*factory(e){yield z(e.component)}}),U=w().with({id:"core.icons"}),_=B({kind:"icon-bundle",attachTo:{id:"api:app/icons",input:"icons"},output:[U],factory:e=>[U(e.icons)],dataRefs:{icons:U}}),W=w().with({id:"core.nav-content.component"}),H=B({kind:"nav-content",attachTo:{id:"app/nav",input:"content"},output:[W],dataRefs:{component:W},*factory(e){yield W(e.component)}}),X=w().with({id:"core.nav-item.target"}),J=B({kind:"nav-item",attachTo:{id:"app/nav",input:"items"},output:[X],dataRefs:{target:X},factory:({icon:e,routeRef:t,title:n},{config:i})=>[X({title:i.title??n,icon:e,routeRef:t})],config:{schema:{title:e=>e.string().optional()}}}),K=T.create({versions:["v1"],type:"@backstage/SwappableComponentRef"}),Q=()=>{try{return(0,p.useApi)(g)}catch(e){return}};function Y(e){const t=t=>(0,i.jsx)("div",{"data-testid":e.id,...t}),n=K.createInstance("v1",{id:e.id,TProps:null,TExternalProps:null,toString:()=>`SwappableComponentRef{id=${e.id}}`,defaultComponent:(0,r.lazy)(async()=>({default:await(e.loader?.())??t})),transformProps:e.transformProps}),o=e=>{const t=Q();if(!t){const t=K.toInternal(n),o=t.defaultComponent,r=t.transformProps?.(e)??e;return(0,i.jsx)(o,{...r})}const o=t.getComponent(n);return(0,i.jsx)(o,{...e})};return Object.assign(o,{ref:n}),o}const Z=Y({id:"core-progress"}),ee=Y({id:"core-not-found-error-page"}),te=Y({id:"core-error-display",loader:()=>e=>(0,i.jsx)("div",{"data-testid":"core-error-display",children:e.error.message})});class ne extends r.Component{static getDerivedStateFromError(e){return{error:e}}state={error:void 0};handleErrorReset=()=>{this.setState({error:void 0})};render(){const{error:e}=this.state,{plugin:t,children:n}=this.props;return e?(0,i.jsx)(te,{plugin:t,error:e,resetError:this.handleErrorReset}):n}}(0,o.getOrCreateGlobalSingleton)("core-plugin-api:analytics-tracker-events",()=>({mostRecentGatheredNavigation:void 0,mostRecentRoutableExtensionRender:void 0,beforeUnloadRegistered:!1}));const ie="app-node-context",oe=(0,o.createVersionedContext)(ie);function re({node:e,children:t}){const n=(0,o.createVersionedValueMap)({1:{node:e}});return(0,i.jsx)(oe.Provider,{value:n,children:t})}function ae(){const e=(0,o.useVersionedContext)(ie);if(!e)return;const t=e.atVersion(1);if(!t)throw new Error("AppNodeContext v1 not available");return t.node}const se=e=>{const{enabled:t,children:n}=e,o=(0,p.useAnalytics)();return(0,r.useEffect)(()=>{t&&o.captureEvent("_ROUTABLE-EXTENSION-RENDERED","")},[o,t]),(0,i.jsx)(i.Fragment,{children:n})};function ce(e){const{node:t,children:n}=e,o=Boolean(t.instance?.getData(G.routePath)),a=t.spec.plugin,s={extensionId:t.spec.id,pluginId:t.spec.plugin?.id??"app"};return(0,i.jsx)(re,{node:t,children:(0,i.jsx)(r.Suspense,{fallback:(0,i.jsx)(Z,{}),children:(0,i.jsx)(ne,{plugin:a,children:(0,i.jsx)(p.AnalyticsContext,{attributes:s,children:(0,i.jsx)(se,{enabled:o,children:n})})})})})}var pe;(pe=ce||(ce={})).lazy=function(e,t){const n=(0,r.lazy)(()=>t().then(e=>({default:()=>e})));return(0,i.jsx)(pe,{node:e,children:(0,i.jsx)(n,{})})},pe.lazyComponent=function(e,t){const n=(0,r.lazy)(()=>t().then(e=>({default:e})));return t=>(0,i.jsx)(pe,{node:e,children:(0,i.jsx)(n,{...t})})};const ue=B({kind:"page",attachTo:{id:"app/routes",input:"routes"},output:[G.routePath,G.reactElement,G.routeRef.optional()],config:{schema:{path:e=>e.string().optional()}},*factory(e,{config:t,node:n}){yield G.routePath(t.path??e.path),yield G.reactElement(ce.lazy(n,e.loader)),e.routeRef&&(yield G.routeRef(e.routeRef))}}),de=w().with({id:"app.router.wrapper"}),le=B({kind:"app-router-component",attachTo:{id:"app/root",input:"router"},output:[de],dataRefs:{component:de},*factory(e){yield de(e.component)}}),fe=w().with({id:"core.sign-in-page.component"}),he=B({kind:"sign-in-page",attachTo:{id:"app/root",input:"signInPage"},output:[fe],dataRefs:{component:fe},*factory({loader:e},{node:t}){const n=(0,r.lazy)(()=>e().then(e=>({default:e})));yield fe(e=>(0,i.jsx)(ce,{node:t,children:(0,i.jsx)(n,{...e})}))}}),ge=w().with({id:"core.theme.theme"}),me=B({kind:"theme",attachTo:{id:"api:app/app-theme",input:"themes"},output:[ge],dataRefs:{theme:ge},factory:({theme:e})=>[ge(e)]}),ye=w().with({id:"core.translation.translation"}),Re=B({kind:"translation",attachTo:{id:"api:app/translations",input:"translations"},output:[ye],dataRefs:{translation:ye},factory:({resource:e})=>[ye(e)]}),ve=w().with({id:"core.swappableComponent"}),we=B({kind:"component",attachTo:{id:"api:app/swappable-components",input:"components"},output:[ve],dataRefs:{component:ve},defineParams:e=>C(e),factory:e=>[ve({ref:e.component.ref,loader:e.loader})]}),be="eHgtF5hmbrXyiEvo";function Ae(e=Error){const{stack:t}=new e(be);if(!t)return"<unknown>";const n=t.includes(be)?t.indexOf("\n")+1:0,i=t.indexOf("\n",t.indexOf("\n",n)+1)+1,o=t.indexOf("\n",i),r=t.substring(i,o).trim();return r?r.includes("(")?r.substring(r.indexOf("(")+1,r.indexOf(")")):r.includes("@")?r.substring(r.indexOf("@")+1):r:"unknown"}function xe(e){const t=e;if("@backstage/RouteRef"!==t.$$type)throw new Error(`Invalid RouteRef, bad type '${t.$$type}'`);return t}class $e{constructor(e=[],t,n){this.params=e,this.#r=e,this.#a=t,this.#s=n}$$type="@backstage/RouteRef";version="v1";#c;#r;#a;#s;getParams(){return this.#r}get alias(){return this.#s}getDescription(){return this.#c?this.#c:`created at '${this.#a}'`}get#p(){return this.$$type.slice(11)}setId(e){if(!e)throw new Error(`${this.#p} id must be a non-empty string`);if(this.#c&&this.#c!==e)throw new Error(`${this.#p} was referenced twice as both '${this.#c}' and '${e}'`);this.#c=e}toString(){return`${this.#p}{${this.getDescription()}}`}}function Ee(e){return new $e(e?.params,Ae(),e?.aliasFor)}const ke=/^\w+$/;class Te{constructor(e,t,n){this.path=e,this.#r=t,this.#u=n}$$type="@backstage/SubRouteRef";version="v1";#r;#u;getParams(){return this.#r}getParent(){return this.#u}getDescription(){const e=xe(this.#u);return`at ${this.path} with parent ${e.getDescription()}`}toString(){return`SubRouteRef{${this.getDescription()}}`}}function je(e){const{path:t,parent:n}=e,i=xe(n).getParams(),o=t.split("/").filter(e=>e.startsWith(":")).map(e=>e.substring(1)),r=[...i,...o];if(i.some(e=>o.includes(e)))throw new Error("SubRouteRef may not have params that overlap with its parent");if(!t.startsWith("/"))throw new Error(`SubRouteRef path must start with '/', got '${t}'`);if(t.endsWith("/"))throw new Error(`SubRouteRef path must not end with '/', got '${t}'`);for(const e of o)if(!ke.test(e))throw new Error(`SubRouteRef path has invalid param, got '${e}'`);return new Te(t,r,n)}class Se extends $e{constructor(e=[],t,n){super(e,n),this.params=e,this.defaultTarget=t}$$type="@backstage/ExternalRouteRef";getDefaultTarget(){return this.defaultTarget}}function Ie(e){return new Se(e?.params,e?.defaultTarget,Ae())}var Pe=n(49634);function Ce(e){const{pathname:t}=(0,Pe.useLocation)(),n=(0,p.useApi)(R);return(0,r.useMemo)(()=>n.resolve(e,{sourcePath:t}),[n,e,t])}function Oe(e){return(0,Pe.useParams)()}var Fe=n(70796),Be=n(92821),De=n(46184),Ne=n(67550);function Me(e,t){return{$$type:"@backstage/ExtensionInput",extensionData:e,config:{singleton:Boolean(t?.singleton),optional:Boolean(t?.optional)},replaces:t?.replaces}}function Ve(e,t){const n=j.toInternal(e),{name:i,kind:o,namespace:r,override:a,...s}=n,c=n.namespace??t?.namespace,p=i&&c?`${c}/${i}`:c||i;if(!p)throw new Error(`Extension must declare an explicit namespace or name as it could not be resolved from context, kind=${o} namespace=${c} name=${i}`);const u=o?`${o}:${p}`:p;return{...s,$$type:"@backstage/Extension",version:n.version,id:u,toString:()=>`Extension{id=${u}}`}}const Ge=T.create({type:"@backstage/FrontendPlugin",versions:["v1"]});function qe(e){const t=e.pluginId,n=new Array,i=new Map;for(const o of e.extensions??[]){const e=j.toInternal(o),r=Ve(o,{namespace:t});n.push(r),i.set(r.id,{...e,namespace:t})}if(n.length!==i.size){const e=n.map(e=>e.id),i=Array.from(new Set(e.filter((t,n)=>e.indexOf(t)!==n)));throw new Error(`Plugin '${t}' provided duplicate extensions: ${i.join(", ")}`)}return Ge.createInstance("v1",{id:t,routes:e.routes??{},externalRoutes:e.externalRoutes??{},featureFlags:e.featureFlags??[],extensions:n,infoOptions:e.info,async info(){throw new Error(`Attempted to load plugin info for plugin '${t}', but the plugin instance is not installed in an app`)},getExtension(e){const n=i.get(e);if(!n)throw new Error(`Attempted to get non-existent extension '${e}' from plugin '${t}'`);return n},toString:()=>`Plugin{id=${t}}`,withOverrides(n){const i=new Set(n.extensions.map(e=>Ve(e,{namespace:t}).id)),o=(e.extensions??[]).filter(e=>!i.has(Ve(e,{namespace:t}).id));return qe({...e,pluginId:t,extensions:[...o,...n.extensions],info:{...e.info,...n.info}})}})}function ze(e){const{pluginId:t}=e,n=new Array,i=new Map;for(const o of e.extensions??[]){const e=j.toInternal(o),r=Ve(o,{namespace:t});n.push(r),i.set(r.id,{...e,namespace:t})}if(n.length!==i.size){const e=n.map(e=>e.id),i=Array.from(new Set(e.filter((t,n)=>e.indexOf(t)!==n)));throw new Error(`Plugin '${t}' provided duplicate extensions: ${i.join(", ")}`)}return{$$type:"@backstage/FrontendModule",version:"v1",pluginId:t,featureFlags:e.featureFlags??[],extensions:n,toString:()=>`Module{pluginId=${t}}`}}function Le(e){const t=`created at '${Ae()}'`;return{$$type:"@backstage/FrontendFeatureLoader",version:"v1",description:t,toString:()=>`FeatureLoader{description=${t}}`,async loader(t){const n=await e.loader(t),i=new Array;for await(const e of n)if(Ue(e))i.push(e);else{if(!("default"in e))throw new Error(`Invalid item "${e}"`);i.push(e.default)}return i}}}function Ue(e){return null!==e&&"object"==typeof e&&"$$type"in e&&("@backstage/FrontendPlugin"===e.$$type||"@backstage/FrontendModule"===e.$$type||"@backstage/FrontendFeatureLoader"===e.$$type)}}}]);
|
|
2
|
-
//# sourceMappingURL=6972.
|
|
2
|
+
//# sourceMappingURL=6972.f22b9446.chunk.js.map
|