@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,216 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import Typography from '@massdriver/ui/Typography';
4
+ import IconButton from '@massdriver/ui/IconButton';
5
+ import Tooltip from '@massdriver/ui/Tooltip';
6
+ import Button from '@massdriver/ui/Button';
7
+ import Select, { MenuItem } from '@massdriver/ui/Select';
8
+ import stylin from '@massdriver/ui/stylin';
9
+ import CompareArrowsIcon from '@massdriver/ui/icons/CompareArrowsIcon';
10
+ import SwapHorizIcon from '@massdriver/ui/icons/SwapHorizIcon';
11
+ import VersionBadge from '../../../components/VersionBadge.esm.js';
12
+ import { truncateDeploymentId, formatDeploymentStatus } from '../InstanceDrawer/helpers.esm.js';
13
+
14
+ const optionLabel = (deployment, fallbackId, position) => {
15
+ const short = truncateDeploymentId(deployment?.id ?? fallbackId);
16
+ return position != null ? `#${position} \xB7 ${short}` : short;
17
+ };
18
+ const SelectStep = ({
19
+ source,
20
+ target,
21
+ deployments,
22
+ positionMap,
23
+ onSourceChange,
24
+ onTargetChange,
25
+ onSwap,
26
+ onCompare
27
+ }) => {
28
+ const sameSelected = Boolean(source && target && source.id === target.id);
29
+ const canCompare = Boolean(source && target && !sameSelected);
30
+ const canSwap = Boolean(source) && Boolean(target);
31
+ const find = (id) => deployments.find((deployment) => deployment.id === id) ?? null;
32
+ const renderOptions = (excludeId) => deployments.map((deployment) => /* @__PURE__ */ jsx(
33
+ MenuItem,
34
+ {
35
+ value: deployment.id,
36
+ disabled: deployment.id === excludeId,
37
+ children: /* @__PURE__ */ jsxs(OptionRow, { children: [
38
+ /* @__PURE__ */ jsxs(OptionMain, { children: [
39
+ /* @__PURE__ */ jsx(Position, { children: positionMap.get(deployment.id) ?? "" }),
40
+ /* @__PURE__ */ jsx(OptionId, { title: deployment.id, children: truncateDeploymentId(deployment.id) }),
41
+ deployment.version ? /* @__PURE__ */ jsx(VersionBadge, { version: deployment.version }) : null
42
+ ] }),
43
+ /* @__PURE__ */ jsx(OptionStatus, { children: formatDeploymentStatus(deployment.action, deployment.status) })
44
+ ] })
45
+ },
46
+ deployment.id
47
+ ));
48
+ return /* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Center, { children: [
49
+ /* @__PURE__ */ jsx(IconBadge, { children: /* @__PURE__ */ jsx(CompareArrowsIcon, {}) }),
50
+ /* @__PURE__ */ jsxs(Heading, { children: [
51
+ /* @__PURE__ */ jsx(Typography, { variant: "h4", component: "h2", children: "Compare Deployments" }),
52
+ /* @__PURE__ */ jsx(Typography, { variant: "body1", color: "text.secondary", children: "Pick two deployments to see how their parameters and version differ." })
53
+ ] }),
54
+ /* @__PURE__ */ jsxs(PickerRow, { children: [
55
+ /* @__PURE__ */ jsx(PickerSlot, { children: /* @__PURE__ */ jsx(
56
+ Select,
57
+ {
58
+ fullWidth: true,
59
+ displayEmpty: true,
60
+ value: source?.id ?? "",
61
+ onChange: (event) => onSourceChange(find(event.target.value)),
62
+ renderValue: (value) => value ? optionLabel(find(value), value, positionMap.get(value)) : "Pick a deployment\u2026",
63
+ children: renderOptions(target?.id)
64
+ }
65
+ ) }),
66
+ /* @__PURE__ */ jsx(
67
+ Tooltip,
68
+ {
69
+ title: canSwap ? "Swap deployments" : "Pick both first",
70
+ arrow: true,
71
+ children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
72
+ SwapButton,
73
+ {
74
+ size: "medium",
75
+ onClick: onSwap,
76
+ disabled: !canSwap,
77
+ "aria-label": "Swap deployments",
78
+ children: /* @__PURE__ */ jsx(SwapHorizIcon, {})
79
+ }
80
+ ) })
81
+ }
82
+ ),
83
+ /* @__PURE__ */ jsx(PickerSlot, { children: /* @__PURE__ */ jsx(
84
+ Select,
85
+ {
86
+ fullWidth: true,
87
+ displayEmpty: true,
88
+ value: target?.id ?? "",
89
+ onChange: (event) => onTargetChange(find(event.target.value)),
90
+ renderValue: (value) => value ? optionLabel(find(value), value, positionMap.get(value)) : "Pick a deployment\u2026",
91
+ children: renderOptions(source?.id)
92
+ }
93
+ ) })
94
+ ] }),
95
+ sameSelected ? /* @__PURE__ */ jsx(WarnLine, { variant: "caption", children: "Pick two different deployments to compare." }) : /* @__PURE__ */ jsx(Spacer, {}),
96
+ /* @__PURE__ */ jsx(
97
+ CompareButton,
98
+ {
99
+ variant: "contained",
100
+ size: "large",
101
+ onClick: onCompare,
102
+ disabled: !canCompare,
103
+ children: "Compare"
104
+ }
105
+ )
106
+ ] }) });
107
+ };
108
+ const Root = stylin(Box)(({ theme }) => ({
109
+ flex: 1,
110
+ display: "flex",
111
+ alignItems: "center",
112
+ justifyContent: "center",
113
+ padding: theme.spacing(4)
114
+ }));
115
+ const Center = stylin(Box)(({ theme }) => ({
116
+ width: "100%",
117
+ maxWidth: theme.spacing(90),
118
+ display: "flex",
119
+ flexDirection: "column",
120
+ alignItems: "center",
121
+ gap: theme.spacing(3)
122
+ }));
123
+ const IconBadge = stylin(Box)(({ theme }) => ({
124
+ display: "flex",
125
+ alignItems: "center",
126
+ justifyContent: "center",
127
+ width: theme.spacing(7),
128
+ height: theme.spacing(7),
129
+ borderRadius: "50%",
130
+ backgroundColor: theme.palette.action.selected,
131
+ color: theme.palette.primary.main,
132
+ "& > svg": { fontSize: 32 }
133
+ }));
134
+ const Heading = stylin(Box)(({ theme }) => ({
135
+ display: "flex",
136
+ flexDirection: "column",
137
+ alignItems: "center",
138
+ textAlign: "center",
139
+ gap: theme.spacing(1),
140
+ maxWidth: theme.spacing(75)
141
+ }));
142
+ const PickerRow = stylin(Box)(({ theme }) => ({
143
+ width: "100%",
144
+ display: "flex",
145
+ alignItems: "center",
146
+ gap: theme.spacing(1.5),
147
+ marginTop: theme.spacing(2),
148
+ [theme.breakpoints.down("sm")]: {
149
+ flexDirection: "column"
150
+ }
151
+ }));
152
+ const PickerSlot = stylin(Box)({
153
+ flex: 1,
154
+ minWidth: 0,
155
+ width: "100%"
156
+ });
157
+ const OptionRow = stylin(Box)(({ theme }) => ({
158
+ display: "flex",
159
+ alignItems: "center",
160
+ justifyContent: "space-between",
161
+ gap: theme.spacing(1.5),
162
+ width: "100%",
163
+ minWidth: 0
164
+ }));
165
+ const OptionMain = stylin(Box)(({ theme }) => ({
166
+ display: "flex",
167
+ alignItems: "center",
168
+ gap: theme.spacing(1),
169
+ minWidth: 0
170
+ }));
171
+ const Position = stylin("span")(({ theme }) => ({
172
+ fontFamily: theme.typography.fontFamilyMono,
173
+ fontSize: theme.typography.body2.fontSize,
174
+ fontWeight: theme.typography.fontWeightBold,
175
+ color: theme.palette.text.secondary
176
+ }));
177
+ const OptionId = stylin("span")(({ theme }) => ({
178
+ fontFamily: theme.typography.fontFamilyMono,
179
+ fontSize: theme.typography.body2.fontSize,
180
+ fontWeight: theme.typography.fontWeightBold,
181
+ color: theme.palette.text.primary,
182
+ whiteSpace: "nowrap",
183
+ overflow: "hidden",
184
+ textOverflow: "ellipsis"
185
+ }));
186
+ const OptionStatus = stylin("span")(({ theme }) => ({
187
+ fontSize: theme.typography.caption.fontSize,
188
+ color: theme.palette.text.secondary,
189
+ whiteSpace: "nowrap",
190
+ flexShrink: 0
191
+ }));
192
+ const SwapButton = stylin(IconButton)(({ theme }) => ({
193
+ color: theme.palette.text.secondary,
194
+ border: `1px solid ${theme.palette.divider}`,
195
+ backgroundColor: theme.palette.background.paper,
196
+ flexShrink: 0,
197
+ "&:hover": {
198
+ color: theme.palette.primary.main,
199
+ borderColor: theme.palette.primary.main,
200
+ backgroundColor: theme.palette.background.paper
201
+ }
202
+ }));
203
+ const WarnLine = stylin(Typography)(({ theme }) => ({
204
+ color: theme.palette.warning.main,
205
+ marginTop: theme.spacing(0.5)
206
+ }));
207
+ const Spacer = stylin(Box)(({ theme }) => ({
208
+ height: theme.spacing(2)
209
+ }));
210
+ const CompareButton = stylin(Button)(({ theme }) => ({
211
+ minWidth: theme.spacing(24),
212
+ marginTop: theme.spacing(1)
213
+ }));
214
+
215
+ export { SelectStep, SelectStep as default };
216
+ //# sourceMappingURL=SelectStep.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectStep.esm.js","sources":["../../../../src/features/environment/CompareDeploymentsDialog/SelectStep.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport IconButton from '@massdriver/ui/IconButton';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport Button from '@massdriver/ui/Button';\nimport Select, { MenuItem } from '@massdriver/ui/Select';\nimport stylin from '@massdriver/ui/stylin';\nimport CompareArrowsIcon from '@massdriver/ui/icons/CompareArrowsIcon';\nimport SwapHorizIcon from '@massdriver/ui/icons/SwapHorizIcon';\nimport VersionBadge from '../../../components/VersionBadge';\nimport {\n formatDeploymentStatus,\n truncateDeploymentId,\n} from '../InstanceDrawer/helpers';\nimport type { Deployment } from '../InstanceDrawer/types';\n\n// `deployment` can be null when a held selection is no longer in the list\n// (e.g. the deployment aged out of the capped fetch) — fall back to the raw id.\nconst optionLabel = (\n deployment: Deployment | null,\n fallbackId: string,\n position?: number,\n): string => {\n const short = truncateDeploymentId(deployment?.id ?? fallbackId);\n return position != null ? `#${position} · ${short}` : short;\n};\n\n/**\n * Step 1 of the deployment compare flow: pick two deployments. Simplified from\n * the web app's infinite-scroll pickers to plain Selects — the dialog already\n * fetches the instance's (capped) deployment list into memory.\n */\nexport const SelectStep = ({\n source,\n target,\n deployments,\n positionMap,\n onSourceChange,\n onTargetChange,\n onSwap,\n onCompare,\n}: {\n source: Deployment | null;\n target: Deployment | null;\n deployments: Deployment[];\n positionMap: Map<string, number>;\n onSourceChange: (deployment: Deployment | null) => void;\n onTargetChange: (deployment: Deployment | null) => void;\n onSwap: () => void;\n onCompare: () => void;\n}) => {\n const sameSelected = Boolean(source && target && source.id === target.id);\n const canCompare = Boolean(source && target && !sameSelected);\n const canSwap = Boolean(source) && Boolean(target);\n\n const find = (id: string) =>\n deployments.find(deployment => deployment.id === id) ?? null;\n\n const renderOptions = (excludeId?: string) =>\n deployments.map(deployment => (\n <MenuItem\n key={deployment.id}\n value={deployment.id}\n disabled={deployment.id === excludeId}\n >\n <OptionRow>\n <OptionMain>\n <Position>{positionMap.get(deployment.id) ?? ''}</Position>\n <OptionId title={deployment.id}>\n {truncateDeploymentId(deployment.id)}\n </OptionId>\n {deployment.version ? (\n <VersionBadge version={deployment.version} />\n ) : null}\n </OptionMain>\n <OptionStatus>\n {formatDeploymentStatus(deployment.action, deployment.status)}\n </OptionStatus>\n </OptionRow>\n </MenuItem>\n ));\n\n return (\n <Root>\n <Center>\n <IconBadge>\n <CompareArrowsIcon />\n </IconBadge>\n\n <Heading>\n <Typography variant=\"h4\" component=\"h2\">\n Compare Deployments\n </Typography>\n <Typography variant=\"body1\" color=\"text.secondary\">\n Pick two deployments to see how their parameters and version differ.\n </Typography>\n </Heading>\n\n <PickerRow>\n <PickerSlot>\n <Select\n fullWidth\n displayEmpty\n value={source?.id ?? ''}\n onChange={(event: any) =>\n onSourceChange(find(event.target.value))\n }\n renderValue={(value: string) =>\n value\n ? optionLabel(find(value), value, positionMap.get(value))\n : 'Pick a deployment…'\n }\n >\n {renderOptions(target?.id)}\n </Select>\n </PickerSlot>\n\n <Tooltip\n title={canSwap ? 'Swap deployments' : 'Pick both first'}\n arrow\n >\n <span>\n <SwapButton\n size=\"medium\"\n onClick={onSwap}\n disabled={!canSwap}\n aria-label=\"Swap deployments\"\n >\n <SwapHorizIcon />\n </SwapButton>\n </span>\n </Tooltip>\n\n <PickerSlot>\n <Select\n fullWidth\n displayEmpty\n value={target?.id ?? ''}\n onChange={(event: any) =>\n onTargetChange(find(event.target.value))\n }\n renderValue={(value: string) =>\n value\n ? optionLabel(find(value), value, positionMap.get(value))\n : 'Pick a deployment…'\n }\n >\n {renderOptions(source?.id)}\n </Select>\n </PickerSlot>\n </PickerRow>\n\n {sameSelected ? (\n <WarnLine variant=\"caption\">\n Pick two different deployments to compare.\n </WarnLine>\n ) : (\n <Spacer />\n )}\n\n <CompareButton\n variant=\"contained\"\n size=\"large\"\n onClick={onCompare}\n disabled={!canCompare}\n >\n Compare\n </CompareButton>\n </Center>\n </Root>\n );\n};\n\nexport default SelectStep;\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing(4),\n}));\n\nconst Center = stylin(Box)(({ theme }: { theme: any }) => ({\n width: '100%',\n maxWidth: theme.spacing(90),\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: theme.spacing(3),\n}));\n\nconst IconBadge = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: theme.spacing(7),\n height: theme.spacing(7),\n borderRadius: '50%',\n backgroundColor: theme.palette.action.selected,\n color: theme.palette.primary.main,\n '& > svg': { fontSize: 32 },\n}));\n\nconst Heading = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n textAlign: 'center',\n gap: theme.spacing(1),\n maxWidth: theme.spacing(75),\n}));\n\nconst PickerRow = stylin(Box)(({ theme }: { theme: any }) => ({\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n marginTop: theme.spacing(2),\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column',\n },\n}));\n\nconst PickerSlot = stylin(Box)({\n flex: 1,\n minWidth: 0,\n width: '100%',\n});\n\nconst OptionRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(1.5),\n width: '100%',\n minWidth: 0,\n}));\n\nconst OptionMain = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n minWidth: 0,\n}));\n\nconst Position = stylin('span')(({ theme }: { theme: any }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.body2.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.text.secondary,\n}));\n\nconst OptionId = stylin('span')(({ theme }: { theme: any }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.body2.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}));\n\nconst OptionStatus = stylin('span')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.text.secondary,\n whiteSpace: 'nowrap',\n flexShrink: 0,\n}));\n\nconst SwapButton = stylin(IconButton)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n border: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n flexShrink: 0,\n '&:hover': {\n color: theme.palette.primary.main,\n borderColor: theme.palette.primary.main,\n backgroundColor: theme.palette.background.paper,\n },\n}));\n\nconst WarnLine = stylin(Typography)(({ theme }: { theme: any }) => ({\n color: theme.palette.warning.main,\n marginTop: theme.spacing(0.5),\n}));\n\nconst Spacer = stylin(Box)(({ theme }: { theme: any }) => ({\n height: theme.spacing(2),\n}));\n\nconst CompareButton = stylin(Button)(({ theme }: { theme: any }) => ({\n minWidth: theme.spacing(24),\n marginTop: theme.spacing(1),\n}));\n"],"names":[],"mappings":";;;;;;;;;;;;;AAkBA,MAAM,WAAA,GAAc,CAClB,UAAA,EACA,UAAA,EACA,QAAA,KACW;AACX,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,UAAA,EAAY,EAAA,IAAM,UAAU,CAAA;AAC/D,EAAA,OAAO,YAAY,IAAA,GAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,MAAA,EAAM,KAAK,CAAA,CAAA,GAAK,KAAA;AACxD,CAAA;AAOO,MAAM,aAAa,CAAC;AAAA,EACzB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KASM;AACJ,EAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,IAAU,UAAU,MAAA,CAAO,EAAA,KAAO,OAAO,EAAE,CAAA;AACxE,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,IAAU,MAAA,IAAU,CAAC,YAAY,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAM,CAAA,IAAK,QAAQ,MAAM,CAAA;AAEjD,EAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KACZ,WAAA,CAAY,KAAK,CAAA,UAAA,KAAc,UAAA,CAAW,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AAE1D,EAAA,MAAM,aAAA,GAAgB,CAAC,SAAA,KACrB,WAAA,CAAY,IAAI,CAAA,UAAA,qBACd,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,OAAO,UAAA,CAAW,EAAA;AAAA,MAClB,QAAA,EAAU,WAAW,EAAA,KAAO,SAAA;AAAA,MAE5B,+BAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAU,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,UAAA,CAAW,EAAE,KAAK,EAAA,EAAG,CAAA;AAAA,0BAChD,GAAA,CAAC,YAAS,KAAA,EAAO,UAAA,CAAW,IACzB,QAAA,EAAA,oBAAA,CAAqB,UAAA,CAAW,EAAE,CAAA,EACrC,CAAA;AAAA,UACC,WAAW,OAAA,mBACV,GAAA,CAAC,gBAAa,OAAA,EAAS,UAAA,CAAW,SAAS,CAAA,GACzC;AAAA,SAAA,EACN,CAAA;AAAA,4BACC,YAAA,EAAA,EACE,QAAA,EAAA,sBAAA,CAAuB,WAAW,MAAA,EAAQ,UAAA,CAAW,MAAM,CAAA,EAC9D;AAAA,OAAA,EACF;AAAA,KAAA;AAAA,IAjBK,UAAA,CAAW;AAAA,GAmBnB,CAAA;AAEH,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA,EACrB,CAAA;AAAA,yBAEC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,MAAK,QAAA,EAAA,qBAAA,EAExC,CAAA;AAAA,0BACC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,kBAAiB,QAAA,EAAA,sEAAA,EAEnD;AAAA,KAAA,EACF,CAAA;AAAA,yBAEC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAS,IAAA;AAAA,UACT,YAAA,EAAY,IAAA;AAAA,UACZ,KAAA,EAAO,QAAQ,EAAA,IAAM,EAAA;AAAA,UACrB,QAAA,EAAU,CAAC,KAAA,KACT,cAAA,CAAe,KAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAEzC,WAAA,EAAa,CAAC,KAAA,KACZ,KAAA,GACI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC,CAAA,GACtD,yBAAA;AAAA,UAGL,QAAA,EAAA,aAAA,CAAc,QAAQ,EAAE;AAAA;AAAA,OAC3B,EACF,CAAA;AAAA,sBAEA,GAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,UAAU,kBAAA,GAAqB,iBAAA;AAAA,UACtC,KAAA,EAAK,IAAA;AAAA,UAEL,8BAAC,MAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAA;AAAA,cACT,UAAU,CAAC,OAAA;AAAA,cACX,YAAA,EAAW,kBAAA;AAAA,cAEX,8BAAC,aAAA,EAAA,EAAc;AAAA;AAAA,WACjB,EACF;AAAA;AAAA,OACF;AAAA,0BAEC,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAS,IAAA;AAAA,UACT,YAAA,EAAY,IAAA;AAAA,UACZ,KAAA,EAAO,QAAQ,EAAA,IAAM,EAAA;AAAA,UACrB,QAAA,EAAU,CAAC,KAAA,KACT,cAAA,CAAe,KAAK,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAEzC,WAAA,EAAa,CAAC,KAAA,KACZ,KAAA,GACI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC,CAAA,GACtD,yBAAA;AAAA,UAGL,QAAA,EAAA,aAAA,CAAc,QAAQ,EAAE;AAAA;AAAA,OAC3B,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAEC,YAAA,uBACE,QAAA,EAAA,EAAS,OAAA,EAAQ,WAAU,QAAA,EAAA,4CAAA,EAE5B,CAAA,uBAEC,MAAA,EAAA,EAAO,CAAA;AAAA,oBAGV,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAK,OAAA;AAAA,QACL,OAAA,EAAS,SAAA;AAAA,QACT,UAAU,CAAC,UAAA;AAAA,QACZ,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAIA,MAAM,OAAO,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACvD,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAC1B,CAAA,CAAE,CAAA;AAEF,MAAM,SAAS,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACzD,KAAA,EAAO,MAAA;AAAA,EACP,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,EAC1B,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC;AACtB,CAAA,CAAE,CAAA;AAEF,MAAM,YAAY,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC5D,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EACtB,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EACvB,YAAA,EAAc,KAAA;AAAA,EACd,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAA;AAAA,EACtC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,EAC7B,SAAA,EAAW,EAAE,QAAA,EAAU,EAAA;AACzB,CAAA,CAAE,CAAA;AAEF,MAAM,UAAU,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC1D,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,QAAA;AAAA,EACX,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EACpB,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,EAAE;AAC5B,CAAA,CAAE,CAAA;AAEF,MAAM,YAAY,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC5D,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,EACtB,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC1B,CAAC,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,GAAG;AAAA,IAC9B,aAAA,EAAe;AAAA;AAEnB,CAAA,CAAE,CAAA;AAEF,MAAM,UAAA,GAAa,MAAA,CAAO,GAAG,CAAA,CAAE;AAAA,EAC7B,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU,CAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAC,CAAA;AAED,MAAM,YAAY,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC5D,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,EACtB,KAAA,EAAO,MAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA,CAAE,CAAA;AAEF,MAAM,aAAa,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC7D,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EACpB,QAAA,EAAU;AACZ,CAAA,CAAE,CAAA;AAEF,MAAM,WAAW,MAAA,CAAO,MAAM,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC9D,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,EAC7B,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,QAAA;AAAA,EACjC,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,EAC7B,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAC5B,CAAA,CAAE,CAAA;AAEF,MAAM,WAAW,MAAA,CAAO,MAAM,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC9D,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,EAC7B,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,QAAA;AAAA,EACjC,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,EAC7B,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAA;AAAA,EAC1B,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,YAAA,EAAc;AAChB,CAAA,CAAE,CAAA;AAEF,MAAM,eAAe,MAAA,CAAO,MAAM,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAClE,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,QAAA;AAAA,EACnC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,EAC1B,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY;AACd,CAAA,CAAE,CAAA;AAEF,MAAM,aAAa,MAAA,CAAO,UAAU,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACpE,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,EAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,EAC1C,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,KAAA;AAAA,EAC1C,UAAA,EAAY,CAAA;AAAA,EACZ,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,IAC7B,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,IACnC,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW;AAAA;AAE9C,CAAA,CAAE,CAAA;AAEF,MAAM,WAAW,MAAA,CAAO,UAAU,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAClE,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,EAC7B,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,GAAG;AAC9B,CAAA,CAAE,CAAA;AAEF,MAAM,SAAS,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACzD,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC;AACzB,CAAA,CAAE,CAAA;AAEF,MAAM,gBAAgB,MAAA,CAAO,MAAM,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EACnE,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AAAA,EAC1B,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC;AAC5B,CAAA,CAAE,CAAA;;;;"}
@@ -0,0 +1,86 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { col } from '@massdriver/ui/DataList';
3
+ import Box from '@massdriver/ui/Box';
4
+ import Chip from '@massdriver/ui/Chip';
5
+ import stylin from '@massdriver/ui/stylin';
6
+ import { ComparisonValueCell } from '../CompareEnvironmentsDialog/ComparisonValueCell.esm.js';
7
+ import { VERSION_PATH } from '../CompareEnvironmentsDialog/flattenComparison.esm.js';
8
+
9
+ const renderPathCell = (value, row) => /* @__PURE__ */ jsxs(PathCellWrap, { children: [
10
+ /* @__PURE__ */ jsx(StatusStripe, { status: row.status }),
11
+ value === VERSION_PATH ? /* @__PURE__ */ jsx(Chip, { size: "small", variant: "outlined", label: "Version" }) : /* @__PURE__ */ jsx(PathText, { children: value })
12
+ ] });
13
+ const renderLeftCell = (_value, row) => /* @__PURE__ */ jsx(
14
+ ComparisonValueCell,
15
+ {
16
+ side: row.source,
17
+ isDifferent: row.status === "different",
18
+ isMissing: row.status === "targetOnly"
19
+ }
20
+ );
21
+ const renderRightCell = (_value, row) => /* @__PURE__ */ jsx(
22
+ ComparisonValueCell,
23
+ {
24
+ side: row.target,
25
+ isDifferent: row.status === "different",
26
+ isMissing: row.status === "sourceOnly"
27
+ }
28
+ );
29
+ const buildCompareColumns = ({
30
+ leftLabel,
31
+ rightLabel
32
+ } = {}) => [
33
+ col.custom("path", "Path", renderPathCell, {
34
+ flex: 2,
35
+ minWidth: 200,
36
+ sortable: true,
37
+ searchable: true
38
+ }),
39
+ col.custom("sourceValue", leftLabel || "Source", renderLeftCell, {
40
+ flex: 2,
41
+ minWidth: 180,
42
+ sortable: true,
43
+ searchable: true
44
+ }),
45
+ col.custom("targetValue", rightLabel || "Target", renderRightCell, {
46
+ flex: 2,
47
+ minWidth: 180,
48
+ sortable: true,
49
+ searchable: true
50
+ })
51
+ ];
52
+ const stripeColor = (theme, status) => {
53
+ if (status === "different") return theme.palette.warning.main;
54
+ if (status === "sourceOnly" || status === "targetOnly") {
55
+ return theme.palette.info.main;
56
+ }
57
+ return "transparent";
58
+ };
59
+ const PathCellWrap = stylin(Box)(({ theme }) => ({
60
+ display: "flex",
61
+ alignItems: "center",
62
+ gap: theme.spacing(1),
63
+ minWidth: 0
64
+ }));
65
+ const StatusStripe = stylin(Box, ["status"])(
66
+ ({ theme, status }) => ({
67
+ width: 3,
68
+ alignSelf: "stretch",
69
+ minHeight: theme.spacing(3),
70
+ borderRadius: "2px",
71
+ backgroundColor: stripeColor(theme, status),
72
+ flexShrink: 0,
73
+ marginLeft: "-4px"
74
+ })
75
+ );
76
+ const PathText = stylin(Box)(({ theme }) => ({
77
+ fontFamily: theme.typography.fontFamilyMono,
78
+ fontSize: theme.typography.caption.fontSize,
79
+ color: theme.palette.text.secondary,
80
+ whiteSpace: "nowrap",
81
+ overflow: "hidden",
82
+ textOverflow: "ellipsis"
83
+ }));
84
+
85
+ export { buildCompareColumns, buildCompareColumns as default };
86
+ //# sourceMappingURL=compareColumns.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compareColumns.esm.js","sources":["../../../../src/features/environment/CompareDeploymentsDialog/compareColumns.tsx"],"sourcesContent":["import { col } from '@massdriver/ui/DataList';\nimport Box from '@massdriver/ui/Box';\nimport Chip from '@massdriver/ui/Chip';\nimport stylin from '@massdriver/ui/stylin';\nimport ComparisonValueCell from '../CompareEnvironmentsDialog/ComparisonValueCell';\nimport {\n VERSION_PATH,\n type ComparisonStatus,\n} from '../CompareEnvironmentsDialog/flattenComparison';\nimport type { DeploymentComparisonRow } from './flattenDeploymentComparison';\n\nconst renderPathCell = (value: string, row: DeploymentComparisonRow) => (\n <PathCellWrap>\n <StatusStripe status={row.status} />\n {value === VERSION_PATH ? (\n <Chip size=\"small\" variant=\"outlined\" label=\"Version\" />\n ) : (\n <PathText>{value}</PathText>\n )}\n </PathCellWrap>\n);\n\nconst renderLeftCell = (_value: unknown, row: DeploymentComparisonRow) => (\n <ComparisonValueCell\n side={row.source}\n isDifferent={row.status === 'different'}\n isMissing={row.status === 'targetOnly'}\n />\n);\n\nconst renderRightCell = (_value: unknown, row: DeploymentComparisonRow) => (\n <ComparisonValueCell\n side={row.target}\n isDifferent={row.status === 'different'}\n isMissing={row.status === 'sourceOnly'}\n />\n);\n\nexport const buildCompareColumns = ({\n leftLabel,\n rightLabel,\n}: {\n leftLabel?: string;\n rightLabel?: string;\n} = {}) => [\n col.custom('path', 'Path', renderPathCell, {\n flex: 2,\n minWidth: 200,\n sortable: true,\n searchable: true,\n }),\n col.custom('sourceValue', leftLabel || 'Source', renderLeftCell, {\n flex: 2,\n minWidth: 180,\n sortable: true,\n searchable: true,\n }),\n col.custom('targetValue', rightLabel || 'Target', renderRightCell, {\n flex: 2,\n minWidth: 180,\n sortable: true,\n searchable: true,\n }),\n];\n\nexport default buildCompareColumns;\n\n// Left status stripe: different → warning, source/target-only → info, equal →\n// transparent. Colors resolve from the theme palette (raw CSS, not sx tokens).\nconst stripeColor = (theme: any, status: ComparisonStatus): string => {\n if (status === 'different') return theme.palette.warning.main;\n if (status === 'sourceOnly' || status === 'targetOnly') {\n return theme.palette.info.main;\n }\n return 'transparent';\n};\n\nconst PathCellWrap = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n minWidth: 0,\n}));\n\nconst StatusStripe = stylin(Box, ['status'])(\n ({ theme, status }: { theme: any; status: ComparisonStatus }) => ({\n width: 3,\n alignSelf: 'stretch',\n minHeight: theme.spacing(3),\n borderRadius: '2px',\n backgroundColor: stripeColor(theme, status),\n flexShrink: 0,\n marginLeft: '-4px',\n }),\n);\n\nconst PathText = stylin(Box)(({ 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}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import { computeStatus, VERSION_PATH } from '../CompareEnvironmentsDialog/flattenComparison.esm.js';
2
+
3
+ const sideToString = (side) => {
4
+ if (!side?.present) return null;
5
+ const value = side.value;
6
+ if (value == null) return "null";
7
+ return typeof value === "string" ? value : JSON.stringify(value);
8
+ };
9
+ const flattenDeploymentComparison = (comparison) => {
10
+ if (!comparison) return [];
11
+ const version = comparison.version;
12
+ const params = (comparison.params ?? []).filter(
13
+ Boolean
14
+ );
15
+ const versionSource = {
16
+ present: version?.source != null,
17
+ value: version?.source ?? null
18
+ };
19
+ const versionTarget = {
20
+ present: version?.target != null,
21
+ value: version?.target ?? null
22
+ };
23
+ const versionRow = {
24
+ id: "__version__",
25
+ kind: "version",
26
+ path: VERSION_PATH,
27
+ source: versionSource,
28
+ target: versionTarget,
29
+ sourceValue: sideToString(versionSource),
30
+ targetValue: sideToString(versionTarget),
31
+ equal: version?.equal ?? false,
32
+ status: computeStatus({
33
+ equal: version?.equal,
34
+ source: versionSource,
35
+ target: versionTarget
36
+ })
37
+ };
38
+ const paramRows = params.map((param) => {
39
+ const source = param.source ?? { present: false };
40
+ const target = param.target ?? { present: false };
41
+ return {
42
+ id: param.path,
43
+ kind: "param",
44
+ path: param.path,
45
+ source,
46
+ target,
47
+ sourceValue: sideToString(source),
48
+ targetValue: sideToString(target),
49
+ equal: param.equal ?? false,
50
+ status: computeStatus({ equal: param.equal, source, target })
51
+ };
52
+ });
53
+ return [versionRow, ...paramRows];
54
+ };
55
+
56
+ export { flattenDeploymentComparison as default };
57
+ //# sourceMappingURL=flattenDeploymentComparison.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenDeploymentComparison.esm.js","sources":["../../../../src/features/environment/CompareDeploymentsDialog/flattenDeploymentComparison.ts"],"sourcesContent":["import {\n computeStatus,\n VERSION_PATH,\n type ComparisonSide,\n type ComparisonStatus,\n} from '../CompareEnvironmentsDialog/flattenComparison';\n\n// Deployment comparison rows are un-grouped (no component dimension): a single\n// version row plus one row per param. Ported from the web app's\n// flattenDeploymentComparison.js. `computeStatus` / `VERSION_PATH` are reused\n// unchanged from the environment-compare flatten module.\nexport interface DeploymentComparisonRow {\n id: string;\n kind: 'version' | 'param';\n path: string;\n source: ComparisonSide;\n target: ComparisonSide;\n sourceValue: string | null;\n targetValue: string | null;\n equal: boolean;\n status: ComparisonStatus;\n}\n\ninterface DeploymentCompareParam {\n path: string;\n equal?: boolean | null;\n source?: ComparisonSide | null;\n target?: ComparisonSide | null;\n}\n\nexport interface DeploymentComparison {\n source?: Record<string, unknown> | null;\n target?: Record<string, unknown> | null;\n version?: {\n source?: string | null;\n target?: string | null;\n equal?: boolean | null;\n } | null;\n params?: (DeploymentCompareParam | null)[] | null;\n}\n\nconst sideToString = (side: ComparisonSide): string | null => {\n if (!side?.present) return null;\n const value = side.value;\n if (value == null) return 'null';\n return typeof value === 'string' ? value : JSON.stringify(value);\n};\n\nconst flattenDeploymentComparison = (\n comparison?: DeploymentComparison | null,\n): DeploymentComparisonRow[] => {\n if (!comparison) return [];\n\n const version = comparison.version;\n const params = (comparison.params ?? []).filter(\n Boolean,\n ) as DeploymentCompareParam[];\n\n const versionSource: ComparisonSide = {\n present: version?.source != null,\n value: version?.source ?? null,\n };\n const versionTarget: ComparisonSide = {\n present: version?.target != null,\n value: version?.target ?? null,\n };\n\n const versionRow: DeploymentComparisonRow = {\n id: '__version__',\n kind: 'version',\n path: VERSION_PATH,\n source: versionSource,\n target: versionTarget,\n sourceValue: sideToString(versionSource),\n targetValue: sideToString(versionTarget),\n equal: version?.equal ?? false,\n status: computeStatus({\n equal: version?.equal,\n source: versionSource,\n target: versionTarget,\n }),\n };\n\n const paramRows: DeploymentComparisonRow[] = params.map(param => {\n const source: ComparisonSide = param.source ?? { present: false };\n const target: ComparisonSide = param.target ?? { present: false };\n return {\n id: param.path,\n kind: 'param' as const,\n path: param.path,\n source,\n target,\n sourceValue: sideToString(source),\n targetValue: sideToString(target),\n equal: param.equal ?? false,\n status: computeStatus({ equal: param.equal, source, target }),\n };\n });\n\n return [versionRow, ...paramRows];\n};\n\nexport default flattenDeploymentComparison;\n"],"names":[],"mappings":";;AAyCA,MAAM,YAAA,GAAe,CAAC,IAAA,KAAwC;AAC5D,EAAA,IAAI,CAAC,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA;AAC3B,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,MAAA;AAC1B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA;AACjE,CAAA;AAEA,MAAM,2BAAA,GAA8B,CAClC,UAAA,KAC8B;AAC9B,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,EAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,EAAA,MAAM,MAAA,GAAA,CAAU,UAAA,CAAW,MAAA,IAAU,EAAC,EAAG,MAAA;AAAA,IACvC;AAAA,GACF;AAEA,EAAA,MAAM,aAAA,GAAgC;AAAA,IACpC,OAAA,EAAS,SAAS,MAAA,IAAU,IAAA;AAAA,IAC5B,KAAA,EAAO,SAAS,MAAA,IAAU;AAAA,GAC5B;AACA,EAAA,MAAM,aAAA,GAAgC;AAAA,IACpC,OAAA,EAAS,SAAS,MAAA,IAAU,IAAA;AAAA,IAC5B,KAAA,EAAO,SAAS,MAAA,IAAU;AAAA,GAC5B;AAEA,EAAA,MAAM,UAAA,GAAsC;AAAA,IAC1C,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA,EAAQ,aAAA;AAAA,IACR,WAAA,EAAa,aAAa,aAAa,CAAA;AAAA,IACvC,WAAA,EAAa,aAAa,aAAa,CAAA;AAAA,IACvC,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA,IACzB,QAAQ,aAAA,CAAc;AAAA,MACpB,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,MAAA,EAAQ,aAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACT;AAAA,GACH;AAEA,EAAA,MAAM,SAAA,GAAuC,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS;AAC/D,IAAA,MAAM,MAAA,GAAyB,KAAA,CAAM,MAAA,IAAU,EAAE,SAAS,KAAA,EAAM;AAChE,IAAA,MAAM,MAAA,GAAyB,KAAA,CAAM,MAAA,IAAU,EAAE,SAAS,KAAA,EAAM;AAChE,IAAA,OAAO;AAAA,MACL,IAAI,KAAA,CAAM,IAAA;AAAA,MACV,IAAA,EAAM,OAAA;AAAA,MACN,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA,EAAa,aAAa,MAAM,CAAA;AAAA,MAChC,WAAA,EAAa,aAAa,MAAM,CAAA;AAAA,MAChC,KAAA,EAAO,MAAM,KAAA,IAAS,KAAA;AAAA,MACtB,MAAA,EAAQ,cAAc,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,MAAA,EAAQ,QAAQ;AAAA,KAC9D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,CAAC,UAAA,EAAY,GAAG,SAAS,CAAA;AAClC;;;;"}
@@ -0,0 +1,53 @@
1
+ const COMPARE_DEPLOYMENTS_QUERY = `
2
+ query MassdriverCompareDeployments(
3
+ $organizationId: ID!
4
+ $sourceId: UUID!
5
+ $targetId: UUID!
6
+ ) {
7
+ compareDeployments(
8
+ organizationId: $organizationId
9
+ sourceId: $sourceId
10
+ targetId: $targetId
11
+ ) {
12
+ source { id status action version createdAt deployedBy message }
13
+ target { id status action version createdAt deployedBy message }
14
+ version { source target equal }
15
+ params {
16
+ path
17
+ equal
18
+ source { present value }
19
+ target { present value }
20
+ }
21
+ }
22
+ }
23
+ `;
24
+ const DEPLOYMENTS_BY_INSTANCE_QUERY = `
25
+ query MassdriverDeploymentsByInstance(
26
+ $organizationId: ID!
27
+ $filter: DeploymentsFilter
28
+ ) {
29
+ deployments(
30
+ organizationId: $organizationId
31
+ filter: $filter
32
+ sort: { field: UPDATED_AT, order: DESC }
33
+ cursor: { limit: 50 }
34
+ ) {
35
+ cursor { next }
36
+ items {
37
+ id
38
+ status
39
+ action
40
+ version
41
+ message
42
+ createdAt
43
+ updatedAt
44
+ lastTransitionedAt
45
+ elapsedTime
46
+ deployedBy
47
+ }
48
+ }
49
+ }
50
+ `;
51
+
52
+ export { COMPARE_DEPLOYMENTS_QUERY, DEPLOYMENTS_BY_INSTANCE_QUERY };
53
+ //# sourceMappingURL=queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.esm.js","sources":["../../../../src/features/environment/CompareDeploymentsDialog/queries.ts"],"sourcesContent":["import type { DeploymentComparison } from './flattenDeploymentComparison';\n\n// Field-by-field diff of two deployments. `organizationId` is injected by the\n// relay; callers pass sourceId + targetId only. NOTE: `compareDeployments` takes\n// `UUID!` ids (unlike the deployments-list filter, which takes `ID!`) — the\n// relay rejects the query if this is mismatched.\nexport const COMPARE_DEPLOYMENTS_QUERY = `\n query MassdriverCompareDeployments(\n $organizationId: ID!\n $sourceId: UUID!\n $targetId: UUID!\n ) {\n compareDeployments(\n organizationId: $organizationId\n sourceId: $sourceId\n targetId: $targetId\n ) {\n source { id status action version createdAt deployedBy message }\n target { id status action version createdAt deployedBy message }\n version { source target equal }\n params {\n path\n equal\n source { present value }\n target { present value }\n }\n }\n }\n`;\n\nexport interface CompareDeploymentsResult {\n compareDeployments: DeploymentComparison | null;\n}\n\n// Feeds the two deployment pickers. Filtered by instance only (unaffected by the\n// History tab's action filter) and capped at a single page of 50 — the web app's\n// infinite-scroll picker is dropped as an acceptable read-only simplification.\nexport const DEPLOYMENTS_BY_INSTANCE_QUERY = `\n query MassdriverDeploymentsByInstance(\n $organizationId: ID!\n $filter: DeploymentsFilter\n ) {\n deployments(\n organizationId: $organizationId\n filter: $filter\n sort: { field: UPDATED_AT, order: DESC }\n cursor: { limit: 50 }\n ) {\n cursor { next }\n items {\n id\n status\n action\n version\n message\n createdAt\n updatedAt\n lastTransitionedAt\n elapsedTime\n deployedBy\n }\n }\n }\n`;\n"],"names":[],"mappings":"AAMO,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;AA+BlC,MAAM,6BAAA,GAAgC;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;;;;"}
@@ -0,0 +1,94 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useState, useEffect, useMemo } from 'react';
3
+ import { useApi } from '@backstage/frontend-plugin-api';
4
+ import useAsync from 'react-use/esm/useAsync';
5
+ import { Dialog, DialogTitle, DialogActions, DialogContent } from '@massdriver/ui/Dialog';
6
+ import Box from '@massdriver/ui/Box';
7
+ import Button from '@massdriver/ui/Button';
8
+ import Alert from '@massdriver/ui/Alert';
9
+ import LoadingIndicator from '@massdriver/ui/LoadingIndicator';
10
+ import stylin from '@massdriver/ui/stylin';
11
+ import { massdriverApiRef } from '../../../api.esm.js';
12
+ import { SelectStep } from './SelectStep.esm.js';
13
+ import { ResultsStep } from './ResultsStep.esm.js';
14
+ import flattenComparison from './flattenComparison.esm.js';
15
+ import { COMPARE_ENVIRONMENTS_QUERY } from './queries.esm.js';
16
+
17
+ const CompareEnvironmentsDialog = ({
18
+ open,
19
+ onClose,
20
+ projectName,
21
+ environments,
22
+ defaultSourceEnvironment
23
+ }) => {
24
+ const api = useApi(massdriverApiRef);
25
+ const [step, setStep] = useState("select");
26
+ const [source, setSource] = useState(null);
27
+ const [target, setTarget] = useState(null);
28
+ useEffect(() => {
29
+ if (open) {
30
+ setSource(defaultSourceEnvironment ?? null);
31
+ setTarget(null);
32
+ setStep("select");
33
+ }
34
+ }, [open, defaultSourceEnvironment]);
35
+ const runCompare = step === "results" && source && target;
36
+ const { value, loading, error } = useAsync(async () => {
37
+ if (!runCompare) return null;
38
+ const data = await api.query(COMPARE_ENVIRONMENTS_QUERY, {
39
+ sourceId: source.id,
40
+ targetId: target.id
41
+ });
42
+ return data.compareEnvironments;
43
+ }, [api, runCompare, source?.id, target?.id]);
44
+ const rows = useMemo(() => flattenComparison(value), [value]);
45
+ const handleCompare = () => {
46
+ if (!source || !target || source.id === target.id) return;
47
+ setStep("results");
48
+ };
49
+ const handleSwap = () => {
50
+ setSource(target);
51
+ setTarget(source);
52
+ };
53
+ return /* @__PURE__ */ jsxs(Dialog, { open, onClose, maxWidth: "lg", fullWidth: true, children: [
54
+ /* @__PURE__ */ jsx(DialogTitle, { children: "Compare Environments" }),
55
+ /* @__PURE__ */ jsx(Body, { children: runCompare ? loading ? /* @__PURE__ */ jsx(Centered, { children: /* @__PURE__ */ jsx(LoadingIndicator, {}) }) : error ? /* @__PURE__ */ jsx(Centered, { children: /* @__PURE__ */ jsx(Alert, { severity: "error", children: String(error.message ?? error) }) }) : /* @__PURE__ */ jsx(
56
+ ResultsStep,
57
+ {
58
+ rows,
59
+ sourceName: value?.source?.name || source?.name,
60
+ targetName: value?.target?.name || target?.name,
61
+ loading,
62
+ onChangeSelection: () => setStep("select")
63
+ }
64
+ ) : /* @__PURE__ */ jsx(
65
+ SelectStep,
66
+ {
67
+ source,
68
+ target,
69
+ environments,
70
+ projectName,
71
+ onSourceChange: setSource,
72
+ onTargetChange: setTarget,
73
+ onSwap: handleSwap,
74
+ onCompare: handleCompare
75
+ }
76
+ ) }),
77
+ /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button, { variant: "text", onClick: onClose, children: "Close" }) })
78
+ ] });
79
+ };
80
+ const Body = stylin(DialogContent)(({ theme }) => ({
81
+ display: "flex",
82
+ flexDirection: "column",
83
+ minHeight: theme.spacing(60)
84
+ }));
85
+ const Centered = stylin(Box)(({ theme }) => ({
86
+ flex: 1,
87
+ display: "flex",
88
+ alignItems: "center",
89
+ justifyContent: "center",
90
+ padding: theme.spacing(6)
91
+ }));
92
+
93
+ export { CompareEnvironmentsDialog, CompareEnvironmentsDialog as default };
94
+ //# sourceMappingURL=CompareEnvironmentsDialog.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompareEnvironmentsDialog.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/CompareEnvironmentsDialog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { useApi } from '@backstage/frontend-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n} from '@massdriver/ui/Dialog';\nimport Box from '@massdriver/ui/Box';\nimport Button from '@massdriver/ui/Button';\nimport Alert from '@massdriver/ui/Alert';\nimport LoadingIndicator from '@massdriver/ui/LoadingIndicator';\nimport stylin from '@massdriver/ui/stylin';\nimport { massdriverApiRef } from '../../../api';\nimport type { HeaderEnvironment } from '../GraphHeader/queries';\nimport SelectStep from './SelectStep';\nimport ResultsStep from './ResultsStep';\nimport flattenComparison from './flattenComparison';\nimport {\n COMPARE_ENVIRONMENTS_QUERY,\n type CompareEnvironmentsResult,\n} from './queries';\n\n/**\n * Read-only environment comparison dialog. Two steps: pick source + target\n * (SelectStep), then view the flattened field-by-field diff (ResultsStep). No\n * mutations — the web app's URL-param state is replaced with local `useState`.\n */\nexport const CompareEnvironmentsDialog = ({\n open,\n onClose,\n projectName,\n environments,\n defaultSourceEnvironment,\n}: {\n open: boolean;\n onClose: () => void;\n projectName?: string;\n environments: HeaderEnvironment[];\n defaultSourceEnvironment?: HeaderEnvironment | null;\n}) => {\n const api = useApi(massdriverApiRef);\n const [step, setStep] = useState<'select' | 'results'>('select');\n const [source, setSource] = useState<HeaderEnvironment | null>(null);\n const [target, setTarget] = useState<HeaderEnvironment | null>(null);\n\n useEffect(() => {\n if (open) {\n setSource(defaultSourceEnvironment ?? null);\n setTarget(null);\n setStep('select');\n }\n }, [open, defaultSourceEnvironment]);\n\n const runCompare = step === 'results' && source && target;\n\n const { value, loading, error } = useAsync(async () => {\n if (!runCompare) return null;\n const data = (await api.query(COMPARE_ENVIRONMENTS_QUERY, {\n sourceId: source!.id,\n targetId: target!.id,\n })) as CompareEnvironmentsResult;\n return data.compareEnvironments;\n }, [api, runCompare, source?.id, target?.id]);\n\n const rows = useMemo(() => flattenComparison(value), [value]);\n\n const handleCompare = () => {\n if (!source || !target || source.id === target.id) return;\n setStep('results');\n };\n\n const handleSwap = () => {\n setSource(target);\n setTarget(source);\n };\n\n return (\n <Dialog open={open} onClose={onClose} maxWidth=\"lg\" fullWidth>\n <DialogTitle>Compare Environments</DialogTitle>\n <Body>\n {runCompare ? (\n loading ? (\n <Centered>\n <LoadingIndicator />\n </Centered>\n ) : error ? (\n <Centered>\n <Alert severity=\"error\">{String(error.message ?? error)}</Alert>\n </Centered>\n ) : (\n <ResultsStep\n rows={rows}\n sourceName={value?.source?.name || source?.name}\n targetName={value?.target?.name || target?.name}\n loading={loading}\n onChangeSelection={() => setStep('select')}\n />\n )\n ) : (\n <SelectStep\n source={source}\n target={target}\n environments={environments}\n projectName={projectName}\n onSourceChange={setSource}\n onTargetChange={setTarget}\n onSwap={handleSwap}\n onCompare={handleCompare}\n />\n )}\n </Body>\n <DialogActions>\n <Button variant=\"text\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n\nexport default CompareEnvironmentsDialog;\n\nconst Body = stylin(DialogContent)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n minHeight: theme.spacing(60),\n}));\n\nconst Centered = stylin(Box)(({ theme }: { theme: any }) => ({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: theme.spacing(6),\n}));\n"],"names":[],"mappings":"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"}