@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.
- 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.d.ts +1 -0
- package/dist/components/__tests__/BucketCreate.test.js +574 -0
- 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 +14 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.js +618 -0
- package/dist/components/__tests__/BucketLifecycleList.test.d.ts +1 -0
- package/dist/components/__tests__/BucketLifecycleList.test.js +325 -0
- package/dist/components/__tests__/BucketList.test.js +495 -81
- 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 +484 -179
- package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
- package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +16 -0
- package/dist/components/__tests__/BucketReplicationFormPage.test.js +1757 -0
- package/dist/components/__tests__/BucketReplicationList.test.d.ts +1 -0
- package/dist/components/__tests__/BucketReplicationList.test.js +344 -0
- package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
- package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.d.ts +1 -0
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +196 -0
- package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
- package/dist/components/__tests__/EmptyBucketButton.test.d.ts +1 -0
- package/dist/components/__tests__/EmptyBucketButton.test.js +302 -0
- 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 +50 -0
- package/dist/components/buckets/BucketCreate.js +279 -0
- package/dist/components/buckets/BucketDetails.d.ts +42 -0
- package/dist/components/buckets/BucketDetails.js +256 -40
- package/dist/components/buckets/BucketLifecycleFormPage.d.ts +15 -0
- package/dist/components/buckets/BucketLifecycleFormPage.js +1086 -0
- package/dist/components/buckets/BucketLifecycleList.d.ts +10 -0
- package/dist/components/buckets/BucketLifecycleList.js +270 -0
- package/dist/components/buckets/BucketList.d.ts +6 -4
- package/dist/components/buckets/BucketList.js +161 -94
- package/dist/components/buckets/BucketLocation.js +4 -4
- package/dist/components/buckets/BucketOverview.d.ts +86 -5
- package/dist/components/buckets/BucketOverview.js +481 -192
- package/dist/components/buckets/BucketPage.js +44 -22
- package/dist/components/buckets/BucketPolicyPage.js +155 -127
- package/dist/components/buckets/BucketReplicationFormPage.d.ts +1 -0
- package/dist/components/buckets/BucketReplicationFormPage.js +835 -0
- package/dist/components/buckets/BucketReplicationList.d.ts +11 -0
- package/dist/components/buckets/BucketReplicationList.js +189 -0
- 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 +18 -0
- package/dist/components/buckets/DeleteBucketConfigRuleButton.js +53 -0
- package/dist/components/buckets/EmptyBucketButton.d.ts +5 -0
- package/dist/components/buckets/EmptyBucketButton.js +232 -0
- package/dist/components/buckets/EmptyBucketSummary.d.ts +9 -0
- package/dist/components/buckets/EmptyBucketSummary.js +60 -0
- package/dist/components/buckets/EmptyBucketSummaryList.d.ts +13 -0
- package/dist/components/buckets/EmptyBucketSummaryList.js +140 -0
- 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 -13
- package/dist/components/index.js +20 -6
- 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 +263 -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 +95 -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/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.d.ts +4 -0
- package/dist/components/objects/ObjectLock/EditRetentionButton.js +32 -0
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.d.ts +3 -0
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +211 -0
- package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +9 -0
- package/dist/components/objects/ObjectLock/ObjectLockSettings.js +159 -0
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +8 -0
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +39 -0
- package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.d.ts +1 -0
- package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +204 -0
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.d.ts +1 -0
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +374 -0
- 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.d.ts +36 -0
- package/dist/components/ui/ArrayFieldActions.js +43 -0
- package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +16 -0
- package/dist/components/ui/ConfirmDeleteRuleModal.js +48 -0
- package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
- package/dist/components/ui/DeleteObjectModalContent.js +12 -12
- package/dist/components/ui/FilterFormSection.d.ts +44 -0
- package/dist/components/ui/FilterFormSection.js +159 -0
- 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 +14 -49
- package/dist/config/factory.js +23 -68
- 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.d.ts +1 -0
- package/dist/hooks/__tests__/useISVBucketDetection.test.js +188 -0
- 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 +95 -52
- 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 +29 -3
- package/dist/hooks/index.d.ts +19 -8
- package/dist/hooks/index.js +16 -5
- 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 +26 -0
- package/dist/hooks/useDeleteBucketConfigRule.js +46 -0
- package/dist/hooks/useEmptyBucket.d.ts +27 -0
- package/dist/hooks/useEmptyBucket.js +116 -0
- package/dist/hooks/useFeatures.d.ts +7 -0
- package/dist/hooks/useFeatures.js +8 -0
- package/dist/hooks/useISVBucketDetection.d.ts +15 -0
- package/dist/hooks/useISVBucketDetection.js +27 -0
- 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/hooks/useTableRowSelection.d.ts +9 -0
- package/dist/hooks/useTableRowSelection.js +45 -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 +170 -36
- package/dist/test/testUtils.js +229 -116
- package/dist/test/utils/errorHandling.test.js +146 -108
- package/dist/types/index.d.ts +49 -36
- 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 +22 -0
- package/dist/utils/constants.js +19 -0
- 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 +12 -3
- package/dist/utils/errorHandling.js +12 -7
- package/dist/utils/hooks.js +8 -8
- package/dist/utils/index.d.ts +5 -2
- package/dist/utils/index.js +5 -1
- 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 +53 -0
- package/dist/utils/s3RuleUtils.js +101 -0
- 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/factory.js
CHANGED
|
@@ -1,70 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
isProduction: __IS_PRODUCTION__
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
static createClientConfiguration(credentials) {
|
|
24
|
-
const buildConfig = this.getBuildTimeConfig();
|
|
25
|
-
const s3Config = buildConfig.isProduction && runtimeConfig ? runtimeConfig : buildConfig.s3;
|
|
26
|
-
const baseConfig = {
|
|
27
|
-
credentials,
|
|
28
|
-
region: s3Config.region,
|
|
29
|
-
forcePathStyle: s3Config.forcePathStyle ?? true,
|
|
30
|
-
endpoint: s3Config.endpoint
|
|
31
|
-
};
|
|
32
|
-
if (buildConfig.isDevelopment && buildConfig.dev.useProxy && buildConfig.dev.proxyEndpoint) baseConfig.endpoint = buildConfig.dev.proxyEndpoint;
|
|
33
|
-
return baseConfig;
|
|
34
|
-
}
|
|
35
|
-
static createProxyConfiguration() {
|
|
36
|
-
const buildConfig = this.getBuildTimeConfig();
|
|
37
|
-
const config = {
|
|
38
|
-
endpoint: buildConfig.s3.endpoint,
|
|
39
|
-
region: buildConfig.s3.region,
|
|
40
|
-
forcePathStyle: buildConfig.s3.forcePathStyle,
|
|
41
|
-
useProxy: buildConfig.isDevelopment && buildConfig.dev.useProxy
|
|
42
|
-
};
|
|
43
|
-
if (config.useProxy) config.proxyConfig = {
|
|
44
|
-
realHost: buildConfig.s3.realHost,
|
|
45
|
-
proxyBasePath: buildConfig.dev.proxyBasePath,
|
|
46
|
-
proxyHost: buildConfig.dev.proxyHost,
|
|
47
|
-
proxyPort: buildConfig.dev.proxyPort
|
|
48
|
-
};
|
|
49
|
-
return config;
|
|
50
|
-
}
|
|
51
|
-
static shouldUseProxyMiddleware() {
|
|
52
|
-
const buildConfig = this.getBuildTimeConfig();
|
|
53
|
-
return buildConfig.isDevelopment && buildConfig.dev.useProxy;
|
|
54
|
-
}
|
|
55
|
-
static getBuildInfo() {
|
|
56
|
-
const buildConfig = this.getBuildTimeConfig();
|
|
57
|
-
return {
|
|
58
|
-
environment: buildConfig.isDevelopment ? "development" : "production",
|
|
59
|
-
useProxy: buildConfig.dev.useProxy,
|
|
60
|
-
s3Endpoint: buildConfig.s3.endpoint,
|
|
61
|
-
proxyEndpoint: buildConfig.dev.proxyEndpoint
|
|
62
|
-
};
|
|
1
|
+
import joi from "joi";
|
|
2
|
+
const s3RuntimeConfigSchema = joi.object({
|
|
3
|
+
s3: joi.object({
|
|
4
|
+
endpoint: joi.string().optional().allow('origin'),
|
|
5
|
+
region: joi.string().min(1).required(),
|
|
6
|
+
forcePathStyle: joi.boolean().optional()
|
|
7
|
+
}).required()
|
|
8
|
+
});
|
|
9
|
+
async function loadRuntimeConfig(configUrl) {
|
|
10
|
+
const response = await fetch(configUrl);
|
|
11
|
+
if (!response.ok) throw new Error(`Failed to load config: ${response.statusText} (${response.status})`);
|
|
12
|
+
const data = await response.json();
|
|
13
|
+
const { error } = s3RuntimeConfigSchema.validate(data, {
|
|
14
|
+
allowUnknown: true,
|
|
15
|
+
abortEarly: false
|
|
16
|
+
});
|
|
17
|
+
if (error) {
|
|
18
|
+
const messages = error.details.map((d)=>d.message).join('; ');
|
|
19
|
+
throw new Error(`Invalid config: ${messages}`);
|
|
63
20
|
}
|
|
21
|
+
if (data.s3?.endpoint === 'origin') if ('undefined' != typeof window && window.location?.origin) data.s3.endpoint = window.location.origin;
|
|
22
|
+
else throw new Error('Cannot use "origin" keyword outside browser');
|
|
23
|
+
return data;
|
|
64
24
|
}
|
|
65
|
-
|
|
66
|
-
const shouldUseProxy = ()=>S3ConfigurationFactory.shouldUseProxyMiddleware();
|
|
67
|
-
const getProxyConfig = ()=>S3ConfigurationFactory.createProxyConfiguration();
|
|
68
|
-
const getBuildInfo = ()=>S3ConfigurationFactory.getBuildInfo();
|
|
69
|
-
const loadRuntimeConfig = ()=>S3ConfigurationFactory.loadRuntimeConfig();
|
|
70
|
-
export { S3ConfigurationFactory, createS3Config, getBuildInfo, getProxyConfig, loadRuntimeConfig, shouldUseProxy };
|
|
25
|
+
export { loadRuntimeConfig, s3RuntimeConfigSchema };
|
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
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|