@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
@@ -0,0 +1,574 @@
1
+ import * as __rspack_external__providers_DataBrowserProvider_js_b116b609 from "../providers/DataBrowserProvider.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { fireEvent, render, screen, waitFor } from "@testing-library/react";
4
+ import user_event from "@testing-library/user-event";
5
+ import { MemoryRouter } from "react-router";
6
+ import { useCreateBucket, useSetBucketEncryption, useSetBucketObjectLockConfiguration, useSetBucketVersioning } from "../../hooks/index.js";
7
+ import { createMockMutationResult, createTestWrapper } from "../../test/testUtils.js";
8
+ import { BucketCreate } from "../buckets/BucketCreate.js";
9
+ var __webpack_modules__ = {
10
+ "../providers/DataBrowserProvider" (module) {
11
+ module.exports = __rspack_external__providers_DataBrowserProvider_js_b116b609;
12
+ }
13
+ };
14
+ var __webpack_module_cache__ = {};
15
+ function __webpack_require__(moduleId) {
16
+ var cachedModule = __webpack_module_cache__[moduleId];
17
+ if (void 0 !== cachedModule) return cachedModule.exports;
18
+ var module = __webpack_module_cache__[moduleId] = {
19
+ exports: {}
20
+ };
21
+ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
22
+ return module.exports;
23
+ }
24
+ jest.mock('../../hooks', ()=>({
25
+ useCreateBucket: jest.fn(),
26
+ useSetBucketVersioning: jest.fn(),
27
+ useSetBucketObjectLockConfiguration: jest.fn(),
28
+ useSetBucketEncryption: jest.fn()
29
+ }));
30
+ jest.mock('../providers/DataBrowserProvider', ()=>({
31
+ ...jest.requireActual('../providers/DataBrowserProvider'),
32
+ useDataBrowserConfig: jest.fn(()=>({
33
+ s3Capabilities: {
34
+ bucketEncryption: false
35
+ }
36
+ }))
37
+ }));
38
+ const mockUseCreateBucket = jest.mocked(useCreateBucket);
39
+ const mockUseSetBucketVersioning = jest.mocked(useSetBucketVersioning);
40
+ const mockUseSetBucketObjectLockConfiguration = jest.mocked(useSetBucketObjectLockConfiguration);
41
+ const mockUseSetBucketEncryption = jest.mocked(useSetBucketEncryption);
42
+ const { useDataBrowserConfig } = __webpack_require__("../providers/DataBrowserProvider");
43
+ const mockUseDataBrowserConfig = jest.mocked(useDataBrowserConfig);
44
+ const mockNavigate = jest.fn();
45
+ const mockShowToast = jest.fn();
46
+ jest.mock('react-router', ()=>({
47
+ ...jest.requireActual('react-router'),
48
+ useNavigate: ()=>mockNavigate
49
+ }));
50
+ jest.mock('@scality/core-ui', ()=>({
51
+ ...jest.requireActual('@scality/core-ui'),
52
+ useToast: ()=>({
53
+ showToast: mockShowToast
54
+ })
55
+ }));
56
+ const renderBucketCreate = (props = {})=>{
57
+ const Wrapper = createTestWrapper();
58
+ return render(/*#__PURE__*/ jsx(Wrapper, {
59
+ children: /*#__PURE__*/ jsx(MemoryRouter, {
60
+ children: /*#__PURE__*/ jsx(BucketCreate, {
61
+ ...props
62
+ })
63
+ })
64
+ }));
65
+ };
66
+ const mockMutations = {
67
+ createBucket: jest.fn(),
68
+ setVersioning: jest.fn(),
69
+ setObjectLock: jest.fn(),
70
+ setBucketEncryption: jest.fn()
71
+ };
72
+ const setupMocks = (overrides = {})=>{
73
+ mockUseCreateBucket.mockReturnValue(createMockMutationResult(mockMutations.createBucket, overrides));
74
+ mockUseSetBucketVersioning.mockReturnValue(createMockMutationResult(mockMutations.setVersioning));
75
+ mockUseSetBucketObjectLockConfiguration.mockReturnValue(createMockMutationResult(mockMutations.setObjectLock));
76
+ mockUseSetBucketEncryption.mockReturnValue(createMockMutationResult(mockMutations.setBucketEncryption));
77
+ };
78
+ const fillBucketName = async (name)=>{
79
+ const nameInput = screen.getByLabelText(/bucket name/i);
80
+ await user_event.type(nameInput, name);
81
+ };
82
+ const submitForm = async ()=>{
83
+ await waitFor(()=>{
84
+ const createButton = screen.getByRole('button', {
85
+ name: /^create$/i
86
+ });
87
+ expect(createButton).not.toBeDisabled();
88
+ }, {
89
+ timeout: 3000
90
+ });
91
+ const createButton = screen.getByRole('button', {
92
+ name: /^create$/i
93
+ });
94
+ await user_event.click(createButton);
95
+ };
96
+ describe('BucketCreate', ()=>{
97
+ beforeEach(()=>{
98
+ jest.clearAllMocks();
99
+ setupMocks();
100
+ });
101
+ it('renders form with required fields', ()=>{
102
+ renderBucketCreate();
103
+ expect(screen.getByText('Create a New Bucket')).toBeInTheDocument();
104
+ expect(screen.getByLabelText(/bucket name/i)).toBeInTheDocument();
105
+ expect(screen.getByText('Versioning')).toBeInTheDocument();
106
+ expect(screen.getByText('Object-lock')).toBeInTheDocument();
107
+ });
108
+ it('shows validation error for invalid bucket name with uppercase', async ()=>{
109
+ renderBucketCreate();
110
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'INVALID');
111
+ await user_event.tab();
112
+ await waitFor(()=>{
113
+ expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
114
+ });
115
+ });
116
+ it('shows validation error for bucket name starting with hyphen', async ()=>{
117
+ renderBucketCreate();
118
+ await user_event.type(screen.getByLabelText(/bucket name/i), '-invalid');
119
+ await user_event.tab();
120
+ await waitFor(()=>{
121
+ expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
122
+ });
123
+ });
124
+ it('shows validation error for bucket name ending with hyphen', async ()=>{
125
+ renderBucketCreate();
126
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'invalid-');
127
+ await user_event.tab();
128
+ await waitFor(()=>{
129
+ expect(screen.getByText(/bucket names can include only lowercase/i)).toBeInTheDocument();
130
+ });
131
+ });
132
+ it('shows validation error for bucket name with adjacent periods', async ()=>{
133
+ renderBucketCreate();
134
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'test..bucket');
135
+ await user_event.tab();
136
+ await waitFor(()=>{
137
+ expect(screen.getByText(/bucket names cannot contain two adjacent periods/i)).toBeInTheDocument();
138
+ });
139
+ });
140
+ it('shows validation error for bucket name formatted as IP address', async ()=>{
141
+ renderBucketCreate();
142
+ await user_event.type(screen.getByLabelText(/bucket name/i), '192.168.1.1');
143
+ await user_event.tab();
144
+ await waitFor(()=>{
145
+ expect(screen.getByText(/bucket names must not be formatted as an ip address/i)).toBeInTheDocument();
146
+ });
147
+ });
148
+ it('shows validation error for bucket name with forbidden prefix', async ()=>{
149
+ renderBucketCreate();
150
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'xn--test');
151
+ await user_event.tab();
152
+ await waitFor(()=>{
153
+ expect(screen.getByText(/bucket names must not start with/i)).toBeInTheDocument();
154
+ });
155
+ });
156
+ it('shows validation error for bucket name with forbidden suffix', async ()=>{
157
+ renderBucketCreate();
158
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'test-s3alias');
159
+ await user_event.tab();
160
+ await waitFor(()=>{
161
+ expect(screen.getByText(/bucket names must not end with/i)).toBeInTheDocument();
162
+ });
163
+ });
164
+ it('shows validation error for duplicate bucket name when context provided', async ()=>{
165
+ renderBucketCreate({
166
+ validationContext: {
167
+ existingBuckets: [
168
+ 'existing-bucket',
169
+ 'another-bucket'
170
+ ]
171
+ }
172
+ });
173
+ await user_event.type(screen.getByLabelText(/bucket name/i), 'existing-bucket');
174
+ await user_event.tab();
175
+ await waitFor(()=>{
176
+ expect(screen.getByText(/a bucket with this name already exists/i)).toBeInTheDocument();
177
+ });
178
+ });
179
+ it('accepts valid bucket names with dots and hyphens', async ()=>{
180
+ renderBucketCreate();
181
+ const validNames = [
182
+ 'my-bucket-123',
183
+ 'my.bucket.name',
184
+ 'test-bucket.example',
185
+ '123-bucket-456'
186
+ ];
187
+ for (const name of validNames){
188
+ const input = screen.getByLabelText(/bucket name/i);
189
+ await user_event.clear(input);
190
+ await user_event.type(input, name);
191
+ await user_event.tab();
192
+ await waitFor(()=>{
193
+ expect(screen.queryByText(/bucket names must be 3-63 characters/i)).not.toBeInTheDocument();
194
+ expect(screen.queryByText(/bucket names cannot contain/i)).not.toBeInTheDocument();
195
+ expect(screen.queryByText(/bucket names must not/i)).not.toBeInTheDocument();
196
+ });
197
+ }
198
+ });
199
+ it('allows bucket creation when name is unique', async ()=>{
200
+ renderBucketCreate({
201
+ validationContext: {
202
+ existingBuckets: [
203
+ 'existing-bucket',
204
+ 'another-bucket'
205
+ ]
206
+ }
207
+ });
208
+ await fillBucketName('new-unique-bucket');
209
+ await waitFor(()=>{
210
+ expect(screen.getByRole('button', {
211
+ name: /^create$/i
212
+ })).not.toBeDisabled();
213
+ });
214
+ });
215
+ it('disables create button when form is invalid', ()=>{
216
+ renderBucketCreate();
217
+ expect(screen.getByRole('button', {
218
+ name: /^create$/i
219
+ })).toBeDisabled();
220
+ });
221
+ it('enables create button when bucket name is valid', async ()=>{
222
+ renderBucketCreate();
223
+ await fillBucketName('test-bucket');
224
+ await waitFor(()=>{
225
+ expect(screen.getByRole('button', {
226
+ name: /^create$/i
227
+ })).not.toBeDisabled();
228
+ });
229
+ });
230
+ it('creates bucket with basic configuration', async ()=>{
231
+ renderBucketCreate();
232
+ await fillBucketName('test-bucket');
233
+ await submitForm();
234
+ expect(mockMutations.createBucket).toHaveBeenCalledWith({
235
+ Bucket: 'test-bucket',
236
+ ObjectLockEnabledForBucket: void 0
237
+ }, expect.objectContaining({
238
+ onSuccess: expect.any(Function),
239
+ onError: expect.any(Function)
240
+ }));
241
+ });
242
+ it('shows success toast and navigates after bucket creation', async ()=>{
243
+ renderBucketCreate();
244
+ await fillBucketName('my-bucket');
245
+ await submitForm();
246
+ const successCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
247
+ successCallback();
248
+ expect(mockShowToast).toHaveBeenCalledWith({
249
+ open: true,
250
+ message: 'Bucket "my-bucket" created successfully',
251
+ status: 'success'
252
+ });
253
+ expect(mockNavigate).toHaveBeenCalledWith('/buckets/my-bucket');
254
+ });
255
+ it('shows error toast when bucket creation fails', async ()=>{
256
+ renderBucketCreate();
257
+ await fillBucketName('test-bucket');
258
+ await submitForm();
259
+ const errorCallback = mockMutations.createBucket.mock.calls[0][1].onError;
260
+ const error = new Error('Bucket already exists');
261
+ errorCallback(error);
262
+ expect(mockShowToast).toHaveBeenCalledWith({
263
+ open: true,
264
+ message: 'Bucket already exists',
265
+ status: 'error'
266
+ });
267
+ });
268
+ it('enables versioning when requested', async ()=>{
269
+ renderBucketCreate();
270
+ await fillBucketName('test-bucket');
271
+ const versioningCheckbox = screen.getByRole('checkbox', {
272
+ name: /versioning/i
273
+ });
274
+ await user_event.click(versioningCheckbox);
275
+ await submitForm();
276
+ const successCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
277
+ successCallback();
278
+ expect(mockMutations.setVersioning).toHaveBeenCalledWith({
279
+ Bucket: 'test-bucket',
280
+ VersioningConfiguration: {
281
+ Status: 'Enabled'
282
+ }
283
+ }, expect.objectContaining({
284
+ onSuccess: expect.any(Function),
285
+ onError: expect.any(Function)
286
+ }));
287
+ });
288
+ it('disables versioning checkbox when object lock is enabled', async ()=>{
289
+ renderBucketCreate();
290
+ await fillBucketName('test-bucket');
291
+ const objectLockCheckbox = screen.getByRole('checkbox', {
292
+ name: /object-lock/i
293
+ });
294
+ await user_event.click(objectLockCheckbox);
295
+ const versioningCheckbox = screen.getByRole('checkbox', {
296
+ name: /versioning/i
297
+ });
298
+ expect(versioningCheckbox).toBeDisabled();
299
+ expect(screen.getByText(/automatically activated when object-lock is enabled/i)).toBeInTheDocument();
300
+ });
301
+ it('enables versioning automatically when object lock is enabled', async ()=>{
302
+ renderBucketCreate();
303
+ await fillBucketName('test-bucket');
304
+ const objectLockCheckbox = screen.getByRole('checkbox', {
305
+ name: /object-lock/i
306
+ });
307
+ await user_event.click(objectLockCheckbox);
308
+ await submitForm();
309
+ expect(mockMutations.createBucket).toHaveBeenCalledWith(expect.objectContaining({
310
+ ObjectLockEnabledForBucket: true
311
+ }), expect.any(Object));
312
+ const successCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
313
+ successCallback();
314
+ expect(mockMutations.setVersioning).not.toHaveBeenCalled();
315
+ });
316
+ it('configures object lock retention when enabled', async ()=>{
317
+ renderBucketCreate();
318
+ await fillBucketName('test-bucket');
319
+ await user_event.click(screen.getByRole('checkbox', {
320
+ name: /object-lock/i
321
+ }));
322
+ await user_event.click(screen.getByRole('checkbox', {
323
+ name: /default retention/i
324
+ }));
325
+ await submitForm();
326
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
327
+ createSuccessCallback();
328
+ expect(mockMutations.setVersioning).not.toHaveBeenCalled();
329
+ expect(mockMutations.setObjectLock).toHaveBeenCalledWith({
330
+ Bucket: 'test-bucket',
331
+ ObjectLockConfiguration: {
332
+ ObjectLockEnabled: 'Enabled',
333
+ Rule: {
334
+ DefaultRetention: {
335
+ Mode: 'GOVERNANCE',
336
+ Days: 1,
337
+ Years: void 0
338
+ }
339
+ }
340
+ }
341
+ }, expect.objectContaining({
342
+ onSuccess: expect.any(Function),
343
+ onError: expect.any(Function)
344
+ }));
345
+ });
346
+ it('calls custom onSubmit when provided', async ()=>{
347
+ const customSubmit = jest.fn();
348
+ renderBucketCreate({
349
+ onSubmit: customSubmit
350
+ });
351
+ await fillBucketName('test-bucket');
352
+ await submitForm();
353
+ expect(customSubmit).toHaveBeenCalledWith(expect.objectContaining({
354
+ name: 'test-bucket',
355
+ isVersioning: false,
356
+ isObjectLockEnabled: false
357
+ }));
358
+ expect(mockMutations.createBucket).not.toHaveBeenCalled();
359
+ });
360
+ it('calls custom onCancel when provided', ()=>{
361
+ const customCancel = jest.fn();
362
+ renderBucketCreate({
363
+ onCancel: customCancel
364
+ });
365
+ const cancelButton = screen.getByRole('button', {
366
+ name: /cancel/i
367
+ });
368
+ fireEvent.click(cancelButton);
369
+ expect(customCancel).toHaveBeenCalled();
370
+ expect(mockNavigate).not.toHaveBeenCalled();
371
+ });
372
+ it('navigates to buckets list when cancel is clicked without custom handler', ()=>{
373
+ renderBucketCreate();
374
+ const cancelButton = screen.getByRole('button', {
375
+ name: /cancel/i
376
+ });
377
+ fireEvent.click(cancelButton);
378
+ expect(mockNavigate).toHaveBeenCalledWith('/buckets');
379
+ });
380
+ it('renders injected children', ()=>{
381
+ renderBucketCreate({
382
+ children: /*#__PURE__*/ jsx("div", {
383
+ "data-testid": "custom-field",
384
+ children: "Custom Field"
385
+ })
386
+ });
387
+ expect(screen.getByTestId('custom-field')).toBeInTheDocument();
388
+ });
389
+ it('shows loading state during bucket creation', async ()=>{
390
+ renderBucketCreate();
391
+ await fillBucketName('test-bucket');
392
+ await submitForm();
393
+ setupMocks({
394
+ isPending: true
395
+ });
396
+ expect(mockMutations.createBucket).toHaveBeenCalled();
397
+ });
398
+ it('shows error toast when versioning configuration fails', async ()=>{
399
+ renderBucketCreate();
400
+ await fillBucketName('test-bucket');
401
+ await user_event.click(screen.getByRole('checkbox', {
402
+ name: /versioning/i
403
+ }));
404
+ await submitForm();
405
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
406
+ createSuccessCallback();
407
+ const versioningErrorCallback = mockMutations.setVersioning.mock.calls[0][1].onError;
408
+ const error = new Error('Failed to enable versioning');
409
+ versioningErrorCallback(error);
410
+ expect(mockShowToast).toHaveBeenCalledWith({
411
+ open: true,
412
+ message: 'Failed to enable versioning',
413
+ status: 'error'
414
+ });
415
+ });
416
+ it('shows error toast when object lock configuration fails', async ()=>{
417
+ renderBucketCreate();
418
+ await fillBucketName('test-bucket');
419
+ await user_event.click(screen.getByRole('checkbox', {
420
+ name: /object-lock/i
421
+ }));
422
+ await user_event.click(screen.getByRole('checkbox', {
423
+ name: /default retention/i
424
+ }));
425
+ await submitForm();
426
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
427
+ createSuccessCallback();
428
+ expect(mockMutations.setVersioning).not.toHaveBeenCalled();
429
+ const objectLockErrorCallback = mockMutations.setObjectLock.mock.calls[0][1].onError;
430
+ const error = new Error('Failed to configure retention');
431
+ objectLockErrorCallback(error);
432
+ expect(mockShowToast).toHaveBeenCalledWith({
433
+ open: true,
434
+ message: 'Failed to configure retention',
435
+ status: 'error'
436
+ });
437
+ });
438
+ describe('Bucket Encryption Feature', ()=>{
439
+ beforeEach(()=>{
440
+ mockUseDataBrowserConfig.mockReturnValue({
441
+ s3Capabilities: {
442
+ bucketEncryption: false
443
+ }
444
+ });
445
+ });
446
+ it('does not show encryption checkbox when feature is disabled', ()=>{
447
+ mockUseDataBrowserConfig.mockReturnValue({
448
+ s3Capabilities: {
449
+ bucketEncryption: false
450
+ }
451
+ });
452
+ renderBucketCreate();
453
+ expect(screen.queryByText(/encryption/i)).not.toBeInTheDocument();
454
+ });
455
+ it('shows encryption checkbox when feature is enabled', ()=>{
456
+ mockUseDataBrowserConfig.mockReturnValue({
457
+ s3Capabilities: {
458
+ bucketEncryption: true
459
+ }
460
+ });
461
+ renderBucketCreate();
462
+ expect(screen.getByText(/encryption/i)).toBeInTheDocument();
463
+ });
464
+ it('creates bucket with encryption when enabled', async ()=>{
465
+ mockUseDataBrowserConfig.mockReturnValue({
466
+ s3Capabilities: {
467
+ bucketEncryption: true
468
+ }
469
+ });
470
+ renderBucketCreate();
471
+ await fillBucketName('test-bucket');
472
+ const encryptionCheckbox = screen.getByLabelText(/encryption/i);
473
+ await user_event.click(encryptionCheckbox);
474
+ await submitForm();
475
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
476
+ createSuccessCallback();
477
+ expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith({
478
+ Bucket: 'test-bucket',
479
+ ServerSideEncryptionConfiguration: {
480
+ Rules: [
481
+ {
482
+ ApplyServerSideEncryptionByDefault: {
483
+ SSEAlgorithm: 'AES256'
484
+ }
485
+ }
486
+ ]
487
+ }
488
+ }, expect.objectContaining({
489
+ onSuccess: expect.any(Function),
490
+ onError: expect.any(Function)
491
+ }));
492
+ });
493
+ it('creates bucket without encryption when checkbox not selected', async ()=>{
494
+ mockUseDataBrowserConfig.mockReturnValue({
495
+ s3Capabilities: {
496
+ bucketEncryption: true
497
+ }
498
+ });
499
+ renderBucketCreate();
500
+ await fillBucketName('test-bucket');
501
+ await submitForm();
502
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
503
+ createSuccessCallback();
504
+ expect(mockMutations.setBucketEncryption).not.toHaveBeenCalled();
505
+ expect(mockShowToast).toHaveBeenCalledWith({
506
+ open: true,
507
+ message: 'Bucket "test-bucket" created successfully',
508
+ status: 'success'
509
+ });
510
+ });
511
+ it('applies encryption after versioning when both enabled', async ()=>{
512
+ mockUseDataBrowserConfig.mockReturnValue({
513
+ s3Capabilities: {
514
+ bucketEncryption: true
515
+ }
516
+ });
517
+ renderBucketCreate();
518
+ await fillBucketName('test-bucket');
519
+ await user_event.click(screen.getByLabelText(/versioning/i));
520
+ await user_event.click(screen.getByLabelText(/encryption/i));
521
+ await submitForm();
522
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
523
+ createSuccessCallback();
524
+ expect(mockMutations.setVersioning).toHaveBeenCalled();
525
+ const versioningSuccessCallback = mockMutations.setVersioning.mock.calls[0][1].onSuccess;
526
+ versioningSuccessCallback();
527
+ expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith(expect.objectContaining({
528
+ Bucket: 'test-bucket'
529
+ }), expect.any(Object));
530
+ });
531
+ it('applies encryption after object lock retention when enabled', async ()=>{
532
+ mockUseDataBrowserConfig.mockReturnValue({
533
+ s3Capabilities: {
534
+ bucketEncryption: true
535
+ }
536
+ });
537
+ renderBucketCreate();
538
+ await fillBucketName('test-bucket');
539
+ await user_event.click(screen.getByLabelText(/object-lock/i));
540
+ await user_event.click(screen.getByLabelText(/default retention/i));
541
+ await user_event.click(screen.getByLabelText(/encryption/i));
542
+ await submitForm();
543
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
544
+ createSuccessCallback();
545
+ expect(mockMutations.setObjectLock).toHaveBeenCalled();
546
+ const objectLockSuccessCallback = mockMutations.setObjectLock.mock.calls[0][1].onSuccess;
547
+ objectLockSuccessCallback();
548
+ expect(mockMutations.setBucketEncryption).toHaveBeenCalledWith(expect.objectContaining({
549
+ Bucket: 'test-bucket'
550
+ }), expect.any(Object));
551
+ });
552
+ it('shows error toast when encryption configuration fails', async ()=>{
553
+ mockUseDataBrowserConfig.mockReturnValue({
554
+ s3Capabilities: {
555
+ bucketEncryption: true
556
+ }
557
+ });
558
+ renderBucketCreate();
559
+ await fillBucketName('test-bucket');
560
+ await user_event.click(screen.getByLabelText(/encryption/i));
561
+ await submitForm();
562
+ const createSuccessCallback = mockMutations.createBucket.mock.calls[0][1].onSuccess;
563
+ createSuccessCallback();
564
+ const encryptionErrorCallback = mockMutations.setBucketEncryption.mock.calls[0][1].onError;
565
+ const error = new Error('Failed to enable encryption');
566
+ encryptionErrorCallback(error);
567
+ expect(mockShowToast).toHaveBeenCalledWith({
568
+ open: true,
569
+ message: 'Failed to enable encryption',
570
+ status: 'error'
571
+ });
572
+ });
573
+ });
574
+ });
@@ -0,0 +1 @@
1
+ export {};