@scality/data-browser-library 1.0.0-preview.9 → 1.0.1

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 (285) hide show
  1. package/dist/components/DataBrowserUI.d.ts +12 -0
  2. package/dist/components/DataBrowserUI.js +99 -0
  3. package/dist/components/Editor.d.ts +1 -1
  4. package/dist/components/Editor.js +3 -3
  5. package/dist/components/__tests__/BucketAccessor.test.js +214 -0
  6. package/dist/components/__tests__/BucketCorsPage.test.d.ts +1 -0
  7. package/dist/components/__tests__/BucketCorsPage.test.js +263 -0
  8. package/dist/components/__tests__/BucketCreate.test.js +271 -105
  9. package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
  10. package/dist/components/__tests__/BucketDetails.test.js +421 -0
  11. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +13 -0
  12. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +178 -178
  13. package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
  14. package/dist/components/__tests__/BucketList.test.js +463 -239
  15. package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
  16. package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
  17. package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
  18. package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
  19. package/dist/components/__tests__/BucketOverview.test.js +281 -266
  20. package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
  21. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +15 -0
  22. package/dist/components/__tests__/BucketReplicationFormPage.test.js +544 -544
  23. package/dist/components/__tests__/BucketReplicationList.test.js +106 -106
  24. package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
  25. package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
  26. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
  27. package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
  28. package/dist/components/__tests__/EmptyBucketButton.test.js +59 -59
  29. package/dist/components/__tests__/MetadataSearch.test.js +65 -65
  30. package/dist/components/__tests__/ObjectList.test.js +741 -240
  31. package/dist/components/__tests__/UploadButton.test.js +45 -45
  32. package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
  33. package/dist/components/breadcrumb/Breadcrumb.js +37 -0
  34. package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
  35. package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
  36. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
  37. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
  38. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
  39. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
  40. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
  41. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
  42. package/dist/components/breadcrumb/index.d.ts +8 -0
  43. package/dist/components/breadcrumb/index.js +4 -0
  44. package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
  45. package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
  46. package/dist/components/buckets/BucketAccessor.d.ts +2 -0
  47. package/dist/components/buckets/BucketAccessor.js +125 -0
  48. package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
  49. package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
  50. package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
  51. package/dist/components/buckets/BucketCorsPage.js +234 -0
  52. package/dist/components/buckets/BucketCreate.d.ts +3 -2
  53. package/dist/components/buckets/BucketCreate.js +89 -47
  54. package/dist/components/buckets/BucketDetails.d.ts +42 -0
  55. package/dist/components/buckets/BucketDetails.js +249 -85
  56. package/dist/components/buckets/BucketLifecycleFormPage.js +206 -190
  57. package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
  58. package/dist/components/buckets/BucketLifecycleList.js +47 -47
  59. package/dist/components/buckets/BucketList.d.ts +7 -8
  60. package/dist/components/buckets/BucketList.js +158 -101
  61. package/dist/components/buckets/BucketLocation.js +4 -4
  62. package/dist/components/buckets/BucketOverview.d.ts +22 -2
  63. package/dist/components/buckets/BucketOverview.js +394 -187
  64. package/dist/components/buckets/BucketPage.js +43 -21
  65. package/dist/components/buckets/BucketPolicyPage.js +155 -127
  66. package/dist/components/buckets/BucketReplicationFormPage.js +134 -133
  67. package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
  68. package/dist/components/buckets/BucketReplicationList.js +42 -42
  69. package/dist/components/buckets/BucketVersioning.d.ts +4 -0
  70. package/dist/components/buckets/BucketVersioning.js +76 -0
  71. package/dist/components/buckets/DeleteBucketButton.js +8 -8
  72. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +2 -2
  73. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +2 -2
  74. package/dist/components/buckets/EmptyBucketButton.js +24 -24
  75. package/dist/components/buckets/EmptyBucketSummary.d.ts +2 -2
  76. package/dist/components/buckets/EmptyBucketSummary.js +1 -1
  77. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +1 -1
  78. package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
  79. package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
  80. package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
  81. package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
  82. package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
  83. package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
  84. package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
  85. package/dist/components/buckets/notifications/EventsSection.js +145 -29
  86. package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
  87. package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
  88. package/dist/components/buckets/notifications/events.d.ts +71 -7
  89. package/dist/components/buckets/notifications/events.js +98 -16
  90. package/dist/components/index.d.ts +27 -20
  91. package/dist/components/index.js +17 -10
  92. package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
  93. package/dist/components/layouts/ArrowNavigation.js +28 -0
  94. package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
  95. package/dist/components/layouts/BrowserPageLayout.js +10 -5
  96. package/dist/components/objects/CreateFolderButton.d.ts +2 -2
  97. package/dist/components/objects/CreateFolderButton.js +12 -12
  98. package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
  99. package/dist/components/objects/DeleteObjectButton.js +19 -21
  100. package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
  101. package/dist/components/objects/GetPresignedUrlButton.js +255 -0
  102. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
  103. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +263 -230
  104. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
  105. package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
  106. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
  107. package/dist/components/objects/ObjectDetails/ObjectTags.js +95 -123
  108. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
  109. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
  110. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
  111. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
  112. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  113. package/dist/components/objects/ObjectDetails/index.js +152 -40
  114. package/dist/components/objects/ObjectList.d.ts +12 -10
  115. package/dist/components/objects/ObjectList.js +590 -263
  116. package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
  117. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
  118. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
  119. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
  120. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
  121. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
  122. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
  123. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
  124. package/dist/components/objects/ObjectPage.js +12 -8
  125. package/dist/components/objects/UploadButton.d.ts +3 -3
  126. package/dist/components/objects/UploadButton.js +10 -10
  127. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  128. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  129. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  130. package/dist/components/providers/DataBrowserProvider.js +60 -38
  131. package/dist/components/providers/QueryProvider.d.ts +9 -0
  132. package/dist/components/providers/QueryProvider.js +21 -0
  133. package/dist/components/search/MetadataSearch.js +29 -28
  134. package/dist/components/search/SearchHints.js +1 -1
  135. package/dist/components/ui/ArrayFieldActions.js +12 -7
  136. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
  137. package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
  138. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  139. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  140. package/dist/components/ui/FilterFormSection.d.ts +2 -2
  141. package/dist/components/ui/FilterFormSection.js +29 -29
  142. package/dist/components/ui/Search.elements.d.ts +2 -2
  143. package/dist/components/ui/Search.elements.js +7 -7
  144. package/dist/components/ui/Table.elements.d.ts +2 -1
  145. package/dist/components/ui/Table.elements.js +18 -12
  146. package/dist/config/__tests__/factory.test.d.ts +1 -0
  147. package/dist/config/__tests__/factory.test.js +311 -0
  148. package/dist/config/factory.d.ts +10 -56
  149. package/dist/config/factory.js +23 -71
  150. package/dist/config/types.d.ts +212 -34
  151. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  152. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  153. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  154. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  155. package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
  156. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  157. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  158. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  159. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  160. package/dist/hooks/bucketConfiguration.js +52 -51
  161. package/dist/hooks/bucketOperations.d.ts +10 -1
  162. package/dist/hooks/bucketOperations.js +10 -9
  163. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  164. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  165. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  166. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  167. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
  168. package/dist/hooks/factories/index.d.ts +4 -4
  169. package/dist/hooks/factories/index.js +2 -2
  170. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  171. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  172. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  173. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  174. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  175. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  176. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  177. package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
  178. package/dist/hooks/index.d.ts +19 -12
  179. package/dist/hooks/index.js +16 -9
  180. package/dist/hooks/loginOperations.d.ts +1 -1
  181. package/dist/hooks/loginOperations.js +1 -1
  182. package/dist/hooks/objectOperations.d.ts +2 -2
  183. package/dist/hooks/objectOperations.js +50 -49
  184. package/dist/hooks/presignedOperations.d.ts +4 -4
  185. package/dist/hooks/presignedOperations.js +5 -5
  186. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  187. package/dist/hooks/useAccessibleBuckets.js +115 -0
  188. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  189. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  190. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  191. package/dist/hooks/useBucketConfigEditor.js +82 -0
  192. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  193. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  194. package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
  195. package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
  196. package/dist/hooks/useEmptyBucket.js +11 -11
  197. package/dist/hooks/useFeatures.d.ts +7 -0
  198. package/dist/hooks/useFeatures.js +8 -0
  199. package/dist/hooks/useISVBucketDetection.js +6 -6
  200. package/dist/hooks/useIsBucketEmpty.js +4 -4
  201. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  202. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  203. package/dist/hooks/useS3Client.d.ts +6 -0
  204. package/dist/hooks/useS3Client.js +3 -2
  205. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  206. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  207. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  208. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  209. package/dist/index.d.ts +6 -6
  210. package/dist/index.js +2 -2
  211. package/dist/schemas/bucketPolicySchema.json +3 -13
  212. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  213. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  214. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  215. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  216. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  217. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  218. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  219. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  220. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  221. package/dist/test/msw/handlers/headObject.js +31 -13
  222. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  223. package/dist/test/msw/handlers/listBuckets.js +5 -3
  224. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  225. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  226. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  227. package/dist/test/msw/handlers/listObjects.js +35 -23
  228. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  229. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  230. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  231. package/dist/test/msw/handlers/objectRetention.js +31 -17
  232. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  233. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  234. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  235. package/dist/test/msw/handlers/putObject.js +27 -12
  236. package/dist/test/msw/handlers.d.ts +3 -3
  237. package/dist/test/msw/handlers.js +77 -54
  238. package/dist/test/msw/index.d.ts +2 -2
  239. package/dist/test/msw/index.js +1 -1
  240. package/dist/test/msw/server.d.ts +1 -1
  241. package/dist/test/msw/server.js +1 -1
  242. package/dist/test/msw/utils.js +2 -2
  243. package/dist/test/setup.d.ts +1 -1
  244. package/dist/test/setup.js +13 -30
  245. package/dist/test/testUtils.d.ts +85 -33
  246. package/dist/test/testUtils.js +176 -111
  247. package/dist/test/utils/errorHandling.test.js +119 -119
  248. package/dist/types/index.d.ts +49 -36
  249. package/dist/types/monaco.d.ts +13 -0
  250. package/dist/types/monaco.js +0 -0
  251. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  252. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  253. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  254. package/dist/utils/__tests__/s3Client.test.js +340 -0
  255. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  256. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  257. package/dist/utils/constants.d.ts +10 -0
  258. package/dist/utils/constants.js +19 -9
  259. package/dist/utils/deletion/index.d.ts +2 -2
  260. package/dist/utils/deletion/index.js +1 -1
  261. package/dist/utils/deletion/messages.d.ts +1 -1
  262. package/dist/utils/deletion/messages.js +4 -4
  263. package/dist/utils/errorHandling.d.ts +3 -3
  264. package/dist/utils/errorHandling.js +6 -6
  265. package/dist/utils/hooks.js +8 -8
  266. package/dist/utils/index.d.ts +5 -4
  267. package/dist/utils/index.js +4 -2
  268. package/dist/utils/proxyMiddleware.d.ts +32 -13
  269. package/dist/utils/proxyMiddleware.js +90 -36
  270. package/dist/utils/s3Client.d.ts +14 -4
  271. package/dist/utils/s3Client.js +5 -26
  272. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  273. package/dist/utils/s3ConfigIdentifier.js +57 -0
  274. package/dist/utils/s3RuleUtils.d.ts +5 -5
  275. package/dist/utils/s3RuleUtils.js +17 -17
  276. package/package.json +10 -8
  277. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  278. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  279. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  280. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  281. package/dist/hooks/useLoginMutation.d.ts +0 -21
  282. package/dist/hooks/useLoginMutation.js +0 -9
  283. package/dist/utils/useFeatures.d.ts +0 -1
  284. package/dist/utils/useFeatures.js +0 -7
  285. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -1,46 +1,224 @@
1
1
  /**
2
- * Build-time configuration types injected by RSBuild
2
+ * Runtime configuration types
3
3
  */
4
- export interface S3Configuration {
4
+ import type { Bucket } from '@aws-sdk/client-s3';
5
+ import type { TableItem } from '../components/objects/ObjectList';
6
+ /**
7
+ * Proxy configuration for development or custom proxy setups
8
+ *
9
+ * This enables proper S3 request signing through a proxy:
10
+ * 1. Requests are signed using the target S3 service endpoint
11
+ * 2. Signed requests are routed through the proxy endpoint
12
+ *
13
+ * Uses discriminated union for type safety: when enabled=true, target is required.
14
+ *
15
+ * @example Local development
16
+ * ```typescript
17
+ * {
18
+ * enabled: true,
19
+ * endpoint: "http://localhost:3000/api/s3",
20
+ * target: "https://s3.amazonaws.com"
21
+ * }
22
+ * ```
23
+ *
24
+ * @example Kubernetes/Gateway with origin-relative path
25
+ * ```typescript
26
+ * {
27
+ * enabled: true,
28
+ * endpoint: "/zenko/s3", // Uses window.location.origin
29
+ * target: "http://s3.pod-choco.local" // Internal service
30
+ * }
31
+ * ```
32
+ *
33
+ * @example Using origin keyword
34
+ * ```typescript
35
+ * {
36
+ * enabled: true,
37
+ * endpoint: "origin", // Uses window.location.origin
38
+ * target: "http://s3.internal.local"
39
+ * }
40
+ * ```
41
+ *
42
+ * @example Disabled proxy
43
+ * ```typescript
44
+ * {
45
+ * enabled: false,
46
+ * endpoint: "http://localhost:3000/api/s3",
47
+ * // target is optional when disabled
48
+ * }
49
+ * ```
50
+ */
51
+ export type ProxyConfiguration = {
52
+ /** Proxy is disabled */
53
+ enabled: false;
54
+ /**
55
+ * Proxy endpoint where requests are sent.
56
+ *
57
+ * Supports three formats:
58
+ * - Full URL: `"http://localhost:3000/api/s3"`
59
+ * - Origin-relative path: `"/api/s3"` (prepends window.location.origin)
60
+ * - Special keyword: `"origin"` (uses window.location.origin)
61
+ */
5
62
  endpoint: string;
6
- region: string;
7
- realHost: string;
8
- forcePathStyle: boolean;
63
+ /**
64
+ * Target S3 service endpoint for request signing (optional when disabled).
65
+ *
66
+ * Supports:
67
+ * - Full URL: `"http://s3.amazonaws.com:9000"`
68
+ * - Hostname only: `"s3.pod-choco.local"` (defaults to http://)
69
+ */
70
+ target?: string;
71
+ } | {
72
+ /** Proxy is enabled */
73
+ enabled: true;
74
+ /**
75
+ * Proxy endpoint where requests are sent.
76
+ *
77
+ * Supports three formats:
78
+ * - Full URL: `"http://localhost:3000/api/s3"`
79
+ * - Origin-relative path: `"/api/s3"` (prepends window.location.origin)
80
+ * - Special keyword: `"origin"` (uses window.location.origin)
81
+ */
82
+ endpoint: string;
83
+ /**
84
+ * Target S3 service endpoint for request signing (required when enabled).
85
+ * Requests are signed as if going to this endpoint, then routed through proxy.
86
+ *
87
+ * Supports:
88
+ * - Full URL: `"http://s3.amazonaws.com:9000"`
89
+ * - Hostname only: `"s3.pod-choco.local"` (defaults to http://)
90
+ */
91
+ target: string;
92
+ };
93
+ /**
94
+ * Column configuration for lists (bucket list, object list)
95
+ */
96
+ export interface ColumnConfig<T = unknown> {
97
+ id: keyof T | (string & {});
98
+ header: string;
99
+ width?: number | string;
100
+ render: React.ComponentType<{
101
+ data: T;
102
+ }>;
103
+ cellStyle?: React.CSSProperties;
104
+ }
105
+ /**
106
+ * Action configuration for list-level actions (buttons at top of list)
107
+ */
108
+ export interface ActionConfig {
109
+ id: string;
110
+ render: () => React.ReactNode;
9
111
  }
10
- export interface DevelopmentConfiguration {
11
- useProxy: boolean;
12
- proxyEndpoint?: string;
13
- proxyBasePath: string;
14
- proxyHost: string;
15
- proxyPort: number;
112
+ /**
113
+ * Tab configuration for detail pages
114
+ */
115
+ export interface TabConfig {
116
+ id: string;
117
+ title: string;
118
+ path?: string;
119
+ render: () => React.ReactNode;
120
+ hidden?: boolean;
121
+ withoutPadding?: boolean;
122
+ }
123
+ /**
124
+ * Field configuration for overview sections
125
+ *
126
+ * Default field IDs by section:
127
+ * - General: "name", "versioning", "location"
128
+ * - Data Protection: "objectLock", "defaultRetention"
129
+ * - Permissions: "owner", "acl", "cors", "public", "bucketPolicy"
130
+ */
131
+ export interface FieldConfig {
132
+ id: string;
133
+ label?: string;
134
+ render: React.ComponentType<{
135
+ entityName: string;
136
+ }>;
16
137
  }
17
- export interface BuildTimeConfig {
18
- s3: S3Configuration;
19
- dev: DevelopmentConfiguration;
20
- isDevelopment: boolean;
21
- isProduction: boolean;
138
+ /**
139
+ * Section configuration for overview pages
140
+ */
141
+ export interface SectionConfig {
142
+ id: string;
143
+ title: string;
144
+ render: () => React.ReactNode;
22
145
  }
23
146
  /**
24
- * Runtime configuration for S3 client
147
+ * Storage class selector props
25
148
  */
26
- export interface S3ClientConfiguration {
27
- endpoint: string;
28
- region: string;
29
- forcePathStyle: boolean;
30
- useProxy: boolean;
31
- proxyConfig?: {
32
- realHost: string;
33
- proxyBasePath: string;
34
- proxyHost: string;
35
- proxyPort: number;
36
- };
149
+ export interface StorageClassSelectorProps {
150
+ value: string;
151
+ onChange: (newValue: string) => void;
37
152
  }
38
153
  /**
39
- * Global type declarations for build-time constants
154
+ * Main DataBrowserUI component props
40
155
  */
41
- declare global {
42
- const __S3_CONFIG__: S3Configuration;
43
- const __DEV_CONFIG__: DevelopmentConfiguration;
44
- const __IS_DEVELOPMENT__: boolean;
45
- const __IS_PRODUCTION__: boolean;
156
+ export interface DataBrowserUIProps {
157
+ basePath?: string;
158
+ /**
159
+ * Custom header component to render above the main content.
160
+ * Typically used for breadcrumbs or navigation.
161
+ */
162
+ header?: React.ReactNode;
163
+ storageClassSelector?: React.ComponentType<StorageClassSelectorProps>;
164
+ extraBucketListColumns?: ColumnConfig<Bucket>[];
165
+ extraBucketListActions?: ActionConfig[];
166
+ extraBucketTabs?: TabConfig[];
167
+ extraBucketOverviewGeneral?: FieldConfig[];
168
+ extraBucketOverviewDataProtection?: FieldConfig[];
169
+ extraBucketOverviewPermissions?: FieldConfig[];
170
+ extraBucketOverviewSections?: SectionConfig[];
171
+ /**
172
+ * Extra columns for object list.
173
+ *
174
+ * Default column IDs for replacement:
175
+ * - "name" - Name column (file/folder icon, legal hold indicator)
176
+ * - "versionId" - Version ID column (only shown when versions enabled)
177
+ * - "lastModified" - Modified on column
178
+ * - "size" - Size column
179
+ * - "storageClass" - Storage Location column
180
+ *
181
+ * Extra columns are inserted between Version ID and Modified on.
182
+ */
183
+ extraObjectListColumns?: ColumnConfig<TableItem>[];
184
+ /**
185
+ * Extra actions for object list header.
186
+ *
187
+ * Default action IDs for replacement:
188
+ * - "upload" - Upload button
189
+ * - "createFolder" - Create Folder button
190
+ * - "delete" - Delete Object button
191
+ */
192
+ extraObjectListActions?: ActionConfig[];
193
+ /**
194
+ * Extra tabs for object details page.
195
+ *
196
+ * Default tab IDs for replacement:
197
+ * - "summary" - Summary tab
198
+ * - "metadata" - Metadata tab
199
+ * - "tags" - Tags tab
200
+ */
201
+ extraObjectTabs?: TabConfig[];
202
+ /**
203
+ * Extra fields for object summary Information section.
204
+ *
205
+ * Default field IDs for replacement:
206
+ * - "name" - Name field
207
+ * - "versionId" - Version ID field
208
+ * - "size" - Size field
209
+ * - "lastModified" - Modified On field
210
+ * - "etag" - ETag field
211
+ * - "location" - Location field
212
+ */
213
+ extraObjectSummaryInformation?: FieldConfig[];
214
+ /**
215
+ * Extra fields for object summary Data Protection section.
216
+ *
217
+ * Default field IDs for replacement:
218
+ * - "lock" - Lock (Retention) field
219
+ * - "legalHold" - Legal Hold field
220
+ */
221
+ extraObjectSummaryDataProtection?: FieldConfig[];
46
222
  }
223
+ export type S3EventType = 's3:ObjectCreated:*' | 's3:ObjectCreated:Put' | 's3:ObjectCreated:Post' | 's3:ObjectCreated:Copy' | 's3:ObjectCreated:CompleteMultipartUpload' | 's3:ObjectRemoved:*' | 's3:ObjectRemoved:Delete' | 's3:ObjectRemoved:DeleteMarkerCreated' | 's3:ObjectRestore:*' | 's3:ObjectRestore:Post' | 's3:ObjectRestore:Completed' | 's3:ObjectRestore:Delete' | 's3:LifecycleExpiration:*' | 's3:LifecycleExpiration:Delete' | 's3:LifecycleExpiration:DeleteMarkerCreated' | 's3:LifecycleTransition' | 's3:Replication:*' | 's3:Replication:OperationFailedReplication' | 's3:Replication:OperationMissedThreshold' | 's3:Replication:OperationReplicatedAfterThreshold' | 's3:Replication:OperationNotTracked' | 's3:ObjectTagging:*' | 's3:ObjectTagging:Put' | 's3:ObjectTagging:Delete' | 's3:ReducedRedundancyLostObject' | 's3:IntelligentTiering' | 's3:ObjectAcl:Put' | 's3:TestEvent';
224
+ export type S3EventCategory = 'Object Creation' | 'Object Deletion' | 'Object Restoration' | 'Lifecycle' | 'Replication' | 'Object Tagging' | 'Storage & Access' | 'Testing';
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Internal UI customization context for DataBrowserUI.
3
+ * NOT intended for external use - all configuration should be passed as props to DataBrowserUI.
4
+ *
5
+ * @internal
6
+ */
7
+ import type React from 'react';
8
+ import type { DataBrowserUIProps } from '../config/types';
9
+ interface DataBrowserUICustomizationProviderProps {
10
+ config: DataBrowserUIProps;
11
+ children: React.ReactNode;
12
+ }
13
+ /**
14
+ * Internal provider for DataBrowserUI customization options.
15
+ * @internal
16
+ */
17
+ export declare const DataBrowserUICustomizationProvider: React.FC<DataBrowserUICustomizationProviderProps>;
18
+ /**
19
+ * Internal hook to access DataBrowserUI customization options (extra columns, actions, tabs, etc.).
20
+ * Always returns a valid configuration object (empty object if no customizations provided).
21
+ *
22
+ * @internal
23
+ * @returns {DataBrowserUIProps} The UI customization options
24
+ * @throws {Error} If used outside of DataBrowserUICustomizationProvider
25
+ */
26
+ export declare const useDataBrowserUICustomization: () => DataBrowserUIProps;
27
+ export {};
@@ -0,0 +1,13 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext } from "react";
3
+ const DataBrowserUICustomizationContext = /*#__PURE__*/ createContext(void 0);
4
+ const DataBrowserUICustomizationProvider = ({ config, children })=>/*#__PURE__*/ jsx(DataBrowserUICustomizationContext.Provider, {
5
+ value: config,
6
+ children: children
7
+ });
8
+ const useDataBrowserUICustomization = ()=>{
9
+ const context = useContext(DataBrowserUICustomizationContext);
10
+ if (void 0 === context) throw new Error("useDataBrowserUICustomization must be used within DataBrowserUI component. Ensure your component is rendered inside <DataBrowserUI>.");
11
+ return context;
12
+ };
13
+ export { DataBrowserUICustomizationProvider, useDataBrowserUICustomization };
@@ -0,0 +1,145 @@
1
+ import { act } from "@testing-library/react";
2
+ import { renderHookWithWrapper, testConfig, testCredentials } from "../../test/testUtils.js";
3
+ import { computeS3ConfigIdentifier } from "../../utils/s3ConfigIdentifier.js";
4
+ import { useAccessibleBuckets } from "../useAccessibleBuckets.js";
5
+ describe('useAccessibleBuckets', ()=>{
6
+ const mockS3ConfigIdentifier = computeS3ConfigIdentifier({
7
+ ...testConfig,
8
+ credentials: testCredentials
9
+ });
10
+ const storageKey = `data-browser-accessible-buckets-${mockS3ConfigIdentifier}`;
11
+ const flagKey = `data-browser-limited-access-${mockS3ConfigIdentifier}`;
12
+ beforeEach(()=>{
13
+ sessionStorage.clear();
14
+ jest.clearAllMocks();
15
+ });
16
+ afterEach(()=>{
17
+ sessionStorage.clear();
18
+ });
19
+ it('starts with empty bucket list and no limited access flag', ()=>{
20
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
21
+ expect(result.current.accessibleBuckets).toEqual([]);
22
+ expect(result.current.hasLimitedAccess).toBe(false);
23
+ });
24
+ it('loads existing buckets from session on mount', ()=>{
25
+ sessionStorage.setItem(storageKey, JSON.stringify([
26
+ 'bucket1',
27
+ 'bucket2'
28
+ ]));
29
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
30
+ expect(result.current.accessibleBuckets).toHaveLength(2);
31
+ expect(result.current.accessibleBuckets[0].Name).toBe('bucket1');
32
+ expect(result.current.accessibleBuckets[1].Name).toBe('bucket2');
33
+ });
34
+ it('loads limited access flag from session on mount', ()=>{
35
+ sessionStorage.setItem(flagKey, 'true');
36
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
37
+ expect(result.current.hasLimitedAccess).toBe(true);
38
+ });
39
+ it('handles corrupted session data gracefully', ()=>{
40
+ sessionStorage.setItem(storageKey, 'invalid-json');
41
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
42
+ expect(result.current.accessibleBuckets).toEqual([]);
43
+ });
44
+ it('adds a bucket to the accessible list', ()=>{
45
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
46
+ act(()=>{
47
+ result.current.addAccessibleBucket('new-bucket');
48
+ });
49
+ expect(result.current.accessibleBuckets).toHaveLength(1);
50
+ expect(result.current.accessibleBuckets[0].Name).toBe('new-bucket');
51
+ });
52
+ it('prevents duplicate buckets from being added', ()=>{
53
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
54
+ act(()=>{
55
+ result.current.addAccessibleBucket('duplicate-bucket');
56
+ result.current.addAccessibleBucket('duplicate-bucket');
57
+ });
58
+ expect(result.current.accessibleBuckets).toHaveLength(1);
59
+ });
60
+ it('adds multiple unique buckets', ()=>{
61
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
62
+ act(()=>{
63
+ result.current.addAccessibleBucket('bucket1');
64
+ result.current.addAccessibleBucket('bucket2');
65
+ result.current.addAccessibleBucket('bucket3');
66
+ });
67
+ expect(result.current.accessibleBuckets).toHaveLength(3);
68
+ expect(result.current.accessibleBuckets.map((b)=>b.Name)).toEqual([
69
+ 'bucket1',
70
+ 'bucket2',
71
+ 'bucket3'
72
+ ]);
73
+ });
74
+ it('toggles limited access mode', ()=>{
75
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
76
+ act(()=>{
77
+ result.current.setLimitedAccess(true);
78
+ });
79
+ expect(result.current.hasLimitedAccess).toBe(true);
80
+ act(()=>{
81
+ result.current.setLimitedAccess(false);
82
+ });
83
+ expect(result.current.hasLimitedAccess).toBe(false);
84
+ });
85
+ it('clears all accessible buckets and resets limited access', ()=>{
86
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
87
+ act(()=>{
88
+ result.current.addAccessibleBucket('bucket1');
89
+ result.current.addAccessibleBucket('bucket2');
90
+ result.current.setLimitedAccess(true);
91
+ });
92
+ expect(result.current.accessibleBuckets).toHaveLength(2);
93
+ expect(result.current.hasLimitedAccess).toBe(true);
94
+ act(()=>{
95
+ result.current.clearAccessibleBuckets();
96
+ });
97
+ expect(result.current.accessibleBuckets).toEqual([]);
98
+ expect(result.current.hasLimitedAccess).toBe(false);
99
+ });
100
+ it('handles storage quota errors without crashing', ()=>{
101
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
102
+ jest.spyOn(Storage.prototype, 'setItem').mockImplementationOnce(()=>{
103
+ throw new Error('Storage quota exceeded');
104
+ });
105
+ expect(()=>{
106
+ act(()=>{
107
+ result.current.addAccessibleBucket('new-bucket');
108
+ });
109
+ }).not.toThrow();
110
+ });
111
+ it('returns buckets with required S3 properties', ()=>{
112
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
113
+ act(()=>{
114
+ result.current.addAccessibleBucket('test-bucket');
115
+ });
116
+ const bucket = result.current.accessibleBuckets[0];
117
+ expect(bucket).toHaveProperty('Name', 'test-bucket');
118
+ expect(bucket).toHaveProperty('CreationDate');
119
+ expect(bucket.CreationDate).toBeInstanceOf(Date);
120
+ });
121
+ it('maintains consistent CreationDate for added buckets', ()=>{
122
+ const { result: result1 } = renderHookWithWrapper(()=>useAccessibleBuckets());
123
+ act(()=>{
124
+ result1.current.addAccessibleBucket('consistent-bucket');
125
+ });
126
+ const firstCreationDate = result1.current.accessibleBuckets[0].CreationDate;
127
+ expect(firstCreationDate).toBeInstanceOf(Date);
128
+ const { result: result2 } = renderHookWithWrapper(()=>useAccessibleBuckets());
129
+ const secondCreationDate = result2.current.accessibleBuckets[0].CreationDate;
130
+ expect(secondCreationDate).toBeInstanceOf(Date);
131
+ expect(firstCreationDate.getTime()).toBe(secondCreationDate.getTime());
132
+ });
133
+ it('migrates legacy string array format to new format', ()=>{
134
+ sessionStorage.setItem(storageKey, JSON.stringify([
135
+ 'legacy-bucket'
136
+ ]));
137
+ const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
138
+ expect(result.current.accessibleBuckets).toHaveLength(1);
139
+ expect(result.current.accessibleBuckets[0].Name).toBe('legacy-bucket');
140
+ expect(result.current.accessibleBuckets[0].CreationDate).toBeInstanceOf(Date);
141
+ const stored = JSON.parse(sessionStorage.getItem(storageKey) || '[]');
142
+ expect(stored[0]).toHaveProperty('name');
143
+ expect(stored[0]).toHaveProperty('addedAt');
144
+ });
145
+ });
@@ -1,25 +1,25 @@
1
1
  import { renderHook } from "@testing-library/react";
2
- import { useISVBucketStatus } from "../useISVBucketDetection.js";
3
- import { useGetBucketTagging } from "../bucketConfiguration.js";
4
- import { useFeatures } from "../../utils/useFeatures.js";
5
- import { BUCKET_TAG_APPLICATION, BUCKET_TAG_VEEAM_APPLICATION, COMMVAULT_APPLICATION, VEEAM_BACKUP_REPLICATION, VEEAM_OFFICE_365, VEEAM_OFFICE_365_V8, VEEAM_VBO_APPLICATION } from "../../utils/constants.js";
6
2
  import { createTestWrapper } from "../../test/testUtils.js";
7
- jest.mock("../bucketConfiguration");
8
- jest.mock("../../utils/useFeatures");
3
+ import { BUCKET_TAG_APPLICATION, BUCKET_TAG_VEEAM_APPLICATION, COMMVAULT_APPLICATION, VEEAM_BACKUP_REPLICATION, VEEAM_OFFICE_365, VEEAM_OFFICE_365_V8, VEEAM_VBO_APPLICATION } from "../../utils/constants.js";
4
+ import { useGetBucketTagging } from "../bucketConfiguration.js";
5
+ import { useFeatures } from "../useFeatures.js";
6
+ import { useISVBucketStatus } from "../useISVBucketDetection.js";
7
+ jest.mock('../bucketConfiguration');
8
+ jest.mock('../useFeatures');
9
9
  const mockUseGetBucketTagging = useGetBucketTagging;
10
10
  const mockUseFeatures = useFeatures;
11
- describe("useISVBucketStatus", ()=>{
11
+ describe('useISVBucketStatus', ()=>{
12
12
  beforeEach(()=>{
13
13
  jest.clearAllMocks();
14
14
  mockUseFeatures.mockReturnValue(true);
15
15
  });
16
- it("should return false for all flags when ISV feature is disabled", ()=>{
16
+ it('should return false for all flags when ISV feature is disabled', ()=>{
17
17
  mockUseFeatures.mockReturnValue(false);
18
18
  mockUseGetBucketTagging.mockReturnValue({
19
19
  data: void 0,
20
- status: "success"
20
+ status: 'success'
21
21
  });
22
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
22
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
23
23
  wrapper: createTestWrapper()
24
24
  });
25
25
  expect(result.current.isVeeamBucket).toBe(false);
@@ -28,7 +28,7 @@ describe("useISVBucketStatus", ()=>{
28
28
  expect(result.current.isvApplication).toBeUndefined();
29
29
  expect(result.current.isLoading).toBe(false);
30
30
  });
31
- it("should detect Veeam Backup & Replication bucket", ()=>{
31
+ it('should detect Veeam Backup & Replication bucket', ()=>{
32
32
  mockUseGetBucketTagging.mockReturnValue({
33
33
  data: {
34
34
  TagSet: [
@@ -38,17 +38,17 @@ describe("useISVBucketStatus", ()=>{
38
38
  }
39
39
  ]
40
40
  },
41
- status: "success"
41
+ status: 'success'
42
42
  });
43
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
43
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
44
44
  wrapper: createTestWrapper()
45
45
  });
46
46
  expect(result.current.isVeeamBucket).toBe(true);
47
47
  expect(result.current.isCommvaultBucket).toBe(false);
48
48
  expect(result.current.isISVManaged).toBe(true);
49
- expect(result.current.isvApplication).toBe("Veeam");
49
+ expect(result.current.isvApplication).toBe('Veeam');
50
50
  });
51
- it("should detect Veeam Office 365 v6/v7 bucket", ()=>{
51
+ it('should detect Veeam Office 365 v6/v7 bucket', ()=>{
52
52
  mockUseGetBucketTagging.mockReturnValue({
53
53
  data: {
54
54
  TagSet: [
@@ -58,16 +58,16 @@ describe("useISVBucketStatus", ()=>{
58
58
  }
59
59
  ]
60
60
  },
61
- status: "success"
61
+ status: 'success'
62
62
  });
63
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
63
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
64
64
  wrapper: createTestWrapper()
65
65
  });
66
66
  expect(result.current.isVeeamBucket).toBe(true);
67
67
  expect(result.current.isISVManaged).toBe(true);
68
- expect(result.current.isvApplication).toBe("Veeam");
68
+ expect(result.current.isvApplication).toBe('Veeam');
69
69
  });
70
- it("should detect Veeam Office 365 v8+ bucket", ()=>{
70
+ it('should detect Veeam Office 365 v8+ bucket', ()=>{
71
71
  mockUseGetBucketTagging.mockReturnValue({
72
72
  data: {
73
73
  TagSet: [
@@ -77,16 +77,16 @@ describe("useISVBucketStatus", ()=>{
77
77
  }
78
78
  ]
79
79
  },
80
- status: "success"
80
+ status: 'success'
81
81
  });
82
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
82
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
83
83
  wrapper: createTestWrapper()
84
84
  });
85
85
  expect(result.current.isVeeamBucket).toBe(true);
86
86
  expect(result.current.isISVManaged).toBe(true);
87
- expect(result.current.isvApplication).toBe("Veeam");
87
+ expect(result.current.isvApplication).toBe('Veeam');
88
88
  });
89
- it("should detect ISV bucket tagged as Veeam Backup & Replication", ()=>{
89
+ it('should detect ISV bucket tagged as Veeam Backup & Replication', ()=>{
90
90
  mockUseGetBucketTagging.mockReturnValue({
91
91
  data: {
92
92
  TagSet: [
@@ -96,16 +96,16 @@ describe("useISVBucketStatus", ()=>{
96
96
  }
97
97
  ]
98
98
  },
99
- status: "success"
99
+ status: 'success'
100
100
  });
101
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
101
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
102
102
  wrapper: createTestWrapper()
103
103
  });
104
104
  expect(result.current.isVeeamBucket).toBe(true);
105
105
  expect(result.current.isISVManaged).toBe(true);
106
- expect(result.current.isvApplication).toBe("Veeam");
106
+ expect(result.current.isvApplication).toBe('Veeam');
107
107
  });
108
- it("should detect ISV bucket tagged as Veeam VBO", ()=>{
108
+ it('should detect ISV bucket tagged as Veeam VBO', ()=>{
109
109
  mockUseGetBucketTagging.mockReturnValue({
110
110
  data: {
111
111
  TagSet: [
@@ -115,16 +115,16 @@ describe("useISVBucketStatus", ()=>{
115
115
  }
116
116
  ]
117
117
  },
118
- status: "success"
118
+ status: 'success'
119
119
  });
120
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
120
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
121
121
  wrapper: createTestWrapper()
122
122
  });
123
123
  expect(result.current.isVeeamBucket).toBe(true);
124
124
  expect(result.current.isISVManaged).toBe(true);
125
- expect(result.current.isvApplication).toBe("Veeam");
125
+ expect(result.current.isvApplication).toBe('Veeam');
126
126
  });
127
- it("should detect Commvault bucket", ()=>{
127
+ it('should detect Commvault bucket', ()=>{
128
128
  mockUseGetBucketTagging.mockReturnValue({
129
129
  data: {
130
130
  TagSet: [
@@ -134,29 +134,29 @@ describe("useISVBucketStatus", ()=>{
134
134
  }
135
135
  ]
136
136
  },
137
- status: "success"
137
+ status: 'success'
138
138
  });
139
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
139
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
140
140
  wrapper: createTestWrapper()
141
141
  });
142
142
  expect(result.current.isVeeamBucket).toBe(false);
143
143
  expect(result.current.isCommvaultBucket).toBe(true);
144
144
  expect(result.current.isISVManaged).toBe(true);
145
- expect(result.current.isvApplication).toBe("Commvault");
145
+ expect(result.current.isvApplication).toBe('Commvault');
146
146
  });
147
- it("should return false for non-ISV bucket", ()=>{
147
+ it('should return false for non-ISV bucket', ()=>{
148
148
  mockUseGetBucketTagging.mockReturnValue({
149
149
  data: {
150
150
  TagSet: [
151
151
  {
152
- Key: "SomeOtherTag",
153
- Value: "SomeValue"
152
+ Key: 'SomeOtherTag',
153
+ Value: 'SomeValue'
154
154
  }
155
155
  ]
156
156
  },
157
- status: "success"
157
+ status: 'success'
158
158
  });
159
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
159
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
160
160
  wrapper: createTestWrapper()
161
161
  });
162
162
  expect(result.current.isVeeamBucket).toBe(false);
@@ -164,23 +164,23 @@ describe("useISVBucketStatus", ()=>{
164
164
  expect(result.current.isISVManaged).toBe(false);
165
165
  expect(result.current.isvApplication).toBeUndefined();
166
166
  });
167
- it("should return loading state when fetching bucket tags", ()=>{
167
+ it('should return loading state when fetching bucket tags', ()=>{
168
168
  mockUseGetBucketTagging.mockReturnValue({
169
169
  data: void 0,
170
- status: "pending"
170
+ status: 'pending'
171
171
  });
172
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
172
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
173
173
  wrapper: createTestWrapper()
174
174
  });
175
175
  expect(result.current.isLoading).toBe(true);
176
176
  });
177
- it("should not be loading when ISV feature is disabled", ()=>{
177
+ it('should not be loading when ISV feature is disabled', ()=>{
178
178
  mockUseFeatures.mockReturnValue(false);
179
179
  mockUseGetBucketTagging.mockReturnValue({
180
180
  data: void 0,
181
- status: "pending"
181
+ status: 'pending'
182
182
  });
183
- const { result } = renderHook(()=>useISVBucketStatus("test-bucket"), {
183
+ const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
184
184
  wrapper: createTestWrapper()
185
185
  });
186
186
  expect(result.current.isLoading).toBe(false);