@scality/data-browser-library 1.0.0-preview.8 → 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 (303) 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.d.ts +1 -0
  9. package/dist/components/__tests__/BucketCreate.test.js +574 -0
  10. package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
  11. package/dist/components/__tests__/BucketDetails.test.js +421 -0
  12. package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +14 -0
  13. package/dist/components/__tests__/BucketLifecycleFormPage.test.js +618 -0
  14. package/dist/components/__tests__/BucketLifecycleList.test.d.ts +1 -0
  15. package/dist/components/__tests__/BucketLifecycleList.test.js +325 -0
  16. package/dist/components/__tests__/BucketList.test.js +495 -81
  17. package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
  18. package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
  19. package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
  20. package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
  21. package/dist/components/__tests__/BucketOverview.test.js +484 -179
  22. package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
  23. package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +16 -0
  24. package/dist/components/__tests__/BucketReplicationFormPage.test.js +1757 -0
  25. package/dist/components/__tests__/BucketReplicationList.test.d.ts +1 -0
  26. package/dist/components/__tests__/BucketReplicationList.test.js +344 -0
  27. package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
  28. package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
  29. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.d.ts +1 -0
  30. package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +196 -0
  31. package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
  32. package/dist/components/__tests__/EmptyBucketButton.test.d.ts +1 -0
  33. package/dist/components/__tests__/EmptyBucketButton.test.js +302 -0
  34. package/dist/components/__tests__/MetadataSearch.test.js +65 -65
  35. package/dist/components/__tests__/ObjectList.test.js +741 -240
  36. package/dist/components/__tests__/UploadButton.test.js +45 -45
  37. package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
  38. package/dist/components/breadcrumb/Breadcrumb.js +37 -0
  39. package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
  40. package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
  41. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
  42. package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
  43. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
  44. package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
  45. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
  46. package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
  47. package/dist/components/breadcrumb/index.d.ts +8 -0
  48. package/dist/components/breadcrumb/index.js +4 -0
  49. package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
  50. package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
  51. package/dist/components/buckets/BucketAccessor.d.ts +2 -0
  52. package/dist/components/buckets/BucketAccessor.js +125 -0
  53. package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
  54. package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
  55. package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
  56. package/dist/components/buckets/BucketCorsPage.js +234 -0
  57. package/dist/components/buckets/BucketCreate.d.ts +50 -0
  58. package/dist/components/buckets/BucketCreate.js +279 -0
  59. package/dist/components/buckets/BucketDetails.d.ts +42 -0
  60. package/dist/components/buckets/BucketDetails.js +256 -40
  61. package/dist/components/buckets/BucketLifecycleFormPage.d.ts +15 -0
  62. package/dist/components/buckets/BucketLifecycleFormPage.js +1086 -0
  63. package/dist/components/buckets/BucketLifecycleList.d.ts +10 -0
  64. package/dist/components/buckets/BucketLifecycleList.js +270 -0
  65. package/dist/components/buckets/BucketList.d.ts +6 -4
  66. package/dist/components/buckets/BucketList.js +161 -94
  67. package/dist/components/buckets/BucketLocation.js +4 -4
  68. package/dist/components/buckets/BucketOverview.d.ts +86 -5
  69. package/dist/components/buckets/BucketOverview.js +481 -192
  70. package/dist/components/buckets/BucketPage.js +44 -22
  71. package/dist/components/buckets/BucketPolicyPage.js +155 -127
  72. package/dist/components/buckets/BucketReplicationFormPage.d.ts +1 -0
  73. package/dist/components/buckets/BucketReplicationFormPage.js +835 -0
  74. package/dist/components/buckets/BucketReplicationList.d.ts +11 -0
  75. package/dist/components/buckets/BucketReplicationList.js +189 -0
  76. package/dist/components/buckets/BucketVersioning.d.ts +4 -0
  77. package/dist/components/buckets/BucketVersioning.js +76 -0
  78. package/dist/components/buckets/DeleteBucketButton.js +8 -8
  79. package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +18 -0
  80. package/dist/components/buckets/DeleteBucketConfigRuleButton.js +53 -0
  81. package/dist/components/buckets/EmptyBucketButton.d.ts +5 -0
  82. package/dist/components/buckets/EmptyBucketButton.js +232 -0
  83. package/dist/components/buckets/EmptyBucketSummary.d.ts +9 -0
  84. package/dist/components/buckets/EmptyBucketSummary.js +60 -0
  85. package/dist/components/buckets/EmptyBucketSummaryList.d.ts +13 -0
  86. package/dist/components/buckets/EmptyBucketSummaryList.js +140 -0
  87. package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
  88. package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
  89. package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
  90. package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
  91. package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
  92. package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
  93. package/dist/components/buckets/notifications/EventsSection.js +145 -29
  94. package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
  95. package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
  96. package/dist/components/buckets/notifications/events.d.ts +71 -7
  97. package/dist/components/buckets/notifications/events.js +98 -16
  98. package/dist/components/index.d.ts +27 -13
  99. package/dist/components/index.js +20 -6
  100. package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
  101. package/dist/components/layouts/ArrowNavigation.js +28 -0
  102. package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
  103. package/dist/components/layouts/BrowserPageLayout.js +10 -5
  104. package/dist/components/objects/CreateFolderButton.d.ts +2 -2
  105. package/dist/components/objects/CreateFolderButton.js +12 -12
  106. package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
  107. package/dist/components/objects/DeleteObjectButton.js +19 -21
  108. package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
  109. package/dist/components/objects/GetPresignedUrlButton.js +255 -0
  110. package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
  111. package/dist/components/objects/ObjectDetails/ObjectMetadata.js +263 -230
  112. package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
  113. package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
  114. package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
  115. package/dist/components/objects/ObjectDetails/ObjectTags.js +95 -123
  116. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
  117. package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
  118. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
  119. package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
  120. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  121. package/dist/components/objects/ObjectDetails/index.js +152 -40
  122. package/dist/components/objects/ObjectList.d.ts +12 -10
  123. package/dist/components/objects/ObjectList.js +590 -263
  124. package/dist/components/objects/ObjectLock/EditRetentionButton.d.ts +4 -0
  125. package/dist/components/objects/ObjectLock/EditRetentionButton.js +32 -0
  126. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.d.ts +3 -0
  127. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +211 -0
  128. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +9 -0
  129. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +159 -0
  130. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +8 -0
  131. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +39 -0
  132. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.d.ts +1 -0
  133. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +204 -0
  134. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.d.ts +1 -0
  135. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +374 -0
  136. package/dist/components/objects/ObjectPage.js +12 -8
  137. package/dist/components/objects/UploadButton.d.ts +3 -3
  138. package/dist/components/objects/UploadButton.js +10 -10
  139. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  140. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  141. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  142. package/dist/components/providers/DataBrowserProvider.js +60 -38
  143. package/dist/components/providers/QueryProvider.d.ts +9 -0
  144. package/dist/components/providers/QueryProvider.js +21 -0
  145. package/dist/components/search/MetadataSearch.js +29 -28
  146. package/dist/components/search/SearchHints.js +1 -1
  147. package/dist/components/ui/ArrayFieldActions.d.ts +36 -0
  148. package/dist/components/ui/ArrayFieldActions.js +43 -0
  149. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +16 -0
  150. package/dist/components/ui/ConfirmDeleteRuleModal.js +48 -0
  151. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  152. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  153. package/dist/components/ui/FilterFormSection.d.ts +44 -0
  154. package/dist/components/ui/FilterFormSection.js +159 -0
  155. package/dist/components/ui/Search.elements.d.ts +2 -2
  156. package/dist/components/ui/Search.elements.js +7 -7
  157. package/dist/components/ui/Table.elements.d.ts +2 -1
  158. package/dist/components/ui/Table.elements.js +18 -12
  159. package/dist/config/__tests__/factory.test.d.ts +1 -0
  160. package/dist/config/__tests__/factory.test.js +311 -0
  161. package/dist/config/factory.d.ts +14 -49
  162. package/dist/config/factory.js +23 -68
  163. package/dist/config/types.d.ts +212 -34
  164. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  165. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  166. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  167. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  168. package/dist/hooks/__tests__/useISVBucketDetection.test.d.ts +1 -0
  169. package/dist/hooks/__tests__/useISVBucketDetection.test.js +188 -0
  170. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  171. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  172. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  173. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  174. package/dist/hooks/bucketConfiguration.js +52 -51
  175. package/dist/hooks/bucketOperations.d.ts +10 -1
  176. package/dist/hooks/bucketOperations.js +10 -9
  177. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  178. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  179. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  180. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  181. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +95 -52
  182. package/dist/hooks/factories/index.d.ts +4 -4
  183. package/dist/hooks/factories/index.js +2 -2
  184. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  185. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  186. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  187. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  188. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  189. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  190. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  191. package/dist/hooks/factories/useCreateS3QueryHook.js +29 -3
  192. package/dist/hooks/index.d.ts +19 -8
  193. package/dist/hooks/index.js +16 -5
  194. package/dist/hooks/loginOperations.d.ts +1 -1
  195. package/dist/hooks/loginOperations.js +1 -1
  196. package/dist/hooks/objectOperations.d.ts +2 -2
  197. package/dist/hooks/objectOperations.js +50 -49
  198. package/dist/hooks/presignedOperations.d.ts +4 -4
  199. package/dist/hooks/presignedOperations.js +5 -5
  200. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  201. package/dist/hooks/useAccessibleBuckets.js +115 -0
  202. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  203. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  204. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  205. package/dist/hooks/useBucketConfigEditor.js +82 -0
  206. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  207. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  208. package/dist/hooks/useDeleteBucketConfigRule.d.ts +26 -0
  209. package/dist/hooks/useDeleteBucketConfigRule.js +46 -0
  210. package/dist/hooks/useEmptyBucket.d.ts +27 -0
  211. package/dist/hooks/useEmptyBucket.js +116 -0
  212. package/dist/hooks/useFeatures.d.ts +7 -0
  213. package/dist/hooks/useFeatures.js +8 -0
  214. package/dist/hooks/useISVBucketDetection.d.ts +15 -0
  215. package/dist/hooks/useISVBucketDetection.js +27 -0
  216. package/dist/hooks/useIsBucketEmpty.js +4 -4
  217. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  218. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  219. package/dist/hooks/useS3Client.d.ts +6 -0
  220. package/dist/hooks/useS3Client.js +3 -2
  221. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  222. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  223. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  224. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  225. package/dist/hooks/useTableRowSelection.d.ts +9 -0
  226. package/dist/hooks/useTableRowSelection.js +45 -0
  227. package/dist/index.d.ts +6 -6
  228. package/dist/index.js +2 -2
  229. package/dist/schemas/bucketPolicySchema.json +3 -13
  230. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  231. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  232. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  233. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  234. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  235. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  236. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  237. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  238. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  239. package/dist/test/msw/handlers/headObject.js +31 -13
  240. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  241. package/dist/test/msw/handlers/listBuckets.js +5 -3
  242. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  243. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  244. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  245. package/dist/test/msw/handlers/listObjects.js +35 -23
  246. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  247. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  248. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  249. package/dist/test/msw/handlers/objectRetention.js +31 -17
  250. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  251. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  252. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  253. package/dist/test/msw/handlers/putObject.js +27 -12
  254. package/dist/test/msw/handlers.d.ts +3 -3
  255. package/dist/test/msw/handlers.js +77 -54
  256. package/dist/test/msw/index.d.ts +2 -2
  257. package/dist/test/msw/index.js +1 -1
  258. package/dist/test/msw/server.d.ts +1 -1
  259. package/dist/test/msw/server.js +1 -1
  260. package/dist/test/msw/utils.js +2 -2
  261. package/dist/test/setup.d.ts +1 -1
  262. package/dist/test/setup.js +13 -30
  263. package/dist/test/testUtils.d.ts +170 -36
  264. package/dist/test/testUtils.js +229 -116
  265. package/dist/test/utils/errorHandling.test.js +146 -108
  266. package/dist/types/index.d.ts +49 -36
  267. package/dist/types/monaco.d.ts +13 -0
  268. package/dist/types/monaco.js +0 -0
  269. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  270. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  271. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  272. package/dist/utils/__tests__/s3Client.test.js +340 -0
  273. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  274. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  275. package/dist/utils/constants.d.ts +22 -0
  276. package/dist/utils/constants.js +19 -0
  277. package/dist/utils/deletion/index.d.ts +2 -2
  278. package/dist/utils/deletion/index.js +1 -1
  279. package/dist/utils/deletion/messages.d.ts +1 -1
  280. package/dist/utils/deletion/messages.js +4 -4
  281. package/dist/utils/errorHandling.d.ts +12 -3
  282. package/dist/utils/errorHandling.js +12 -7
  283. package/dist/utils/hooks.js +8 -8
  284. package/dist/utils/index.d.ts +5 -2
  285. package/dist/utils/index.js +5 -1
  286. package/dist/utils/proxyMiddleware.d.ts +32 -13
  287. package/dist/utils/proxyMiddleware.js +90 -36
  288. package/dist/utils/s3Client.d.ts +14 -4
  289. package/dist/utils/s3Client.js +5 -26
  290. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  291. package/dist/utils/s3ConfigIdentifier.js +57 -0
  292. package/dist/utils/s3RuleUtils.d.ts +53 -0
  293. package/dist/utils/s3RuleUtils.js +101 -0
  294. package/package.json +10 -8
  295. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  296. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  297. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  298. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  299. package/dist/hooks/useLoginMutation.d.ts +0 -21
  300. package/dist/hooks/useLoginMutation.js +0 -9
  301. package/dist/utils/useFeatures.d.ts +0 -1
  302. package/dist/utils/useFeatures.js +0 -7
  303. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -1,70 +1,25 @@
1
- let runtimeConfig = null;
2
- class S3ConfigurationFactory {
3
- static async loadRuntimeConfig() {
4
- try {
5
- const response = await fetch("/_/s3-browser/config.json");
6
- if (response.ok) {
7
- const data = await response.json();
8
- runtimeConfig = data.s3;
9
- console.log("Loaded runtime S3 configuration:", runtimeConfig);
10
- }
11
- } catch (error) {
12
- console.warn("Could not load runtime config, using build-time config:", error);
13
- }
14
- }
15
- static getBuildTimeConfig() {
16
- return {
17
- s3: __S3_CONFIG__,
18
- dev: __DEV_CONFIG__,
19
- isDevelopment: __IS_DEVELOPMENT__,
20
- isProduction: __IS_PRODUCTION__
21
- };
22
- }
23
- static createClientConfiguration(credentials) {
24
- const buildConfig = this.getBuildTimeConfig();
25
- const s3Config = buildConfig.isProduction && runtimeConfig ? runtimeConfig : buildConfig.s3;
26
- const baseConfig = {
27
- credentials,
28
- region: s3Config.region,
29
- forcePathStyle: s3Config.forcePathStyle ?? true,
30
- endpoint: s3Config.endpoint
31
- };
32
- if (buildConfig.isDevelopment && buildConfig.dev.useProxy && buildConfig.dev.proxyEndpoint) baseConfig.endpoint = buildConfig.dev.proxyEndpoint;
33
- return baseConfig;
34
- }
35
- static createProxyConfiguration() {
36
- const buildConfig = this.getBuildTimeConfig();
37
- const config = {
38
- endpoint: buildConfig.s3.endpoint,
39
- region: buildConfig.s3.region,
40
- forcePathStyle: buildConfig.s3.forcePathStyle,
41
- useProxy: buildConfig.isDevelopment && buildConfig.dev.useProxy
42
- };
43
- if (config.useProxy) config.proxyConfig = {
44
- realHost: buildConfig.s3.realHost,
45
- proxyBasePath: buildConfig.dev.proxyBasePath,
46
- proxyHost: buildConfig.dev.proxyHost,
47
- proxyPort: buildConfig.dev.proxyPort
48
- };
49
- return config;
50
- }
51
- static shouldUseProxyMiddleware() {
52
- const buildConfig = this.getBuildTimeConfig();
53
- return buildConfig.isDevelopment && buildConfig.dev.useProxy;
54
- }
55
- static getBuildInfo() {
56
- const buildConfig = this.getBuildTimeConfig();
57
- return {
58
- environment: buildConfig.isDevelopment ? "development" : "production",
59
- useProxy: buildConfig.dev.useProxy,
60
- s3Endpoint: buildConfig.s3.endpoint,
61
- proxyEndpoint: buildConfig.dev.proxyEndpoint
62
- };
1
+ import joi from "joi";
2
+ const s3RuntimeConfigSchema = joi.object({
3
+ s3: joi.object({
4
+ endpoint: joi.string().optional().allow('origin'),
5
+ region: joi.string().min(1).required(),
6
+ forcePathStyle: joi.boolean().optional()
7
+ }).required()
8
+ });
9
+ async function loadRuntimeConfig(configUrl) {
10
+ const response = await fetch(configUrl);
11
+ if (!response.ok) throw new Error(`Failed to load config: ${response.statusText} (${response.status})`);
12
+ const data = await response.json();
13
+ const { error } = s3RuntimeConfigSchema.validate(data, {
14
+ allowUnknown: true,
15
+ abortEarly: false
16
+ });
17
+ if (error) {
18
+ const messages = error.details.map((d)=>d.message).join('; ');
19
+ throw new Error(`Invalid config: ${messages}`);
63
20
  }
21
+ if (data.s3?.endpoint === 'origin') if ('undefined' != typeof window && window.location?.origin) data.s3.endpoint = window.location.origin;
22
+ else throw new Error('Cannot use "origin" keyword outside browser');
23
+ return data;
64
24
  }
65
- const createS3Config = (credentials)=>S3ConfigurationFactory.createClientConfiguration(credentials);
66
- const shouldUseProxy = ()=>S3ConfigurationFactory.shouldUseProxyMiddleware();
67
- const getProxyConfig = ()=>S3ConfigurationFactory.createProxyConfiguration();
68
- const getBuildInfo = ()=>S3ConfigurationFactory.getBuildInfo();
69
- const loadRuntimeConfig = ()=>S3ConfigurationFactory.loadRuntimeConfig();
70
- export { S3ConfigurationFactory, createS3Config, getBuildInfo, getProxyConfig, loadRuntimeConfig, shouldUseProxy };
25
+ export { loadRuntimeConfig, s3RuntimeConfigSchema };
@@ -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
+ });