@spotify/backstage-plugin-soundcheck 0.16.3 → 0.18.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 (171) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/config.d.ts +14 -0
  3. package/dist/alpha/integrations.esm.js +2 -0
  4. package/dist/alpha/pages.esm.js +1 -1
  5. package/dist/alpha/plugin.esm.js +1 -1
  6. package/dist/alpha.d.ts +252 -17
  7. package/dist/api.esm.js +1 -1
  8. package/dist/blueprints/IntegrationPageBlueprint.esm.js +2 -0
  9. package/dist/components/Badges/LevelBadge.esm.js +1 -1
  10. package/dist/components/CampaignForm/hooks/utils.esm.js +1 -1
  11. package/dist/components/CampaignInsightsPage/CampaignInsightsPage.esm.js +1 -1
  12. package/dist/components/CampaignInsightsPage/CampaignStatusHistoryTile.esm.js +1 -1
  13. package/dist/components/CampaignsPage/CampaignListPage/CampaignListPage.esm.js +1 -1
  14. package/dist/components/CertificationSidebar/ExemptionJustificationDialog.esm.js +1 -1
  15. package/dist/components/CertificationsPage/CertificationTab.esm.js +1 -1
  16. package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
  17. package/dist/components/CheckDetails/CheckResultDetails.esm.js +1 -1
  18. package/dist/components/CheckDetails/FixMeDialog.esm.js +1 -1
  19. package/dist/components/CheckDetails/ResultStateBox.esm.js +1 -1
  20. package/dist/components/CheckDryRun/CheckDryRunDetails.esm.js +1 -1
  21. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/ConditionList.esm.js +1 -1
  22. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/FactValueDisplay.esm.js +1 -1
  23. package/dist/components/CheckForm/FormFields/RuleInput/Conditions/RuleConditionInput.esm.js +1 -1
  24. package/dist/components/CheckForm/FormFields/RuleInput/Expressions/ExpressionBox.esm.js +1 -1
  25. package/dist/components/CheckForm/FormFields/RuleInput/RuleInputBox.esm.js +1 -1
  26. package/dist/components/CheckForm/Steps/CheckApplicabilityStep.esm.js +1 -1
  27. package/dist/components/CheckForm/utils/checkFormUtils.esm.js +2 -2
  28. package/dist/components/CheckForm/utils/validation.esm.js +1 -1
  29. package/dist/components/CheckIcon/CheckIcon.esm.js +1 -1
  30. package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTable.esm.js +1 -1
  31. package/dist/components/CheckPage/CheckInsightsPage.esm.js +1 -1
  32. package/dist/components/CheckPage/CheckStatusHistoryChart.esm.js +1 -1
  33. package/dist/components/CheckPage/ExemptionsTable.esm.js +2 -0
  34. package/dist/components/ChecksPage/CheckListPage/CheckListPage.esm.js +1 -1
  35. package/dist/components/CollapsablePanel/CollapsablePanel.esm.js +2 -0
  36. package/dist/components/CollectorPage/CollectorPage.esm.js +1 -1
  37. package/dist/components/CollectorPage/Configurators/Common/FactCollectionConfig.esm.js +1 -1
  38. package/dist/components/CollectorPage/Configurators/HTTP/HttpStatusesInput.esm.js +1 -1
  39. package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
  40. package/dist/components/CollectorPage/Configurators/PagerDuty/utils.esm.js +1 -1
  41. package/dist/components/CollectorsPage/CollectorListPage/CollectorListPage.esm.js +1 -1
  42. package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +1 -1
  43. package/dist/components/CollectorsPage/CollectorsPage.esm.js +1 -1
  44. package/dist/components/EntitiesAutocompletePicker/EntitiesAutocompletePicker.esm.js +1 -1
  45. package/dist/components/FactExplorer/FactExplorer.esm.js +1 -1
  46. package/dist/components/FactExplorer/FactExplorerDialog.esm.js +1 -1
  47. package/dist/components/FactExplorer/useFactOptions.esm.js +1 -1
  48. package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
  49. package/dist/components/Filter/FilterComponent.esm.js +1 -1
  50. package/dist/components/FilterSidebar/FilterSidebar.esm.js +1 -1
  51. package/dist/components/FilterSidebar/StateFilter.esm.js +1 -1
  52. package/dist/components/FormControlledAutocomplete/FormControlledMultipleAutocomplete.esm.js +1 -1
  53. package/dist/components/GroupSelector/GroupSelector.esm.js +1 -1
  54. package/dist/components/ImportExportPanel/ImportExportPanel.esm.js +2 -0
  55. package/dist/components/LevelsTable/CheckRowContent.esm.js +1 -1
  56. package/dist/components/LevelsTable/LevelsTable.esm.js +1 -1
  57. package/dist/components/MultiSelectFilter/MultiSelectFilter.esm.js +1 -1
  58. package/dist/components/OverviewPage/OverviewPageHeader.esm.js +1 -1
  59. package/dist/components/OverviewTable/Cell/CheckCell.esm.js +1 -1
  60. package/dist/components/OverviewTable/Cell/CheckNameCell.esm.js +1 -1
  61. package/dist/components/OverviewTable/Cell/TrackCheckStatusCount.esm.js +2 -0
  62. package/dist/components/OverviewTable/Cell/cellRenderer.esm.js +1 -1
  63. package/dist/components/OverviewTable/OverviewTableContent.esm.js +1 -1
  64. package/dist/components/OverviewTable/ResultsTable.esm.js +1 -1
  65. package/dist/components/OverviewTable/ResultsTableRow.esm.js +1 -1
  66. package/dist/components/PassingPercentProgressbar/PassPercentageProgressbar.esm.js +2 -0
  67. package/dist/components/Router.esm.js +1 -1
  68. package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
  69. package/dist/components/RoutingPage/index.esm.js +1 -1
  70. package/dist/components/SearchFilters/SearchFilters.esm.js +1 -1
  71. package/dist/components/SendCampaignNotificationDialog/SendCampaignNotificationDialog.esm.js +2 -0
  72. package/dist/components/SoundcheckDialog/SoundcheckDialog.esm.js +1 -1
  73. package/dist/components/SoundcheckHeader/headerUtil.esm.js +1 -1
  74. package/dist/components/SummaryCard/SummaryCard.esm.js +1 -1
  75. package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
  76. package/dist/components/TechHealth/Filters/FilterProvider.esm.js +1 -1
  77. package/dist/components/TechHealth/Filters/utils.esm.js +1 -1
  78. package/dist/components/TechInsights/ColorLegend.esm.js +2 -0
  79. package/dist/components/TechInsights/LoadingOverlay.esm.js +2 -0
  80. package/dist/components/TechInsights/LowestPerformingTeams.esm.js +2 -0
  81. package/dist/components/TechInsights/NivoCirclePacking.esm.js +2 -0
  82. package/dist/components/TechInsights/NivoIcicle.esm.js +2 -0
  83. package/dist/components/TechInsights/NivoSunburst.esm.js +2 -0
  84. package/dist/components/TechInsights/NivoTreemap.esm.js +2 -0
  85. package/dist/components/TechInsights/TeamComparison/CheckComparison.esm.js +2 -0
  86. package/dist/components/TechInsights/TeamComparison/FailingComponentsTable.esm.js +2 -0
  87. package/dist/components/TechInsights/TeamComparison/LineChartContainer.esm.js +2 -0
  88. package/dist/components/TechInsights/TeamComparison/MultiCheckStatusHistoryChart.esm.js +2 -0
  89. package/dist/components/TechInsights/TeamComparison/MultiTrackHistoryChart.esm.js +2 -0
  90. package/dist/components/TechInsights/TeamComparison/TeamComparison.esm.js +2 -0
  91. package/dist/components/TechInsights/TeamComparison/TrackComparison.esm.js +2 -0
  92. package/dist/components/TechInsights/TeamPerformanceCard.esm.js +2 -0
  93. package/dist/components/TechInsights/TeamPerformanceListCard.esm.js +2 -0
  94. package/dist/components/TechInsights/TechInsightsGroupSelector.esm.js +2 -0
  95. package/dist/components/TechInsights/TechInsightsPage.esm.js +2 -0
  96. package/dist/components/TechInsights/TechInsightsPage2.esm.js +2 -0
  97. package/dist/components/TechInsights/TechInsightsSidebar.esm.js +2 -0
  98. package/dist/components/TechInsights/TechInsightsViewSelector.esm.js +2 -0
  99. package/dist/components/TechInsights/Tiles/CheckStatusTile.esm.js +2 -0
  100. package/dist/components/TechInsights/Tiles/TileUtils.esm.js +2 -0
  101. package/dist/components/TechInsights/Tiles/TrackStatusTile.esm.js +2 -0
  102. package/dist/components/TechInsights/TopPerformingTeams.esm.js +2 -0
  103. package/dist/components/TechInsights/TrackCardGrid.esm.js +2 -0
  104. package/dist/components/TechInsights/TrackCardGridBox.esm.js +2 -0
  105. package/dist/components/TechInsights/colorContrast.esm.js +2 -0
  106. package/dist/components/TechInsights/hierarchy/GroupNode.esm.js +2 -0
  107. package/dist/components/TechInsights/hierarchy/Hierarchy.esm.js +2 -0
  108. package/dist/components/TechInsights/hierarchy/VirtualRow.esm.js +2 -0
  109. package/dist/components/TechInsights/hierarchyToNivo.esm.js +2 -0
  110. package/dist/components/TechInsights/persistence/FavoriteViews.esm.js +2 -0
  111. package/dist/components/TechInsights/styles.esm.js +2 -0
  112. package/dist/components/TimePeriodBar/TimePeriodBar.esm.js +2 -0
  113. package/dist/components/TopFailingChecksTable/TopFailingChecksTable.esm.js +1 -1
  114. package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackBadgeTypeSelect/TrackBadgeTypeSelect.esm.js +1 -1
  115. package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
  116. package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js +1 -1
  117. package/dist/components/TrackPage/TrackEntitiesTable/TrackStatusChip.esm.js +1 -1
  118. package/dist/components/TrackPage/TrackEntitiesTable/columns.esm.js +1 -1
  119. package/dist/components/TrackPage/TrackEntitiesTable/utils.esm.js +1 -1
  120. package/dist/components/TrackPage/TrackHistoryChart.esm.js +1 -1
  121. package/dist/components/TrackPage/TrackPage.esm.js +1 -1
  122. package/dist/components/TrackPage/TrackStatusBar.esm.js +1 -1
  123. package/dist/components/TrackPage/TrackStatusTable.esm.js +1 -1
  124. package/dist/components/TracksPage/TrackListPage/TrackListPage.esm.js +1 -1
  125. package/dist/contexts/UserProvider.esm.js +1 -1
  126. package/dist/graphql/generated/index.esm.js +283 -79
  127. package/dist/hooks/aggregations/useCertificationStatusHistories.esm.js +2 -0
  128. package/dist/hooks/aggregations/useCertificationStatuses.esm.js +2 -0
  129. package/dist/hooks/aggregations/useCheckStatus.esm.js +1 -1
  130. package/dist/hooks/aggregations/useCheckStatusByGroups.esm.js +2 -0
  131. package/dist/hooks/aggregations/useCheckStatusHistoriesMultiFilter.esm.js +2 -0
  132. package/dist/hooks/campaigns/useCreateCampaign.esm.js +1 -1
  133. package/dist/hooks/campaigns/useGetCampaigns.esm.js +1 -1
  134. package/dist/hooks/campaigns/useSendCampaignNotification.esm.js +2 -0
  135. package/dist/hooks/campaigns/useUpdateCampaign.esm.js +1 -1
  136. package/dist/hooks/certifications/useTrackOverviewForOwner.esm.js +1 -1
  137. package/dist/hooks/checks/useCreateCheck.esm.js +1 -1
  138. package/dist/hooks/checks/useImportChecks.esm.js +2 -0
  139. package/dist/hooks/checks/useSetManualResult.esm.js +1 -1
  140. package/dist/hooks/checks/useUpdateCheck.esm.js +1 -1
  141. package/dist/hooks/collectors/useUpdateCollectorConfig.esm.js +1 -1
  142. package/dist/hooks/exemptions/useDeleteExemption.esm.js +1 -1
  143. package/dist/hooks/exemptions/useExemptCheckIds.esm.js +1 -1
  144. package/dist/hooks/exemptions/useExemptions.esm.js +2 -0
  145. package/dist/hooks/exemptions/useGetExemption.esm.js +1 -1
  146. package/dist/hooks/exemptions/useSetEntityExempt.esm.js +1 -1
  147. package/dist/hooks/facets/useFacetFilters.esm.js +1 -1
  148. package/dist/hooks/graphqlKeys.esm.js +1 -1
  149. package/dist/hooks/groups/useAllGroups.esm.js +1 -1
  150. package/dist/hooks/groups/useUsersGroupClaims.esm.js +1 -1
  151. package/dist/hooks/heirarchy/useGetDescendentsOfGroups.esm.js +2 -0
  152. package/dist/hooks/heirarchy/useGroupHierarchy.esm.js +2 -0
  153. package/dist/hooks/heirarchy/useHierarchicalTrackStatus.esm.js +2 -0
  154. package/dist/hooks/heirarchy/useRootGroups.esm.js +2 -0
  155. package/dist/hooks/savedViews/useDeleteView.esm.js +2 -0
  156. package/dist/hooks/savedViews/useSaveView.esm.js +2 -0
  157. package/dist/hooks/savedViews/useSavedViews.esm.js +2 -0
  158. package/dist/hooks/tracks/useCreateTrack.esm.js +1 -1
  159. package/dist/hooks/tracks/useImportTracks.esm.js +2 -0
  160. package/dist/hooks/tracks/useUpdateTrack.esm.js +1 -1
  161. package/dist/index.d.ts +85 -1
  162. package/dist/index.esm.js +1 -1
  163. package/dist/utils/colors.esm.js +1 -1
  164. package/dist/utils/export.esm.js +7 -3
  165. package/dist/utils/helpers.esm.js +2 -0
  166. package/dist/utils/validation.esm.js +1 -1
  167. package/package.json +34 -18
  168. package/dist/components/CheckForm/FormFields/RuleInput/useRuleInputHandlers.esm.js +0 -2
  169. package/dist/components/OrgHealth/OrgHealthPage.esm.js +0 -2
  170. package/dist/components/OverviewTable/Cell/TrackCheckIndicator.esm.js +0 -2
  171. package/dist/utils/getGroupFilterFromConfig.esm.js +0 -2
@@ -0,0 +1,2 @@
1
+ import{useApi as a}from"@backstage/core-plugin-api";import{useQuery as n}from"@tanstack/react-query";import{soundcheckApiRef as c}from"../../api.esm.js";import{QueryKeys as u}from"../graphqlKeys.esm.js";const m=(t,i)=>{const o=a(c);return n([u.CertificationStatusHistories,t],async()=>{const e=new Map;return await Promise.all(t.map(async r=>{const s=await o.getCertificationStatusHistory(r);e.set(r,s)})),e},{enabled:i,staleTime:60*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})};export{m as useCertificationStatusHistories};
2
+ //# sourceMappingURL=useCertificationStatusHistories.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as n}from"@backstage/core-plugin-api";import{useQuery as a}from"@tanstack/react-query";import{soundcheckApiRef as u}from"../../api.esm.js";import{QueryKeys as c}from"../graphqlKeys.esm.js";const p=e=>{const s=n(u);return a([c.CertificationStatuses,e],async()=>{const r=[];return!e.trackId||!e.groups||e.groups.length===0||e.trackId==="-"?[]:(await Promise.all(e.groups.map(t=>{const o=s.getCertificationStatus({trackId:e.trackId,filter:{"relations.ownedBy":t}});return o.then(i=>{r.push({...i,group:t})}),o})),r)},{staleTime:60*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})};export{p as useCertificationStatuses};
2
+ //# sourceMappingURL=useCertificationStatuses.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as o}from"@backstage/core-plugin-api";import{useQuery as s}from"@tanstack/react-query";import{soundcheckApiRef as c}from"../../api.esm.js";import{QueryKeys as u}from"../graphqlKeys.esm.js";const m=(e,t=!0)=>{const r=o(c);return s([u.CheckStatus,e],async()=>r.getCheckStatus(e),{enabled:t,staleTime:10*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})};export{m as useCheckStatus};
1
+ import{useApi as n,useAnalytics as a}from"@backstage/core-plugin-api";import{useQuery as o}from"@tanstack/react-query";import{soundcheckApiRef as p}from"../../api.esm.js";import{QueryKeys as u}from"../graphqlKeys.esm.js";const c=(t,r=!0)=>{const i=n(p),s=a();return o([u.CheckStatus,t],async()=>{const e=await i.getCheckStatus(t);return e&&s.captureEvent("page_details","Check Status",{attributes:{id:e.id,error:e.error,exempt:e.exempt,failed:e.failed,notApplicable:e.notApplicable,notReported:e.notReported,numberOfEntities:e.numberOfEntities,passed:e.passed,warning:e.warning,filter:t.filter}}),e},{enabled:r,staleTime:10*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})};export{c as useCheckStatus};
2
2
  //# sourceMappingURL=useCheckStatus.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as c}from"@backstage/core-plugin-api";import{useQuery as n}from"@tanstack/react-query";import{soundcheckApiRef as p}from"../../api.esm.js";import{QueryKeys as a}from"../graphqlKeys.esm.js";const h=e=>{const s=c(p);return n([a.CheckStatuses,e],async()=>{const t=[];return!e.groupIds||e.groupIds.length===0||await Promise.all(e.groupIds.map(r=>{const o=s.getCheckStatus({checkId:e.checkId,filter:{"relations.ownedBy":r}});return o.then(u=>{t.push({checkStatus:u,group:r})}),o})),t},{enabled:!0,staleTime:10*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})};export{h as useCheckStatusByGroups};
2
+ //# sourceMappingURL=useCheckStatusByGroups.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as c}from"@backstage/core-plugin-api";import{useQuery as a}from"@tanstack/react-query";import{soundcheckApiRef as l}from"../../api.esm.js";import{QueryKeys as m}from"../graphqlKeys.esm.js";const f=(e,i=!0)=>{const o=c(l);return a([m.CheckStatusHistoriesMultiFilter,e],async()=>{const t=[],u=e.map(async r=>{const s=o.getCheckStatusHistory(r);return s.then(n=>{t.push({...n,filter:r.filter})}),s});return await Promise.all(u),t},{enabled:i,staleTime:60*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})};export{f as useCheckStatusHistoriesMultiFilter};
2
+ //# sourceMappingURL=useCheckStatusHistoriesMultiFilter.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as m}from"@backstage/core-plugin-api";import{useQueryClient as u,useMutation as c}from"@tanstack/react-query";import{soundcheckApiRef as p}from"../../api.esm.js";import{MutationKeys as l,QueryKeys as a}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as g}from"../useSoundcheckAlert.esm.js";const y="Error Creating Campaign",i="Failed to create campaign.";function C(){const o=m(p),t=u(),{showAlert:n}=g(),s=async r=>{const e=await o.createCampaign(r);if(!e)throw new Error(i);return e};return c([l.CreateCampaign],s,{onSuccess:()=>Promise.all([t.invalidateQueries({queryKey:[a.GetCampaigns]}),t.invalidateQueries({queryKey:[a.GetCampaignOwners]})]),onError:r=>{let e=i;r instanceof Error&&(e=r.message),n({severity:"error",title:y,message:e})}})}export{C as useCreateCampaign};
1
+ import{useApi as u,useAnalytics as m}from"@backstage/core-plugin-api";import{useQueryClient as p,useMutation as g}from"@tanstack/react-query";import{soundcheckApiRef as C}from"../../api.esm.js";import{MutationKeys as y,QueryKeys as i}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as l}from"../useSoundcheckAlert.esm.js";const f="Error Creating Campaign",s="Failed to create campaign.";function d(){const o=u(C),a=p(),{showAlert:n}=l(),t=m(),c=async e=>{const r=await o.createCampaign(e);if(!r)throw new Error(s);return r};return g([y.CreateCampaign],c,{onSuccess:e=>(t.captureEvent("resource_action","Create Campaign",{attributes:{resourceType:"campaign",resourceAction:"create",resourceId:e.id,success:"true"}}),Promise.all([a.invalidateQueries({queryKey:[i.GetCampaigns]}),a.invalidateQueries({queryKey:[i.GetCampaignOwners]})])),onError:e=>{let r=s;e instanceof Error&&(r=e.message),n({severity:"error",title:f,message:r}),t.captureEvent("resource_action","Create Campaign",{attributes:{resourceType:"campaign",resourceAction:"create",success:"false"}}),t.captureEvent("error","Create Campaign",{attributes:{errorMessage:r}})}})}export{d as useCreateCampaign};
2
2
  //# sourceMappingURL=useCreateCampaign.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as n}from"@tanstack/react-query";import{soundcheckApiRef as o}from"../../api.esm.js";import{QueryKeys as s}from"../graphqlKeys.esm.js";function m(e,r){const t=i(o);return n([s.GetCampaigns,JSON.stringify(e)],async()=>t.getCampaigns(e),{staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1,enabled:r})}export{m as useGetCampaigns};
1
+ import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as n}from"@tanstack/react-query";import{soundcheckApiRef as s}from"../../api.esm.js";import{QueryKeys as m}from"../graphqlKeys.esm.js";function a(e,r,t){const o=i(s);return n([m.GetCampaigns,JSON.stringify(e)],async()=>o.getCampaigns(e,t),{staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1,enabled:r})}export{a as useGetCampaigns};
2
2
  //# sourceMappingURL=useGetCampaigns.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as s}from"@backstage/core-plugin-api";import{useMutation as m}from"@tanstack/react-query";import{useState as f}from"react";import{soundcheckApiRef as p}from"../../api.esm.js";import{MutationKeys as u}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as d}from"../useSoundcheckAlert.esm.js";const g="Error Sending Campaign Notification";function l(){const n=s(p),{showAlert:r}=d(),[e,a]=f(0),c=async o=>{const i=await n.sendCampaignNotification(o);if(!i)throw new Error(`Failed to send notification for campaign - ${o.campaignId}.`);return i};return{...m([u.SendCampaignNotification],c,{onSuccess:o=>a(o),onError:(o,i)=>{let t=`Failed to send notification for campaign - ${i.campaignId}`;o instanceof Error&&(t=o.message),r({severity:"error",title:g,message:t})}}),notificationCount:e}}export{l as useSendCampaignNotification};
2
+ //# sourceMappingURL=useSendCampaignNotification.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as u}from"@backstage/core-plugin-api";import{useQueryClient as m,useMutation as p}from"@tanstack/react-query";import{soundcheckApiRef as d}from"../../api.esm.js";import{MutationKeys as c,QueryKeys as a}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as l}from"../useSoundcheckAlert.esm.js";const y="Error Updating Campaign",i="Failed to update campaign.";function g(){const n=u(d),t=m(),{showAlert:o}=l(),s=async r=>{const e=await n.updateCampaign(r);if(!e)throw new Error(i);return e};return p([c.UpdateCampaign],s,{onSuccess:()=>Promise.all([t.invalidateQueries({queryKey:[a.GetCampaigns]}),t.invalidateQueries({queryKey:[a.GetIndividualEntityPassRateTrends]}),t.invalidateQueries({queryKey:[a.GetCampaignOwners]})]),onError:r=>{let e=i;r instanceof Error&&(e=r.message),o({severity:"error",title:y,message:e})}})}export{g as useUpdateCampaign};
1
+ import{useApi as c,useAnalytics as m}from"@backstage/core-plugin-api";import{useQueryClient as d,useMutation as g}from"@tanstack/react-query";import{soundcheckApiRef as y}from"../../api.esm.js";import{MutationKeys as l,QueryKeys as s}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as f}from"../useSoundcheckAlert.esm.js";const C="Error Updating Campaign",n="Failed to update campaign.";function E(){const o=c(y),t=d(),{showAlert:u}=f(),a=m(),p=async e=>{const r=await o.updateCampaign(e);if(!r)throw new Error(n);return r};return g([l.UpdateCampaign],p,{onSuccess:e=>(a.captureEvent("resource_action","Update Campaign",{attributes:{resourceType:"campaign",resourceAction:"update",resourceId:e.id,success:"true"}}),Promise.all([t.invalidateQueries({queryKey:[s.GetCampaigns]}),t.invalidateQueries({queryKey:[s.GetIndividualEntityPassRateTrends]}),t.invalidateQueries({queryKey:[s.GetCampaignOwners]})])),onError:(e,r)=>{let i=n;e instanceof Error&&(i=e.message),u({severity:"error",title:C,message:i}),a.captureEvent("resource_action","Update Campaign",{attributes:{resourceType:"campaign",resourceAction:"update",resourceId:r.id,success:"false"}}),a.captureEvent("error","Update Campaign",{attributes:{errorMessage:i}})}})}export{E as useUpdateCampaign};
2
2
  //# sourceMappingURL=useUpdateCampaign.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as c}from"@backstage/core-plugin-api";import{useQuery as s}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{QueryKeys as u}from"../graphqlKeys.esm.js";function f(e,r,o,t,n){const i=c(m);return s([u.GetTrackOverviewForOwner,e??"",r??"",o??"",t??"",n??""],async()=>i.getTrackOverviewForOwner(e,r,o,t,n),{enabled:!!e&&!!r?.kind,staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})}export{f as useTrackOverviewForOwner};
1
+ import{useApi as c}from"@backstage/core-plugin-api";import{useQuery as s}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{QueryKeys as u}from"../graphqlKeys.esm.js";function f(e,r,o,t,n){const i=c(m);return s([u.GetTrackOverviewForOwner,e??"",r??"",o??"",t??"",n??""],async()=>i.getTrackOverviewForOwner(e,r,o,t,n),{enabled:!!e&&!!r?.kind,staleTime:0,refetchInterval:!1,refetchOnWindowFocus:!1})}export{f as useTrackOverviewForOwner};
2
2
  //# sourceMappingURL=useTrackOverviewForOwner.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as a}from"@backstage/core-plugin-api";import{useQueryClient as n,useMutation as u}from"@tanstack/react-query";import{soundcheckApiRef as l}from"../../api.esm.js";import{MutationKeys as h,QueryKeys as o}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as m}from"../useSoundcheckAlert.esm.js";const y="Error Creating Check";function k(){const i=a(l),t=n(),{showAlert:s}=m(),c=async r=>{const e=await i.createCheck(r);if(!e)throw new Error("Failed to create check.");return e};return u([h.CreateCheck],c,{onSuccess:()=>Promise.all([t.invalidateQueries({queryKey:[o.GetChecks]}),t.invalidateQueries({queryKey:[o.GetCheckOwners]}),t.invalidateQueries({queryKey:[o.ExecutableChecks]})]),onError:r=>{let e="Failed to create check.";r instanceof Error&&(e=r.message),s({severity:"error",title:y,message:e})}})}export{k as useCreateCheck};
1
+ import{useApi as i,useAnalytics as n}from"@backstage/core-plugin-api";import{useQueryClient as h,useMutation as C}from"@tanstack/react-query";import{soundcheckApiRef as k}from"../../api.esm.js";import{MutationKeys as y,QueryKeys as s}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as l}from"../useSoundcheckAlert.esm.js";const m="Error Creating Check";function p(){const o=i(k),t=h(),{showAlert:a}=l(),c=n(),u=async e=>{const r=await o.createCheck(e);if(!r)throw new Error("Failed to create check.");return r};return C([y.CreateCheck],u,{onSuccess:e=>(c.captureEvent("resource_action","Create Check",{attributes:{resourceType:"check",resourceAction:"create",resourceId:e.id,success:"true"}}),Promise.all([t.invalidateQueries({queryKey:[s.GetChecks]}),t.invalidateQueries({queryKey:[s.GetCheckOwners]}),t.invalidateQueries({queryKey:[s.ExecutableChecks]})])),onError:e=>{let r="Failed to create check.";e instanceof Error&&(r=e.message),a({severity:"error",title:m,message:r}),c.captureEvent("resource_action","Create Check",{attributes:{resourceType:"check",resourceAction:"create",success:"false"}}),c.captureEvent("error","Create Check",{attributes:{errorMessage:r}})}})}export{p as useCreateCheck};
2
2
  //# sourceMappingURL=useCreateCheck.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as a,useAnalytics as n}from"@backstage/core-plugin-api";import{useQueryClient as p,useMutation as m}from"@tanstack/react-query";import{soundcheckApiRef as h}from"../../api.esm.js";import{MutationKeys as k,QueryKeys as c}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as l}from"../useSoundcheckAlert.esm.js";const C="Error Importing Checks";function y(){const o=a(h),s=p(),{showAlert:i}=l(),t=n(),u=async r=>await o.importChecks(r);return m([k.ImportChecks],u,{onSuccess:r=>{for(const e of r.created)t.captureEvent("resource_action","Create Check",{attributes:{resourceType:"check",resourceAction:"create",resourceId:e.id,success:"true"}});for(const e of r.failed)t.captureEvent("resource_action","Create Check",{attributes:{resourceType:"check",resourceAction:"create",resourceId:e.id,success:"false"}}),t.captureEvent("error","Create Check",{attributes:{errorMessage:e.message??`Failed to create a check with ID ${e.id}`}});return Promise.all([s.invalidateQueries({queryKey:[c.GetChecks]}),s.invalidateQueries({queryKey:[c.GetCheckOwners]}),s.invalidateQueries({queryKey:[c.ExecutableChecks]})])},onError:r=>{let e="Failed to import checks.";r instanceof Error&&(e=r.message),i({severity:"error",title:C,message:e}),t.captureEvent("resource_action","Import Checks",{attributes:{resourceType:"check",resourceAction:"import",success:"false"}}),t.captureEvent("error","Import Checks",{attributes:{errorMessage:e}})}})}export{y as useImportChecks};
2
+ //# sourceMappingURL=useImportChecks.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as c}from"@backstage/core-plugin-api";import{useQueryClient as l,useMutation as y}from"@tanstack/react-query";import{useParams as m}from"react-router-dom";import{soundcheckApiRef as d}from"../../api.esm.js";import{MutationKeys as f,QueryKeys as i}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as h}from"../useSoundcheckAlert.esm.js";function k(){const s=c(d),t=l(),{showAlert:u}=h(),o=async r=>{const e=await s.setManualCheckResult(r);if(!e)throw new Error(`Failed to set manual result for check ${r.checkId} on entity ${r.entityRef}.`);return e},{trackId:n}=m();return y([f.SetResult],o,{onSuccess:(r,{checkId:e,entityRef:a})=>Promise.all([t.invalidateQueries({queryKey:[i.CertificationDetails,a]}),t.invalidateQueries({queryKey:[i.CertificationStatus,a]}),t.invalidateQueries({queryKey:[i.Certifications,a]}),t.invalidateQueries({queryKey:[i.CheckDetails,a,n,e]}),t.invalidateQueries({queryKey:[i.CheckStatus,e,a]}),t.invalidateQueries({queryKey:[i.TrackEntities]}),t.invalidateQueries({queryKey:[i.getExemptCheckIds,a]})]),onError:r=>{let e="Failed to execute check.";r instanceof Error&&(e=r.message),u({severity:"error",title:"Failed to set manual result.",message:e})}})}export{k as useSetManualResult};
1
+ import{useApi as l,useAnalytics as y}from"@backstage/core-plugin-api";import{useQueryClient as m,useMutation as d}from"@tanstack/react-query";import{useParams as f}from"react-router-dom";import{soundcheckApiRef as h}from"../../api.esm.js";import{MutationKeys as k,QueryKeys as s}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as p}from"../useSoundcheckAlert.esm.js";function v(){const a=l(h),u=y(),r=m(),{showAlert:c}=p(),o=async i=>{const e=await a.setManualCheckResult(i);if(!e)throw new Error(`Failed to set manual result for check ${i.checkId} on entity ${i.entityRef}.`);return e},{trackId:n}=f();return d([k.SetResult],o,{onSuccess:(i,{checkId:e,entityRef:t})=>(u.captureEvent("resource_action","Manual Result",{attributes:{resourceType:"manual_check_result",resourceAction:"set",resourceId:`${t}:${e}`,success:"true"}}),Promise.all([r.invalidateQueries({queryKey:[s.CertificationDetails,t]}),r.invalidateQueries({queryKey:[s.CertificationStatus,t]}),r.invalidateQueries({queryKey:[s.Certifications,t]}),r.invalidateQueries({queryKey:[s.CheckDetails,t,n,e]}),r.invalidateQueries({queryKey:[s.CheckStatus,e,t]}),r.invalidateQueries({queryKey:[s.TrackEntities]}),r.invalidateQueries({queryKey:[s.GetExemptCheckIds,t]})])),onError:(i,e)=>{let t="Failed to execute check.";i instanceof Error&&(t=i.message),c({severity:"error",title:"Failed to set manual result.",message:t}),u.captureEvent("resource_action","Manual Result",{attributes:{resourceType:"manual_check_result",resourceAction:"set",resourceId:e?.entityRef&&e?.checkId?`${e.entityRef}:${e.checkId}`:"",success:"false"}})}})}export{v as useSetManualResult};
2
2
  //# sourceMappingURL=useSetManualResult.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as i}from"@backstage/core-plugin-api";import{useQueryClient as u,useMutation as h}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{MutationKeys as p,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as k}from"../useSoundcheckAlert.esm.js";const l="Error Creating Check";function d(){const s=i(m),o=u(),{showAlert:c}=k(),n=async e=>{const r=await s.updateCheck(e);if(!r)throw new Error("Failed to update check.");return r};return h([p.UpdateCheck],n,{onSuccess:e=>{const r=[t.GetChecks,t.GetCheckOwners,t.ExecutableChecks,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return o.setQueryData([t.Check,e.id],e),Promise.all(r.map(a=>o.invalidateQueries({queryKey:[a]})))},onError:e=>{let r="Failed to update check.";e instanceof Error&&(r=e.message),c({severity:"error",title:l,message:r})}})}export{d as useUpdateCheck};
1
+ import{useApi as n,useAnalytics as p}from"@backstage/core-plugin-api";import{useQueryClient as d,useMutation as h}from"@tanstack/react-query";import{soundcheckApiRef as k}from"../../api.esm.js";import{MutationKeys as m,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as C}from"../useSoundcheckAlert.esm.js";const l="Error Creating Check";function y(){const u=n(k),o=d(),{showAlert:a}=C(),s=p(),i=async e=>{const r=await u.updateCheck(e);if(!r)throw new Error("Failed to update check.");return r};return h([m.UpdateCheck],i,{onSuccess:e=>{const r=[t.GetChecks,t.GetCheckOwners,t.ExecutableChecks,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return o.setQueryData([t.Check,e.id],e),s.captureEvent("resource_action","Update Check",{attributes:{resourceType:"check",resourceAction:"update",resourceId:e.id,success:"true"}}),Promise.all(r.map(c=>o.invalidateQueries({queryKey:[c]})))},onError:(e,r)=>{let c="Failed to update check.";e instanceof Error&&(c=e.message),a({severity:"error",title:l,message:c}),s.captureEvent("resource_action","Update Check",{attributes:{resourceType:"check",resourceAction:"update",resourceId:r.id,success:"false"}}),s.captureEvent("error","Update Check",{attributes:{errorMessage:c}})}})}export{y as useUpdateCheck};
2
2
  //# sourceMappingURL=useUpdateCheck.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as s}from"@backstage/core-plugin-api";import{useQueryClient as u,useMutation as a}from"@tanstack/react-query";import{soundcheckApiRef as c}from"../../api.esm.js";import{MutationKeys as l,QueryKeys as f}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as g}from"../useSoundcheckAlert.esm.js";const p="Error Configuring Integration";function m(){const r=s(c),t=u(),{showAlert:i}=g(),n=async e=>{const o=await r.updateCollectorConfig(e);if(!o)throw new Error("Failed to update integration configuration.");return o};return a([l.UpdateCollectorConfig],n,{onSuccess:()=>t.invalidateQueries({queryKey:[f.GetCollectors]}),onError:e=>{let o="Failed to update integration configuration.";e instanceof Error&&(o=e.message),i({severity:"error",title:p,message:o})}})}export{m as useUpdateCollectorConfig};
1
+ import{useApi as u,useAnalytics as a}from"@backstage/core-plugin-api";import{useQueryClient as l,useMutation as p}from"@tanstack/react-query";import{soundcheckApiRef as d}from"../../api.esm.js";import{MutationKeys as f,QueryKeys as g}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as C}from"../useSoundcheckAlert.esm.js";const m="Error Configuring Integration";function y(){const c=u(d),i=l(),{showAlert:n}=C(),o=a(),s=async e=>{const r=await c.updateCollectorConfig(e);if(!r)throw new Error("Failed to update integration configuration.");return r};return p([f.UpdateCollectorConfig],s,{onSuccess:e=>(o.captureEvent("resource_action","Update Collector Config",{attributes:{resourceType:"collector",resourceAction:"update",resourceId:e.id,success:"true"}}),i.invalidateQueries({queryKey:[g.GetCollectors]})),onError:(e,r)=>{let t="Failed to update integration configuration.";e instanceof Error&&(t=e.message),n({severity:"error",title:m,message:t}),o.captureEvent("resource_action","Update Collector Config",{attributes:{resourceType:"collector",resourceAction:"update",resourceId:r.collectorId,success:"false"}}),o.captureEvent("error","Update Collector Config",{attributes:{errorMessage:t}})}})}export{y as useUpdateCollectorConfig};
2
2
  //# sourceMappingURL=useUpdateCollectorConfig.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as l}from"@backstage/core-plugin-api";import{useQueryClient as y,useMutation as c}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{MutationKeys as d,QueryKeys as r}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as p}from"../useSoundcheckAlert.esm.js";function f(){const s=l(m),t=y(),{showAlert:a}=p(),u=async o=>{const{checkId:i,entityRef:e}=o,n=await s.deleteExemption(i,e);if(!n)throw new Error(`Failed to delete exemption for entity ${e} from check id ${i}.`);return n};return c([d.DeleteExemption],u,{onSuccess:({deleteExemption:o})=>{const{check_id:i,entity_ref:e}=o;return Promise.all([t.invalidateQueries({queryKey:[r.getExemption,e,i]}),t.invalidateQueries({queryKey:[r.GetChecks,i]}),t.invalidateQueries({queryKey:[r.TrackEntities,e]}),t.invalidateQueries({queryKey:[r.CertificationDetails,e]}),t.invalidateQueries({queryKey:[r.CertificationStatus,e]}),t.invalidateQueries({queryKey:[r.Certifications,e]}),t.invalidateQueries({queryKey:[r.CheckDetails,e]}),t.invalidateQueries({queryKey:[r.CheckStatus,i,e]}),t.invalidateQueries({queryKey:[r.getExemptCheckIds,e]})])},onError:o=>{let i="Failed to delete exemption.";o instanceof Error&&(i=o.message),a({severity:"error",title:"Error Deleting Exemption",message:i})}})}export{f as useDeleteExemption};
1
+ import{useApi as y,useAnalytics as l}from"@backstage/core-plugin-api";import{useQueryClient as d,useMutation as m}from"@tanstack/react-query";import{soundcheckApiRef as p}from"../../api.esm.js";import{MutationKeys as f,QueryKeys as r}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as E}from"../useSoundcheckAlert.esm.js";function x(){const u=y(p),s=l(),i=d(),{showAlert:c}=E(),a=async o=>{const{checkId:t,entityRef:e}=o,n=await u.deleteExemption(t,e);if(!n)throw new Error(`Failed to delete exemption for entity ${e} from check id ${t}.`);return n};return m([f.DeleteExemption],a,{onSuccess:({deleteExemption:o})=>{const{check_id:t,entity_ref:e}=o;return s.captureEvent("resource_action","Entity Exemption",{attributes:{resourceType:"exemption",resourceAction:"delete",resourceId:`${e}:${t}`,success:"true"}}),Promise.all([i.invalidateQueries({queryKey:[r.GetExemption,e,t]}),i.invalidateQueries({queryKey:[r.GetChecks,t]}),i.invalidateQueries({queryKey:[r.TrackEntities,e]}),i.invalidateQueries({queryKey:[r.CertificationDetails,e]}),i.invalidateQueries({queryKey:[r.CertificationStatus,e]}),i.invalidateQueries({queryKey:[r.Certifications,e]}),i.invalidateQueries({queryKey:[r.CheckDetails,e]}),i.invalidateQueries({queryKey:[r.CheckStatus,t,e]}),i.invalidateQueries({queryKey:[r.GetExemptCheckIds,e]}),i.invalidateQueries({queryKey:[r.GetExemptions]})])},onError:(o,t)=>{let e="Failed to delete exemption.";o instanceof Error&&(e=o.message),c({severity:"error",title:"Error Deleting Exemption",message:e}),s.captureEvent("resource_action","Entity Exemption",{attributes:{resourceType:"exemption",resourceAction:"delete",resourceId:t?.entityRef&&t?.checkId?`${t.entityRef}:${t.checkId}`:"",success:"false"}})}})}export{x as useDeleteExemption};
2
2
  //# sourceMappingURL=useDeleteExemption.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as c}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{QueryKeys as n}from"../graphqlKeys.esm.js";function s(e,t){const r=i(m);return c([n.getExemptCheckIds,e,t],async()=>{const o=await r.getExemptCheckIds(e,t);if(!o)throw new Error(`Failed to get exempt check ids for entity ${e} and track id ${t}.`);return o},{enabled:!!t&&!!e})}export{s as useExemptCheckIds};
1
+ import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as c}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{QueryKeys as n}from"../graphqlKeys.esm.js";function s(e,t){const r=i(m);return c([n.GetExemptCheckIds,e,t],async()=>{const o=await r.getExemptCheckIds(e,t);if(!o)throw new Error(`Failed to get exempt check ids for entity ${e} and track id ${t}.`);return o},{enabled:!!t&&!!e})}export{s as useExemptCheckIds};
2
2
  //# sourceMappingURL=useExemptCheckIds.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as n}from"@backstage/core-plugin-api";import{useQuery as p}from"@tanstack/react-query";import{soundcheckApiRef as f}from"../../api.esm.js";import{QueryKeys as u}from"../graphqlKeys.esm.js";function a(e,s){const m=n(f),{first:t=10,after:o,last:r,before:i}=s||{};return p([u.GetExemptions,e,t,o,r,i],async()=>(await m.getExemptions(e,t,o,r,i)).exemptions,{enabled:!!e})}export{a as useExemptions};
2
+ //# sourceMappingURL=useExemptions.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as n}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{QueryKeys as f}from"../graphqlKeys.esm.js";function p(t,e){const r=i(m);return n([f.getExemption,t,e],async()=>{if(!e)return null;const o=await r.getExemption(e,t);if(!o)throw new Error(`Failed to check for exemption for entity ${t} for check id ${e}.`);return o})}export{p as useGetExemption};
1
+ import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as n}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{QueryKeys as f}from"../graphqlKeys.esm.js";function p(t,e){const r=i(m);return n([f.GetExemption,t,e],async()=>{if(!e)return null;const o=await r.getExemption(e,t);if(!o)throw new Error(`Failed to check for exemption for entity ${t} for check id ${e}.`);return o})}export{p as useGetExemption};
2
2
  //# sourceMappingURL=useGetExemption.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as y}from"@backstage/core-plugin-api";import{useQueryClient as m,useMutation as l}from"@tanstack/react-query";import{soundcheckApiRef as d}from"../../api.esm.js";import{MutationKeys as f,QueryKeys as i}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as p}from"../useSoundcheckAlert.esm.js";const E="Error Setting Exemption";function h(){const o=y(d),t=m(),{showAlert:a}=p(),u=async r=>{const{checkId:e,entityRef:n,justification:c}=r,s=await o.setEntityExempt({checkId:e,entityRef:n,justification:c});if(!s)throw new Error(`Failed to exempt entity ${n} from check id ${e}.`);return s};return l([f.CreateExemption],u,{onSuccess:({check_id:r,entity_ref:e})=>Promise.all([t.invalidateQueries({queryKey:[i.getExemption,e,r]}),t.invalidateQueries({queryKey:[i.GetChecks,r]}),t.invalidateQueries({queryKey:[i.TrackEntities,e]}),t.invalidateQueries({queryKey:[i.CertificationDetails,e]}),t.invalidateQueries({queryKey:[i.CertificationStatus,e]}),t.invalidateQueries({queryKey:[i.Certifications,e]}),t.invalidateQueries({queryKey:[i.CheckDetails,e]}),t.invalidateQueries({queryKey:[i.CheckStatus,r,e]}),t.invalidateQueries({queryKey:[i.getExemptCheckIds,e]})]),onError:r=>{let e="Failed to set exemption";r instanceof Error&&(e=r.message),a({severity:"error",title:E,message:e})}})}export{h as useSetEntityExempt};
1
+ import{useApi as m,useAnalytics as f}from"@backstage/core-plugin-api";import{useQueryClient as p,useMutation as d}from"@tanstack/react-query";import{soundcheckApiRef as l}from"../../api.esm.js";import{MutationKeys as E,QueryKeys as i}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as h}from"../useSoundcheckAlert.esm.js";const x="Error Setting Exemption";function k(){const u=m(l),n=f(),t=p(),{showAlert:c}=h(),a=async r=>{const{checkId:e,entityRef:s,justification:y}=r,o=await u.setEntityExempt({checkId:e,entityRef:s,justification:y});if(!o)throw new Error(`Failed to exempt entity ${s} from check id ${e}.`);return o};return d([E.CreateExemption],a,{onSuccess:({check_id:r,entity_ref:e,user_ref:s})=>(n.captureEvent("resource_action","Entity Exemption",{attributes:{resourceType:"exemption",resourceAction:"create",resourceId:`${e}:${r}`,success:"true",userRef:s}}),Promise.all([t.invalidateQueries({queryKey:[i.GetExemption,e,r]}),t.invalidateQueries({queryKey:[i.GetChecks,r]}),t.invalidateQueries({queryKey:[i.TrackEntities,e]}),t.invalidateQueries({queryKey:[i.CertificationDetails,e]}),t.invalidateQueries({queryKey:[i.CertificationStatus,e]}),t.invalidateQueries({queryKey:[i.Certifications,e]}),t.invalidateQueries({queryKey:[i.CheckDetails,e]}),t.invalidateQueries({queryKey:[i.CheckStatus,r,e]}),t.invalidateQueries({queryKey:[i.GetExemptCheckIds,e]}),t.invalidateQueries({queryKey:[i.GetExemptions]})])),onError:(r,e)=>{let s="Failed to set exemption";r instanceof Error&&(s=r.message),c({severity:"error",title:x,message:s}),n.captureEvent("resource_action","Entity Exemption",{attributes:{resourceType:"exemption",resourceAction:"create",resourceId:e?.entityRef&&e?.checkId?`${e.entityRef}:${e.checkId}`:"",success:"false",justification:e?.justification}})}})}export{k as useSetEntityExempt};
2
2
  //# sourceMappingURL=useSetEntityExempt.esm.js.map
@@ -1,2 +1,2 @@
1
- import{camelCase as l}from"lodash";import{useCallback as d,useEffect as g,useLayoutEffect as _}from"react";import{useSearchParams as N,useLocation as D,useNavigate as j}from"react-router-dom";import E from"react-use/lib/useLocalStorage";import{Facet as n}from"../../components/TechHealth/Filters/types.esm.js";import"../../components/TechHealth/Filters/FacetFilter.esm.js";import"../../components/TechHealth/Filters/FilterProvider.esm.js";import"../../components/TechHealth/Filters/Filters.esm.js";import"../../components/TechHealth/Filters/FiltersHeader.esm.js";import"../../components/TechHealth/Filters/FiltersSection.esm.js";import"@backstage/catalog-model";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react/jsx-runtime";import"../../contexts/UserProvider.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../useSoundcheckAlert.esm.js";import"../useConfirmationModal.esm.js";import{emptyFacetFilters as h,DEFAULT_NUMBER_OF_DAYS as f,MIN_NUMBER_OF_DAYS as v,MAX_NUMBER_OF_DAYS as A}from"../../components/TechHealth/Filters/utils.esm.js";const M=(S,O)=>{const[e]=N(),s=D(),i=j(),u=O??S[n.EntityOwner][0]?.value,[a=h(u),p]=E("soundcheck.techHealth.facetFilters",h(u));a&&Object.values(n).forEach(t=>{a[t]||(a[t]=[])});const[c=f,F]=E("soundcheck.techHealth.numberOfDays",f),y=t=>!isNaN(t)&&t>=v&&t<=A,b=d((t,r)=>{const o={...a??h()};o[t]=r,p(o)},[a,p]);return g(()=>{const t=e.get("days");if(t&&t!==c.toString()){const r=parseInt(t,10);F(y(r)?r:f)}},[]),g(()=>{const t=e.get("days");(!t||t!==c.toString())&&(e.set("days",c.toString()),i({pathname:s.pathname,search:`?${e.toString()}`}))},[c,e,s,i]),_(()=>{let t=!0;const r=a;Object.values(n).forEach(o=>{const m=e.get(l(o));m?(t=!1,r[o]=m.split(",")):r[o]=[]}),t||p(r)},[]),g(()=>{Object.values(n).forEach(t=>{const r=a[t].join(","),o=l(t);r.length&&e.get(o)!==r&&(e.set(o,r),i({pathname:s.pathname,search:`?${e.toString()}`}))})},[a,e,s,i,u]),{setFacetFilter:(t,r)=>{b(t,r);const o=l(t);if(r.length){const m=r.join(",");e.get(o)!==m&&e.set(o,m)}else e.delete(o);i({pathname:s.pathname,search:`?${e.toString()}`})},getFacetFilter:t=>a?a[t]:[],clearFacetFilters:()=>{F(f),p(h()),e.delete("days"),Object.values(n).forEach(t=>{e.delete(l(t))}),i({pathname:s.pathname,search:`?${e.toString()}`})},facetFilters:a,numberOfDays:c,setNumberOfDays:F}};export{M as useFacetFilters};
1
+ import{camelCase as p}from"lodash";import{useCallback as E,useEffect as y,useLayoutEffect as M}from"react";import{useSearchParams as v,useLocation as A,useNavigate as $}from"react-router-dom";import O from"react-use/lib/useLocalStorage";import{Facet as l}from"../../components/TechHealth/Filters/types.esm.js";import"../../components/TechHealth/Filters/FacetFilter.esm.js";import"../../components/TechHealth/Filters/FilterProvider.esm.js";import"../../components/TechHealth/Filters/Filters.esm.js";import"../../components/TechHealth/Filters/FiltersHeader.esm.js";import"../../components/TechHealth/Filters/FiltersSection.esm.js";import"@backstage/catalog-model";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react/jsx-runtime";import"../../contexts/UserProvider.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../useSoundcheckAlert.esm.js";import"../useConfirmationModal.esm.js";import{emptyFacetFilters as h,DEFAULT_NUMBER_OF_DAYS as f,MIN_NUMBER_OF_DAYS as U,MAX_NUMBER_OF_DAYS as k}from"../../components/TechHealth/Filters/utils.esm.js";const B=(d,_)=>{const[a]=v(),c=A(),i=$(),g=_??d[l.EntityOwner][0]?.value,[r=h(g),n]=O("soundcheck.techHealth.facetFilters",h(g));r&&Object.values(l).forEach(t=>{r[t]||(r[t]=[])});const[m=f,u]=O("soundcheck.techHealth.numberOfDays",f),b=t=>!isNaN(t)&&t>=U&&t<=k,N=E((t,e)=>{const o={...r??h()};o[t]=e,n(o)},[r,n]);y(()=>{const t=a.get("days");if(t&&t!==m.toString()){const e=parseInt(t,10);u(b(e)?e:f)}},[]),y(()=>{const t=a.get("days");(!t||t!==m.toString())&&(a.set("days",m.toString()),i({pathname:c.pathname,search:`?${a.toString()}`}))},[m,a,c,i]),M(()=>{let t=!0;const e=r;Object.values(l).forEach(o=>{const s=a.get(p(o));s?(t=!1,e[o]=s.split(",")):e[o]=[]}),t||n(e)},[]),y(()=>{Object.values(l).forEach(t=>{const e=r[t].join(","),o=p(t);e.length&&a.get(o)!==e&&(a.set(o,e),i({pathname:c.pathname,search:`?${a.toString()}`}))})},[r,a,c,i,g]);const D=(t,e)=>{N(t,e);const o=p(t);if(e.length){const s=e.join(",");a.get(o)!==s&&a.set(o,s)}else a.delete(o);i({pathname:c.pathname,search:`?${a.toString()}`})},j=E((t,e)=>{const o={...r??h()};for(let s=0;s<t.length;s++)o[t[s]]=e[s];n(o)},[r,n]);return{setFacetFilter:D,setManyFacetFilters:(t,e)=>{j(t,e);for(let o=0;o<t.length;o++){const s=t[o],F=p(s);if(e[o].length){const S=e[o].join(",");a.get(F)!==S&&a.set(F,S)}else a.delete(F)}i({pathname:c.pathname,search:`?${a.toString()}`})},getFacetFilter:t=>r?r[t]:[],clearFacetFilters:()=>{u(f),n(h()),a.delete("days"),Object.values(l).forEach(t=>{a.delete(p(t))}),i({pathname:c.pathname,search:`?${a.toString()}`})},facetFilters:r,numberOfDays:m,setNumberOfDays:u}};export{B as useFacetFilters};
2
2
  //# sourceMappingURL=useFacetFilters.esm.js.map
@@ -1,2 +1,2 @@
1
- var t=(e=>(e.GetTrack="soundcheck/track",e.GetAllTracks="soundcheck/tracks",e.GetChecks="soundcheck/checks",e.GetCollectors="soundcheck/collectors",e.GetFactSchema="soundcheck/collectors/schema",e.GetEntityFacets="soundcheck/catalog/facets",e.GetSoftwareEntityRefsForUser="soundcheck/entities/softwareEntityRefsForUser",e.GetEntityRefs="soundcheck/catalog/entityRefs",e.ExecutableChecks="soundcheck/executableChecks",e.GetCampaigns="soundcheck/campaigns",e.GetOverallCheckPassRateTrends="soundcheck/charts/overallCheckPassRateTrends",e.GetIndividualCheckPassRateTrends="soundcheck/charts/getIndividualCheckPassRateTrends",e.GetOverallTrackPassRateTrends="soundcheck/charts/overallTrackPassRateTrends",e.GetIndividualTrackPassRateTrends="soundcheck/charts/individualTrackPassRateTrends",e.GetOverallEntityPassRateTrends="soundcheck/charts/overallEntityPassRateTrends",e.GetIndividualEntityPassRateTrends="soundcheck/charts/individualEntityPassRateTrends",e.GetOverallGroupPassRateTrends="soundcheck/charts/overallGroupPassRateTrends",e.GetIndividualGroupPassRateTrends="soundcheck/charts/individualGroupPassRateTrends",e.EntityByRef="soundcheck/catalog/entityByRef",e.EntitiesByRefs="soundcheck/catalog/entitiesByRef",e.TrackEntities="soundcheck/track/entities",e.CheckEntities="soundcheck/check/entities",e.CertificationStatus="soundcheck/certificationStatus",e.CertificationStatusHistory="soundcheck/certificationStatusHistory",e.CheckStatus="soundcheck/checkStatus",e.CheckStatuses="soundcheck/checkStatuses",e.CheckStatusHistory="soundcheck/checkStatusHistory",e.CheckStatusHistories="soundcheck/checkStatusHistories",e.Check="soundcheck/check",e.CheckDetails="soundcheck/checkDetails",e.Certifications="soundcheck/certifications",e.CertificationDetails="soundcheck/certificationDetails",e.GetCheckOwners="soundcheck/checks/getOwners",e.GetTrackOwners="soundcheck/tracks/getOwners",e.GetCampaignOwners="soundcheck/campaigns/getOwners",e.GetTrackRelatedGroups="soundcheck/track/getTrackRelatedGroups",e.CheckTemplates="soundcheck/checkTemplates",e.GetFacetsForOwner="soundcheck/facets-for-owner",e.GetTrackOverviewForOwner="soundcheck/track-overview-for-owner",e.getExemption="soundcheck/getExemption",e.getExemptCheckIds="soundcheck/getExemptCheckIds",e))(t||{}),c=(e=>(e.DeleteCheck="soundcheck/deleteCheck",e.CreateCheck="soundcheck/createCheck",e.UpdateCheck="soundcheck/updateCheck",e.ExecuteCheck="soundcheck/executeCheck",e.SetResult="soundcheck/setResult",e.CreateExemption="soundcheck/createExemption",e.UpdateExemption="soundcheck/updateExemption",e.DeleteExemption="soundcheck/deleteExemption",e.DeleteTrack="soundcheck/deleteTrack",e.CreateTrack="soundcheck/createTrack",e.UpdateTrack="soundcheck/updateTrack",e.UpdateCollectorConfig="soundcheck/updateCollectorConfig",e.CreateCampaign="soundcheck/createCampaign",e.UpdateCampaign="soundcheck/updateCampaign",e.DeleteCampaign="soundcheck/deleteCampaign",e.ArchiveCampaign="soundcheck/archiveCampaign",e))(c||{});export{c as MutationKeys,t as QueryKeys};
1
+ var t=(e=>(e.GetTrack="soundcheck/track",e.GetAllTracks="soundcheck/tracks",e.GetChecks="soundcheck/checks",e.GetCollectors="soundcheck/collectors",e.GetFactSchema="soundcheck/collectors/schema",e.GetEntityFacets="soundcheck/catalog/facets",e.GetSoftwareEntityRefsForUser="soundcheck/entities/softwareEntityRefsForUser",e.GetEntityRefs="soundcheck/catalog/entityRefs",e.ExecutableChecks="soundcheck/executableChecks",e.GetCampaigns="soundcheck/campaigns",e.GetOverallCheckPassRateTrends="soundcheck/charts/overallCheckPassRateTrends",e.GetIndividualCheckPassRateTrends="soundcheck/charts/getIndividualCheckPassRateTrends",e.GetOverallTrackPassRateTrends="soundcheck/charts/overallTrackPassRateTrends",e.GetIndividualTrackPassRateTrends="soundcheck/charts/individualTrackPassRateTrends",e.GetOverallEntityPassRateTrends="soundcheck/charts/overallEntityPassRateTrends",e.GetIndividualEntityPassRateTrends="soundcheck/charts/individualEntityPassRateTrends",e.GetOverallGroupPassRateTrends="soundcheck/charts/overallGroupPassRateTrends",e.GetIndividualGroupPassRateTrends="soundcheck/charts/individualGroupPassRateTrends",e.EntityByRef="soundcheck/catalog/entityByRef",e.EntitiesByRefs="soundcheck/catalog/entitiesByRef",e.TrackEntities="soundcheck/track/entities",e.CheckEntities="soundcheck/check/entities",e.CertificationStatus="soundcheck/certificationStatus",e.CertificationStatuses="soundcheck/certificationStatuses",e.CertificationStatusHistory="soundcheck/certificationStatusHistory",e.CertificationStatusHistories="soundcheck/certificationStatusHistories",e.CheckStatus="soundcheck/checkStatus",e.CheckStatuses="soundcheck/checkStatuses",e.SavedViews="soundcheck/savedViews",e.CheckStatusHistory="soundcheck/checkStatusHistory",e.CheckStatusHistories="soundcheck/checkStatusHistories",e.CheckStatusHistoriesMultiFilter="soundcheck/checkStatusHistoriesMultiFilter",e.Check="soundcheck/check",e.CheckDetails="soundcheck/checkDetails",e.Certifications="soundcheck/certifications",e.CertificationDetails="soundcheck/certificationDetails",e.GetCheckOwners="soundcheck/checks/getOwners",e.GetTrackOwners="soundcheck/tracks/getOwners",e.GetCampaignOwners="soundcheck/campaigns/getOwners",e.GetTrackRelatedGroups="soundcheck/track/getTrackRelatedGroups",e.CheckTemplates="soundcheck/checkTemplates",e.GetFacetsForOwner="soundcheck/facets-for-owner",e.GetTrackOverviewForOwner="soundcheck/track-overview-for-owner",e.GetExemption="soundcheck/getExemption",e.GetExemptions="soundcheck/getExemptions",e.GetExemptCheckIds="soundcheck/getExemptCheckIds",e))(t||{}),s=(e=>(e.DeleteCheck="soundcheck/deleteCheck",e.CreateCheck="soundcheck/createCheck",e.UpdateCheck="soundcheck/updateCheck",e.ExecuteCheck="soundcheck/executeCheck",e.ImportChecks="soundcheck/importChecks",e.SetResult="soundcheck/setResult",e.CreateExemption="soundcheck/createExemption",e.UpdateExemption="soundcheck/updateExemption",e.DeleteExemption="soundcheck/deleteExemption",e.SaveView="soundcheck/saveView",e.DeleteTrack="soundcheck/deleteTrack",e.CreateTrack="soundcheck/createTrack",e.UpdateTrack="soundcheck/updateTrack",e.ImportTracks="soundcheck/importTracks",e.UpdateCollectorConfig="soundcheck/updateCollectorConfig",e.CreateCampaign="soundcheck/createCampaign",e.UpdateCampaign="soundcheck/updateCampaign",e.DeleteCampaign="soundcheck/deleteCampaign",e.ArchiveCampaign="soundcheck/archiveCampaign",e.SendCampaignNotification="soundcheck/sendCampaignNotification",e))(s||{});export{s as MutationKeys,t as QueryKeys};
2
2
  //# sourceMappingURL=graphqlKeys.esm.js.map
@@ -1,2 +1,2 @@
1
- import{stringifyEntityRef as n}from"@backstage/catalog-model";import{useApi as t,configApiRef as p}from"@backstage/core-plugin-api";import{catalogApiRef as f}from"@backstage/plugin-catalog-react";import{combineEntityFilterQueries as s}from"@spotify/backstage-plugin-soundcheck-common";import{useQuery as l}from"@tanstack/react-query";import{getGroupFilterFromConfig as c}from"../../utils/getGroupFilterFromConfig.esm.js";function u(){const i=t(f),r=t(p);return l(["soundcheck/all-groups"],async()=>{const a=c(r),o=s({kind:"Group"},a),{items:m}=await i.getEntities({filter:o,fields:["spec.profile.displayName","metadata.title","metadata.name","metadata.namespace","kind"]});return m.filter(e=>e?.kind==="Group").map(e=>({name:e.spec?.profile?.displayName??e.metadata.title??e.metadata.name,ref:n(e)}))},{staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})}export{u as useAllGroups};
1
+ import{stringifyEntityRef as n}from"@backstage/catalog-model";import{useApi as t,configApiRef as p}from"@backstage/core-plugin-api";import{catalogApiRef as s}from"@backstage/plugin-catalog-react";import{getGroupFilterFromConfig as f,combineEntityFilterQueries as l}from"@spotify/backstage-plugin-soundcheck-common";import{useQuery as c}from"@tanstack/react-query";function u(){const i=t(s),r=t(p);return c(["soundcheck/all-groups"],async()=>{const a=f(r),o=l({kind:"Group"},a),{items:m}=await i.getEntities({filter:o,fields:["spec.profile.displayName","metadata.title","metadata.name","metadata.namespace","kind"]});return m.filter(e=>e?.kind==="Group").map(e=>({name:e.spec?.profile?.displayName??e.metadata.title??e.metadata.name,ref:n(e)}))},{staleTime:5*60*1e3,refetchInterval:!1,refetchOnWindowFocus:!1})}export{u as useAllGroups};
2
2
  //# sourceMappingURL=useAllGroups.esm.js.map
@@ -1,2 +1,2 @@
1
- import{stringifyEntityRef as n}from"@backstage/catalog-model";import{useApi as t,identityApiRef as p,configApiRef as f}from"@backstage/core-plugin-api";import{catalogApiRef as m}from"@backstage/plugin-catalog-react";import{useQuery as u}from"@tanstack/react-query";import{getGroupFilterFromConfig as c}from"../../utils/getGroupFilterFromConfig.esm.js";function y(){const i=t(p),r=t(m),o=t(f);return u(["soundcheck/user-groups-claims"],async()=>{const{ownershipEntityRefs:s}=await i.getBackstageIdentity(),a=c(o);return(await r.getEntitiesByRefs({entityRefs:s,filter:a})).items.filter(e=>e?.kind==="Group").map(e=>({name:e.spec?.profile?.displayName??e.metadata.title??e.metadata.name,ref:n(e),type:e.spec?.type}))})}export{y as useUsersGroupClaims};
1
+ import{stringifyEntityRef as n}from"@backstage/catalog-model";import{useApi as t,identityApiRef as p,configApiRef as f}from"@backstage/core-plugin-api";import{catalogApiRef as m}from"@backstage/plugin-catalog-react";import{getGroupFilterFromConfig as u}from"@spotify/backstage-plugin-soundcheck-common";import{useQuery as c}from"@tanstack/react-query";function y(){const i=t(p),r=t(m),o=t(f);return c(["soundcheck/user-groups-claims"],async()=>{const{ownershipEntityRefs:s}=await i.getBackstageIdentity(),a=u(o);return(await r.getEntitiesByRefs({entityRefs:s,filter:a})).items.filter(e=>e?.kind==="Group").map(e=>({name:e.spec?.profile?.displayName??e.metadata.title??e.metadata.name,ref:n(e),type:e.spec?.type}))})}export{y as useUsersGroupClaims};
2
2
  //# sourceMappingURL=useUsersGroupClaims.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as o}from"@backstage/core-plugin-api";import{useQuery as r}from"@tanstack/react-query";import{soundcheckApiRef as t}from"../../api.esm.js";function u(e,s){const n=o(t);return r(["soundcheck/descendentsOfGroups",e],async()=>n.getDescendantsOfGroups(e),{enabled:s})}export{u as useDescendantsOfGroups};
2
+ //# sourceMappingURL=useGetDescendentsOfGroups.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as i}from"@backstage/core-plugin-api";import{useQuery as u}from"@tanstack/react-query";import{soundcheckApiRef as c}from"../../api.esm.js";const t=(e,r)=>{const o=i(c);return u({queryKey:["groupHierarchy",e],queryFn:async()=>(await o.getGroupHierarchy(e)).hierarchy,staleTime:60*60*1e3,refetchOnWindowFocus:!1,enabled:r?.enabled??!0})};export{t as useGroupHierarchy};
2
+ //# sourceMappingURL=useGroupHierarchy.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as a}from"@backstage/core-plugin-api";import{useQuery as i}from"@tanstack/react-query";import{soundcheckApiRef as o}from"../../api.esm.js";const n=({trackId:e,groupRef:r,skip:c})=>{const t=a(o);return i({queryKey:["hierarchicalTrackStatus",e,r],queryFn:async()=>await t.getHierarchicalTrackStatus(e,r),enabled:!c,staleTime:1e3*60*15,cacheTime:1e3*60*60,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1})};export{n as useHierarchicalTrackStatus};
2
+ //# sourceMappingURL=useHierarchicalTrackStatus.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as r}from"@backstage/core-plugin-api";import{useQuery as t}from"@tanstack/react-query";import{soundcheckApiRef as c}from"../../api.esm.js";function n(e){const o=r(c);return t(["soundcheck/rootGroups"],async()=>o.getRootGroups(),{enabled:e,staleTime:1e3*60*60,cacheTime:1e3*60*60*4,refetchOnWindowFocus:!1,refetchOnMount:!1,refetchOnReconnect:!1})}export{n as useRootGroups};
2
+ //# sourceMappingURL=useRootGroups.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as i,identityApiRef as w}from"@backstage/core-plugin-api";import{useQueryClient as c,useMutation as l}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{QueryKeys as f}from"../graphqlKeys.esm.js";const p=()=>{const r=c(),o=i(m),n=i(w),{mutate:s,isLoading:a,error:u}=l(async e=>{const d=await n.getBackstageIdentity(),t=await o.deleteView({loggedInUser:d.userEntityRef,id:e});if(!t)throw new Error(`Failed to delete view with name ${e}.`);return t},{onSuccess:()=>r.invalidateQueries([f.SavedViews])});return{deleteView:s,isDeletingView:a,deletionError:u}};export{p as useDeleteView};
2
+ //# sourceMappingURL=useDeleteView.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as i,identityApiRef as w}from"@backstage/core-plugin-api";import{useQueryClient as v,useMutation as y}from"@tanstack/react-query";import{soundcheckApiRef as f}from"../../api.esm.js";import{QueryKeys as g}from"../graphqlKeys.esm.js";const V=()=>{const r=v(),a=i(f),s=i(w),{mutate:o,isLoading:n,error:u}=y(async({data:m,name:e,description:c,type:d})=>{const p=await s.getBackstageIdentity(),t=await a.saveView({loggedInUser:p.userEntityRef,name:e,description:c,data:m,type:d});if(!t)throw new Error(`Failed to save view with name ${e}.`);return t},{onSuccess:()=>r.invalidateQueries([g.SavedViews])});return{saveView:o,isSavingView:n,saveError:u}};export{V as useSaveView};
2
+ //# sourceMappingURL=useSaveView.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as e,identityApiRef as a}from"@backstage/core-plugin-api";import{useQuery as d}from"@tanstack/react-query";import{soundcheckApiRef as u}from"../../api.esm.js";import{QueryKeys as c}from"../graphqlKeys.esm.js";const m=t=>{const i=e(u),s=e(a),{data:o,isLoading:r}=d([c.SavedViews],async()=>{const n=await s.getBackstageIdentity();return i.getSavedViews({loggedInUser:n.userEntityRef,type:t})},{staleTime:10*60*1e3,refetchOnWindowFocus:!1});return{views:o,isLoading:r}};export{m as useSavedViews};
2
+ //# sourceMappingURL=useSavedViews.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as n}from"@backstage/core-plugin-api";import{useQueryClient as i,useMutation as u}from"@tanstack/react-query";import{soundcheckApiRef as l}from"../../api.esm.js";import{MutationKeys as m,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as k}from"../useSoundcheckAlert.esm.js";const T="Error Creating Track";function d(){const a=n(l),o=i(),{showAlert:s}=k(),c=async r=>{const e=await a.createTrack(r);if(!e)throw new Error("Failed to create track.");return e};return u([m.CreateTrack],c,{onSuccess:async()=>{const r=[t.GetAllTracks,t.GetOverallTrackPassRateTrends,t.GetIndividualTrackPassRateTrends,t.GetTrackOwners,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return Promise.all(r.map(e=>o.invalidateQueries({queryKey:[e]})))},onError:r=>{let e="Failed to create track.";r instanceof Error&&(e=r.message),s({severity:"error",title:T,message:e})}})}export{d as useCreateTrack};
1
+ import{useApi as i,useAnalytics as k}from"@backstage/core-plugin-api";import{useQueryClient as l,useMutation as T}from"@tanstack/react-query";import{soundcheckApiRef as m}from"../../api.esm.js";import{MutationKeys as p,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as d}from"../useSoundcheckAlert.esm.js";const y="Error Creating Track";function f(){const c=i(m),s=l(),{showAlert:o}=d(),a=k(),n=async r=>{const e=await c.createTrack(r);if(!e)throw new Error("Failed to create track.");return e};return T([p.CreateTrack],n,{onSuccess:r=>{a.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",resourceId:r.id,success:"true"}});const e=[t.GetAllTracks,t.GetOverallTrackPassRateTrends,t.GetIndividualTrackPassRateTrends,t.GetTrackOwners,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return Promise.all(e.map(u=>s.invalidateQueries({queryKey:[u]})))},onError:r=>{let e="Failed to create track.";r instanceof Error&&(e=r.message),o({severity:"error",title:y,message:e}),a.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",success:"false"}}),a.captureEvent("error","Create Track",{attributes:{errorMessage:e}})}})}export{f as useCreateTrack};
2
2
  //# sourceMappingURL=useCreateTrack.esm.js.map
@@ -0,0 +1,2 @@
1
+ import{useApi as n,useAnalytics as p}from"@backstage/core-plugin-api";import{useQueryClient as m,useMutation as k}from"@tanstack/react-query";import{soundcheckApiRef as l}from"../../api.esm.js";import{MutationKeys as T,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as d}from"../useSoundcheckAlert.esm.js";const f="Error Importing Tracks";function y(){const c=n(l),o=m(),{showAlert:i}=d(),s=p(),u=async r=>await c.importTracks(r);return k([T.ImportTracks],u,{onSuccess:r=>{for(const e of r.created)s.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",resourceId:e.id,success:"true"}});for(const e of r.failed)s.captureEvent("resource_action","Create Track",{attributes:{resourceType:"track",resourceAction:"create",resourceId:e.id,success:"false"}}),s.captureEvent("error","Create Track",{attributes:{errorMessage:e.message??`Failed to create a track with ID ${e.id}`}});const a=[t.GetAllTracks,t.GetOverallTrackPassRateTrends,t.GetIndividualTrackPassRateTrends,t.GetTrackOwners,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return Promise.all(a.map(e=>o.invalidateQueries({queryKey:[e]})))},onError:r=>{let a="Failed to import tracks.";r instanceof Error&&(a=r.message),i({severity:"error",title:f,message:a}),s.captureEvent("resource_action","Import Tracks",{attributes:{resourceType:"track",resourceAction:"import",success:"false"}}),s.captureEvent("error","Import Tracks",{attributes:{errorMessage:a}})}})}export{y as useImportTracks};
2
+ //# sourceMappingURL=useImportTracks.esm.js.map
@@ -1,2 +1,2 @@
1
- import{useApi as c}from"@backstage/core-plugin-api";import{asArray as u}from"@spotify/backstage-plugin-soundcheck-common";import{useQueryClient as d,useMutation as m}from"@tanstack/react-query";import{soundcheckApiRef as p}from"../../api.esm.js";import{MutationKeys as l,QueryKeys as e}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as k}from"../useSoundcheckAlert.esm.js";const T="Error Updating Track";function f(){const a=c(p),o=d(),{showAlert:s}=k(),n=async t=>{const r=await a.updateTrack(t);if(!r)throw new Error("Failed to update track.");return r};return m([l.UpdateTrack],n,{onSuccess:async t=>{const r=[[e.GetTrack,t.id],e.GetAllTracks,e.GetOverallTrackPassRateTrends,e.GetIndividualTrackPassRateTrends,e.GetTrackOwners,e.GetFacetsForOwner,e.GetTrackOverviewForOwner];return Promise.all(r.map(i=>o.invalidateQueries({queryKey:u(i)})))},onError:t=>{let r="Failed to update track.";t instanceof Error&&(r=t.message),s({severity:"error",title:T,message:r})}})}export{f as useUpdateTrack};
1
+ import{useApi as n,useAnalytics as d}from"@backstage/core-plugin-api";import{asArray as p}from"@spotify/backstage-plugin-soundcheck-common";import{useQueryClient as k,useMutation as l}from"@tanstack/react-query";import{soundcheckApiRef as T}from"../../api.esm.js";import{MutationKeys as m,QueryKeys as t}from"../graphqlKeys.esm.js";import{useSoundcheckAlert as y}from"../useSoundcheckAlert.esm.js";const f="Error Updating Track";function v(){const c=n(T),o=k(),{showAlert:u}=y(),s=d(),i=async e=>{const r=await c.updateTrack(e);if(!r)throw new Error("Failed to update track.");return r};return l([m.UpdateTrack],i,{onSuccess:async e=>{s.captureEvent("resource_action","Update Track",{attributes:{resourceType:"track",resourceAction:"update",resourceId:e.id,success:"true"}});const r=[[t.GetTrack,e.id],t.GetAllTracks,t.GetOverallTrackPassRateTrends,t.GetIndividualTrackPassRateTrends,t.GetTrackOwners,t.GetFacetsForOwner,t.GetTrackOverviewForOwner];return Promise.all(r.map(a=>o.invalidateQueries({queryKey:p(a)})))},onError:(e,r)=>{let a="Failed to update track.";e instanceof Error&&(a=e.message),u({severity:"error",title:f,message:a}),s.captureEvent("resource_action","Update Track",{attributes:{resourceType:"track",resourceAction:"update",resourceId:r.id,success:"false"}}),s.captureEvent("error","Update Track",{attributes:{errorMessage:a,resourceId:r.id}})}})}export{v as useUpdateTrack};
2
2
  //# sourceMappingURL=useUpdateTrack.esm.js.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,10 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
3
+ import * as react from 'react';
4
+ import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
5
+ import { RouteRef } from '@backstage/frontend-plugin-api';
6
+ import * as _tanstack_react_query from '@tanstack/react-query';
7
+ import { JsonObject } from '@backstage/types';
3
8
 
4
9
  /**
5
10
  * Props for the EntitySoundcheckCard.
@@ -67,4 +72,83 @@ declare const SoundcheckOverviewPage: (props: OverviewPageProps) => JSX.Element;
67
72
  */
68
73
  declare const SoundcheckRoutingPage: (props: OverviewPageProps) => JSX.Element;
69
74
 
70
- export { EntitySoundcheckCard, type EntitySoundcheckCardProps, EntitySoundcheckContent, GroupSoundcheckContent, type OverviewPageProps, SoundcheckOverviewPage, SoundcheckRoutingPage, soundcheckPlugin };
75
+ /**
76
+ * Create Soundcheck integration extensions that are routable React page components.
77
+ *
78
+ * @alpha
79
+ */
80
+ declare const IntegrationPageBlueprint: _backstage_frontend_plugin_api.ExtensionBlueprint<{
81
+ kind: "integration";
82
+ name: undefined;
83
+ params: {
84
+ integrationId: string;
85
+ loader: () => Promise<JSX.Element>;
86
+ path?: string;
87
+ routeRef?: RouteRef;
88
+ };
89
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "soundcheck.integrationId", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
90
+ optional: true;
91
+ }>;
92
+ inputs: {};
93
+ config: {};
94
+ configInput: {};
95
+ dataRefs: {
96
+ integrationId: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "soundcheck.integrationId", {}>;
97
+ };
98
+ }>;
99
+
100
+ /**
101
+ * React hook that fetches collector configurations by their IDs.
102
+ *
103
+ * @public
104
+ */
105
+ declare function useGetCollectors(collectorIds?: string[]): _tanstack_react_query.UseQueryResult<{
106
+ __typename?: "Collector";
107
+ id: string;
108
+ name?: string | null;
109
+ description?: string | null;
110
+ factNames: Array<string>;
111
+ config?: any | null;
112
+ configSchema?: any | null;
113
+ isConfigurable: boolean;
114
+ isEditable: boolean;
115
+ hasUIConfig?: boolean | null;
116
+ collectionConfigs: Array<{
117
+ __typename?: "CollectionConfig";
118
+ factRefs: Array<string>;
119
+ filter?: any | null;
120
+ frequency?: any | null;
121
+ cache?: any | null;
122
+ exclude?: any | null;
123
+ }>;
124
+ dependentChecks?: Array<{
125
+ __typename?: "Checker";
126
+ id: string;
127
+ name?: string | null;
128
+ }> | null;
129
+ }[], unknown>;
130
+
131
+ /**
132
+ * React hook that saves collector configuration.
133
+ *
134
+ * @public
135
+ */
136
+ declare function useUpdateCollectorConfig(): _tanstack_react_query.UseMutationResult<{
137
+ __typename?: "Collector";
138
+ id: string;
139
+ factNames: Array<string>;
140
+ config?: any | null;
141
+ configSchema?: any | null;
142
+ collectionConfigs: Array<{
143
+ __typename?: "CollectionConfig";
144
+ factRefs: Array<string>;
145
+ filter?: any | null;
146
+ frequency?: any | null;
147
+ cache?: any | null;
148
+ }>;
149
+ }, unknown, {
150
+ collectorId: string;
151
+ config?: JsonObject;
152
+ }, unknown>;
153
+
154
+ export { EntitySoundcheckCard, type EntitySoundcheckCardProps, EntitySoundcheckContent, GroupSoundcheckContent, IntegrationPageBlueprint, type OverviewPageProps, SoundcheckOverviewPage, SoundcheckRoutingPage, soundcheckPlugin, useGetCollectors, useUpdateCollectorConfig };
package/dist/index.esm.js CHANGED
@@ -1,2 +1,2 @@
1
- import{EntitySoundcheckCard as u,EntitySoundcheckContent as i,GroupSoundcheckContent as r,SoundcheckOverviewPage as d,SoundcheckRoutingPage as h,soundcheckPlugin as k}from"./plugin.esm.js";import"react/jsx-runtime";import"./components/SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import"./components/EntitySoundcheckCard/Card.esm.js";export{u as EntitySoundcheckCard,i as EntitySoundcheckContent,r as GroupSoundcheckContent,d as SoundcheckOverviewPage,h as SoundcheckRoutingPage,k as soundcheckPlugin};
1
+ import{EntitySoundcheckCard as m,EntitySoundcheckContent as d,GroupSoundcheckContent as g,SoundcheckOverviewPage as a,SoundcheckRoutingPage as h,soundcheckPlugin as k}from"./plugin.esm.js";import"react/jsx-runtime";import"./components/SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import"./components/EntitySoundcheckCard/Card.esm.js";import{IntegrationPageBlueprint as C}from"./blueprints/IntegrationPageBlueprint.esm.js";import{useGetCollectors as S}from"./hooks/collectors/useGetCollectors.esm.js";import{useUpdateCollectorConfig as x}from"./hooks/collectors/useUpdateCollectorConfig.esm.js";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"./api.esm.js";import"./hooks/graphqlKeys.esm.js";export{m as EntitySoundcheckCard,d as EntitySoundcheckContent,g as GroupSoundcheckContent,C as IntegrationPageBlueprint,a as SoundcheckOverviewPage,h as SoundcheckRoutingPage,k as soundcheckPlugin,S as useGetCollectors,x as useUpdateCollectorConfig};
2
2
  //# sourceMappingURL=index.esm.js.map
@@ -1,2 +1,2 @@
1
- import{interpolateRgb as r}from"d3-interpolate";import{scaleLinear as a}from"d3-scale";const n=(e,t)=>a().domain([0,50,100]).range([e.palette.error.main,e.palette.warning.main,e.palette.success.main]).interpolate(r.gamma(2.2))(t),i=(e,t)=>{switch(t){case"passed":return e.palette.success.main;case"failed":return e.palette.error.main;case"warning":return e.palette.warning.main;case"error":return e.palette.error.light;case"exempt":return e.palette.info.main;case"not-applicable":return e.palette.grey[500];case"not-reported":return e.palette.grey[700];default:return"inherit"}};export{i as getCheckStatusColor,n as getPercentageColor};
1
+ import{lighten as t}from"@material-ui/core";import{interpolateRgb as a}from"d3-interpolate";import{scaleLinear as n}from"d3-scale";const i=(e,r)=>n().domain([0,50,100]).range([e.palette.error.main,e.palette.warning.main,e.palette.success.main]).interpolate(a.gamma(2.2))(r),o=(e,r)=>{switch(r){case"passed":return e.palette.success.main;case"failed":return e.palette.error.main;case"warning":return e.palette.warning.main;case"error":return t(e.palette.error.main,.2);case"exempt":return e.palette.info.main;case"not-applicable":return e.palette.grey[500];case"not-reported":return e.palette.grey[700];default:return"inherit"}};export{o as getCheckStatusColor,i as getPercentageColor};
2
2
  //# sourceMappingURL=colors.esm.js.map
@@ -1,6 +1,10 @@
1
- import{dump as s}from"js-yaml";import{pickBy as i}from"lodash";const o=e=>{const t={...e};return i(t,a=>!!a||a==="")},c=e=>{const t={ordinal:e.ordinal,checks:e.checks.map(o)};return e.name&&(t.name=e.name),e.description&&(e.description=e.description),t},r=(e,t)=>{const a=new Blob([e],{type:"text/plain"}),n=window.document.createElement("a");n.href=window.URL.createObjectURL(a),n.download=t,n.click(),n.remove()},d=e=>{const t={id:e.id,name:e.name,ownerEntityRef:e.ownerEntityRef,levels:e.levels.map(c)};e.description&&(t.description=e.description),e.documentationURL&&(t.documentationURL=e.documentationURL),e.filter&&(t.filter=e.filter),e.exclude&&(t.exclude=e.exclude),e.draft&&(t.draft=e.draft),e.badge&&(t.badge={type:e.badge.variant.toLowerCase()});const a=`# Exported YAML Track. You can rename the track id if needed.
1
+ import{dump as s}from"js-yaml";import{pickBy as i}from"lodash";const d=e=>{const t={...e};return i(t,a=>!!a||a==="")},l=e=>{const t={ordinal:e.ordinal,checks:e.checks.map(d)};return e.name&&(t.name=e.name),e.description&&(t.description=e.description),t},r=(e,t)=>{const a=new Blob([e],{type:"text/plain"}),n=window.document.createElement("a");n.href=window.URL.createObjectURL(a),n.download=t,n.click(),n.remove()},c=e=>{const t={id:e.id,name:e.name,ownerEntityRef:e.ownerEntityRef,levels:e.levels.map(l)};return e.description&&(t.description=e.description),e.documentationURL&&(t.documentationURL=e.documentationURL),e.filter&&(t.filter=e.filter),e.exclude&&(t.exclude=e.exclude),e.draft&&(t.draft=e.draft),e.badge&&(t.badge={type:e.badge.variant.toLowerCase()}),t},p=e=>{const t=c(e),a=`# Exported YAML Track. You can rename the track id if needed.
2
2
  # Please ensure you have also exported the associated checks and that the ids match.
3
- `+s(t,{noRefs:!0});return r(a,`track-${e.id}.yaml`),a},l=e=>{const t={id:e.id};e.ownerEntityRef&&(t.ownerEntityRef=e.ownerEntityRef),e.name&&(t.name=e.name),e.description&&(t.description=e.description),e.pathResolver&&(t.pathResolver=e.pathResolver),e.rule&&(t.rule=e.rule),e.applicable&&(t.applicable=e.applicable),e.filter&&(t.filter=e.filter),e.exclude&&(t.exclude=e.exclude),e.warning&&(t.warning=e.warning),e.passedMessage&&(t.passedMessage=e.passedMessage),e.failedMessage&&(t.failedMessage=e.failedMessage),e.notApplicableMessage&&(t.notApplicableMessage=e.notApplicableMessage),e.schedule&&(t.schedule=e.schedule),e.templateRef&&(t.templateRef=e.templateRef),e.supportChannel&&(t.supportChannel=e.supportChannel),e.type&&(t.type=e.type);const a=`# Exported YAML Check. You can rename the check id if needed.
3
+ `+s(t,{noRefs:!0});return r(a,`track-${e.id}.yaml`),a},h=e=>{const t=e.map(n=>c(n)),a=`# Exported YAML Tracks. You can rename the track ids if needed.
4
+ # Please ensure you have also exported the associated checks and that the ids match.
5
+ `+s(t,{noRefs:!0});return r(a,"tracks.yaml"),a},o=e=>{const t={id:e.id};return e.ownerEntityRef&&(t.ownerEntityRef=e.ownerEntityRef),e.name&&(t.name=e.name),e.description&&(t.description=e.description),e.pathResolver&&(t.pathResolver=e.pathResolver),e.rule&&(t.rule=e.rule),e.applicable&&(t.applicable=e.applicable),e.filter&&(t.filter=e.filter),e.exclude&&(t.exclude=e.exclude),e.warning&&(t.warning=e.warning),e.passedMessage&&(t.passedMessage=e.passedMessage),e.failedMessage&&(t.failedMessage=e.failedMessage),e.notApplicableMessage&&(t.notApplicableMessage=e.notApplicableMessage),e.schedule&&(t.schedule=e.schedule),e.templateRef&&(t.templateRef=e.templateRef),e.supportChannel&&(t.supportChannel=e.supportChannel),e.type&&(t.type=e.type),t},m=e=>{const t=o(e),a=`# Exported YAML Check. You can rename the check id if needed.
6
+ # Please ensure the ids match in the associated tracks.
7
+ `+s(t,{noRefs:!0});return r(a,`check-${e.id}.yaml`),a},u=e=>{const t=e.map(n=>o(n)),a=`# Exported YAML Checks. You can rename the check ids if needed.
4
8
  # Please ensure the ids match in the associated tracks.
5
- `+s(t,{noRefs:!0});return r(a,`check-${e.id}.yaml`),a};export{l as exportCheck,d as exportTrack};
9
+ `+s(t,{noRefs:!0});return r(a,"checks.yaml"),a};export{m as exportCheck,u as exportChecks,p as exportTrack,h as exportTracks};
6
10
  //# sourceMappingURL=export.esm.js.map
@@ -0,0 +1,2 @@
1
+ const y=r=>{const{lifecycles:e,owners:t,types:s,systems:n}=r,o=e?.length?{"spec.lifecycle":e}:void 0,i=t?.length?{"relations.ownedBy":t}:void 0,l=s?.length?{"spec.type":s}:void 0,c=n?.length?{"relations.partOf":n}:void 0;if(o||i||l||c)return{...o,...i,...l,...c}};export{y as toFilter};
2
+ //# sourceMappingURL=helpers.esm.js.map
@@ -1,2 +1,2 @@
1
- import{z as e}from"zod";import{filterPresent as i}from"../components/Filter/utils.esm.js";import"../components/Filter/FilterComponent.esm.js";import{TimeUnit as u}from"../components/Frequency/types.esm.js";import"../components/Frequency/util.esm.js";import"../components/Frequency/FrequencyComponent.esm.js";import{validateCacheConfig as n}from"./collectors.esm.js";import{validateFrequency as l}from"./frequency.esm.js";const m="At least one check is required",y="This field is required",s=e.nativeEnum(u),p=e.strictObject({enabled:e.boolean(),hasDuration:e.boolean(),unit:s.optional(),value:e.number().min(1,"Value must be greater than 0.").optional()}).refine(t=>n(t)===!0,t=>({message:n(t)})),d=e.strictObject({type:e.enum(["HumanDuration","cron"]),unit:s.optional(),value:e.number().min(1,"Value must be greater than 0.").optional(),cron:e.string().optional()}).refine(t=>l(t)===!0,t=>({message:l(t)})),r=e.strictObject({selectedKinds:e.string().array(),selectedTypes:e.string().array(),selectedLifecycles:e.string().array(),selectedOwners:e.string().array(),selectedSystems:e.string().array(),selectedTags:e.string().array()}),a=e.strictObject({selectedLabels:e.object({key:e.string(),value:e.string().array().min(1,"Requires at least 1 value for key.")}).array().optional(),selectedAnnotations:e.object({key:e.string(),value:e.string().array().min(1,"Requires at least 1 value for key.")}).array().optional(),selectedOtherFilters:e.object({key:e.string(),value:e.string().array().min(1,"Requires at least 1 value for key.")}).array().optional()}),o=e.strictObject({filter:r.optional(),keyValueFilter:a.optional(),excludeFilter:r.optional(),excludeKeyValueFilter:a.optional()}),c=t=>!(!i(t.filter,t.keyValueFilter)&&i(t.excludeFilter,t.excludeKeyValueFilter)),f=o.refine(c,"Cannot have an exclude filter without an include filter.");export{m as CHECK_IS_REQUIRED_MSG,p as CacheConfigSchema,y as FIELD_IS_REQUIRED_MSG,r as FiltersSchema,d as FrequencySchema,a as KeyValueFiltersSchema,o as baseFiltersSchema,f as formFiltersSchema,c as refineFilters};
1
+ import F from"lodash";import{z as e}from"zod";import{filterPresent as n}from"../components/Filter/utils.esm.js";import"../components/Filter/FilterComponent.esm.js";import{TimeUnit as h}from"../components/Frequency/types.esm.js";import"../components/Frequency/util.esm.js";import"../components/Frequency/FrequencyComponent.esm.js";import{validateCacheConfig as l}from"./collectors.esm.js";import{validateFrequency as o}from"./frequency.esm.js";const b="At least one check is required",v="This field is required",s=e.nativeEnum(h),S=e.strictObject({enabled:e.boolean(),hasDuration:e.boolean(),unit:s.optional(),value:e.number().min(1,"Value must be greater than 0.").optional()}).refine(t=>l(t)===!0,t=>({message:l(t)})),k=e.strictObject({type:e.enum(["HumanDuration","cron"]),unit:s.optional(),value:e.number().min(1,"Value must be greater than 0.").optional(),cron:e.string().optional()}).refine(t=>o(t)===!0,t=>({message:o(t)})),r=e.strictObject({selectedKinds:e.string().array(),selectedTypes:e.string().array(),selectedLifecycles:e.string().array(),selectedOwners:e.string().array(),selectedSystems:e.string().array(),selectedTags:e.string().array()}),i=e.strictObject({selectedLabels:e.object({key:e.string(),value:e.string().array().min(1,"Requires at least 1 value for key.")}).array().optional(),selectedAnnotations:e.object({key:e.string(),value:e.string().array().min(1,"Requires at least 1 value for key.")}).array().optional(),selectedOtherFilters:e.object({key:e.string(),value:e.string().array().min(1,"Requires at least 1 value for key.")}).array().optional()}),c=e.strictObject({filter:r.optional(),keyValueFilter:i.optional(),excludeFilter:r.optional(),excludeKeyValueFilter:i.optional()}),u=t=>!(!n(t.filter,t.keyValueFilter)&&n(t.excludeFilter,t.excludeKeyValueFilter)),m="Cannot have an include and exclude filter on the same facet (kind, type, lifecycle, etc.).",f=t=>{if(t.filter&&t.excludeFilter){const y=Object.keys(t.filter),d=Object.keys(t.excludeFilter);for(const a of F.intersection(y,d)){const p=t.filter[a],g=t.excludeFilter[a];if(p.length>0&&g.length>0)return!1}}return!0},C=c.refine(u,"Cannot have an exclude filter without an include filter.").refine(f,m);export{b as CHECK_IS_REQUIRED_MSG,m as CONFLICTING_FILTER_ERROR_MESSAGE,S as CacheConfigSchema,v as FIELD_IS_REQUIRED_MSG,r as FiltersSchema,k as FrequencySchema,i as KeyValueFiltersSchema,c as baseFiltersSchema,f as ensureNoConflictingFilters,C as formFiltersSchema,u as refineFilters};
2
2
  //# sourceMappingURL=validation.esm.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spotify/backstage-plugin-soundcheck",
3
3
  "description": "Ensure quality, reliability and alignment of software development with codified checks and guidance.",
4
- "version": "0.16.3",
4
+ "version": "0.18.0",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "homepage": "https://backstage.spotify.com",
7
7
  "main": "./dist/index.esm.js",
@@ -58,16 +58,16 @@
58
58
  "prepare": "yarn generate"
59
59
  },
60
60
  "dependencies": {
61
- "@backstage/catalog-client": "^1.9.1",
62
- "@backstage/catalog-model": "^1.7.3",
61
+ "@backstage/catalog-client": "^1.10.1",
62
+ "@backstage/catalog-model": "^1.7.4",
63
63
  "@backstage/config": "^1.3.2",
64
- "@backstage/core-compat-api": "^0.4.1",
65
- "@backstage/core-components": "^0.17.1",
66
- "@backstage/core-plugin-api": "^1.10.6",
67
- "@backstage/frontend-plugin-api": "^0.10.1",
68
- "@backstage/plugin-catalog-react": "^1.17.0",
69
- "@backstage/plugin-permission-react": "^0.4.33",
70
- "@backstage/plugin-scaffolder-react": "^1.15.0",
64
+ "@backstage/core-compat-api": "^0.4.3",
65
+ "@backstage/core-components": "^0.17.3",
66
+ "@backstage/core-plugin-api": "^1.10.8",
67
+ "@backstage/frontend-plugin-api": "^0.10.3",
68
+ "@backstage/plugin-catalog-react": "^1.19.0",
69
+ "@backstage/plugin-permission-react": "^0.4.35",
70
+ "@backstage/plugin-scaffolder-react": "^1.17.0",
71
71
  "@backstage/types": "^1.2.1",
72
72
  "@date-io/luxon": "^1.0.0",
73
73
  "@hookform/resolvers": "^4.0.0",
@@ -76,25 +76,37 @@
76
76
  "@material-ui/lab": "4.0.0-alpha.61",
77
77
  "@material-ui/pickers": "3.3.11",
78
78
  "@mui/icons-material": "^5.11.16",
79
+ "@mui/material": "^5.12.2",
79
80
  "@mui/styles": "^5.14.7",
80
- "@spotify/backstage-plugin-core": "^0.8.7",
81
- "@spotify/backstage-plugin-soundcheck-common": "^0.16.3",
81
+ "@nivo/circle-packing": "^0.99.0",
82
+ "@nivo/colors": "^0.99.0",
83
+ "@nivo/core": "^0.99.0",
84
+ "@nivo/icicle": "^0.99.0",
85
+ "@nivo/sunburst": "^0.99.0",
86
+ "@nivo/treemap": "^0.99.0",
87
+ "@spotify/backstage-plugin-core": "^0.8.8",
88
+ "@spotify/backstage-plugin-soundcheck-common": "^0.18.0",
82
89
  "@tanstack/react-query": "^4.6.1",
90
+ "@tanstack/react-virtual": "^3.13.9",
83
91
  "@types/react-csv": "^1.1.6",
84
92
  "@uiw/react-md-editor": "3.20.10",
85
93
  "classnames": "^2.3.2",
86
94
  "copy-to-clipboard": "^3.3.3",
87
95
  "cron-validate": "^1.4.5",
88
96
  "cronstrue": "^2.28.0",
97
+ "d3-color": "^3.1.0",
98
+ "d3-hierarchy": "^3.1.2",
89
99
  "d3-interpolate": "^3.0.1",
90
100
  "d3-scale": "^4.0.2",
91
101
  "d3-scale-chromatic": "^3.0.0",
102
+ "d3-shape": "^3.2.0",
92
103
  "framer-motion": "^6.0.0",
93
104
  "git-url-parse": "^16.0.0",
94
105
  "graphql-request": "6.1.0",
95
106
  "immer": "^10.1.1",
96
107
  "js-yaml": "^4.1.0",
97
108
  "lodash": "^4.17.21",
109
+ "lodash.debounce": "^4.0.8",
98
110
  "luxon": "^3.1.1",
99
111
  "prismjs": "^1.27.0",
100
112
  "react-circular-progressbar": "^2.1.0",
@@ -110,6 +122,7 @@
110
122
  "rehype-raw": "^7.0.0",
111
123
  "remark-gfm": "^4.0.0",
112
124
  "use-immer": "^0.11.0",
125
+ "use-resize-observer": "^9.1.0",
113
126
  "uuid": "^11.0.0",
114
127
  "zod": "^3.20.0"
115
128
  },
@@ -119,12 +132,12 @@
119
132
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
120
133
  },
121
134
  "devDependencies": {
122
- "@backstage/cli": "^0.32.0",
123
- "@backstage/core-app-api": "^1.16.1",
124
- "@backstage/dev-utils": "^1.1.9",
135
+ "@backstage/cli": "^0.33.0",
136
+ "@backstage/core-app-api": "^1.17.1",
137
+ "@backstage/dev-utils": "^1.1.11",
125
138
  "@backstage/e2e-test-utils": "^0.1.1",
126
- "@backstage/frontend-test-utils": "^0.3.1",
127
- "@backstage/test-utils": "^1.7.7",
139
+ "@backstage/frontend-test-utils": "^0.3.3",
140
+ "@backstage/test-utils": "^1.7.9",
128
141
  "@graphql-codegen/cli": "^5.0.0",
129
142
  "@graphql-codegen/typescript": "^4.0.0",
130
143
  "@graphql-codegen/typescript-graphql-request": "^6.0.0",
@@ -132,13 +145,16 @@
132
145
  "@playwright/test": "^1.32.3",
133
146
  "@sp4b-dev/test-utils": "^0.0.13",
134
147
  "@spotify/backstage-plugin-core-common": "^0.6.7",
135
- "@spotify/backstage-plugin-soundcheck-node": "^0.9.8",
148
+ "@spotify/backstage-plugin-soundcheck-node": "^0.9.10",
136
149
  "@testing-library/jest-dom": "^6.0.0",
137
150
  "@testing-library/react": "^14.0.0",
138
151
  "@testing-library/user-event": "^14.0.0",
152
+ "@types/d3-color": "^3.1.0",
153
+ "@types/d3-hierarchy": "^3",
139
154
  "@types/d3-interpolate": "^3",
140
155
  "@types/d3-scale": "^4",
141
156
  "@types/d3-scale-chromatic": "^3.0.0",
157
+ "@types/d3-shape": "^3",
142
158
  "@types/git-url-parse": "^9.0.0",
143
159
  "@types/jest": "^29.4.0",
144
160
  "@types/luxon": "^3.0.1",