@northern.tech/store 0.36.0 → 0.36.2

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 (281) hide show
  1. package/dist/actions.cjs.map +1 -1
  2. package/dist/actions.d.cts +123 -134
  3. package/dist/actions.d.ts +123 -134
  4. package/dist/actions.js.map +1 -1
  5. package/dist/api/general-api.cjs +1 -1
  6. package/dist/api/general-api.cjs.map +1 -1
  7. package/dist/api/general-api.d.cts +9 -10
  8. package/dist/api/general-api.d.ts +9 -10
  9. package/dist/api/general-api.js.map +1 -1
  10. package/dist/api/users-api.cjs +1 -1
  11. package/dist/api/users-api.cjs.map +1 -1
  12. package/dist/api/users-api.d.cts +1 -2
  13. package/dist/api/users-api.d.ts +1 -2
  14. package/dist/api/users-api.js.map +1 -1
  15. package/dist/appSlice/constants.cjs +0 -1
  16. package/dist/appSlice/constants.cjs.map +1 -1
  17. package/dist/appSlice/constants.d.cts +1 -1
  18. package/dist/appSlice/constants.d.ts +1 -1
  19. package/dist/appSlice/constants.js.map +1 -1
  20. package/dist/appSlice/index.cjs +2 -4
  21. package/dist/appSlice/index.cjs.map +1 -1
  22. package/dist/appSlice/index.d.cts +2 -2
  23. package/dist/appSlice/index.d.ts +2 -2
  24. package/dist/appSlice/index.js +2 -3
  25. package/dist/appSlice/index.js.map +1 -1
  26. package/dist/appSlice/mocks.cjs.map +1 -1
  27. package/dist/appSlice/mocks.d.cts +1 -1
  28. package/dist/appSlice/mocks.d.ts +1 -1
  29. package/dist/appSlice/mocks.js.map +1 -1
  30. package/dist/appSlice/selectors.cjs +2 -6
  31. package/dist/appSlice/selectors.cjs.map +1 -1
  32. package/dist/appSlice/selectors.d.cts +35 -128
  33. package/dist/appSlice/selectors.d.ts +35 -128
  34. package/dist/appSlice/selectors.js +2 -5
  35. package/dist/appSlice/selectors.js.map +1 -1
  36. package/dist/appSlice/thunks.cjs +0 -1
  37. package/dist/appSlice/thunks.d.cts +6 -31
  38. package/dist/appSlice/thunks.d.ts +6 -31
  39. package/dist/appSlice/thunks.js +2 -2
  40. package/dist/auth.cjs +1 -1
  41. package/dist/auth.cjs.map +1 -1
  42. package/dist/auth.d.cts +1 -1
  43. package/dist/auth.d.ts +1 -1
  44. package/dist/auth.js.map +1 -1
  45. package/dist/commonConstants.d.cts +1 -1
  46. package/dist/commonConstants.d.ts +1 -1
  47. package/dist/commonSelectors.cjs +1 -1
  48. package/dist/commonSelectors.cjs.map +1 -1
  49. package/dist/commonSelectors.d.cts +164 -166
  50. package/dist/commonSelectors.d.ts +164 -166
  51. package/dist/commonSelectors.js.map +1 -1
  52. package/dist/{constants-CIx3fnBv.d.cts → constants-6kYRTdox.d.cts} +1 -1
  53. package/dist/{constants-BciiayPt.d.ts → constants-6kYRTdox.d.ts} +1 -1
  54. package/dist/{constants-BIIEMVoG.d.ts → constants-B_7FCJQX.d.cts} +3 -6
  55. package/dist/{constants-BFTS6mge.d.cts → constants-B_7FCJQX.d.ts} +3 -6
  56. package/dist/{constants-D41U_jbR.d.cts → constants-BwKiHHaB.d.cts} +1 -1
  57. package/dist/{constants-5cdwz1iH.d.ts → constants-BwKiHHaB.d.ts} +1 -1
  58. package/dist/{constants-DK7fI3Rh.d.cts → constants-Db_RBdlV.d.cts} +1 -1
  59. package/dist/{constants-BWEsNG5c.d.ts → constants-Db_RBdlV.d.ts} +1 -1
  60. package/dist/{constants-CNhpIMME.d.cts → constants-OZiiFKiA.d.cts} +1 -1
  61. package/dist/{constants-y2XVLQWf.d.ts → constants-OZiiFKiA.d.ts} +1 -1
  62. package/dist/{constants-CjO3_FOH.d.ts → constants-OcdoVk6f.d.ts} +3 -4
  63. package/dist/{constants-G3wymKIl.d.cts → constants-Sn4gnNA3.d.cts} +1 -1
  64. package/dist/{constants-Cpgyuy_r.d.ts → constants-Sn4gnNA3.d.ts} +1 -1
  65. package/dist/{constants-BrGIx40B.d.cts → constants-_p6w8uEp.d.cts} +3 -4
  66. package/dist/constants.cjs +0 -1
  67. package/dist/constants.cjs.map +1 -1
  68. package/dist/constants.d.cts +8 -8
  69. package/dist/constants.d.ts +8 -8
  70. package/dist/constants.js.map +1 -1
  71. package/dist/deploymentsSlice/constants.d.cts +1 -1
  72. package/dist/deploymentsSlice/constants.d.ts +1 -1
  73. package/dist/deploymentsSlice/index.cjs +0 -1
  74. package/dist/deploymentsSlice/index.cjs.map +1 -1
  75. package/dist/deploymentsSlice/index.d.cts +1 -1
  76. package/dist/deploymentsSlice/index.d.ts +1 -1
  77. package/dist/deploymentsSlice/index.js.map +1 -1
  78. package/dist/deploymentsSlice/mocks.cjs.map +1 -1
  79. package/dist/deploymentsSlice/mocks.d.cts +1 -1
  80. package/dist/deploymentsSlice/mocks.d.ts +1 -1
  81. package/dist/deploymentsSlice/mocks.js.map +1 -1
  82. package/dist/deploymentsSlice/selectors.cjs +0 -1
  83. package/dist/deploymentsSlice/selectors.cjs.map +1 -1
  84. package/dist/deploymentsSlice/selectors.d.cts +15 -16
  85. package/dist/deploymentsSlice/selectors.d.ts +15 -16
  86. package/dist/deploymentsSlice/selectors.js.map +1 -1
  87. package/dist/deploymentsSlice/thunks.d.cts +21 -22
  88. package/dist/deploymentsSlice/thunks.d.ts +21 -22
  89. package/dist/devicesSlice/constants.d.cts +1 -1
  90. package/dist/devicesSlice/constants.d.ts +1 -1
  91. package/dist/devicesSlice/index.cjs +0 -1
  92. package/dist/devicesSlice/index.cjs.map +1 -1
  93. package/dist/devicesSlice/index.d.cts +1 -1
  94. package/dist/devicesSlice/index.d.ts +1 -1
  95. package/dist/devicesSlice/index.js.map +1 -1
  96. package/dist/devicesSlice/mocks.cjs +0 -1
  97. package/dist/devicesSlice/mocks.cjs.map +1 -1
  98. package/dist/devicesSlice/mocks.js.map +1 -1
  99. package/dist/devicesSlice/selectors.cjs +0 -1
  100. package/dist/devicesSlice/selectors.cjs.map +1 -1
  101. package/dist/devicesSlice/selectors.d.cts +79 -81
  102. package/dist/devicesSlice/selectors.d.ts +79 -81
  103. package/dist/devicesSlice/selectors.js.map +1 -1
  104. package/dist/devicesSlice/thunks.d.cts +67 -69
  105. package/dist/devicesSlice/thunks.d.ts +67 -69
  106. package/dist/{index-DUvrw_Ed.d.ts → index-5Q-iI4EB.d.cts} +17 -20
  107. package/dist/index-BBsUj1a8.d.ts +68 -0
  108. package/dist/index-BLvjQfGj.d.ts +119 -0
  109. package/dist/{index-BP0uAq36.d.cts → index-Bb4yvvgG.d.ts} +25 -28
  110. package/dist/index-Bj3OArhr.d.cts +68 -0
  111. package/dist/{index-CT5hgXm9.d.cts → index-ByfjrTdH.d.ts} +16 -19
  112. package/dist/index-C8QadAm7.d.cts +119 -0
  113. package/dist/{index-BI9O8JWe.d.ts → index-CPdMUfRr.d.ts} +41 -44
  114. package/dist/index-CSk4ENmk.d.cts +149 -0
  115. package/dist/index-Cf81vLTi.d.ts +149 -0
  116. package/dist/index-DBUt8xVc.d.cts +61 -0
  117. package/dist/index-DBUt8xVc.d.ts +61 -0
  118. package/dist/index-DLDY7bNT.d.ts +165 -0
  119. package/dist/{index-B64X5ozM.d.cts → index-DbfM03Gj.d.cts} +42 -45
  120. package/dist/{index-CkwVnIqd.d.ts → index-EPmsL6Lb.d.cts} +26 -29
  121. package/dist/index-Zs9RnVoR.d.cts +165 -0
  122. package/dist/liststatehook.cjs +5 -6
  123. package/dist/liststatehook.cjs.map +1 -1
  124. package/dist/liststatehook.d.cts +1 -1
  125. package/dist/liststatehook.d.ts +1 -1
  126. package/dist/liststatehook.js +1 -1
  127. package/dist/liststatehook.js.map +1 -1
  128. package/dist/locationutils.cjs +0 -1
  129. package/dist/locationutils.cjs.map +1 -1
  130. package/dist/locationutils.d.cts +3 -3
  131. package/dist/locationutils.d.ts +3 -3
  132. package/dist/locationutils.js.map +1 -1
  133. package/dist/monitorSlice/constants.d.cts +1 -1
  134. package/dist/monitorSlice/constants.d.ts +1 -1
  135. package/dist/monitorSlice/index.cjs +0 -1
  136. package/dist/monitorSlice/index.cjs.map +1 -1
  137. package/dist/monitorSlice/index.d.cts +1 -1
  138. package/dist/monitorSlice/index.d.ts +1 -1
  139. package/dist/monitorSlice/index.js.map +1 -1
  140. package/dist/monitorSlice/mocks.cjs +0 -1
  141. package/dist/monitorSlice/mocks.cjs.map +1 -1
  142. package/dist/monitorSlice/mocks.d.cts +1 -1
  143. package/dist/monitorSlice/mocks.d.ts +1 -1
  144. package/dist/monitorSlice/mocks.js.map +1 -1
  145. package/dist/monitorSlice/selectors.d.cts +1 -1
  146. package/dist/monitorSlice/selectors.d.ts +1 -1
  147. package/dist/monitorSlice/thunks.cjs +1 -3
  148. package/dist/monitorSlice/thunks.cjs.map +1 -1
  149. package/dist/monitorSlice/thunks.d.cts +11 -13
  150. package/dist/monitorSlice/thunks.d.ts +11 -13
  151. package/dist/monitorSlice/thunks.js +1 -2
  152. package/dist/monitorSlice/thunks.js.map +1 -1
  153. package/dist/onboardingSlice/constants.cjs.map +1 -1
  154. package/dist/onboardingSlice/constants.d.cts +1 -1
  155. package/dist/onboardingSlice/constants.d.ts +1 -1
  156. package/dist/onboardingSlice/constants.js.map +1 -1
  157. package/dist/onboardingSlice/index.cjs +0 -1
  158. package/dist/onboardingSlice/index.cjs.map +1 -1
  159. package/dist/onboardingSlice/index.d.cts +1 -1
  160. package/dist/onboardingSlice/index.d.ts +1 -1
  161. package/dist/onboardingSlice/index.js.map +1 -1
  162. package/dist/onboardingSlice/mocks.cjs.map +1 -1
  163. package/dist/onboardingSlice/mocks.d.cts +1 -1
  164. package/dist/onboardingSlice/mocks.d.ts +1 -1
  165. package/dist/onboardingSlice/mocks.js.map +1 -1
  166. package/dist/onboardingSlice/selectors.d.cts +2 -2
  167. package/dist/onboardingSlice/selectors.d.ts +2 -2
  168. package/dist/onboardingSlice/thunks.d.cts +22 -23
  169. package/dist/onboardingSlice/thunks.d.ts +22 -23
  170. package/dist/organizationSlice/constants.d.cts +1 -1
  171. package/dist/organizationSlice/constants.d.ts +1 -1
  172. package/dist/organizationSlice/index.cjs +0 -1
  173. package/dist/organizationSlice/index.cjs.map +1 -1
  174. package/dist/organizationSlice/index.d.cts +1 -1
  175. package/dist/organizationSlice/index.d.ts +1 -1
  176. package/dist/organizationSlice/index.js.map +1 -1
  177. package/dist/organizationSlice/mocks.cjs +0 -1
  178. package/dist/organizationSlice/mocks.cjs.map +1 -1
  179. package/dist/organizationSlice/mocks.d.cts +3 -4
  180. package/dist/organizationSlice/mocks.d.ts +3 -4
  181. package/dist/organizationSlice/mocks.js.map +1 -1
  182. package/dist/organizationSlice/selectors.cjs +0 -1
  183. package/dist/organizationSlice/selectors.cjs.map +1 -1
  184. package/dist/organizationSlice/selectors.d.cts +78 -81
  185. package/dist/organizationSlice/selectors.d.ts +78 -81
  186. package/dist/organizationSlice/selectors.js.map +1 -1
  187. package/dist/organizationSlice/thunks.d.cts +69 -72
  188. package/dist/organizationSlice/thunks.d.ts +69 -72
  189. package/dist/organizationSlice/types.d.cts +1 -1
  190. package/dist/organizationSlice/types.d.ts +1 -1
  191. package/dist/releasesSlice/constants.cjs.map +1 -1
  192. package/dist/releasesSlice/constants.d.cts +1 -1
  193. package/dist/releasesSlice/constants.d.ts +1 -1
  194. package/dist/releasesSlice/constants.js.map +1 -1
  195. package/dist/releasesSlice/index.cjs +0 -1
  196. package/dist/releasesSlice/index.cjs.map +1 -1
  197. package/dist/releasesSlice/index.d.cts +1 -1
  198. package/dist/releasesSlice/index.d.ts +1 -1
  199. package/dist/releasesSlice/index.js.map +1 -1
  200. package/dist/releasesSlice/mocks.cjs +0 -1
  201. package/dist/releasesSlice/mocks.cjs.map +1 -1
  202. package/dist/releasesSlice/mocks.d.cts +3 -6
  203. package/dist/releasesSlice/mocks.d.ts +3 -6
  204. package/dist/releasesSlice/mocks.js.map +1 -1
  205. package/dist/releasesSlice/selectors.cjs +0 -1
  206. package/dist/releasesSlice/selectors.cjs.map +1 -1
  207. package/dist/releasesSlice/selectors.d.cts +107 -110
  208. package/dist/releasesSlice/selectors.d.ts +107 -110
  209. package/dist/releasesSlice/selectors.js.map +1 -1
  210. package/dist/releasesSlice/thunks.cjs +4 -5
  211. package/dist/releasesSlice/thunks.cjs.map +1 -1
  212. package/dist/releasesSlice/thunks.d.cts +52 -55
  213. package/dist/releasesSlice/thunks.d.ts +52 -55
  214. package/dist/releasesSlice/thunks.js +3 -4
  215. package/dist/releasesSlice/thunks.js.map +1 -1
  216. package/dist/sockethook.cjs +1 -1
  217. package/dist/sockethook.cjs.map +1 -1
  218. package/dist/sockethook.js.map +1 -1
  219. package/dist/{store-BZo47jc-.d.ts → store-Co2ptTSm.d.ts} +30 -35
  220. package/dist/{store-BhRxVhtL.d.cts → store-Dd0Y2JCN.d.cts} +30 -35
  221. package/dist/store.cjs +0 -1
  222. package/dist/store.cjs.map +1 -1
  223. package/dist/store.d.cts +3 -3
  224. package/dist/store.d.ts +3 -3
  225. package/dist/store.js.map +1 -1
  226. package/dist/storehooks.cjs +6 -14
  227. package/dist/storehooks.cjs.map +1 -1
  228. package/dist/storehooks.d.cts +6 -43
  229. package/dist/storehooks.d.ts +6 -43
  230. package/dist/storehooks.js +7 -15
  231. package/dist/storehooks.js.map +1 -1
  232. package/dist/thunks.cjs +4 -44
  233. package/dist/thunks.cjs.map +1 -1
  234. package/dist/thunks.d.cts +2 -2
  235. package/dist/thunks.d.ts +2 -2
  236. package/dist/thunks.js +5 -44
  237. package/dist/thunks.js.map +1 -1
  238. package/dist/{types-COdPU2QQ.d.cts → types-B33vKVhi.d.cts} +4 -4
  239. package/dist/{types-BPyM8Inu.d.ts → types-BjtmX60L.d.ts} +4 -4
  240. package/dist/useDeploymentDevice.cjs +1 -1
  241. package/dist/useDeploymentDevice.cjs.map +1 -1
  242. package/dist/useDeploymentDevice.js.map +1 -1
  243. package/dist/usersSlice/constants.d.cts +1 -1
  244. package/dist/usersSlice/constants.d.ts +1 -1
  245. package/dist/usersSlice/index.cjs +0 -1
  246. package/dist/usersSlice/index.cjs.map +1 -1
  247. package/dist/usersSlice/index.d.cts +1 -1
  248. package/dist/usersSlice/index.d.ts +1 -1
  249. package/dist/usersSlice/index.js.map +1 -1
  250. package/dist/usersSlice/mocks.cjs +0 -1
  251. package/dist/usersSlice/mocks.cjs.map +1 -1
  252. package/dist/usersSlice/mocks.d.cts +4 -6
  253. package/dist/usersSlice/mocks.d.ts +4 -6
  254. package/dist/usersSlice/mocks.js.map +1 -1
  255. package/dist/usersSlice/selectors.cjs +0 -1
  256. package/dist/usersSlice/selectors.cjs.map +1 -1
  257. package/dist/usersSlice/selectors.d.cts +44 -47
  258. package/dist/usersSlice/selectors.d.ts +44 -47
  259. package/dist/usersSlice/selectors.js.map +1 -1
  260. package/dist/usersSlice/thunks.d.cts +92 -95
  261. package/dist/usersSlice/thunks.d.ts +92 -95
  262. package/dist/{utils-CHBWS_tH.d.ts → utils-C_9XEfi_.d.ts} +8 -9
  263. package/dist/{utils-Do9z5TL1.d.cts → utils-DbXmZmGq.d.cts} +8 -9
  264. package/dist/utils.cjs +0 -3
  265. package/dist/utils.cjs.map +1 -1
  266. package/dist/utils.d.cts +2 -2
  267. package/dist/utils.d.ts +2 -2
  268. package/dist/utils.js +1 -2
  269. package/dist/utils.js.map +1 -1
  270. package/package.json +7 -7
  271. package/dist/index-B3IF6ur9.d.cts +0 -168
  272. package/dist/index-BFlHWzjv.d.cts +0 -152
  273. package/dist/index-BbaS7MzW.d.cts +0 -71
  274. package/dist/index-Bp1WpATs.d.ts +0 -154
  275. package/dist/index-C6wNUfiV.d.ts +0 -71
  276. package/dist/index-CJkrL0oA.d.ts +0 -64
  277. package/dist/index-DaD3yorF.d.ts +0 -168
  278. package/dist/index-DwACbyUg.d.cts +0 -154
  279. package/dist/index-UPc3wvVd.d.cts +0 -64
  280. package/dist/index-ez3oxfRo.d.ts +0 -152
  281. /package/dist/{chunk-CKQMccvm.cjs → chunk-D6vf50IK.cjs} +0 -0
@@ -1,9 +1,9 @@
1
- import { H as emptyUiPermissions, S as Role, m as DeviceIssueOptionKey, xt as FilterOperator } from "./constants-CjO3_FOH.js";
2
- import { a as PricePreview } from "./types-BPyM8Inu.js";
3
- import { t as Deployment } from "./index-CkwVnIqd.js";
4
- import { c as InventoryAttributes, n as DeviceFilter, r as DeviceGroup } from "./index-BI9O8JWe.js";
1
+ import { H as emptyUiPermissions, S as Role, m as DeviceIssueOptionKey, xt as FilterOperator } from "./constants-OcdoVk6f.js";
2
+ import { a as PricePreview } from "./types-BjtmX60L.js";
3
+ import { t as Deployment } from "./index-Bb4yvvgG.js";
4
+ import { c as InventoryAttributes, n as DeviceFilter, r as DeviceGroup } from "./index-CPdMUfRr.js";
5
5
  import { AxiosError } from "axios";
6
- import { AttributeFilterPredicate, AttributeV2, FilterV2, InvoiceLineItem, Scope } from "@northern.tech/types/MenderTypes";
6
+ import { Attribute, AttributeFilterPredicate, FilterV2, InvoiceLineItem, Scope } from "@northern.tech/types/MenderTypes";
7
7
 
8
8
  //#region src/utils.d.ts
9
9
  type FilterProcessorValue = string | string[] | number | boolean;
@@ -63,7 +63,6 @@ type ErrorWithResponse = AxiosError<{
63
63
  };
64
64
  declare const extractErrorMessage: (err: ErrorWithResponse, fallback?: string) => string;
65
65
  declare const ensureVersionString: (software: string, fallback: string) => string;
66
- declare const getComparisonCompatibleVersion: (version: string) => string;
67
66
  declare const stringToBoolean: (content: string | number | undefined) => boolean;
68
67
  type DeploymentStats = {
69
68
  failures: number;
@@ -90,7 +89,7 @@ type DeviceAttributeMap = {
90
89
  system: Record<string, string>;
91
90
  tags: Record<string, string>;
92
91
  };
93
- declare const mapDeviceAttributes: (attributes?: AttributeV2[]) => DeviceAttributeMap;
92
+ declare const mapDeviceAttributes: (attributes?: Attribute[]) => DeviceAttributeMap;
94
93
  declare const isDarkMode: (mode: string) => boolean;
95
94
  type Line = InvoiceLineItem & {
96
95
  product: 'mender_standard' | 'mender_micro';
@@ -101,5 +100,5 @@ declare const convertToBackendSPLimits: (limits: Record<string, number | string>
101
100
  value: number;
102
101
  }>;
103
102
  //#endregion
104
- export { statCollector as C, progress as S, stripUndefined as T, mapFiltersToTerms as _, convertToBackendSPLimits as a, mergePermissions as b, filtersFilter as c, getDeploymentState as d, groupDeploymentDevicesStats as f, mapDeviceAttributes as g, listItemMapper as h, convertDeviceListStateToFilters as i, generateDeploymentGroupDetails as l, isDarkMode as m, ErrorWithResponse as n, ensureVersionString as o, groupDeploymentStats as p, FilterTerm as r, extractErrorMessage as s, DeploymentStats as t, getComparisonCompatibleVersion as u, mapTermsToFilters as v, stringToBoolean as w, parseSubscriptionPreview as x, mapUserRolesToUiPermissions as y };
105
- //# sourceMappingURL=utils-CHBWS_tH.d.ts.map
103
+ export { stringToBoolean as C, statCollector as S, mapTermsToFilters as _, convertToBackendSPLimits as a, parseSubscriptionPreview as b, filtersFilter as c, groupDeploymentDevicesStats as d, groupDeploymentStats as f, mapFiltersToTerms as g, mapDeviceAttributes as h, convertDeviceListStateToFilters as i, generateDeploymentGroupDetails as l, listItemMapper as m, ErrorWithResponse as n, ensureVersionString as o, isDarkMode as p, FilterTerm as r, extractErrorMessage as s, DeploymentStats as t, getDeploymentState as u, mapUserRolesToUiPermissions as v, stripUndefined as w, progress as x, mergePermissions as y };
104
+ //# sourceMappingURL=utils-C_9XEfi_.d.ts.map
@@ -1,8 +1,8 @@
1
- import { H as emptyUiPermissions, S as Role, m as DeviceIssueOptionKey, xt as FilterOperator } from "./constants-BrGIx40B.cjs";
2
- import { a as PricePreview } from "./types-COdPU2QQ.cjs";
3
- import { t as Deployment } from "./index-BP0uAq36.cjs";
4
- import { c as InventoryAttributes, n as DeviceFilter, r as DeviceGroup } from "./index-B64X5ozM.cjs";
5
- import { AttributeFilterPredicate, AttributeV2, FilterV2, InvoiceLineItem, Scope } from "@northern.tech/types/MenderTypes";
1
+ import { H as emptyUiPermissions, S as Role, m as DeviceIssueOptionKey, xt as FilterOperator } from "./constants-_p6w8uEp.cjs";
2
+ import { a as PricePreview } from "./types-B33vKVhi.cjs";
3
+ import { t as Deployment } from "./index-EPmsL6Lb.cjs";
4
+ import { c as InventoryAttributes, n as DeviceFilter, r as DeviceGroup } from "./index-DbfM03Gj.cjs";
5
+ import { Attribute, AttributeFilterPredicate, FilterV2, InvoiceLineItem, Scope } from "@northern.tech/types/MenderTypes";
6
6
  import { AxiosError } from "axios";
7
7
 
8
8
  //#region src/utils.d.ts
@@ -63,7 +63,6 @@ type ErrorWithResponse = AxiosError<{
63
63
  };
64
64
  declare const extractErrorMessage: (err: ErrorWithResponse, fallback?: string) => string;
65
65
  declare const ensureVersionString: (software: string, fallback: string) => string;
66
- declare const getComparisonCompatibleVersion: (version: string) => string;
67
66
  declare const stringToBoolean: (content: string | number | undefined) => boolean;
68
67
  type DeploymentStats = {
69
68
  failures: number;
@@ -90,7 +89,7 @@ type DeviceAttributeMap = {
90
89
  system: Record<string, string>;
91
90
  tags: Record<string, string>;
92
91
  };
93
- declare const mapDeviceAttributes: (attributes?: AttributeV2[]) => DeviceAttributeMap;
92
+ declare const mapDeviceAttributes: (attributes?: Attribute[]) => DeviceAttributeMap;
94
93
  declare const isDarkMode: (mode: string) => boolean;
95
94
  type Line = InvoiceLineItem & {
96
95
  product: 'mender_standard' | 'mender_micro';
@@ -101,5 +100,5 @@ declare const convertToBackendSPLimits: (limits: Record<string, number | string>
101
100
  value: number;
102
101
  }>;
103
102
  //#endregion
104
- export { statCollector as C, progress as S, stripUndefined as T, mapFiltersToTerms as _, convertToBackendSPLimits as a, mergePermissions as b, filtersFilter as c, getDeploymentState as d, groupDeploymentDevicesStats as f, mapDeviceAttributes as g, listItemMapper as h, convertDeviceListStateToFilters as i, generateDeploymentGroupDetails as l, isDarkMode as m, ErrorWithResponse as n, ensureVersionString as o, groupDeploymentStats as p, FilterTerm as r, extractErrorMessage as s, DeploymentStats as t, getComparisonCompatibleVersion as u, mapTermsToFilters as v, stringToBoolean as w, parseSubscriptionPreview as x, mapUserRolesToUiPermissions as y };
105
- //# sourceMappingURL=utils-Do9z5TL1.d.cts.map
103
+ export { stringToBoolean as C, statCollector as S, mapTermsToFilters as _, convertToBackendSPLimits as a, parseSubscriptionPreview as b, filtersFilter as c, groupDeploymentDevicesStats as d, groupDeploymentStats as f, mapFiltersToTerms as g, mapDeviceAttributes as h, convertDeviceListStateToFilters as i, generateDeploymentGroupDetails as l, listItemMapper as m, ErrorWithResponse as n, ensureVersionString as o, isDarkMode as p, FilterTerm as r, extractErrorMessage as s, DeploymentStats as t, getDeploymentState as u, mapUserRolesToUiPermissions as v, stripUndefined as w, progress as x, mergePermissions as y };
104
+ //# sourceMappingURL=utils-DbXmZmGq.d.cts.map
package/dist/utils.cjs CHANGED
@@ -1,5 +1,4 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- require("./chunk-CKQMccvm.cjs");
3
2
  const require_appSlice_constants = require("./appSlice/constants.cjs");
4
3
  const require_releasesSlice_constants = require("./releasesSlice/constants.cjs");
5
4
  const require_constants = require("./constants.cjs");
@@ -105,7 +104,6 @@ const progress = ({ loaded, total }) => {
105
104
  };
106
105
  const extractErrorMessage = (err, fallback = "") => (typeof err.response?.data?.error === "object" ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;
107
106
  const ensureVersionString = (software, fallback) => software.length && software !== "artifact_name" ? software.endsWith(".version") ? software : `${software}${require_releasesSlice_constants.softwareIndicator}` : fallback;
108
- const getComparisonCompatibleVersion = (version) => isNaN(parseInt(version.charAt(0))) && version !== "next" ? "master" : version;
109
107
  const stringToBoolean = (content) => {
110
108
  if (!content) return false;
111
109
  const string = content + "";
@@ -217,7 +215,6 @@ exports.ensureVersionString = ensureVersionString;
217
215
  exports.extractErrorMessage = extractErrorMessage;
218
216
  exports.filtersFilter = filtersFilter;
219
217
  exports.generateDeploymentGroupDetails = generateDeploymentGroupDetails;
220
- exports.getComparisonCompatibleVersion = getComparisonCompatibleVersion;
221
218
  exports.getDeploymentState = getDeploymentState;
222
219
  exports.groupDeploymentDevicesStats = groupDeploymentDevicesStats;
223
220
  exports.groupDeploymentStats = groupDeploymentStats;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["DEVICE_FILTERING_OPTIONS","yes","DEVICE_ISSUE_OPTIONS","ATTRIBUTE_SCOPES","emptyFilter","emptyUiPermissions","duplicateFilter","softwareIndicator","deploymentStatesToSubstates","defaultStats","deploymentStatesToSubstatesWithSkipped","DEPLOYMENT_STATES","deploymentDisplayStates","DARK_MODE"],"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\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.\nimport type { AttributeFilterPredicate, AttributeV2, DeviceWithImage, FilterV2, InvoiceLineItem, Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\nimport type { AxiosError } from 'axios';\n\nimport type { DeviceIssueOptionKey, FilterOperator, Role } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { Deployment } from './deploymentsSlice';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\nimport type { PricePreview } from './organizationSlice/types';\n\ntype FilterProcessorValue = string | string[] | number | boolean; // this aligns with a API compatible `FilterPredicate.value`\ntype FilterProcessor = (val: string) => FilterProcessorValue;\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors: Record<string, FilterProcessor> = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\n\ntype FilterAlias = { alias: FilterOperator; value: boolean };\nconst filterAliases: Record<string, FilterAlias> = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\n\nexport type FilterTerm = {\n attribute: string;\n scope: Scope;\n type: FilterOperator;\n value: FilterProcessorValue;\n};\n\nexport const mapFiltersToTerms = (filters: DeviceFilter[]): FilterTerm[] =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: Object.hasOwn(filterProcessors, filter.operator) ? filterProcessors[filter.operator](filter.value as string) : filter.value\n }));\nexport const mapTermsToFilters = (terms: FilterTerm[]): DeviceFilter[] =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = (aliasedFilter ? aliasedFilter[0] : term.type) as FilterOperator;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value } as DeviceFilter;\n });\n\ntype IssueFilterState = { offlineThreshold?: string };\n\ntype IssueFilterRule = {\n key: string;\n operator: FilterOperator;\n scope: Scope;\n value: string | string[] | ((state: IssueFilterState) => string);\n};\n\nconst convertIssueOptionsToFilters = (issuesSelection: DeviceIssueOptionKey[], filtersState: IssueFilterState = {}): DeviceFilter[] =>\n issuesSelection.map(item => {\n const filterRule = DEVICE_ISSUE_OPTIONS[item].filterRule as IssueFilterRule;\n const value = typeof filterRule.value === 'function' ? filterRule.value(filtersState) : filterRule.value;\n return { key: filterRule.key, operator: filterRule.operator, scope: filterRule.scope, value } as DeviceFilter;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(({ filterRule }) => {\n const { key = '', scope = '' } = filterRule as IssueFilterRule;\n return filter.scope !== 'inventory' && scope === filter.scope && key === filter.key;\n })\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: ATTRIBUTE_SCOPES.identity }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter: DeviceFilter, item: DeviceFilter): boolean =>\n Object.keys(emptyFilter).every(key => item[key as keyof DeviceFilter]?.toString() === filter[key as keyof DeviceFilter]?.toString());\n\nexport const filtersFilter = (item: DeviceFilter, index: number, array: DeviceFilter[]): boolean => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n\nexport const listItemMapper = <T extends object>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} as Partial<T> }: { cutOffSize?: number; defaultObject?: Partial<T> }\n): T[] =>\n ids.slice(0, cutOffSize).reduce<T[]>((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\ntype UiPermissions = typeof emptyUiPermissions;\ntype PermissionValue = string[] | Record<string, string[]>; // this would ideally be `PermissionValue = string[] | Record<string, PermissionValue>`\n\nexport const mergePermissions = (existingPermissions: UiPermissions = { ...emptyUiPermissions }, addedPermissions: UiPermissions): UiPermissions =>\n Object.entries(existingPermissions).reduce<UiPermissions>(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...(accu[key] as string[])].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value } as unknown as UiPermissions) as unknown as PermissionValue;\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles: string[], roles: Record<string, Role>): UiPermissions =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }: { loaded: number; total?: number }): number => {\n if (!total) return 0;\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport type ErrorWithResponse = AxiosError<{ error?: { message?: string } | string }> & { error?: string };\n\nexport const extractErrorMessage = (err: ErrorWithResponse, fallback = ''): string =>\n (typeof err.response?.data?.error === 'object' ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software: string, fallback: string): string =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = (version: string): string => (isNaN(parseInt(version.charAt(0))) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = (content: string | number | undefined): boolean => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport type DeploymentStats = {\n failures: number;\n inprogress: number;\n paused: number;\n pending: number;\n skipped?: number;\n successes: number;\n};\n\nexport const groupDeploymentDevicesStats = (deployment: Pick<Deployment, 'devices'>): DeploymentStats => {\n const deviceStatCollector = (deploymentStates: string[], devices: Record<string, DeviceWithImage>): number =>\n Object.values(devices).reduce<number>((accu, device) => (deploymentStates.includes(device.status ?? '') ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items: string[], statistics: Record<string, number>): number =>\n items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\n\nexport const groupDeploymentStats = (deployment: Partial<Deployment>, withSkipped?: boolean): DeploymentStats => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let result: DeploymentStats = { inprogress: 0, paused: 0, pending: 0, successes: 0, failures: 0 };\n let groupStates = deploymentStatesToSubstates;\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped!, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = (deployment: Partial<Deployment>): string => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\ntype DeploymentFilter =\n | FilterV2\n | {\n terms?: Array<AttributeFilterPredicate | { key: string }>;\n };\n\nexport const generateDeploymentGroupDetails = (filter: DeploymentFilter | undefined, groupName: string): string =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(\n filter =>\n `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator || DEVICE_FILTERING_OPTIONS.$eq.key].shortform} ${filter.value}`\n )\n .join(', ')})`\n : groupName;\n\ntype DeviceAttributeMap = {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n};\n\nexport const mapDeviceAttributes = (attributes: AttributeV2[] = []): DeviceAttributeMap =>\n attributes.reduce<DeviceAttributeMap>(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n const scope = (attribute.scope || ATTRIBUTE_SCOPES.inventory) as keyof DeviceAttributeMap;\n (accu[scope] as Record<string, unknown>) = {\n ...accu[scope],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = ([] as string[]).concat(attribute.value as string | string[]);\n }\n return accu;\n },\n { inventory: { device_type: [] as string[], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = (mode: string): boolean => mode === DARK_MODE;\n\ntype Line = InvoiceLineItem & { product: 'mender_standard' | 'mender_micro' };\nexport const parseSubscriptionPreview = (lines: Line[]): PricePreview['items'] =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n\nexport const convertToBackendSPLimits = (\n limits: Record<string, number | string>,\n spLimits: Record<string, object>\n): Record<string, { Name: string; value: number }> =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const backendId = (spLimits[key] as { backendId: string }).backendId;\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs","names":["DEVICE_FILTERING_OPTIONS","yes","DEVICE_ISSUE_OPTIONS","ATTRIBUTE_SCOPES","emptyFilter","emptyUiPermissions","duplicateFilter","softwareIndicator","deploymentStatesToSubstates","defaultStats","deploymentStatesToSubstatesWithSkipped","DEPLOYMENT_STATES","deploymentDisplayStates","DARK_MODE"],"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\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.\nimport type { Attribute, AttributeFilterPredicate, DeviceWithImage, FilterV2, InvoiceLineItem, Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\nimport type { AxiosError } from 'axios';\n\nimport type { DeviceIssueOptionKey, FilterOperator, Role } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { Deployment } from './deploymentsSlice';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\nimport type { PricePreview } from './organizationSlice/types';\n\ntype FilterProcessorValue = string | string[] | number | boolean; // this aligns with a API compatible `FilterPredicate.value`\ntype FilterProcessor = (val: string) => FilterProcessorValue;\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors: Record<string, FilterProcessor> = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\n\ntype FilterAlias = { alias: FilterOperator; value: boolean };\nconst filterAliases: Record<string, FilterAlias> = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\n\nexport type FilterTerm = {\n attribute: string;\n scope: Scope;\n type: FilterOperator;\n value: FilterProcessorValue;\n};\n\nexport const mapFiltersToTerms = (filters: DeviceFilter[]): FilterTerm[] =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: Object.hasOwn(filterProcessors, filter.operator) ? filterProcessors[filter.operator](filter.value as string) : filter.value\n }));\nexport const mapTermsToFilters = (terms: FilterTerm[]): DeviceFilter[] =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = (aliasedFilter ? aliasedFilter[0] : term.type) as FilterOperator;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value } as DeviceFilter;\n });\n\ntype IssueFilterState = { offlineThreshold?: string };\n\ntype IssueFilterRule = {\n key: string;\n operator: FilterOperator;\n scope: Scope;\n value: string | string[] | ((state: IssueFilterState) => string);\n};\n\nconst convertIssueOptionsToFilters = (issuesSelection: DeviceIssueOptionKey[], filtersState: IssueFilterState = {}): DeviceFilter[] =>\n issuesSelection.map(item => {\n const filterRule = DEVICE_ISSUE_OPTIONS[item].filterRule as IssueFilterRule;\n const value = typeof filterRule.value === 'function' ? filterRule.value(filtersState) : filterRule.value;\n return { key: filterRule.key, operator: filterRule.operator, scope: filterRule.scope, value } as DeviceFilter;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(({ filterRule }) => {\n const { key = '', scope = '' } = filterRule as IssueFilterRule;\n return filter.scope !== 'inventory' && scope === filter.scope && key === filter.key;\n })\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: ATTRIBUTE_SCOPES.identity }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter: DeviceFilter, item: DeviceFilter): boolean =>\n Object.keys(emptyFilter).every(key => item[key as keyof DeviceFilter]?.toString() === filter[key as keyof DeviceFilter]?.toString());\n\nexport const filtersFilter = (item: DeviceFilter, index: number, array: DeviceFilter[]): boolean => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n\nexport const listItemMapper = <T extends object>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} as Partial<T> }: { cutOffSize?: number; defaultObject?: Partial<T> }\n): T[] =>\n ids.slice(0, cutOffSize).reduce<T[]>((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\ntype UiPermissions = typeof emptyUiPermissions;\ntype PermissionValue = string[] | Record<string, string[]>; // this would ideally be `PermissionValue = string[] | Record<string, PermissionValue>`\n\nexport const mergePermissions = (existingPermissions: UiPermissions = { ...emptyUiPermissions }, addedPermissions: UiPermissions): UiPermissions =>\n Object.entries(existingPermissions).reduce<UiPermissions>(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...(accu[key] as string[])].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value } as unknown as UiPermissions) as unknown as PermissionValue;\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles: string[], roles: Record<string, Role>): UiPermissions =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }: { loaded: number; total?: number }): number => {\n if (!total) return 0;\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport type ErrorWithResponse = AxiosError<{ error?: { message?: string } | string }> & { error?: string };\n\nexport const extractErrorMessage = (err: ErrorWithResponse, fallback = ''): string =>\n (typeof err.response?.data?.error === 'object' ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software: string, fallback: string): string =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const stringToBoolean = (content: string | number | undefined): boolean => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport type DeploymentStats = {\n failures: number;\n inprogress: number;\n paused: number;\n pending: number;\n skipped?: number;\n successes: number;\n};\n\nexport const groupDeploymentDevicesStats = (deployment: Pick<Deployment, 'devices'>): DeploymentStats => {\n const deviceStatCollector = (deploymentStates: string[], devices: Record<string, DeviceWithImage>): number =>\n Object.values(devices).reduce<number>((accu, device) => (deploymentStates.includes(device.status ?? '') ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items: string[], statistics: Record<string, number>): number =>\n items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\n\nexport const groupDeploymentStats = (deployment: Partial<Deployment>, withSkipped?: boolean): DeploymentStats => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let result: DeploymentStats = { inprogress: 0, paused: 0, pending: 0, successes: 0, failures: 0 };\n let groupStates = deploymentStatesToSubstates;\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped!, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = (deployment: Partial<Deployment>): string => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\ntype DeploymentFilter =\n | FilterV2\n | {\n terms?: Array<AttributeFilterPredicate | { key: string }>;\n };\n\nexport const generateDeploymentGroupDetails = (filter: DeploymentFilter | undefined, groupName: string): string =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(\n filter =>\n `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator || DEVICE_FILTERING_OPTIONS.$eq.key].shortform} ${filter.value}`\n )\n .join(', ')})`\n : groupName;\n\ntype DeviceAttributeMap = {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n};\n\nexport const mapDeviceAttributes = (attributes: Attribute[] = []): DeviceAttributeMap =>\n attributes.reduce<DeviceAttributeMap>(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n const scope = (attribute.scope || ATTRIBUTE_SCOPES.inventory) as keyof DeviceAttributeMap;\n (accu[scope] as Record<string, unknown>) = {\n ...accu[scope],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = ([] as string[]).concat(attribute.value as string | string[]);\n }\n return accu;\n },\n { inventory: { device_type: [] as string[], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = (mode: string): boolean => mode === DARK_MODE;\n\ntype Line = InvoiceLineItem & { product: 'mender_standard' | 'mender_micro' };\nexport const parseSubscriptionPreview = (lines: Line[]): PricePreview['items'] =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n\nexport const convertToBackendSPLimits = (\n limits: Record<string, number | string>,\n spLimits: Record<string, object>\n): Record<string, { Name: string; value: number }> =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const backendId = (spLimits[key] as { backendId: string }).backendId;\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n"],"mappings":";;;;;;;AAyCA,MAAM,mBAAoD;EACvDA,+BAAAA,yBAAyB,IAAI,OAAO,QAAgB,OAAO,GAAG,KAAK;EACnEA,+BAAAA,yBAAyB,KAAK,OAAO,QAAgB,OAAO,GAAG,KAAK;EACpEA,+BAAAA,yBAAyB,IAAI,OAAO,QAAgB,OAAO,GAAG,KAAK;EACnEA,+BAAAA,yBAAyB,KAAK,OAAO,QAAgB,OAAO,GAAG,KAAK;EACpEA,+BAAAA,yBAAyB,MAAM,OAAO,QAAgB,OAAO,GAAG,KAAK;EACrEA,+BAAAA,yBAAyB,IAAI,OAAO,SAAiB,KAAK,KAAK,MAAM,GAAG,EAAE,KAAI,MAAK,EAAE,KAAK,CAAC;EAC3FA,+BAAAA,yBAAyB,KAAK,OAAO,SAAiB,KAAK,KAAK,MAAM,GAAG,EAAE,KAAI,MAAK,EAAE,KAAK,CAAC;EAC5FA,+BAAAA,yBAAyB,QAAQ,MAAMC,6BAAAA;EACvCD,+BAAAA,yBAAyB,SAAS,YAAY;AACjD;AAGA,MAAM,gBAA6C,EACjD,UAAU;CAAE,OAAOA,+BAAAA,yBAAyB,QAAQ;CAAK,OAAO;AAAM,EACxE;AASA,MAAa,qBAAqB,YAChC,QAAQ,KAAI,YAAW;CACrB,OAAO,OAAO;CACd,WAAW,OAAO;CAClB,MAAM,cAAc,OAAO,WAAW,SAAS,OAAO;CACtD,OAAO,OAAO,OAAO,kBAAkB,OAAO,QAAQ,IAAI,iBAAiB,OAAO,UAAU,OAAO,KAAe,IAAI,OAAO;AAC/H,EAAE;AACJ,MAAa,qBAAqB,UAChC,MAAM,KAAI,SAAQ;CAChB,MAAM,gBAAgB,OAAO,QAAQ,aAAa,EAAE,MAClD,oBAAmB,gBAAgB,GAAG,UAAU,KAAK,QAAQ,gBAAgB,GAAG,UAAU,KAAK,KACjG;CACA,MAAM,WAAY,gBAAgB,cAAc,KAAK,KAAK;CAC1D,OAAO;EAAE,OAAO,KAAK;EAAgB,KAAK,KAAK;EAAW;EAAU,OAAO,KAAK;CAAM;AACxF,CAAC;AAWH,MAAM,gCAAgC,iBAAyC,eAAiC,CAAC,MAC/G,gBAAgB,KAAI,SAAQ;CAC1B,MAAM,aAAaE,+BAAAA,qBAAqB,MAAM;CAC9C,MAAM,QAAQ,OAAO,WAAW,UAAU,aAAa,WAAW,MAAM,YAAY,IAAI,WAAW;CACnG,OAAO;EAAE,KAAK,WAAW;EAAK,UAAU,WAAW;EAAU,OAAO,WAAW;EAAO;CAAM;AAC9F,CAAC;AAEH,MAAa,mCAAmC,EAC9C,UAAU,CAAC,GACX,OACA,SAAS,EAAE,MAAM,CAAC,EAAE,GACpB,kBACA,iBAAiB,CAAC,GAClB,aAQI;CACJ,IAAI,oBAAoB,CAAC,GAAG,OAAO;CACnC,IAAI,OAAO,UAAU,YAAY,EAAE,OAAO,KAAK,QAAQ,WAAW,mBAAmB,QACnF,kBAAkB,KAAK;EAAE,KAAK;EAAS,OAAO;EAAO,UAAUF,+BAAAA,yBAAyB,IAAI;EAAK,OAAO;CAAS,CAAC;CAEpH,MAAM,oBAAoB,kBAAkB,QAC1C,WACE,CAAC,OAAO,OAAOE,+BAAAA,oBAAoB,EAAE,MAAM,EAAE,iBAAiB;EAC5D,MAAM,EAAE,MAAM,IAAI,QAAQ,OAAO;EACjC,OAAO,OAAO,UAAU,eAAe,UAAU,OAAO,SAAS,QAAQ,OAAO;CAClF,CAAC,CACL;CACA,MAAM,qBAAqB,6BAA6B,gBAAgB,EAAE,iBAAiB,CAAC;CAC5F,oBAAoB,CAAC,GAAG,mBAAmB,GAAG,kBAAkB;CAIhE,OAAO;EAAE,mBAAmB;EAAmB,aAAa,kBAHnC,SACrB,CAAC,GAAG,mBAAmB;GAAE,KAAK;GAAU,OAAO;GAAQ,UAAUF,+BAAAA,yBAAyB,IAAI;GAAK,OAAOG,+BAAAA,iBAAiB;EAAS,CAAC,IACrI,iBAC0F;CAAE;AAClG;AAEA,MAAM,iBAAiB,QAAsB,SAC3C,OAAO,KAAKC,kBAAAA,WAAW,EAAE,OAAM,QAAO,KAAK,MAA4B,SAAS,MAAM,OAAO,MAA4B,SAAS,CAAC;AAErI,MAAa,iBAAiB,MAAoB,OAAe,UAAmC;CAElG,OADmB,MAAM,WAAU,WAAU,cAAc,QAAQ,IAAI,CACvD,MAAM;AACxB;AAEA,MAAa,kBAAqD,QAChE,OAAO,YAAY,OAAO,QAAQ,GAAG,EAAE,QAAQ,GAAG,OAAO,MAAM,KAAA,CAAS,CAAC;AAE3E,MAAa,kBACX,MACA,KACA,EAAE,aAAA,IAAyC,gBAAgB,CAAC,QAE5D,IAAI,MAAM,GAAG,UAAU,EAAE,QAAa,MAAM,OAAO;CACjD,IAAI,MAAM,KAAK,KACb,KAAK,KAAK;EAAE,GAAG;EAAe,GAAG,KAAK;CAAI,CAAC;CAE7C,OAAO;AACT,GAAG,CAAC,CAAC;AAKP,MAAa,oBAAoB,sBAAqC,EAAE,GAAGC,+BAAAA,mBAAmB,GAAG,qBAC/F,OAAO,QAAQ,mBAAmB,EAAE,QACjC,MAAM,CAAC,KAAK,WAAW;CACtB,IAAI;CACJ,IAAI,CAAC,KAAK,MAAM;EACd,KAAK,OAAO;EACZ,OAAO;CACT;CACA,IAAI,MAAM,QAAQ,KAAK,GACrB,SAAS,CAAC,GAAG,OAAO,GAAI,KAAK,IAAiB,EAAE,OAAOC,6BAAAA,eAAe;MAEtE,SAAS,iBAAiB,KAAK,MAAM,EAAE,GAAG,MAAM,CAA6B;CAE/E,KAAK,OAAO;CACZ,OAAO;AACT,GACA,EAAE,GAAG,iBAAiB,CACxB;AAEF,MAAa,+BAA+B,WAAqB,UAC/D,UAAU,QACP,MAAM,WAAW;CAChB,IAAI,EAAE,UAAU,MAAM,UACpB,OAAO;CAET,OAAO,iBAAiB,MAAM,MAAM,QAAQ,aAAa;AAC3D,GACA,EAAE,GAAGD,+BAAAA,mBAAmB,CAC1B;AAEF,MAAa,YAAY,EAAE,QAAQ,YAAwD;CACzF,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,iBAAkB,SAAS,QAAS;CACxC,OAAQ,iBAAiB,iBAAiB,KAAK,KAAK,KAAK,cAAc,IAAI,KAAK,MAAM,cAAc;AACtG;AAIA,MAAa,uBAAuB,KAAwB,WAAW,QACpE,OAAO,IAAI,UAAU,MAAM,UAAU,WAAW,IAAI,UAAU,MAAM,OAAO,UAAU,IAAI,UAAU,MAAM,UAAU,IAAI,SAAS,IAAI,WAAW;AAElJ,MAAa,uBAAuB,UAAkB,aACpD,SAAS,UAAU,aAAa,kBAAmB,SAAS,SAAA,UAA0B,IAAI,WAAW,GAAG,WAAWE,gCAAAA,sBAAuB;AAE5I,MAAa,mBAAmB,YAAkD;CAChF,IAAI,CAAC,SACH,OAAO;CAET,MAAM,SAAS,UAAU;CACzB,QAAQ,OAAO,KAAK,EAAE,YAAY,GAAlC;EACE,KAAK;EACL,KAAK;EACL,KAAK,KACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,MACH,OAAO;EACT,SACE,OAAO,QAAQ,MAAM;CACzB;AACF;AAWA,MAAa,+BAA+B,eAA6D;CACvG,MAAM,uBAAuB,kBAA4B,YACvD,OAAO,OAAO,OAAO,EAAE,QAAgB,MAAM,WAAY,iBAAiB,SAAS,OAAO,UAAU,EAAE,IAAI,OAAO,IAAI,MAAO,CAAC;CAE/H,MAAM,aAAa,oBAAoBC,kBAAAA,4BAA4B,YAAY,WAAW,OAAO;CACjG,MAAM,UAAU,oBAAoBA,kBAAAA,4BAA4B,SAAS,WAAW,OAAO;CAC3F,MAAM,YAAY,oBAAoBA,kBAAAA,4BAA4B,WAAW,WAAW,OAAO;CAC/F,MAAM,WAAW,oBAAoBA,kBAAAA,4BAA4B,UAAU,WAAW,OAAO;CAE7F,OAAO;EAAE;EAAY,QADN,oBAAoBA,kBAAAA,4BAA4B,QAAQ,WAAW,OACxD;EAAG;EAAS;EAAW;CAAS;AAC5D;AAEA,MAAa,iBAAiB,OAAiB,eAC7C,MAAM,QAAQ,MAAM,aAAa,OAAO,OAAO,WAAW,aAAa,CAAC,GAAG,CAAC;AAE9E,MAAa,wBAAwB,YAAiC,gBAA2C;CAC/G,MAAM,EAAE,aAAa,CAAC,MAAM;CAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;CACxB,MAAM,QAAQ;EAAE,GAAGC,kBAAAA;EAAc,GAAG;CAAO;CAC3C,IAAI,SAA0B;EAAE,YAAY;EAAG,QAAQ;EAAG,SAAS;EAAG,WAAW;EAAG,UAAU;CAAE;CAChG,IAAI,cAAcD,kBAAAA;CAClB,IAAI,aAAa;EACf,cAAcE,kBAAAA;EACd,OAAO,UAAU,cAAc,YAAY,SAAU,KAAK;CAC5D;CACA,SAAS;EACP,GAAG;EAEH,YAAY,cAAc,YAAY,YAAY,KAAK;EACvD,SAAS,cAAc,YAAY,SAAS,KAAK;EACjD,WAAW,cAAc,YAAY,WAAW,KAAK;EACrD,UAAU,cAAc,YAAY,UAAU,KAAK;EACnD,QAAQ,cAAc,YAAY,QAAQ,KAAK;CACjD;CACA,OAAO;AACT;AAEA,MAAa,sBAAsB,eAA4C;CAC7E,MAAM,EAAE,QAAQ,mBAAmBC,kBAAAA,kBAAkB,YAAY;CACjE,MAAM,EAAE,YAAY,sBAAsB,WAAW,qBAAqB,UAAU;CAEpF,IAAI,SAASC,kBAAAA,wBAAwB;CACrC,IAAI,qBAAqBD,kBAAAA,kBAAkB,WAAW,yBAAyB,GAC7E,SAAS;MACJ,IAAI,SAAS,GAClB,SAASC,kBAAAA,wBAAwB;CAEnC,OAAO;AACT;AAQA,MAAa,kCAAkC,QAAsC,cACnF,UAAU,OAAO,OAAO,SACpB,GAAG,UAAU,IAAI,OAAO,MACrB,KACC,WACE,GAAG,OAAO,aAAa,OAAO,IAAI,GAAGZ,+BAAAA,yBAAyB,OAAO,QAAQ,OAAO,YAAYA,+BAAAA,yBAAyB,IAAI,KAAK,UAAU,GAAG,OAAO,OAC1J,EACC,KAAK,IAAI,EAAE,KACd;AAUN,MAAa,uBAAuB,aAA0B,CAAC,MAC7D,WAAW,QACR,MAAM,cAAc;CACnB,IAAI,EAAE,UAAU,SAAS,UAAU,SAAS,UAAU,UAAUG,+BAAAA,iBAAiB,WAC/E,OAAO;CAET,MAAM,QAAS,UAAU,SAASA,+BAAAA,iBAAiB;CACnD,KAAM,SAAqC;EACzC,GAAG,KAAK;GACP,UAAU,OAAO,UAAU;CAC9B;CACA,IAAI,UAAU,SAAS,iBAAiB,UAAU,UAAUA,+BAAAA,iBAAiB,WAC3E,KAAK,UAAU,cAAe,CAAC,EAAe,OAAO,UAAU,KAA0B;CAE3F,OAAO;AACT,GACA;CAAE,WAAW;EAAE,aAAa,CAAC;EAAe,eAAe;CAAG;CAAG,UAAU,CAAC;CAAG,SAAS,CAAC;CAAG,QAAQ,CAAC;CAAG,MAAM,CAAC;AAAE,CACnH;AAEF,MAAa,cAAc,SAA0B,SAASU,2BAAAA;AAG9D,MAAa,4BAA4B,UACvC,MAAM,QAAQ,KAAK,EAAE,OAAO,QAAQ,cAAc;CAChD,MAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE;CAC1C,IAAI,CAAC,IAAI,OACP,IAAI,QAAQ;EACV,QAAQ;EACR,QAAQ,CAAC;CACX;CAEF,IAAI,CAAC,OACH,IAAI,MAAM,UAAU;MAEpB,IAAI,MAAM,OAAO,UAAU,IAAI,MAAM,OAAO,UAAU,KAAK;CAE7D,OAAO;AACT,GAAG,CAAC,CAAC;AAEP,MAAa,4BACX,QACA,aAEA,OAAO,YACL,OAAO,QAAQ,MAAM,EAClB,QAAQ,CAAC,SAAS,CAAC,CAAC,SAAS,IAAI,EACjC,KAAK,CAAC,KAAK,WAAW;CACrB,MAAM,YAAa,SAAS,KAA+B;CAC3D,OAAO,CAAC,WAAW;EAAE,MAAM;EAAW,OAAO,OAAO,KAAK,KAAK;CAAE,CAAC;AACnE,CAAC,CACL"}
package/dist/utils.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { C as statCollector, S as progress, T as stripUndefined, _ as mapFiltersToTerms, a as convertToBackendSPLimits, b as mergePermissions, c as filtersFilter, d as getDeploymentState, f as groupDeploymentDevicesStats, g as mapDeviceAttributes, h as listItemMapper, i as convertDeviceListStateToFilters, l as generateDeploymentGroupDetails, m as isDarkMode, n as ErrorWithResponse, o as ensureVersionString, p as groupDeploymentStats, r as FilterTerm, s as extractErrorMessage, t as DeploymentStats, u as getComparisonCompatibleVersion, v as mapTermsToFilters, w as stringToBoolean, x as parseSubscriptionPreview, y as mapUserRolesToUiPermissions } from "./utils-Do9z5TL1.cjs";
2
- export { DeploymentStats, ErrorWithResponse, FilterTerm, convertDeviceListStateToFilters, convertToBackendSPLimits, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getComparisonCompatibleVersion, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
1
+ import { C as stringToBoolean, S as statCollector, _ as mapTermsToFilters, a as convertToBackendSPLimits, b as parseSubscriptionPreview, c as filtersFilter, d as groupDeploymentDevicesStats, f as groupDeploymentStats, g as mapFiltersToTerms, h as mapDeviceAttributes, i as convertDeviceListStateToFilters, l as generateDeploymentGroupDetails, m as listItemMapper, n as ErrorWithResponse, o as ensureVersionString, p as isDarkMode, r as FilterTerm, s as extractErrorMessage, t as DeploymentStats, u as getDeploymentState, v as mapUserRolesToUiPermissions, w as stripUndefined, x as progress, y as mergePermissions } from "./utils-DbXmZmGq.cjs";
2
+ export { DeploymentStats, ErrorWithResponse, FilterTerm, convertDeviceListStateToFilters, convertToBackendSPLimits, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
package/dist/utils.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { C as statCollector, S as progress, T as stripUndefined, _ as mapFiltersToTerms, a as convertToBackendSPLimits, b as mergePermissions, c as filtersFilter, d as getDeploymentState, f as groupDeploymentDevicesStats, g as mapDeviceAttributes, h as listItemMapper, i as convertDeviceListStateToFilters, l as generateDeploymentGroupDetails, m as isDarkMode, n as ErrorWithResponse, o as ensureVersionString, p as groupDeploymentStats, r as FilterTerm, s as extractErrorMessage, t as DeploymentStats, u as getComparisonCompatibleVersion, v as mapTermsToFilters, w as stringToBoolean, x as parseSubscriptionPreview, y as mapUserRolesToUiPermissions } from "./utils-CHBWS_tH.js";
2
- export { DeploymentStats, ErrorWithResponse, FilterTerm, convertDeviceListStateToFilters, convertToBackendSPLimits, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getComparisonCompatibleVersion, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
1
+ import { C as stringToBoolean, S as statCollector, _ as mapTermsToFilters, a as convertToBackendSPLimits, b as parseSubscriptionPreview, c as filtersFilter, d as groupDeploymentDevicesStats, f as groupDeploymentStats, g as mapFiltersToTerms, h as mapDeviceAttributes, i as convertDeviceListStateToFilters, l as generateDeploymentGroupDetails, m as listItemMapper, n as ErrorWithResponse, o as ensureVersionString, p as isDarkMode, r as FilterTerm, s as extractErrorMessage, t as DeploymentStats, u as getDeploymentState, v as mapUserRolesToUiPermissions, w as stripUndefined, x as progress, y as mergePermissions } from "./utils-C_9XEfi_.js";
2
+ export { DeploymentStats, ErrorWithResponse, FilterTerm, convertDeviceListStateToFilters, convertToBackendSPLimits, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
package/dist/utils.js CHANGED
@@ -102,7 +102,6 @@ const progress = ({ loaded, total }) => {
102
102
  };
103
103
  const extractErrorMessage = (err, fallback = "") => (typeof err.response?.data?.error === "object" ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;
104
104
  const ensureVersionString = (software, fallback) => software.length && software !== "artifact_name" ? software.endsWith(".version") ? software : `${software}${softwareIndicator}` : fallback;
105
- const getComparisonCompatibleVersion = (version) => isNaN(parseInt(version.charAt(0))) && version !== "next" ? "master" : version;
106
105
  const stringToBoolean = (content) => {
107
106
  if (!content) return false;
108
107
  const string = content + "";
@@ -208,6 +207,6 @@ const convertToBackendSPLimits = (limits, spLimits) => Object.fromEntries(Object
208
207
  }];
209
208
  }));
210
209
  //#endregion
211
- export { convertDeviceListStateToFilters, convertToBackendSPLimits, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getComparisonCompatibleVersion, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
210
+ export { convertDeviceListStateToFilters, convertToBackendSPLimits, ensureVersionString, extractErrorMessage, filtersFilter, generateDeploymentGroupDetails, getDeploymentState, groupDeploymentDevicesStats, groupDeploymentStats, isDarkMode, listItemMapper, mapDeviceAttributes, mapFiltersToTerms, mapTermsToFilters, mapUserRolesToUiPermissions, mergePermissions, parseSubscriptionPreview, progress, statCollector, stringToBoolean, stripUndefined };
212
211
 
213
212
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\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.\nimport type { AttributeFilterPredicate, AttributeV2, DeviceWithImage, FilterV2, InvoiceLineItem, Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\nimport type { AxiosError } from 'axios';\n\nimport type { DeviceIssueOptionKey, FilterOperator, Role } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { Deployment } from './deploymentsSlice';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\nimport type { PricePreview } from './organizationSlice/types';\n\ntype FilterProcessorValue = string | string[] | number | boolean; // this aligns with a API compatible `FilterPredicate.value`\ntype FilterProcessor = (val: string) => FilterProcessorValue;\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors: Record<string, FilterProcessor> = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\n\ntype FilterAlias = { alias: FilterOperator; value: boolean };\nconst filterAliases: Record<string, FilterAlias> = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\n\nexport type FilterTerm = {\n attribute: string;\n scope: Scope;\n type: FilterOperator;\n value: FilterProcessorValue;\n};\n\nexport const mapFiltersToTerms = (filters: DeviceFilter[]): FilterTerm[] =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: Object.hasOwn(filterProcessors, filter.operator) ? filterProcessors[filter.operator](filter.value as string) : filter.value\n }));\nexport const mapTermsToFilters = (terms: FilterTerm[]): DeviceFilter[] =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = (aliasedFilter ? aliasedFilter[0] : term.type) as FilterOperator;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value } as DeviceFilter;\n });\n\ntype IssueFilterState = { offlineThreshold?: string };\n\ntype IssueFilterRule = {\n key: string;\n operator: FilterOperator;\n scope: Scope;\n value: string | string[] | ((state: IssueFilterState) => string);\n};\n\nconst convertIssueOptionsToFilters = (issuesSelection: DeviceIssueOptionKey[], filtersState: IssueFilterState = {}): DeviceFilter[] =>\n issuesSelection.map(item => {\n const filterRule = DEVICE_ISSUE_OPTIONS[item].filterRule as IssueFilterRule;\n const value = typeof filterRule.value === 'function' ? filterRule.value(filtersState) : filterRule.value;\n return { key: filterRule.key, operator: filterRule.operator, scope: filterRule.scope, value } as DeviceFilter;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(({ filterRule }) => {\n const { key = '', scope = '' } = filterRule as IssueFilterRule;\n return filter.scope !== 'inventory' && scope === filter.scope && key === filter.key;\n })\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: ATTRIBUTE_SCOPES.identity }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter: DeviceFilter, item: DeviceFilter): boolean =>\n Object.keys(emptyFilter).every(key => item[key as keyof DeviceFilter]?.toString() === filter[key as keyof DeviceFilter]?.toString());\n\nexport const filtersFilter = (item: DeviceFilter, index: number, array: DeviceFilter[]): boolean => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n\nexport const listItemMapper = <T extends object>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} as Partial<T> }: { cutOffSize?: number; defaultObject?: Partial<T> }\n): T[] =>\n ids.slice(0, cutOffSize).reduce<T[]>((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\ntype UiPermissions = typeof emptyUiPermissions;\ntype PermissionValue = string[] | Record<string, string[]>; // this would ideally be `PermissionValue = string[] | Record<string, PermissionValue>`\n\nexport const mergePermissions = (existingPermissions: UiPermissions = { ...emptyUiPermissions }, addedPermissions: UiPermissions): UiPermissions =>\n Object.entries(existingPermissions).reduce<UiPermissions>(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...(accu[key] as string[])].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value } as unknown as UiPermissions) as unknown as PermissionValue;\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles: string[], roles: Record<string, Role>): UiPermissions =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }: { loaded: number; total?: number }): number => {\n if (!total) return 0;\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport type ErrorWithResponse = AxiosError<{ error?: { message?: string } | string }> & { error?: string };\n\nexport const extractErrorMessage = (err: ErrorWithResponse, fallback = ''): string =>\n (typeof err.response?.data?.error === 'object' ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software: string, fallback: string): string =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const getComparisonCompatibleVersion = (version: string): string => (isNaN(parseInt(version.charAt(0))) && version !== 'next' ? 'master' : version);\n\nexport const stringToBoolean = (content: string | number | undefined): boolean => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport type DeploymentStats = {\n failures: number;\n inprogress: number;\n paused: number;\n pending: number;\n skipped?: number;\n successes: number;\n};\n\nexport const groupDeploymentDevicesStats = (deployment: Pick<Deployment, 'devices'>): DeploymentStats => {\n const deviceStatCollector = (deploymentStates: string[], devices: Record<string, DeviceWithImage>): number =>\n Object.values(devices).reduce<number>((accu, device) => (deploymentStates.includes(device.status ?? '') ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items: string[], statistics: Record<string, number>): number =>\n items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\n\nexport const groupDeploymentStats = (deployment: Partial<Deployment>, withSkipped?: boolean): DeploymentStats => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let result: DeploymentStats = { inprogress: 0, paused: 0, pending: 0, successes: 0, failures: 0 };\n let groupStates = deploymentStatesToSubstates;\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped!, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = (deployment: Partial<Deployment>): string => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\ntype DeploymentFilter =\n | FilterV2\n | {\n terms?: Array<AttributeFilterPredicate | { key: string }>;\n };\n\nexport const generateDeploymentGroupDetails = (filter: DeploymentFilter | undefined, groupName: string): string =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(\n filter =>\n `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator || DEVICE_FILTERING_OPTIONS.$eq.key].shortform} ${filter.value}`\n )\n .join(', ')})`\n : groupName;\n\ntype DeviceAttributeMap = {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n};\n\nexport const mapDeviceAttributes = (attributes: AttributeV2[] = []): DeviceAttributeMap =>\n attributes.reduce<DeviceAttributeMap>(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n const scope = (attribute.scope || ATTRIBUTE_SCOPES.inventory) as keyof DeviceAttributeMap;\n (accu[scope] as Record<string, unknown>) = {\n ...accu[scope],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = ([] as string[]).concat(attribute.value as string | string[]);\n }\n return accu;\n },\n { inventory: { device_type: [] as string[], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = (mode: string): boolean => mode === DARK_MODE;\n\ntype Line = InvoiceLineItem & { product: 'mender_standard' | 'mender_micro' };\nexport const parseSubscriptionPreview = (lines: Line[]): PricePreview['items'] =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n\nexport const convertToBackendSPLimits = (\n limits: Record<string, number | string>,\n spLimits: Record<string, object>\n): Record<string, { Name: string; value: number }> =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const backendId = (spLimits[key] as { backendId: string }).backendId;\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../src/utils.ts"],"sourcesContent":["// Copyright 2024 Northern.tech AS\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.\nimport type { Attribute, AttributeFilterPredicate, DeviceWithImage, FilterV2, InvoiceLineItem, Scope } from '@northern.tech/types/MenderTypes';\nimport { duplicateFilter, yes } from '@northern.tech/utils/helpers';\nimport type { AxiosError } from 'axios';\n\nimport type { DeviceIssueOptionKey, FilterOperator, Role } from './constants';\nimport {\n ATTRIBUTE_SCOPES,\n DARK_MODE,\n DEPLOYMENT_STATES,\n DEVICE_FILTERING_OPTIONS,\n DEVICE_ISSUE_OPTIONS,\n DEVICE_LIST_MAXIMUM_LENGTH,\n defaultStats,\n deploymentDisplayStates,\n deploymentStatesToSubstates,\n deploymentStatesToSubstatesWithSkipped,\n emptyFilter,\n emptyUiPermissions,\n softwareIndicator\n} from './constants';\nimport type { Deployment } from './deploymentsSlice';\nimport type { DeviceFilter, DeviceGroup, InventoryAttributes } from './devicesSlice';\nimport type { PricePreview } from './organizationSlice/types';\n\ntype FilterProcessorValue = string | string[] | number | boolean; // this aligns with a API compatible `FilterPredicate.value`\ntype FilterProcessor = (val: string) => FilterProcessorValue;\n\n// for some reason these functions can not be stored in the deviceConstants...\nconst filterProcessors: Record<string, FilterProcessor> = {\n [DEVICE_FILTERING_OPTIONS.$gt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$gte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lt.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$lte.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$ltne.key]: (val: string) => Number(val) || val,\n [DEVICE_FILTERING_OPTIONS.$in.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$nin.key]: (val: string) => ('' + val).split(',').map(i => i.trim()),\n [DEVICE_FILTERING_OPTIONS.$exists.key]: yes,\n [DEVICE_FILTERING_OPTIONS.$nexists.key]: () => false\n};\n\ntype FilterAlias = { alias: FilterOperator; value: boolean };\nconst filterAliases: Record<string, FilterAlias> = {\n $nexists: { alias: DEVICE_FILTERING_OPTIONS.$exists.key, value: false }\n};\n\nexport type FilterTerm = {\n attribute: string;\n scope: Scope;\n type: FilterOperator;\n value: FilterProcessorValue;\n};\n\nexport const mapFiltersToTerms = (filters: DeviceFilter[]): FilterTerm[] =>\n filters.map(filter => ({\n scope: filter.scope,\n attribute: filter.key,\n type: filterAliases[filter.operator]?.alias || filter.operator,\n value: Object.hasOwn(filterProcessors, filter.operator) ? filterProcessors[filter.operator](filter.value as string) : filter.value\n }));\nexport const mapTermsToFilters = (terms: FilterTerm[]): DeviceFilter[] =>\n terms.map(term => {\n const aliasedFilter = Object.entries(filterAliases).find(\n aliasDefinition => aliasDefinition[1].alias === term.type && aliasDefinition[1].value === term.value\n );\n const operator = (aliasedFilter ? aliasedFilter[0] : term.type) as FilterOperator;\n return { scope: term.scope as Scope, key: term.attribute, operator, value: term.value } as DeviceFilter;\n });\n\ntype IssueFilterState = { offlineThreshold?: string };\n\ntype IssueFilterRule = {\n key: string;\n operator: FilterOperator;\n scope: Scope;\n value: string | string[] | ((state: IssueFilterState) => string);\n};\n\nconst convertIssueOptionsToFilters = (issuesSelection: DeviceIssueOptionKey[], filtersState: IssueFilterState = {}): DeviceFilter[] =>\n issuesSelection.map(item => {\n const filterRule = DEVICE_ISSUE_OPTIONS[item].filterRule as IssueFilterRule;\n const value = typeof filterRule.value === 'function' ? filterRule.value(filtersState) : filterRule.value;\n return { key: filterRule.key, operator: filterRule.operator, scope: filterRule.scope, value } as DeviceFilter;\n });\n\nexport const convertDeviceListStateToFilters = ({\n filters = [],\n group,\n groups = { byId: {} },\n offlineThreshold,\n selectedIssues = [],\n status\n}: {\n filters?: DeviceFilter[];\n group?: string;\n groups?: { byId: Record<string, DeviceGroup> };\n offlineThreshold?: string;\n selectedIssues?: DeviceIssueOptionKey[];\n status?: string;\n}) => {\n let applicableFilters = [...filters];\n if (typeof group === 'string' && !(groups.byId[group]?.filters || applicableFilters).length) {\n applicableFilters.push({ key: 'group', value: group, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: 'system' });\n }\n const nonMonitorFilters = applicableFilters.filter(\n filter =>\n !Object.values(DEVICE_ISSUE_OPTIONS).some(({ filterRule }) => {\n const { key = '', scope = '' } = filterRule as IssueFilterRule;\n return filter.scope !== 'inventory' && scope === filter.scope && key === filter.key;\n })\n );\n const deviceIssueFilters = convertIssueOptionsToFilters(selectedIssues, { offlineThreshold });\n applicableFilters = [...nonMonitorFilters, ...deviceIssueFilters];\n const effectiveFilters = status\n ? [...applicableFilters, { key: 'status', value: status, operator: DEVICE_FILTERING_OPTIONS.$eq.key, scope: ATTRIBUTE_SCOPES.identity }]\n : applicableFilters;\n return { applicableFilters: nonMonitorFilters, filterTerms: mapFiltersToTerms(effectiveFilters) };\n};\n\nconst filterCompare = (filter: DeviceFilter, item: DeviceFilter): boolean =>\n Object.keys(emptyFilter).every(key => item[key as keyof DeviceFilter]?.toString() === filter[key as keyof DeviceFilter]?.toString());\n\nexport const filtersFilter = (item: DeviceFilter, index: number, array: DeviceFilter[]): boolean => {\n const firstIndex = array.findIndex(filter => filterCompare(filter, item));\n return firstIndex === index;\n};\n\nexport const stripUndefined = <T extends Record<string, unknown>>(obj: T): Partial<T> =>\n Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>;\n\nexport const listItemMapper = <T extends object>(\n byId: Record<string, T>,\n ids: string[],\n { cutOffSize = DEVICE_LIST_MAXIMUM_LENGTH, defaultObject = {} as Partial<T> }: { cutOffSize?: number; defaultObject?: Partial<T> }\n): T[] =>\n ids.slice(0, cutOffSize).reduce<T[]>((accu, id) => {\n if (id && byId[id]) {\n accu.push({ ...defaultObject, ...byId[id] });\n }\n return accu;\n }, []);\n\ntype UiPermissions = typeof emptyUiPermissions;\ntype PermissionValue = string[] | Record<string, string[]>; // this would ideally be `PermissionValue = string[] | Record<string, PermissionValue>`\n\nexport const mergePermissions = (existingPermissions: UiPermissions = { ...emptyUiPermissions }, addedPermissions: UiPermissions): UiPermissions =>\n Object.entries(existingPermissions).reduce<UiPermissions>(\n (accu, [key, value]) => {\n let values;\n if (!accu[key]) {\n accu[key] = value;\n return accu;\n }\n if (Array.isArray(value)) {\n values = [...value, ...(accu[key] as string[])].filter(duplicateFilter);\n } else {\n values = mergePermissions(accu[key], { ...value } as unknown as UiPermissions) as unknown as PermissionValue;\n }\n accu[key] = values;\n return accu;\n },\n { ...addedPermissions }\n );\n\nexport const mapUserRolesToUiPermissions = (userRoles: string[], roles: Record<string, Role>): UiPermissions =>\n userRoles.reduce(\n (accu, roleId) => {\n if (!(roleId && roles[roleId])) {\n return accu;\n }\n return mergePermissions(accu, roles[roleId].uiPermissions);\n },\n { ...emptyUiPermissions }\n );\n\nexport const progress = ({ loaded, total }: { loaded: number; total?: number }): number => {\n if (!total) return 0;\n let uploadProgress = (loaded / total) * 100;\n return (uploadProgress = uploadProgress < 50 ? Math.ceil(uploadProgress) : Math.round(uploadProgress));\n};\n\nexport type ErrorWithResponse = AxiosError<{ error?: { message?: string } | string }> & { error?: string };\n\nexport const extractErrorMessage = (err: ErrorWithResponse, fallback = ''): string =>\n (typeof err.response?.data?.error === 'object' ? err.response?.data?.error?.message : err.response?.data?.error) || err.error || err.message || fallback;\n\nexport const ensureVersionString = (software: string, fallback: string): string =>\n software.length && software !== 'artifact_name' ? (software.endsWith(softwareIndicator) ? software : `${software}${softwareIndicator}`) : fallback;\n\nexport const stringToBoolean = (content: string | number | undefined): boolean => {\n if (!content) {\n return false;\n }\n const string = content + '';\n switch (string.trim().toLowerCase()) {\n case 'true':\n case 'yes':\n case '1':\n return true;\n case 'false':\n case 'no':\n case '0':\n case null:\n return false;\n default:\n return Boolean(string);\n }\n};\n\nexport type DeploymentStats = {\n failures: number;\n inprogress: number;\n paused: number;\n pending: number;\n skipped?: number;\n successes: number;\n};\n\nexport const groupDeploymentDevicesStats = (deployment: Pick<Deployment, 'devices'>): DeploymentStats => {\n const deviceStatCollector = (deploymentStates: string[], devices: Record<string, DeviceWithImage>): number =>\n Object.values(devices).reduce<number>((accu, device) => (deploymentStates.includes(device.status ?? '') ? accu + 1 : accu), 0);\n\n const inprogress = deviceStatCollector(deploymentStatesToSubstates.inprogress, deployment.devices);\n const pending = deviceStatCollector(deploymentStatesToSubstates.pending, deployment.devices);\n const successes = deviceStatCollector(deploymentStatesToSubstates.successes, deployment.devices);\n const failures = deviceStatCollector(deploymentStatesToSubstates.failures, deployment.devices);\n const paused = deviceStatCollector(deploymentStatesToSubstates.paused, deployment.devices);\n return { inprogress, paused, pending, successes, failures };\n};\n\nexport const statCollector = (items: string[], statistics: Record<string, number>): number =>\n items.reduce((accu, property) => accu + Number(statistics[property] || 0), 0);\n\nexport const groupDeploymentStats = (deployment: Partial<Deployment>, withSkipped?: boolean): DeploymentStats => {\n const { statistics = {} } = deployment;\n const { status = {} } = statistics;\n const stats = { ...defaultStats, ...status };\n let result: DeploymentStats = { inprogress: 0, paused: 0, pending: 0, successes: 0, failures: 0 };\n let groupStates = deploymentStatesToSubstates;\n if (withSkipped) {\n groupStates = deploymentStatesToSubstatesWithSkipped;\n result.skipped = statCollector(groupStates.skipped!, stats);\n }\n result = {\n ...result,\n // don't include 'pending' as inprogress, as all remaining devices will be pending - we don't discriminate based on phase membership\n inprogress: statCollector(groupStates.inprogress, stats),\n pending: statCollector(groupStates.pending, stats),\n successes: statCollector(groupStates.successes, stats),\n failures: statCollector(groupStates.failures, stats),\n paused: statCollector(groupStates.paused, stats)\n };\n return result;\n};\n\nexport const getDeploymentState = (deployment: Partial<Deployment>): string => {\n const { status: deploymentStatus = DEPLOYMENT_STATES.pending } = deployment;\n const { inprogress: currentProgressCount, paused } = groupDeploymentStats(deployment);\n\n let status = deploymentDisplayStates[deploymentStatus];\n if (deploymentStatus === DEPLOYMENT_STATES.pending && currentProgressCount === 0) {\n status = 'queued';\n } else if (paused > 0) {\n status = deploymentDisplayStates.paused;\n }\n return status;\n};\n\ntype DeploymentFilter =\n | FilterV2\n | {\n terms?: Array<AttributeFilterPredicate | { key: string }>;\n };\n\nexport const generateDeploymentGroupDetails = (filter: DeploymentFilter | undefined, groupName: string): string =>\n filter && filter.terms?.length\n ? `${groupName} (${filter.terms\n .map(\n filter =>\n `${filter.attribute || filter.key} ${DEVICE_FILTERING_OPTIONS[filter.type || filter.operator || DEVICE_FILTERING_OPTIONS.$eq.key].shortform} ${filter.value}`\n )\n .join(', ')})`\n : groupName;\n\ntype DeviceAttributeMap = {\n identity: Record<string, string>;\n inventory: InventoryAttributes;\n monitor: Record<string, string>;\n system: Record<string, string>;\n tags: Record<string, string>;\n};\n\nexport const mapDeviceAttributes = (attributes: Attribute[] = []): DeviceAttributeMap =>\n attributes.reduce<DeviceAttributeMap>(\n (accu, attribute) => {\n if (!(attribute.value && attribute.name) && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n return accu;\n }\n const scope = (attribute.scope || ATTRIBUTE_SCOPES.inventory) as keyof DeviceAttributeMap;\n (accu[scope] as Record<string, unknown>) = {\n ...accu[scope],\n [attribute.name]: attribute.value\n };\n if (attribute.name === 'device_type' && attribute.scope === ATTRIBUTE_SCOPES.inventory) {\n accu.inventory.device_type = ([] as string[]).concat(attribute.value as string | string[]);\n }\n return accu;\n },\n { inventory: { device_type: [] as string[], artifact_name: '' }, identity: {}, monitor: {}, system: {}, tags: {} }\n );\n\nexport const isDarkMode = (mode: string): boolean => mode === DARK_MODE;\n\ntype Line = InvoiceLineItem & { product: 'mender_standard' | 'mender_micro' };\nexport const parseSubscriptionPreview = (lines: Line[]): PricePreview['items'] =>\n lines.reduce((acc, { addon, amount, product }) => {\n const tier = product.replace('mender_', '');\n if (!acc[tier]) {\n acc[tier] = {\n amount: 0,\n addons: {}\n };\n }\n if (!addon) {\n acc[tier].amount += amount;\n } else {\n acc[tier].addons[addon] = (acc[tier].addons[addon] ?? 0) + amount;\n }\n return acc;\n }, {});\n\nexport const convertToBackendSPLimits = (\n limits: Record<string, number | string>,\n spLimits: Record<string, object>\n): Record<string, { Name: string; value: number }> =>\n Object.fromEntries(\n Object.entries(limits)\n .filter(([key]) => !!spLimits[key])\n .map(([key, limit]) => {\n const backendId = (spLimits[key] as { backendId: string }).backendId;\n return [backendId, { Name: backendId, value: Number(limit) || 0 }];\n })\n );\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@northern.tech/store",
3
- "version": "0.36.0",
3
+ "version": "0.36.2",
4
4
  "license": "Apache-2.0",
5
5
  "private": false,
6
6
  "publishConfig": {
@@ -123,14 +123,14 @@
123
123
  "@northern.tech/eslint-config": "*",
124
124
  "@northern.tech/testing": "*",
125
125
  "@northern.tech/typescript-config": "*",
126
- "@types/react": "^19.x",
126
+ "@types/react": "^19.2.16",
127
127
  "@types/react-dom": "^19.x",
128
- "@vitejs/plugin-react": "^6.0.1",
128
+ "@vitejs/plugin-react": "^6.0.2",
129
129
  "eslint": "^9.39.1",
130
130
  "jsdom": "29.1.1",
131
- "msw": "^2.14.2",
132
- "tsdown": "^0.22.0",
133
- "vitest": "^4.1.5"
131
+ "msw": "^2.14.6",
132
+ "tsdown": "^0.22.1",
133
+ "vitest": "^4.1.8"
134
134
  },
135
135
  "dependencies": {
136
136
  "@emotion/react": "^11.x",
@@ -148,7 +148,7 @@
148
148
  "react": "^19.x",
149
149
  "react-dom": "^19.x",
150
150
  "react-redux": "^9.x",
151
- "react-router-dom": "^7.x",
151
+ "react-router": "^7.x",
152
152
  "universal-cookie": "^8.x",
153
153
  "validator": "^13.x"
154
154
  }
@@ -1,168 +0,0 @@
1
- import { T as SortOptions } from "./constants-BrGIx40B.cjs";
2
- import * as _$_reduxjs_toolkit0 from "@reduxjs/toolkit";
3
- import { PayloadAction } from "@reduxjs/toolkit";
4
- import * as _$immer from "immer";
5
- import * as _$redux from "redux";
6
- import { ArtifactV1, ArtifactV2, DeltaJobDetailsItem, DeltaJobsListItem, Manifest, ReleaseV1, ReleaseV2, Software, Tags, Update } from "@northern.tech/types/MenderTypes";
7
-
8
- //#region src/releasesSlice/index.d.ts
9
- type Update$1 = Omit<Update, 'meta_data'>;
10
- type Artifact = Omit<ArtifactV1, 'updates'> & Omit<ArtifactV2, 'updates'> & {
11
- installCount?: number;
12
- updates?: Array<Update$1>;
13
- url?: string;
14
- };
15
- type Release = ReleaseV1 & ReleaseV2 & {
16
- artifacts: Artifact[];
17
- device_types_compatible: string[];
18
- name: string;
19
- };
20
- type SoftwareKind = Software['kind'];
21
- declare const sliceName = "releases";
22
- type EnhancedJobDetailsItem = DeltaJobDetailsItem & DeltaJobsListItem;
23
- type ReleasesList = {
24
- isLoading?: boolean;
25
- page: number;
26
- perPage: number;
27
- releaseIds: string[];
28
- searchedIds: string[];
29
- searchOnly?: boolean;
30
- searchTerm: string;
31
- searchTotal: number;
32
- selectedTags: string[];
33
- selection: number[];
34
- sort?: SortOptions;
35
- total: number;
36
- type: string;
37
- };
38
- type ManifestsList = {
39
- isLoading?: boolean;
40
- manifestIds: string[];
41
- page: number;
42
- perPage: number;
43
- searchTerm: string;
44
- searchTotal: number;
45
- selectedTags: string[];
46
- selection: number[];
47
- sort?: SortOptions;
48
- total: number;
49
- };
50
- type SoftwareList = {
51
- isLoading?: boolean;
52
- kind: SoftwareKind | undefined;
53
- page: number;
54
- perPage: number;
55
- searchTerm: string;
56
- searchTotal: number;
57
- selectedTags: string[];
58
- softwareIds: string[];
59
- sort?: SortOptions;
60
- total: number;
61
- type: string;
62
- };
63
- type ReleaseSliceType = {
64
- artifacts: never[];
65
- byId: Record<string, Release>;
66
- deltaJobs: Record<string, EnhancedJobDetailsItem>;
67
- deltaJobsList: {
68
- jobIds: string[];
69
- page: number;
70
- perPage: number;
71
- sort?: SortOptions;
72
- total: 0;
73
- };
74
- manifestsById: Record<string, Manifest>;
75
- manifestsList: ManifestsList;
76
- releasesList: ReleasesList;
77
- selectedJob: string | null;
78
- selectedManifest: string | null;
79
- selectedRelease: string | null;
80
- softwareById: Record<string, Software>;
81
- softwareList: SoftwareList;
82
- tab?: 'releases' | 'delta' | 'manifests';
83
- tags: Record<'releases' | 'manifests' | 'software', Tags>;
84
- updateTypes: string[];
85
- };
86
- declare const initialState: ReleaseSliceType;
87
- declare const releaseSlice: _$_reduxjs_toolkit0.Slice<ReleaseSliceType, {
88
- receiveRelease: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Release>) => void;
89
- receiveReleases: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Record<string, Release>>) => void;
90
- receiveSoftwareTags: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Tags>) => void;
91
- receiveReleaseTags: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Tags>) => void;
92
- receiveReleaseTypes: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string[]>) => void;
93
- removeRelease: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string>) => void;
94
- selectedRelease: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string | null>) => void;
95
- setReleaseListState: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
96
- payload: any;
97
- type: string;
98
- }) => void;
99
- receivedDeltaJobs: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
100
- payload: any;
101
- type: string;
102
- }) => void;
103
- receivedDeltaJobDetails: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
104
- payload: any;
105
- type: string;
106
- }) => void;
107
- setDeltaJobsListState: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
108
- payload: any;
109
- type: string;
110
- }) => void;
111
- setSelectedJob: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
112
- payload: any;
113
- type: string;
114
- }) => void;
115
- setActiveTab: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<"releases" | "delta" | "manifests">) => void;
116
- receiveManifest: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Manifest>) => void;
117
- receiveManifests: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Record<string, Manifest>>) => void;
118
- receiveManifestTags: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Tags>) => void;
119
- removeManifest: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string>) => void;
120
- removeManifests: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string[]>) => void;
121
- selectedManifest: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string | null>) => void;
122
- setManifestsListState: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<ManifestsList>) => void;
123
- receiveSoftwareItems: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Record<string, Software>>) => void;
124
- setSoftwareListState: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<SoftwareList>) => void;
125
- }, "releases", "releases", _$_reduxjs_toolkit0.SliceSelectors<ReleaseSliceType>>;
126
- declare const actions: _$_reduxjs_toolkit0.CaseReducerActions<{
127
- receiveRelease: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Release>) => void;
128
- receiveReleases: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Record<string, Release>>) => void;
129
- receiveSoftwareTags: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Tags>) => void;
130
- receiveReleaseTags: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Tags>) => void;
131
- receiveReleaseTypes: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string[]>) => void;
132
- removeRelease: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string>) => void;
133
- selectedRelease: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string | null>) => void;
134
- setReleaseListState: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
135
- payload: any;
136
- type: string;
137
- }) => void;
138
- receivedDeltaJobs: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
139
- payload: any;
140
- type: string;
141
- }) => void;
142
- receivedDeltaJobDetails: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
143
- payload: any;
144
- type: string;
145
- }) => void;
146
- setDeltaJobsListState: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
147
- payload: any;
148
- type: string;
149
- }) => void;
150
- setSelectedJob: (state: _$immer.WritableDraft<ReleaseSliceType>, action: {
151
- payload: any;
152
- type: string;
153
- }) => void;
154
- setActiveTab: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<"releases" | "delta" | "manifests">) => void;
155
- receiveManifest: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Manifest>) => void;
156
- receiveManifests: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Record<string, Manifest>>) => void;
157
- receiveManifestTags: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Tags>) => void;
158
- removeManifest: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string>) => void;
159
- removeManifests: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string[]>) => void;
160
- selectedManifest: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<string | null>) => void;
161
- setManifestsListState: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<ManifestsList>) => void;
162
- receiveSoftwareItems: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<Record<string, Software>>) => void;
163
- setSoftwareListState: (state: _$immer.WritableDraft<ReleaseSliceType>, action: PayloadAction<SoftwareList>) => void;
164
- }, "releases">;
165
- declare const _default: _$redux.Reducer<ReleaseSliceType>;
166
- //#endregion
167
- export { ReleasesList as a, _default as c, releaseSlice as d, sliceName as f, ReleaseSliceType as i, actions as l, ManifestsList as n, SoftwareKind as o, Release as r, SoftwareList as s, Artifact as t, initialState as u };
168
- //# sourceMappingURL=index-B3IF6ur9.d.cts.map