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

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 (287) 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 +93 -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 +225 -191
  57. package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
  58. package/dist/components/buckets/BucketLifecycleList.js +59 -61
  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 +48 -45
  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 +289 -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 +103 -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/formUtils.d.ts +15 -0
  113. package/dist/components/objects/ObjectDetails/formUtils.js +7 -0
  114. package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
  115. package/dist/components/objects/ObjectDetails/index.js +152 -40
  116. package/dist/components/objects/ObjectList.d.ts +12 -10
  117. package/dist/components/objects/ObjectList.js +590 -263
  118. package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
  119. package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
  120. package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
  121. package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
  122. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
  123. package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
  124. package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
  125. package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
  126. package/dist/components/objects/ObjectPage.js +12 -8
  127. package/dist/components/objects/UploadButton.d.ts +3 -3
  128. package/dist/components/objects/UploadButton.js +10 -10
  129. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
  130. package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
  131. package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
  132. package/dist/components/providers/DataBrowserProvider.js +60 -38
  133. package/dist/components/providers/QueryProvider.d.ts +9 -0
  134. package/dist/components/providers/QueryProvider.js +21 -0
  135. package/dist/components/search/MetadataSearch.js +29 -28
  136. package/dist/components/search/SearchHints.js +1 -1
  137. package/dist/components/ui/ArrayFieldActions.js +12 -7
  138. package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
  139. package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
  140. package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
  141. package/dist/components/ui/DeleteObjectModalContent.js +12 -12
  142. package/dist/components/ui/FilterFormSection.d.ts +2 -2
  143. package/dist/components/ui/FilterFormSection.js +29 -29
  144. package/dist/components/ui/Search.elements.d.ts +2 -2
  145. package/dist/components/ui/Search.elements.js +7 -7
  146. package/dist/components/ui/Table.elements.d.ts +2 -1
  147. package/dist/components/ui/Table.elements.js +18 -12
  148. package/dist/config/__tests__/factory.test.d.ts +1 -0
  149. package/dist/config/__tests__/factory.test.js +311 -0
  150. package/dist/config/factory.d.ts +10 -56
  151. package/dist/config/factory.js +23 -71
  152. package/dist/config/types.d.ts +212 -34
  153. package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
  154. package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
  155. package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
  156. package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
  157. package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
  158. package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
  159. package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
  160. package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
  161. package/dist/hooks/bucketConfiguration.d.ts +8 -1
  162. package/dist/hooks/bucketConfiguration.js +52 -51
  163. package/dist/hooks/bucketOperations.d.ts +10 -1
  164. package/dist/hooks/bucketOperations.js +10 -9
  165. package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
  166. package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
  167. package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
  168. package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
  169. package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
  170. package/dist/hooks/factories/index.d.ts +4 -4
  171. package/dist/hooks/factories/index.js +2 -2
  172. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
  173. package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
  174. package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
  175. package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
  176. package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
  177. package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
  178. package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
  179. package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
  180. package/dist/hooks/index.d.ts +19 -12
  181. package/dist/hooks/index.js +16 -9
  182. package/dist/hooks/loginOperations.d.ts +1 -1
  183. package/dist/hooks/loginOperations.js +1 -1
  184. package/dist/hooks/objectOperations.d.ts +2 -2
  185. package/dist/hooks/objectOperations.js +50 -49
  186. package/dist/hooks/presignedOperations.d.ts +4 -4
  187. package/dist/hooks/presignedOperations.js +5 -5
  188. package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
  189. package/dist/hooks/useAccessibleBuckets.js +115 -0
  190. package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
  191. package/dist/hooks/useBatchObjectLegalHold.js +48 -0
  192. package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
  193. package/dist/hooks/useBucketConfigEditor.js +82 -0
  194. package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
  195. package/dist/hooks/useDataBrowserNavigate.js +24 -0
  196. package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
  197. package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
  198. package/dist/hooks/useEmptyBucket.js +11 -11
  199. package/dist/hooks/useFeatures.d.ts +7 -0
  200. package/dist/hooks/useFeatures.js +8 -0
  201. package/dist/hooks/useISVBucketDetection.js +6 -6
  202. package/dist/hooks/useIsBucketEmpty.js +4 -4
  203. package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
  204. package/dist/hooks/useLimitedAccessFlow.js +23 -0
  205. package/dist/hooks/useS3Client.d.ts +6 -0
  206. package/dist/hooks/useS3Client.js +3 -2
  207. package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
  208. package/dist/hooks/useS3ConfigSwitch.js +37 -0
  209. package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
  210. package/dist/hooks/useSupportedNotificationEvents.js +8 -0
  211. package/dist/index.d.ts +6 -6
  212. package/dist/index.js +2 -2
  213. package/dist/schemas/bucketPolicySchema.json +3 -13
  214. package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
  215. package/dist/test/msw/handlers/deleteBucket.js +20 -10
  216. package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
  217. package/dist/test/msw/handlers/getBucketAcl.js +29 -17
  218. package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
  219. package/dist/test/msw/handlers/getBucketLocation.js +29 -15
  220. package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
  221. package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
  222. package/dist/test/msw/handlers/headObject.d.ts +1 -1
  223. package/dist/test/msw/handlers/headObject.js +31 -13
  224. package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
  225. package/dist/test/msw/handlers/listBuckets.js +5 -3
  226. package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
  227. package/dist/test/msw/handlers/listObjectVersions.js +38 -26
  228. package/dist/test/msw/handlers/listObjects.d.ts +1 -1
  229. package/dist/test/msw/handlers/listObjects.js +35 -23
  230. package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
  231. package/dist/test/msw/handlers/objectLegalHold.js +32 -17
  232. package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
  233. package/dist/test/msw/handlers/objectRetention.js +31 -17
  234. package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
  235. package/dist/test/msw/handlers/putBucketAcl.js +29 -14
  236. package/dist/test/msw/handlers/putObject.d.ts +1 -1
  237. package/dist/test/msw/handlers/putObject.js +27 -12
  238. package/dist/test/msw/handlers.d.ts +3 -3
  239. package/dist/test/msw/handlers.js +77 -54
  240. package/dist/test/msw/index.d.ts +2 -2
  241. package/dist/test/msw/index.js +1 -1
  242. package/dist/test/msw/server.d.ts +1 -1
  243. package/dist/test/msw/server.js +1 -1
  244. package/dist/test/msw/utils.js +2 -2
  245. package/dist/test/setup.d.ts +1 -1
  246. package/dist/test/setup.js +13 -30
  247. package/dist/test/testUtils.d.ts +85 -33
  248. package/dist/test/testUtils.js +176 -111
  249. package/dist/test/utils/errorHandling.test.js +119 -119
  250. package/dist/types/index.d.ts +50 -37
  251. package/dist/types/monaco.d.ts +13 -0
  252. package/dist/types/monaco.js +0 -0
  253. package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
  254. package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
  255. package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
  256. package/dist/utils/__tests__/s3Client.test.js +340 -0
  257. package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
  258. package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
  259. package/dist/utils/constants.d.ts +10 -0
  260. package/dist/utils/constants.js +19 -9
  261. package/dist/utils/deletion/index.d.ts +2 -2
  262. package/dist/utils/deletion/index.js +1 -1
  263. package/dist/utils/deletion/messages.d.ts +1 -1
  264. package/dist/utils/deletion/messages.js +4 -4
  265. package/dist/utils/errorHandling.d.ts +3 -3
  266. package/dist/utils/errorHandling.js +6 -6
  267. package/dist/utils/hooks.js +8 -8
  268. package/dist/utils/index.d.ts +5 -4
  269. package/dist/utils/index.js +4 -2
  270. package/dist/utils/proxyMiddleware.d.ts +32 -13
  271. package/dist/utils/proxyMiddleware.js +90 -36
  272. package/dist/utils/s3Client.d.ts +14 -4
  273. package/dist/utils/s3Client.js +5 -26
  274. package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
  275. package/dist/utils/s3ConfigIdentifier.js +57 -0
  276. package/dist/utils/s3RuleUtils.d.ts +5 -5
  277. package/dist/utils/s3RuleUtils.js +17 -17
  278. package/package.json +10 -8
  279. package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
  280. package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
  281. package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
  282. package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
  283. package/dist/hooks/useLoginMutation.d.ts +0 -21
  284. package/dist/hooks/useLoginMutation.js +0 -9
  285. package/dist/utils/useFeatures.d.ts +0 -1
  286. package/dist/utils/useFeatures.js +0 -7
  287. /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
@@ -0,0 +1,134 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { renderHook } from "@testing-library/react";
3
+ import { MemoryRouter } from "react-router";
4
+ import { createTestWrapper } from "../../../test/testUtils.js";
5
+ import { useBreadcrumbPaths } from "../useBreadcrumbPaths.js";
6
+ describe('useBreadcrumbPaths', ()=>{
7
+ const renderHookWithRouter = (path)=>{
8
+ const Wrapper = createTestWrapper();
9
+ return renderHook(()=>useBreadcrumbPaths(), {
10
+ wrapper: ({ children })=>/*#__PURE__*/ jsx(MemoryRouter, {
11
+ initialEntries: [
12
+ path
13
+ ],
14
+ children: /*#__PURE__*/ jsx(Wrapper, {
15
+ children: children
16
+ })
17
+ })
18
+ });
19
+ };
20
+ it('returns breadcrumb items for BucketPage routes', ()=>{
21
+ const root = renderHookWithRouter('/buckets');
22
+ expect(root.result.current.length).toBeGreaterThan(0);
23
+ expect(root.result.current[0].label).toContain('amazonaws.com');
24
+ const detail = renderHookWithRouter('/buckets/my-bucket');
25
+ expect(detail.result.current.length).toBeGreaterThan(0);
26
+ expect(detail.result.current[0].label).toContain('amazonaws.com');
27
+ });
28
+ it('returns breadcrumb items for ObjectsPage routes', ()=>{
29
+ const objects = renderHookWithRouter('/buckets/my-bucket/objects');
30
+ expect(objects.result.current.length).toBeGreaterThan(0);
31
+ expect(objects.result.current[0].label).toContain('amazonaws.com');
32
+ });
33
+ it.each([
34
+ '/buckets/-/access',
35
+ '/buckets/-/create',
36
+ '/buckets/my-bucket/policy',
37
+ '/buckets/my-bucket/cors',
38
+ '/buckets/my-bucket/lifecycle/create',
39
+ '/buckets/my-bucket/lifecycle/edit/rule-123',
40
+ '/buckets/my-bucket/replication/create',
41
+ '/buckets/my-bucket/replication/edit/rule-456',
42
+ '/buckets/my-bucket/notifications/create',
43
+ '/buckets/my-bucket/notifications/edit/notif-789',
44
+ '/buckets/my-bucket/objects/object-lock-settings',
45
+ '/buckets/my-bucket/unknown',
46
+ '/unknown/route'
47
+ ])('returns empty array for %s', (path)=>{
48
+ const { result } = renderHookWithRouter(path);
49
+ expect(result.current).toEqual([]);
50
+ });
51
+ it('generates breadcrumb for root objects view', ()=>{
52
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects');
53
+ expect(result.current.length).toBe(2);
54
+ expect(result.current[0].path).toBe('/buckets');
55
+ expect(result.current[1].label).toBe('my-bucket');
56
+ expect(result.current[1].path).toBeUndefined();
57
+ });
58
+ it('generates breadcrumb for folder navigation', ()=>{
59
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=folder1/');
60
+ expect(result.current.length).toBe(3);
61
+ expect(result.current[0].path).toBe('/buckets');
62
+ expect(result.current[1].label).toBe('my-bucket');
63
+ expect(result.current[1].path).toBe('/buckets/my-bucket/objects');
64
+ expect(result.current[2].label).toBe('folder1');
65
+ });
66
+ it('generates breadcrumb for nested folders', ()=>{
67
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=folder1/folder2/');
68
+ expect(result.current.length).toBe(4);
69
+ expect(result.current[2].label).toBe('folder1');
70
+ expect(result.current[3].label).toBe('folder2');
71
+ });
72
+ it('generates breadcrumb for file viewing', ()=>{
73
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=folder/file.txt');
74
+ expect(result.current.length).toBe(4);
75
+ expect(result.current[3].label).toBe('file.txt');
76
+ expect(result.current[3].path).toBeUndefined();
77
+ });
78
+ it('handles empty prefix parameter', ()=>{
79
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=');
80
+ expect(result.current.length).toBe(2);
81
+ expect(result.current[1].label).toBe('my-bucket');
82
+ });
83
+ it('decodes URL-encoded folder names', ()=>{
84
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=folder%20with%20spaces/');
85
+ const folderItem = result.current.find((item)=>'folder with spaces' === item.label);
86
+ expect(folderItem).toBeDefined();
87
+ });
88
+ it('decodes URL-encoded special characters', ()=>{
89
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=folder%26test/');
90
+ const folderItem = result.current.find((item)=>'folder&test' === item.label);
91
+ expect(folderItem).toBeDefined();
92
+ });
93
+ it('encodes folder paths in search params for navigation', ()=>{
94
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=folder1/folder2/');
95
+ const folder1Item = result.current.find((item)=>'folder1' === item.label);
96
+ expect(folder1Item?.search).toContain('folder1%2F');
97
+ });
98
+ it('handles malformed prefix with only slashes', ()=>{
99
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=///');
100
+ expect(result.current.length).toBe(2);
101
+ expect(result.current[0].path).toBe('/buckets');
102
+ expect(result.current[1].label).toBe('my-bucket');
103
+ });
104
+ it('handles very long folder paths', ()=>{
105
+ const longPath = Array.from({
106
+ length: 10
107
+ }, (_, i)=>`level${i + 1}`).join('/');
108
+ const { result } = renderHookWithRouter(`/buckets/my-bucket/objects?prefix=${longPath}/`);
109
+ expect(result.current.length).toBeGreaterThan(10);
110
+ expect(result.current[0].path).toBe('/buckets');
111
+ });
112
+ it('handles bucket names with hyphens and numbers', ()=>{
113
+ const { result } = renderHookWithRouter('/buckets/my-bucket-123-test/objects');
114
+ expect(result.current.length).toBe(2);
115
+ expect(result.current[1].label).toBe('my-bucket-123-test');
116
+ });
117
+ it('handles file with multiple dots in name', ()=>{
118
+ const { result } = renderHookWithRouter('/buckets/my-bucket/objects?prefix=folder/file.backup.tar.gz');
119
+ const fileItem = result.current.find((item)=>'file.backup.tar.gz' === item.label);
120
+ expect(fileItem).toBeDefined();
121
+ expect(fileItem?.path).toBeUndefined();
122
+ });
123
+ it('handles malformed route with empty bucket name', ()=>{
124
+ const { result } = renderHookWithRouter('/buckets//objects');
125
+ expect(result.current).toEqual([]);
126
+ });
127
+ it('handles errors gracefully and returns empty array', ()=>{
128
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
129
+ const { result } = renderHookWithRouter('/buckets');
130
+ expect(result.current).toBeDefined();
131
+ expect(Array.isArray(result.current)).toBe(true);
132
+ consoleErrorSpy.mockRestore();
133
+ });
134
+ });
@@ -0,0 +1,8 @@
1
+ export interface BreadcrumbItem {
2
+ label: string;
3
+ path?: string;
4
+ search?: string;
5
+ }
6
+ export { Breadcrumb } from './Breadcrumb';
7
+ export { DataBrowserBreadcrumb } from './DataBrowserBreadcrumb';
8
+ export { useBreadcrumbPaths } from './useBreadcrumbPaths';
@@ -0,0 +1,4 @@
1
+ import { Breadcrumb } from "./Breadcrumb.js";
2
+ import { DataBrowserBreadcrumb } from "./DataBrowserBreadcrumb.js";
3
+ import { useBreadcrumbPaths } from "./useBreadcrumbPaths.js";
4
+ export { Breadcrumb, DataBrowserBreadcrumb, useBreadcrumbPaths };
@@ -0,0 +1,2 @@
1
+ import type { BreadcrumbItem } from './index';
2
+ export declare const useBreadcrumbPaths: () => BreadcrumbItem[];
@@ -0,0 +1,82 @@
1
+ import { matchPath, useLocation, useSearchParams } from "react-router";
2
+ import { useDataBrowserConfig } from "../providers/DataBrowserProvider.js";
3
+ const ROUTE_PATTERNS = {
4
+ BUCKET_OBJECTS: '/buckets/:bucketName/objects',
5
+ BUCKET_DETAIL: '/buckets/:bucketName',
6
+ BUCKET_ROOT: '/buckets',
7
+ BUCKET_SETTINGS: '/buckets/:bucketName/*'
8
+ };
9
+ const formatEndpointLabel = (endpoint)=>{
10
+ if (!endpoint) return 'Data Browser';
11
+ try {
12
+ const url = new URL(endpoint);
13
+ return url.hostname;
14
+ } catch {
15
+ return endpoint.replace(/^https?:\/\//, '').replace(/\/$/, '');
16
+ }
17
+ };
18
+ const useBreadcrumbPaths = ()=>{
19
+ const [searchParams] = useSearchParams();
20
+ const location = useLocation();
21
+ const config = useDataBrowserConfig();
22
+ const endpointLabel = formatEndpointLabel(config.endpoint);
23
+ try {
24
+ const objectsMatch = matchPath(ROUTE_PATTERNS.BUCKET_OBJECTS, location.pathname);
25
+ const bucketListMatch = matchPath(ROUTE_PATTERNS.BUCKET_DETAIL, location.pathname);
26
+ const bucketRootMatch = matchPath(ROUTE_PATTERNS.BUCKET_ROOT, location.pathname);
27
+ if (objectsMatch?.params.bucketName) {
28
+ const bucketName = objectsMatch.params.bucketName;
29
+ const prefix = searchParams.get('prefix') || '';
30
+ const breadcrumbs = [
31
+ {
32
+ label: endpointLabel,
33
+ path: '/buckets'
34
+ }
35
+ ];
36
+ if (prefix) {
37
+ breadcrumbs.push({
38
+ label: bucketName,
39
+ path: `/buckets/${bucketName}/objects`
40
+ });
41
+ const segments = prefix.split('/').filter(Boolean);
42
+ const isFile = !prefix.endsWith('/');
43
+ segments.forEach((segment, index)=>{
44
+ const isLast = index === segments.length - 1;
45
+ if (isFile && isLast) breadcrumbs.push({
46
+ label: segment
47
+ });
48
+ else {
49
+ const currentPath = segments.slice(0, index + 1).join('/');
50
+ breadcrumbs.push({
51
+ label: segment,
52
+ ...isLast ? {} : {
53
+ path: `/buckets/${bucketName}/objects`,
54
+ search: `?prefix=${encodeURIComponent(`${currentPath}/`)}`
55
+ }
56
+ });
57
+ }
58
+ });
59
+ } else breadcrumbs.push({
60
+ label: bucketName
61
+ });
62
+ return breadcrumbs;
63
+ }
64
+ if (bucketListMatch && !location.pathname.includes('/objects') && !location.pathname.includes('/-/')) return [
65
+ {
66
+ label: endpointLabel,
67
+ path: '/buckets'
68
+ }
69
+ ];
70
+ if (bucketRootMatch) return [
71
+ {
72
+ label: endpointLabel,
73
+ path: '/buckets'
74
+ }
75
+ ];
76
+ return [];
77
+ } catch (error) {
78
+ console.error('Error generating breadcrumb paths:', error);
79
+ return [];
80
+ }
81
+ };
82
+ export { useBreadcrumbPaths };
@@ -0,0 +1,2 @@
1
+ export declare const BucketAccessor: () => import("react/jsx-runtime").JSX.Element;
2
+ export default BucketAccessor;
@@ -0,0 +1,125 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { joiResolver } from "@hookform/resolvers/joi";
3
+ import { Form, FormGroup, FormSection, Stack, useToast } from "@scality/core-ui";
4
+ import { Button, Input } from "@scality/core-ui/dist/next";
5
+ import { convertRemToPixels } from "@scality/core-ui/dist/utils";
6
+ import joi from "joi";
7
+ import { FormProvider, useForm } from "react-hook-form";
8
+ import { useAccessibleBuckets, useValidateBucketAccess } from "../../hooks/index.js";
9
+ import { useDataBrowserNavigate } from "../../hooks/useDataBrowserNavigate.js";
10
+ const bucketAccessSchema = joi.object({
11
+ bucketName: joi.string().required().label('Bucket Name').messages({
12
+ 'string.empty': 'Bucket name is required'
13
+ }),
14
+ prefix: joi.string().allow('').optional().label('Prefix')
15
+ });
16
+ const BucketAccessor = ()=>{
17
+ const navigate = useDataBrowserNavigate();
18
+ const { showToast } = useToast();
19
+ const { addAccessibleBucket } = useAccessibleBuckets();
20
+ const useFormMethods = useForm({
21
+ mode: 'all',
22
+ resolver: joiResolver(bucketAccessSchema),
23
+ defaultValues: {
24
+ bucketName: '',
25
+ prefix: ''
26
+ }
27
+ });
28
+ const { register, handleSubmit, formState, watch } = useFormMethods;
29
+ const { isValid, errors } = formState;
30
+ const bucketName = watch('bucketName');
31
+ const prefix = watch('prefix');
32
+ const { refetch, isFetching } = useValidateBucketAccess({
33
+ Bucket: bucketName,
34
+ Prefix: prefix ? `${prefix}/` : '',
35
+ MaxKeys: 1,
36
+ Delimiter: '/'
37
+ }, {
38
+ enabled: false
39
+ });
40
+ const handleCancel = ()=>{
41
+ navigate('/buckets');
42
+ };
43
+ const onSubmit = async (data)=>{
44
+ const { isSuccess, error } = await refetch();
45
+ if (isSuccess) {
46
+ addAccessibleBucket(data.bucketName);
47
+ const targetPath = data.prefix ? `/buckets/${data.bucketName}/objects?prefix=${encodeURIComponent(data.prefix + '/')}` : `/buckets/${data.bucketName}/objects`;
48
+ navigate(targetPath);
49
+ } else if (error) {
50
+ let errorMessage = 'Failed to access bucket';
51
+ if (error instanceof Error) {
52
+ const errorName = error.name || '';
53
+ const errorMsg = error.message || '';
54
+ errorMessage = 'NoSuchBucket' === errorName || errorMsg.includes('NoSuchBucket') ? 'The specified bucket does not exist' : 'AccessDenied' === errorName || errorMsg.includes('AccessDenied') ? "You don't have permission to access this bucket" : errorMsg || errorMessage;
55
+ }
56
+ showToast({
57
+ open: true,
58
+ message: errorMessage,
59
+ status: 'error'
60
+ });
61
+ }
62
+ };
63
+ return /*#__PURE__*/ jsx(FormProvider, {
64
+ ...useFormMethods,
65
+ children: /*#__PURE__*/ jsx(Form, {
66
+ layout: {
67
+ kind: 'page',
68
+ title: 'Access a specific S3 Bucket'
69
+ },
70
+ requireMode: "all",
71
+ onSubmit: handleSubmit(onSubmit),
72
+ rightActions: /*#__PURE__*/ jsxs(Stack, {
73
+ gap: "r16",
74
+ children: [
75
+ /*#__PURE__*/ jsx(Button, {
76
+ id: "cancel-btn",
77
+ variant: "outline",
78
+ onClick: handleCancel,
79
+ type: "button",
80
+ label: "Cancel"
81
+ }),
82
+ /*#__PURE__*/ jsx(Button, {
83
+ disabled: !isValid || isFetching,
84
+ isLoading: isFetching,
85
+ id: "access-bucket-btn",
86
+ type: "submit",
87
+ variant: "primary",
88
+ label: "Access"
89
+ })
90
+ ]
91
+ }),
92
+ children: /*#__PURE__*/ jsxs(FormSection, {
93
+ forceLabelWidth: convertRemToPixels(17.5),
94
+ children: [
95
+ /*#__PURE__*/ jsx(FormGroup, {
96
+ id: "bucketName",
97
+ label: "Bucket Name",
98
+ required: true,
99
+ direction: "horizontal",
100
+ content: /*#__PURE__*/ jsx(Input, {
101
+ id: "bucketName",
102
+ autoFocus: true,
103
+ ...register('bucketName')
104
+ }),
105
+ helpErrorPosition: "bottom",
106
+ error: errors.bucketName?.message
107
+ }),
108
+ /*#__PURE__*/ jsx(FormGroup, {
109
+ id: "prefix",
110
+ label: "Prefix",
111
+ direction: "horizontal",
112
+ content: /*#__PURE__*/ jsx(Input, {
113
+ id: "prefix",
114
+ ...register('prefix')
115
+ }),
116
+ helpErrorPosition: "bottom",
117
+ error: errors.prefix?.message
118
+ })
119
+ ]
120
+ })
121
+ })
122
+ });
123
+ };
124
+ const buckets_BucketAccessor = BucketAccessor;
125
+ export { BucketAccessor, buckets_BucketAccessor as default };
@@ -0,0 +1,8 @@
1
+ interface BucketConfigEditButtonProps {
2
+ hasConfig: boolean;
3
+ isLoading?: boolean;
4
+ onEdit: () => void;
5
+ configName: string;
6
+ }
7
+ export declare const BucketConfigEditButton: React.FC<BucketConfigEditButtonProps>;
8
+ export {};
@@ -1,18 +1,22 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { Icon, spacing } from "@scality/core-ui";
3
3
  import { Box, Button } from "@scality/core-ui/dist/next";
4
- const BucketPolicyButton = ({ hasPolicy, isLoading, onEdit })=>/*#__PURE__*/ jsx(Box, {
4
+ const BucketConfigEditButton = ({ hasConfig, isLoading, onEdit, configName })=>{
5
+ const action = hasConfig ? 'Edit' : 'Create';
6
+ return /*#__PURE__*/ jsx(Box, {
5
7
  display: "flex",
6
8
  alignItems: "center",
7
9
  gap: spacing.r8,
8
10
  children: /*#__PURE__*/ jsx(Button, {
9
11
  isLoading: isLoading,
10
12
  variant: "outline",
11
- label: hasPolicy ? "Edit" : "Create",
13
+ label: action,
12
14
  icon: /*#__PURE__*/ jsx(Icon, {
13
- name: hasPolicy ? "Pen" : "Create-add"
15
+ name: hasConfig ? 'Pen' : 'Create-add'
14
16
  }),
15
- onClick: onEdit
17
+ onClick: onEdit,
18
+ "aria-label": `${action} ${configName}`
16
19
  })
17
20
  });
18
- export { BucketPolicyButton };
21
+ };
22
+ export { BucketConfigEditButton };
@@ -0,0 +1 @@
1
+ export declare const BucketCorsPage: React.FC;
@@ -0,0 +1,234 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { Form, FormGroup, FormSection, Icon, Loader, Stack, Text, useToast } from "@scality/core-ui";
3
+ import { Box, Button, CopyButton } from "@scality/core-ui/dist/next";
4
+ import { useCallback, useMemo } from "react";
5
+ import { Controller } from "react-hook-form";
6
+ import { useParams } from "react-router";
7
+ import { useBucketConfigEditor, useDeleteBucketCors, useGetBucketCors, useSetBucketCors } from "../../hooks/index.js";
8
+ import { Editor } from "../Editor.js";
9
+ const DEFAULT_CORS_TEMPLATE = `[
10
+ {
11
+ "AllowedHeaders": [
12
+ "Authorization"
13
+ ],
14
+ "AllowedMethods": [
15
+ "GET"
16
+ ],
17
+ "AllowedOrigins": [
18
+ "*"
19
+ ],
20
+ "ExposeHeaders": [],
21
+ "MaxAgeSeconds": 3000
22
+ }
23
+ ]`;
24
+ const validateCorsConfig = (content)=>{
25
+ const trimmed = content.trim();
26
+ if ('' === trimmed) return {
27
+ isValid: true,
28
+ parsed: []
29
+ };
30
+ try {
31
+ const parsed = JSON.parse(trimmed);
32
+ if (!Array.isArray(parsed)) return {
33
+ isValid: false,
34
+ error: 'CORS configuration must be an array of rules'
35
+ };
36
+ return {
37
+ isValid: true,
38
+ parsed
39
+ };
40
+ } catch {
41
+ return {
42
+ isValid: false,
43
+ error: 'Invalid JSON format'
44
+ };
45
+ }
46
+ };
47
+ const BucketCorsPage = ()=>{
48
+ const { bucketName } = useParams();
49
+ const { showToast } = useToast();
50
+ const { data: corsData, status: corsStatus, error: corsError } = useGetBucketCors({
51
+ Bucket: bucketName
52
+ });
53
+ const initialContent = useMemo(()=>{
54
+ if (corsData?.CORSRules && corsData.CORSRules.length > 0) return JSON.stringify(corsData.CORSRules);
55
+ }, [
56
+ corsData
57
+ ]);
58
+ const { form, content, isCreateMode, isValidFormat, handleBeforeMount, navigateToBucket } = useBucketConfigEditor({
59
+ bucketName: bucketName,
60
+ initialContent,
61
+ defaultTemplate: DEFAULT_CORS_TEMPLATE,
62
+ isLoading: 'pending' === corsStatus,
63
+ notFoundErrorNames: [
64
+ 'NoSuchCORSConfiguration'
65
+ ],
66
+ errorInstance: corsError,
67
+ validate: validateCorsConfig
68
+ });
69
+ const { control, handleSubmit, setError, clearErrors, formState: { isDirty, errors } } = form;
70
+ const { mutate: saveCors, isPending: isSaving } = useSetBucketCors();
71
+ const { mutate: deleteCors, isPending: isDeleting } = useDeleteBucketCors();
72
+ const onSubmit = useCallback((data)=>{
73
+ const result = validateCorsConfig(data.content);
74
+ if (!result.isValid) return;
75
+ const parsedRules = result.parsed;
76
+ if (0 === parsedRules.length) return void deleteCors({
77
+ Bucket: bucketName
78
+ }, {
79
+ onSuccess: ()=>{
80
+ showToast({
81
+ open: true,
82
+ message: 'CORS configuration deleted',
83
+ status: 'success'
84
+ });
85
+ navigateToBucket();
86
+ },
87
+ onError: (error)=>{
88
+ setError('content', {
89
+ type: 'server',
90
+ message: error instanceof Error ? error.message : 'Failed to delete'
91
+ });
92
+ }
93
+ });
94
+ saveCors({
95
+ Bucket: bucketName,
96
+ CORSConfiguration: {
97
+ CORSRules: parsedRules
98
+ }
99
+ }, {
100
+ onSuccess: ()=>{
101
+ showToast({
102
+ open: true,
103
+ message: 'CORS configuration saved',
104
+ status: 'success'
105
+ });
106
+ navigateToBucket();
107
+ },
108
+ onError: (error)=>{
109
+ setError('content', {
110
+ type: 'server',
111
+ message: error instanceof Error ? error.message : 'Failed to save'
112
+ });
113
+ }
114
+ });
115
+ }, [
116
+ bucketName,
117
+ saveCors,
118
+ deleteCors,
119
+ navigateToBucket,
120
+ showToast,
121
+ setError
122
+ ]);
123
+ const isPending = isSaving || isDeleting;
124
+ const hasUnexpectedError = corsError && 'NoSuchCORSConfiguration' !== corsError.name;
125
+ if ('pending' === corsStatus) return /*#__PURE__*/ jsx(Loader, {
126
+ centered: true,
127
+ size: "massive",
128
+ children: /*#__PURE__*/ jsx(Fragment, {
129
+ children: "Loading CORS configuration..."
130
+ })
131
+ });
132
+ if (hasUnexpectedError) return /*#__PURE__*/ jsx(Box, {
133
+ display: "flex",
134
+ flexDirection: "column",
135
+ justifyContent: "center",
136
+ alignItems: "center",
137
+ height: "100%",
138
+ gap: "1.5rem",
139
+ children: /*#__PURE__*/ jsxs(Stack, {
140
+ gap: "r8",
141
+ style: {
142
+ alignItems: 'center'
143
+ },
144
+ children: [
145
+ /*#__PURE__*/ jsx(Icon, {
146
+ name: "Exclamation-circle",
147
+ size: "2x",
148
+ color: "statusWarning"
149
+ }),
150
+ /*#__PURE__*/ jsxs(Text, {
151
+ variant: "Large",
152
+ children: [
153
+ "Failed to load CORS configuration: ",
154
+ corsError.message || 'Unknown error'
155
+ ]
156
+ })
157
+ ]
158
+ })
159
+ });
160
+ return /*#__PURE__*/ jsx(Form, {
161
+ onSubmit: handleSubmit(onSubmit),
162
+ layout: {
163
+ kind: 'page',
164
+ title: `${isCreateMode ? 'Create' : 'Edit'} Bucket CORS`
165
+ },
166
+ rightActions: /*#__PURE__*/ jsxs(Stack, {
167
+ gap: "r16",
168
+ children: [
169
+ /*#__PURE__*/ jsx(Button, {
170
+ variant: "outline",
171
+ label: "Cancel",
172
+ onClick: navigateToBucket,
173
+ type: "button",
174
+ disabled: isPending
175
+ }),
176
+ /*#__PURE__*/ jsx(Button, {
177
+ variant: "primary",
178
+ label: "Save",
179
+ icon: /*#__PURE__*/ jsx(Icon, {
180
+ name: "Save"
181
+ }),
182
+ type: "submit",
183
+ disabled: !isDirty && !isCreateMode || isPending || !isValidFormat
184
+ })
185
+ ]
186
+ }),
187
+ children: /*#__PURE__*/ jsxs(FormSection, {
188
+ children: [
189
+ /*#__PURE__*/ jsx(FormGroup, {
190
+ id: "bucketName",
191
+ label: "Bucket Name",
192
+ direction: "horizontal",
193
+ content: /*#__PURE__*/ jsx(Text, {
194
+ children: bucketName
195
+ })
196
+ }),
197
+ /*#__PURE__*/ jsx(FormGroup, {
198
+ id: "corsConfiguration",
199
+ label: "CORS Rules",
200
+ direction: "vertical",
201
+ error: errors.content?.message,
202
+ content: /*#__PURE__*/ jsxs(Stack, {
203
+ children: [
204
+ /*#__PURE__*/ jsx(Controller, {
205
+ control: control,
206
+ name: "content",
207
+ render: ({ field: { onChange, value } })=>/*#__PURE__*/ jsx(Editor, {
208
+ value: value,
209
+ onChange: (newValue)=>{
210
+ onChange(newValue);
211
+ if (errors.content) clearErrors('content');
212
+ },
213
+ language: "json",
214
+ height: "60vh",
215
+ width: "33rem",
216
+ beforeMount: handleBeforeMount
217
+ })
218
+ }),
219
+ /*#__PURE__*/ jsx(Box, {
220
+ alignSelf: "baseline",
221
+ children: /*#__PURE__*/ jsx(CopyButton, {
222
+ textToCopy: content,
223
+ label: "CORS",
224
+ variant: "outline"
225
+ })
226
+ })
227
+ ]
228
+ })
229
+ })
230
+ ]
231
+ })
232
+ });
233
+ };
234
+ export { BucketCorsPage };
@@ -1,11 +1,12 @@
1
- import Joi from "joi";
2
- import { ObjectLockRetentionMode } from "@aws-sdk/client-s3";
1
+ import type { ObjectLockRetentionMode } from '@aws-sdk/client-s3';
2
+ import Joi from 'joi';
3
3
  export declare const bucketErrorMessage = "Bucket names can include only lowercase letters, numbers, dots (.), and hyphens (-)";
4
4
  export declare const bucketNameValidationSchema: Joi.StringSchema<string>;
5
5
  export declare const baseBucketCreateSchema: Joi.ObjectSchema<any>;
6
6
  export type BucketCreateFormData = {
7
7
  name: string;
8
8
  isVersioning: boolean;
9
+ isEncryptionEnabled: boolean;
9
10
  isObjectLockEnabled: boolean;
10
11
  isDefaultRetentionEnabled: boolean;
11
12
  retentionMode: ObjectLockRetentionMode;