@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,68 @@
1
+ import { useApi } from '@backstage/frontend-plugin-api';
2
+ import { useState } from 'react';
3
+ import useAsync from 'react-use/esm/useAsync';
4
+ import { massdriverApiRef } from '../api.esm.js';
5
+ import { useCursorPagination } from './useCursorPagination.esm.js';
6
+
7
+ const usePaginatedRelayQuery = (query, {
8
+ responseKey,
9
+ sortFieldMap = {},
10
+ defaultSort = null,
11
+ pageSize = 20,
12
+ filterFromSearch,
13
+ baseFilter,
14
+ variables
15
+ }) => {
16
+ const api = useApi(massdriverApiRef);
17
+ const [state, setState] = useState({
18
+ search: "",
19
+ page: 0,
20
+ pageSize,
21
+ sort: defaultSort
22
+ });
23
+ const { cursor, sort, processPage } = useCursorPagination({
24
+ state,
25
+ sortFieldMap
26
+ });
27
+ const searchFilter = state.search ? filterFromSearch ? filterFromSearch(state.search) : { search: state.search } : void 0;
28
+ const filter = baseFilter || searchFilter ? { ...baseFilter ?? {}, ...searchFilter ?? {} } : void 0;
29
+ const {
30
+ value: page,
31
+ loading,
32
+ error
33
+ } = useAsync(async () => {
34
+ const data = await api.query(query, {
35
+ ...variables ?? {},
36
+ sort,
37
+ cursor,
38
+ filter
39
+ });
40
+ const path = Array.isArray(responseKey) ? responseKey : [responseKey];
41
+ return path.reduce(
42
+ (node, key) => node?.[key],
43
+ data
44
+ );
45
+ }, [
46
+ api,
47
+ query,
48
+ JSON.stringify(responseKey),
49
+ state.page,
50
+ state.pageSize,
51
+ state.search,
52
+ sort?.field,
53
+ sort?.order,
54
+ JSON.stringify(baseFilter ?? null),
55
+ JSON.stringify(variables ?? null)
56
+ ]);
57
+ const { hasMore } = processPage(page);
58
+ return {
59
+ items: (page?.items ?? []).filter(Boolean),
60
+ loading,
61
+ error,
62
+ hasMore,
63
+ dataListParams: { state, onStateChange: setState }
64
+ };
65
+ };
66
+
67
+ export { usePaginatedRelayQuery };
68
+ //# sourceMappingURL=usePaginatedRelayQuery.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePaginatedRelayQuery.esm.js","sources":["../../src/hooks/usePaginatedRelayQuery.ts"],"sourcesContent":["import { useApi } from '@backstage/frontend-plugin-api';\nimport { useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { massdriverApiRef } from '../api';\nimport {\n DataListSort,\n DataListState,\n useCursorPagination,\n} from './useCursorPagination';\n\nexport interface PaginatedResult<T> {\n items: T[];\n loading: boolean;\n error?: Error;\n hasMore: boolean;\n /** Spread onto DataList (controlled state + change handler). */\n dataListParams: {\n state: DataListState;\n onStateChange: (state: DataListState) => void;\n };\n}\n\ninterface RelayPage<T> {\n items?: (T | null)[] | null;\n cursor?: { next?: string | null } | null;\n}\n\n/**\n * Server-side cursor pagination for a DataList, over the relay. Mirrors the web\n * app's `usePaginatedQuery` but keeps state local (no URL persistence) and\n * fetches through `massdriverApiRef` instead of Apollo.\n */\nexport const usePaginatedRelayQuery = <T>(\n query: string,\n {\n responseKey,\n sortFieldMap = {},\n defaultSort = null,\n pageSize = 20,\n filterFromSearch,\n baseFilter,\n variables,\n }: {\n /** Key of the paginated page in the response; an array walks a nested path\n * (e.g. `['resource', 'connections']`). */\n responseKey: string | string[];\n sortFieldMap?: Record<string, string>;\n defaultSort?: DataListSort | null;\n pageSize?: number;\n filterFromSearch?: (search: string) => Record<string, unknown>;\n /** Filter always applied (e.g. scoping by project), merged with search. */\n baseFilter?: Record<string, unknown>;\n /** Extra query variables (e.g. the parent entity `id` for nested pages). */\n variables?: Record<string, unknown>;\n },\n): PaginatedResult<T> => {\n const api = useApi(massdriverApiRef);\n const [state, setState] = useState<DataListState>({\n search: '',\n page: 0,\n pageSize,\n sort: defaultSort,\n });\n\n const { cursor, sort, processPage } = useCursorPagination({\n state,\n sortFieldMap,\n });\n\n const searchFilter = state.search\n ? filterFromSearch\n ? filterFromSearch(state.search)\n : { search: state.search }\n : undefined;\n const filter =\n baseFilter || searchFilter\n ? { ...(baseFilter ?? {}), ...(searchFilter ?? {}) }\n : undefined;\n\n const {\n value: page,\n loading,\n error,\n } = useAsync(async () => {\n const data = (await api.query(query, {\n ...(variables ?? {}),\n sort,\n cursor,\n filter,\n })) as Record<string, unknown>;\n const path = Array.isArray(responseKey) ? responseKey : [responseKey];\n return path.reduce<unknown>(\n (node, key) =>\n (node as Record<string, unknown> | null | undefined)?.[key],\n data,\n ) as RelayPage<T> | undefined;\n // Re-fetch whenever the effective query inputs change.\n }, [\n api,\n query,\n JSON.stringify(responseKey),\n state.page,\n state.pageSize,\n state.search,\n sort?.field,\n sort?.order,\n JSON.stringify(baseFilter ?? null),\n JSON.stringify(variables ?? null),\n ]);\n\n const { hasMore } = processPage(page);\n\n return {\n items: (page?.items ?? []).filter(Boolean) as T[],\n loading,\n error,\n hasMore,\n dataListParams: { state, onStateChange: setState },\n };\n};\n"],"names":[],"mappings":";;;;;;AAgCO,MAAM,sBAAA,GAAyB,CACpC,KAAA,EACA;AAAA,EACE,WAAA;AAAA,EACA,eAAe,EAAC;AAAA,EAChB,WAAA,GAAc,IAAA;AAAA,EACd,QAAA,GAAW,EAAA;AAAA,EACX,gBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAauB;AACvB,EAAA,MAAM,GAAA,GAAM,OAAO,gBAAgB,CAAA;AACnC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAwB;AAAA,IAChD,MAAA,EAAQ,EAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA,IACN,QAAA;AAAA,IACA,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,WAAA,KAAgB,mBAAA,CAAoB;AAAA,IACxD,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,GACvB,gBAAA,GACE,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA,GAC7B,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO,GACzB,MAAA;AACJ,EAAA,MAAM,MAAA,GACJ,UAAA,IAAc,YAAA,GACV,EAAE,GAAI,UAAA,IAAc,EAAC,EAAI,GAAI,YAAA,IAAgB,EAAC,EAAG,GACjD,MAAA;AAEN,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,IAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACF,GAAI,SAAS,YAAY;AACvB,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO;AAAA,MACnC,GAAI,aAAa,EAAC;AAAA,MAClB,IAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,WAAA,GAAc,CAAC,WAAW,CAAA;AACpE,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACV,CAAC,IAAA,EAAM,GAAA,KACJ,IAAA,GAAsD,GAAG,CAAA;AAAA,MAC5D;AAAA,KACF;AAAA,EAEF,CAAA,EAAG;AAAA,IACD,GAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,CAAK,UAAU,WAAW,CAAA;AAAA,IAC1B,KAAA,CAAM,IAAA;AAAA,IACN,KAAA,CAAM,QAAA;AAAA,IACN,KAAA,CAAM,MAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,CAAK,SAAA,CAAU,UAAA,IAAc,IAAI,CAAA;AAAA,IACjC,IAAA,CAAK,SAAA,CAAU,SAAA,IAAa,IAAI;AAAA,GACjC,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,WAAA,CAAY,IAAI,CAAA;AAEpC,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,EAAM,KAAA,IAAS,EAAC,EAAG,OAAO,OAAO,CAAA;AAAA,IACzC,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA,EAAgB,EAAE,KAAA,EAAO,aAAA,EAAe,QAAA;AAAS,GACnD;AACF;;;;"}
@@ -0,0 +1,256 @@
1
+ import * as _backstage_plugin_catalog_react_alpha from '@backstage/plugin-catalog-react/alpha';
2
+ import * as _backstage_catalog_model from '@backstage/catalog-model';
3
+ import { Entity } from '@backstage/catalog-model';
4
+ import * as react from 'react';
5
+ import * as _backstage_filter_predicates from '@backstage/filter-predicates';
6
+ import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
7
+ import { FetchApi, ConfigApi } from '@backstage/frontend-plugin-api';
8
+
9
+ /** @public */
10
+ declare const massdriverPlugin: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
11
+ root: _backstage_frontend_plugin_api.RouteRef<undefined>;
12
+ }, {}, {
13
+ "api:massdriver/massdriver": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
14
+ kind: "api";
15
+ name: "massdriver";
16
+ config: {};
17
+ configInput: {};
18
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.AnyApiFactory, "core.api.factory", {}>;
19
+ inputs: {};
20
+ params: <TApi, TImpl extends TApi, TDeps extends { [name in string]: unknown; }>(params: _backstage_frontend_plugin_api.ApiFactory<TApi, TImpl, TDeps>) => _backstage_frontend_plugin_api.ExtensionBlueprintParams<_backstage_frontend_plugin_api.AnyApiFactory>;
21
+ }>;
22
+ "entity-card:massdriver/overview": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
23
+ kind: "entity-card";
24
+ name: "overview";
25
+ config: {
26
+ filter: _backstage_filter_predicates.FilterPredicate | undefined;
27
+ type: "content" | "info" | undefined;
28
+ };
29
+ configInput: {
30
+ filter?: _backstage_filter_predicates.FilterPredicate | undefined;
31
+ type?: "content" | "info" | undefined;
32
+ };
33
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
34
+ optional: true;
35
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-filter-expression", {
36
+ optional: true;
37
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_plugin_catalog_react_alpha.EntityCardType, "catalog.entity-card-type", {
38
+ optional: true;
39
+ }>;
40
+ inputs: {};
41
+ params: {
42
+ loader: () => Promise<JSX.Element>;
43
+ filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
44
+ type?: _backstage_plugin_catalog_react_alpha.EntityCardType;
45
+ };
46
+ }>;
47
+ "entity-content:massdriver/entity": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
48
+ kind: "entity-content";
49
+ name: "entity";
50
+ config: {
51
+ path: string | undefined;
52
+ title: string | undefined;
53
+ filter: _backstage_filter_predicates.FilterPredicate | undefined;
54
+ group: string | false | undefined;
55
+ icon: string | undefined;
56
+ };
57
+ configInput: {
58
+ path?: string | undefined;
59
+ title?: string | undefined;
60
+ filter?: _backstage_filter_predicates.FilterPredicate | undefined;
61
+ group?: string | false | undefined;
62
+ icon?: string | undefined;
63
+ };
64
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
65
+ optional: true;
66
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
67
+ optional: true;
68
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-filter-expression", {
69
+ optional: true;
70
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "catalog.entity-content-group", {
71
+ optional: true;
72
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string | react.ReactElement<any, string | react.JSXElementConstructor<any>>, "catalog.entity-content-icon", {
73
+ optional: true;
74
+ }>;
75
+ inputs: {};
76
+ params: {
77
+ defaultPath?: [Error: `Use the 'path' param instead`];
78
+ path: string;
79
+ defaultTitle?: [Error: `Use the 'title' param instead`];
80
+ title: string;
81
+ defaultGroup?: [Error: `Use the 'group' param instead`];
82
+ group?: ("overview" | "deployment" | "documentation" | "development" | "operation" | "observability") | (string & {});
83
+ icon?: string | react.ReactElement;
84
+ loader: () => Promise<JSX.Element>;
85
+ routeRef?: _backstage_frontend_plugin_api.RouteRef;
86
+ filter?: string | _backstage_filter_predicates.FilterPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
87
+ };
88
+ }>;
89
+ "page:massdriver": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
90
+ kind: "page";
91
+ name: undefined;
92
+ config: {
93
+ path: string | undefined;
94
+ title: string | undefined;
95
+ };
96
+ configInput: {
97
+ path?: string | undefined;
98
+ title?: string | undefined;
99
+ };
100
+ output: _backstage_frontend_plugin_api.ExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
101
+ optional: true;
102
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<string, "core.title", {
103
+ optional: true;
104
+ }> | _backstage_frontend_plugin_api.ExtensionDataRef<_backstage_frontend_plugin_api.IconElement, "core.icon", {
105
+ optional: true;
106
+ }>;
107
+ inputs: {
108
+ pages: _backstage_frontend_plugin_api.ExtensionInput<_backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
109
+ optional: true;
110
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.title", {
111
+ optional: true;
112
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.IconElement, "core.icon", {
113
+ optional: true;
114
+ }>, {
115
+ singleton: false;
116
+ optional: false;
117
+ internal: false;
118
+ }>;
119
+ };
120
+ params: {
121
+ path: string;
122
+ title?: string;
123
+ icon?: _backstage_frontend_plugin_api.IconElement;
124
+ loader?: () => Promise<react.JSX.Element>;
125
+ routeRef?: _backstage_frontend_plugin_api.RouteRef;
126
+ noHeader?: boolean;
127
+ };
128
+ }>;
129
+ }>;
130
+
131
+ /**
132
+ * Frontend API for talking to Massdriver via the backend relay.
133
+ *
134
+ * All queries are proxied through `plugin://massdriver/graphql`, where the
135
+ * backend injects the service-account bearer token. The browser never sees the
136
+ * token, and `organizationId` is injected server-side, so callers only declare
137
+ * `$organizationId` in their operations.
138
+ *
139
+ * @public
140
+ */
141
+ interface MassdriverApi {
142
+ /** Web app origin used to build deep-links. */
143
+ readonly appUrl: string;
144
+ /** Massdriver organization id, when configured on the frontend. */
145
+ readonly organizationId: string;
146
+ query<T = unknown>(query: string, variables?: Record<string, unknown>): Promise<T>;
147
+ /**
148
+ * Fetch an auth-guarded Massdriver asset (OCI repo icon SVG, repo tag file
149
+ * contents) as text, via the backend content proxy — the web app fetches
150
+ * these directly with the browser's bearer token, which this plugin's
151
+ * browser doesn't hold.
152
+ */
153
+ fetchText(url: string): Promise<string>;
154
+ /**
155
+ * Open a GraphQL subscription via the backend SSE relay. Invokes
156
+ * `handlers.onData` with each streamed result's `data`. The returned promise
157
+ * resolves when the stream ends (server close, error, or abort). Pass a
158
+ * `signal` to tear the subscription down.
159
+ */
160
+ subscribe<T = unknown>(query: string, variables: Record<string, unknown> | undefined, handlers: {
161
+ onData: (data: T) => void;
162
+ onError?: (error: Error) => void;
163
+ }, signal?: AbortSignal): Promise<void>;
164
+ }
165
+ /** @public */
166
+ declare const massdriverApiRef: _backstage_frontend_plugin_api.ApiRef<MassdriverApi> & {
167
+ readonly $$type: "@backstage/ApiRef";
168
+ };
169
+ /** @public */
170
+ declare class MassdriverClientApi implements MassdriverApi {
171
+ private readonly fetchApi;
172
+ readonly appUrl: string;
173
+ readonly organizationId: string;
174
+ constructor(options: {
175
+ fetchApi: FetchApi;
176
+ configApi: ConfigApi;
177
+ });
178
+ query<T = unknown>(query: string, variables?: Record<string, unknown>): Promise<T>;
179
+ fetchText(url: string): Promise<string>;
180
+ subscribe<T = unknown>(query: string, variables: Record<string, unknown> | undefined, handlers: {
181
+ onData: (data: T) => void;
182
+ onError?: (error: Error) => void;
183
+ }, signal?: AbortSignal): Promise<void>;
184
+ }
185
+
186
+ /** The Massdriver resource an entity maps to. */
187
+ type MassdriverScope = {
188
+ kind: 'project';
189
+ projectId: string;
190
+ orgId?: string;
191
+ } | {
192
+ kind: 'environment';
193
+ environmentId: string;
194
+ orgId?: string;
195
+ } | {
196
+ kind: 'instance';
197
+ instanceId: string;
198
+ orgId?: string;
199
+ };
200
+ /**
201
+ * Resolve which Massdriver resource an entity represents from its annotations.
202
+ * Instance is most specific, then environment, then project.
203
+ */
204
+ declare const getMassdriverScope: (entity: Entity) => MassdriverScope | undefined;
205
+ /** True when the entity carries any Massdriver annotation. */
206
+ declare const isMassdriverEntity: (entity: Entity) => boolean;
207
+
208
+ /**
209
+ * Entity content tab that lists the Massdriver instances for the entity's
210
+ * scope (project or environment) or the details of a single instance.
211
+ *
212
+ * @public
213
+ */
214
+ declare const EntityMassdriverContent: () => react.JSX.Element;
215
+
216
+ /**
217
+ * Entity overview card summarizing the entity's Massdriver status with a
218
+ * deep-link into the web app.
219
+ *
220
+ * @public
221
+ */
222
+ declare const EntityMassdriverOverviewCard: () => react.JSX.Element | null;
223
+
224
+ /**
225
+ * Ready-made sidebar entry for host apps that customize their nav: the
226
+ * Massdriver logo linking to the projects list, with a submenu mirroring the
227
+ * Massdriver web app's sidebar (Projects / Resources / Repositories).
228
+ *
229
+ * Apps on the default nav don't need this — the plugin's page already
230
+ * contributes a flat "Massdriver" nav item automatically. Apps overriding the
231
+ * nav with `NavContentBlueprint` can render this in place of that item.
232
+ *
233
+ * Boot-graph constraint: this component is reachable from the package root,
234
+ * which Backstage `require()`s eagerly at app boot — it must never import
235
+ * `@massdriver/ui` (whose components pull the `@mui/material` barrel); see
236
+ * `src/index.test.ts`.
237
+ *
238
+ * @public
239
+ */
240
+ declare const MassdriverSidebarItem: () => react.JSX.Element;
241
+
242
+ /**
243
+ * Lazy wrapper for the package-root export. The plugin's root entry is
244
+ * `require()`d eagerly at app boot by Backstage's package detection
245
+ * (`__backstage-autodetected-plugins__`), BEFORE Backstage's
246
+ * UnifiedThemeProvider configures MUI v5's `v5-` ClassNameGenerator prefix.
247
+ * A static import of the real page would evaluate `@massdriver/ui` → the
248
+ * `@mui/material` barrel at that point, freezing every slot-class constant
249
+ * unprefixed and silently breaking cross-slot selectors plugin-wide (see
250
+ * .claude/rules/styling-and-theme.md). Everything reaching `@massdriver/ui`
251
+ * from the package root must stay behind a dynamic import.
252
+ */
253
+ declare const ProjectsListPage: () => react.JSX.Element;
254
+
255
+ export { EntityMassdriverContent, EntityMassdriverOverviewCard, MassdriverClientApi, MassdriverSidebarItem, ProjectsListPage, massdriverPlugin as default, getMassdriverScope, isMassdriverEntity, massdriverApiRef };
256
+ export type { MassdriverApi, MassdriverScope };
@@ -0,0 +1,8 @@
1
+ export { massdriverPlugin as default } from './plugin.esm.js';
2
+ export { MassdriverClientApi, massdriverApiRef } from './api.esm.js';
3
+ export { getMassdriverScope, isMassdriverEntity } from './entity.esm.js';
4
+ export { EntityMassdriverContent } from './components/EntityMassdriverContent/EntityMassdriverContent.esm.js';
5
+ export { EntityMassdriverOverviewCard } from './components/EntityMassdriverOverviewCard/EntityMassdriverOverviewCard.esm.js';
6
+ export { MassdriverSidebarItem } from './components/MassdriverSidebarItem.esm.js';
7
+ export { ProjectsListPage } from './features/projects/ProjectsListPageLazy.esm.js';
8
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,29 @@
1
+ import { parseEnvironmentId } from '@massdriver/backstage-plugin-common';
2
+
3
+ const BASE = "/massdriver";
4
+ const internalRoutes = {
5
+ projects: () => `${BASE}/projects`,
6
+ project: (projectId) => `${BASE}/projects/${projectId}`,
7
+ projectTab: (projectId, tab) => `${BASE}/projects/${projectId}/${tab}`,
8
+ /** `environmentId` is the full composite id; the URL keeps only the scoped part. */
9
+ environment: (projectId, environmentId) => {
10
+ const { scopedEnvironmentId } = parseEnvironmentId(environmentId);
11
+ return `${BASE}/projects/${projectId}/environments/${scopedEnvironmentId}`;
12
+ },
13
+ /** Instance drawer sub-route; mirrors the app's `.../instances/:scopedInstanceId`. */
14
+ instance: (projectId, scopedEnvironmentId, scopedComponentId) => `${BASE}/projects/${projectId}/environments/${scopedEnvironmentId}/instances/${scopedComponentId}`,
15
+ repositories: () => `${BASE}/repositories`,
16
+ /** Mirrors the app's `/repos/[repoId]/[version]/[tab]`; version defaults to `all`. */
17
+ repository: (repoId, version = "all") => `${BASE}/repositories/${encodeURIComponent(repoId)}/${encodeURIComponent(
18
+ version
19
+ )}`,
20
+ repositoryTab: (repoId, version, tab) => `${BASE}/repositories/${encodeURIComponent(repoId)}/${encodeURIComponent(
21
+ version
22
+ )}/${tab}`,
23
+ resources: () => `${BASE}/resources`,
24
+ resource: (resourceId) => `${BASE}/resources/${encodeURIComponent(resourceId)}`,
25
+ resourceTab: (resourceId, tab) => `${BASE}/resources/${encodeURIComponent(resourceId)}/${tab}`
26
+ };
27
+
28
+ export { internalRoutes };
29
+ //# sourceMappingURL=internalRoutes.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalRoutes.esm.js","sources":["../src/internalRoutes.ts"],"sourcesContent":["import { parseEnvironmentId } from '@massdriver/backstage-plugin-common';\n\n// Internal (within-Backstage) routes for the embedded Massdriver views, all\n// under the plugin's `/massdriver` page mount. Environment URLs use only the\n// scoped environment segment (not the full `{projectId}-{scoped}` id), matching\n// the web app.\nconst BASE = '/massdriver';\n\nexport const internalRoutes = {\n projects: () => `${BASE}/projects`,\n project: (projectId: string) => `${BASE}/projects/${projectId}`,\n projectTab: (projectId: string, tab: string) =>\n `${BASE}/projects/${projectId}/${tab}`,\n /** `environmentId` is the full composite id; the URL keeps only the scoped part. */\n environment: (projectId: string, environmentId: string) => {\n const { scopedEnvironmentId } = parseEnvironmentId(environmentId);\n return `${BASE}/projects/${projectId}/environments/${scopedEnvironmentId}`;\n },\n /** Instance drawer sub-route; mirrors the app's `.../instances/:scopedInstanceId`. */\n instance: (\n projectId: string,\n scopedEnvironmentId: string,\n scopedComponentId: string,\n ) =>\n `${BASE}/projects/${projectId}/environments/${scopedEnvironmentId}/instances/${scopedComponentId}`,\n repositories: () => `${BASE}/repositories`,\n /** Mirrors the app's `/repos/[repoId]/[version]/[tab]`; version defaults to `all`. */\n repository: (repoId: string, version = 'all') =>\n `${BASE}/repositories/${encodeURIComponent(repoId)}/${encodeURIComponent(\n version,\n )}`,\n repositoryTab: (repoId: string, version: string, tab: string) =>\n `${BASE}/repositories/${encodeURIComponent(repoId)}/${encodeURIComponent(\n version,\n )}/${tab}`,\n resources: () => `${BASE}/resources`,\n resource: (resourceId: string) =>\n `${BASE}/resources/${encodeURIComponent(resourceId)}`,\n resourceTab: (resourceId: string, tab: string) =>\n `${BASE}/resources/${encodeURIComponent(resourceId)}/${tab}`,\n};\n"],"names":[],"mappings":";;AAMA,MAAM,IAAA,GAAO,aAAA;AAEN,MAAM,cAAA,GAAiB;AAAA,EAC5B,QAAA,EAAU,MAAM,CAAA,EAAG,IAAI,CAAA,SAAA,CAAA;AAAA,EACvB,SAAS,CAAC,SAAA,KAAsB,CAAA,EAAG,IAAI,aAAa,SAAS,CAAA,CAAA;AAAA,EAC7D,UAAA,EAAY,CAAC,SAAA,EAAmB,GAAA,KAC9B,GAAG,IAAI,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA;AAAA,EAEtC,WAAA,EAAa,CAAC,SAAA,EAAmB,aAAA,KAA0B;AACzD,IAAA,MAAM,EAAE,mBAAA,EAAoB,GAAI,kBAAA,CAAmB,aAAa,CAAA;AAChE,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,UAAA,EAAa,SAAS,iBAAiB,mBAAmB,CAAA,CAAA;AAAA,EAC1E,CAAA;AAAA;AAAA,EAEA,QAAA,EAAU,CACR,SAAA,EACA,mBAAA,EACA,iBAAA,KAEA,CAAA,EAAG,IAAI,CAAA,UAAA,EAAa,SAAS,CAAA,cAAA,EAAiB,mBAAmB,CAAA,WAAA,EAAc,iBAAiB,CAAA,CAAA;AAAA,EAClG,YAAA,EAAc,MAAM,CAAA,EAAG,IAAI,CAAA,aAAA,CAAA;AAAA;AAAA,EAE3B,UAAA,EAAY,CAAC,MAAA,EAAgB,OAAA,GAAU,KAAA,KACrC,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI,kBAAA;AAAA,IACpD;AAAA,GACD,CAAA,CAAA;AAAA,EACH,aAAA,EAAe,CAAC,MAAA,EAAgB,OAAA,EAAiB,GAAA,KAC/C,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI,kBAAA;AAAA,IACpD;AAAA,GACD,IAAI,GAAG,CAAA,CAAA;AAAA,EACV,SAAA,EAAW,MAAM,CAAA,EAAG,IAAI,CAAA,UAAA,CAAA;AAAA,EACxB,QAAA,EAAU,CAAC,UAAA,KACT,CAAA,EAAG,IAAI,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AAAA,EACrD,WAAA,EAAa,CAAC,UAAA,EAAoB,GAAA,KAChC,CAAA,EAAG,IAAI,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA;AAC9D;;;;"}
@@ -0,0 +1,57 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { ApiBlueprint, configApiRef, fetchApiRef, PageBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
3
+ import { EntityContentBlueprint, EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';
4
+ import { MassdriverClientApi, massdriverApiRef } from './api.esm.js';
5
+ import { MassdriverIcon } from './components/MassdriverIcon.esm.js';
6
+ import { isMassdriverEntity } from './entity.esm.js';
7
+ import { rootRouteRef } from './routes.esm.js';
8
+
9
+ const massdriverApi = ApiBlueprint.make({
10
+ name: "massdriver",
11
+ params: (defineParams) => defineParams({
12
+ api: massdriverApiRef,
13
+ deps: { fetchApi: fetchApiRef, configApi: configApiRef },
14
+ factory: ({ fetchApi, configApi }) => new MassdriverClientApi({ fetchApi, configApi })
15
+ })
16
+ });
17
+ const page = PageBlueprint.make({
18
+ params: {
19
+ path: "/massdriver",
20
+ routeRef: rootRouteRef,
21
+ title: "Massdriver",
22
+ icon: /* @__PURE__ */ jsx(MassdriverIcon, {}),
23
+ // The Massdriver shell renders its own header; fill the content area.
24
+ noHeader: true,
25
+ loader: () => Promise.all([
26
+ import('./shell/MassdriverShell.esm.js'),
27
+ import('./MassdriverRouter.esm.js')
28
+ ]).then(([shell, router]) => /* @__PURE__ */ jsx(shell.MassdriverShell, { children: /* @__PURE__ */ jsx(router.MassdriverRouter, {}) }))
29
+ }
30
+ });
31
+ const entityContent = EntityContentBlueprint.make({
32
+ name: "entity",
33
+ params: {
34
+ path: "/massdriver",
35
+ title: "Massdriver",
36
+ filter: isMassdriverEntity,
37
+ loader: () => import('./components/EntityMassdriverContent/index.esm.js').then((m) => /* @__PURE__ */ jsx(m.EntityMassdriverContent, {}))
38
+ }
39
+ });
40
+ const entityCard = EntityCardBlueprint.make({
41
+ name: "overview",
42
+ params: {
43
+ type: "info",
44
+ filter: isMassdriverEntity,
45
+ loader: () => import('./components/EntityMassdriverOverviewCard/index.esm.js').then((m) => /* @__PURE__ */ jsx(m.EntityMassdriverOverviewCard, {}))
46
+ }
47
+ });
48
+ const massdriverPlugin = createFrontendPlugin({
49
+ pluginId: "massdriver",
50
+ extensions: [massdriverApi, page, entityContent, entityCard],
51
+ routes: {
52
+ root: rootRouteRef
53
+ }
54
+ });
55
+
56
+ export { massdriverPlugin };
57
+ //# sourceMappingURL=plugin.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.tsx"],"sourcesContent":["import {\n ApiBlueprint,\n configApiRef,\n createFrontendPlugin,\n fetchApiRef,\n PageBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport {\n EntityCardBlueprint,\n EntityContentBlueprint,\n} from '@backstage/plugin-catalog-react/alpha';\nimport { massdriverApiRef, MassdriverClientApi } from './api';\nimport { MassdriverIcon } from './components/MassdriverIcon';\nimport { isMassdriverEntity } from './entity';\nimport { rootRouteRef } from './routes';\n\nconst massdriverApi = ApiBlueprint.make({\n name: 'massdriver',\n params: defineParams =>\n defineParams({\n api: massdriverApiRef,\n deps: { fetchApi: fetchApiRef, configApi: configApiRef },\n factory: ({ fetchApi, configApi }) =>\n new MassdriverClientApi({ fetchApi, configApi }),\n }),\n});\n\nconst page = PageBlueprint.make({\n params: {\n path: '/massdriver',\n routeRef: rootRouteRef,\n title: 'Massdriver',\n icon: <MassdriverIcon />,\n // The Massdriver shell renders its own header; fill the content area.\n noHeader: true,\n loader: () =>\n Promise.all([\n import('./shell/MassdriverShell'),\n import('./MassdriverRouter'),\n ]).then(([shell, router]) => (\n <shell.MassdriverShell>\n <router.MassdriverRouter />\n </shell.MassdriverShell>\n )),\n },\n});\n\nconst entityContent = EntityContentBlueprint.make({\n name: 'entity',\n params: {\n path: '/massdriver',\n title: 'Massdriver',\n filter: isMassdriverEntity,\n loader: () =>\n import('./components/EntityMassdriverContent').then(m => (\n <m.EntityMassdriverContent />\n )),\n },\n});\n\nconst entityCard = EntityCardBlueprint.make({\n name: 'overview',\n params: {\n type: 'info',\n filter: isMassdriverEntity,\n loader: () =>\n import('./components/EntityMassdriverOverviewCard').then(m => (\n <m.EntityMassdriverOverviewCard />\n )),\n },\n});\n\n/** @public */\nexport const massdriverPlugin = createFrontendPlugin({\n pluginId: 'massdriver',\n extensions: [massdriverApi, page, entityContent, entityCard],\n routes: {\n root: rootRouteRef,\n },\n});\n"],"names":[],"mappings":";;;;;;;;AAgBA,MAAM,aAAA,GAAgB,aAAa,IAAA,CAAK;AAAA,EACtC,IAAA,EAAM,YAAA;AAAA,EACN,MAAA,EAAQ,kBACN,YAAA,CAAa;AAAA,IACX,GAAA,EAAK,gBAAA;AAAA,IACL,IAAA,EAAM,EAAE,QAAA,EAAU,WAAA,EAAa,WAAW,YAAA,EAAa;AAAA,IACvD,OAAA,EAAS,CAAC,EAAE,QAAA,EAAU,SAAA,EAAU,KAC9B,IAAI,mBAAA,CAAoB,EAAE,QAAA,EAAU,SAAA,EAAW;AAAA,GAClD;AACL,CAAC,CAAA;AAED,MAAM,IAAA,GAAO,cAAc,IAAA,CAAK;AAAA,EAC9B,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,aAAA;AAAA,IACN,QAAA,EAAU,YAAA;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,sBAAO,cAAA,EAAA,EAAe,CAAA;AAAA;AAAA,IAEtB,QAAA,EAAU,IAAA;AAAA,IACV,MAAA,EAAQ,MACN,OAAA,CAAQ,GAAA,CAAI;AAAA,MACV,OAAO,gCAAyB,CAAA;AAAA,MAChC,OAAO,2BAAoB;AAAA,KAC5B,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,OAAO,MAAM,CAAA,qBACrB,GAAA,CAAC,KAAA,CAAM,iBAAN,EACC,QAAA,kBAAA,GAAA,CAAC,OAAO,gBAAA,EAAP,EAAwB,GAC3B,CACD;AAAA;AAEP,CAAC,CAAA;AAED,MAAM,aAAA,GAAgB,uBAAuB,IAAA,CAAK;AAAA,EAChD,IAAA,EAAM,QAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ,MACN,OAAO,mDAAsC,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,qBAClD,GAAA,CAAC,CAAA,CAAE,uBAAA,EAAF,EAA0B,CAC5B;AAAA;AAEP,CAAC,CAAA;AAED,MAAM,UAAA,GAAa,oBAAoB,IAAA,CAAK;AAAA,EAC1C,IAAA,EAAM,UAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ,MACN,OAAO,wDAA2C,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,qBACvD,GAAA,CAAC,CAAA,CAAE,4BAAA,EAAF,EAA+B,CACjC;AAAA;AAEP,CAAC,CAAA;AAGM,MAAM,mBAAmB,oBAAA,CAAqB;AAAA,EACnD,QAAA,EAAU,YAAA;AAAA,EACV,UAAA,EAAY,CAAC,aAAA,EAAe,IAAA,EAAM,eAAe,UAAU,CAAA;AAAA,EAC3D,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAC;;;;"}
@@ -0,0 +1,54 @@
1
+ const INSTANCES_BY_PROJECT = `
2
+ query MassdriverInstancesByProject($organizationId: ID!, $projectId: ID!, $cursor: Cursor) {
3
+ instances(
4
+ organizationId: $organizationId
5
+ filter: { projectId: { eq: $projectId } }
6
+ cursor: $cursor
7
+ ) {
8
+ items {
9
+ id
10
+ name
11
+ status
12
+ resolvedVersion
13
+ deployedVersion
14
+ }
15
+ cursor {
16
+ next
17
+ }
18
+ }
19
+ }
20
+ `;
21
+ const INSTANCES_BY_ENVIRONMENT = `
22
+ query MassdriverInstancesByEnvironment($organizationId: ID!, $environmentId: ID!, $cursor: Cursor) {
23
+ instances(
24
+ organizationId: $organizationId
25
+ filter: { environmentId: { eq: $environmentId } }
26
+ cursor: $cursor
27
+ ) {
28
+ items {
29
+ id
30
+ name
31
+ status
32
+ resolvedVersion
33
+ deployedVersion
34
+ }
35
+ cursor {
36
+ next
37
+ }
38
+ }
39
+ }
40
+ `;
41
+ const INSTANCE_BY_ID = `
42
+ query MassdriverInstance($organizationId: ID!, $id: ID!) {
43
+ instance(organizationId: $organizationId, id: $id) {
44
+ id
45
+ name
46
+ status
47
+ resolvedVersion
48
+ deployedVersion
49
+ }
50
+ }
51
+ `;
52
+
53
+ export { INSTANCES_BY_ENVIRONMENT, INSTANCES_BY_PROJECT, INSTANCE_BY_ID };
54
+ //# sourceMappingURL=queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.esm.js","sources":["../src/queries.ts"],"sourcesContent":["import { InstanceStatus } from '@massdriver/backstage-plugin-common';\n\n/** Instance fields fetched for tables and cards. */\nexport interface InstanceRow {\n id: string;\n name: string;\n status: InstanceStatus;\n resolvedVersion?: string | null;\n deployedVersion?: string | null;\n}\n\nexport const INSTANCES_BY_PROJECT = `\n query MassdriverInstancesByProject($organizationId: ID!, $projectId: ID!, $cursor: Cursor) {\n instances(\n organizationId: $organizationId\n filter: { projectId: { eq: $projectId } }\n cursor: $cursor\n ) {\n items {\n id\n name\n status\n resolvedVersion\n deployedVersion\n }\n cursor {\n next\n }\n }\n }\n`;\n\nexport const INSTANCES_BY_ENVIRONMENT = `\n query MassdriverInstancesByEnvironment($organizationId: ID!, $environmentId: ID!, $cursor: Cursor) {\n instances(\n organizationId: $organizationId\n filter: { environmentId: { eq: $environmentId } }\n cursor: $cursor\n ) {\n items {\n id\n name\n status\n resolvedVersion\n deployedVersion\n }\n cursor {\n next\n }\n }\n }\n`;\n\nexport const INSTANCE_BY_ID = `\n query MassdriverInstance($organizationId: ID!, $id: ID!) {\n instance(organizationId: $organizationId, id: $id) {\n id\n name\n status\n resolvedVersion\n deployedVersion\n }\n }\n`;\n\nexport interface InstancesPageResult {\n instances: {\n items: (InstanceRow | null)[] | null;\n cursor: { next: string | null };\n };\n}\n\nexport interface InstanceResult {\n instance: InstanceRow | null;\n}\n"],"names":[],"mappings":"AAWO,MAAM,oBAAA,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqB7B,MAAM,wBAAA,GAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBjC,MAAM,cAAA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;"}
@@ -0,0 +1,6 @@
1
+ import { createRouteRef } from '@backstage/frontend-plugin-api';
2
+
3
+ const rootRouteRef = createRouteRef();
4
+
5
+ export { rootRouteRef };
6
+ //# sourceMappingURL=routes.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/frontend-plugin-api';\n\nexport const rootRouteRef = createRouteRef();\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAA;;;;"}
@@ -0,0 +1,37 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import IconButton from '@massdriver/ui/IconButton';
4
+ import Tooltip from '@massdriver/ui/Tooltip';
5
+ import stylin from '@massdriver/ui/stylin';
6
+ import DarkModeIcon from '@massdriver/ui/icons/DarkModeIcon';
7
+ import LightModeIcon from '@massdriver/ui/icons/LightModeIcon';
8
+ import darkBgLogo from '../assets/massdriver-logo-dark.svg';
9
+ import lightBgLogo from '../assets/massdriver-logo-light.svg';
10
+ import { useThemeMode } from '../theme/ThemeModeContext.esm.js';
11
+
12
+ const MassdriverHeader = () => {
13
+ const { mode, toggleMode } = useThemeMode();
14
+ return /* @__PURE__ */ jsxs(HeaderRoot, { children: [
15
+ /* @__PURE__ */ jsx(Logo, { src: mode === "dark" ? darkBgLogo : lightBgLogo, alt: "Massdriver" }),
16
+ /* @__PURE__ */ jsx(Tooltip, { title: "Toggle theme", arrow: true, children: /* @__PURE__ */ jsx(IconButton, { onClick: toggleMode, "aria-label": "toggle theme", size: "small", children: mode === "dark" ? /* @__PURE__ */ jsx(LightModeIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx(DarkModeIcon, { fontSize: "small" }) }) })
17
+ ] });
18
+ };
19
+ const HeaderRoot = stylin(Box)(({ theme }) => ({
20
+ display: "flex",
21
+ alignItems: "center",
22
+ justifyContent: "space-between",
23
+ height: 56,
24
+ flexShrink: 0,
25
+ paddingLeft: theme.spacing(3),
26
+ paddingRight: theme.spacing(2),
27
+ borderBottom: `1px solid ${theme.palette.divider}`,
28
+ backgroundColor: theme.palette.background.paper
29
+ }));
30
+ const Logo = stylin("img")({
31
+ height: 32,
32
+ width: "auto",
33
+ display: "block"
34
+ });
35
+
36
+ export { MassdriverHeader };
37
+ //# sourceMappingURL=MassdriverHeader.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MassdriverHeader.esm.js","sources":["../../src/shell/MassdriverHeader.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport IconButton from '@massdriver/ui/IconButton';\nimport Tooltip from '@massdriver/ui/Tooltip';\nimport stylin from '@massdriver/ui/stylin';\nimport DarkModeIcon from '@massdriver/ui/icons/DarkModeIcon';\nimport LightModeIcon from '@massdriver/ui/icons/LightModeIcon';\nimport darkBgLogo from '../assets/massdriver-logo-dark.svg';\nimport lightBgLogo from '../assets/massdriver-logo-light.svg';\nimport { useThemeMode } from '../theme/ThemeModeContext';\n\n/**\n * Minimal header for the embedded Massdriver views: just the logo and a\n * light/dark theme toggle. No navigation, no account menu — Backstage provides\n * the surrounding chrome.\n */\nexport const MassdriverHeader = () => {\n const { mode, toggleMode } = useThemeMode();\n\n return (\n <HeaderRoot>\n <Logo src={mode === 'dark' ? darkBgLogo : lightBgLogo} alt=\"Massdriver\" />\n <Tooltip title=\"Toggle theme\" arrow>\n <IconButton onClick={toggleMode} aria-label=\"toggle theme\" size=\"small\">\n {mode === 'dark' ? (\n <LightModeIcon fontSize=\"small\" />\n ) : (\n <DarkModeIcon fontSize=\"small\" />\n )}\n </IconButton>\n </Tooltip>\n </HeaderRoot>\n );\n};\n\nconst HeaderRoot = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n height: 56,\n flexShrink: 0,\n paddingLeft: theme.spacing(3),\n paddingRight: theme.spacing(2),\n borderBottom: `1px solid ${theme.palette.divider}`,\n backgroundColor: theme.palette.background.paper,\n}));\n\nconst Logo = stylin('img')({\n height: 32,\n width: 'auto',\n display: 'block',\n});\n"],"names":[],"mappings":";;;;;;;;;;;AAeO,MAAM,mBAAmB,MAAM;AACpC,EAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,YAAA,EAAa;AAE1C,EAAA,4BACG,UAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,QAAK,GAAA,EAAK,IAAA,KAAS,SAAS,UAAA,GAAa,WAAA,EAAa,KAAI,YAAA,EAAa,CAAA;AAAA,oBACxE,GAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAM,cAAA,EAAe,KAAA,EAAK,IAAA,EACjC,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,UAAA,EAAY,YAAA,EAAW,cAAA,EAAe,IAAA,EAAK,SAC7D,QAAA,EAAA,IAAA,KAAS,MAAA,mBACR,GAAA,CAAC,aAAA,EAAA,EAAc,QAAA,EAAS,OAAA,EAAQ,CAAA,mBAEhC,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAS,OAAA,EAAQ,CAAA,EAEnC,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,MAAM,aAAa,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC7D,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,eAAA;AAAA,EAChB,MAAA,EAAQ,EAAA;AAAA,EACR,UAAA,EAAY,CAAA;AAAA,EACZ,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC5B,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC7B,YAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,CAAA;AAAA,EAChD,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW;AAC5C,CAAA,CAAE,CAAA;AAEF,MAAM,IAAA,GAAO,MAAA,CAAO,KAAK,CAAA,CAAE;AAAA,EACzB,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAC,CAAA;;;;"}
@@ -0,0 +1,30 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import Box from '@massdriver/ui/Box';
3
+ import stylin from '@massdriver/ui/stylin';
4
+ import { ThemeModeProvider } from '../theme/ThemeModeContext.esm.js';
5
+ import { MassdriverThemeScope } from '../theme/MassdriverThemeScope.esm.js';
6
+ import { MassdriverHeader } from './MassdriverHeader.esm.js';
7
+
8
+ const MassdriverShell = ({ children }) => /* @__PURE__ */ jsx(ThemeModeProvider, { children: /* @__PURE__ */ jsx(MassdriverThemeScope, { children: /* @__PURE__ */ jsxs(ShellRoot, { children: [
9
+ /* @__PURE__ */ jsx(MassdriverHeader, {}),
10
+ /* @__PURE__ */ jsx(ShellContent, { children })
11
+ ] }) }) });
12
+ const ShellRoot = stylin(Box)(({ theme }) => ({
13
+ display: "flex",
14
+ flexDirection: "column",
15
+ // The Backstage sidebar layout gives its content full viewport height with
16
+ // no top bar, so fill the viewport and let the content region scroll.
17
+ height: "100vh",
18
+ minHeight: 0,
19
+ overflow: "hidden",
20
+ backgroundColor: theme.palette.background.default,
21
+ color: theme.palette.text.primary
22
+ }));
23
+ const ShellContent = stylin(Box)({
24
+ flex: 1,
25
+ minHeight: 0,
26
+ overflow: "auto"
27
+ });
28
+
29
+ export { MassdriverShell };
30
+ //# sourceMappingURL=MassdriverShell.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MassdriverShell.esm.js","sources":["../../src/shell/MassdriverShell.tsx"],"sourcesContent":["import Box from '@massdriver/ui/Box';\nimport stylin from '@massdriver/ui/stylin';\nimport { ReactNode } from 'react';\nimport { ThemeModeProvider } from '../theme/ThemeModeContext';\nimport { MassdriverThemeScope } from '../theme/MassdriverThemeScope';\nimport { MassdriverHeader } from './MassdriverHeader';\n\n/**\n * Wraps every embedded Massdriver view: owns theme-mode state, applies the\n * Massdriver theme scope, and renders the dummy header above the routed\n * content. Fills the Backstage content area (the page uses `noHeader`).\n *\n * @public\n */\nexport const MassdriverShell = ({ children }: { children: ReactNode }) => (\n <ThemeModeProvider>\n <MassdriverThemeScope>\n <ShellRoot>\n <MassdriverHeader />\n <ShellContent>{children}</ShellContent>\n </ShellRoot>\n </MassdriverThemeScope>\n </ThemeModeProvider>\n);\n\nconst ShellRoot = stylin(Box)(({ theme }: { theme: any }) => ({\n display: 'flex',\n flexDirection: 'column',\n // The Backstage sidebar layout gives its content full viewport height with\n // no top bar, so fill the viewport and let the content region scroll.\n height: '100vh',\n minHeight: 0,\n overflow: 'hidden',\n backgroundColor: theme.palette.background.default,\n color: theme.palette.text.primary,\n}));\n\nconst ShellContent = stylin(Box)({\n flex: 1,\n minHeight: 0,\n overflow: 'auto',\n});\n"],"names":[],"mappings":";;;;;;;AAcO,MAAM,eAAA,GAAkB,CAAC,EAAE,QAAA,EAAS,yBACxC,iBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,oBAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,kBAClB,GAAA,CAAC,gBAAc,QAAA,EAAS;AAAA,CAAA,EAC1B,GACF,CAAA,EACF;AAGF,MAAM,YAAY,MAAA,CAAO,GAAG,EAAE,CAAC,EAAE,OAAM,MAAuB;AAAA,EAC5D,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA;AAAA;AAAA,EAGf,MAAA,EAAQ,OAAA;AAAA,EACR,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,OAAA;AAAA,EAC1C,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAC5B,CAAA,CAAE,CAAA;AAEF,MAAM,YAAA,GAAe,MAAA,CAAO,GAAG,CAAA,CAAE;AAAA,EAC/B,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAC,CAAA;;;;"}
@@ -0,0 +1,30 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import createCache from '@emotion/cache';
3
+ import { CacheProvider } from '@emotion/react';
4
+ import { DarkTheme, LightTheme } from '@massdriver/ui/theme';
5
+ import ScopedCssBaseline from '@mui/material/ScopedCssBaseline';
6
+ import { ThemeProvider } from '@mui/material/styles';
7
+ import { useEffect } from 'react';
8
+ import { auditMuiClassNameConsistency } from './muiClassNameAudit.esm.js';
9
+ import { useThemeMode } from './ThemeModeContext.esm.js';
10
+
11
+ const massdriverCache = createCache({ key: "mdui" });
12
+ let classNameAuditDone = false;
13
+ const MassdriverThemeScope = ({ children }) => {
14
+ const { mode } = useThemeMode();
15
+ const theme = mode === "dark" ? DarkTheme : LightTheme;
16
+ useEffect(() => {
17
+ if (classNameAuditDone || process.env.NODE_ENV === "production") {
18
+ return;
19
+ }
20
+ classNameAuditDone = true;
21
+ const warning = auditMuiClassNameConsistency();
22
+ if (warning) {
23
+ console.warn(warning);
24
+ }
25
+ }, []);
26
+ return /* @__PURE__ */ jsx(CacheProvider, { value: massdriverCache, children: /* @__PURE__ */ jsx(ThemeProvider, { theme, children: /* @__PURE__ */ jsx(ScopedCssBaseline, { children }) }) });
27
+ };
28
+
29
+ export { MassdriverThemeScope };
30
+ //# sourceMappingURL=MassdriverThemeScope.esm.js.map