@backstage-community/plugin-apiiro 0.1.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 (223) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +232 -0
  3. package/config.d.ts +30 -0
  4. package/dist/App.esm.js +12 -0
  5. package/dist/App.esm.js.map +1 -0
  6. package/dist/api/index.esm.js +71 -0
  7. package/dist/api/index.esm.js.map +1 -0
  8. package/dist/assets/BulleyeIcon.esm.js +454 -0
  9. package/dist/assets/BulleyeIcon.esm.js.map +1 -0
  10. package/dist/assets/NoResultIcon.esm.js +146 -0
  11. package/dist/assets/NoResultIcon.esm.js.map +1 -0
  12. package/dist/assets/RiskIcon.esm.js +27 -0
  13. package/dist/assets/RiskIcon.esm.js.map +1 -0
  14. package/dist/assets/SettingIcon.esm.js +49 -0
  15. package/dist/assets/SettingIcon.esm.js.map +1 -0
  16. package/dist/assets/apiiroLogo/apiiroLogo.esm.js +21 -0
  17. package/dist/assets/apiiroLogo/apiiroLogo.esm.js.map +1 -0
  18. package/dist/assets/apiiroLogo/apiiroSidebar.esm.js +23 -0
  19. package/dist/assets/apiiroLogo/apiiroSidebar.esm.js.map +1 -0
  20. package/dist/assets/apiiroLogo/apiiroSmall.esm.js +19 -0
  21. package/dist/assets/apiiroLogo/apiiroSmall.esm.js.map +1 -0
  22. package/dist/assets/languageIcons/C.esm.js +7 -0
  23. package/dist/assets/languageIcons/C.esm.js.map +1 -0
  24. package/dist/assets/languageIcons/Cicd.esm.js +7 -0
  25. package/dist/assets/languageIcons/Cicd.esm.js.map +1 -0
  26. package/dist/assets/languageIcons/Clojure.esm.js +7 -0
  27. package/dist/assets/languageIcons/Clojure.esm.js.map +1 -0
  28. package/dist/assets/languageIcons/Cpp.esm.js +7 -0
  29. package/dist/assets/languageIcons/Cpp.esm.js.map +1 -0
  30. package/dist/assets/languageIcons/Csharp.esm.js +7 -0
  31. package/dist/assets/languageIcons/Csharp.esm.js.map +1 -0
  32. package/dist/assets/languageIcons/Dart.esm.js +7 -0
  33. package/dist/assets/languageIcons/Dart.esm.js.map +1 -0
  34. package/dist/assets/languageIcons/Go.esm.js +7 -0
  35. package/dist/assets/languageIcons/Go.esm.js.map +1 -0
  36. package/dist/assets/languageIcons/Groovy.esm.js +7 -0
  37. package/dist/assets/languageIcons/Groovy.esm.js.map +1 -0
  38. package/dist/assets/languageIcons/HTML.esm.js +7 -0
  39. package/dist/assets/languageIcons/HTML.esm.js.map +1 -0
  40. package/dist/assets/languageIcons/HclLanguage.esm.js +7 -0
  41. package/dist/assets/languageIcons/HclLanguage.esm.js.map +1 -0
  42. package/dist/assets/languageIcons/Java.esm.js +7 -0
  43. package/dist/assets/languageIcons/Java.esm.js.map +1 -0
  44. package/dist/assets/languageIcons/Javascript.esm.js +7 -0
  45. package/dist/assets/languageIcons/Javascript.esm.js.map +1 -0
  46. package/dist/assets/languageIcons/Kotlin.esm.js +7 -0
  47. package/dist/assets/languageIcons/Kotlin.esm.js.map +1 -0
  48. package/dist/assets/languageIcons/ObjectiveC.esm.js +7 -0
  49. package/dist/assets/languageIcons/ObjectiveC.esm.js.map +1 -0
  50. package/dist/assets/languageIcons/PHP.esm.js +7 -0
  51. package/dist/assets/languageIcons/PHP.esm.js.map +1 -0
  52. package/dist/assets/languageIcons/Perl.esm.js +13 -0
  53. package/dist/assets/languageIcons/Perl.esm.js.map +1 -0
  54. package/dist/assets/languageIcons/Python.esm.js +7 -0
  55. package/dist/assets/languageIcons/Python.esm.js.map +1 -0
  56. package/dist/assets/languageIcons/Ruby.esm.js +7 -0
  57. package/dist/assets/languageIcons/Ruby.esm.js.map +1 -0
  58. package/dist/assets/languageIcons/Rust.esm.js +7 -0
  59. package/dist/assets/languageIcons/Rust.esm.js.map +1 -0
  60. package/dist/assets/languageIcons/Scala.esm.js +7 -0
  61. package/dist/assets/languageIcons/Scala.esm.js.map +1 -0
  62. package/dist/assets/languageIcons/Swift.esm.js +7 -0
  63. package/dist/assets/languageIcons/Swift.esm.js.map +1 -0
  64. package/dist/assets/languageIcons/Terraform.esm.js +7 -0
  65. package/dist/assets/languageIcons/Terraform.esm.js.map +1 -0
  66. package/dist/assets/languageIcons/Typescript.esm.js +7 -0
  67. package/dist/assets/languageIcons/Typescript.esm.js.map +1 -0
  68. package/dist/assets/languageIcons/Unknown.esm.js +7 -0
  69. package/dist/assets/languageIcons/Unknown.esm.js.map +1 -0
  70. package/dist/assets/languageIcons/VB.esm.js +10 -0
  71. package/dist/assets/languageIcons/VB.esm.js.map +1 -0
  72. package/dist/assets/languageIcons/YAML.esm.js +7 -0
  73. package/dist/assets/languageIcons/YAML.esm.js.map +1 -0
  74. package/dist/assets/providerIcons/Azure.esm.js +7 -0
  75. package/dist/assets/providerIcons/Azure.esm.js.map +1 -0
  76. package/dist/assets/providerIcons/Bitbucket.esm.js +7 -0
  77. package/dist/assets/providerIcons/Bitbucket.esm.js.map +1 -0
  78. package/dist/assets/providerIcons/Gitlab.esm.js +7 -0
  79. package/dist/assets/providerIcons/Gitlab.esm.js.map +1 -0
  80. package/dist/components/ApiiroSidebar.esm.js +10 -0
  81. package/dist/components/ApiiroSidebar.esm.js.map +1 -0
  82. package/dist/components/ApplicationsList/ApplicationsList.esm.js +196 -0
  83. package/dist/components/ApplicationsList/ApplicationsList.esm.js.map +1 -0
  84. package/dist/components/CalendarDatePicker.esm.js +154 -0
  85. package/dist/components/CalendarDatePicker.esm.js.map +1 -0
  86. package/dist/components/CalendarDatePicker.styles.esm.js +198 -0
  87. package/dist/components/CalendarDatePicker.styles.esm.js.map +1 -0
  88. package/dist/components/Chip.esm.js +60 -0
  89. package/dist/components/Chip.esm.js.map +1 -0
  90. package/dist/components/ChipsList.esm.js +207 -0
  91. package/dist/components/ChipsList.esm.js.map +1 -0
  92. package/dist/components/ComponentDisplay.esm.js +42 -0
  93. package/dist/components/ComponentDisplay.esm.js.map +1 -0
  94. package/dist/components/DataGrid/CustomColumnMenu.esm.js +29 -0
  95. package/dist/components/DataGrid/CustomColumnMenu.esm.js.map +1 -0
  96. package/dist/components/DataGrid/CustomPagination.esm.js +113 -0
  97. package/dist/components/DataGrid/CustomPagination.esm.js.map +1 -0
  98. package/dist/components/DataGrid/CustomSearchToolbar.esm.js +117 -0
  99. package/dist/components/DataGrid/CustomSearchToolbar.esm.js.map +1 -0
  100. package/dist/components/DataGrid/DataGrid.esm.js +336 -0
  101. package/dist/components/DataGrid/DataGrid.esm.js.map +1 -0
  102. package/dist/components/DataGrid/PinColumnMenuItem.esm.js +24 -0
  103. package/dist/components/DataGrid/PinColumnMenuItem.esm.js.map +1 -0
  104. package/dist/components/DueDate.esm.js +34 -0
  105. package/dist/components/DueDate.esm.js.map +1 -0
  106. package/dist/components/Header.esm.js +27 -0
  107. package/dist/components/Header.esm.js.map +1 -0
  108. package/dist/components/MainContributors/MainContributors.esm.js +62 -0
  109. package/dist/components/MainContributors/MainContributors.esm.js.map +1 -0
  110. package/dist/components/MetricsGroup/TabMetricsGroup.esm.js +37 -0
  111. package/dist/components/MetricsGroup/TabMetricsGroup.esm.js.map +1 -0
  112. package/dist/components/MetricsGroup/WidgetMetricsGroup.esm.js +36 -0
  113. package/dist/components/MetricsGroup/WidgetMetricsGroup.esm.js.map +1 -0
  114. package/dist/components/RepositoryDisplay/RepositoryDisplay.esm.js +121 -0
  115. package/dist/components/RepositoryDisplay/RepositoryDisplay.esm.js.map +1 -0
  116. package/dist/components/RiskLevel.esm.js +88 -0
  117. package/dist/components/RiskLevel.esm.js.map +1 -0
  118. package/dist/components/RiskStatus.esm.js +58 -0
  119. package/dist/components/RiskStatus.esm.js.map +1 -0
  120. package/dist/components/SimpleTooltip.esm.js +24 -0
  121. package/dist/components/SimpleTooltip.esm.js.map +1 -0
  122. package/dist/components/SourcesDisplay.esm.js +47 -0
  123. package/dist/components/SourcesDisplay.esm.js.map +1 -0
  124. package/dist/components/TagsList/TagsList.esm.js +38 -0
  125. package/dist/components/TagsList/TagsList.esm.js.map +1 -0
  126. package/dist/components/TeamsDisplay.esm.js +47 -0
  127. package/dist/components/TeamsDisplay.esm.js.map +1 -0
  128. package/dist/components/charts/ColumnChart.esm.js +402 -0
  129. package/dist/components/charts/ColumnChart.esm.js.map +1 -0
  130. package/dist/components/charts/GaugeChart.esm.js +249 -0
  131. package/dist/components/charts/GaugeChart.esm.js.map +1 -0
  132. package/dist/components/charts/LineChart.esm.js +328 -0
  133. package/dist/components/charts/LineChart.esm.js.map +1 -0
  134. package/dist/components/charts/PieChart.esm.js +233 -0
  135. package/dist/components/charts/PieChart.esm.js.map +1 -0
  136. package/dist/components/common/ChartBox.esm.js +88 -0
  137. package/dist/components/common/ChartBox.esm.js.map +1 -0
  138. package/dist/components/common/CustomTooltip.esm.js +255 -0
  139. package/dist/components/common/CustomTooltip.esm.js.map +1 -0
  140. package/dist/components/common/ErrorSnackbar.esm.js +39 -0
  141. package/dist/components/common/ErrorSnackbar.esm.js.map +1 -0
  142. package/dist/components/common/NotFound.esm.js +30 -0
  143. package/dist/components/common/NotFound.esm.js.map +1 -0
  144. package/dist/components/common/SomethingWentWrong.esm.js +35 -0
  145. package/dist/components/common/SomethingWentWrong.esm.js.map +1 -0
  146. package/dist/components/common/languageIcons.esm.js +61 -0
  147. package/dist/components/common/languageIcons.esm.js.map +1 -0
  148. package/dist/components/common/logoSpinner.esm.js +28 -0
  149. package/dist/components/common/logoSpinner.esm.js.map +1 -0
  150. package/dist/components/common/scmProviders.esm.js +41 -0
  151. package/dist/components/common/scmProviders.esm.js.map +1 -0
  152. package/dist/components/filters/DiscoveredOnFilter.esm.js +284 -0
  153. package/dist/components/filters/DiscoveredOnFilter.esm.js.map +1 -0
  154. package/dist/components/filters/FilterDropdown.esm.js +325 -0
  155. package/dist/components/filters/FilterDropdown.esm.js.map +1 -0
  156. package/dist/components/filters/FilterDropdownClear.esm.js +45 -0
  157. package/dist/components/filters/FilterDropdownClear.esm.js.map +1 -0
  158. package/dist/components/filters/FilterDropdownList.esm.js +102 -0
  159. package/dist/components/filters/FilterDropdownList.esm.js.map +1 -0
  160. package/dist/components/filters/FilterDropdownSearch.esm.js +65 -0
  161. package/dist/components/filters/FilterDropdownSearch.esm.js.map +1 -0
  162. package/dist/components/filters/RiskInsightFilter.esm.js +579 -0
  163. package/dist/components/filters/RiskInsightFilter.esm.js.map +1 -0
  164. package/dist/components/tiles/MttrVsSLATile.esm.js +170 -0
  165. package/dist/components/tiles/MttrVsSLATile.esm.js.map +1 -0
  166. package/dist/components/tiles/RiskOverTimeTile.esm.js +311 -0
  167. package/dist/components/tiles/RiskOverTimeTile.esm.js.map +1 -0
  168. package/dist/components/tiles/SLAAdherenceTile.esm.js +115 -0
  169. package/dist/components/tiles/SLAAdherenceTile.esm.js.map +1 -0
  170. package/dist/components/tiles/StatusTile.esm.js +235 -0
  171. package/dist/components/tiles/StatusTile.esm.js.map +1 -0
  172. package/dist/components/tiles/TopLanguagesTile.esm.js +234 -0
  173. package/dist/components/tiles/TopLanguagesTile.esm.js.map +1 -0
  174. package/dist/components/tiles/TopRiskTile.esm.js +208 -0
  175. package/dist/components/tiles/TopRiskTile.esm.js.map +1 -0
  176. package/dist/hooks/useUrlFilters.esm.js +102 -0
  177. package/dist/hooks/useUrlFilters.esm.js.map +1 -0
  178. package/dist/index.d.ts +28 -0
  179. package/dist/index.esm.js +42 -0
  180. package/dist/index.esm.js.map +1 -0
  181. package/dist/pages/Repositories/Repositories.esm.js +102 -0
  182. package/dist/pages/Repositories/Repositories.esm.js.map +1 -0
  183. package/dist/pages/Repositories/tableConfig.esm.js +294 -0
  184. package/dist/pages/Repositories/tableConfig.esm.js.map +1 -0
  185. package/dist/pages/Risks/Risks.esm.js +258 -0
  186. package/dist/pages/Risks/Risks.esm.js.map +1 -0
  187. package/dist/pages/Risks/tableConfig.esm.js +305 -0
  188. package/dist/pages/Risks/tableConfig.esm.js.map +1 -0
  189. package/dist/pages/tab/Tab.esm.js +147 -0
  190. package/dist/pages/tab/Tab.esm.js.map +1 -0
  191. package/dist/pages/tab/TabProvider.esm.js +11 -0
  192. package/dist/pages/tab/TabProvider.esm.js.map +1 -0
  193. package/dist/pages/widget/Widget.esm.js +161 -0
  194. package/dist/pages/widget/Widget.esm.js.map +1 -0
  195. package/dist/pages/widget/WidgetProvider.esm.js +12 -0
  196. package/dist/pages/widget/WidgetProvider.esm.js.map +1 -0
  197. package/dist/plugin.esm.js +30 -0
  198. package/dist/plugin.esm.js.map +1 -0
  199. package/dist/queries/filterOptions.queries.esm.js +46 -0
  200. package/dist/queries/filterOptions.queries.esm.js.map +1 -0
  201. package/dist/queries/mttr-statistics.queries.esm.js +61 -0
  202. package/dist/queries/mttr-statistics.queries.esm.js.map +1 -0
  203. package/dist/queries/repository.queries.esm.js +60 -0
  204. package/dist/queries/repository.queries.esm.js.map +1 -0
  205. package/dist/queries/risk-score-over-time.queries.esm.js +61 -0
  206. package/dist/queries/risk-score-over-time.queries.esm.js.map +1 -0
  207. package/dist/queries/risks.queries.esm.js +65 -0
  208. package/dist/queries/risks.queries.esm.js.map +1 -0
  209. package/dist/queries/sla-breach.queries.esm.js +57 -0
  210. package/dist/queries/sla-breach.queries.esm.js.map +1 -0
  211. package/dist/queries/top-risks.queries.esm.js +47 -0
  212. package/dist/queries/top-risks.queries.esm.js.map +1 -0
  213. package/dist/routes.esm.js +8 -0
  214. package/dist/routes.esm.js.map +1 -0
  215. package/dist/theme/themeUtils.esm.js +290 -0
  216. package/dist/theme/themeUtils.esm.js.map +1 -0
  217. package/dist/utils/dateFormatter.esm.js +67 -0
  218. package/dist/utils/dateFormatter.esm.js.map +1 -0
  219. package/dist/utils/numberFormatter.esm.js +21 -0
  220. package/dist/utils/numberFormatter.esm.js.map +1 -0
  221. package/dist/utils/utils.esm.js +27 -0
  222. package/dist/utils/utils.esm.js.map +1 -0
  223. package/package.json +90 -0
@@ -0,0 +1,161 @@
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import { useApi, fetchApiRef } from '@backstage/core-plugin-api';
3
+ import { apiiroApiRef } from '../../api/index.esm.js';
4
+ import { useRepositoriesData } from '../../queries/repository.queries.esm.js';
5
+ import '@tanstack/react-query';
6
+ import { useEntity } from '@backstage/plugin-catalog-react';
7
+ import { WidgetMetricsGroup } from '../../components/MetricsGroup/WidgetMetricsGroup.esm.js';
8
+ import '../../components/common/ChartBox.esm.js';
9
+ import 'react';
10
+ import 'react-dom';
11
+ import { styled, useTheme } from '@mui/material/styles';
12
+ import { NotFound } from '../../components/common/NotFound.esm.js';
13
+ import { SomethingWentWrong } from '../../components/common/SomethingWentWrong.esm.js';
14
+ import { LogoSpinner } from '../../components/common/logoSpinner.esm.js';
15
+ import Box from '@mui/material/Box';
16
+ import { ApiiroLogo } from '../../assets/apiiroLogo/apiiroLogo.esm.js';
17
+ import '@mui/material/SvgIcon';
18
+ import { APIIRO_PROJECT_ANNOTATION } from '@backstage-community/plugin-apiiro-common';
19
+ import { getLogoContainerColors } from '../../theme/themeUtils.esm.js';
20
+ import { stringifyEntityRef } from '@backstage/catalog-model';
21
+
22
+ const LogoContainer = styled(Box)(({ theme }) => {
23
+ const logoColors = getLogoContainerColors(theme);
24
+ return {
25
+ display: "flex",
26
+ flexDirection: "row",
27
+ justifyContent: "center",
28
+ alignItems: "center",
29
+ padding: "12px 15px",
30
+ gap: "10px",
31
+ width: "109px",
32
+ height: "40px",
33
+ background: logoColors.background,
34
+ borderRadius: "10px",
35
+ "& svg": {
36
+ width: "79px",
37
+ height: "22px",
38
+ "& path": {
39
+ fill: logoColors.logoFill
40
+ }
41
+ }
42
+ };
43
+ });
44
+ const Widget = () => {
45
+ const theme = useTheme();
46
+ const connectBackendApi = useApi(apiiroApiRef);
47
+ const { fetch } = useApi(fetchApiRef);
48
+ const { entity } = useEntity();
49
+ const repoId = entity?.metadata?.annotations?.[APIIRO_PROJECT_ANNOTATION] || void 0;
50
+ const entityRef = stringifyEntityRef(entity);
51
+ const { repositoriesData, repositoriesDataLoading, repositoriesDataError } = useRepositoriesData({
52
+ fetchApi: fetch,
53
+ connectApi: connectBackendApi,
54
+ enabled: true,
55
+ repositoryKey: repoId,
56
+ entityRef
57
+ });
58
+ if (repositoriesDataLoading) {
59
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
60
+ Box,
61
+ {
62
+ display: "flex",
63
+ justifyContent: "flex-start",
64
+ alignItems: "center",
65
+ flexDirection: "column",
66
+ minHeight: "300px",
67
+ sx: {
68
+ border: `1px solid ${theme.palette.divider}`,
69
+ borderRadius: "12px",
70
+ backgroundColor: theme.palette.background.paper,
71
+ boxShadow: theme.shadows[1]
72
+ },
73
+ children: [
74
+ /* @__PURE__ */ jsx(LogoContainer, { sx: { alignSelf: "flex-end" }, children: /* @__PURE__ */ jsx(ApiiroLogo, {}) }),
75
+ /* @__PURE__ */ jsx(
76
+ Box,
77
+ {
78
+ display: "flex",
79
+ justifyContent: "center",
80
+ alignItems: "center",
81
+ minHeight: "250px",
82
+ children: /* @__PURE__ */ jsx(LogoSpinner, {})
83
+ }
84
+ )
85
+ ]
86
+ }
87
+ ) });
88
+ }
89
+ if (repositoriesDataError) {
90
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
91
+ Box,
92
+ {
93
+ display: "flex",
94
+ justifyContent: "center",
95
+ alignItems: "center",
96
+ flexDirection: "column",
97
+ minHeight: "300px",
98
+ sx: {
99
+ border: `1px solid ${theme.palette.divider}`,
100
+ borderRadius: "12px",
101
+ backgroundColor: theme.palette.background.paper,
102
+ boxShadow: theme.shadows[1]
103
+ },
104
+ children: [
105
+ /* @__PURE__ */ jsx(LogoContainer, { sx: { alignSelf: "flex-end" }, children: /* @__PURE__ */ jsx(ApiiroLogo, {}) }),
106
+ /* @__PURE__ */ jsx(
107
+ SomethingWentWrong,
108
+ {
109
+ statusCode: repositoriesDataError?.details?.status
110
+ }
111
+ )
112
+ ]
113
+ }
114
+ ) });
115
+ }
116
+ const repositories = repositoriesData?.repositories;
117
+ if (!repositories || repositories.length === 0) {
118
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
119
+ Box,
120
+ {
121
+ display: "flex",
122
+ justifyContent: "flex-start",
123
+ alignItems: "center",
124
+ flexDirection: "column",
125
+ minHeight: "300px",
126
+ sx: {
127
+ border: `1px solid ${theme.palette.divider}`,
128
+ borderRadius: "12px",
129
+ backgroundColor: theme.palette.background.paper,
130
+ boxShadow: theme.shadows[1]
131
+ },
132
+ children: [
133
+ /* @__PURE__ */ jsx(LogoContainer, { sx: { alignSelf: "flex-end" }, children: /* @__PURE__ */ jsx(ApiiroLogo, {}) }),
134
+ /* @__PURE__ */ jsx(
135
+ Box,
136
+ {
137
+ display: "flex",
138
+ justifyContent: "center",
139
+ alignItems: "center",
140
+ minHeight: "250px",
141
+ children: /* @__PURE__ */ jsx(NotFound, { message: "Results for this repository are either unavailable on Apiiro or cannot be accessed." })
142
+ }
143
+ )
144
+ ]
145
+ }
146
+ ) });
147
+ }
148
+ const repositoryData = repositories[0];
149
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
150
+ WidgetMetricsGroup,
151
+ {
152
+ repositoryData,
153
+ repoId,
154
+ entityRef,
155
+ entity
156
+ }
157
+ ) });
158
+ };
159
+
160
+ export { Widget };
161
+ //# sourceMappingURL=Widget.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Widget.esm.js","sources":["../../../src/pages/widget/Widget.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi } from '@backstage/core-plugin-api';\nimport { apiiroApiRef } from '../../api';\nimport { fetchApiRef } from '@backstage/core-plugin-api';\nimport { useRepositoriesData } from '../../queries';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { WidgetMetricsGroup } from '../../components/MetricsGroup/WidgetMetricsGroup';\nimport { NotFound, SomethingWentWrong } from '../../components/common';\nimport { LogoSpinner } from '../../components/common/logoSpinner';\nimport Box from '@mui/material/Box';\nimport { styled, useTheme } from '@mui/material/styles';\nimport { ApiiroLogo } from '../../assets/apiiroLogo';\nimport { APIIRO_PROJECT_ANNOTATION } from '@backstage-community/plugin-apiiro-common';\nimport { getLogoContainerColors } from '../../theme/themeUtils';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\nconst LogoContainer = styled(Box)(({ theme }) => {\n const logoColors = getLogoContainerColors(theme);\n return {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '12px 15px',\n gap: '10px',\n width: '109px',\n height: '40px',\n background: logoColors.background,\n borderRadius: '10px',\n '& svg': {\n width: '79px',\n height: '22px',\n '& path': {\n fill: logoColors.logoFill,\n },\n },\n };\n});\n\nexport const Widget = () => {\n const theme = useTheme();\n const connectBackendApi = useApi(apiiroApiRef);\n const { fetch } = useApi(fetchApiRef);\n const { entity } = useEntity();\n const repoId =\n entity?.metadata?.annotations?.[APIIRO_PROJECT_ANNOTATION] || undefined;\n const entityRef = stringifyEntityRef(entity);\n\n const { repositoriesData, repositoriesDataLoading, repositoriesDataError } =\n useRepositoriesData({\n fetchApi: fetch,\n connectApi: connectBackendApi,\n enabled: true,\n repositoryKey: repoId,\n entityRef,\n });\n\n if (repositoriesDataLoading) {\n return (\n <>\n <Box\n display=\"flex\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n flexDirection=\"column\"\n minHeight=\"300px\"\n sx={{\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: '12px',\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.shadows[1],\n }}\n >\n <LogoContainer sx={{ alignSelf: 'flex-end' }}>\n <ApiiroLogo />\n </LogoContainer>\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n minHeight=\"250px\"\n >\n <LogoSpinner />\n </Box>\n </Box>\n </>\n );\n }\n\n if (repositoriesDataError) {\n return (\n <>\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n flexDirection=\"column\"\n minHeight=\"300px\"\n sx={{\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: '12px',\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.shadows[1],\n }}\n >\n <LogoContainer sx={{ alignSelf: 'flex-end' }}>\n <ApiiroLogo />\n </LogoContainer>\n <SomethingWentWrong\n statusCode={repositoriesDataError?.details?.status}\n />\n </Box>\n </>\n );\n }\n\n const repositories = repositoriesData?.repositories;\n\n if (!repositories || repositories.length === 0) {\n return (\n <>\n <Box\n display=\"flex\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n flexDirection=\"column\"\n minHeight=\"300px\"\n sx={{\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: '12px',\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.shadows[1],\n }}\n >\n <LogoContainer sx={{ alignSelf: 'flex-end' }}>\n <ApiiroLogo />\n </LogoContainer>\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n minHeight=\"250px\"\n >\n <NotFound message=\"Results for this repository are either unavailable on Apiiro or cannot be accessed.\" />\n </Box>\n </Box>\n </>\n );\n }\n const repositoryData = repositories[0];\n\n return (\n <>\n <WidgetMetricsGroup\n repositoryData={repositoryData}\n repoId={repoId!}\n entityRef={entityRef}\n entity={entity}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { QueryClientProvider } from '@tanstack/react-query';
3
+ import { queryClient } from '../../api/index.esm.js';
4
+ import { Widget } from './Widget.esm.js';
5
+ import { InfoCard } from '@backstage/core-components';
6
+
7
+ const ApiiroWidget = () => {
8
+ return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(InfoCard, { title: "Apiiro Metrics", children: /* @__PURE__ */ jsx(Widget, {}) }) });
9
+ };
10
+
11
+ export { ApiiroWidget };
12
+ //# sourceMappingURL=WidgetProvider.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WidgetProvider.esm.js","sources":["../../../src/pages/widget/WidgetProvider.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { QueryClientProvider } from '@tanstack/react-query';\nimport { queryClient } from '../../api';\nimport { Widget } from './Widget';\nimport { InfoCard } from '@backstage/core-components';\n\n/** @public */\nexport const ApiiroWidget = () => {\n return (\n <QueryClientProvider client={queryClient}>\n <InfoCard title=\"Apiiro Metrics\">\n <Widget />\n </InfoCard>\n </QueryClientProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;AAqBO,MAAM,eAAe,MAAM;AAChC,EAAA,uBACE,GAAA,CAAC,mBAAA,EAAA,EAAoB,MAAA,EAAQ,WAAA,EAC3B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,gBAAA,EACd,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,EACV,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,30 @@
1
+ import { createPlugin, createApiFactory, configApiRef, discoveryApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
2
+ import { rootRouteRef } from './routes.esm.js';
3
+ import { ApiiroClient, apiiroApiRef } from './api/index.esm.js';
4
+
5
+ const apiiroPlugin = createPlugin({
6
+ id: "apiiro-plugin",
7
+ routes: {
8
+ root: rootRouteRef
9
+ },
10
+ apis: [
11
+ createApiFactory({
12
+ api: apiiroApiRef,
13
+ deps: {
14
+ discoveryApi: discoveryApiRef,
15
+ configApi: configApiRef
16
+ },
17
+ factory: ({ discoveryApi, configApi }) => new ApiiroClient({ discoveryApi, configApi })
18
+ })
19
+ ]
20
+ });
21
+ const ApiiroPage = apiiroPlugin.provide(
22
+ createRoutableExtension({
23
+ name: "ApiiroPage",
24
+ component: () => import('./App.esm.js').then((m) => m.App),
25
+ mountPoint: rootRouteRef
26
+ })
27
+ );
28
+
29
+ export { ApiiroPage, apiiroPlugin };
30
+ //# sourceMappingURL=plugin.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n configApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef } from './routes';\nimport { apiiroApiRef, ApiiroClient } from './api';\n\n/** @public */\nexport const apiiroPlugin = createPlugin({\n id: 'apiiro-plugin',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: apiiroApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, configApi }) =>\n new ApiiroClient({ discoveryApi, configApi }),\n }),\n ],\n});\n\n/** @public */\nexport const ApiiroPage = apiiroPlugin.provide(\n createRoutableExtension({\n name: 'ApiiroPage',\n component: () => import('./App').then(m => m.App),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;AA2BO,MAAM,eAAe,YAAA,CAAa;AAAA,EACvC,EAAA,EAAI,eAAA;AAAA,EACJ,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,YAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,SAAA,EAAW;AAAA,OACb;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,SAAA,EAAU,KAClC,IAAI,YAAA,CAAa,EAAE,YAAA,EAAc,SAAA,EAAW;AAAA,KAC/C;AAAA;AAEL,CAAC;AAGM,MAAM,aAAa,YAAA,CAAa,OAAA;AAAA,EACrC,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,cAAO,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,GAAG,CAAA;AAAA,IAChD,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
@@ -0,0 +1,46 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { get } from '../api/index.esm.js';
3
+
4
+ const getFilterOptionsData = async ({
5
+ fetchApi,
6
+ signal,
7
+ connectApi
8
+ }) => {
9
+ const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
10
+ return await get(
11
+ fetchApi,
12
+ `${url}/filterOptions`,
13
+ {
14
+ signal
15
+ }
16
+ );
17
+ };
18
+ function useFilterOptionsData({
19
+ fetchApi,
20
+ connectApi
21
+ }) {
22
+ const {
23
+ data: filterOptionsData,
24
+ error: filterOptionsDataError,
25
+ isLoading: filterOptionsDataLoading
26
+ } = useQuery({
27
+ queryKey: ["GET_FILTER_OPTIONS" /* GET_FILTER_OPTIONS */],
28
+ queryFn: ({ signal }) => getFilterOptionsData({
29
+ fetchApi,
30
+ signal,
31
+ connectApi
32
+ }),
33
+ staleTime: 5 * 60 * 1e3,
34
+ // 5 minutes - filter options don't change frequently
35
+ gcTime: 10 * 60 * 1e3
36
+ // 10 minutes
37
+ });
38
+ return {
39
+ filterOptionsData,
40
+ filterOptionsDataError,
41
+ filterOptionsDataLoading
42
+ };
43
+ }
44
+
45
+ export { useFilterOptionsData };
46
+ //# sourceMappingURL=filterOptions.queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterOptions.queries.esm.js","sources":["../../src/queries/filterOptions.queries.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useQuery } from '@tanstack/react-query';\nimport { get } from '../api';\nimport { Query } from './queries.type';\n\nexport enum FILTER_OPTIONS_QUERY_KEY {\n GET_FILTER_OPTIONS = 'GET_FILTER_OPTIONS',\n}\n\n// Filter option types\nexport type FilterOption = {\n name: string;\n displayName: string;\n sortOrder: number;\n group: string | null;\n groupOrder: number;\n hierarchy: string | null;\n};\n\nexport type FilterDefinition = {\n name: string;\n displayName: string;\n isGrouped: boolean;\n filterOptions: FilterOption[];\n sortOrder: number;\n filterType: 'dateRange' | 'checkbox';\n isAdditional: boolean;\n defaultValue: string | null;\n defaultValues: string[] | null;\n supportedOperators: string[];\n};\n\nexport type FilterOptionsSuccessResponseData = FilterDefinition[];\n\ninterface FilterOptionsQuery extends Query {}\n\nconst getFilterOptionsData = async ({\n fetchApi,\n signal,\n connectApi,\n}: FilterOptionsQuery): Promise<FilterOptionsSuccessResponseData> => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n return await get<FilterOptionsSuccessResponseData>(\n fetchApi,\n `${url}/filterOptions`,\n {\n signal,\n },\n );\n};\n\nexport function useFilterOptionsData({\n fetchApi,\n connectApi,\n}: Omit<FilterOptionsQuery, 'signal'>) {\n const {\n data: filterOptionsData,\n error: filterOptionsDataError,\n isLoading: filterOptionsDataLoading,\n } = useQuery({\n queryKey: [FILTER_OPTIONS_QUERY_KEY.GET_FILTER_OPTIONS],\n queryFn: ({ signal }) =>\n getFilterOptionsData({\n fetchApi,\n signal,\n connectApi,\n }),\n staleTime: 5 * 60 * 1000, // 5 minutes - filter options don't change frequently\n gcTime: 10 * 60 * 1000, // 10 minutes\n });\n\n return {\n filterOptionsData,\n filterOptionsDataError,\n filterOptionsDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AAkDA,MAAM,uBAAuB,OAAO;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAqE;AACnE,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,OAAO,MAAM,GAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,cAAA,CAAA;AAAA,IACN;AAAA,MACE;AAAA;AACF,GACF;AACF,CAAA;AAEO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,sBAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU,CAAC,oBAAA,0BAA2C;AAAA,IACtD,OAAA,EAAS,CAAC,EAAE,MAAA,OACV,oBAAA,CAAqB;AAAA,MACnB,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,IACpB,MAAA,EAAQ,KAAK,EAAA,GAAK;AAAA;AAAA,GACnB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,61 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { post } from '../api/index.esm.js';
3
+
4
+ const getMttrStatisticsData = async ({
5
+ fetchApi,
6
+ signal,
7
+ connectApi,
8
+ repositoryKey,
9
+ entityRef
10
+ }) => {
11
+ const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
12
+ const body = {};
13
+ if (repositoryKey) {
14
+ body.repositoryKey = repositoryKey;
15
+ }
16
+ if (entityRef) {
17
+ body.entityRef = entityRef;
18
+ }
19
+ return await post(
20
+ fetchApi,
21
+ `${url}/mttr-statistics`,
22
+ {
23
+ signal,
24
+ body
25
+ }
26
+ );
27
+ };
28
+ function useMttrStatisticsData({
29
+ fetchApi,
30
+ connectApi,
31
+ repositoryKey,
32
+ entityRef
33
+ }) {
34
+ const {
35
+ data: mttrStatisticsData,
36
+ error: mttrStatisticsDataError,
37
+ isLoading: mttrStatisticsDataLoading
38
+ } = useQuery({
39
+ queryKey: [
40
+ "GET_MTTR_STATISTICS" /* GET_MTTR_STATISTICS */,
41
+ repositoryKey,
42
+ entityRef
43
+ ],
44
+ queryFn: ({ signal }) => repositoryKey || entityRef ? getMttrStatisticsData({
45
+ fetchApi,
46
+ signal,
47
+ connectApi,
48
+ repositoryKey,
49
+ entityRef
50
+ }) : Promise.resolve([]),
51
+ enabled: !!(repositoryKey || entityRef)
52
+ });
53
+ return {
54
+ mttrStatisticsData,
55
+ mttrStatisticsDataError,
56
+ mttrStatisticsDataLoading
57
+ };
58
+ }
59
+
60
+ export { useMttrStatisticsData };
61
+ //# sourceMappingURL=mttr-statistics.queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mttr-statistics.queries.esm.js","sources":["../../src/queries/mttr-statistics.queries.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { Query, MttrStatisticsSuccessResponseData } from './queries.type';\n\nexport enum MTTR_STATISTICS_QUERY_KEY {\n GET_MTTR_STATISTICS = 'GET_MTTR_STATISTICS',\n}\n\nconst getMttrStatisticsData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n}: Query & {\n repositoryKey?: string;\n entityRef?: string;\n}) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = {};\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n return await post<MttrStatisticsSuccessResponseData>(\n fetchApi,\n `${url}/mttr-statistics`,\n {\n signal,\n body,\n },\n );\n};\n\nexport function useMttrStatisticsData({\n fetchApi,\n connectApi,\n repositoryKey,\n entityRef,\n}: Omit<Query, 'signal'> & {\n repositoryKey?: string;\n entityRef?: string;\n}) {\n const {\n data: mttrStatisticsData,\n error: mttrStatisticsDataError,\n isLoading: mttrStatisticsDataLoading,\n } = useQuery({\n queryKey: [\n MTTR_STATISTICS_QUERY_KEY.GET_MTTR_STATISTICS,\n repositoryKey,\n entityRef,\n ],\n queryFn: ({ signal }) =>\n repositoryKey || entityRef\n ? getMttrStatisticsData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n })\n : Promise.resolve([]),\n enabled: !!(repositoryKey || entityRef),\n });\n\n return {\n mttrStatisticsData,\n mttrStatisticsDataError,\n mttrStatisticsDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,wBAAwB,OAAO;AAAA,EACnC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAY,EAAC;AAEnB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAM,IAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,gBAAA,CAAA;AAAA,IACN;AAAA,MACE,MAAA;AAAA,MACA;AAAA;AACF,GACF;AACF,CAAA;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO,uBAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU;AAAA,MACR,qBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAS,CAAC,EAAE,QAAO,KACjB,aAAA,IAAiB,YACb,qBAAA,CAAsB;AAAA,MACpB,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA,GACD,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,IACxB,OAAA,EAAS,CAAC,EAAE,aAAA,IAAiB,SAAA;AAAA,GAC9B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,kBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,60 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { post } from '../api/index.esm.js';
3
+
4
+ const getRepositoriesData = async ({
5
+ fetchApi,
6
+ signal,
7
+ connectApi,
8
+ repositoryKey,
9
+ entityRef
10
+ }) => {
11
+ const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
12
+ const body = {};
13
+ if (repositoryKey) {
14
+ body.repositoryKey = repositoryKey;
15
+ }
16
+ if (entityRef) {
17
+ body.entityRef = entityRef;
18
+ }
19
+ const requestBody = Object.keys(body).length > 0 ? body : void 0;
20
+ return await post(
21
+ fetchApi,
22
+ `${url}/repositories`,
23
+ {
24
+ signal,
25
+ body: requestBody
26
+ }
27
+ );
28
+ };
29
+ function useRepositoriesData({
30
+ fetchApi,
31
+ connectApi,
32
+ enabled = true,
33
+ repositoryKey,
34
+ entityRef
35
+ }) {
36
+ const {
37
+ data: repositoriesData,
38
+ error: queryError,
39
+ isLoading: repositoriesDataLoading
40
+ } = useQuery({
41
+ queryKey: ["GET_REPOSITORIES" /* GET_REPOSITORIES */, repositoryKey, entityRef],
42
+ queryFn: ({ signal }) => getRepositoriesData({
43
+ fetchApi,
44
+ signal,
45
+ connectApi,
46
+ repositoryKey,
47
+ entityRef
48
+ }),
49
+ enabled
50
+ });
51
+ const repositoriesDataError = queryError ? queryError : null;
52
+ return {
53
+ repositoriesData,
54
+ repositoriesDataError,
55
+ repositoriesDataLoading
56
+ };
57
+ }
58
+
59
+ export { useRepositoriesData };
60
+ //# sourceMappingURL=repository.queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.queries.esm.js","sources":["../../src/queries/repository.queries.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { ApiError, Query, RepositorySuccessResponseData } from './queries.type';\n\ntype UseRepositoriesDataResult = {\n repositoriesData: RepositorySuccessResponseData | undefined;\n repositoriesDataError: ApiError | null;\n repositoriesDataLoading: boolean;\n};\n\nexport enum REPOSITORY_QUERY_KEY {\n GET_REPOSITORIES = 'GET_REPOSITORIES',\n}\n\nconst getRepositoriesData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n}: Query & { repositoryKey?: string; entityRef?: string }) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = {};\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n const requestBody = Object.keys(body).length > 0 ? body : undefined;\n\n return await post<RepositorySuccessResponseData>(\n fetchApi,\n `${url}/repositories`,\n {\n signal,\n body: requestBody,\n },\n );\n};\n\nexport function useRepositoriesData({\n fetchApi,\n connectApi,\n enabled = true,\n repositoryKey,\n entityRef,\n}: Omit<Query, 'signal'> & {\n enabled?: boolean;\n repositoryKey?: string;\n entityRef?: string;\n}): UseRepositoriesDataResult {\n const {\n data: repositoriesData,\n error: queryError,\n isLoading: repositoriesDataLoading,\n } = useQuery({\n queryKey: [REPOSITORY_QUERY_KEY.GET_REPOSITORIES, repositoryKey, entityRef],\n queryFn: ({ signal }) =>\n getRepositoriesData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n }),\n enabled,\n });\n\n // Transform the error to match ApiError\n const repositoriesDataError = queryError ? (queryError as ApiError) : null;\n\n return {\n repositoriesData,\n repositoriesDataError,\n repositoriesDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AA6BA,MAAM,sBAAsB,OAAO;AAAA,EACjC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA8D;AAC5D,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAY,EAAC;AAEnB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,MAAM,cAAc,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,IAAA,GAAO,MAAA;AAE1D,EAAA,OAAO,MAAM,IAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,aAAA,CAAA;AAAA,IACN;AAAA,MACE,MAAA;AAAA,MACA,IAAA,EAAM;AAAA;AACR,GACF;AACF,CAAA;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,aAAA;AAAA,EACA;AACF,CAAA,EAI8B;AAC5B,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU,CAAC,kBAAA,yBAAuC,aAAA,EAAe,SAAS,CAAA;AAAA,IAC1E,OAAA,EAAS,CAAC,EAAE,MAAA,OACV,mBAAA,CAAoB;AAAA,MAClB,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,qBAAA,GAAwB,aAAc,UAAA,GAA0B,IAAA;AAEtE,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,61 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { post } from '../api/index.esm.js';
3
+
4
+ const getRiskScoreOverTimeData = async ({
5
+ fetchApi,
6
+ signal,
7
+ connectApi,
8
+ repositoryKey,
9
+ entityRef
10
+ }) => {
11
+ const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
12
+ const body = {};
13
+ if (repositoryKey) {
14
+ body.repositoryKey = repositoryKey;
15
+ }
16
+ if (entityRef) {
17
+ body.entityRef = entityRef;
18
+ }
19
+ return await post(
20
+ fetchApi,
21
+ `${url}/risk-score-over-time`,
22
+ {
23
+ signal,
24
+ body
25
+ }
26
+ );
27
+ };
28
+ function useRiskScoreOverTimeData({
29
+ fetchApi,
30
+ connectApi,
31
+ repositoryKey,
32
+ entityRef
33
+ }) {
34
+ const {
35
+ data: riskScoreOverTimeData,
36
+ error: riskScoreOverTimeDataError,
37
+ isLoading: riskScoreOverTimeDataLoading
38
+ } = useQuery({
39
+ queryKey: [
40
+ "GET_RISK_SCORE_OVER_TIME" /* GET_RISK_SCORE_OVER_TIME */,
41
+ repositoryKey,
42
+ entityRef
43
+ ],
44
+ queryFn: ({ signal }) => repositoryKey || entityRef ? getRiskScoreOverTimeData({
45
+ fetchApi,
46
+ signal,
47
+ connectApi,
48
+ repositoryKey,
49
+ entityRef
50
+ }) : Promise.resolve([]),
51
+ enabled: !!(repositoryKey || entityRef)
52
+ });
53
+ return {
54
+ riskScoreOverTimeData,
55
+ riskScoreOverTimeDataError,
56
+ riskScoreOverTimeDataLoading
57
+ };
58
+ }
59
+
60
+ export { useRiskScoreOverTimeData };
61
+ //# sourceMappingURL=risk-score-over-time.queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-score-over-time.queries.esm.js","sources":["../../src/queries/risk-score-over-time.queries.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { Query, RiskScoreOverTimeSuccessResponseData } from './queries.type';\n\nexport enum RISK_SCORE_OVER_TIME_QUERY_KEY {\n GET_RISK_SCORE_OVER_TIME = 'GET_RISK_SCORE_OVER_TIME',\n}\n\nconst getRiskScoreOverTimeData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n}: Query & { repositoryKey?: string; entityRef?: string }) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = {};\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n return await post<RiskScoreOverTimeSuccessResponseData>(\n fetchApi,\n `${url}/risk-score-over-time`,\n {\n signal,\n body,\n },\n );\n};\n\nexport function useRiskScoreOverTimeData({\n fetchApi,\n connectApi,\n repositoryKey,\n entityRef,\n}: Omit<Query, 'signal'> & { repositoryKey?: string; entityRef?: string }) {\n const {\n data: riskScoreOverTimeData,\n error: riskScoreOverTimeDataError,\n isLoading: riskScoreOverTimeDataLoading,\n } = useQuery({\n queryKey: [\n RISK_SCORE_OVER_TIME_QUERY_KEY.GET_RISK_SCORE_OVER_TIME,\n repositoryKey,\n entityRef,\n ],\n queryFn: ({ signal }) =>\n repositoryKey || entityRef\n ? getRiskScoreOverTimeData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n })\n : Promise.resolve([]),\n enabled: !!(repositoryKey || entityRef),\n });\n\n return {\n riskScoreOverTimeData,\n riskScoreOverTimeDataError,\n riskScoreOverTimeDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,2BAA2B,OAAO;AAAA,EACtC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA8D;AAC5D,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAY,EAAC;AAEnB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAM,IAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,qBAAA,CAAA;AAAA,IACN;AAAA,MACE,MAAA;AAAA,MACA;AAAA;AACF,GACF;AACF,CAAA;AAEO,SAAS,wBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA2E;AACzE,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,KAAA,EAAO,0BAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU;AAAA,MACR,0BAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAS,CAAC,EAAE,QAAO,KACjB,aAAA,IAAiB,YACb,wBAAA,CAAyB;AAAA,MACvB,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA,GACD,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,IACxB,OAAA,EAAS,CAAC,EAAE,aAAA,IAAiB,SAAA;AAAA,GAC9B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,qBAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,65 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { post } from '../api/index.esm.js';
3
+
4
+ const getRisksData = async ({
5
+ fetchApi,
6
+ signal,
7
+ connectApi,
8
+ repositoryKey,
9
+ entityRef,
10
+ filters
11
+ }) => {
12
+ const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
13
+ const body = { filters };
14
+ if (repositoryKey) {
15
+ body.repositoryKey = repositoryKey;
16
+ }
17
+ if (entityRef) {
18
+ body.entityRef = entityRef;
19
+ }
20
+ return await post(fetchApi, `${url}/risks`, {
21
+ signal,
22
+ body
23
+ });
24
+ };
25
+ function useRisksData({
26
+ fetchApi,
27
+ connectApi,
28
+ repositoryKey,
29
+ entityRef,
30
+ filters
31
+ }) {
32
+ const {
33
+ data: risksData,
34
+ error: risksDataError,
35
+ isLoading: risksDataLoading
36
+ } = useQuery({
37
+ queryKey: ["GET_RISKS" /* GET_RISKS */, repositoryKey, entityRef, filters],
38
+ queryFn: ({ signal }) => getRisksData({
39
+ fetchApi,
40
+ signal,
41
+ connectApi,
42
+ repositoryKey,
43
+ entityRef,
44
+ filters
45
+ }),
46
+ enabled: !!(repositoryKey || entityRef),
47
+ staleTime: 2 * 60 * 1e3,
48
+ // Consider data fresh for 2 minutes
49
+ gcTime: 5 * 60 * 1e3,
50
+ // Keep in cache for 5 minutes
51
+ refetchOnMount: "always",
52
+ // Always refetch but don't block with loading if cache exists
53
+ refetchOnWindowFocus: false
54
+ // Don't refetch on window focus to avoid unnecessary calls
55
+ });
56
+ return {
57
+ risksData,
58
+ risksDataError,
59
+ risksDataLoading
60
+ // Only show loading on initial load, not during background refetch
61
+ };
62
+ }
63
+
64
+ export { useRisksData };
65
+ //# sourceMappingURL=risks.queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risks.queries.esm.js","sources":["../../src/queries/risks.queries.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { Query } from './queries.type';\n\nexport enum RISK_QUERY_KEY {\n GET_RISKS = 'GET_RISKS',\n}\n\ninterface RisksQuery extends Query {\n repositoryKey?: string;\n entityRef?: string;\n filters?: {\n RiskCategory?: string[];\n RiskLevel?: string[];\n FindingCategory?: string[];\n RiskInsight?: string[];\n DiscoveredOn?: {\n start?: string;\n end?: string;\n };\n };\n}\n\nconst getRisksData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n filters,\n}: RisksQuery) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = { filters };\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n return await post<any>(fetchApi, `${url}/risks`, {\n signal,\n body,\n });\n};\n\nexport function useRisksData({\n fetchApi,\n connectApi,\n repositoryKey,\n entityRef,\n filters,\n}: Omit<RisksQuery, 'signal'>) {\n const {\n data: risksData,\n error: risksDataError,\n isLoading: risksDataLoading,\n } = useQuery({\n queryKey: [RISK_QUERY_KEY.GET_RISKS, repositoryKey, entityRef, filters],\n queryFn: ({ signal }) =>\n getRisksData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n filters,\n }),\n enabled: !!(repositoryKey || entityRef),\n staleTime: 2 * 60 * 1000, // Consider data fresh for 2 minutes\n gcTime: 5 * 60 * 1000, // Keep in cache for 5 minutes\n refetchOnMount: 'always', // Always refetch but don't block with loading if cache exists\n refetchOnWindowFocus: false, // Don't refetch on window focus to avoid unnecessary calls\n });\n\n return {\n risksData,\n risksDataError,\n risksDataLoading, // Only show loading on initial load, not during background refetch\n };\n}\n"],"names":[],"mappings":";;;AAsCA,MAAM,eAAe,OAAO;AAAA,EAC1B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAAkB;AAChB,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAY,EAAE,OAAA,EAAQ;AAE5B,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAM,IAAA,CAAU,QAAA,EAAU,CAAA,EAAG,GAAG,CAAA,MAAA,CAAA,EAAU;AAAA,IAC/C,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH,CAAA;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU,CAAC,WAAA,kBAA0B,aAAA,EAAe,WAAW,OAAO,CAAA;AAAA,IACtE,OAAA,EAAS,CAAC,EAAE,MAAA,OACV,YAAA,CAAa;AAAA,MACX,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,OAAA,EAAS,CAAC,EAAE,aAAA,IAAiB,SAAA,CAAA;AAAA,IAC7B,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,IACpB,MAAA,EAAQ,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,IACjB,cAAA,EAAgB,QAAA;AAAA;AAAA,IAChB,oBAAA,EAAsB;AAAA;AAAA,GACvB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1,57 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { post } from '../api/index.esm.js';
3
+
4
+ const getSlaBreachData = async ({
5
+ fetchApi,
6
+ signal,
7
+ connectApi,
8
+ repositoryKey,
9
+ entityRef
10
+ }) => {
11
+ const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
12
+ const body = {};
13
+ if (repositoryKey) {
14
+ body.repositoryKey = repositoryKey;
15
+ }
16
+ if (entityRef) {
17
+ body.entityRef = entityRef;
18
+ }
19
+ return await post(
20
+ fetchApi,
21
+ `${url}/sla-breach`,
22
+ {
23
+ signal,
24
+ body
25
+ }
26
+ );
27
+ };
28
+ function useSlaBreachData({
29
+ fetchApi,
30
+ connectApi,
31
+ repositoryKey,
32
+ entityRef
33
+ }) {
34
+ const {
35
+ data: slaBreachData,
36
+ error: slaBreachDataError,
37
+ isLoading: slaBreachDataLoading
38
+ } = useQuery({
39
+ queryKey: ["GET_SLA_BREACH" /* GET_SLA_BREACH */, repositoryKey, entityRef],
40
+ queryFn: ({ signal }) => repositoryKey || entityRef ? getSlaBreachData({
41
+ fetchApi,
42
+ signal,
43
+ connectApi,
44
+ repositoryKey,
45
+ entityRef
46
+ }) : Promise.resolve([]),
47
+ enabled: !!(repositoryKey || entityRef)
48
+ });
49
+ return {
50
+ slaBreachData,
51
+ slaBreachDataError,
52
+ slaBreachDataLoading
53
+ };
54
+ }
55
+
56
+ export { useSlaBreachData };
57
+ //# sourceMappingURL=sla-breach.queries.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sla-breach.queries.esm.js","sources":["../../src/queries/sla-breach.queries.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { Query, SlaBreachSuccessResponseData } from './queries.type';\n\nexport enum SLA_BREACH_QUERY_KEY {\n GET_SLA_BREACH = 'GET_SLA_BREACH',\n}\n\nconst getSlaBreachData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n}: Query & { repositoryKey?: string; entityRef?: string }) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = {};\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n return await post<SlaBreachSuccessResponseData>(\n fetchApi,\n `${url}/sla-breach`,\n {\n signal,\n body,\n },\n );\n};\n\nexport function useSlaBreachData({\n fetchApi,\n connectApi,\n repositoryKey,\n entityRef,\n}: Omit<Query, 'signal'> & { repositoryKey?: string; entityRef?: string }) {\n const {\n data: slaBreachData,\n error: slaBreachDataError,\n isLoading: slaBreachDataLoading,\n } = useQuery({\n queryKey: [SLA_BREACH_QUERY_KEY.GET_SLA_BREACH, repositoryKey, entityRef],\n queryFn: ({ signal }) =>\n repositoryKey || entityRef\n ? getSlaBreachData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n })\n : Promise.resolve([]),\n enabled: !!(repositoryKey || entityRef),\n });\n\n return {\n slaBreachData,\n slaBreachDataError,\n slaBreachDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,mBAAmB,OAAO;AAAA,EAC9B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA8D;AAC5D,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAY,EAAC;AAEnB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAM,IAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,WAAA,CAAA;AAAA,IACN;AAAA,MACE,MAAA;AAAA,MACA;AAAA;AACF,GACF;AACF,CAAA;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA2E;AACzE,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,kBAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU,CAAC,gBAAA,uBAAqC,aAAA,EAAe,SAAS,CAAA;AAAA,IACxE,SAAS,CAAC,EAAE,QAAO,KACjB,aAAA,IAAiB,YACb,gBAAA,CAAiB;AAAA,MACf,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA,GACD,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,IACxB,OAAA,EAAS,CAAC,EAAE,aAAA,IAAiB,SAAA;AAAA,GAC9B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}