@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.
Files changed (346) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +196 -0
  3. package/dist/MassdriverRouter.esm.js +78 -0
  4. package/dist/MassdriverRouter.esm.js.map +1 -0
  5. package/dist/api.esm.js +119 -0
  6. package/dist/api.esm.js.map +1 -0
  7. package/dist/assets/massdriver-logo-dark.svg +55 -0
  8. package/dist/assets/massdriver-logo-light.svg +50 -0
  9. package/dist/components/AttributesColumn.esm.js +95 -0
  10. package/dist/components/AttributesColumn.esm.js.map +1 -0
  11. package/dist/components/AttributesSummaryCell.esm.js +103 -0
  12. package/dist/components/AttributesSummaryCell.esm.js.map +1 -0
  13. package/dist/components/AuthedIcon.esm.js +26 -0
  14. package/dist/components/AuthedIcon.esm.js.map +1 -0
  15. package/dist/components/ConditionsCell.esm.js +48 -0
  16. package/dist/components/ConditionsCell.esm.js.map +1 -0
  17. package/dist/components/DisabledAction.esm.js +30 -0
  18. package/dist/components/DisabledAction.esm.js.map +1 -0
  19. package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js +80 -0
  20. package/dist/components/EntityMassdriverContent/EntityMassdriverContent.esm.js.map +1 -0
  21. package/dist/components/EntityMassdriverContent/index.esm.js +6 -0
  22. package/dist/components/EntityMassdriverContent/index.esm.js.map +1 -0
  23. package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js +75 -0
  24. package/dist/components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js.map +1 -0
  25. package/dist/components/EntityMassdriverOverviewCard/index.esm.js +6 -0
  26. package/dist/components/EntityMassdriverOverviewCard/index.esm.js.map +1 -0
  27. package/dist/components/ForkPill.esm.js +84 -0
  28. package/dist/components/ForkPill.esm.js.map +1 -0
  29. package/dist/components/InstanceStatusIndicator.esm.js +21 -0
  30. package/dist/components/InstanceStatusIndicator.esm.js.map +1 -0
  31. package/dist/components/InstanceStatusPill.esm.js +67 -0
  32. package/dist/components/InstanceStatusPill.esm.js.map +1 -0
  33. package/dist/components/MassdriverIcon.esm.js +13 -0
  34. package/dist/components/MassdriverIcon.esm.js.map +1 -0
  35. package/dist/components/MassdriverSidebarItem.esm.js +45 -0
  36. package/dist/components/MassdriverSidebarItem.esm.js.map +1 -0
  37. package/dist/components/NotFound.esm.js +44 -0
  38. package/dist/components/NotFound.esm.js.map +1 -0
  39. package/dist/components/OpenInMassdriverButton.esm.js +24 -0
  40. package/dist/components/OpenInMassdriverButton.esm.js.map +1 -0
  41. package/dist/components/PageLayout.esm.js +88 -0
  42. package/dist/components/PageLayout.esm.js.map +1 -0
  43. package/dist/components/RouterLinkAdapter.esm.js +12 -0
  44. package/dist/components/RouterLinkAdapter.esm.js.map +1 -0
  45. package/dist/components/VersionBadge.esm.js +57 -0
  46. package/dist/components/VersionBadge.esm.js.map +1 -0
  47. package/dist/components/grantColumns.esm.js +56 -0
  48. package/dist/components/grantColumns.esm.js.map +1 -0
  49. package/dist/components/icons/BundleIcon.esm.js +7 -0
  50. package/dist/components/icons/BundleIcon.esm.js.map +1 -0
  51. package/dist/components/icons/FolderOutlinedIcon.esm.js +7 -0
  52. package/dist/components/icons/FolderOutlinedIcon.esm.js.map +1 -0
  53. package/dist/components/icons/TokenIcon.esm.js +7 -0
  54. package/dist/components/icons/TokenIcon.esm.js.map +1 -0
  55. package/dist/entity.esm.js +23 -0
  56. package/dist/entity.esm.js.map +1 -0
  57. package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js +115 -0
  58. package/dist/features/environment/CompareDeploymentsDialog/CompareDeploymentsDialog.esm.js.map +1 -0
  59. package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js +165 -0
  60. package/dist/features/environment/CompareDeploymentsDialog/ResultsStep.esm.js.map +1 -0
  61. package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js +216 -0
  62. package/dist/features/environment/CompareDeploymentsDialog/SelectStep.esm.js.map +1 -0
  63. package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js +86 -0
  64. package/dist/features/environment/CompareDeploymentsDialog/compareColumns.esm.js.map +1 -0
  65. package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js +57 -0
  66. package/dist/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.esm.js.map +1 -0
  67. package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js +53 -0
  68. package/dist/features/environment/CompareDeploymentsDialog/queries.esm.js.map +1 -0
  69. package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js +94 -0
  70. package/dist/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js.map +1 -0
  71. package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js +67 -0
  72. package/dist/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.esm.js.map +1 -0
  73. package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js +202 -0
  74. package/dist/features/environment/CompareEnvironmentsDialog/ResultsStep.esm.js.map +1 -0
  75. package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js +183 -0
  76. package/dist/features/environment/CompareEnvironmentsDialog/SelectStep.esm.js.map +1 -0
  77. package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js +73 -0
  78. package/dist/features/environment/CompareEnvironmentsDialog/compareColumns.esm.js.map +1 -0
  79. package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js +70 -0
  80. package/dist/features/environment/CompareEnvironmentsDialog/flattenComparison.esm.js.map +1 -0
  81. package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js +32 -0
  82. package/dist/features/environment/CompareEnvironmentsDialog/queries.esm.js.map +1 -0
  83. package/dist/features/environment/EnvironmentGraphPage.esm.js +131 -0
  84. package/dist/features/environment/EnvironmentGraphPage.esm.js.map +1 -0
  85. package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js +252 -0
  86. package/dist/features/environment/GraphHeader/EnvironmentDefaults.esm.js.map +1 -0
  87. package/dist/features/environment/GraphHeader/GraphHeader.esm.js +247 -0
  88. package/dist/features/environment/GraphHeader/GraphHeader.esm.js.map +1 -0
  89. package/dist/features/environment/GraphHeader/HeaderActions.esm.js +127 -0
  90. package/dist/features/environment/GraphHeader/HeaderActions.esm.js.map +1 -0
  91. package/dist/features/environment/GraphHeader/Switcher.esm.js +75 -0
  92. package/dist/features/environment/GraphHeader/Switcher.esm.js.map +1 -0
  93. package/dist/features/environment/GraphHeader/queries.esm.js +60 -0
  94. package/dist/features/environment/GraphHeader/queries.esm.js.map +1 -0
  95. package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js +151 -0
  96. package/dist/features/environment/InstanceDrawer/AlarmCard.esm.js.map +1 -0
  97. package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js +165 -0
  98. package/dist/features/environment/InstanceDrawer/InstanceDrawer.esm.js.map +1 -0
  99. package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js +241 -0
  100. package/dist/features/environment/InstanceDrawer/InstanceDrawerHeader.esm.js.map +1 -0
  101. package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js +119 -0
  102. package/dist/features/environment/InstanceDrawer/InstanceTabs.esm.js.map +1 -0
  103. package/dist/features/environment/InstanceDrawer/TabState.esm.js +30 -0
  104. package/dist/features/environment/InstanceDrawer/TabState.esm.js.map +1 -0
  105. package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js +25 -0
  106. package/dist/features/environment/InstanceDrawer/formsDataSource.esm.js.map +1 -0
  107. package/dist/features/environment/InstanceDrawer/helpers.esm.js +282 -0
  108. package/dist/features/environment/InstanceDrawer/helpers.esm.js.map +1 -0
  109. package/dist/features/environment/InstanceDrawer/queries.esm.js +281 -0
  110. package/dist/features/environment/InstanceDrawer/queries.esm.js.map +1 -0
  111. package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js +170 -0
  112. package/dist/features/environment/InstanceDrawer/tabs/ConfigTab.esm.js.map +1 -0
  113. package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js +413 -0
  114. package/dist/features/environment/InstanceDrawer/tabs/DependenciesTab.esm.js.map +1 -0
  115. package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js +191 -0
  116. package/dist/features/environment/InstanceDrawer/tabs/DeploymentLogsPanel.esm.js.map +1 -0
  117. package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js +63 -0
  118. package/dist/features/environment/InstanceDrawer/tabs/DeploymentReadOnlyActions.esm.js.map +1 -0
  119. package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js +48 -0
  120. package/dist/features/environment/InstanceDrawer/tabs/GuideTab.esm.js.map +1 -0
  121. package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js +446 -0
  122. package/dist/features/environment/InstanceDrawer/tabs/HistoryTab.esm.js.map +1 -0
  123. package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js +146 -0
  124. package/dist/features/environment/InstanceDrawer/tabs/MonitorTab.esm.js.map +1 -0
  125. package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js +572 -0
  126. package/dist/features/environment/InstanceDrawer/tabs/OverviewTab.esm.js.map +1 -0
  127. package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js +471 -0
  128. package/dist/features/environment/InstanceDrawer/tabs/ResourcesTab.esm.js.map +1 -0
  129. package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js +109 -0
  130. package/dist/features/environment/InstanceDrawer/tabs/SecretsTab.esm.js.map +1 -0
  131. package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js +384 -0
  132. package/dist/features/environment/InstanceDrawer/tabs/ViewDeploymentDetails.esm.js.map +1 -0
  133. package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js +23 -0
  134. package/dist/features/environment/InstanceDrawer/tabs/flattenParams.esm.js.map +1 -0
  135. package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js +6 -0
  136. package/dist/features/environment/InstanceDrawer/useInstanceApiQuery.esm.js.map +1 -0
  137. package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js +55 -0
  138. package/dist/features/environment/InstanceDrawer/useOverflowMeasure.esm.js.map +1 -0
  139. package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js +44 -0
  140. package/dist/features/environment/InstanceDrawer/useResizableWidth.esm.js.map +1 -0
  141. package/dist/features/environment/components/InstanceStatusPill.esm.js +54 -0
  142. package/dist/features/environment/components/InstanceStatusPill.esm.js.map +1 -0
  143. package/dist/features/environment/graph/Diagram.esm.js +143 -0
  144. package/dist/features/environment/graph/Diagram.esm.js.map +1 -0
  145. package/dist/features/environment/graph/DiagramNode.constants.esm.js +5 -0
  146. package/dist/features/environment/graph/DiagramNode.constants.esm.js.map +1 -0
  147. package/dist/features/environment/graph/DiagramNode.esm.js +221 -0
  148. package/dist/features/environment/graph/DiagramNode.esm.js.map +1 -0
  149. package/dist/features/environment/graph/NodeMeta.esm.js +182 -0
  150. package/dist/features/environment/graph/NodeMeta.esm.js.map +1 -0
  151. package/dist/features/environment/graph/NodeVersionBadges.esm.js +150 -0
  152. package/dist/features/environment/graph/NodeVersionBadges.esm.js.map +1 -0
  153. package/dist/features/environment/graph/diagramFactory.esm.js +151 -0
  154. package/dist/features/environment/graph/diagramFactory.esm.js.map +1 -0
  155. package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js +174 -0
  156. package/dist/features/environment/graph/handles/ExpandableHandleWrapper.esm.js.map +1 -0
  157. package/dist/features/environment/graph/handles/NodeHandle.esm.js +45 -0
  158. package/dist/features/environment/graph/handles/NodeHandle.esm.js.map +1 -0
  159. package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js +134 -0
  160. package/dist/features/environment/graph/handles/NodeHandleTooltip.esm.js.map +1 -0
  161. package/dist/features/environment/graph/handles/handleTypes.esm.js +170 -0
  162. package/dist/features/environment/graph/handles/handleTypes.esm.js.map +1 -0
  163. package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js +19 -0
  164. package/dist/features/environment/graph/handles/useAnimationFrameSync.esm.js.map +1 -0
  165. package/dist/features/environment/graph/handles/useRadialPositions.esm.js +37 -0
  166. package/dist/features/environment/graph/handles/useRadialPositions.esm.js.map +1 -0
  167. package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js +19 -0
  168. package/dist/features/environment/graph/handles/useTransitionLifecycle.esm.js.map +1 -0
  169. package/dist/features/environment/graph/hasUndeployedPlan.esm.js +43 -0
  170. package/dist/features/environment/graph/hasUndeployedPlan.esm.js.map +1 -0
  171. package/dist/features/environment/graph/queries.esm.js +103 -0
  172. package/dist/features/environment/graph/queries.esm.js.map +1 -0
  173. package/dist/features/environment/graph/useDiagramSnapshot.esm.js +43 -0
  174. package/dist/features/environment/graph/useDiagramSnapshot.esm.js.map +1 -0
  175. package/dist/features/environment/realtime/RealtimeProvider.esm.js +43 -0
  176. package/dist/features/environment/realtime/RealtimeProvider.esm.js.map +1 -0
  177. package/dist/features/environment/realtime/queries.esm.js +76 -0
  178. package/dist/features/environment/realtime/queries.esm.js.map +1 -0
  179. package/dist/features/environment/realtime/useLiveRelayQuery.esm.js +36 -0
  180. package/dist/features/environment/realtime/useLiveRelayQuery.esm.js.map +1 -0
  181. package/dist/features/project/ProjectDetailsPage.esm.js +101 -0
  182. package/dist/features/project/ProjectDetailsPage.esm.js.map +1 -0
  183. package/dist/features/project/tabs/ComponentsTab.esm.js +149 -0
  184. package/dist/features/project/tabs/ComponentsTab.esm.js.map +1 -0
  185. package/dist/features/project/tabs/EnvStatus.esm.js +149 -0
  186. package/dist/features/project/tabs/EnvStatus.esm.js.map +1 -0
  187. package/dist/features/project/tabs/EnvironmentsTab.esm.js +199 -0
  188. package/dist/features/project/tabs/EnvironmentsTab.esm.js.map +1 -0
  189. package/dist/features/project/tabs/OverviewTab.esm.js +420 -0
  190. package/dist/features/project/tabs/OverviewTab.esm.js.map +1 -0
  191. package/dist/features/projects/ProjectsListPage.esm.js +50 -0
  192. package/dist/features/projects/ProjectsListPage.esm.js.map +1 -0
  193. package/dist/features/projects/ProjectsListPageLazy.esm.js +12 -0
  194. package/dist/features/projects/ProjectsListPageLazy.esm.js.map +1 -0
  195. package/dist/features/projects/projectColumns.esm.js +38 -0
  196. package/dist/features/projects/projectColumns.esm.js.map +1 -0
  197. package/dist/features/projects/useProjects.esm.js +48 -0
  198. package/dist/features/projects/useProjects.esm.js.map +1 -0
  199. package/dist/features/repo/DeploymentLogsDrawer.esm.js +213 -0
  200. package/dist/features/repo/DeploymentLogsDrawer.esm.js.map +1 -0
  201. package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js +43 -0
  202. package/dist/features/repo/DeploymentLogsDrawer.loading.esm.js.map +1 -0
  203. package/dist/features/repo/FileTree.esm.js +179 -0
  204. package/dist/features/repo/FileTree.esm.js.map +1 -0
  205. package/dist/features/repo/FileViewer.esm.js +115 -0
  206. package/dist/features/repo/FileViewer.esm.js.map +1 -0
  207. package/dist/features/repo/FileViewer.helpers.esm.js +54 -0
  208. package/dist/features/repo/FileViewer.helpers.esm.js.map +1 -0
  209. package/dist/features/repo/RepoDetailsPage.esm.js +127 -0
  210. package/dist/features/repo/RepoDetailsPage.esm.js.map +1 -0
  211. package/dist/features/repo/RepoEmptyState.esm.js +58 -0
  212. package/dist/features/repo/RepoEmptyState.esm.js.map +1 -0
  213. package/dist/features/repo/RepoNoVersionsState.esm.js +29 -0
  214. package/dist/features/repo/RepoNoVersionsState.esm.js.map +1 -0
  215. package/dist/features/repo/RepoTabHeader.esm.js +30 -0
  216. package/dist/features/repo/RepoTabHeader.esm.js.map +1 -0
  217. package/dist/features/repo/RepoTabLayout.esm.js +18 -0
  218. package/dist/features/repo/RepoTabLayout.esm.js.map +1 -0
  219. package/dist/features/repo/RepoVersionSelect.esm.js +176 -0
  220. package/dist/features/repo/RepoVersionSelect.esm.js.map +1 -0
  221. package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js +427 -0
  222. package/dist/features/repo/ViewDeploymentDetailsDialog.esm.js.map +1 -0
  223. package/dist/features/repo/deploymentHelpers.esm.js +74 -0
  224. package/dist/features/repo/deploymentHelpers.esm.js.map +1 -0
  225. package/dist/features/repo/fileTreeHelpers.esm.js +45 -0
  226. package/dist/features/repo/fileTreeHelpers.esm.js.map +1 -0
  227. package/dist/features/repo/flattenParams.esm.js +23 -0
  228. package/dist/features/repo/flattenParams.esm.js.map +1 -0
  229. package/dist/features/repo/queries.esm.js +239 -0
  230. package/dist/features/repo/queries.esm.js.map +1 -0
  231. package/dist/features/repo/repoFilter.esm.js +9 -0
  232. package/dist/features/repo/repoFilter.esm.js.map +1 -0
  233. package/dist/features/repo/repoTabs.esm.js +22 -0
  234. package/dist/features/repo/repoTabs.esm.js.map +1 -0
  235. package/dist/features/repo/resolveVersion.esm.js +22 -0
  236. package/dist/features/repo/resolveVersion.esm.js.map +1 -0
  237. package/dist/features/repo/tabs/DeploymentRow.esm.js +201 -0
  238. package/dist/features/repo/tabs/DeploymentRow.esm.js.map +1 -0
  239. package/dist/features/repo/tabs/DeploymentsTab.esm.js +188 -0
  240. package/dist/features/repo/tabs/DeploymentsTab.esm.js.map +1 -0
  241. package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js +46 -0
  242. package/dist/features/repo/tabs/DeploymentsTab.helpers.esm.js.map +1 -0
  243. package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js +37 -0
  244. package/dist/features/repo/tabs/DeploymentsTab.loading.esm.js.map +1 -0
  245. package/dist/features/repo/tabs/FilesTab.esm.js +142 -0
  246. package/dist/features/repo/tabs/FilesTab.esm.js.map +1 -0
  247. package/dist/features/repo/tabs/InstanceRow.esm.js +121 -0
  248. package/dist/features/repo/tabs/InstanceRow.esm.js.map +1 -0
  249. package/dist/features/repo/tabs/InstancesTab.esm.js +147 -0
  250. package/dist/features/repo/tabs/InstancesTab.esm.js.map +1 -0
  251. package/dist/features/repo/tabs/InstancesTab.helpers.esm.js +44 -0
  252. package/dist/features/repo/tabs/InstancesTab.helpers.esm.js.map +1 -0
  253. package/dist/features/repo/tabs/InstancesTab.loading.esm.js +33 -0
  254. package/dist/features/repo/tabs/InstancesTab.loading.esm.js.map +1 -0
  255. package/dist/features/repo/tabs/OverviewTab.esm.js +77 -0
  256. package/dist/features/repo/tabs/OverviewTab.esm.js.map +1 -0
  257. package/dist/features/repo/tabs/PermissionsTab.esm.js +56 -0
  258. package/dist/features/repo/tabs/PermissionsTab.esm.js.map +1 -0
  259. package/dist/features/repo/tabs/VersionsTab.esm.js +152 -0
  260. package/dist/features/repo/tabs/VersionsTab.esm.js.map +1 -0
  261. package/dist/features/repo/useInfiniteRelayList.esm.js +92 -0
  262. package/dist/features/repo/useInfiniteRelayList.esm.js.map +1 -0
  263. package/dist/features/repo/useInfiniteScroll.esm.js +21 -0
  264. package/dist/features/repo/useInfiniteScroll.esm.js.map +1 -0
  265. package/dist/features/repos/ReposListPage.esm.js +53 -0
  266. package/dist/features/repos/ReposListPage.esm.js.map +1 -0
  267. package/dist/features/repos/queries.esm.js +40 -0
  268. package/dist/features/repos/queries.esm.js.map +1 -0
  269. package/dist/features/repos/repoColumns.esm.js +121 -0
  270. package/dist/features/repos/repoColumns.esm.js.map +1 -0
  271. package/dist/features/repos/useRepos.esm.js +22 -0
  272. package/dist/features/repos/useRepos.esm.js.map +1 -0
  273. package/dist/features/resource/OriginChip.esm.js +42 -0
  274. package/dist/features/resource/OriginChip.esm.js.map +1 -0
  275. package/dist/features/resource/ResourceDetailsPage.esm.js +167 -0
  276. package/dist/features/resource/ResourceDetailsPage.esm.js.map +1 -0
  277. package/dist/features/resource/queries.esm.js +141 -0
  278. package/dist/features/resource/queries.esm.js.map +1 -0
  279. package/dist/features/resource/tabs/GeneralTab.esm.js +247 -0
  280. package/dist/features/resource/tabs/GeneralTab.esm.js.map +1 -0
  281. package/dist/features/resource/tabs/GeneralTab.loading.esm.js +76 -0
  282. package/dist/features/resource/tabs/GeneralTab.loading.esm.js.map +1 -0
  283. package/dist/features/resource/tabs/PermissionsTab.esm.js +57 -0
  284. package/dist/features/resource/tabs/PermissionsTab.esm.js.map +1 -0
  285. package/dist/features/resource/tabs/SettingsTabLayout.esm.js +18 -0
  286. package/dist/features/resource/tabs/SettingsTabLayout.esm.js.map +1 -0
  287. package/dist/features/resource/tabs/TabHeader.esm.js +30 -0
  288. package/dist/features/resource/tabs/TabHeader.esm.js.map +1 -0
  289. package/dist/features/resource/tabs/UsagePanel.esm.js +35 -0
  290. package/dist/features/resource/tabs/UsagePanel.esm.js.map +1 -0
  291. package/dist/features/resource/tabs/UsageTab.esm.js +91 -0
  292. package/dist/features/resource/tabs/UsageTab.esm.js.map +1 -0
  293. package/dist/features/resource/tabs/UsageTab.helpers.esm.js +168 -0
  294. package/dist/features/resource/tabs/UsageTab.helpers.esm.js.map +1 -0
  295. package/dist/features/resources/ResourcesEmptyState.esm.js +148 -0
  296. package/dist/features/resources/ResourcesEmptyState.esm.js.map +1 -0
  297. package/dist/features/resources/ResourcesListPage.esm.js +115 -0
  298. package/dist/features/resources/ResourcesListPage.esm.js.map +1 -0
  299. package/dist/features/resources/queries.esm.js +50 -0
  300. package/dist/features/resources/queries.esm.js.map +1 -0
  301. package/dist/features/resources/resourceColumns.esm.js +158 -0
  302. package/dist/features/resources/resourceColumns.esm.js.map +1 -0
  303. package/dist/features/resources/resourceConstants.esm.js +7 -0
  304. package/dist/features/resources/resourceConstants.esm.js.map +1 -0
  305. package/dist/features/resources/toResourceRow.esm.js +29 -0
  306. package/dist/features/resources/toResourceRow.esm.js.map +1 -0
  307. package/dist/hooks/useAuthedSvg.esm.js +34 -0
  308. package/dist/hooks/useAuthedSvg.esm.js.map +1 -0
  309. package/dist/hooks/useCursorPagination.esm.js +40 -0
  310. package/dist/hooks/useCursorPagination.esm.js.map +1 -0
  311. package/dist/hooks/useMassdriverSubscription.esm.js +61 -0
  312. package/dist/hooks/useMassdriverSubscription.esm.js.map +1 -0
  313. package/dist/hooks/usePaginatedRelayQuery.esm.js +68 -0
  314. package/dist/hooks/usePaginatedRelayQuery.esm.js.map +1 -0
  315. package/dist/index.d.ts +256 -0
  316. package/dist/index.esm.js +8 -0
  317. package/dist/index.esm.js.map +1 -0
  318. package/dist/internalRoutes.esm.js +29 -0
  319. package/dist/internalRoutes.esm.js.map +1 -0
  320. package/dist/plugin.esm.js +57 -0
  321. package/dist/plugin.esm.js.map +1 -0
  322. package/dist/queries.esm.js +54 -0
  323. package/dist/queries.esm.js.map +1 -0
  324. package/dist/routes.esm.js +6 -0
  325. package/dist/routes.esm.js.map +1 -0
  326. package/dist/shell/MassdriverHeader.esm.js +37 -0
  327. package/dist/shell/MassdriverHeader.esm.js.map +1 -0
  328. package/dist/shell/MassdriverShell.esm.js +30 -0
  329. package/dist/shell/MassdriverShell.esm.js.map +1 -0
  330. package/dist/theme/MassdriverThemeScope.esm.js +30 -0
  331. package/dist/theme/MassdriverThemeScope.esm.js.map +1 -0
  332. package/dist/theme/ThemeModeContext.esm.js +35 -0
  333. package/dist/theme/ThemeModeContext.esm.js.map +1 -0
  334. package/dist/theme/muiClassNameAudit.esm.js +11 -0
  335. package/dist/theme/muiClassNameAudit.esm.js.map +1 -0
  336. package/dist/useInstances.esm.js +39 -0
  337. package/dist/useInstances.esm.js.map +1 -0
  338. package/dist/utils/attributes.esm.js +28 -0
  339. package/dist/utils/attributes.esm.js.map +1 -0
  340. package/dist/utils/conditions.esm.js +20 -0
  341. package/dist/utils/conditions.esm.js.map +1 -0
  342. package/dist/utils/formatRelativeTime.esm.js +40 -0
  343. package/dist/utils/formatRelativeTime.esm.js.map +1 -0
  344. package/dist/utils/instanceStatuses.esm.js +74 -0
  345. package/dist/utils/instanceStatuses.esm.js.map +1 -0
  346. package/package.json +92 -0
@@ -0,0 +1,247 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useApi } from '@backstage/frontend-plugin-api';
3
+ import { useNavigate } from 'react-router-dom';
4
+ import { parseEnvironmentId, projectUrl } from '@massdriver/backstage-plugin-common';
5
+ import Box from '@massdriver/ui/Box';
6
+ import Typography from '@massdriver/ui/Typography';
7
+ import IconButton from '@massdriver/ui/IconButton';
8
+ import Tooltip from '@massdriver/ui/Tooltip';
9
+ import Divider from '@massdriver/ui/Divider';
10
+ import { MenuItem } from '@massdriver/ui/Menu';
11
+ import stylin from '@massdriver/ui/stylin';
12
+ import ChevronLeftIcon from '@massdriver/ui/icons/ChevronLeftIcon';
13
+ import AddIcon from '@massdriver/ui/icons/AddIcon';
14
+ import { massdriverApiRef } from '../../../api.esm.js';
15
+ import { ForkPill } from '../../../components/ForkPill.esm.js';
16
+ import { RouterLinkAdapter } from '../../../components/RouterLinkAdapter.esm.js';
17
+ import { internalRoutes } from '../../../internalRoutes.esm.js';
18
+ import { useLiveRelayQuery } from '../realtime/useLiveRelayQuery.esm.js';
19
+ import { Switcher } from './Switcher.esm.js';
20
+ import { EnvironmentDefaults } from './EnvironmentDefaults.esm.js';
21
+ import { HeaderActions } from './HeaderActions.esm.js';
22
+ import { HEADER_PROJECTS_QUERY, HEADER_ENVIRONMENTS_QUERY } from './queries.esm.js';
23
+
24
+ const GraphHeader = ({
25
+ projectId,
26
+ environmentId
27
+ }) => {
28
+ const api = useApi(massdriverApiRef);
29
+ const navigate = useNavigate();
30
+ const projectsQuery = useLiveRelayQuery(
31
+ HEADER_PROJECTS_QUERY,
32
+ {}
33
+ );
34
+ const environmentsQuery = useLiveRelayQuery(
35
+ HEADER_ENVIRONMENTS_QUERY,
36
+ { filter: { projectId: { eq: projectId } } }
37
+ );
38
+ const headerPending = projectsQuery.loading || environmentsQuery.loading || Boolean(projectsQuery.error ?? environmentsQuery.error);
39
+ const projects = (projectsQuery.value?.projects?.items ?? []).filter(
40
+ Boolean
41
+ );
42
+ const environments = (environmentsQuery.value?.environments?.items ?? []).filter(Boolean);
43
+ const project = projects.find((item) => item.id === projectId) ?? null;
44
+ const environment = environments.find((item) => item.id === environmentId) ?? null;
45
+ const projectName = project?.name ?? (headerPending ? projectId : "\u2014");
46
+ const environmentFallback = headerPending ? parseEnvironmentId(environmentId).scopedEnvironmentId : "\u2014";
47
+ const createEnvironmentUrl = `${projectUrl(
48
+ api.appUrl,
49
+ api.organizationId,
50
+ projectId
51
+ )}/environments?createEnvironment=true`;
52
+ const handleProjectChange = async (selectedProjectId) => {
53
+ if (selectedProjectId === projectId) return;
54
+ try {
55
+ const data = await api.query(HEADER_ENVIRONMENTS_QUERY, {
56
+ filter: { projectId: { eq: selectedProjectId } }
57
+ });
58
+ const envs = (data.environments?.items ?? []).filter(
59
+ Boolean
60
+ );
61
+ navigate(
62
+ envs.length > 0 ? internalRoutes.environment(selectedProjectId, envs[0].id) : internalRoutes.projectTab(selectedProjectId, "overview")
63
+ );
64
+ } catch {
65
+ navigate(internalRoutes.projectTab(selectedProjectId, "overview"));
66
+ }
67
+ };
68
+ return /* @__PURE__ */ jsxs(HeaderRoot, { children: [
69
+ /* @__PURE__ */ jsxs(LeftZone, { children: [
70
+ /* @__PURE__ */ jsx(Tooltip, { title: "Back to project", arrow: true, enterDelay: 600, children: /* @__PURE__ */ jsx(
71
+ BackButton,
72
+ {
73
+ size: "small",
74
+ component: RouterLinkAdapter,
75
+ href: internalRoutes.project(projectId),
76
+ "aria-label": "Back to project",
77
+ children: /* @__PURE__ */ jsx(ChevronLeftIcon, { fontSize: "small" })
78
+ }
79
+ ) }),
80
+ /* @__PURE__ */ jsx(
81
+ Switcher,
82
+ {
83
+ ariaLabel: "Switch project",
84
+ trigger: /* @__PURE__ */ jsx(TriggerLabel, { variant: "body2", color: "text.secondary", children: projectName }),
85
+ children: (close) => projects.map((item) => /* @__PURE__ */ jsx(
86
+ MenuItem,
87
+ {
88
+ selected: item.id === projectId,
89
+ onClick: () => {
90
+ close();
91
+ handleProjectChange(item.id);
92
+ },
93
+ children: item.name
94
+ },
95
+ item.id
96
+ ))
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsx(Separator, { children: "/" }),
100
+ /* @__PURE__ */ jsx(
101
+ Switcher,
102
+ {
103
+ ariaLabel: "Switch environment",
104
+ trigger: /* @__PURE__ */ jsxs(Fragment, { children: [
105
+ /* @__PURE__ */ jsx(TriggerLabel, { variant: "body2", children: environment ? environment.name : environmentFallback }),
106
+ environment ? /* @__PURE__ */ jsx(
107
+ ForkPill,
108
+ {
109
+ parent: environment.parent,
110
+ createdAt: environment.createdAt
111
+ }
112
+ ) : null
113
+ ] }),
114
+ children: (close) => [
115
+ /* @__PURE__ */ jsxs(
116
+ CreateMenuItem,
117
+ {
118
+ onClick: () => {
119
+ close();
120
+ window.open(createEnvironmentUrl, "_blank", "noopener");
121
+ },
122
+ children: [
123
+ /* @__PURE__ */ jsx(AddIcon, { fontSize: "small" }),
124
+ /* @__PURE__ */ jsx("span", { children: "Create new environment" })
125
+ ]
126
+ },
127
+ "__create__"
128
+ ),
129
+ /* @__PURE__ */ jsx(Divider, {}, "__divider__"),
130
+ ...environments.map((item) => /* @__PURE__ */ jsxs(
131
+ EnvironmentMenuItem,
132
+ {
133
+ selected: item.id === environmentId,
134
+ title: item.name,
135
+ onClick: () => {
136
+ close();
137
+ navigate(internalRoutes.environment(projectId, item.id));
138
+ },
139
+ children: [
140
+ /* @__PURE__ */ jsx(EnvironmentMenuLabel, { children: item.name }),
141
+ /* @__PURE__ */ jsx(ForkPill, { parent: item.parent, createdAt: item.createdAt })
142
+ ]
143
+ },
144
+ item.id
145
+ ))
146
+ ]
147
+ }
148
+ )
149
+ ] }),
150
+ /* @__PURE__ */ jsx(CenterZone, { children: environment ? /* @__PURE__ */ jsx(EnvironmentDefaults, { environmentId: environment.id }) : null }),
151
+ /* @__PURE__ */ jsx(RightZone, { children: /* @__PURE__ */ jsx(
152
+ HeaderActions,
153
+ {
154
+ appUrl: api.appUrl,
155
+ organizationId: api.organizationId,
156
+ environment,
157
+ environments,
158
+ projectName: project?.name
159
+ }
160
+ ) })
161
+ ] });
162
+ };
163
+ const HeaderRoot = stylin(Box)(({ theme }) => ({
164
+ display: "flex",
165
+ alignItems: "center",
166
+ justifyContent: "space-between",
167
+ height: theme.spacing(6),
168
+ paddingLeft: theme.spacing(1),
169
+ paddingRight: theme.spacing(1.5),
170
+ gap: theme.spacing(1),
171
+ borderBottom: `1px solid ${theme.palette.divider}`,
172
+ backgroundColor: theme.palette.background.paper,
173
+ flexShrink: 0,
174
+ [theme.breakpoints.down("sm")]: {
175
+ overflowX: "auto",
176
+ overflowY: "hidden",
177
+ scrollbarWidth: "none",
178
+ "&::-webkit-scrollbar": { display: "none" }
179
+ }
180
+ }));
181
+ const LeftZone = stylin(Box)(({ theme }) => ({
182
+ display: "flex",
183
+ alignItems: "center",
184
+ gap: theme.spacing(0.5),
185
+ minWidth: 0,
186
+ flexShrink: 1,
187
+ [theme.breakpoints.down("sm")]: {
188
+ flexShrink: 0
189
+ }
190
+ }));
191
+ const CenterZone = stylin(Box)(({ theme }) => ({
192
+ display: "flex",
193
+ alignItems: "center",
194
+ justifyContent: "center",
195
+ flex: 1,
196
+ minWidth: 0,
197
+ [theme.breakpoints.down("sm")]: {
198
+ flex: "none"
199
+ }
200
+ }));
201
+ const RightZone = stylin(Box)({
202
+ display: "flex",
203
+ alignItems: "center",
204
+ flexShrink: 0
205
+ });
206
+ const BackButton = stylin(IconButton)(({ theme }) => ({
207
+ color: theme.palette.text.secondary
208
+ }));
209
+ const TriggerLabel = stylin(Typography)(({ theme }) => ({
210
+ whiteSpace: "nowrap",
211
+ overflow: "hidden",
212
+ textOverflow: "ellipsis",
213
+ maxWidth: theme.spacing(25),
214
+ lineHeight: 1.4,
215
+ [theme.breakpoints.down("md")]: {
216
+ maxWidth: theme.spacing(15)
217
+ }
218
+ }));
219
+ const Separator = stylin(Typography)(({ theme }) => ({
220
+ color: theme.palette.text.disabled,
221
+ fontSize: theme.typography.body2.fontSize,
222
+ lineHeight: 1,
223
+ userSelect: "none"
224
+ }));
225
+ const CreateMenuItem = stylin(MenuItem)(({ theme }) => ({
226
+ display: "flex",
227
+ alignItems: "center",
228
+ gap: theme.spacing(1),
229
+ color: theme.palette.primary.main,
230
+ fontWeight: theme.typography.fontWeightMedium,
231
+ "& > svg": { fontSize: 18 }
232
+ }));
233
+ const EnvironmentMenuItem = stylin(MenuItem)(({ theme }) => ({
234
+ display: "flex",
235
+ alignItems: "center",
236
+ gap: theme.spacing(1)
237
+ }));
238
+ const EnvironmentMenuLabel = stylin("span")({
239
+ flex: 1,
240
+ minWidth: 0,
241
+ overflow: "hidden",
242
+ textOverflow: "ellipsis",
243
+ whiteSpace: "nowrap"
244
+ });
245
+
246
+ export { GraphHeader };
247
+ //# sourceMappingURL=GraphHeader.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphHeader.esm.js","sources":["../../../../src/features/environment/GraphHeader/GraphHeader.tsx"],"sourcesContent":["import { useApi } from '@backstage/frontend-plugin-api';\nimport { useNavigate } from 'react-router-dom';\nimport {\n parseEnvironmentId,\n projectUrl,\n} from '@massdriver/backstage-plugin-common';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport IconButton from '@massdriver/ui/IconButton';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Divider from '@massdriver/ui/Divider';\nimport { MenuItem } from '@massdriver/ui/Menu';\nimport stylin from '@massdriver/ui/stylin';\nimport ChevronLeftIcon from '@massdriver/ui/icons/ChevronLeftIcon';\nimport AddIcon from '@massdriver/ui/icons/AddIcon';\nimport { massdriverApiRef } from '../../../api';\nimport { ForkPill } from '../../../components/ForkPill';\nimport { RouterLinkAdapter } from '../../../components/RouterLinkAdapter';\nimport { internalRoutes } from '../../../internalRoutes';\nimport { useLiveRelayQuery } from '../realtime/useLiveRelayQuery';\nimport Switcher from './Switcher';\nimport EnvironmentDefaults from './EnvironmentDefaults';\nimport HeaderActions from './HeaderActions';\nimport {\n HEADER_ENVIRONMENTS_QUERY,\n HEADER_PROJECTS_QUERY,\n type HeaderEnvironment,\n type HeaderEnvironmentsResult,\n type HeaderProject,\n type HeaderProjectsResult,\n} from './queries';\n\n/**\n * Read-only environment graph header: back-to-project link, project + env\n * switchers, centered environment defaults, and right-hand actions. Ports the\n * web app's `GraphHeader` layout without any mutation surface.\n */\nexport const GraphHeader = ({\n projectId,\n environmentId,\n}: {\n projectId: string;\n environmentId: string;\n}) => {\n const api = useApi(massdriverApiRef);\n const navigate = useNavigate();\n\n // Live queries: a project/environment created or renamed in the web app\n // shows up in the switchers on the next realtime event.\n const projectsQuery = useLiveRelayQuery<HeaderProjectsResult>(\n HEADER_PROJECTS_QUERY,\n {},\n );\n const environmentsQuery = useLiveRelayQuery<HeaderEnvironmentsResult>(\n HEADER_ENVIRONMENTS_QUERY,\n { filter: { projectId: { eq: projectId } } },\n );\n const headerPending =\n projectsQuery.loading ||\n environmentsQuery.loading ||\n Boolean(projectsQuery.error ?? environmentsQuery.error);\n\n const projects = (projectsQuery.value?.projects?.items ?? []).filter(\n Boolean,\n ) as HeaderProject[];\n const environments = (\n environmentsQuery.value?.environments?.items ?? []\n ).filter(Boolean) as HeaderEnvironment[];\n const project = projects.find(item => item.id === projectId) ?? null;\n const environment =\n environments.find(item => item.id === environmentId) ?? null;\n\n // While loading (or if the header queries fail) fall back to the route ids —\n // never pretend an existing project/environment is missing.\n const projectName = project?.name ?? (headerPending ? projectId : '—');\n const environmentFallback = headerPending\n ? parseEnvironmentId(environmentId).scopedEnvironmentId\n : '—';\n const createEnvironmentUrl = `${projectUrl(\n api.appUrl,\n api.organizationId,\n projectId,\n )}/environments?createEnvironment=true`;\n\n // Switching project navigates to that project's first environment graph, or\n // its overview if it has no environments (mirrors the web app).\n const handleProjectChange = async (selectedProjectId: string) => {\n if (selectedProjectId === projectId) return;\n try {\n const data = (await api.query(HEADER_ENVIRONMENTS_QUERY, {\n filter: { projectId: { eq: selectedProjectId } },\n })) as HeaderEnvironmentsResult;\n const envs = (data.environments?.items ?? []).filter(\n Boolean,\n ) as HeaderEnvironment[];\n navigate(\n envs.length > 0\n ? internalRoutes.environment(selectedProjectId, envs[0].id)\n : internalRoutes.projectTab(selectedProjectId, 'overview'),\n );\n } catch {\n navigate(internalRoutes.projectTab(selectedProjectId, 'overview'));\n }\n };\n\n return (\n <HeaderRoot>\n <LeftZone>\n <Tooltip title=\"Back to project\" arrow enterDelay={600}>\n <BackButton\n size=\"small\"\n component={RouterLinkAdapter}\n href={internalRoutes.project(projectId)}\n aria-label=\"Back to project\"\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </BackButton>\n </Tooltip>\n\n <Switcher\n ariaLabel=\"Switch project\"\n trigger={\n <TriggerLabel variant=\"body2\" color=\"text.secondary\">\n {projectName}\n </TriggerLabel>\n }\n >\n {close =>\n projects.map(item => (\n <MenuItem\n key={item.id}\n selected={item.id === projectId}\n onClick={() => {\n close();\n handleProjectChange(item.id);\n }}\n >\n {item.name}\n </MenuItem>\n ))\n }\n </Switcher>\n\n <Separator>/</Separator>\n\n <Switcher\n ariaLabel=\"Switch environment\"\n trigger={\n <>\n <TriggerLabel variant=\"body2\">\n {environment ? environment.name : environmentFallback}\n </TriggerLabel>\n {environment ? (\n <ForkPill\n parent={environment.parent}\n createdAt={environment.createdAt}\n />\n ) : null}\n </>\n }\n >\n {close => [\n <CreateMenuItem\n key=\"__create__\"\n onClick={() => {\n close();\n window.open(createEnvironmentUrl, '_blank', 'noopener');\n }}\n >\n <AddIcon fontSize=\"small\" />\n <span>Create new environment</span>\n </CreateMenuItem>,\n <Divider key=\"__divider__\" />,\n ...environments.map(item => (\n <EnvironmentMenuItem\n key={item.id}\n selected={item.id === environmentId}\n title={item.name}\n onClick={() => {\n close();\n navigate(internalRoutes.environment(projectId, item.id));\n }}\n >\n <EnvironmentMenuLabel>{item.name}</EnvironmentMenuLabel>\n <ForkPill parent={item.parent} createdAt={item.createdAt} />\n </EnvironmentMenuItem>\n )),\n ]}\n </Switcher>\n </LeftZone>\n\n <CenterZone>\n {environment ? (\n <EnvironmentDefaults environmentId={environment.id} />\n ) : null}\n </CenterZone>\n\n <RightZone>\n <HeaderActions\n appUrl={api.appUrl}\n organizationId={api.organizationId}\n environment={environment}\n environments={environments}\n projectName={project?.name}\n />\n </RightZone>\n </HeaderRoot>\n );\n};\n\nexport default GraphHeader;\n\nconst HeaderRoot = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: theme.spacing(6),\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1.5),\n gap: theme.spacing(1),\n borderBottom: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n flexShrink: 0,\n [theme.breakpoints.down('sm')]: {\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'none',\n '&::-webkit-scrollbar': { display: 'none' },\n },\n}));\n\nconst LeftZone = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n minWidth: 0,\n flexShrink: 1,\n [theme.breakpoints.down('sm')]: {\n flexShrink: 0,\n },\n}));\n\nconst CenterZone = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flex: 1,\n minWidth: 0,\n [theme.breakpoints.down('sm')]: {\n flex: 'none',\n },\n}));\n\nconst RightZone = stylin(Box)({\n display: 'flex',\n alignItems: 'center',\n flexShrink: 0,\n});\n\nconst BackButton = stylin(IconButton)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n}));\n\nconst TriggerLabel = stylin(Typography)(({ theme }: { theme: any }) => ({\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: theme.spacing(25),\n lineHeight: 1.4,\n [theme.breakpoints.down('md')]: {\n maxWidth: theme.spacing(15),\n },\n}));\n\nconst Separator = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.disabled,\n fontSize: theme.typography.body2.fontSize,\n lineHeight: 1,\n userSelect: 'none',\n}));\n\nconst CreateMenuItem = stylin(MenuItem)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n color: theme.palette.primary.main,\n fontWeight: theme.typography.fontWeightMedium,\n '& > svg': { fontSize: 18 },\n}));\n\nconst EnvironmentMenuItem = stylin(MenuItem)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nconst EnvironmentMenuLabel = stylin('span')({\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import { environmentUrl } from '@massdriver/backstage-plugin-common';
4
+ import Box from '@massdriver/ui/Box';
5
+ import Button from '@massdriver/ui/Button';
6
+ import IconButton from '@massdriver/ui/IconButton';
7
+ import Tooltip from '@massdriver/ui/Tooltip';
8
+ import Divider from '@massdriver/ui/Divider';
9
+ import stylin from '@massdriver/ui/stylin';
10
+ import CompareArrowsIcon from '@massdriver/ui/icons/CompareArrowsIcon';
11
+ import ForkRightIcon from '@massdriver/ui/icons/ForkRightIcon';
12
+ import SettingsIcon from '@massdriver/ui/icons/SettingsIcon';
13
+ import { CompareEnvironmentsDialog } from '../CompareEnvironmentsDialog/CompareEnvironmentsDialog.esm.js';
14
+
15
+ const HeaderActions = ({
16
+ appUrl,
17
+ organizationId,
18
+ environment,
19
+ environments,
20
+ projectName
21
+ }) => {
22
+ const [compareOpen, setCompareOpen] = useState(false);
23
+ const canCompare = environments.length >= 2;
24
+ const envBaseUrl = environment ? environmentUrl(appUrl, organizationId, environment.id) : null;
25
+ const forkUrl = envBaseUrl ? `${envBaseUrl}?forkEnvironment=true` : void 0;
26
+ const settingsUrl = envBaseUrl ? `${envBaseUrl}/settings` : void 0;
27
+ return /* @__PURE__ */ jsxs(Root, { children: [
28
+ /* @__PURE__ */ jsx(Tooltip, { title: "Fork this environment", arrow: true, enterDelay: 400, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsxs(
29
+ Action,
30
+ {
31
+ variant: "text",
32
+ href: forkUrl,
33
+ target: "_blank",
34
+ rel: "noopener noreferrer",
35
+ disabled: !environment,
36
+ children: [
37
+ /* @__PURE__ */ jsx(ForkRightIcon, {}),
38
+ /* @__PURE__ */ jsx(Label, { children: "Fork" })
39
+ ]
40
+ }
41
+ ) }) }),
42
+ /* @__PURE__ */ jsx(
43
+ Tooltip,
44
+ {
45
+ title: canCompare ? "Compare" : "Need at least two environments to compare",
46
+ arrow: true,
47
+ enterDelay: 400,
48
+ children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsxs(
49
+ Action,
50
+ {
51
+ variant: "text",
52
+ disabled: !canCompare,
53
+ onClick: () => setCompareOpen(true),
54
+ children: [
55
+ /* @__PURE__ */ jsx(CompareArrowsIcon, {}),
56
+ /* @__PURE__ */ jsx(Label, { children: "Compare" })
57
+ ]
58
+ }
59
+ ) })
60
+ }
61
+ ),
62
+ /* @__PURE__ */ jsx(StyledDivider, { orientation: "vertical", flexItem: true }),
63
+ /* @__PURE__ */ jsx(Tooltip, { title: "Environment settings", arrow: true, enterDelay: 400, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
64
+ GearButton,
65
+ {
66
+ size: "small",
67
+ href: settingsUrl,
68
+ target: "_blank",
69
+ rel: "noopener noreferrer",
70
+ disabled: !environment,
71
+ "aria-label": "Environment settings",
72
+ children: /* @__PURE__ */ jsx(SettingsIcon, {})
73
+ }
74
+ ) }) }),
75
+ /* @__PURE__ */ jsx(
76
+ CompareEnvironmentsDialog,
77
+ {
78
+ open: compareOpen,
79
+ onClose: () => setCompareOpen(false),
80
+ projectName,
81
+ environments,
82
+ defaultSourceEnvironment: environment
83
+ }
84
+ )
85
+ ] });
86
+ };
87
+ const Root = stylin(Box)(({ theme }) => ({
88
+ display: "flex",
89
+ alignItems: "center",
90
+ gap: theme.spacing(0.25)
91
+ }));
92
+ const Action = stylin(Button)(({ theme }) => ({
93
+ alignItems: "center",
94
+ minWidth: theme.spacing(2.5),
95
+ gap: theme.spacing(0.5),
96
+ padding: `${theme.spacing(0.5)} ${theme.spacing(1)}`,
97
+ color: theme.palette.text.secondary,
98
+ fontSize: theme.typography.caption.fontSize,
99
+ fontWeight: 500,
100
+ fontFamily: theme.typography.fontFamily,
101
+ whiteSpace: "nowrap",
102
+ transition: "color 120ms ease, background-color 120ms ease",
103
+ "& > svg": { fontSize: 18 },
104
+ "&:hover": {
105
+ color: theme.palette.text.primary,
106
+ backgroundColor: theme.palette.action.hover
107
+ }
108
+ }));
109
+ const Label = stylin("span")(({ theme }) => ({
110
+ [theme.breakpoints.down("md")]: {
111
+ display: "none"
112
+ }
113
+ }));
114
+ const GearButton = stylin(IconButton)(({ theme }) => ({
115
+ color: theme.palette.text.secondary,
116
+ "& > svg": { fontSize: 18 },
117
+ "&:hover": {
118
+ color: theme.palette.text.primary
119
+ }
120
+ }));
121
+ const StyledDivider = stylin(Divider)(({ theme }) => ({
122
+ marginLeft: theme.spacing(0.5),
123
+ marginRight: theme.spacing(0.5)
124
+ }));
125
+
126
+ export { HeaderActions, HeaderActions as default };
127
+ //# sourceMappingURL=HeaderActions.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeaderActions.esm.js","sources":["../../../../src/features/environment/GraphHeader/HeaderActions.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { environmentUrl } from '@massdriver/backstage-plugin-common';\nimport Box from '@massdriver/ui/Box';\nimport Button from '@massdriver/ui/Button';\nimport IconButton from '@massdriver/ui/IconButton';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Divider from '@massdriver/ui/Divider';\nimport stylin from '@massdriver/ui/stylin';\nimport CompareArrowsIcon from '@massdriver/ui/icons/CompareArrowsIcon';\nimport ForkRightIcon from '@massdriver/ui/icons/ForkRightIcon';\nimport SettingsIcon from '@massdriver/ui/icons/SettingsIcon';\nimport CompareEnvironmentsDialog from '../CompareEnvironmentsDialog';\nimport type { HeaderEnvironment } from './queries';\n\n/**\n * Right-hand header actions. Fork + Settings deep-link out to the web app (this\n * plugin is read-only); Compare opens the local read-only comparison dialog.\n */\nexport const HeaderActions = ({\n appUrl,\n organizationId,\n environment,\n environments,\n projectName,\n}: {\n appUrl: string;\n organizationId: string;\n environment: HeaderEnvironment | null;\n environments: HeaderEnvironment[];\n projectName?: string;\n}) => {\n const [compareOpen, setCompareOpen] = useState(false);\n\n const canCompare = environments.length >= 2;\n const envBaseUrl = environment\n ? environmentUrl(appUrl, organizationId, environment.id)\n : null;\n const forkUrl = envBaseUrl ? `${envBaseUrl}?forkEnvironment=true` : undefined;\n const settingsUrl = envBaseUrl ? `${envBaseUrl}/settings` : undefined;\n\n return (\n <Root>\n <Tooltip title=\"Fork this environment\" arrow enterDelay={400}>\n <span>\n <Action\n variant=\"text\"\n href={forkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n disabled={!environment}\n >\n <ForkRightIcon />\n <Label>Fork</Label>\n </Action>\n </span>\n </Tooltip>\n\n <Tooltip\n title={\n canCompare ? 'Compare' : 'Need at least two environments to compare'\n }\n arrow\n enterDelay={400}\n >\n <span>\n <Action\n variant=\"text\"\n disabled={!canCompare}\n onClick={() => setCompareOpen(true)}\n >\n <CompareArrowsIcon />\n <Label>Compare</Label>\n </Action>\n </span>\n </Tooltip>\n\n <StyledDivider orientation=\"vertical\" flexItem />\n\n <Tooltip title=\"Environment settings\" arrow enterDelay={400}>\n <span>\n <GearButton\n size=\"small\"\n href={settingsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n disabled={!environment}\n aria-label=\"Environment settings\"\n >\n <SettingsIcon />\n </GearButton>\n </span>\n </Tooltip>\n\n <CompareEnvironmentsDialog\n open={compareOpen}\n onClose={() => setCompareOpen(false)}\n projectName={projectName}\n environments={environments}\n defaultSourceEnvironment={environment}\n />\n </Root>\n );\n};\n\nexport default HeaderActions;\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.25),\n}));\n\nconst Action = stylin(Button)(({ theme }: { theme: any }) => ({\n alignItems: 'center',\n minWidth: theme.spacing(2.5),\n gap: theme.spacing(0.5),\n padding: `${theme.spacing(0.5)} ${theme.spacing(1)}`,\n color: theme.palette.text.secondary,\n fontSize: theme.typography.caption.fontSize,\n fontWeight: 500,\n fontFamily: theme.typography.fontFamily,\n whiteSpace: 'nowrap',\n transition: 'color 120ms ease, background-color 120ms ease',\n '& > svg': { fontSize: 18 },\n '&:hover': {\n color: theme.palette.text.primary,\n backgroundColor: theme.palette.action.hover,\n },\n}));\n\nconst Label = stylin('span')(({ theme }: { theme: any }) => ({\n [theme.breakpoints.down('md')]: {\n display: 'none',\n },\n}));\n\nconst GearButton = stylin(IconButton)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n '& > svg': { fontSize: 18 },\n '&:hover': {\n color: theme.palette.text.primary,\n },\n}));\n\nconst StyledDivider = stylin(Divider)(({ theme }: { theme: any }) => ({\n marginLeft: theme.spacing(0.5),\n marginRight: theme.spacing(0.5),\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import Box from '@massdriver/ui/Box';
4
+ import Menu from '@massdriver/ui/Menu';
5
+ import ArrowDropDownIcon from '@massdriver/ui/icons/ArrowDropDownIcon';
6
+ import stylin from '@massdriver/ui/stylin';
7
+
8
+ const Switcher = ({
9
+ trigger,
10
+ children,
11
+ ariaLabel
12
+ }) => {
13
+ const [anchorEl, setAnchorEl] = useState(null);
14
+ const open = Boolean(anchorEl);
15
+ const close = () => setAnchorEl(null);
16
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
17
+ /* @__PURE__ */ jsxs(
18
+ Trigger,
19
+ {
20
+ role: "button",
21
+ tabIndex: 0,
22
+ "aria-label": ariaLabel,
23
+ onClick: (event) => setAnchorEl(event.currentTarget),
24
+ onKeyDown: (event) => {
25
+ if (event.key === "Enter" || event.key === " ") {
26
+ event.preventDefault();
27
+ setAnchorEl(event.currentTarget);
28
+ }
29
+ },
30
+ children: [
31
+ trigger,
32
+ /* @__PURE__ */ jsx(DropdownIcon, {})
33
+ ]
34
+ }
35
+ ),
36
+ /* @__PURE__ */ jsx(
37
+ Menu,
38
+ {
39
+ anchorEl,
40
+ open,
41
+ onClose: close,
42
+ anchorOrigin: { vertical: "bottom", horizontal: "left" },
43
+ transformOrigin: { vertical: "top", horizontal: "left" },
44
+ MenuListProps: { sx: { py: 0.5 } },
45
+ slotProps: { paper: { sx: { maxWidth: 320, minWidth: 200 } } },
46
+ children: children(close)
47
+ }
48
+ )
49
+ ] });
50
+ };
51
+ const Trigger = stylin(Box)(({ theme }) => ({
52
+ display: "flex",
53
+ alignItems: "center",
54
+ gap: theme.spacing(0.5),
55
+ cursor: "pointer",
56
+ padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,
57
+ borderRadius: theme.custom.general.borderRadius,
58
+ transition: "background-color 120ms ease",
59
+ minWidth: 0,
60
+ "&:hover": {
61
+ backgroundColor: theme.palette.action.hover
62
+ },
63
+ "&:focus-visible": {
64
+ outline: `2px solid ${theme.palette.primary.main}`,
65
+ outlineOffset: 2
66
+ }
67
+ }));
68
+ const DropdownIcon = stylin(ArrowDropDownIcon)(({ theme }) => ({
69
+ color: theme.palette.text.disabled,
70
+ fontSize: 16,
71
+ flexShrink: 0
72
+ }));
73
+
74
+ export { Switcher, Switcher as default };
75
+ //# sourceMappingURL=Switcher.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switcher.esm.js","sources":["../../../../src/features/environment/GraphHeader/Switcher.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport Box from '@massdriver/ui/Box';\nimport Menu from '@massdriver/ui/Menu';\nimport ArrowDropDownIcon from '@massdriver/ui/icons/ArrowDropDownIcon';\nimport stylin from '@massdriver/ui/stylin';\n\n/**\n * A click-to-open dropdown built on `@massdriver/ui/Menu`. Replaces the web\n * app's Apollo-backed `InfiniteSelect` with a plain menu — the header already\n * has the full option list in memory, so no infinite scroll is needed.\n *\n * `trigger` renders the label; `children` is a render-prop given a `close`\n * callback to build the menu body.\n */\nexport const Switcher = ({\n trigger,\n children,\n ariaLabel,\n}: {\n trigger: ReactNode;\n children: (close: () => void) => ReactNode;\n ariaLabel?: string;\n}) => {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const close = () => setAnchorEl(null);\n\n return (\n <>\n <Trigger\n role=\"button\"\n tabIndex={0}\n aria-label={ariaLabel}\n onClick={(event: any) => setAnchorEl(event.currentTarget)}\n onKeyDown={(event: any) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setAnchorEl(event.currentTarget);\n }\n }}\n >\n {trigger}\n <DropdownIcon />\n </Trigger>\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n transformOrigin={{ vertical: 'top', horizontal: 'left' }}\n MenuListProps={{ sx: { py: 0.5 } }}\n slotProps={{ paper: { sx: { maxWidth: 320, minWidth: 200 } } }}\n >\n {children(close)}\n </Menu>\n </>\n );\n};\n\nexport default Switcher;\n\nconst Trigger = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n cursor: 'pointer',\n padding: `${theme.spacing(0.5)} ${theme.spacing(0.75)}`,\n borderRadius: theme.custom.general.borderRadius,\n transition: 'background-color 120ms ease',\n minWidth: 0,\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n}));\n\nconst DropdownIcon = stylin(ArrowDropDownIcon)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.disabled,\n fontSize: 16,\n flexShrink: 0,\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ const HEADER_PROJECTS_QUERY = `
2
+ query MassdriverHeaderProjects($organizationId: ID!) {
3
+ projects(organizationId: $organizationId, cursor: { limit: 100 }) {
4
+ items {
5
+ id
6
+ name
7
+ }
8
+ }
9
+ }
10
+ `;
11
+ const HEADER_ENVIRONMENTS_QUERY = `
12
+ query MassdriverHeaderEnvironments(
13
+ $organizationId: ID!
14
+ $filter: EnvironmentsFilter
15
+ ) {
16
+ environments(
17
+ organizationId: $organizationId
18
+ filter: $filter
19
+ cursor: { limit: 100 }
20
+ ) {
21
+ items {
22
+ id
23
+ name
24
+ createdAt
25
+ parent {
26
+ id
27
+ name
28
+ createdAt
29
+ }
30
+ }
31
+ }
32
+ }
33
+ `;
34
+ const ENVIRONMENT_DEFAULTS_QUERY = `
35
+ query MassdriverEnvironmentDefaults(
36
+ $organizationId: ID!
37
+ $environmentId: ID!
38
+ ) {
39
+ environment(organizationId: $organizationId, id: $environmentId) {
40
+ id
41
+ defaults(cursor: { limit: 100 }) {
42
+ items {
43
+ id
44
+ resource {
45
+ id
46
+ name
47
+ resourceType {
48
+ id
49
+ name
50
+ icon
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
57
+ `;
58
+
59
+ export { ENVIRONMENT_DEFAULTS_QUERY, HEADER_ENVIRONMENTS_QUERY, HEADER_PROJECTS_QUERY };
60
+ //# sourceMappingURL=queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.esm.js","sources":["../../../../src/features/environment/GraphHeader/queries.ts"],"sourcesContent":["// Queries backing the read-only environment graph header. `organizationId` is\n// injected by the backend relay, so callers pass only the other variables.\n\n// Both switcher queries carry an explicit cursor bound: the current\n// project/environment is resolved by `.find()` over the returned page, so an\n// unbounded (default-page) query could fail to resolve an entity that sorts\n// past the first page — the header would show '—' for a project/environment\n// that exists.\nexport const HEADER_PROJECTS_QUERY = `\n query MassdriverHeaderProjects($organizationId: ID!) {\n projects(organizationId: $organizationId, cursor: { limit: 100 }) {\n items {\n id\n name\n }\n }\n }\n`;\n\nexport const HEADER_ENVIRONMENTS_QUERY = `\n query MassdriverHeaderEnvironments(\n $organizationId: ID!\n $filter: EnvironmentsFilter\n ) {\n environments(\n organizationId: $organizationId\n filter: $filter\n cursor: { limit: 100 }\n ) {\n items {\n id\n name\n createdAt\n parent {\n id\n name\n createdAt\n }\n }\n }\n }\n`;\n\nexport const ENVIRONMENT_DEFAULTS_QUERY = `\n query MassdriverEnvironmentDefaults(\n $organizationId: ID!\n $environmentId: ID!\n ) {\n environment(organizationId: $organizationId, id: $environmentId) {\n id\n defaults(cursor: { limit: 100 }) {\n items {\n id\n resource {\n id\n name\n resourceType {\n id\n name\n icon\n }\n }\n }\n }\n }\n }\n`;\n\nexport interface HeaderProject {\n id: string;\n name: string;\n}\n\nexport interface HeaderEnvironment {\n id: string;\n name: string;\n createdAt?: string | null;\n parent?: { id: string; name?: string; createdAt?: string } | null;\n}\n\nexport interface HeaderProjectsResult {\n projects: { items?: (HeaderProject | null)[] | null } | null;\n}\n\nexport interface HeaderEnvironmentsResult {\n environments: { items?: (HeaderEnvironment | null)[] | null } | null;\n}\n\nexport interface ResourceType {\n id: string;\n name: string;\n icon?: string | null;\n}\n\nexport interface EnvironmentDefaultItem {\n id: string;\n resource: {\n id: string;\n name: string;\n resourceType: ResourceType;\n };\n}\n\nexport interface EnvironmentDefaultsResult {\n environment: {\n id: string;\n defaults?: { items?: (EnvironmentDefaultItem | null)[] | null } | null;\n } | null;\n}\n"],"names":[],"mappings":"AAQO,MAAM,qBAAA,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW9B,MAAM,yBAAA,GAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBlC,MAAM,0BAAA,GAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;"}