@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.
- package/dist/components/DataBrowserUI.d.ts +12 -0
- package/dist/components/DataBrowserUI.js +99 -0
- package/dist/components/Editor.d.ts +1 -1
- package/dist/components/Editor.js +3 -3
- package/dist/components/__tests__/BucketAccessor.test.js +214 -0
- package/dist/components/__tests__/BucketCorsPage.test.d.ts +1 -0
- package/dist/components/__tests__/BucketCorsPage.test.js +263 -0
- package/dist/components/__tests__/BucketCreate.test.js +271 -105
- package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
- package/dist/components/__tests__/BucketDetails.test.js +421 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +13 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.js +178 -178
- package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
- package/dist/components/__tests__/BucketList.test.js +463 -239
- package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
- package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
- package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
- package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
- package/dist/components/__tests__/BucketOverview.test.js +281 -266
- package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
- package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +15 -0
- package/dist/components/__tests__/BucketReplicationFormPage.test.js +544 -544
- package/dist/components/__tests__/BucketReplicationList.test.js +106 -106
- package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
- package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
- package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
- package/dist/components/__tests__/EmptyBucketButton.test.js +59 -59
- package/dist/components/__tests__/MetadataSearch.test.js +65 -65
- package/dist/components/__tests__/ObjectList.test.js +741 -240
- package/dist/components/__tests__/UploadButton.test.js +45 -45
- package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
- package/dist/components/breadcrumb/Breadcrumb.js +37 -0
- package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
- package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
- package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
- package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
- package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
- package/dist/components/breadcrumb/index.d.ts +8 -0
- package/dist/components/breadcrumb/index.js +4 -0
- package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
- package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
- package/dist/components/buckets/BucketAccessor.d.ts +2 -0
- package/dist/components/buckets/BucketAccessor.js +125 -0
- package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
- package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
- package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
- package/dist/components/buckets/BucketCorsPage.js +234 -0
- package/dist/components/buckets/BucketCreate.d.ts +3 -2
- package/dist/components/buckets/BucketCreate.js +93 -47
- package/dist/components/buckets/BucketDetails.d.ts +42 -0
- package/dist/components/buckets/BucketDetails.js +249 -85
- package/dist/components/buckets/BucketLifecycleFormPage.js +225 -191
- package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
- package/dist/components/buckets/BucketLifecycleList.js +59 -61
- package/dist/components/buckets/BucketList.d.ts +7 -8
- package/dist/components/buckets/BucketList.js +158 -101
- package/dist/components/buckets/BucketLocation.js +4 -4
- package/dist/components/buckets/BucketOverview.d.ts +22 -2
- package/dist/components/buckets/BucketOverview.js +394 -187
- package/dist/components/buckets/BucketPage.js +43 -21
- package/dist/components/buckets/BucketPolicyPage.js +155 -127
- package/dist/components/buckets/BucketReplicationFormPage.js +134 -133
- package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
- package/dist/components/buckets/BucketReplicationList.js +48 -45
- package/dist/components/buckets/BucketVersioning.d.ts +4 -0
- package/dist/components/buckets/BucketVersioning.js +76 -0
- package/dist/components/buckets/DeleteBucketButton.js +8 -8
- package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +2 -2
- package/dist/components/buckets/DeleteBucketConfigRuleButton.js +2 -2
- package/dist/components/buckets/EmptyBucketButton.js +24 -24
- package/dist/components/buckets/EmptyBucketSummary.d.ts +2 -2
- package/dist/components/buckets/EmptyBucketSummary.js +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.d.ts +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
- package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
- package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
- package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
- package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
- package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
- package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
- package/dist/components/buckets/notifications/EventsSection.js +145 -29
- package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
- package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
- package/dist/components/buckets/notifications/events.d.ts +71 -7
- package/dist/components/buckets/notifications/events.js +98 -16
- package/dist/components/index.d.ts +27 -20
- package/dist/components/index.js +17 -10
- package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
- package/dist/components/layouts/ArrowNavigation.js +28 -0
- package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
- package/dist/components/layouts/BrowserPageLayout.js +10 -5
- package/dist/components/objects/CreateFolderButton.d.ts +2 -2
- package/dist/components/objects/CreateFolderButton.js +12 -12
- package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
- package/dist/components/objects/DeleteObjectButton.js +19 -21
- package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
- package/dist/components/objects/GetPresignedUrlButton.js +255 -0
- package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectMetadata.js +289 -230
- package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
- package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectTags.js +103 -123
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
- package/dist/components/objects/ObjectDetails/formUtils.d.ts +15 -0
- package/dist/components/objects/ObjectDetails/formUtils.js +7 -0
- package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
- package/dist/components/objects/ObjectDetails/index.js +152 -40
- package/dist/components/objects/ObjectList.d.ts +12 -10
- package/dist/components/objects/ObjectList.js +590 -263
- package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
- package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
- package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
- package/dist/components/objects/ObjectPage.js +12 -8
- package/dist/components/objects/UploadButton.d.ts +3 -3
- package/dist/components/objects/UploadButton.js +10 -10
- package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
- package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
- package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
- package/dist/components/providers/DataBrowserProvider.js +60 -38
- package/dist/components/providers/QueryProvider.d.ts +9 -0
- package/dist/components/providers/QueryProvider.js +21 -0
- package/dist/components/search/MetadataSearch.js +29 -28
- package/dist/components/search/SearchHints.js +1 -1
- package/dist/components/ui/ArrayFieldActions.js +12 -7
- package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
- package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
- package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
- package/dist/components/ui/DeleteObjectModalContent.js +12 -12
- package/dist/components/ui/FilterFormSection.d.ts +2 -2
- package/dist/components/ui/FilterFormSection.js +29 -29
- package/dist/components/ui/Search.elements.d.ts +2 -2
- package/dist/components/ui/Search.elements.js +7 -7
- package/dist/components/ui/Table.elements.d.ts +2 -1
- package/dist/components/ui/Table.elements.js +18 -12
- package/dist/config/__tests__/factory.test.d.ts +1 -0
- package/dist/config/__tests__/factory.test.js +311 -0
- package/dist/config/factory.d.ts +10 -56
- package/dist/config/factory.js +23 -71
- package/dist/config/types.d.ts +212 -34
- package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
- package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
- package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
- package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
- package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
- package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
- package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
- package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
- package/dist/hooks/bucketConfiguration.d.ts +8 -1
- package/dist/hooks/bucketConfiguration.js +52 -51
- package/dist/hooks/bucketOperations.d.ts +10 -1
- package/dist/hooks/bucketOperations.js +10 -9
- package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
- package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
- package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
- package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
- package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
- package/dist/hooks/factories/index.d.ts +4 -4
- package/dist/hooks/factories/index.js +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
- package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
- package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
- package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
- package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
- package/dist/hooks/index.d.ts +19 -12
- package/dist/hooks/index.js +16 -9
- package/dist/hooks/loginOperations.d.ts +1 -1
- package/dist/hooks/loginOperations.js +1 -1
- package/dist/hooks/objectOperations.d.ts +2 -2
- package/dist/hooks/objectOperations.js +50 -49
- package/dist/hooks/presignedOperations.d.ts +4 -4
- package/dist/hooks/presignedOperations.js +5 -5
- package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
- package/dist/hooks/useAccessibleBuckets.js +115 -0
- package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
- package/dist/hooks/useBatchObjectLegalHold.js +48 -0
- package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
- package/dist/hooks/useBucketConfigEditor.js +82 -0
- package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
- package/dist/hooks/useDataBrowserNavigate.js +24 -0
- package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
- package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
- package/dist/hooks/useEmptyBucket.js +11 -11
- package/dist/hooks/useFeatures.d.ts +7 -0
- package/dist/hooks/useFeatures.js +8 -0
- package/dist/hooks/useISVBucketDetection.js +6 -6
- package/dist/hooks/useIsBucketEmpty.js +4 -4
- package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
- package/dist/hooks/useLimitedAccessFlow.js +23 -0
- package/dist/hooks/useS3Client.d.ts +6 -0
- package/dist/hooks/useS3Client.js +3 -2
- package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
- package/dist/hooks/useS3ConfigSwitch.js +37 -0
- package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
- package/dist/hooks/useSupportedNotificationEvents.js +8 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +2 -2
- package/dist/schemas/bucketPolicySchema.json +3 -13
- package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
- package/dist/test/msw/handlers/deleteBucket.js +20 -10
- package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketAcl.js +29 -17
- package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketLocation.js +29 -15
- package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
- package/dist/test/msw/handlers/headObject.d.ts +1 -1
- package/dist/test/msw/handlers/headObject.js +31 -13
- package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
- package/dist/test/msw/handlers/listBuckets.js +5 -3
- package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
- package/dist/test/msw/handlers/listObjectVersions.js +38 -26
- package/dist/test/msw/handlers/listObjects.d.ts +1 -1
- package/dist/test/msw/handlers/listObjects.js +35 -23
- package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
- package/dist/test/msw/handlers/objectLegalHold.js +32 -17
- package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
- package/dist/test/msw/handlers/objectRetention.js +31 -17
- package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
- package/dist/test/msw/handlers/putBucketAcl.js +29 -14
- package/dist/test/msw/handlers/putObject.d.ts +1 -1
- package/dist/test/msw/handlers/putObject.js +27 -12
- package/dist/test/msw/handlers.d.ts +3 -3
- package/dist/test/msw/handlers.js +77 -54
- package/dist/test/msw/index.d.ts +2 -2
- package/dist/test/msw/index.js +1 -1
- package/dist/test/msw/server.d.ts +1 -1
- package/dist/test/msw/server.js +1 -1
- package/dist/test/msw/utils.js +2 -2
- package/dist/test/setup.d.ts +1 -1
- package/dist/test/setup.js +13 -30
- package/dist/test/testUtils.d.ts +85 -33
- package/dist/test/testUtils.js +176 -111
- package/dist/test/utils/errorHandling.test.js +119 -119
- package/dist/types/index.d.ts +50 -37
- package/dist/types/monaco.d.ts +13 -0
- package/dist/types/monaco.js +0 -0
- package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
- package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
- package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
- package/dist/utils/__tests__/s3Client.test.js +340 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
- package/dist/utils/constants.d.ts +10 -0
- package/dist/utils/constants.js +19 -9
- package/dist/utils/deletion/index.d.ts +2 -2
- package/dist/utils/deletion/index.js +1 -1
- package/dist/utils/deletion/messages.d.ts +1 -1
- package/dist/utils/deletion/messages.js +4 -4
- package/dist/utils/errorHandling.d.ts +3 -3
- package/dist/utils/errorHandling.js +6 -6
- package/dist/utils/hooks.js +8 -8
- package/dist/utils/index.d.ts +5 -4
- package/dist/utils/index.js +4 -2
- package/dist/utils/proxyMiddleware.d.ts +32 -13
- package/dist/utils/proxyMiddleware.js +90 -36
- package/dist/utils/s3Client.d.ts +14 -4
- package/dist/utils/s3Client.js +5 -26
- package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
- package/dist/utils/s3ConfigIdentifier.js +57 -0
- package/dist/utils/s3RuleUtils.d.ts +5 -5
- package/dist/utils/s3RuleUtils.js +17 -17
- package/package.json +10 -8
- package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
- package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
- package/dist/hooks/useLoginMutation.d.ts +0 -21
- package/dist/hooks/useLoginMutation.js +0 -9
- package/dist/utils/useFeatures.d.ts +0 -1
- package/dist/utils/useFeatures.js +0 -7
- /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
package/dist/config/types.d.ts
CHANGED
|
@@ -1,46 +1,224 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Runtime configuration types
|
|
3
3
|
*/
|
|
4
|
-
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
*
|
|
147
|
+
* Storage class selector props
|
|
25
148
|
*/
|
|
26
|
-
export interface
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
*
|
|
154
|
+
* Main DataBrowserUI component props
|
|
40
155
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { act } from "@testing-library/react";
|
|
2
|
+
import { renderHookWithWrapper, testConfig, testCredentials } from "../../test/testUtils.js";
|
|
3
|
+
import { computeS3ConfigIdentifier } from "../../utils/s3ConfigIdentifier.js";
|
|
4
|
+
import { useAccessibleBuckets } from "../useAccessibleBuckets.js";
|
|
5
|
+
describe('useAccessibleBuckets', ()=>{
|
|
6
|
+
const mockS3ConfigIdentifier = computeS3ConfigIdentifier({
|
|
7
|
+
...testConfig,
|
|
8
|
+
credentials: testCredentials
|
|
9
|
+
});
|
|
10
|
+
const storageKey = `data-browser-accessible-buckets-${mockS3ConfigIdentifier}`;
|
|
11
|
+
const flagKey = `data-browser-limited-access-${mockS3ConfigIdentifier}`;
|
|
12
|
+
beforeEach(()=>{
|
|
13
|
+
sessionStorage.clear();
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
});
|
|
16
|
+
afterEach(()=>{
|
|
17
|
+
sessionStorage.clear();
|
|
18
|
+
});
|
|
19
|
+
it('starts with empty bucket list and no limited access flag', ()=>{
|
|
20
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
21
|
+
expect(result.current.accessibleBuckets).toEqual([]);
|
|
22
|
+
expect(result.current.hasLimitedAccess).toBe(false);
|
|
23
|
+
});
|
|
24
|
+
it('loads existing buckets from session on mount', ()=>{
|
|
25
|
+
sessionStorage.setItem(storageKey, JSON.stringify([
|
|
26
|
+
'bucket1',
|
|
27
|
+
'bucket2'
|
|
28
|
+
]));
|
|
29
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
30
|
+
expect(result.current.accessibleBuckets).toHaveLength(2);
|
|
31
|
+
expect(result.current.accessibleBuckets[0].Name).toBe('bucket1');
|
|
32
|
+
expect(result.current.accessibleBuckets[1].Name).toBe('bucket2');
|
|
33
|
+
});
|
|
34
|
+
it('loads limited access flag from session on mount', ()=>{
|
|
35
|
+
sessionStorage.setItem(flagKey, 'true');
|
|
36
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
37
|
+
expect(result.current.hasLimitedAccess).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
it('handles corrupted session data gracefully', ()=>{
|
|
40
|
+
sessionStorage.setItem(storageKey, 'invalid-json');
|
|
41
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
42
|
+
expect(result.current.accessibleBuckets).toEqual([]);
|
|
43
|
+
});
|
|
44
|
+
it('adds a bucket to the accessible list', ()=>{
|
|
45
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
46
|
+
act(()=>{
|
|
47
|
+
result.current.addAccessibleBucket('new-bucket');
|
|
48
|
+
});
|
|
49
|
+
expect(result.current.accessibleBuckets).toHaveLength(1);
|
|
50
|
+
expect(result.current.accessibleBuckets[0].Name).toBe('new-bucket');
|
|
51
|
+
});
|
|
52
|
+
it('prevents duplicate buckets from being added', ()=>{
|
|
53
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
54
|
+
act(()=>{
|
|
55
|
+
result.current.addAccessibleBucket('duplicate-bucket');
|
|
56
|
+
result.current.addAccessibleBucket('duplicate-bucket');
|
|
57
|
+
});
|
|
58
|
+
expect(result.current.accessibleBuckets).toHaveLength(1);
|
|
59
|
+
});
|
|
60
|
+
it('adds multiple unique buckets', ()=>{
|
|
61
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
62
|
+
act(()=>{
|
|
63
|
+
result.current.addAccessibleBucket('bucket1');
|
|
64
|
+
result.current.addAccessibleBucket('bucket2');
|
|
65
|
+
result.current.addAccessibleBucket('bucket3');
|
|
66
|
+
});
|
|
67
|
+
expect(result.current.accessibleBuckets).toHaveLength(3);
|
|
68
|
+
expect(result.current.accessibleBuckets.map((b)=>b.Name)).toEqual([
|
|
69
|
+
'bucket1',
|
|
70
|
+
'bucket2',
|
|
71
|
+
'bucket3'
|
|
72
|
+
]);
|
|
73
|
+
});
|
|
74
|
+
it('toggles limited access mode', ()=>{
|
|
75
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
76
|
+
act(()=>{
|
|
77
|
+
result.current.setLimitedAccess(true);
|
|
78
|
+
});
|
|
79
|
+
expect(result.current.hasLimitedAccess).toBe(true);
|
|
80
|
+
act(()=>{
|
|
81
|
+
result.current.setLimitedAccess(false);
|
|
82
|
+
});
|
|
83
|
+
expect(result.current.hasLimitedAccess).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
it('clears all accessible buckets and resets limited access', ()=>{
|
|
86
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
87
|
+
act(()=>{
|
|
88
|
+
result.current.addAccessibleBucket('bucket1');
|
|
89
|
+
result.current.addAccessibleBucket('bucket2');
|
|
90
|
+
result.current.setLimitedAccess(true);
|
|
91
|
+
});
|
|
92
|
+
expect(result.current.accessibleBuckets).toHaveLength(2);
|
|
93
|
+
expect(result.current.hasLimitedAccess).toBe(true);
|
|
94
|
+
act(()=>{
|
|
95
|
+
result.current.clearAccessibleBuckets();
|
|
96
|
+
});
|
|
97
|
+
expect(result.current.accessibleBuckets).toEqual([]);
|
|
98
|
+
expect(result.current.hasLimitedAccess).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
it('handles storage quota errors without crashing', ()=>{
|
|
101
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
102
|
+
jest.spyOn(Storage.prototype, 'setItem').mockImplementationOnce(()=>{
|
|
103
|
+
throw new Error('Storage quota exceeded');
|
|
104
|
+
});
|
|
105
|
+
expect(()=>{
|
|
106
|
+
act(()=>{
|
|
107
|
+
result.current.addAccessibleBucket('new-bucket');
|
|
108
|
+
});
|
|
109
|
+
}).not.toThrow();
|
|
110
|
+
});
|
|
111
|
+
it('returns buckets with required S3 properties', ()=>{
|
|
112
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
113
|
+
act(()=>{
|
|
114
|
+
result.current.addAccessibleBucket('test-bucket');
|
|
115
|
+
});
|
|
116
|
+
const bucket = result.current.accessibleBuckets[0];
|
|
117
|
+
expect(bucket).toHaveProperty('Name', 'test-bucket');
|
|
118
|
+
expect(bucket).toHaveProperty('CreationDate');
|
|
119
|
+
expect(bucket.CreationDate).toBeInstanceOf(Date);
|
|
120
|
+
});
|
|
121
|
+
it('maintains consistent CreationDate for added buckets', ()=>{
|
|
122
|
+
const { result: result1 } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
123
|
+
act(()=>{
|
|
124
|
+
result1.current.addAccessibleBucket('consistent-bucket');
|
|
125
|
+
});
|
|
126
|
+
const firstCreationDate = result1.current.accessibleBuckets[0].CreationDate;
|
|
127
|
+
expect(firstCreationDate).toBeInstanceOf(Date);
|
|
128
|
+
const { result: result2 } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
129
|
+
const secondCreationDate = result2.current.accessibleBuckets[0].CreationDate;
|
|
130
|
+
expect(secondCreationDate).toBeInstanceOf(Date);
|
|
131
|
+
expect(firstCreationDate.getTime()).toBe(secondCreationDate.getTime());
|
|
132
|
+
});
|
|
133
|
+
it('migrates legacy string array format to new format', ()=>{
|
|
134
|
+
sessionStorage.setItem(storageKey, JSON.stringify([
|
|
135
|
+
'legacy-bucket'
|
|
136
|
+
]));
|
|
137
|
+
const { result } = renderHookWithWrapper(()=>useAccessibleBuckets());
|
|
138
|
+
expect(result.current.accessibleBuckets).toHaveLength(1);
|
|
139
|
+
expect(result.current.accessibleBuckets[0].Name).toBe('legacy-bucket');
|
|
140
|
+
expect(result.current.accessibleBuckets[0].CreationDate).toBeInstanceOf(Date);
|
|
141
|
+
const stored = JSON.parse(sessionStorage.getItem(storageKey) || '[]');
|
|
142
|
+
expect(stored[0]).toHaveProperty('name');
|
|
143
|
+
expect(stored[0]).toHaveProperty('addedAt');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { renderHook } from "@testing-library/react";
|
|
2
|
-
import { useISVBucketStatus } from "../useISVBucketDetection.js";
|
|
3
|
-
import { useGetBucketTagging } from "../bucketConfiguration.js";
|
|
4
|
-
import { useFeatures } from "../../utils/useFeatures.js";
|
|
5
|
-
import { BUCKET_TAG_APPLICATION, BUCKET_TAG_VEEAM_APPLICATION, COMMVAULT_APPLICATION, VEEAM_BACKUP_REPLICATION, VEEAM_OFFICE_365, VEEAM_OFFICE_365_V8, VEEAM_VBO_APPLICATION } from "../../utils/constants.js";
|
|
6
2
|
import { createTestWrapper } from "../../test/testUtils.js";
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
import { BUCKET_TAG_APPLICATION, BUCKET_TAG_VEEAM_APPLICATION, COMMVAULT_APPLICATION, VEEAM_BACKUP_REPLICATION, VEEAM_OFFICE_365, VEEAM_OFFICE_365_V8, VEEAM_VBO_APPLICATION } from "../../utils/constants.js";
|
|
4
|
+
import { useGetBucketTagging } from "../bucketConfiguration.js";
|
|
5
|
+
import { useFeatures } from "../useFeatures.js";
|
|
6
|
+
import { useISVBucketStatus } from "../useISVBucketDetection.js";
|
|
7
|
+
jest.mock('../bucketConfiguration');
|
|
8
|
+
jest.mock('../useFeatures');
|
|
9
9
|
const mockUseGetBucketTagging = useGetBucketTagging;
|
|
10
10
|
const mockUseFeatures = useFeatures;
|
|
11
|
-
describe(
|
|
11
|
+
describe('useISVBucketStatus', ()=>{
|
|
12
12
|
beforeEach(()=>{
|
|
13
13
|
jest.clearAllMocks();
|
|
14
14
|
mockUseFeatures.mockReturnValue(true);
|
|
15
15
|
});
|
|
16
|
-
it(
|
|
16
|
+
it('should return false for all flags when ISV feature is disabled', ()=>{
|
|
17
17
|
mockUseFeatures.mockReturnValue(false);
|
|
18
18
|
mockUseGetBucketTagging.mockReturnValue({
|
|
19
19
|
data: void 0,
|
|
20
|
-
status:
|
|
20
|
+
status: 'success'
|
|
21
21
|
});
|
|
22
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
22
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
23
23
|
wrapper: createTestWrapper()
|
|
24
24
|
});
|
|
25
25
|
expect(result.current.isVeeamBucket).toBe(false);
|
|
@@ -28,7 +28,7 @@ describe("useISVBucketStatus", ()=>{
|
|
|
28
28
|
expect(result.current.isvApplication).toBeUndefined();
|
|
29
29
|
expect(result.current.isLoading).toBe(false);
|
|
30
30
|
});
|
|
31
|
-
it(
|
|
31
|
+
it('should detect Veeam Backup & Replication bucket', ()=>{
|
|
32
32
|
mockUseGetBucketTagging.mockReturnValue({
|
|
33
33
|
data: {
|
|
34
34
|
TagSet: [
|
|
@@ -38,17 +38,17 @@ describe("useISVBucketStatus", ()=>{
|
|
|
38
38
|
}
|
|
39
39
|
]
|
|
40
40
|
},
|
|
41
|
-
status:
|
|
41
|
+
status: 'success'
|
|
42
42
|
});
|
|
43
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
43
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
44
44
|
wrapper: createTestWrapper()
|
|
45
45
|
});
|
|
46
46
|
expect(result.current.isVeeamBucket).toBe(true);
|
|
47
47
|
expect(result.current.isCommvaultBucket).toBe(false);
|
|
48
48
|
expect(result.current.isISVManaged).toBe(true);
|
|
49
|
-
expect(result.current.isvApplication).toBe(
|
|
49
|
+
expect(result.current.isvApplication).toBe('Veeam');
|
|
50
50
|
});
|
|
51
|
-
it(
|
|
51
|
+
it('should detect Veeam Office 365 v6/v7 bucket', ()=>{
|
|
52
52
|
mockUseGetBucketTagging.mockReturnValue({
|
|
53
53
|
data: {
|
|
54
54
|
TagSet: [
|
|
@@ -58,16 +58,16 @@ describe("useISVBucketStatus", ()=>{
|
|
|
58
58
|
}
|
|
59
59
|
]
|
|
60
60
|
},
|
|
61
|
-
status:
|
|
61
|
+
status: 'success'
|
|
62
62
|
});
|
|
63
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
63
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
64
64
|
wrapper: createTestWrapper()
|
|
65
65
|
});
|
|
66
66
|
expect(result.current.isVeeamBucket).toBe(true);
|
|
67
67
|
expect(result.current.isISVManaged).toBe(true);
|
|
68
|
-
expect(result.current.isvApplication).toBe(
|
|
68
|
+
expect(result.current.isvApplication).toBe('Veeam');
|
|
69
69
|
});
|
|
70
|
-
it(
|
|
70
|
+
it('should detect Veeam Office 365 v8+ bucket', ()=>{
|
|
71
71
|
mockUseGetBucketTagging.mockReturnValue({
|
|
72
72
|
data: {
|
|
73
73
|
TagSet: [
|
|
@@ -77,16 +77,16 @@ describe("useISVBucketStatus", ()=>{
|
|
|
77
77
|
}
|
|
78
78
|
]
|
|
79
79
|
},
|
|
80
|
-
status:
|
|
80
|
+
status: 'success'
|
|
81
81
|
});
|
|
82
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
82
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
83
83
|
wrapper: createTestWrapper()
|
|
84
84
|
});
|
|
85
85
|
expect(result.current.isVeeamBucket).toBe(true);
|
|
86
86
|
expect(result.current.isISVManaged).toBe(true);
|
|
87
|
-
expect(result.current.isvApplication).toBe(
|
|
87
|
+
expect(result.current.isvApplication).toBe('Veeam');
|
|
88
88
|
});
|
|
89
|
-
it(
|
|
89
|
+
it('should detect ISV bucket tagged as Veeam Backup & Replication', ()=>{
|
|
90
90
|
mockUseGetBucketTagging.mockReturnValue({
|
|
91
91
|
data: {
|
|
92
92
|
TagSet: [
|
|
@@ -96,16 +96,16 @@ describe("useISVBucketStatus", ()=>{
|
|
|
96
96
|
}
|
|
97
97
|
]
|
|
98
98
|
},
|
|
99
|
-
status:
|
|
99
|
+
status: 'success'
|
|
100
100
|
});
|
|
101
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
101
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
102
102
|
wrapper: createTestWrapper()
|
|
103
103
|
});
|
|
104
104
|
expect(result.current.isVeeamBucket).toBe(true);
|
|
105
105
|
expect(result.current.isISVManaged).toBe(true);
|
|
106
|
-
expect(result.current.isvApplication).toBe(
|
|
106
|
+
expect(result.current.isvApplication).toBe('Veeam');
|
|
107
107
|
});
|
|
108
|
-
it(
|
|
108
|
+
it('should detect ISV bucket tagged as Veeam VBO', ()=>{
|
|
109
109
|
mockUseGetBucketTagging.mockReturnValue({
|
|
110
110
|
data: {
|
|
111
111
|
TagSet: [
|
|
@@ -115,16 +115,16 @@ describe("useISVBucketStatus", ()=>{
|
|
|
115
115
|
}
|
|
116
116
|
]
|
|
117
117
|
},
|
|
118
|
-
status:
|
|
118
|
+
status: 'success'
|
|
119
119
|
});
|
|
120
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
120
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
121
121
|
wrapper: createTestWrapper()
|
|
122
122
|
});
|
|
123
123
|
expect(result.current.isVeeamBucket).toBe(true);
|
|
124
124
|
expect(result.current.isISVManaged).toBe(true);
|
|
125
|
-
expect(result.current.isvApplication).toBe(
|
|
125
|
+
expect(result.current.isvApplication).toBe('Veeam');
|
|
126
126
|
});
|
|
127
|
-
it(
|
|
127
|
+
it('should detect Commvault bucket', ()=>{
|
|
128
128
|
mockUseGetBucketTagging.mockReturnValue({
|
|
129
129
|
data: {
|
|
130
130
|
TagSet: [
|
|
@@ -134,29 +134,29 @@ describe("useISVBucketStatus", ()=>{
|
|
|
134
134
|
}
|
|
135
135
|
]
|
|
136
136
|
},
|
|
137
|
-
status:
|
|
137
|
+
status: 'success'
|
|
138
138
|
});
|
|
139
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
139
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
140
140
|
wrapper: createTestWrapper()
|
|
141
141
|
});
|
|
142
142
|
expect(result.current.isVeeamBucket).toBe(false);
|
|
143
143
|
expect(result.current.isCommvaultBucket).toBe(true);
|
|
144
144
|
expect(result.current.isISVManaged).toBe(true);
|
|
145
|
-
expect(result.current.isvApplication).toBe(
|
|
145
|
+
expect(result.current.isvApplication).toBe('Commvault');
|
|
146
146
|
});
|
|
147
|
-
it(
|
|
147
|
+
it('should return false for non-ISV bucket', ()=>{
|
|
148
148
|
mockUseGetBucketTagging.mockReturnValue({
|
|
149
149
|
data: {
|
|
150
150
|
TagSet: [
|
|
151
151
|
{
|
|
152
|
-
Key:
|
|
153
|
-
Value:
|
|
152
|
+
Key: 'SomeOtherTag',
|
|
153
|
+
Value: 'SomeValue'
|
|
154
154
|
}
|
|
155
155
|
]
|
|
156
156
|
},
|
|
157
|
-
status:
|
|
157
|
+
status: 'success'
|
|
158
158
|
});
|
|
159
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
159
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
160
160
|
wrapper: createTestWrapper()
|
|
161
161
|
});
|
|
162
162
|
expect(result.current.isVeeamBucket).toBe(false);
|
|
@@ -164,23 +164,23 @@ describe("useISVBucketStatus", ()=>{
|
|
|
164
164
|
expect(result.current.isISVManaged).toBe(false);
|
|
165
165
|
expect(result.current.isvApplication).toBeUndefined();
|
|
166
166
|
});
|
|
167
|
-
it(
|
|
167
|
+
it('should return loading state when fetching bucket tags', ()=>{
|
|
168
168
|
mockUseGetBucketTagging.mockReturnValue({
|
|
169
169
|
data: void 0,
|
|
170
|
-
status:
|
|
170
|
+
status: 'pending'
|
|
171
171
|
});
|
|
172
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
172
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
173
173
|
wrapper: createTestWrapper()
|
|
174
174
|
});
|
|
175
175
|
expect(result.current.isLoading).toBe(true);
|
|
176
176
|
});
|
|
177
|
-
it(
|
|
177
|
+
it('should not be loading when ISV feature is disabled', ()=>{
|
|
178
178
|
mockUseFeatures.mockReturnValue(false);
|
|
179
179
|
mockUseGetBucketTagging.mockReturnValue({
|
|
180
180
|
data: void 0,
|
|
181
|
-
status:
|
|
181
|
+
status: 'pending'
|
|
182
182
|
});
|
|
183
|
-
const { result } = renderHook(()=>useISVBucketStatus(
|
|
183
|
+
const { result } = renderHook(()=>useISVBucketStatus('test-bucket'), {
|
|
184
184
|
wrapper: createTestWrapper()
|
|
185
185
|
});
|
|
186
186
|
expect(result.current.isLoading).toBe(false);
|