@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,67 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import Tooltip from '@massdriver/ui/Tooltip';
4
+ import stylin from '@massdriver/ui/stylin';
5
+
6
+ const TRUNCATE_LENGTH = 64;
7
+ const formatValue = (value) => {
8
+ if (typeof value === "string") return value;
9
+ try {
10
+ return JSON.stringify(value);
11
+ } catch {
12
+ return String(value);
13
+ }
14
+ };
15
+ const ComparisonValueCell = ({
16
+ side,
17
+ isDifferent,
18
+ isMissing
19
+ }) => {
20
+ const present = side?.present === true;
21
+ if (!present) {
22
+ return isMissing ? /* @__PURE__ */ jsx(MissingPill, { children: "not set" }) : /* @__PURE__ */ jsx(Missing, { children: "\u2014" });
23
+ }
24
+ const value = side?.value;
25
+ if (value == null) {
26
+ return /* @__PURE__ */ jsx(NullLiteral, { children: "null" });
27
+ }
28
+ const display = formatValue(value);
29
+ const truncated = display.length > TRUNCATE_LENGTH;
30
+ const visible = truncated ? `${display.slice(0, TRUNCATE_LENGTH)}\u2026` : display;
31
+ const cell = /* @__PURE__ */ jsx(ValueText, { isDifferent, children: visible });
32
+ return truncated ? /* @__PURE__ */ jsx(Tooltip, { title: display, arrow: true, placement: "top", children: /* @__PURE__ */ jsx("span", { children: cell }) }) : cell;
33
+ };
34
+ const ValueText = stylin(Box, ["isDifferent"])(
35
+ ({ theme, isDifferent }) => ({
36
+ fontFamily: theme.typography.fontFamilyMono,
37
+ fontSize: theme.typography.caption.fontSize,
38
+ color: isDifferent ? theme.palette.text.primary : theme.palette.text.secondary,
39
+ fontWeight: isDifferent ? 600 : 400,
40
+ whiteSpace: "nowrap",
41
+ overflow: "hidden",
42
+ textOverflow: "ellipsis"
43
+ })
44
+ );
45
+ const NullLiteral = stylin(Box)(({ theme }) => ({
46
+ fontStyle: "italic",
47
+ color: theme.palette.text.secondary,
48
+ fontFamily: theme.typography.fontFamilyMono,
49
+ fontSize: theme.typography.caption.fontSize
50
+ }));
51
+ const Missing = stylin(Box)(({ theme }) => ({
52
+ fontStyle: "italic",
53
+ color: theme.palette.text.disabled,
54
+ fontSize: theme.typography.caption.fontSize
55
+ }));
56
+ const MissingPill = stylin(Box)(({ theme }) => ({
57
+ display: "inline-block",
58
+ fontStyle: "italic",
59
+ fontSize: theme.typography.caption.fontSize,
60
+ color: theme.palette.error.main,
61
+ backgroundColor: `${theme.palette.error.main}14`,
62
+ padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,
63
+ borderRadius: 1
64
+ }));
65
+
66
+ export { ComparisonValueCell, ComparisonValueCell as default };
67
+ //# sourceMappingURL=ComparisonValueCell.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComparisonValueCell.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/ComparisonValueCell.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport stylin from '@massdriver/ui/stylin';\nimport type { ComparisonSide } from './flattenComparison';\n\nconst TRUNCATE_LENGTH = 64;\n\nconst formatValue = (value: unknown): string => {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n};\n\n/** Renders one side of a comparison row (source or target value). */\nexport const ComparisonValueCell = ({\n side,\n isDifferent,\n isMissing,\n}: {\n side?: ComparisonSide | null;\n isDifferent: boolean;\n isMissing: boolean;\n}) => {\n const present = side?.present === true;\n\n if (!present) {\n return isMissing ? (\n <MissingPill>not set</MissingPill>\n ) : (\n <Missing>—</Missing>\n );\n }\n\n const value = side?.value;\n if (value == null) {\n return <NullLiteral>null</NullLiteral>;\n }\n\n const display = formatValue(value);\n const truncated = display.length > TRUNCATE_LENGTH;\n const visible = truncated ? `${display.slice(0, TRUNCATE_LENGTH)}…` : display;\n\n const cell = <ValueText isDifferent={isDifferent}>{visible}</ValueText>;\n\n return truncated ? (\n <Tooltip title={display} arrow placement=\"top\">\n <span>{cell}</span>\n </Tooltip>\n ) : (\n cell\n );\n};\n\nexport default ComparisonValueCell;\n\nconst ValueText = stylin(Box, ['isDifferent'])(\n ({ theme, isDifferent }: { theme: any; isDifferent: boolean }) => ({\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.caption.fontSize,\n color: isDifferent\n ? theme.palette.text.primary\n : theme.palette.text.secondary,\n fontWeight: isDifferent ? 600 : 400,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }),\n);\n\nconst NullLiteral = stylin(Box)(({ theme }: { theme: any }) => ({\n fontStyle: 'italic',\n color: theme.palette.text.secondary,\n fontFamily: theme.typography.fontFamilyMono,\n fontSize: theme.typography.caption.fontSize,\n}));\n\nconst Missing = stylin(Box)(({ theme }: { theme: any }) => ({\n fontStyle: 'italic',\n color: theme.palette.text.disabled,\n fontSize: theme.typography.caption.fontSize,\n}));\n\nconst MissingPill = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'inline-block',\n fontStyle: 'italic',\n fontSize: theme.typography.caption.fontSize,\n color: theme.palette.error.main,\n backgroundColor: `${theme.palette.error.main}14`,\n padding: `${theme.spacing(0.25)} ${theme.spacing(0.75)}`,\n borderRadius: 1,\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useState, useMemo } from 'react';
3
+ import Box from '@massdriver/ui/Box';
4
+ import Typography from '@massdriver/ui/Typography';
5
+ import Switch from '@massdriver/ui/Switch';
6
+ import Select, { MenuItem } from '@massdriver/ui/Select';
7
+ import Alert from '@massdriver/ui/Alert';
8
+ import Button from '@massdriver/ui/Button';
9
+ import DataList from '@massdriver/ui/DataList';
10
+ import stylin from '@massdriver/ui/stylin';
11
+ import ChevronLeftIcon from '@massdriver/ui/icons/ChevronLeftIcon';
12
+ import { buildCompareColumns } from './compareColumns.esm.js';
13
+
14
+ const ALL_COMPONENTS = "__all__";
15
+ const ResultsStep = ({
16
+ rows,
17
+ sourceName,
18
+ targetName,
19
+ loading,
20
+ onChangeSelection
21
+ }) => {
22
+ const [hideEqual, setHideEqual] = useState(true);
23
+ const [componentFilter, setComponentFilter] = useState(ALL_COMPONENTS);
24
+ const componentOptions = useMemo(() => {
25
+ const seen = /* @__PURE__ */ new Map();
26
+ rows.forEach((row) => {
27
+ if (!seen.has(row.component.id)) {
28
+ seen.set(row.component.id, row.component.name);
29
+ }
30
+ });
31
+ return Array.from(seen, ([id, name]) => ({ id, name })).sort(
32
+ (first, second) => first.name.localeCompare(second.name)
33
+ );
34
+ }, [rows]);
35
+ const filteredRows = useMemo(
36
+ () => rows.filter((row) => {
37
+ if (hideEqual && row.status === "equal") return false;
38
+ if (componentFilter !== ALL_COMPONENTS && row.component.id !== componentFilter) {
39
+ return false;
40
+ }
41
+ return true;
42
+ }),
43
+ [rows, hideEqual, componentFilter]
44
+ );
45
+ const columns = useMemo(
46
+ () => buildCompareColumns({ leftLabel: sourceName, rightLabel: targetName }),
47
+ [sourceName, targetName]
48
+ );
49
+ const differingCount = useMemo(
50
+ () => rows.filter((row) => row.status !== "equal").length,
51
+ [rows]
52
+ );
53
+ const componentCount = useMemo(() => {
54
+ const seen = /* @__PURE__ */ new Set();
55
+ rows.forEach((row) => seen.add(row.component.id));
56
+ return seen.size;
57
+ }, [rows]);
58
+ const allEqual = rows.length > 0 && differingCount === 0;
59
+ return /* @__PURE__ */ jsxs(Root, { children: [
60
+ /* @__PURE__ */ jsxs(HeaderBar, { children: [
61
+ /* @__PURE__ */ jsx(
62
+ BackButton,
63
+ {
64
+ variant: "text",
65
+ size: "small",
66
+ startIcon: /* @__PURE__ */ jsx(ChevronLeftIcon, {}),
67
+ onClick: onChangeSelection,
68
+ children: "Change selection"
69
+ }
70
+ ),
71
+ /* @__PURE__ */ jsxs(Title, { children: [
72
+ /* @__PURE__ */ jsx(EnvName, { children: sourceName || "Environment 1" }),
73
+ /* @__PURE__ */ jsx(ArrowText, { children: "\u2194" }),
74
+ /* @__PURE__ */ jsx(EnvName, { children: targetName || "Environment 2" })
75
+ ] }),
76
+ /* @__PURE__ */ jsx(HeaderSpacer, {})
77
+ ] }),
78
+ /* @__PURE__ */ jsxs(SummaryRow, { children: [
79
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: allEqual ? "No differences." : /* @__PURE__ */ jsxs(Fragment, { children: [
80
+ /* @__PURE__ */ jsx(Strong, { children: differingCount }),
81
+ " ",
82
+ differingCount === 1 ? "difference" : "differences",
83
+ " across",
84
+ " ",
85
+ /* @__PURE__ */ jsx(Strong, { children: componentCount }),
86
+ " ",
87
+ componentCount === 1 ? "component" : "components"
88
+ ] }) }),
89
+ /* @__PURE__ */ jsxs(ToolbarActions, { children: [
90
+ /* @__PURE__ */ jsxs(
91
+ ComponentFilterSelect,
92
+ {
93
+ size: "small",
94
+ value: componentFilter,
95
+ onChange: (event) => setComponentFilter(event.target.value),
96
+ children: [
97
+ /* @__PURE__ */ jsx(MenuItem, { value: ALL_COMPONENTS, children: "All components" }),
98
+ componentOptions.map((component) => /* @__PURE__ */ jsx(MenuItem, { value: component.id, children: component.name }, component.id))
99
+ ]
100
+ }
101
+ ),
102
+ /* @__PURE__ */ jsxs(SwitchLabel, { children: [
103
+ /* @__PURE__ */ jsx(
104
+ Switch,
105
+ {
106
+ size: "small",
107
+ checked: hideEqual,
108
+ onChange: (event) => setHideEqual(event.target.checked)
109
+ }
110
+ ),
111
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: "Hide identical" })
112
+ ] })
113
+ ] })
114
+ ] }),
115
+ allEqual ? /* @__PURE__ */ jsx(Alert, { severity: "success", variant: "outlined", children: "These environments are identical." }) : null,
116
+ /* @__PURE__ */ jsx(
117
+ DataList,
118
+ {
119
+ rows: filteredRows,
120
+ columns,
121
+ searchable: true,
122
+ searchPlaceholder: "Search component or path\u2026",
123
+ defaultSort: { field: "componentName", direction: "asc" },
124
+ defaultPageSize: 20,
125
+ variant: "outlined",
126
+ size: "small",
127
+ loading,
128
+ emptyMessage: hideEqual && allEqual ? "All fields are identical." : 'No fields match the current filters. Try clearing the search, switching the component filter, or toggling "Hide identical".'
129
+ }
130
+ )
131
+ ] });
132
+ };
133
+ const Root = stylin(Box)(({ theme }) => ({
134
+ display: "flex",
135
+ flexDirection: "column",
136
+ gap: theme.spacing(2),
137
+ flex: 1
138
+ }));
139
+ const HeaderBar = stylin(Box)(({ theme }) => ({
140
+ display: "flex",
141
+ alignItems: "center",
142
+ gap: theme.spacing(2),
143
+ paddingBottom: theme.spacing(1.5),
144
+ borderBottom: `1px solid ${theme.palette.divider}`
145
+ }));
146
+ const BackButton = stylin(Button)(({ theme }) => ({
147
+ color: theme.palette.text.secondary,
148
+ flexShrink: 0
149
+ }));
150
+ const Title = stylin(Box)(({ theme }) => ({
151
+ flex: 1,
152
+ display: "flex",
153
+ alignItems: "center",
154
+ justifyContent: "center",
155
+ gap: theme.spacing(1.5)
156
+ }));
157
+ const EnvName = stylin("span")(({ theme }) => ({
158
+ fontSize: theme.typography.h6.fontSize,
159
+ fontWeight: 600,
160
+ color: theme.palette.text.primary,
161
+ maxWidth: theme.spacing(40),
162
+ whiteSpace: "nowrap",
163
+ overflow: "hidden",
164
+ textOverflow: "ellipsis"
165
+ }));
166
+ const ArrowText = stylin("span")(({ theme }) => ({
167
+ color: theme.palette.text.disabled,
168
+ fontSize: theme.typography.h6.fontSize
169
+ }));
170
+ const HeaderSpacer = stylin(Box)(({ theme }) => ({
171
+ width: theme.spacing(20),
172
+ flexShrink: 0
173
+ }));
174
+ const SummaryRow = stylin(Box)(({ theme }) => ({
175
+ display: "flex",
176
+ alignItems: "center",
177
+ justifyContent: "space-between",
178
+ gap: theme.spacing(2),
179
+ flexWrap: "wrap"
180
+ }));
181
+ const Strong = stylin("span")(({ theme }) => ({
182
+ color: theme.palette.text.primary,
183
+ fontWeight: 600
184
+ }));
185
+ const ToolbarActions = stylin(Box)(({ theme }) => ({
186
+ display: "flex",
187
+ alignItems: "center",
188
+ gap: theme.spacing(1.5),
189
+ flexWrap: "wrap"
190
+ }));
191
+ const ComponentFilterSelect = stylin(Select)(({ theme }) => ({
192
+ minWidth: theme.spacing(22.5)
193
+ }));
194
+ const SwitchLabel = stylin(Box)(({ theme }) => ({
195
+ display: "flex",
196
+ alignItems: "center",
197
+ gap: theme.spacing(0.5),
198
+ userSelect: "none"
199
+ }));
200
+
201
+ export { ResultsStep, ResultsStep as default };
202
+ //# sourceMappingURL=ResultsStep.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultsStep.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/ResultsStep.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport Box from '@massdriver/ui/Box';\nimport Typography from '@massdriver/ui/Typography';\nimport Switch from '@massdriver/ui/Switch';\nimport Select, { MenuItem } from '@massdriver/ui/Select';\nimport Alert from '@massdriver/ui/Alert';\nimport Button from '@massdriver/ui/Button';\nimport DataList from '@massdriver/ui/DataList';\nimport stylin from '@massdriver/ui/stylin';\nimport ChevronLeftIcon from '@massdriver/ui/icons/ChevronLeftIcon';\nimport buildCompareColumns from './compareColumns';\nimport type { ComparisonRow } from './flattenComparison';\n\nconst ALL_COMPONENTS = '__all__';\n\n/** Step 2 of the compare flow: the flattened diff rendered as a DataList. */\nexport const ResultsStep = ({\n rows,\n sourceName,\n targetName,\n loading,\n onChangeSelection,\n}: {\n rows: ComparisonRow[];\n sourceName?: string;\n targetName?: string;\n loading: boolean;\n onChangeSelection: () => void;\n}) => {\n const [hideEqual, setHideEqual] = useState(true);\n const [componentFilter, setComponentFilter] = useState(ALL_COMPONENTS);\n\n const componentOptions = useMemo(() => {\n const seen = new Map<string, string>();\n rows.forEach(row => {\n if (!seen.has(row.component.id)) {\n seen.set(row.component.id, row.component.name);\n }\n });\n return Array.from(seen, ([id, name]) => ({ id, name })).sort(\n (first, second) => first.name.localeCompare(second.name),\n );\n }, [rows]);\n\n const filteredRows = useMemo(\n () =>\n rows.filter(row => {\n if (hideEqual && row.status === 'equal') return false;\n if (\n componentFilter !== ALL_COMPONENTS &&\n row.component.id !== componentFilter\n ) {\n return false;\n }\n return true;\n }),\n [rows, hideEqual, componentFilter],\n );\n\n const columns = useMemo(\n () =>\n buildCompareColumns({ leftLabel: sourceName, rightLabel: targetName }),\n [sourceName, targetName],\n );\n\n const differingCount = useMemo(\n () => rows.filter(row => row.status !== 'equal').length,\n [rows],\n );\n const componentCount = useMemo(() => {\n const seen = new Set<string>();\n rows.forEach(row => seen.add(row.component.id));\n return seen.size;\n }, [rows]);\n const allEqual = rows.length > 0 && differingCount === 0;\n\n return (\n <Root>\n <HeaderBar>\n <BackButton\n variant=\"text\"\n size=\"small\"\n startIcon={<ChevronLeftIcon />}\n onClick={onChangeSelection}\n >\n Change selection\n </BackButton>\n <Title>\n <EnvName>{sourceName || 'Environment 1'}</EnvName>\n <ArrowText>↔</ArrowText>\n <EnvName>{targetName || 'Environment 2'}</EnvName>\n </Title>\n <HeaderSpacer />\n </HeaderBar>\n\n <SummaryRow>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {allEqual ? (\n 'No differences.'\n ) : (\n <>\n <Strong>{differingCount}</Strong>{' '}\n {differingCount === 1 ? 'difference' : 'differences'} across{' '}\n <Strong>{componentCount}</Strong>{' '}\n {componentCount === 1 ? 'component' : 'components'}\n </>\n )}\n </Typography>\n <ToolbarActions>\n <ComponentFilterSelect\n size=\"small\"\n value={componentFilter}\n onChange={(event: any) => setComponentFilter(event.target.value)}\n >\n <MenuItem value={ALL_COMPONENTS}>All components</MenuItem>\n {componentOptions.map(component => (\n <MenuItem key={component.id} value={component.id}>\n {component.name}\n </MenuItem>\n ))}\n </ComponentFilterSelect>\n <SwitchLabel>\n <Switch\n size=\"small\"\n checked={hideEqual}\n onChange={(event: any) => setHideEqual(event.target.checked)}\n />\n <Typography variant=\"body2\" color=\"text.secondary\">\n Hide identical\n </Typography>\n </SwitchLabel>\n </ToolbarActions>\n </SummaryRow>\n\n {allEqual ? (\n <Alert severity=\"success\" variant=\"outlined\">\n These environments are identical.\n </Alert>\n ) : null}\n\n <DataList\n rows={filteredRows}\n columns={columns}\n searchable\n searchPlaceholder=\"Search component or path…\"\n defaultSort={{ field: 'componentName', direction: 'asc' }}\n defaultPageSize={20}\n variant=\"outlined\"\n size=\"small\"\n loading={loading}\n emptyMessage={\n hideEqual && allEqual\n ? 'All fields are identical.'\n : 'No fields match the current filters. Try clearing the search, switching the component filter, or toggling \"Hide identical\".'\n }\n />\n </Root>\n );\n};\n\nexport default ResultsStep;\n\nconst Root = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n flex: 1,\n}));\n\nconst HeaderBar = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingBottom: theme.spacing(1.5),\n borderBottom: `1px solid ${theme.palette.divider}`,\n}));\n\nconst BackButton = stylin(Button)(({ theme }: { theme: any }) => ({\n color: theme.palette.text.secondary,\n flexShrink: 0,\n}));\n\nconst Title = stylin(Box)(({ theme }: { theme: any }) => ({\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: theme.spacing(1.5),\n}));\n\nconst EnvName = stylin('span')(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.h6.fontSize,\n fontWeight: 600,\n color: theme.palette.text.primary,\n maxWidth: theme.spacing(40),\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}));\n\nconst ArrowText = stylin('span')(({ theme }: { theme: any }) => ({\n color: theme.palette.text.disabled,\n fontSize: theme.typography.h6.fontSize,\n}));\n\nconst HeaderSpacer = stylin(Box)(({ theme }: { theme: any }) => ({\n width: theme.spacing(20),\n flexShrink: 0,\n}));\n\nconst SummaryRow = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n flexWrap: 'wrap',\n}));\n\nconst Strong = stylin('span')(({ theme }: { theme: any }) => ({\n color: theme.palette.text.primary,\n fontWeight: 600,\n}));\n\nconst ToolbarActions = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1.5),\n flexWrap: 'wrap',\n}));\n\nconst ComponentFilterSelect = stylin(Select)(({ theme }: { theme: any }) => ({\n minWidth: theme.spacing(22.5),\n}));\n\nconst SwitchLabel = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n userSelect: 'none',\n}));\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ import { jsx, jsxs, Fragment } 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
+
12
+ const SelectStep = ({
13
+ source,
14
+ target,
15
+ environments,
16
+ projectName,
17
+ onSourceChange,
18
+ onTargetChange,
19
+ onSwap,
20
+ onCompare
21
+ }) => {
22
+ const sameSelected = Boolean(source && target && source.id === target.id);
23
+ const canCompare = Boolean(source && target && !sameSelected);
24
+ const canSwap = Boolean(source) && Boolean(target);
25
+ const findEnv = (id) => environments.find((environment) => environment.id === id) ?? null;
26
+ return /* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Center, { children: [
27
+ /* @__PURE__ */ jsx(IconBadge, { children: /* @__PURE__ */ jsx(CompareArrowsIcon, {}) }),
28
+ /* @__PURE__ */ jsxs(Heading, { children: [
29
+ /* @__PURE__ */ jsx(Typography, { variant: "h4", component: "h2", children: "Compare Environments" }),
30
+ /* @__PURE__ */ jsxs(Typography, { variant: "body1", color: "text.secondary", children: [
31
+ "Pick two environments",
32
+ projectName ? /* @__PURE__ */ jsxs(Fragment, { children: [
33
+ " in ",
34
+ /* @__PURE__ */ jsx("strong", { children: projectName })
35
+ ] }) : null,
36
+ " ",
37
+ "to see how their components and parameters differ."
38
+ ] })
39
+ ] }),
40
+ /* @__PURE__ */ jsxs(PickerRow, { children: [
41
+ /* @__PURE__ */ jsx(PickerSlot, { children: /* @__PURE__ */ jsx(
42
+ Select,
43
+ {
44
+ fullWidth: true,
45
+ displayEmpty: true,
46
+ value: source?.id ?? "",
47
+ onChange: (event) => onSourceChange(findEnv(event.target.value)),
48
+ renderValue: (value) => value ? findEnv(value)?.name : "Pick an environment\u2026",
49
+ children: environments.map((environment) => /* @__PURE__ */ jsx(
50
+ MenuItem,
51
+ {
52
+ value: environment.id,
53
+ disabled: target?.id === environment.id,
54
+ children: environment.name
55
+ },
56
+ environment.id
57
+ ))
58
+ }
59
+ ) }),
60
+ /* @__PURE__ */ jsx(
61
+ Tooltip,
62
+ {
63
+ title: canSwap ? "Swap environments" : "Pick both first",
64
+ arrow: true,
65
+ children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
66
+ SwapButton,
67
+ {
68
+ size: "medium",
69
+ onClick: onSwap,
70
+ disabled: !canSwap,
71
+ "aria-label": "Swap environments",
72
+ children: /* @__PURE__ */ jsx(SwapHorizIcon, {})
73
+ }
74
+ ) })
75
+ }
76
+ ),
77
+ /* @__PURE__ */ jsx(PickerSlot, { children: /* @__PURE__ */ jsx(
78
+ Select,
79
+ {
80
+ fullWidth: true,
81
+ displayEmpty: true,
82
+ value: target?.id ?? "",
83
+ onChange: (event) => onTargetChange(findEnv(event.target.value)),
84
+ renderValue: (value) => value ? findEnv(value)?.name : "Pick an environment\u2026",
85
+ children: environments.map((environment) => /* @__PURE__ */ jsx(
86
+ MenuItem,
87
+ {
88
+ value: environment.id,
89
+ disabled: source?.id === environment.id,
90
+ children: environment.name
91
+ },
92
+ environment.id
93
+ ))
94
+ }
95
+ ) })
96
+ ] }),
97
+ sameSelected ? /* @__PURE__ */ jsx(WarnLine, { variant: "caption", children: "Pick two different environments to compare." }) : /* @__PURE__ */ jsx(Spacer, {}),
98
+ /* @__PURE__ */ jsx(
99
+ CompareButton,
100
+ {
101
+ variant: "contained",
102
+ size: "large",
103
+ onClick: onCompare,
104
+ disabled: !canCompare,
105
+ children: "Compare"
106
+ }
107
+ )
108
+ ] }) });
109
+ };
110
+ const Root = stylin(Box)(({ theme }) => ({
111
+ flex: 1,
112
+ display: "flex",
113
+ alignItems: "center",
114
+ justifyContent: "center",
115
+ padding: theme.spacing(4)
116
+ }));
117
+ const Center = stylin(Box)(({ theme }) => ({
118
+ width: "100%",
119
+ maxWidth: theme.spacing(90),
120
+ display: "flex",
121
+ flexDirection: "column",
122
+ alignItems: "center",
123
+ gap: theme.spacing(3)
124
+ }));
125
+ const IconBadge = stylin(Box)(({ theme }) => ({
126
+ display: "flex",
127
+ alignItems: "center",
128
+ justifyContent: "center",
129
+ width: theme.spacing(7),
130
+ height: theme.spacing(7),
131
+ borderRadius: "50%",
132
+ backgroundColor: theme.palette.action.selected,
133
+ color: theme.palette.primary.main,
134
+ "& > svg": { fontSize: 32 }
135
+ }));
136
+ const Heading = stylin(Box)(({ theme }) => ({
137
+ display: "flex",
138
+ flexDirection: "column",
139
+ alignItems: "center",
140
+ textAlign: "center",
141
+ gap: theme.spacing(1),
142
+ maxWidth: theme.spacing(75)
143
+ }));
144
+ const PickerRow = stylin(Box)(({ theme }) => ({
145
+ width: "100%",
146
+ display: "flex",
147
+ alignItems: "center",
148
+ gap: theme.spacing(1.5),
149
+ marginTop: theme.spacing(2),
150
+ [theme.breakpoints.down("sm")]: {
151
+ flexDirection: "column"
152
+ }
153
+ }));
154
+ const PickerSlot = stylin(Box)({
155
+ flex: 1,
156
+ minWidth: 0,
157
+ width: "100%"
158
+ });
159
+ const SwapButton = stylin(IconButton)(({ theme }) => ({
160
+ color: theme.palette.text.secondary,
161
+ border: `1px solid ${theme.palette.divider}`,
162
+ backgroundColor: theme.palette.background.paper,
163
+ flexShrink: 0,
164
+ "&:hover": {
165
+ color: theme.palette.primary.main,
166
+ borderColor: theme.palette.primary.main,
167
+ backgroundColor: theme.palette.background.paper
168
+ }
169
+ }));
170
+ const WarnLine = stylin(Typography)(({ theme }) => ({
171
+ color: theme.palette.warning.main,
172
+ marginTop: theme.spacing(0.5)
173
+ }));
174
+ const Spacer = stylin(Box)(({ theme }) => ({
175
+ height: theme.spacing(2)
176
+ }));
177
+ const CompareButton = stylin(Button)(({ theme }) => ({
178
+ minWidth: theme.spacing(24),
179
+ marginTop: theme.spacing(1)
180
+ }));
181
+
182
+ export { SelectStep, SelectStep as default };
183
+ //# sourceMappingURL=SelectStep.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectStep.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/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 type { HeaderEnvironment } from '../GraphHeader/queries';\n\n/**\n * Step 1 of the compare flow: pick two environments. Simplified from the web\n * app's infinite-scroll autocompletes to plain Selects — the dialog already has\n * the project's full environment list in memory.\n */\nexport const SelectStep = ({\n source,\n target,\n environments,\n projectName,\n onSourceChange,\n onTargetChange,\n onSwap,\n onCompare,\n}: {\n source: HeaderEnvironment | null;\n target: HeaderEnvironment | null;\n environments: HeaderEnvironment[];\n projectName?: string;\n onSourceChange: (environment: HeaderEnvironment | null) => void;\n onTargetChange: (environment: HeaderEnvironment | 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 findEnv = (id: string) =>\n environments.find(environment => environment.id === id) ?? null;\n\n return (\n <Root>\n <Center>\n <IconBadge>\n <CompareArrowsIcon />\n </IconBadge>\n\n <Heading>\n <Typography variant=\"h4\" component=\"h2\">\n Compare Environments\n </Typography>\n <Typography variant=\"body1\" color=\"text.secondary\">\n Pick two environments\n {projectName ? (\n <>\n {' in '}\n <strong>{projectName}</strong>\n </>\n ) : null}{' '}\n to see how their components and parameters 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(findEnv(event.target.value))\n }\n renderValue={(value: string) =>\n value ? findEnv(value)?.name : 'Pick an environment…'\n }\n >\n {environments.map(environment => (\n <MenuItem\n key={environment.id}\n value={environment.id}\n disabled={target?.id === environment.id}\n >\n {environment.name}\n </MenuItem>\n ))}\n </Select>\n </PickerSlot>\n\n <Tooltip\n title={canSwap ? 'Swap environments' : 'Pick both first'}\n arrow\n >\n <span>\n <SwapButton\n size=\"medium\"\n onClick={onSwap}\n disabled={!canSwap}\n aria-label=\"Swap environments\"\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(findEnv(event.target.value))\n }\n renderValue={(value: string) =>\n value ? findEnv(value)?.name : 'Pick an environment…'\n }\n >\n {environments.map(environment => (\n <MenuItem\n key={environment.id}\n value={environment.id}\n disabled={source?.id === environment.id}\n >\n {environment.name}\n </MenuItem>\n ))}\n </Select>\n </PickerSlot>\n </PickerRow>\n\n {sameSelected ? (\n <WarnLine variant=\"caption\">\n Pick two different environments 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 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":"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"}
@@ -0,0 +1,73 @@
1
+ import { 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 './ComparisonValueCell.esm.js';
7
+ import { VERSION_PATH } from './flattenComparison.esm.js';
8
+
9
+ const renderComponentCell = (value) => /* @__PURE__ */ jsx(ComponentName, { children: value || "--" });
10
+ const renderPathCell = (value) => value === VERSION_PATH ? /* @__PURE__ */ jsx(Chip, { size: "small", variant: "outlined", label: "Version" }) : /* @__PURE__ */ jsx(PathCell, { children: value });
11
+ const renderLeftCell = (_value, row) => /* @__PURE__ */ jsx(
12
+ ComparisonValueCell,
13
+ {
14
+ side: row.source,
15
+ isDifferent: row.status === "different",
16
+ isMissing: row.status === "targetOnly"
17
+ }
18
+ );
19
+ const renderRightCell = (_value, row) => /* @__PURE__ */ jsx(
20
+ ComparisonValueCell,
21
+ {
22
+ side: row.target,
23
+ isDifferent: row.status === "different",
24
+ isMissing: row.status === "sourceOnly"
25
+ }
26
+ );
27
+ const buildCompareColumns = ({
28
+ leftLabel,
29
+ rightLabel
30
+ } = {}) => [
31
+ col.custom("componentName", "Component", renderComponentCell, {
32
+ flex: 1.5,
33
+ minWidth: 160,
34
+ sortable: true,
35
+ searchable: true
36
+ }),
37
+ col.custom("path", "Path", renderPathCell, {
38
+ flex: 2,
39
+ minWidth: 180,
40
+ sortable: true,
41
+ searchable: true
42
+ }),
43
+ col.custom("sourceValue", leftLabel || "Environment 1", renderLeftCell, {
44
+ flex: 2,
45
+ minWidth: 160,
46
+ sortable: true,
47
+ searchable: true
48
+ }),
49
+ col.custom("targetValue", rightLabel || "Environment 2", renderRightCell, {
50
+ flex: 2,
51
+ minWidth: 160,
52
+ sortable: true,
53
+ searchable: true
54
+ })
55
+ ];
56
+ const ComponentName = stylin(Box)(({ theme }) => ({
57
+ fontSize: theme.typography.body2.fontSize,
58
+ color: theme.palette.text.primary,
59
+ whiteSpace: "nowrap",
60
+ overflow: "hidden",
61
+ textOverflow: "ellipsis"
62
+ }));
63
+ const PathCell = stylin(Box)(({ theme }) => ({
64
+ fontFamily: theme.typography.fontFamilyMono,
65
+ fontSize: theme.typography.caption.fontSize,
66
+ color: theme.palette.text.secondary,
67
+ whiteSpace: "nowrap",
68
+ overflow: "hidden",
69
+ textOverflow: "ellipsis"
70
+ }));
71
+
72
+ export { buildCompareColumns, buildCompareColumns as default };
73
+ //# sourceMappingURL=compareColumns.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compareColumns.esm.js","sources":["../../../../src/features/environment/CompareEnvironmentsDialog/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 './ComparisonValueCell';\nimport { VERSION_PATH, type ComparisonRow } from './flattenComparison';\n\nconst renderComponentCell = (value: string) => (\n <ComponentName>{value || '--'}</ComponentName>\n);\n\nconst renderPathCell = (value: string) =>\n value === VERSION_PATH ? (\n <Chip size=\"small\" variant=\"outlined\" label=\"Version\" />\n ) : (\n <PathCell>{value}</PathCell>\n );\n\nconst renderLeftCell = (_value: unknown, row: ComparisonRow) => (\n <ComparisonValueCell\n side={row.source}\n isDifferent={row.status === 'different'}\n isMissing={row.status === 'targetOnly'}\n />\n);\n\nconst renderRightCell = (_value: unknown, row: ComparisonRow) => (\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('componentName', 'Component', renderComponentCell, {\n flex: 1.5,\n minWidth: 160,\n sortable: true,\n searchable: true,\n }),\n col.custom('path', 'Path', renderPathCell, {\n flex: 2,\n minWidth: 180,\n sortable: true,\n searchable: true,\n }),\n col.custom('sourceValue', leftLabel || 'Environment 1', renderLeftCell, {\n flex: 2,\n minWidth: 160,\n sortable: true,\n searchable: true,\n }),\n col.custom('targetValue', rightLabel || 'Environment 2', renderRightCell, {\n flex: 2,\n minWidth: 160,\n sortable: true,\n searchable: true,\n }),\n];\n\nexport default buildCompareColumns;\n\nconst ComponentName = stylin(Box)(({ theme }: { theme: any }) => ({\n fontSize: theme.typography.body2.fontSize,\n color: theme.palette.text.primary,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n}));\n\nconst PathCell = 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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"}