@massdriver/backstage-plugin 1.0.0
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/LICENSE +202 -0
- package/README.md +196 -0
- package/dist/MassdriverRouter.esm.js +78 -0
- package/dist/MassdriverRouter.esm.js.map +1 -0
- package/dist/api.esm.js +119 -0
- package/dist/api.esm.js.map +1 -0
- package/dist/assets/massdriver-logo-dark.svg +55 -0
- package/dist/assets/massdriver-logo-light.svg +50 -0
- package/dist/components/AttributesColumn.esm.js +95 -0
- package/dist/components/AttributesColumn.esm.js.map +1 -0
- package/dist/components/AttributesSummaryCell.esm.js +103 -0
- package/dist/components/AttributesSummaryCell.esm.js.map +1 -0
- package/dist/components/AuthedIcon.esm.js +26 -0
- package/dist/components/AuthedIcon.esm.js.map +1 -0
- package/dist/components/ConditionsCell.esm.js +48 -0
- package/dist/components/ConditionsCell.esm.js.map +1 -0
- package/dist/components/DisabledAction.esm.js +30 -0
- package/dist/components/DisabledAction.esm.js.map +1 -0
- package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js +80 -0
- package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js.map +1 -0
- package/dist/components/EntityMassdriverContent/index.esm.js +6 -0
- package/dist/components/EntityMassdriverContent/index.esm.js.map +1 -0
- package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js +75 -0
- package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js.map +1 -0
- package/dist/components/EntityMassdriverOverviewCard/index.esm.js +6 -0
- package/dist/components/EntityMassdriverOverviewCard/index.esm.js.map +1 -0
- package/dist/components/ForkPill.esm.js +84 -0
- package/dist/components/ForkPill.esm.js.map +1 -0
- package/dist/components/InstanceStatusIndicator.esm.js +21 -0
- package/dist/components/InstanceStatusIndicator.esm.js.map +1 -0
- package/dist/components/InstanceStatusPill.esm.js +67 -0
- package/dist/components/InstanceStatusPill.esm.js.map +1 -0
- package/dist/components/MassdriverIcon.esm.js +13 -0
- package/dist/components/MassdriverIcon.esm.js.map +1 -0
- package/dist/components/MassdriverSidebarItem.esm.js +45 -0
- package/dist/components/MassdriverSidebarItem.esm.js.map +1 -0
- package/dist/components/NotFound.esm.js +44 -0
- package/dist/components/NotFound.esm.js.map +1 -0
- package/dist/components/OpenInMassdriverButton.esm.js +24 -0
- package/dist/components/OpenInMassdriverButton.esm.js.map +1 -0
- package/dist/components/PageLayout.esm.js +88 -0
- package/dist/components/PageLayout.esm.js.map +1 -0
- package/dist/components/RouterLinkAdapter.esm.js +12 -0
- package/dist/components/RouterLinkAdapter.esm.js.map +1 -0
- package/dist/components/VersionBadge.esm.js +57 -0
- package/dist/components/VersionBadge.esm.js.map +1 -0
- package/dist/components/grantColumns.esm.js +56 -0
- package/dist/components/grantColumns.esm.js.map +1 -0
- package/dist/components/icons/BundleIcon.esm.js +7 -0
- package/dist/components/icons/BundleIcon.esm.js.map +1 -0
- package/dist/components/icons/FolderOutlinedIcon.esm.js +7 -0
- package/dist/components/icons/FolderOutlinedIcon.esm.js.map +1 -0
- package/dist/components/icons/TokenIcon.esm.js +7 -0
- package/dist/components/icons/TokenIcon.esm.js.map +1 -0
- package/dist/entity.esm.js +23 -0
- package/dist/entity.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js +115 -0
- package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js +165 -0
- package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js +216 -0
- package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js +86 -0
- package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js +57 -0
- package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js.map +1 -0
- package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js +53 -0
- package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js +94 -0
- package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js +67 -0
- package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js +202 -0
- package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js +183 -0
- package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js +73 -0
- package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js +70 -0
- package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js.map +1 -0
- package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js +32 -0
- package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js.map +1 -0
- package/dist/features/environment/EnvironmentGraphPage.esm.js +131 -0
- package/dist/features/environment/EnvironmentGraphPage.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js +252 -0
- package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/GraphHeader.esm.js +247 -0
- package/dist/features/environment/GraphHeader/GraphHeader.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/HeaderActions.esm.js +127 -0
- package/dist/features/environment/GraphHeader/HeaderActions.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/Switcher.esm.js +75 -0
- package/dist/features/environment/GraphHeader/Switcher.esm.js.map +1 -0
- package/dist/features/environment/GraphHeader/queries.esm.js +60 -0
- package/dist/features/environment/GraphHeader/queries.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js +151 -0
- package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js +165 -0
- package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js +241 -0
- package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js +119 -0
- package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/TabState.esm.js +30 -0
- package/dist/features/environment/InstanceDrawer/TabState.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js +25 -0
- package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/helpers.esm.js +282 -0
- package/dist/features/environment/InstanceDrawer/helpers.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/queries.esm.js +281 -0
- package/dist/features/environment/InstanceDrawer/queries.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js +170 -0
- package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js +413 -0
- package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js +191 -0
- package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js +63 -0
- package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js +48 -0
- package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js +446 -0
- package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js +146 -0
- package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js +572 -0
- package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js +471 -0
- package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js +109 -0
- package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js +384 -0
- package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js +23 -0
- package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js +6 -0
- package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js +55 -0
- package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js.map +1 -0
- package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js +44 -0
- package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js.map +1 -0
- package/dist/features/environment/components/InstanceStatusPill.esm.js +54 -0
- package/dist/features/environment/components/InstanceStatusPill.esm.js.map +1 -0
- package/dist/features/environment/graph/Diagram.esm.js +143 -0
- package/dist/features/environment/graph/Diagram.esm.js.map +1 -0
- package/dist/features/environment/graph/DiagramNode.constants.esm.js +5 -0
- package/dist/features/environment/graph/DiagramNode.constants.esm.js.map +1 -0
- package/dist/features/environment/graph/DiagramNode.esm.js +221 -0
- package/dist/features/environment/graph/DiagramNode.esm.js.map +1 -0
- package/dist/features/environment/graph/NodeMeta.esm.js +182 -0
- package/dist/features/environment/graph/NodeMeta.esm.js.map +1 -0
- package/dist/features/environment/graph/NodeVersionBadges.esm.js +150 -0
- package/dist/features/environment/graph/NodeVersionBadges.esm.js.map +1 -0
- package/dist/features/environment/graph/diagramFactory.esm.js +151 -0
- package/dist/features/environment/graph/diagramFactory.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js +174 -0
- package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/NodeHandle.esm.js +45 -0
- package/dist/features/environment/graph/handles/NodeHandle.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js +134 -0
- package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/handleTypes.esm.js +170 -0
- package/dist/features/environment/graph/handles/handleTypes.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js +19 -0
- package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/useRadialPositions.esm.js +37 -0
- package/dist/features/environment/graph/handles/useRadialPositions.esm.js.map +1 -0
- package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js +19 -0
- package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js.map +1 -0
- package/dist/features/environment/graph/hasUndeployedPlan.esm.js +43 -0
- package/dist/features/environment/graph/hasUndeployedPlan.esm.js.map +1 -0
- package/dist/features/environment/graph/queries.esm.js +103 -0
- package/dist/features/environment/graph/queries.esm.js.map +1 -0
- package/dist/features/environment/graph/useDiagramSnapshot.esm.js +43 -0
- package/dist/features/environment/graph/useDiagramSnapshot.esm.js.map +1 -0
- package/dist/features/environment/realtime/RealtimeProvider.esm.js +43 -0
- package/dist/features/environment/realtime/RealtimeProvider.esm.js.map +1 -0
- package/dist/features/environment/realtime/queries.esm.js +76 -0
- package/dist/features/environment/realtime/queries.esm.js.map +1 -0
- package/dist/features/environment/realtime/useLiveRelayQuery.esm.js +36 -0
- package/dist/features/environment/realtime/useLiveRelayQuery.esm.js.map +1 -0
- package/dist/features/project/ProjectDetailsPage.esm.js +101 -0
- package/dist/features/project/ProjectDetailsPage.esm.js.map +1 -0
- package/dist/features/project/tabs/ComponentsTab.esm.js +149 -0
- package/dist/features/project/tabs/ComponentsTab.esm.js.map +1 -0
- package/dist/features/project/tabs/EnvStatus.esm.js +149 -0
- package/dist/features/project/tabs/EnvStatus.esm.js.map +1 -0
- package/dist/features/project/tabs/EnvironmentsTab.esm.js +199 -0
- package/dist/features/project/tabs/EnvironmentsTab.esm.js.map +1 -0
- package/dist/features/project/tabs/OverviewTab.esm.js +420 -0
- package/dist/features/project/tabs/OverviewTab.esm.js.map +1 -0
- package/dist/features/projects/ProjectsListPage.esm.js +50 -0
- package/dist/features/projects/ProjectsListPage.esm.js.map +1 -0
- package/dist/features/projects/ProjectsListPageLazy.esm.js +12 -0
- package/dist/features/projects/ProjectsListPageLazy.esm.js.map +1 -0
- package/dist/features/projects/projectColumns.esm.js +38 -0
- package/dist/features/projects/projectColumns.esm.js.map +1 -0
- package/dist/features/projects/useProjects.esm.js +48 -0
- package/dist/features/projects/useProjects.esm.js.map +1 -0
- package/dist/features/repo/DeploymentLogsDrawer.esm.js +213 -0
- package/dist/features/repo/DeploymentLogsDrawer.esm.js.map +1 -0
- package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js +43 -0
- package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js.map +1 -0
- package/dist/features/repo/FileTree.esm.js +179 -0
- package/dist/features/repo/FileTree.esm.js.map +1 -0
- package/dist/features/repo/FileViewer.esm.js +115 -0
- package/dist/features/repo/FileViewer.esm.js.map +1 -0
- package/dist/features/repo/FileViewer.helpers.esm.js +54 -0
- package/dist/features/repo/FileViewer.helpers.esm.js.map +1 -0
- package/dist/features/repo/RepoDetailsPage.esm.js +127 -0
- package/dist/features/repo/RepoDetailsPage.esm.js.map +1 -0
- package/dist/features/repo/RepoEmptyState.esm.js +58 -0
- package/dist/features/repo/RepoEmptyState.esm.js.map +1 -0
- package/dist/features/repo/RepoNoVersionsState.esm.js +29 -0
- package/dist/features/repo/RepoNoVersionsState.esm.js.map +1 -0
- package/dist/features/repo/RepoTabHeader.esm.js +30 -0
- package/dist/features/repo/RepoTabHeader.esm.js.map +1 -0
- package/dist/features/repo/RepoTabLayout.esm.js +18 -0
- package/dist/features/repo/RepoTabLayout.esm.js.map +1 -0
- package/dist/features/repo/RepoVersionSelect.esm.js +176 -0
- package/dist/features/repo/RepoVersionSelect.esm.js.map +1 -0
- package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js +427 -0
- package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js.map +1 -0
- package/dist/features/repo/deploymentHelpers.esm.js +74 -0
- package/dist/features/repo/deploymentHelpers.esm.js.map +1 -0
- package/dist/features/repo/fileTreeHelpers.esm.js +45 -0
- package/dist/features/repo/fileTreeHelpers.esm.js.map +1 -0
- package/dist/features/repo/flattenParams.esm.js +23 -0
- package/dist/features/repo/flattenParams.esm.js.map +1 -0
- package/dist/features/repo/queries.esm.js +239 -0
- package/dist/features/repo/queries.esm.js.map +1 -0
- package/dist/features/repo/repoFilter.esm.js +9 -0
- package/dist/features/repo/repoFilter.esm.js.map +1 -0
- package/dist/features/repo/repoTabs.esm.js +22 -0
- package/dist/features/repo/repoTabs.esm.js.map +1 -0
- package/dist/features/repo/resolveVersion.esm.js +22 -0
- package/dist/features/repo/resolveVersion.esm.js.map +1 -0
- package/dist/features/repo/tabs/DeploymentRow.esm.js +201 -0
- package/dist/features/repo/tabs/DeploymentRow.esm.js.map +1 -0
- package/dist/features/repo/tabs/DeploymentsTab.esm.js +188 -0
- package/dist/features/repo/tabs/DeploymentsTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js +46 -0
- package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js.map +1 -0
- package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js +37 -0
- package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js.map +1 -0
- package/dist/features/repo/tabs/FilesTab.esm.js +142 -0
- package/dist/features/repo/tabs/FilesTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/InstanceRow.esm.js +121 -0
- package/dist/features/repo/tabs/InstanceRow.esm.js.map +1 -0
- package/dist/features/repo/tabs/InstancesTab.esm.js +147 -0
- package/dist/features/repo/tabs/InstancesTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/InstancesTab.helpers.esm.js +44 -0
- package/dist/features/repo/tabs/InstancesTab.helpers.esm.js.map +1 -0
- package/dist/features/repo/tabs/InstancesTab.loading.esm.js +33 -0
- package/dist/features/repo/tabs/InstancesTab.loading.esm.js.map +1 -0
- package/dist/features/repo/tabs/OverviewTab.esm.js +77 -0
- package/dist/features/repo/tabs/OverviewTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/PermissionsTab.esm.js +56 -0
- package/dist/features/repo/tabs/PermissionsTab.esm.js.map +1 -0
- package/dist/features/repo/tabs/VersionsTab.esm.js +152 -0
- package/dist/features/repo/tabs/VersionsTab.esm.js.map +1 -0
- package/dist/features/repo/useInfiniteRelayList.esm.js +92 -0
- package/dist/features/repo/useInfiniteRelayList.esm.js.map +1 -0
- package/dist/features/repo/useInfiniteScroll.esm.js +21 -0
- package/dist/features/repo/useInfiniteScroll.esm.js.map +1 -0
- package/dist/features/repos/ReposListPage.esm.js +53 -0
- package/dist/features/repos/ReposListPage.esm.js.map +1 -0
- package/dist/features/repos/queries.esm.js +40 -0
- package/dist/features/repos/queries.esm.js.map +1 -0
- package/dist/features/repos/repoColumns.esm.js +121 -0
- package/dist/features/repos/repoColumns.esm.js.map +1 -0
- package/dist/features/repos/useRepos.esm.js +22 -0
- package/dist/features/repos/useRepos.esm.js.map +1 -0
- package/dist/features/resource/OriginChip.esm.js +42 -0
- package/dist/features/resource/OriginChip.esm.js.map +1 -0
- package/dist/features/resource/ResourceDetailsPage.esm.js +167 -0
- package/dist/features/resource/ResourceDetailsPage.esm.js.map +1 -0
- package/dist/features/resource/queries.esm.js +141 -0
- package/dist/features/resource/queries.esm.js.map +1 -0
- package/dist/features/resource/tabs/GeneralTab.esm.js +247 -0
- package/dist/features/resource/tabs/GeneralTab.esm.js.map +1 -0
- package/dist/features/resource/tabs/GeneralTab.loading.esm.js +76 -0
- package/dist/features/resource/tabs/GeneralTab.loading.esm.js.map +1 -0
- package/dist/features/resource/tabs/PermissionsTab.esm.js +57 -0
- package/dist/features/resource/tabs/PermissionsTab.esm.js.map +1 -0
- package/dist/features/resource/tabs/SettingsTabLayout.esm.js +18 -0
- package/dist/features/resource/tabs/SettingsTabLayout.esm.js.map +1 -0
- package/dist/features/resource/tabs/TabHeader.esm.js +30 -0
- package/dist/features/resource/tabs/TabHeader.esm.js.map +1 -0
- package/dist/features/resource/tabs/UsagePanel.esm.js +35 -0
- package/dist/features/resource/tabs/UsagePanel.esm.js.map +1 -0
- package/dist/features/resource/tabs/UsageTab.esm.js +91 -0
- package/dist/features/resource/tabs/UsageTab.esm.js.map +1 -0
- package/dist/features/resource/tabs/UsageTab.helpers.esm.js +168 -0
- package/dist/features/resource/tabs/UsageTab.helpers.esm.js.map +1 -0
- package/dist/features/resources/ResourcesEmptyState.esm.js +148 -0
- package/dist/features/resources/ResourcesEmptyState.esm.js.map +1 -0
- package/dist/features/resources/ResourcesListPage.esm.js +115 -0
- package/dist/features/resources/ResourcesListPage.esm.js.map +1 -0
- package/dist/features/resources/queries.esm.js +50 -0
- package/dist/features/resources/queries.esm.js.map +1 -0
- package/dist/features/resources/resourceColumns.esm.js +158 -0
- package/dist/features/resources/resourceColumns.esm.js.map +1 -0
- package/dist/features/resources/resourceConstants.esm.js +7 -0
- package/dist/features/resources/resourceConstants.esm.js.map +1 -0
- package/dist/features/resources/toResourceRow.esm.js +29 -0
- package/dist/features/resources/toResourceRow.esm.js.map +1 -0
- package/dist/hooks/useAuthedSvg.esm.js +34 -0
- package/dist/hooks/useAuthedSvg.esm.js.map +1 -0
- package/dist/hooks/useCursorPagination.esm.js +40 -0
- package/dist/hooks/useCursorPagination.esm.js.map +1 -0
- package/dist/hooks/useMassdriverSubscription.esm.js +61 -0
- package/dist/hooks/useMassdriverSubscription.esm.js.map +1 -0
- package/dist/hooks/usePaginatedRelayQuery.esm.js +68 -0
- package/dist/hooks/usePaginatedRelayQuery.esm.js.map +1 -0
- package/dist/index.d.ts +256 -0
- package/dist/index.esm.js +8 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/internalRoutes.esm.js +29 -0
- package/dist/internalRoutes.esm.js.map +1 -0
- package/dist/plugin.esm.js +57 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/queries.esm.js +54 -0
- package/dist/queries.esm.js.map +1 -0
- package/dist/routes.esm.js +6 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/shell/MassdriverHeader.esm.js +37 -0
- package/dist/shell/MassdriverHeader.esm.js.map +1 -0
- package/dist/shell/MassdriverShell.esm.js +30 -0
- package/dist/shell/MassdriverShell.esm.js.map +1 -0
- package/dist/theme/MassdriverThemeScope.esm.js +30 -0
- package/dist/theme/MassdriverThemeScope.esm.js.map +1 -0
- package/dist/theme/ThemeModeContext.esm.js +35 -0
- package/dist/theme/ThemeModeContext.esm.js.map +1 -0
- package/dist/theme/muiClassNameAudit.esm.js +11 -0
- package/dist/theme/muiClassNameAudit.esm.js.map +1 -0
- package/dist/useInstances.esm.js +39 -0
- package/dist/useInstances.esm.js.map +1 -0
- package/dist/utils/attributes.esm.js +28 -0
- package/dist/utils/attributes.esm.js.map +1 -0
- package/dist/utils/conditions.esm.js +20 -0
- package/dist/utils/conditions.esm.js.map +1 -0
- package/dist/utils/formatRelativeTime.esm.js +40 -0
- package/dist/utils/formatRelativeTime.esm.js.map +1 -0
- package/dist/utils/instanceStatuses.esm.js +74 -0
- package/dist/utils/instanceStatuses.esm.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const flattenParams = (params, basePath = "") => {
|
|
2
|
+
if (basePath === "" && params == null) return [];
|
|
3
|
+
if (params === null || typeof params !== "object") {
|
|
4
|
+
return [{ id: basePath || "$", path: basePath || "$", value: params }];
|
|
5
|
+
}
|
|
6
|
+
if (Array.isArray(params)) {
|
|
7
|
+
if (params.length === 0) {
|
|
8
|
+
return [{ id: basePath || "$", path: basePath || "$", value: [] }];
|
|
9
|
+
}
|
|
10
|
+
return params.flatMap(
|
|
11
|
+
(item, index) => flattenParams(item, `${basePath}[${index}]`)
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
const record = params;
|
|
15
|
+
const keys = Object.keys(record);
|
|
16
|
+
if (keys.length === 0) {
|
|
17
|
+
return [{ id: basePath || "$", path: basePath || "$", value: {} }];
|
|
18
|
+
}
|
|
19
|
+
return keys.flatMap((key) => flattenParams(record[key], `${basePath}.${key}`));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { flattenParams as default };
|
|
23
|
+
//# sourceMappingURL=flattenParams.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flattenParams.esm.js","sources":["../../../src/features/repo/flattenParams.ts"],"sourcesContent":["// Walks a JSON object/array recursively and yields one row per leaf value.\n// Leaf rows have jq-style paths (e.g. `.database.port`, `.containers[0].image`).\n// Ported verbatim from the web app's\n// apps/web/shared/components/ViewDeploymentDetailsDialog/flattenParams.js (the\n// same copy features/environment ported for its instance-drawer details panel).\nexport interface ParamRow {\n id: string;\n path: string;\n value: unknown;\n}\n\nconst flattenParams = (params: unknown, basePath = ''): ParamRow[] => {\n if (basePath === '' && params == null) return [];\n if (params === null || typeof params !== 'object') {\n return [{ id: basePath || '$', path: basePath || '$', value: params }];\n }\n if (Array.isArray(params)) {\n if (params.length === 0) {\n return [{ id: basePath || '$', path: basePath || '$', value: [] }];\n }\n return params.flatMap((item, index) =>\n flattenParams(item, `${basePath}[${index}]`),\n );\n }\n const record = params as Record<string, unknown>;\n const keys = Object.keys(record);\n if (keys.length === 0) {\n return [{ id: basePath || '$', path: basePath || '$', value: {} }];\n }\n return keys.flatMap(key => flattenParams(record[key], `${basePath}.${key}`));\n};\n\nexport default flattenParams;\n"],"names":[],"mappings":"AAWA,MAAM,aAAA,GAAgB,CAAC,MAAA,EAAiB,QAAA,GAAW,EAAA,KAAmB;AACpE,EAAA,IAAI,QAAA,KAAa,EAAA,IAAM,MAAA,IAAU,IAAA,SAAa,EAAC;AAC/C,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,QAAA,EAAU;AACjD,IAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,MAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,IAAA,EAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,IACnE;AACA,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,MAAQ,CAAC,MAAM,KAAA,KAC3B,aAAA,CAAc,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG;AAAA,KAC7C;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAA;AACf,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,CAAC,EAAE,EAAA,EAAI,QAAA,IAAY,GAAA,EAAK,IAAA,EAAM,QAAA,IAAY,GAAA,EAAK,KAAA,EAAO,EAAC,EAAG,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,GAAA,KAAO,aAAA,CAAc,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC,CAAA;AAC7E;;;;"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
const OCI_REPO_HEADER_QUERY = `
|
|
2
|
+
query MassdriverOciRepoHeader($organizationId: ID!, $id: ID!) {
|
|
3
|
+
ociRepo(organizationId: $organizationId, id: $id) {
|
|
4
|
+
id
|
|
5
|
+
name
|
|
6
|
+
description
|
|
7
|
+
icon
|
|
8
|
+
sourceUrl
|
|
9
|
+
readme
|
|
10
|
+
changelog
|
|
11
|
+
reference
|
|
12
|
+
attributes
|
|
13
|
+
createdAt
|
|
14
|
+
updatedAt
|
|
15
|
+
releaseChannels {
|
|
16
|
+
items {
|
|
17
|
+
name
|
|
18
|
+
tag
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
tags(sort: { field: VERSION, order: DESC }) {
|
|
22
|
+
items {
|
|
23
|
+
tag
|
|
24
|
+
createdAt
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
const BUNDLE_QUERY = `
|
|
31
|
+
query MassdriverBundle($organizationId: ID!, $id: BundleId!) {
|
|
32
|
+
bundle(organizationId: $organizationId, id: $id) {
|
|
33
|
+
id
|
|
34
|
+
name
|
|
35
|
+
version
|
|
36
|
+
description
|
|
37
|
+
sourceUrl
|
|
38
|
+
readme
|
|
39
|
+
changelog
|
|
40
|
+
createdAt
|
|
41
|
+
updatedAt
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
`;
|
|
45
|
+
const REPO_INSTANCES_QUERY = `
|
|
46
|
+
query MassdriverRepoInstances(
|
|
47
|
+
$organizationId: ID!
|
|
48
|
+
$filter: InstancesFilter
|
|
49
|
+
$sort: InstancesSort
|
|
50
|
+
$cursor: Cursor
|
|
51
|
+
) {
|
|
52
|
+
instances(
|
|
53
|
+
organizationId: $organizationId
|
|
54
|
+
filter: $filter
|
|
55
|
+
sort: $sort
|
|
56
|
+
cursor: $cursor
|
|
57
|
+
) {
|
|
58
|
+
cursor {
|
|
59
|
+
next
|
|
60
|
+
}
|
|
61
|
+
items {
|
|
62
|
+
id
|
|
63
|
+
status
|
|
64
|
+
version
|
|
65
|
+
resolvedVersion
|
|
66
|
+
deployedVersion
|
|
67
|
+
createdAt
|
|
68
|
+
updatedAt
|
|
69
|
+
cost {
|
|
70
|
+
lastMonth {
|
|
71
|
+
amount
|
|
72
|
+
currency
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
environment {
|
|
76
|
+
id
|
|
77
|
+
name
|
|
78
|
+
}
|
|
79
|
+
component {
|
|
80
|
+
id
|
|
81
|
+
project {
|
|
82
|
+
id
|
|
83
|
+
name
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
`;
|
|
90
|
+
const REPO_DEPLOYMENTS_QUERY = `
|
|
91
|
+
query MassdriverRepoDeployments(
|
|
92
|
+
$organizationId: ID!
|
|
93
|
+
$filter: DeploymentsFilter
|
|
94
|
+
$sort: DeploymentsSort
|
|
95
|
+
$cursor: Cursor
|
|
96
|
+
) {
|
|
97
|
+
deployments(
|
|
98
|
+
organizationId: $organizationId
|
|
99
|
+
filter: $filter
|
|
100
|
+
sort: $sort
|
|
101
|
+
cursor: $cursor
|
|
102
|
+
) {
|
|
103
|
+
cursor {
|
|
104
|
+
next
|
|
105
|
+
}
|
|
106
|
+
items {
|
|
107
|
+
id
|
|
108
|
+
status
|
|
109
|
+
action
|
|
110
|
+
version
|
|
111
|
+
message
|
|
112
|
+
createdAt
|
|
113
|
+
updatedAt
|
|
114
|
+
lastTransitionedAt
|
|
115
|
+
elapsedTime
|
|
116
|
+
deployedBy
|
|
117
|
+
instance {
|
|
118
|
+
id
|
|
119
|
+
environment {
|
|
120
|
+
id
|
|
121
|
+
name
|
|
122
|
+
}
|
|
123
|
+
component {
|
|
124
|
+
id
|
|
125
|
+
project {
|
|
126
|
+
id
|
|
127
|
+
name
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
`;
|
|
135
|
+
const DEPLOYMENT_DETAIL_QUERY = `
|
|
136
|
+
query MassdriverDeployment($organizationId: ID!, $id: UUID!) {
|
|
137
|
+
deployment(organizationId: $organizationId, id: $id) {
|
|
138
|
+
id
|
|
139
|
+
status
|
|
140
|
+
action
|
|
141
|
+
version
|
|
142
|
+
message
|
|
143
|
+
params
|
|
144
|
+
effectiveAttributes
|
|
145
|
+
createdAt
|
|
146
|
+
lastTransitionedAt
|
|
147
|
+
elapsedTime
|
|
148
|
+
deployedBy
|
|
149
|
+
instance {
|
|
150
|
+
id
|
|
151
|
+
component { id name }
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
`;
|
|
156
|
+
const DEPLOYMENT_LOGS_QUERY = `
|
|
157
|
+
query MassdriverDeploymentLogs($organizationId: ID!, $id: UUID!) {
|
|
158
|
+
deployment(organizationId: $organizationId, id: $id) {
|
|
159
|
+
id
|
|
160
|
+
status
|
|
161
|
+
action
|
|
162
|
+
version
|
|
163
|
+
instance {
|
|
164
|
+
id
|
|
165
|
+
component { id name }
|
|
166
|
+
}
|
|
167
|
+
logs {
|
|
168
|
+
timestamp
|
|
169
|
+
message
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
`;
|
|
174
|
+
const DEPLOYMENT_LOGS_SUBSCRIPTION = `
|
|
175
|
+
subscription MassdriverDeploymentLogs(
|
|
176
|
+
$organizationId: ID!
|
|
177
|
+
$deploymentId: ID!
|
|
178
|
+
) {
|
|
179
|
+
deploymentLogs(
|
|
180
|
+
organizationId: $organizationId
|
|
181
|
+
deploymentId: $deploymentId
|
|
182
|
+
) {
|
|
183
|
+
timestamp
|
|
184
|
+
message
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
`;
|
|
188
|
+
const REPO_TAG_FILES_QUERY = `
|
|
189
|
+
query MassdriverRepoTagFiles(
|
|
190
|
+
$organizationId: ID!
|
|
191
|
+
$repoId: ID!
|
|
192
|
+
$version: Semver!
|
|
193
|
+
$cursor: Cursor
|
|
194
|
+
) {
|
|
195
|
+
ociRepo(organizationId: $organizationId, id: $repoId) {
|
|
196
|
+
id
|
|
197
|
+
tags(filter: { version: $version }) {
|
|
198
|
+
items {
|
|
199
|
+
tag
|
|
200
|
+
files(sort: { field: NAME, order: ASC }, cursor: $cursor) {
|
|
201
|
+
cursor {
|
|
202
|
+
next
|
|
203
|
+
previous
|
|
204
|
+
}
|
|
205
|
+
items {
|
|
206
|
+
name
|
|
207
|
+
mediaType
|
|
208
|
+
size
|
|
209
|
+
digest
|
|
210
|
+
url
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
`;
|
|
218
|
+
const REPO_GRANTS_QUERY = `
|
|
219
|
+
query MassdriverRepoGrants($organizationId: ID!, $id: ID!, $cursor: Cursor) {
|
|
220
|
+
ociRepo(organizationId: $organizationId, id: $id) {
|
|
221
|
+
id
|
|
222
|
+
grants(cursor: $cursor) {
|
|
223
|
+
cursor {
|
|
224
|
+
next
|
|
225
|
+
previous
|
|
226
|
+
}
|
|
227
|
+
items {
|
|
228
|
+
id
|
|
229
|
+
action
|
|
230
|
+
recipientConditions
|
|
231
|
+
createdAt
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
`;
|
|
237
|
+
|
|
238
|
+
export { BUNDLE_QUERY, DEPLOYMENT_DETAIL_QUERY, DEPLOYMENT_LOGS_QUERY, DEPLOYMENT_LOGS_SUBSCRIPTION, OCI_REPO_HEADER_QUERY, REPO_DEPLOYMENTS_QUERY, REPO_GRANTS_QUERY, REPO_INSTANCES_QUERY, REPO_TAG_FILES_QUERY };
|
|
239
|
+
//# sourceMappingURL=queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.esm.js","sources":["../../../src/features/repo/queries.ts"],"sourcesContent":["// Ported from apps/web/features/repos/ hooks. Operation names prefixed\n// `Massdriver`; `$organizationId` is declared but never passed (relay injects).\n\n// apps/web/features/repos/hooks/useOciRepoQuery.js\nexport const OCI_REPO_HEADER_QUERY = `\n query MassdriverOciRepoHeader($organizationId: ID!, $id: ID!) {\n ociRepo(organizationId: $organizationId, id: $id) {\n id\n name\n description\n icon\n sourceUrl\n readme\n changelog\n reference\n attributes\n createdAt\n updatedAt\n releaseChannels {\n items {\n name\n tag\n }\n }\n tags(sort: { field: VERSION, order: DESC }) {\n items {\n tag\n createdAt\n }\n }\n }\n }\n`;\n\n// apps/web/features/repos/hooks/useBundleQuery.js\nexport const BUNDLE_QUERY = `\n query MassdriverBundle($organizationId: ID!, $id: BundleId!) {\n bundle(organizationId: $organizationId, id: $id) {\n id\n name\n version\n description\n sourceUrl\n readme\n changelog\n createdAt\n updatedAt\n }\n }\n`;\n\n// apps/web/features/repos/hooks/queries/useRepoInstancesQuery.js\nexport const REPO_INSTANCES_QUERY = `\n query MassdriverRepoInstances(\n $organizationId: ID!\n $filter: InstancesFilter\n $sort: InstancesSort\n $cursor: Cursor\n ) {\n instances(\n organizationId: $organizationId\n filter: $filter\n sort: $sort\n cursor: $cursor\n ) {\n cursor {\n next\n }\n items {\n id\n status\n version\n resolvedVersion\n deployedVersion\n createdAt\n updatedAt\n cost {\n lastMonth {\n amount\n currency\n }\n }\n environment {\n id\n name\n }\n component {\n id\n project {\n id\n name\n }\n }\n }\n }\n }\n`;\n\n// apps/web/features/repos/hooks/queries/useRepoDeploymentsQuery.js\nexport const REPO_DEPLOYMENTS_QUERY = `\n query MassdriverRepoDeployments(\n $organizationId: ID!\n $filter: DeploymentsFilter\n $sort: DeploymentsSort\n $cursor: Cursor\n ) {\n deployments(\n organizationId: $organizationId\n filter: $filter\n sort: $sort\n cursor: $cursor\n ) {\n cursor {\n next\n }\n items {\n id\n status\n action\n version\n message\n createdAt\n updatedAt\n lastTransitionedAt\n elapsedTime\n deployedBy\n instance {\n id\n environment {\n id\n name\n }\n component {\n id\n project {\n id\n name\n }\n }\n }\n }\n }\n }\n`;\n\n// Full deployment snapshot for the in-place details dialog (mirrors the web\n// app's useDeploymentQuery / features/environment's DEPLOYMENT_QUERY). `id` is a\n// `UUID!` here, matching `deployment(id:)`.\nexport const DEPLOYMENT_DETAIL_QUERY = `\n query MassdriverDeployment($organizationId: ID!, $id: UUID!) {\n deployment(organizationId: $organizationId, id: $id) {\n id\n status\n action\n version\n message\n params\n effectiveAttributes\n createdAt\n lastTransitionedAt\n elapsedTime\n deployedBy\n instance {\n id\n component { id name }\n }\n }\n }\n`;\n\n// Initial log backfill for the logs drawer. The live tail is streamed\n// separately via the `deploymentLogs` subscription below. `id` is a `UUID!`,\n// matching `deployment(id:)`.\nexport const DEPLOYMENT_LOGS_QUERY = `\n query MassdriverDeploymentLogs($organizationId: ID!, $id: UUID!) {\n deployment(organizationId: $organizationId, id: $id) {\n id\n status\n action\n version\n instance {\n id\n component { id name }\n }\n logs {\n timestamp\n message\n }\n }\n }\n`;\n\n// Live log tail for the logs drawer. Relayed over SSE via\n// useMassdriverSubscription. `$deploymentId` is an `ID!` on the subscription\n// (distinct from the `UUID!` on the deployment query above).\nexport const DEPLOYMENT_LOGS_SUBSCRIPTION = `\n subscription MassdriverDeploymentLogs(\n $organizationId: ID!\n $deploymentId: ID!\n ) {\n deploymentLogs(\n organizationId: $organizationId\n deploymentId: $deploymentId\n ) {\n timestamp\n message\n }\n }\n`;\n\n// apps/web/features/repos/hooks/useRepoTagFilesQuery.js\nexport const REPO_TAG_FILES_QUERY = `\n query MassdriverRepoTagFiles(\n $organizationId: ID!\n $repoId: ID!\n $version: Semver!\n $cursor: Cursor\n ) {\n ociRepo(organizationId: $organizationId, id: $repoId) {\n id\n tags(filter: { version: $version }) {\n items {\n tag\n files(sort: { field: NAME, order: ASC }, cursor: $cursor) {\n cursor {\n next\n previous\n }\n items {\n name\n mediaType\n size\n digest\n url\n }\n }\n }\n }\n }\n }\n`;\n\n// apps/web/features/repos/hooks/useRepoGrantsQuery.js\nexport const REPO_GRANTS_QUERY = `\n query MassdriverRepoGrants($organizationId: ID!, $id: ID!, $cursor: Cursor) {\n ociRepo(organizationId: $organizationId, id: $id) {\n id\n grants(cursor: $cursor) {\n cursor {\n next\n previous\n }\n items {\n id\n action\n recipientConditions\n createdAt\n }\n }\n }\n }\n`;\n"],"names":[],"mappings":"AAIO,MAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+B9B,MAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBrB,MAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+C7B,MAAM,sBAAA,GAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiD/B,MAAM,uBAAA,GAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBhC,MAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsB9B,MAAM,4BAAA,GAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBrC,MAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgC7B,MAAM,iBAAA,GAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ALL_VERSIONS } from './resolveVersion.esm.js';
|
|
2
|
+
|
|
3
|
+
const buildRepoVersionFilter = (repoId, version) => {
|
|
4
|
+
if (!repoId) return void 0;
|
|
5
|
+
return version === ALL_VERSIONS ? { ociRepoName: { eq: repoId } } : { bundleId: { eq: `${repoId}@${version}` } };
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export { buildRepoVersionFilter };
|
|
9
|
+
//# sourceMappingURL=repoFilter.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repoFilter.esm.js","sources":["../../../src/features/repo/repoFilter.ts"],"sourcesContent":["import { ALL_VERSIONS } from './resolveVersion';\n\n// Ported from apps/web/features/repos/utils/repoFilter.js.\n//\n// Builds the filter shape shared by the instances / deployments queries on the\n// repo details page. When scoped to \"all versions\" we filter by the OCI repo\n// name (matches every published release); otherwise we pin to a specific bundle\n// id (\"name@version\"), which also accepts release channels like \"name@latest\".\nexport const buildRepoVersionFilter = (\n repoId?: string | null,\n version?: string | null,\n): Record<string, unknown> | undefined => {\n if (!repoId) return undefined;\n return version === ALL_VERSIONS\n ? { ociRepoName: { eq: repoId } }\n : { bundleId: { eq: `${repoId}@${version}` } };\n};\n"],"names":[],"mappings":";;AAQO,MAAM,sBAAA,GAAyB,CACpC,MAAA,EACA,OAAA,KACwC;AACxC,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,OAAO,YAAY,YAAA,GACf,EAAE,aAAa,EAAE,EAAA,EAAI,QAAO,EAAE,GAC9B,EAAE,QAAA,EAAU,EAAE,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,IAAG,EAAE;AACjD;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const TAB_IDS = {
|
|
2
|
+
OVERVIEW: "overview",
|
|
3
|
+
INSTANCES: "instances",
|
|
4
|
+
DEPLOYMENTS: "deployments",
|
|
5
|
+
FILES: "files",
|
|
6
|
+
VERSIONS: "versions",
|
|
7
|
+
PERMISSIONS: "permissions"
|
|
8
|
+
};
|
|
9
|
+
const DEFAULT_REPO_TAB = TAB_IDS.OVERVIEW;
|
|
10
|
+
const REPO_TABS = [
|
|
11
|
+
{ id: TAB_IDS.OVERVIEW, label: "Overview" },
|
|
12
|
+
{ id: TAB_IDS.INSTANCES, label: "Instances" },
|
|
13
|
+
{ id: TAB_IDS.DEPLOYMENTS, label: "Deployments" },
|
|
14
|
+
{ id: TAB_IDS.FILES, label: "Files" },
|
|
15
|
+
{ id: TAB_IDS.VERSIONS, label: "Versions" },
|
|
16
|
+
{ id: TAB_IDS.PERMISSIONS, label: "Permissions" }
|
|
17
|
+
];
|
|
18
|
+
const TAB_VALUES = REPO_TABS.map((tab) => tab.id);
|
|
19
|
+
const resolveActiveRepoTab = (tab) => tab && TAB_VALUES.includes(tab) ? tab : DEFAULT_REPO_TAB;
|
|
20
|
+
|
|
21
|
+
export { DEFAULT_REPO_TAB, REPO_TABS, TAB_IDS, resolveActiveRepoTab };
|
|
22
|
+
//# sourceMappingURL=repoTabs.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repoTabs.esm.js","sources":["../../../src/features/repo/repoTabs.ts"],"sourcesContent":["// Ported from apps/web/features/repos/utils/repoTabs.js + repoTabIds.js.\n// The web app's Alarms tab is intentionally hidden; we keep the same visible\n// tab set and order here.\nexport const TAB_IDS = {\n OVERVIEW: 'overview',\n INSTANCES: 'instances',\n DEPLOYMENTS: 'deployments',\n FILES: 'files',\n VERSIONS: 'versions',\n PERMISSIONS: 'permissions',\n} as const;\n\nexport const DEFAULT_REPO_TAB = TAB_IDS.OVERVIEW;\n\nexport const REPO_TABS = [\n { id: TAB_IDS.OVERVIEW, label: 'Overview' },\n { id: TAB_IDS.INSTANCES, label: 'Instances' },\n { id: TAB_IDS.DEPLOYMENTS, label: 'Deployments' },\n { id: TAB_IDS.FILES, label: 'Files' },\n { id: TAB_IDS.VERSIONS, label: 'Versions' },\n { id: TAB_IDS.PERMISSIONS, label: 'Permissions' },\n];\n\nconst TAB_VALUES = REPO_TABS.map(tab => tab.id) as string[];\n\n/** Resolve a requested tab segment to a valid tab id, defaulting to Overview. */\nexport const resolveActiveRepoTab = (tab?: string | null): string =>\n tab && TAB_VALUES.includes(tab) ? tab : DEFAULT_REPO_TAB;\n"],"names":[],"mappings":"AAGO,MAAM,OAAA,GAAU;AAAA,EACrB,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,WAAA,EAAa;AACf;AAEO,MAAM,mBAAmB,OAAA,CAAQ;AAEjC,MAAM,SAAA,GAAY;AAAA,EACvB,EAAE,EAAA,EAAI,OAAA,CAAQ,QAAA,EAAU,OAAO,UAAA,EAAW;AAAA,EAC1C,EAAE,EAAA,EAAI,OAAA,CAAQ,SAAA,EAAW,OAAO,WAAA,EAAY;AAAA,EAC5C,EAAE,EAAA,EAAI,OAAA,CAAQ,WAAA,EAAa,OAAO,aAAA,EAAc;AAAA,EAChD,EAAE,EAAA,EAAI,OAAA,CAAQ,KAAA,EAAO,OAAO,OAAA,EAAQ;AAAA,EACpC,EAAE,EAAA,EAAI,OAAA,CAAQ,QAAA,EAAU,OAAO,UAAA,EAAW;AAAA,EAC1C,EAAE,EAAA,EAAI,OAAA,CAAQ,WAAA,EAAa,OAAO,aAAA;AACpC;AAEA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,CAAA,GAAA,KAAO,IAAI,EAAE,CAAA;AAGvC,MAAM,oBAAA,GAAuB,CAAC,GAAA,KACnC,GAAA,IAAO,WAAW,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM;;;;"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const ALL_VERSIONS = "all";
|
|
2
|
+
const bundleQueryId = (repoId, version) => {
|
|
3
|
+
if (!repoId || !version) return null;
|
|
4
|
+
const semver = version === ALL_VERSIONS ? "latest" : version;
|
|
5
|
+
return `${repoId}@${semver}`;
|
|
6
|
+
};
|
|
7
|
+
const resolveSelectedVersion = (version, repo) => {
|
|
8
|
+
if (!repo) return null;
|
|
9
|
+
const tags = repo.tags?.items ?? [];
|
|
10
|
+
const channels = repo.releaseChannels?.items ?? [];
|
|
11
|
+
if (version === ALL_VERSIONS || !version) {
|
|
12
|
+
return tags[0]?.tag ?? null;
|
|
13
|
+
}
|
|
14
|
+
const channelMatch = channels.find((channel) => channel?.name === version);
|
|
15
|
+
if (channelMatch) return channelMatch.tag;
|
|
16
|
+
const tagMatch = tags.find((tag) => tag?.tag === version);
|
|
17
|
+
if (tagMatch) return tagMatch.tag;
|
|
18
|
+
return null;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { ALL_VERSIONS, bundleQueryId, resolveSelectedVersion };
|
|
22
|
+
//# sourceMappingURL=resolveVersion.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveVersion.esm.js","sources":["../../../src/features/repo/resolveVersion.ts"],"sourcesContent":["// Ported from apps/web/features/repos/utils/resolveVersion.js.\nexport const ALL_VERSIONS = 'all';\n\ninterface RepoVersions {\n tags?: { items?: Array<{ tag: string } | null> | null } | null;\n releaseChannels?: {\n items?: Array<{ name: string; tag: string } | null> | null;\n } | null;\n}\n\n/**\n * The `BundleId` used to fetch a bundle for a given repo + version. When the\n * page is scoped to \"all versions\" we resolve the semver to `latest`.\n */\nexport const bundleQueryId = (\n repoId?: string | null,\n version?: string | null,\n): string | null => {\n if (!repoId || !version) return null;\n const semver = version === ALL_VERSIONS ? 'latest' : version;\n return `${repoId}@${semver}`;\n};\n\n/**\n * Resolve the concrete semver tag to load for a page version. \"all\"/empty →\n * the newest tag; a release-channel name → its tag; a tag → itself; otherwise\n * null.\n */\nexport const resolveSelectedVersion = (\n version: string | null | undefined,\n repo: RepoVersions | null | undefined,\n): string | null => {\n if (!repo) return null;\n\n const tags = repo.tags?.items ?? [];\n const channels = repo.releaseChannels?.items ?? [];\n\n if (version === ALL_VERSIONS || !version) {\n return tags[0]?.tag ?? null;\n }\n\n const channelMatch = channels.find(channel => channel?.name === version);\n if (channelMatch) return channelMatch.tag;\n\n const tagMatch = tags.find(tag => tag?.tag === version);\n if (tagMatch) return tagMatch.tag;\n\n return null;\n};\n"],"names":[],"mappings":"AACO,MAAM,YAAA,GAAe;AAarB,MAAM,aAAA,GAAgB,CAC3B,MAAA,EACA,OAAA,KACkB;AAClB,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS,OAAO,IAAA;AAChC,EAAA,MAAM,MAAA,GAAS,OAAA,KAAY,YAAA,GAAe,QAAA,GAAW,OAAA;AACrD,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC5B;AAOO,MAAM,sBAAA,GAAyB,CACpC,OAAA,EACA,IAAA,KACkB;AAClB,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,EAAC;AAClC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,EAAiB,KAAA,IAAS,EAAC;AAEjD,EAAA,IAAI,OAAA,KAAY,YAAA,IAAgB,CAAC,OAAA,EAAS;AACxC,IAAA,OAAO,IAAA,CAAK,CAAC,CAAA,EAAG,GAAA,IAAO,IAAA;AAAA,EACzB;AAEA,EAAA,MAAM,eAAe,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,EAAS,SAAS,OAAO,CAAA;AACvE,EAAA,IAAI,YAAA,SAAqB,YAAA,CAAa,GAAA;AAEtC,EAAA,MAAM,WAAW,IAAA,CAAK,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,EAAK,QAAQ,OAAO,CAAA;AACtD,EAAA,IAAI,QAAA,SAAiB,QAAA,CAAS,GAAA;AAE9B,EAAA,OAAO,IAAA;AACT;;;;"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { parseInstanceId } from '@massdriver/backstage-plugin-common';
|
|
3
|
+
import Box from '@massdriver/ui/Box';
|
|
4
|
+
import Button from '@massdriver/ui/Button';
|
|
5
|
+
import Typography from '@massdriver/ui/Typography';
|
|
6
|
+
import stylin from '@massdriver/ui/stylin';
|
|
7
|
+
import { InstanceStatusPill } from '../../../components/InstanceStatusPill.esm.js';
|
|
8
|
+
import { RouterLinkAdapter } from '../../../components/RouterLinkAdapter.esm.js';
|
|
9
|
+
import VersionBadge from '../../../components/VersionBadge.esm.js';
|
|
10
|
+
import { formatRelativeTime } from '../../../utils/formatRelativeTime.esm.js';
|
|
11
|
+
import { composeInstanceStatus } from '../../../utils/instanceStatuses.esm.js';
|
|
12
|
+
import { internalRoutes } from '../../../internalRoutes.esm.js';
|
|
13
|
+
import { parsePlanMessage, formatElapsed, truncateDeploymentId } from '../deploymentHelpers.esm.js';
|
|
14
|
+
|
|
15
|
+
const DeploymentRow = ({
|
|
16
|
+
deployment,
|
|
17
|
+
onViewLogs,
|
|
18
|
+
onViewDetails
|
|
19
|
+
}) => {
|
|
20
|
+
const { instance } = deployment;
|
|
21
|
+
const composedStatus = composeInstanceStatus(
|
|
22
|
+
deployment.action,
|
|
23
|
+
deployment.status
|
|
24
|
+
);
|
|
25
|
+
const parsed = instance?.id ? parseInstanceId(instance.id) : null;
|
|
26
|
+
const instanceHref = parsed ? internalRoutes.instance(
|
|
27
|
+
parsed.projectId,
|
|
28
|
+
parsed.scopedEnvironmentId,
|
|
29
|
+
parsed.scopedComponentId
|
|
30
|
+
) : null;
|
|
31
|
+
const planSource = deployment.action === "PLAN" ? parsePlanMessage(deployment.message) : null;
|
|
32
|
+
const elapsed = formatElapsed(deployment.elapsedTime);
|
|
33
|
+
const time = formatRelativeTime(
|
|
34
|
+
deployment.lastTransitionedAt ?? deployment.updatedAt ?? deployment.createdAt
|
|
35
|
+
);
|
|
36
|
+
const truncated = truncateDeploymentId(deployment.id);
|
|
37
|
+
const deployedBy = deployment.deployedBy ?? "system";
|
|
38
|
+
const projectName = instance?.component?.project?.name ?? "\u2014";
|
|
39
|
+
const environmentName = instance?.environment?.name ?? "\u2014";
|
|
40
|
+
const instanceLabel = instance?.id ?? "Unknown instance";
|
|
41
|
+
return /* @__PURE__ */ jsxs(Card, { children: [
|
|
42
|
+
/* @__PURE__ */ jsxs(Header, { children: [
|
|
43
|
+
/* @__PURE__ */ jsx(
|
|
44
|
+
InstanceStatusPill,
|
|
45
|
+
{
|
|
46
|
+
status: composedStatus,
|
|
47
|
+
onClick: () => onViewLogs(deployment.id)
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
deployment.version ? /* @__PURE__ */ jsx(VersionBadge, { version: deployment.version }) : null,
|
|
51
|
+
/* @__PURE__ */ jsx(Spacer, {}),
|
|
52
|
+
/* @__PURE__ */ jsx(DeploymentIdText, { title: deployment.id, children: truncated }),
|
|
53
|
+
/* @__PURE__ */ jsx(
|
|
54
|
+
RowButton,
|
|
55
|
+
{
|
|
56
|
+
variant: "text",
|
|
57
|
+
size: "small",
|
|
58
|
+
onClick: () => onViewDetails(deployment.id),
|
|
59
|
+
children: "Details"
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
/* @__PURE__ */ jsx(
|
|
63
|
+
RowButton,
|
|
64
|
+
{
|
|
65
|
+
variant: "text",
|
|
66
|
+
size: "small",
|
|
67
|
+
onClick: () => onViewLogs(deployment.id),
|
|
68
|
+
children: "Logs"
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsxs(Meta, { variant: "caption", children: [
|
|
73
|
+
instanceHref ? /* @__PURE__ */ jsx(InstanceLink, { component: RouterLinkAdapter, href: instanceHref, children: instanceLabel }) : /* @__PURE__ */ jsx(InstanceName, { children: instanceLabel }),
|
|
74
|
+
/* @__PURE__ */ jsx(Sep, { children: "\xB7" }),
|
|
75
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
76
|
+
projectName,
|
|
77
|
+
" ",
|
|
78
|
+
/* @__PURE__ */ jsx(Sep, { children: "\xB7" }),
|
|
79
|
+
" ",
|
|
80
|
+
environmentName
|
|
81
|
+
] }),
|
|
82
|
+
/* @__PURE__ */ jsx(Sep, { children: "\xB7" }),
|
|
83
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
84
|
+
"by ",
|
|
85
|
+
/* @__PURE__ */ jsx("strong", { children: deployedBy })
|
|
86
|
+
] }),
|
|
87
|
+
/* @__PURE__ */ jsx(Sep, { children: "\xB7" }),
|
|
88
|
+
/* @__PURE__ */ jsx("span", { children: time }),
|
|
89
|
+
elapsed ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
90
|
+
/* @__PURE__ */ jsx(Sep, { children: "\xB7" }),
|
|
91
|
+
/* @__PURE__ */ jsx("span", { children: elapsed })
|
|
92
|
+
] }) : null
|
|
93
|
+
] }),
|
|
94
|
+
planSource ? /* @__PURE__ */ jsxs(PlanSourceBlock, { children: [
|
|
95
|
+
/* @__PURE__ */ jsxs(
|
|
96
|
+
PlanSourceLink,
|
|
97
|
+
{
|
|
98
|
+
variant: "text",
|
|
99
|
+
size: "small",
|
|
100
|
+
onClick: () => onViewDetails(planSource.sourceId),
|
|
101
|
+
children: [
|
|
102
|
+
"Planned deployment of ",
|
|
103
|
+
truncateDeploymentId(planSource.sourceId)
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
),
|
|
107
|
+
planSource.sourceMessage ? /* @__PURE__ */ jsxs(Message, { title: planSource.sourceMessage, children: [
|
|
108
|
+
'"',
|
|
109
|
+
planSource.sourceMessage,
|
|
110
|
+
'"'
|
|
111
|
+
] }) : null
|
|
112
|
+
] }) : deployment.message ? /* @__PURE__ */ jsxs(Message, { title: deployment.message, children: [
|
|
113
|
+
'"',
|
|
114
|
+
deployment.message,
|
|
115
|
+
'"'
|
|
116
|
+
] }) : null
|
|
117
|
+
] });
|
|
118
|
+
};
|
|
119
|
+
const Card = stylin(Box)(({ theme }) => ({
|
|
120
|
+
display: "flex",
|
|
121
|
+
flexDirection: "column",
|
|
122
|
+
gap: theme.spacing(0.5),
|
|
123
|
+
padding: theme.spacing(1.25, 1.5),
|
|
124
|
+
borderRadius: 1,
|
|
125
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
126
|
+
backgroundColor: theme.palette.background.paper,
|
|
127
|
+
minWidth: 0
|
|
128
|
+
}));
|
|
129
|
+
const Header = stylin(Box)(({ theme }) => ({
|
|
130
|
+
display: "flex",
|
|
131
|
+
alignItems: "center",
|
|
132
|
+
gap: theme.spacing(1),
|
|
133
|
+
flexWrap: "wrap",
|
|
134
|
+
minWidth: 0
|
|
135
|
+
}));
|
|
136
|
+
const Spacer = stylin(Box)({
|
|
137
|
+
flex: 1
|
|
138
|
+
});
|
|
139
|
+
const DeploymentIdText = stylin("span")(({ theme }) => ({
|
|
140
|
+
fontFamily: theme.typography.fontFamilyMono,
|
|
141
|
+
fontSize: theme.typography.caption.fontSize,
|
|
142
|
+
color: theme.palette.text.secondary,
|
|
143
|
+
whiteSpace: "nowrap",
|
|
144
|
+
overflow: "hidden",
|
|
145
|
+
textOverflow: "ellipsis",
|
|
146
|
+
maxWidth: theme.spacing(20)
|
|
147
|
+
}));
|
|
148
|
+
const RowButton = stylin(Button)(({ theme }) => ({
|
|
149
|
+
flexShrink: 0,
|
|
150
|
+
padding: theme.spacing(0.25, 1)
|
|
151
|
+
}));
|
|
152
|
+
const Meta = stylin(Typography)(({ theme }) => ({
|
|
153
|
+
color: theme.palette.text.secondary,
|
|
154
|
+
display: "flex",
|
|
155
|
+
flexWrap: "wrap",
|
|
156
|
+
alignItems: "center",
|
|
157
|
+
gap: theme.spacing(0.5),
|
|
158
|
+
minWidth: 0
|
|
159
|
+
}));
|
|
160
|
+
const InstanceName = stylin("span")(({ theme }) => ({
|
|
161
|
+
fontWeight: 600,
|
|
162
|
+
color: theme.palette.text.primary
|
|
163
|
+
}));
|
|
164
|
+
const InstanceLink = stylin(Box)(({ theme }) => ({
|
|
165
|
+
fontWeight: 600,
|
|
166
|
+
color: theme.palette.text.primary,
|
|
167
|
+
textDecoration: "none",
|
|
168
|
+
"&:hover": {
|
|
169
|
+
textDecoration: "underline"
|
|
170
|
+
}
|
|
171
|
+
}));
|
|
172
|
+
const Sep = stylin("span")(({ theme }) => ({
|
|
173
|
+
color: theme.palette.text.disabled
|
|
174
|
+
}));
|
|
175
|
+
const PlanSourceBlock = stylin(Box)(({ theme }) => ({
|
|
176
|
+
display: "flex",
|
|
177
|
+
flexDirection: "column",
|
|
178
|
+
gap: theme.spacing(0.25),
|
|
179
|
+
alignItems: "flex-start",
|
|
180
|
+
marginTop: theme.spacing(0.25)
|
|
181
|
+
}));
|
|
182
|
+
const PlanSourceLink = stylin(Button)(({ theme }) => ({
|
|
183
|
+
alignSelf: "flex-start",
|
|
184
|
+
padding: theme.spacing(0.25, 1),
|
|
185
|
+
marginLeft: theme.spacing(-1)
|
|
186
|
+
}));
|
|
187
|
+
const Message = stylin(Typography)(({ theme }) => ({
|
|
188
|
+
fontStyle: "italic",
|
|
189
|
+
fontSize: theme.typography.caption.fontSize,
|
|
190
|
+
color: theme.palette.text.secondary,
|
|
191
|
+
display: "-webkit-box",
|
|
192
|
+
WebkitLineClamp: 2,
|
|
193
|
+
WebkitBoxOrient: "vertical",
|
|
194
|
+
overflow: "hidden",
|
|
195
|
+
lineHeight: 1.4,
|
|
196
|
+
wordBreak: "break-word",
|
|
197
|
+
marginTop: theme.spacing(0.25)
|
|
198
|
+
}));
|
|
199
|
+
|
|
200
|
+
export { DeploymentRow };
|
|
201
|
+
//# sourceMappingURL=DeploymentRow.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeploymentRow.esm.js","sources":["../../../../src/features/repo/tabs/DeploymentRow.tsx"],"sourcesContent":["import { parseInstanceId } from '@massdriver/backstage-plugin-common';\nimport Box from '@massdriver/ui/Box';\nimport Button from '@massdriver/ui/Button';\nimport Typography from '@massdriver/ui/Typography';\nimport stylin from '@massdriver/ui/stylin';\nimport { InstanceStatusPill } from '../../../components/InstanceStatusPill';\nimport { RouterLinkAdapter } from '../../../components/RouterLinkAdapter';\nimport VersionBadge from '../../../components/VersionBadge';\nimport { formatRelativeTime } from '../../../utils/formatRelativeTime';\nimport { composeInstanceStatus } from '../../../utils/instanceStatuses';\nimport { internalRoutes } from '../../../internalRoutes';\nimport {\n formatElapsed,\n parsePlanMessage,\n truncateDeploymentId,\n} from '../deploymentHelpers';\nimport type { RepoDeployment } from '../types';\n\n// Ported from apps/web/features/repos/sections/DeploymentsTab/DeploymentRow.js.\n//\n// \"Details\" opens the in-place ViewDeploymentDetailsDialog (the `deployment`\n// URL param), \"Logs\" and the clickable status pill open the DeploymentLogsDrawer\n// (the `logs` param), and a plan row's \"Planned deployment of <id>\" link opens\n// the source deployment's details — all via the onViewDetails / onViewLogs\n// callbacks, matching the web. The instance name/link still navigates internally\n// to the instance drawer route (that navigation is correct).\nexport const DeploymentRow = ({\n deployment,\n onViewLogs,\n onViewDetails,\n}: {\n deployment: RepoDeployment;\n onViewLogs: (deploymentId: string) => void;\n onViewDetails: (deploymentId: string) => void;\n}) => {\n const { instance } = deployment;\n const composedStatus = composeInstanceStatus(\n deployment.action,\n deployment.status,\n );\n\n const parsed = instance?.id ? parseInstanceId(instance.id) : null;\n const instanceHref = parsed\n ? internalRoutes.instance(\n parsed.projectId,\n parsed.scopedEnvironmentId,\n parsed.scopedComponentId,\n )\n : null;\n\n // Plan deployments encode their source deployment id in the message\n // (\"Planning deployment <uuid>\\n<source-message>\").\n const planSource =\n deployment.action === 'PLAN' ? parsePlanMessage(deployment.message) : null;\n\n const elapsed = formatElapsed(deployment.elapsedTime);\n const time = formatRelativeTime(\n deployment.lastTransitionedAt ??\n deployment.updatedAt ??\n deployment.createdAt,\n );\n const truncated = truncateDeploymentId(deployment.id);\n const deployedBy = deployment.deployedBy ?? 'system';\n const projectName = instance?.component?.project?.name ?? '—';\n const environmentName = instance?.environment?.name ?? '—';\n const instanceLabel = instance?.id ?? 'Unknown instance';\n\n return (\n <Card>\n <Header>\n <InstanceStatusPill\n status={composedStatus}\n onClick={() => onViewLogs(deployment.id)}\n />\n {deployment.version ? (\n <VersionBadge version={deployment.version} />\n ) : null}\n <Spacer />\n <DeploymentIdText title={deployment.id}>{truncated}</DeploymentIdText>\n <RowButton\n variant=\"text\"\n size=\"small\"\n onClick={() => onViewDetails(deployment.id)}\n >\n Details\n </RowButton>\n <RowButton\n variant=\"text\"\n size=\"small\"\n onClick={() => onViewLogs(deployment.id)}\n >\n Logs\n </RowButton>\n </Header>\n <Meta variant=\"caption\">\n {instanceHref ? (\n <InstanceLink component={RouterLinkAdapter} href={instanceHref}>\n {instanceLabel}\n </InstanceLink>\n ) : (\n <InstanceName>{instanceLabel}</InstanceName>\n )}\n <Sep>·</Sep>\n <span>\n {projectName} <Sep>·</Sep> {environmentName}\n </span>\n <Sep>·</Sep>\n <span>\n by <strong>{deployedBy}</strong>\n </span>\n <Sep>·</Sep>\n <span>{time}</span>\n {elapsed ? (\n <>\n <Sep>·</Sep>\n <span>{elapsed}</span>\n </>\n ) : null}\n </Meta>\n {planSource ? (\n <PlanSourceBlock>\n <PlanSourceLink\n variant=\"text\"\n size=\"small\"\n onClick={() => onViewDetails(planSource.sourceId)}\n >\n Planned deployment of {truncateDeploymentId(planSource.sourceId)}\n </PlanSourceLink>\n {planSource.sourceMessage ? (\n <Message title={planSource.sourceMessage}>\n \"{planSource.sourceMessage}\"\n </Message>\n ) : null}\n </PlanSourceBlock>\n ) : deployment.message ? (\n <Message title={deployment.message}>\"{deployment.message}\"</Message>\n ) : null}\n </Card>\n );\n};\n\nexport default DeploymentRow;\n\nconst Card = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.5),\n padding: theme.spacing(1.25, 1.5),\n borderRadius: 1,\n border: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n minWidth: 0,\n}));\n\nconst Header = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n flexWrap: 'wrap',\n minWidth: 0,\n}));\n\nconst Spacer = stylin(Box)({\n flex: 1,\n});\n\nconst DeploymentIdText = stylin('span')(({ theme }: { theme: any }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: theme.spacing(20),\n}));\n\nconst RowButton = stylin(Button)(({ theme }: { theme: any }) => ({\n flexShrink: 0,\n padding: theme.spacing(0.25, 1),\n}));\n\nconst Meta = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n minWidth: 0,\n}));\n\nconst InstanceName = stylin('span')(({ theme }: { theme: any }) => ({\n fontWeight: 600,\n color: theme.palette.text.primary,\n}));\n\nconst InstanceLink = stylin(Box)(({ theme }: { theme: any }) => ({\n fontWeight: 600,\n color: theme.palette.text.primary,\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n}));\n\nconst Sep = stylin('span')(({ theme }: { theme: any }) => ({\n color: theme.palette.text.disabled,\n}));\n\nconst PlanSourceBlock = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.25),\n alignItems: 'flex-start',\n marginTop: theme.spacing(0.25),\n}));\n\nconst PlanSourceLink = stylin(Button)(({ theme }: { theme: any }) => ({\n alignSelf: 'flex-start',\n padding: theme.spacing(0.25, 1),\n marginLeft: theme.spacing(-1),\n}));\n\n// Wrap up to two lines so a real commit-message-style note is visible without\n// being clipped to a single line; longer messages still ellipsize.\nconst Message = stylin(Typography)(({ theme }: { theme: any }) => ({\n fontStyle: 'italic',\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n lineHeight: 1.4,\n wordBreak: 'break-word',\n marginTop: theme.spacing(0.25),\n}));\n"],"names":[],"mappings":"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"}
|