@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
|
@@ -1,18 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import type { ServiceInputTypes, ServiceOutputTypes } from '@aws-sdk/client-s3';
|
|
2
|
+
import type { Pluggable } from '@aws-sdk/types';
|
|
3
|
+
import type { ProxyConfiguration } from '../config/types';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves proxy endpoint to a full URL
|
|
6
|
+
*
|
|
7
|
+
* Supported formats:
|
|
8
|
+
* - "origin" → window.location.origin
|
|
9
|
+
* - "/path" → window.location.origin + "/path"
|
|
10
|
+
* - "http://..." → unchanged
|
|
11
|
+
*
|
|
12
|
+
* @param endpoint Proxy endpoint string
|
|
13
|
+
* @returns Resolved full URL
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveProxyEndpoint(endpoint: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Parses endpoint URL and validates basic security requirements
|
|
18
|
+
*
|
|
19
|
+
* @param endpoint Endpoint URL string
|
|
20
|
+
* @returns Parsed endpoint components
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseEndpoint(endpoint: string): {
|
|
23
|
+
hostname: string;
|
|
24
|
+
port: number;
|
|
25
|
+
protocol: string;
|
|
26
|
+
pathname: string;
|
|
27
|
+
};
|
|
8
28
|
/**
|
|
9
29
|
* Creates a two-stage proxy middleware for AWS SDK v3
|
|
10
30
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 2. Post-signing: Routes signed requests through proxy to avoid CORS issues
|
|
31
|
+
* Stage 1: Pre-signing - Replace proxy host with target S3 for signature calculation
|
|
32
|
+
* Stage 2: Post-signing - Route signed request back through proxy
|
|
14
33
|
*
|
|
15
|
-
* @param config Proxy configuration
|
|
34
|
+
* @param config Proxy configuration with target S3 endpoint and proxy endpoint
|
|
35
|
+
* @returns AWS SDK v3 pluggable middleware
|
|
16
36
|
*/
|
|
17
|
-
export declare const createProxyMiddleware: (config:
|
|
18
|
-
export {};
|
|
37
|
+
export declare const createProxyMiddleware: (config: ProxyConfiguration) => Pluggable<ServiceInputTypes, ServiceOutputTypes>;
|
|
@@ -1,56 +1,110 @@
|
|
|
1
1
|
import { HttpRequest } from "@aws-sdk/protocol-http";
|
|
2
|
-
const
|
|
2
|
+
const ALLOWED_PROTOCOLS = [
|
|
3
|
+
'http:',
|
|
4
|
+
'https:'
|
|
5
|
+
];
|
|
6
|
+
function resolveProxyEndpoint(endpoint) {
|
|
7
|
+
if (!endpoint || 'string' != typeof endpoint) throw new Error('Proxy endpoint must be a non-empty string');
|
|
8
|
+
const trimmed = endpoint.trim();
|
|
9
|
+
if (!trimmed) throw new Error('Proxy endpoint cannot be empty');
|
|
10
|
+
if ('origin' === trimmed) {
|
|
11
|
+
if ('undefined' == typeof window || !window?.location?.origin) throw new Error('Cannot use "origin" keyword outside browser environment');
|
|
12
|
+
const origin = window.location.origin;
|
|
13
|
+
if (!origin.startsWith('http://') && !origin.startsWith('https://')) throw new Error(`Invalid origin protocol: ${origin}`);
|
|
14
|
+
return origin;
|
|
15
|
+
}
|
|
16
|
+
if (trimmed.startsWith('/')) {
|
|
17
|
+
if ('undefined' == typeof window || !window?.location?.origin) throw new Error('Cannot resolve relative path outside browser environment');
|
|
18
|
+
const origin = window.location.origin;
|
|
19
|
+
if (!origin.startsWith('http://') && !origin.startsWith('https://')) throw new Error(`Invalid origin protocol: ${origin}`);
|
|
20
|
+
return origin + trimmed;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
new URL(trimmed);
|
|
24
|
+
} catch (e) {
|
|
25
|
+
throw new Error(`Invalid proxy endpoint URL: ${trimmed}`);
|
|
26
|
+
}
|
|
27
|
+
return trimmed;
|
|
28
|
+
}
|
|
29
|
+
function parseEndpoint(endpoint) {
|
|
30
|
+
let url;
|
|
31
|
+
let prepared = endpoint;
|
|
32
|
+
try {
|
|
33
|
+
if (!endpoint.includes('://')) prepared = `http://${endpoint}`;
|
|
34
|
+
url = new URL(prepared);
|
|
35
|
+
if (!ALLOWED_PROTOCOLS.includes(url.protocol)) throw new Error(`Protocol "${url.protocol}" not allowed. Use http: or https:`);
|
|
36
|
+
if (url.username || url.password) throw new Error('Embedded credentials in URLs are not allowed');
|
|
37
|
+
if (!url.hostname) throw new Error('Hostname cannot be empty');
|
|
38
|
+
} catch (error) {
|
|
39
|
+
if (error instanceof Error && error.message.includes('not allowed')) throw error;
|
|
40
|
+
if (error instanceof TypeError) throw new Error(`Invalid endpoint URL: ${endpoint}`);
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
hostname: url.hostname,
|
|
45
|
+
port: url.port ? parseInt(url.port, 10) : 'https:' === url.protocol ? 443 : 80,
|
|
46
|
+
protocol: url.protocol,
|
|
47
|
+
pathname: '/' === url.pathname ? '' : url.pathname
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const createProxyMiddleware = (config)=>{
|
|
51
|
+
if (!config.target) throw new Error('ProxyConfiguration.target is required');
|
|
52
|
+
const resolvedProxyEndpoint = resolveProxyEndpoint(config.endpoint);
|
|
53
|
+
const target = parseEndpoint(config.target);
|
|
54
|
+
const proxy = parseEndpoint(resolvedProxyEndpoint);
|
|
55
|
+
return {
|
|
3
56
|
applyToStack: (clientStack)=>{
|
|
4
57
|
const preSigningMiddleware = (next)=>async (args)=>{
|
|
5
58
|
const { request } = args;
|
|
6
|
-
if (HttpRequest.isInstance(request) && request.hostname ===
|
|
7
|
-
const originalQuery = request.query
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
59
|
+
if (HttpRequest.isInstance(request) && request.hostname === proxy.hostname) {
|
|
60
|
+
const originalQuery = request.query ? {
|
|
61
|
+
...request.query
|
|
62
|
+
} : {};
|
|
63
|
+
if (proxy.pathname && '/' !== proxy.pathname) {
|
|
64
|
+
const normalizedProxyPath = proxy.pathname.toLowerCase();
|
|
65
|
+
const normalizedRequestPath = request.path.toLowerCase();
|
|
66
|
+
if (normalizedRequestPath.startsWith(normalizedProxyPath)) {
|
|
67
|
+
const prefixLength = proxy.pathname.length;
|
|
68
|
+
request.path = request.path.substring(prefixLength);
|
|
69
|
+
if (request.path) {
|
|
70
|
+
if (!request.path.startsWith('/')) request.path = '/' + request.path;
|
|
71
|
+
} else request.path = '/';
|
|
72
|
+
}
|
|
11
73
|
}
|
|
12
|
-
request.hostname =
|
|
13
|
-
request.port =
|
|
14
|
-
request.protocol =
|
|
15
|
-
request.headers.host =
|
|
74
|
+
request.hostname = target.hostname;
|
|
75
|
+
request.port = target.port;
|
|
76
|
+
request.protocol = target.protocol;
|
|
77
|
+
request.headers.host = target.port && 80 !== target.port && 443 !== target.port ? `${target.hostname}:${target.port}` : target.hostname;
|
|
16
78
|
request.query = originalQuery;
|
|
17
|
-
console.log('Pre-signing: Modified for real S3 signing', {
|
|
18
|
-
path: request.path,
|
|
19
|
-
host: request.hostname,
|
|
20
|
-
query: request.query
|
|
21
|
-
});
|
|
22
79
|
}
|
|
23
80
|
return next(args);
|
|
24
81
|
};
|
|
25
82
|
const postSigningMiddleware = (next)=>async (args)=>{
|
|
26
83
|
const { request } = args;
|
|
27
|
-
if (HttpRequest.isInstance(request) && request.hostname ===
|
|
28
|
-
const queryParams = request.query
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
request.
|
|
32
|
-
request.
|
|
33
|
-
request.
|
|
84
|
+
if (HttpRequest.isInstance(request) && request.hostname === target.hostname) {
|
|
85
|
+
const queryParams = request.query ? {
|
|
86
|
+
...request.query
|
|
87
|
+
} : {};
|
|
88
|
+
request.hostname = proxy.hostname;
|
|
89
|
+
request.port = proxy.port;
|
|
90
|
+
request.protocol = proxy.protocol;
|
|
91
|
+
request.path = '' === proxy.pathname || '/' === proxy.pathname ? request.path : proxy.pathname + request.path;
|
|
92
|
+
request.headers.host = proxy.port && 80 !== proxy.port && 443 !== proxy.port ? `${proxy.hostname}:${proxy.port}` : proxy.hostname;
|
|
34
93
|
request.query = queryParams;
|
|
35
|
-
console.log('Post-signing: Routed to proxy', {
|
|
36
|
-
host: request.hostname,
|
|
37
|
-
path: request.path,
|
|
38
|
-
query: request.query,
|
|
39
|
-
hasAuth: !!request.headers.authorization
|
|
40
|
-
});
|
|
41
94
|
}
|
|
42
95
|
return next(args);
|
|
43
96
|
};
|
|
44
97
|
clientStack.add(preSigningMiddleware, {
|
|
45
|
-
step:
|
|
46
|
-
name:
|
|
47
|
-
priority:
|
|
98
|
+
step: 'build',
|
|
99
|
+
name: 'proxyPreSigningMiddleware',
|
|
100
|
+
priority: 'high'
|
|
48
101
|
});
|
|
49
102
|
clientStack.add(postSigningMiddleware, {
|
|
50
|
-
step:
|
|
51
|
-
name:
|
|
52
|
-
priority:
|
|
103
|
+
step: 'finalizeRequest',
|
|
104
|
+
name: 'proxyPostSigningMiddleware',
|
|
105
|
+
priority: 'high'
|
|
53
106
|
});
|
|
54
107
|
}
|
|
55
|
-
}
|
|
56
|
-
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
export { createProxyMiddleware, parseEndpoint, resolveProxyEndpoint };
|
package/dist/utils/s3Client.d.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
|
-
import { S3Client } from
|
|
2
|
-
import { S3BrowserConfig, S3Credentials } from
|
|
3
|
-
|
|
1
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
2
|
+
import type { S3BrowserConfig, S3Credentials } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* S3Client configuration with credentials
|
|
5
|
+
*/
|
|
6
|
+
export interface S3ClientConfigWithProxy extends S3BrowserConfig {
|
|
4
7
|
credentials: S3Credentials;
|
|
5
|
-
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Create S3 client with optional proxy middleware
|
|
11
|
+
*
|
|
12
|
+
* @param config - S3 configuration with credentials and optional proxy config
|
|
13
|
+
* @returns Configured S3Client instance
|
|
14
|
+
*/
|
|
15
|
+
export declare const createS3Client: (config: S3ClientConfigWithProxy) => S3Client;
|
package/dist/utils/s3Client.js
CHANGED
|
@@ -1,36 +1,15 @@
|
|
|
1
1
|
import { S3Client } from "@aws-sdk/client-s3";
|
|
2
|
-
import { createProxyMiddleware } from "./proxyMiddleware.js";
|
|
3
|
-
import { S3ConfigurationFactory } from "../config/factory.js";
|
|
4
|
-
function extractProxyConfig(config) {
|
|
5
|
-
if (config.useDevProxy && config.realS3Host && config.proxyPath) return {
|
|
6
|
-
realS3Host: config.realS3Host,
|
|
7
|
-
proxyBasePath: config.proxyPath,
|
|
8
|
-
proxyHost: config.proxyHost || "localhost",
|
|
9
|
-
proxyPort: config.proxyPort || 8084
|
|
10
|
-
};
|
|
11
|
-
const proxyConfig = S3ConfigurationFactory.createProxyConfiguration();
|
|
12
|
-
if (proxyConfig.useProxy && proxyConfig.proxyConfig) return {
|
|
13
|
-
realS3Host: proxyConfig.proxyConfig.realHost,
|
|
14
|
-
proxyBasePath: proxyConfig.proxyConfig.proxyBasePath,
|
|
15
|
-
proxyHost: proxyConfig.proxyConfig.proxyHost,
|
|
16
|
-
proxyPort: proxyConfig.proxyConfig.proxyPort
|
|
17
|
-
};
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
2
|
+
import { createProxyMiddleware, resolveProxyEndpoint } from "./proxyMiddleware.js";
|
|
20
3
|
const createS3Client = (config)=>{
|
|
4
|
+
if (config.proxy?.enabled && !config.proxy.target) throw new Error('Proxy configuration error: "target" is required when proxy is enabled');
|
|
5
|
+
const clientEndpoint = config.proxy?.enabled ? resolveProxyEndpoint(config.proxy.endpoint) : config.endpoint;
|
|
21
6
|
const client = new S3Client({
|
|
22
|
-
|
|
7
|
+
endpoint: clientEndpoint,
|
|
23
8
|
credentials: config.credentials,
|
|
24
9
|
forcePathStyle: config.forcePathStyle ?? true,
|
|
25
10
|
region: config.region
|
|
26
11
|
});
|
|
27
|
-
|
|
28
|
-
if (proxyConfig) client.middlewareStack.use(createProxyMiddleware({
|
|
29
|
-
realS3Host: proxyConfig.realS3Host,
|
|
30
|
-
proxyBasePath: proxyConfig.proxyBasePath,
|
|
31
|
-
proxyHost: proxyConfig.proxyHost,
|
|
32
|
-
proxyPort: proxyConfig.proxyPort
|
|
33
|
-
}));
|
|
12
|
+
if (config.proxy?.enabled) client.middlewareStack.use(createProxyMiddleware(config.proxy));
|
|
34
13
|
return client;
|
|
35
14
|
};
|
|
36
15
|
export { createS3Client };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { GetConfigFunction } from '../types';
|
|
2
|
+
export declare const ANONYMOUS_S3_CONFIG_IDENTIFIER = "anonymous-s3-config";
|
|
3
|
+
/**
|
|
4
|
+
* Hashes a session token using FNV-1a 64-bit algorithm for query cache isolation.
|
|
5
|
+
*
|
|
6
|
+
* Note: This is NOT a cryptographic hash - it's designed for collision resistance
|
|
7
|
+
* in the context of query key uniqueness, not security.
|
|
8
|
+
*
|
|
9
|
+
* The input is trimmed before hashing to ensure consistent results regardless of
|
|
10
|
+
* whitespace variations.
|
|
11
|
+
*
|
|
12
|
+
* @param sessionToken - AWS session token string to hash
|
|
13
|
+
* @returns A 16-character zero-padded hexadecimal string (64-bit hash)
|
|
14
|
+
*/
|
|
15
|
+
export declare const hashSessionToken: (sessionToken: string) => string;
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes a region string for consistent comparison.
|
|
18
|
+
*
|
|
19
|
+
* @param region - AWS region string
|
|
20
|
+
* @returns Normalized region (trimmed and lowercase)
|
|
21
|
+
*/
|
|
22
|
+
export declare const normalizeRegion: (region: string) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Normalizes an S3 endpoint URL for consistent comparison.
|
|
25
|
+
*
|
|
26
|
+
* Handles:
|
|
27
|
+
* - Protocol and hostname lowercasing
|
|
28
|
+
* - Default port removal (443 for HTTPS, 80 for HTTP)
|
|
29
|
+
* - Trailing slash removal from pathname
|
|
30
|
+
* - Query parameters and URL fragments are stripped
|
|
31
|
+
* - User credentials (username:password) are stripped
|
|
32
|
+
* - Invalid URL fallback to string normalization
|
|
33
|
+
*
|
|
34
|
+
* @param endpoint - S3 endpoint URL
|
|
35
|
+
* @returns Normalized endpoint string
|
|
36
|
+
*/
|
|
37
|
+
export declare const normalizeEndpoint: (endpoint: string) => string;
|
|
38
|
+
/**
|
|
39
|
+
* Minimal configuration interface for computing S3 config identifiers.
|
|
40
|
+
*
|
|
41
|
+
* This interface describes which fields are used by `computeS3ConfigIdentifier`.
|
|
42
|
+
* The function accepts any object with these optional properties, including the
|
|
43
|
+
* full S3BrowserConfig type.
|
|
44
|
+
*
|
|
45
|
+
* ## Cache Key Resolution Priority
|
|
46
|
+
*
|
|
47
|
+
* 1. `cacheKey` (top-level) - Explicit cache identity, highest priority
|
|
48
|
+
* 2. `accessKeyId` + `sessionToken` - Fallback for direct credentials
|
|
49
|
+
*
|
|
50
|
+
* When `cacheKey` is provided, `accessKeyId` and `sessionToken` are ignored
|
|
51
|
+
* for cache key generation. This prevents unnecessary cache invalidation when
|
|
52
|
+
* credentials refresh but the logical identity remains the same.
|
|
53
|
+
*/
|
|
54
|
+
export interface S3ConfigIdentifierConfig {
|
|
55
|
+
/**
|
|
56
|
+
* Explicit cache identity. When provided, takes priority over credentials.
|
|
57
|
+
* Use this when credentials change frequently (e.g., token refresh) but
|
|
58
|
+
* represent the same logical identity.
|
|
59
|
+
*/
|
|
60
|
+
cacheKey?: string;
|
|
61
|
+
credentials?: {
|
|
62
|
+
accessKeyId?: string;
|
|
63
|
+
secretAccessKey?: string;
|
|
64
|
+
sessionToken?: string;
|
|
65
|
+
};
|
|
66
|
+
region?: string;
|
|
67
|
+
endpoint?: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Computes a unique identifier for the current S3 configuration to isolate
|
|
71
|
+
* query caches between different S3 configurations.
|
|
72
|
+
*
|
|
73
|
+
* All inputs are normalized to prevent cache misses due to formatting differences.
|
|
74
|
+
*
|
|
75
|
+
* @param config - S3 configuration object
|
|
76
|
+
* @param fallbackIdentifier - Identifier to use when no config parts are available (default: ANONYMOUS_S3_CONFIG_IDENTIFIER)
|
|
77
|
+
* @returns An opaque identifier string (|| separated internally), or fallbackIdentifier if all parts are empty/missing
|
|
78
|
+
*/
|
|
79
|
+
export declare const computeS3ConfigIdentifier: (config: S3ConfigIdentifierConfig | ReturnType<GetConfigFunction>, fallbackIdentifier?: string) => string;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const ANONYMOUS_S3_CONFIG_IDENTIFIER = 'anonymous-s3-config';
|
|
2
|
+
const TEXT_ENCODER = new TextEncoder();
|
|
3
|
+
const DEFAULT_PORTS = {
|
|
4
|
+
'https:': '443',
|
|
5
|
+
'http:': '80'
|
|
6
|
+
};
|
|
7
|
+
const IDENTIFIER_SEPARATOR = '||';
|
|
8
|
+
const hashSessionToken = (sessionToken)=>{
|
|
9
|
+
const FNV_PRIME = 0x100000001b3n;
|
|
10
|
+
const FNV_OFFSET_BASIS = 0xcbf29ce484222325n;
|
|
11
|
+
const MASK_64 = 0xffffffffffffffffn;
|
|
12
|
+
let hash = FNV_OFFSET_BASIS;
|
|
13
|
+
const trimmed = sessionToken.trim();
|
|
14
|
+
const bytes = TEXT_ENCODER.encode(trimmed);
|
|
15
|
+
for (const byte of bytes){
|
|
16
|
+
hash ^= BigInt(byte);
|
|
17
|
+
hash = hash * FNV_PRIME & MASK_64;
|
|
18
|
+
}
|
|
19
|
+
return hash.toString(16).padStart(16, '0');
|
|
20
|
+
};
|
|
21
|
+
const normalizeRegion = (region)=>region.trim().toLowerCase();
|
|
22
|
+
const normalizeEndpoint = (endpoint)=>{
|
|
23
|
+
const trimmed = endpoint.trim();
|
|
24
|
+
try {
|
|
25
|
+
const url = new URL(trimmed);
|
|
26
|
+
const protocol = url.protocol.toLowerCase();
|
|
27
|
+
const hostname = url.hostname.toLowerCase();
|
|
28
|
+
const isDefaultPort = '' === url.port || url.port === DEFAULT_PORTS[protocol];
|
|
29
|
+
const port = isDefaultPort ? '' : `:${url.port}`;
|
|
30
|
+
const pathname = url.pathname.replace(/\/+$/, '') || '';
|
|
31
|
+
return `${protocol}//${hostname}${port}${pathname}`;
|
|
32
|
+
} catch (error) {
|
|
33
|
+
return trimmed.replace(/\/+$/, '');
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const computeS3ConfigIdentifier = (config, fallbackIdentifier = ANONYMOUS_S3_CONFIG_IDENTIFIER)=>{
|
|
37
|
+
const parts = [];
|
|
38
|
+
const cacheKey = config?.cacheKey?.trim();
|
|
39
|
+
if (cacheKey) parts.push(cacheKey);
|
|
40
|
+
else {
|
|
41
|
+
const accessKeyId = config?.credentials?.accessKeyId?.trim();
|
|
42
|
+
if (accessKeyId) {
|
|
43
|
+
parts.push(accessKeyId);
|
|
44
|
+
const sessionToken = config?.credentials?.sessionToken?.trim();
|
|
45
|
+
if (sessionToken) {
|
|
46
|
+
const hash = hashSessionToken(sessionToken);
|
|
47
|
+
parts.push(`session:${hash}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const region = config?.region?.trim();
|
|
52
|
+
if (region) parts.push(`region:${normalizeRegion(region)}`);
|
|
53
|
+
const endpoint = config?.endpoint?.trim();
|
|
54
|
+
if (endpoint) parts.push(`endpoint:${normalizeEndpoint(endpoint)}`);
|
|
55
|
+
return parts.length > 0 ? parts.join(IDENTIFIER_SEPARATOR) : fallbackIdentifier;
|
|
56
|
+
};
|
|
57
|
+
export { ANONYMOUS_S3_CONFIG_IDENTIFIER, computeS3ConfigIdentifier, hashSessionToken, normalizeEndpoint, normalizeRegion };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export declare const AWS_RULE_LIMITS: {
|
|
2
|
+
RULE_ID_MAX_LENGTH: number;
|
|
3
|
+
TAG_KEY_MAX_LENGTH: number;
|
|
4
|
+
TAG_VALUE_MAX_LENGTH: number;
|
|
5
|
+
};
|
|
6
|
+
export declare const STATUS_OPTIONS: readonly [{
|
|
7
|
+
readonly value: "Enabled";
|
|
8
|
+
readonly label: "Enabled";
|
|
9
|
+
}, {
|
|
10
|
+
readonly value: "Disabled";
|
|
11
|
+
readonly label: "Disabled";
|
|
12
|
+
}];
|
|
13
|
+
export type FilterType = 'none' | 'prefix' | 'tags' | 'and';
|
|
14
|
+
/**
|
|
15
|
+
* Filter data for S3 rules. All fields are present for form handling,
|
|
16
|
+
* but only certain fields are used based on filterType.
|
|
17
|
+
*/
|
|
18
|
+
export interface FilterData {
|
|
19
|
+
filterType: FilterType;
|
|
20
|
+
prefix: string;
|
|
21
|
+
tags: Array<{
|
|
22
|
+
key: string;
|
|
23
|
+
value: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Type-safe filter specification for S3 rule building.
|
|
28
|
+
* Each variant only includes the fields relevant to that filter type.
|
|
29
|
+
*/
|
|
30
|
+
export type FilterSpec = {
|
|
31
|
+
type: 'none';
|
|
32
|
+
} | {
|
|
33
|
+
type: 'prefix';
|
|
34
|
+
prefix: string;
|
|
35
|
+
} | {
|
|
36
|
+
type: 'tags';
|
|
37
|
+
tags: Array<{
|
|
38
|
+
key: string;
|
|
39
|
+
value: string;
|
|
40
|
+
}>;
|
|
41
|
+
} | {
|
|
42
|
+
type: 'and';
|
|
43
|
+
prefix: string;
|
|
44
|
+
tags: Array<{
|
|
45
|
+
key: string;
|
|
46
|
+
value: string;
|
|
47
|
+
}>;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Converts form FilterData to type-safe FilterSpec.
|
|
51
|
+
*/
|
|
52
|
+
export declare function toFilterSpec(data: FilterData): FilterSpec;
|
|
53
|
+
export declare function buildS3Filter(data: FilterData): Record<string, unknown>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
const AWS_RULE_LIMITS = {
|
|
2
|
+
RULE_ID_MAX_LENGTH: 255,
|
|
3
|
+
TAG_KEY_MAX_LENGTH: 128,
|
|
4
|
+
TAG_VALUE_MAX_LENGTH: 256
|
|
5
|
+
};
|
|
6
|
+
const STATUS_OPTIONS = [
|
|
7
|
+
{
|
|
8
|
+
value: 'Enabled',
|
|
9
|
+
label: 'Enabled'
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
value: 'Disabled',
|
|
13
|
+
label: 'Disabled'
|
|
14
|
+
}
|
|
15
|
+
];
|
|
16
|
+
function toFilterSpec(data) {
|
|
17
|
+
switch(data.filterType){
|
|
18
|
+
case 'none':
|
|
19
|
+
return {
|
|
20
|
+
type: 'none'
|
|
21
|
+
};
|
|
22
|
+
case 'prefix':
|
|
23
|
+
return {
|
|
24
|
+
type: 'prefix',
|
|
25
|
+
prefix: data.prefix
|
|
26
|
+
};
|
|
27
|
+
case 'tags':
|
|
28
|
+
return {
|
|
29
|
+
type: 'tags',
|
|
30
|
+
tags: data.tags
|
|
31
|
+
};
|
|
32
|
+
case 'and':
|
|
33
|
+
return {
|
|
34
|
+
type: 'and',
|
|
35
|
+
prefix: data.prefix,
|
|
36
|
+
tags: data.tags
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function buildS3Filter(data) {
|
|
41
|
+
const spec = toFilterSpec(data);
|
|
42
|
+
switch(spec.type){
|
|
43
|
+
case 'none':
|
|
44
|
+
return {};
|
|
45
|
+
case 'prefix':
|
|
46
|
+
return {
|
|
47
|
+
Prefix: spec.prefix
|
|
48
|
+
};
|
|
49
|
+
case 'tags':
|
|
50
|
+
if (0 === spec.tags.length) return {};
|
|
51
|
+
if (1 === spec.tags.length) return {
|
|
52
|
+
Tag: {
|
|
53
|
+
Key: spec.tags[0].key,
|
|
54
|
+
Value: spec.tags[0].value
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
And: {
|
|
59
|
+
Tags: spec.tags.map((tag)=>({
|
|
60
|
+
Key: tag.key,
|
|
61
|
+
Value: tag.value
|
|
62
|
+
}))
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
case 'and':
|
|
66
|
+
{
|
|
67
|
+
const hasPrefix = spec.prefix && '' !== spec.prefix.trim();
|
|
68
|
+
const hasTags = spec.tags.length > 0;
|
|
69
|
+
if (!hasTags && !hasPrefix) return {};
|
|
70
|
+
if (!hasTags && hasPrefix) return {
|
|
71
|
+
Prefix: spec.prefix
|
|
72
|
+
};
|
|
73
|
+
if (hasTags && !hasPrefix) {
|
|
74
|
+
if (1 === spec.tags.length) return {
|
|
75
|
+
Tag: {
|
|
76
|
+
Key: spec.tags[0].key,
|
|
77
|
+
Value: spec.tags[0].value
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
And: {
|
|
82
|
+
Tags: spec.tags.map((tag)=>({
|
|
83
|
+
Key: tag.key,
|
|
84
|
+
Value: tag.value
|
|
85
|
+
}))
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
And: {
|
|
91
|
+
Prefix: spec.prefix,
|
|
92
|
+
Tags: spec.tags.map((tag)=>({
|
|
93
|
+
Key: tag.key,
|
|
94
|
+
Value: tag.value
|
|
95
|
+
}))
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export { AWS_RULE_LIMITS, STATUS_OPTIONS, buildS3Filter, toFilterSpec };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scality/data-browser-library",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "A modular React component library for browsing S3 buckets and objects",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -18,7 +18,9 @@
|
|
|
18
18
|
"build": "rslib build",
|
|
19
19
|
"dev": "rslib build --watch",
|
|
20
20
|
"type-check": "tsc --noEmit",
|
|
21
|
-
"lint": "
|
|
21
|
+
"lint": "biome check .",
|
|
22
|
+
"lint:fix": "biome check --write .",
|
|
23
|
+
"format": "biome format --write .",
|
|
22
24
|
"test": "jest",
|
|
23
25
|
"clean": "rm -rf dist"
|
|
24
26
|
},
|
|
@@ -29,24 +31,24 @@
|
|
|
29
31
|
"@aws-sdk/s3-request-presigner": "^3.478.0",
|
|
30
32
|
"@hookform/resolvers": "^5.2.2",
|
|
31
33
|
"@monaco-editor/react": "^4.7.0",
|
|
34
|
+
"@scality/zenkoclient": "^2.0.0-preview.1",
|
|
32
35
|
"@tanstack/react-query": "^5.8.0",
|
|
33
36
|
"@tanstack/react-query-devtools": "^5.8.0",
|
|
34
37
|
"@testing-library/user-event": "^14.6.1",
|
|
35
38
|
"joi": "^18.0.1",
|
|
36
39
|
"react-dropzone": "^14.2.0",
|
|
37
|
-
"react-hook-form": "^7.48.0"
|
|
38
|
-
"@scality/zenkoclient": "^2.0.0-preview.1"
|
|
40
|
+
"react-hook-form": "^7.48.0"
|
|
39
41
|
},
|
|
40
42
|
"peerDependencies": {
|
|
41
|
-
"@scality/core-ui": "
|
|
43
|
+
"@scality/core-ui": "0.194.0",
|
|
42
44
|
"react": ">=18.0.0",
|
|
43
45
|
"react-dom": ">=18.0.0",
|
|
44
46
|
"react-router-dom": ">=6.0.0",
|
|
45
47
|
"styled-components": "^5.0.0"
|
|
46
48
|
},
|
|
47
49
|
"devDependencies": {
|
|
48
|
-
"@rsbuild/plugin-react": "^1.4.
|
|
49
|
-
"@rslib/core": "^0.
|
|
50
|
+
"@rsbuild/plugin-react": "^1.4.2",
|
|
51
|
+
"@rslib/core": "^0.18.4",
|
|
50
52
|
"@testing-library/jest-dom": "^6.8.0",
|
|
51
53
|
"@testing-library/react": "^15.0.6",
|
|
52
54
|
"@testing-library/user-event": "^14.6.1",
|
|
@@ -57,7 +59,7 @@
|
|
|
57
59
|
"identity-obj-proxy": "^3.0.0",
|
|
58
60
|
"jest": "^30.0.5",
|
|
59
61
|
"jest-environment-jsdom": "^30.0.5",
|
|
60
|
-
"msw": "^
|
|
62
|
+
"msw": "^2.12.3",
|
|
61
63
|
"ts-jest": "^29.4.1"
|
|
62
64
|
},
|
|
63
65
|
"repository": {
|