@scality/data-browser-library 1.0.0-preview.11 → 1.0.0-preview.15
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 +27 -0
- package/dist/components/DataBrowserUI.js +88 -0
- package/dist/components/Editor.d.ts +1 -1
- package/dist/components/Editor.js +3 -3
- package/dist/components/__tests__/BucketCreate.test.js +102 -102
- package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
- package/dist/components/__tests__/BucketDetails.test.js +420 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.js +177 -177
- package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
- package/dist/components/__tests__/BucketList.test.js +463 -239
- package/dist/components/__tests__/BucketNotificationCreatePage.test.js +84 -84
- package/dist/components/__tests__/BucketOverview.test.js +273 -261
- package/dist/components/__tests__/BucketPolicyPage.test.js +62 -62
- package/dist/components/__tests__/BucketReplicationFormPage.test.js +542 -542
- 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 +62 -62
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
- package/dist/components/__tests__/DeleteObjectButton.test.js +63 -63
- package/dist/components/__tests__/EmptyBucketButton.test.js +56 -56
- package/dist/components/__tests__/MetadataSearch.test.js +65 -65
- package/dist/components/__tests__/ObjectList.test.js +739 -238
- package/dist/components/__tests__/UploadButton.test.js +45 -45
- package/dist/components/buckets/BucketCreate.d.ts +2 -2
- package/dist/components/buckets/BucketCreate.js +41 -41
- package/dist/components/buckets/BucketDetails.d.ts +40 -0
- package/dist/components/buckets/BucketDetails.js +208 -88
- package/dist/components/buckets/BucketLifecycleFormPage.js +161 -160
- package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
- package/dist/components/buckets/BucketLifecycleList.js +46 -46
- package/dist/components/buckets/BucketList.d.ts +7 -8
- package/dist/components/buckets/BucketList.js +156 -100
- package/dist/components/buckets/BucketLocation.js +3 -3
- package/dist/components/buckets/BucketOverview.d.ts +7 -1
- package/dist/components/buckets/BucketOverview.js +366 -182
- package/dist/components/buckets/BucketPage.js +20 -16
- package/dist/components/buckets/BucketPolicyButton.js +2 -2
- package/dist/components/buckets/BucketPolicyPage.js +27 -25
- package/dist/components/buckets/BucketReplicationFormPage.js +133 -132
- package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
- package/dist/components/buckets/BucketReplicationList.js +41 -41
- package/dist/components/buckets/BucketVersioning.js +13 -10
- package/dist/components/buckets/DeleteBucketButton.js +5 -5
- package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +2 -2
- package/dist/components/buckets/DeleteBucketConfigRuleButton.js +1 -1
- package/dist/components/buckets/EmptyBucketButton.js +20 -20
- package/dist/components/buckets/EmptyBucketSummary.d.ts +1 -1
- package/dist/components/buckets/EmptyBucketSummary.js +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
- package/dist/components/buckets/__tests__/BucketVersioning.test.js +45 -45
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +34 -33
- package/dist/components/buckets/notifications/EventsSection.js +144 -28
- 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 +23 -21
- package/dist/components/index.js +4 -2
- package/dist/components/layouts/ArrowNavigation.d.ts +1 -2
- package/dist/components/layouts/ArrowNavigation.js +22 -10
- package/dist/components/layouts/BrowserPageLayout.d.ts +2 -3
- package/dist/components/layouts/BrowserPageLayout.js +1 -1
- package/dist/components/objects/CreateFolderButton.d.ts +2 -2
- package/dist/components/objects/CreateFolderButton.js +10 -10
- package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
- package/dist/components/objects/DeleteObjectButton.js +20 -20
- package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +1 -1
- package/dist/components/objects/ObjectDetails/ObjectMetadata.js +56 -56
- package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +1 -1
- package/dist/components/objects/ObjectDetails/ObjectSummary.js +294 -164
- package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +1 -1
- package/dist/components/objects/ObjectDetails/ObjectTags.js +25 -25
- 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 +813 -0
- package/dist/components/objects/ObjectDetails/index.d.ts +17 -1
- package/dist/components/objects/ObjectDetails/index.js +136 -50
- package/dist/components/objects/ObjectList.d.ts +11 -9
- package/dist/components/objects/ObjectList.js +576 -295
- package/dist/components/objects/ObjectLock/EditRetentionButton.js +3 -3
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +14 -14
- package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettings.js +29 -28
- 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 +50 -50
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +77 -77
- package/dist/components/objects/ObjectPage.js +5 -4
- package/dist/components/objects/UploadButton.d.ts +3 -3
- package/dist/components/objects/UploadButton.js +6 -6
- package/dist/components/providers/DataBrowserProvider.d.ts +15 -4
- package/dist/components/providers/DataBrowserProvider.js +33 -11
- package/dist/components/search/MetadataSearch.js +26 -25
- package/dist/components/search/SearchHints.js +1 -1
- package/dist/components/ui/ArrayFieldActions.js +4 -4
- package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +1 -1
- package/dist/components/ui/ConfirmDeleteRuleModal.js +1 -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 +1 -1
- package/dist/components/ui/Search.elements.js +7 -7
- package/dist/components/ui/Table.elements.js +5 -5
- package/dist/config/factory.d.ts +23 -10
- package/dist/config/factory.js +22 -7
- package/dist/config/types.d.ts +134 -0
- package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
- package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
- package/dist/hooks/__tests__/useISVBucketDetection.test.js +41 -41
- package/dist/hooks/__tests__/useIsBucketEmpty.test.js +25 -25
- package/dist/hooks/bucketConfiguration.d.ts +1 -1
- package/dist/hooks/bucketConfiguration.js +48 -48
- package/dist/hooks/bucketOperations.d.ts +1 -1
- package/dist/hooks/bucketOperations.js +6 -6
- package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +78 -78
- package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +78 -78
- package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +42 -42
- package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +61 -61
- package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +63 -63
- package/dist/hooks/factories/index.d.ts +4 -4
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +15 -12
- package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
- package/dist/hooks/factories/useCreateS3MutationHook.js +6 -1
- package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3QueryHook.js +8 -5
- package/dist/hooks/index.d.ts +14 -13
- package/dist/hooks/index.js +2 -1
- 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 +49 -49
- package/dist/hooks/presignedOperations.d.ts +2 -2
- package/dist/hooks/presignedOperations.js +3 -3
- package/dist/hooks/useBatchObjectLegalHold.js +7 -4
- package/dist/hooks/useDataBrowserNavigate.d.ts +14 -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 +10 -10
- package/dist/hooks/useISVBucketDetection.js +3 -3
- package/dist/hooks/useIsBucketEmpty.js +4 -4
- package/dist/hooks/useLoginMutation.d.ts +1 -1
- package/dist/hooks/useLoginMutation.js +1 -1
- package/dist/hooks/useS3Client.d.ts +5 -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/index.d.ts +6 -6
- 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 +31 -16
- 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 +72 -49
- package/dist/test/msw/index.d.ts +2 -2
- 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 +19 -19
- package/dist/test/testUtils.d.ts +70 -12
- package/dist/test/testUtils.js +160 -75
- package/dist/test/utils/errorHandling.test.js +119 -119
- package/dist/types/index.d.ts +8 -31
- package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.js +429 -0
- package/dist/utils/constants.d.ts +7 -0
- package/dist/utils/constants.js +16 -9
- package/dist/utils/deletion/index.d.ts +2 -2
- 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 +2 -0
- package/dist/utils/proxyMiddleware.d.ts +1 -1
- package/dist/utils/proxyMiddleware.js +6 -11
- package/dist/utils/s3Client.d.ts +2 -2
- package/dist/utils/s3Client.js +1 -1
- package/dist/utils/s3ConfigIdentifier.d.ts +68 -0
- package/dist/utils/s3ConfigIdentifier.js +55 -0
- package/dist/utils/s3RuleUtils.d.ts +5 -5
- package/dist/utils/s3RuleUtils.js +17 -17
- package/dist/utils/useFeatures.js +1 -1
- package/dist/utils/useSupportedNotificationEvents.d.ts +6 -0
- package/dist/utils/useSupportedNotificationEvents.js +7 -0
- package/package.json +3 -3
|
@@ -2,9 +2,9 @@ import { renderHook, waitFor } from "@testing-library/react";
|
|
|
2
2
|
import { useCreateS3MutationHook } from "../useCreateS3MutationHook.js";
|
|
3
3
|
import { useS3Client } from "../../useS3Client.js";
|
|
4
4
|
import { createS3OperationError } from "../../../utils/errorHandling.js";
|
|
5
|
-
import {
|
|
6
|
-
jest.mock(
|
|
7
|
-
jest.mock(
|
|
5
|
+
import { createTestWrapper, validateFactoryHook, validateHookResult } from "../../../test/testUtils.js";
|
|
6
|
+
jest.mock('../../useS3Client');
|
|
7
|
+
jest.mock('../../../utils/errorHandling');
|
|
8
8
|
const mockUseS3Client = useS3Client;
|
|
9
9
|
const mockCreateS3OperationError = createS3OperationError;
|
|
10
10
|
class MockCommand {
|
|
@@ -16,44 +16,44 @@ class MockCommand {
|
|
|
16
16
|
const mockS3Client = {
|
|
17
17
|
send: jest.fn()
|
|
18
18
|
};
|
|
19
|
-
describe(
|
|
19
|
+
describe('useCreateS3MutationHook - Factory Specific', ()=>{
|
|
20
20
|
beforeEach(()=>{
|
|
21
21
|
jest.clearAllMocks();
|
|
22
22
|
mockUseS3Client.mockReturnValue(mockS3Client);
|
|
23
23
|
});
|
|
24
|
-
it(
|
|
25
|
-
const useMutation = useCreateS3MutationHook(MockCommand,
|
|
26
|
-
validateFactoryHook(useMutation,
|
|
24
|
+
it('should create a functioning mutation hook', ()=>{
|
|
25
|
+
const useMutation = useCreateS3MutationHook(MockCommand, 'testMutation');
|
|
26
|
+
validateFactoryHook(useMutation, 'testMutation');
|
|
27
27
|
const { result } = renderHook(()=>useMutation(), {
|
|
28
|
-
wrapper:
|
|
28
|
+
wrapper: createTestWrapper()
|
|
29
29
|
});
|
|
30
|
-
validateHookResult(result.current,
|
|
30
|
+
validateHookResult(result.current, 'mutation');
|
|
31
31
|
});
|
|
32
|
-
it(
|
|
33
|
-
const useMutation = useCreateS3MutationHook(MockCommand,
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
it('should accept invalidation keys parameter', ()=>{
|
|
33
|
+
const useMutation = useCreateS3MutationHook(MockCommand, 'testMutation', [
|
|
34
|
+
'ListObjects',
|
|
35
|
+
'TestQuery'
|
|
36
36
|
]);
|
|
37
|
-
validateFactoryHook(useMutation,
|
|
37
|
+
validateFactoryHook(useMutation, 'testMutation');
|
|
38
38
|
const { result } = renderHook(()=>useMutation(), {
|
|
39
|
-
wrapper:
|
|
39
|
+
wrapper: createTestWrapper()
|
|
40
40
|
});
|
|
41
|
-
validateHookResult(result.current,
|
|
41
|
+
validateHookResult(result.current, 'mutation');
|
|
42
42
|
});
|
|
43
|
-
it(
|
|
43
|
+
it('should execute mutation successfully', async ()=>{
|
|
44
44
|
const mockResponse = {
|
|
45
45
|
success: true,
|
|
46
|
-
key:
|
|
46
|
+
key: 'uploaded-file.txt'
|
|
47
47
|
};
|
|
48
48
|
mockS3Client.send.mockResolvedValue(mockResponse);
|
|
49
|
-
const useMutation = useCreateS3MutationHook(MockCommand,
|
|
49
|
+
const useMutation = useCreateS3MutationHook(MockCommand, 'PutObject');
|
|
50
50
|
const { result } = renderHook(()=>useMutation(), {
|
|
51
|
-
wrapper:
|
|
51
|
+
wrapper: createTestWrapper()
|
|
52
52
|
});
|
|
53
53
|
result.current.mutate({
|
|
54
|
-
Bucket:
|
|
55
|
-
Key:
|
|
56
|
-
Body:
|
|
54
|
+
Bucket: 'test-bucket',
|
|
55
|
+
Key: 'test-file.txt',
|
|
56
|
+
Body: 'content'
|
|
57
57
|
});
|
|
58
58
|
await waitFor(()=>{
|
|
59
59
|
expect(result.current.isSuccess).toBe(true);
|
|
@@ -61,32 +61,32 @@ describe("useCreateS3MutationHook - Factory Specific", ()=>{
|
|
|
61
61
|
expect(result.current.data).toEqual(mockResponse);
|
|
62
62
|
expect(mockS3Client.send).toHaveBeenCalledWith(expect.objectContaining({
|
|
63
63
|
input: {
|
|
64
|
-
Bucket:
|
|
65
|
-
Key:
|
|
66
|
-
Body:
|
|
64
|
+
Bucket: 'test-bucket',
|
|
65
|
+
Key: 'test-file.txt',
|
|
66
|
+
Body: 'content'
|
|
67
67
|
}
|
|
68
68
|
}));
|
|
69
69
|
});
|
|
70
|
-
it(
|
|
71
|
-
const mockError = new Error(
|
|
72
|
-
const enhancedError = new Error(
|
|
70
|
+
it('should handle mutation errors with proper context', async ()=>{
|
|
71
|
+
const mockError = new Error('Access Denied');
|
|
72
|
+
const enhancedError = new Error('Enhanced Access Denied');
|
|
73
73
|
mockS3Client.send.mockRejectedValue(mockError);
|
|
74
74
|
mockCreateS3OperationError.mockReturnValue(enhancedError);
|
|
75
|
-
const useMutation = useCreateS3MutationHook(MockCommand,
|
|
75
|
+
const useMutation = useCreateS3MutationHook(MockCommand, 'PutObject');
|
|
76
76
|
const { result } = renderHook(()=>useMutation(), {
|
|
77
|
-
wrapper:
|
|
77
|
+
wrapper: createTestWrapper()
|
|
78
78
|
});
|
|
79
79
|
result.current.mutate({
|
|
80
|
-
Bucket:
|
|
81
|
-
Key:
|
|
80
|
+
Bucket: 'test-bucket',
|
|
81
|
+
Key: 'test-file.txt'
|
|
82
82
|
});
|
|
83
83
|
await waitFor(()=>{
|
|
84
84
|
expect(result.current.isError).toBe(true);
|
|
85
85
|
});
|
|
86
86
|
expect(result.current.error).toBe(enhancedError);
|
|
87
|
-
expect(mockCreateS3OperationError).toHaveBeenCalledWith(mockError,
|
|
87
|
+
expect(mockCreateS3OperationError).toHaveBeenCalledWith(mockError, 'PutObject', 'test-bucket');
|
|
88
88
|
});
|
|
89
|
-
it(
|
|
89
|
+
it('should handle mutation callbacks correctly', async ()=>{
|
|
90
90
|
const mockResponse = {
|
|
91
91
|
success: true
|
|
92
92
|
};
|
|
@@ -94,17 +94,17 @@ describe("useCreateS3MutationHook - Factory Specific", ()=>{
|
|
|
94
94
|
const onError = jest.fn();
|
|
95
95
|
const onSettled = jest.fn();
|
|
96
96
|
mockS3Client.send.mockResolvedValue(mockResponse);
|
|
97
|
-
const useMutation = useCreateS3MutationHook(MockCommand,
|
|
97
|
+
const useMutation = useCreateS3MutationHook(MockCommand, 'PutObject');
|
|
98
98
|
const { result } = renderHook(()=>useMutation({
|
|
99
99
|
onSuccess,
|
|
100
100
|
onError,
|
|
101
101
|
onSettled
|
|
102
102
|
}), {
|
|
103
|
-
wrapper:
|
|
103
|
+
wrapper: createTestWrapper()
|
|
104
104
|
});
|
|
105
105
|
const variables = {
|
|
106
|
-
Bucket:
|
|
107
|
-
Key:
|
|
106
|
+
Bucket: 'test-bucket',
|
|
107
|
+
Key: 'test-file.txt'
|
|
108
108
|
};
|
|
109
109
|
result.current.mutate(variables);
|
|
110
110
|
await waitFor(()=>{
|
|
@@ -114,28 +114,28 @@ describe("useCreateS3MutationHook - Factory Specific", ()=>{
|
|
|
114
114
|
expect(onError).not.toHaveBeenCalled();
|
|
115
115
|
expect(onSettled).toHaveBeenCalledWith(mockResponse, null, variables, void 0, expect.any(Object));
|
|
116
116
|
});
|
|
117
|
-
it(
|
|
117
|
+
it('should handle mutation with invalidation keys', async ()=>{
|
|
118
118
|
const mockResponse = {
|
|
119
119
|
success: true
|
|
120
120
|
};
|
|
121
121
|
mockS3Client.send.mockResolvedValue(mockResponse);
|
|
122
|
-
const useMutation = useCreateS3MutationHook(MockCommand,
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
const useMutation = useCreateS3MutationHook(MockCommand, 'PutObject', [
|
|
123
|
+
'ListObjects',
|
|
124
|
+
'TestQuery'
|
|
125
125
|
]);
|
|
126
126
|
const { result } = renderHook(()=>useMutation(), {
|
|
127
|
-
wrapper:
|
|
127
|
+
wrapper: createTestWrapper()
|
|
128
128
|
});
|
|
129
129
|
result.current.mutate({
|
|
130
|
-
Bucket:
|
|
131
|
-
Key:
|
|
130
|
+
Bucket: 'test-bucket',
|
|
131
|
+
Key: 'test-file.txt'
|
|
132
132
|
});
|
|
133
133
|
await waitFor(()=>{
|
|
134
134
|
expect(result.current.isSuccess).toBe(true);
|
|
135
135
|
});
|
|
136
136
|
expect(result.current.data).toEqual(mockResponse);
|
|
137
137
|
});
|
|
138
|
-
it(
|
|
138
|
+
it('should handle concurrent mutations correctly', async ()=>{
|
|
139
139
|
const mockResponse1 = {
|
|
140
140
|
success: true,
|
|
141
141
|
id: 1
|
|
@@ -149,20 +149,20 @@ describe("useCreateS3MutationHook - Factory Specific", ()=>{
|
|
|
149
149
|
callCount++;
|
|
150
150
|
return Promise.resolve(1 === callCount ? mockResponse1 : mockResponse2);
|
|
151
151
|
});
|
|
152
|
-
const useMutation = useCreateS3MutationHook(MockCommand,
|
|
152
|
+
const useMutation = useCreateS3MutationHook(MockCommand, 'PutObject');
|
|
153
153
|
const { result: result1 } = renderHook(()=>useMutation(), {
|
|
154
|
-
wrapper:
|
|
154
|
+
wrapper: createTestWrapper()
|
|
155
155
|
});
|
|
156
156
|
const { result: result2 } = renderHook(()=>useMutation(), {
|
|
157
|
-
wrapper:
|
|
157
|
+
wrapper: createTestWrapper()
|
|
158
158
|
});
|
|
159
159
|
result1.current.mutate({
|
|
160
|
-
Bucket:
|
|
161
|
-
Key:
|
|
160
|
+
Bucket: 'test-bucket',
|
|
161
|
+
Key: 'file1.txt'
|
|
162
162
|
});
|
|
163
163
|
result2.current.mutate({
|
|
164
|
-
Bucket:
|
|
165
|
-
Key:
|
|
164
|
+
Bucket: 'test-bucket',
|
|
165
|
+
Key: 'file2.txt'
|
|
166
166
|
});
|
|
167
167
|
await waitFor(()=>{
|
|
168
168
|
expect(result1.current.isSuccess).toBe(true);
|
|
@@ -172,7 +172,7 @@ describe("useCreateS3MutationHook - Factory Specific", ()=>{
|
|
|
172
172
|
expect(result2.current.data).toEqual(mockResponse2);
|
|
173
173
|
expect(mockS3Client.send).toHaveBeenCalledTimes(2);
|
|
174
174
|
});
|
|
175
|
-
it(
|
|
175
|
+
it('should pass command correctly for mutations', async ()=>{
|
|
176
176
|
let capturedCommand;
|
|
177
177
|
mockS3Client.send.mockImplementation((command)=>{
|
|
178
178
|
capturedCommand = command;
|
|
@@ -180,21 +180,21 @@ describe("useCreateS3MutationHook - Factory Specific", ()=>{
|
|
|
180
180
|
success: true
|
|
181
181
|
});
|
|
182
182
|
});
|
|
183
|
-
const useMutation = useCreateS3MutationHook(MockCommand,
|
|
183
|
+
const useMutation = useCreateS3MutationHook(MockCommand, 'PutObject');
|
|
184
184
|
const { result } = renderHook(()=>useMutation(), {
|
|
185
|
-
wrapper:
|
|
185
|
+
wrapper: createTestWrapper()
|
|
186
186
|
});
|
|
187
187
|
result.current.mutate({
|
|
188
|
-
Bucket:
|
|
189
|
-
Key:
|
|
188
|
+
Bucket: 'test-bucket',
|
|
189
|
+
Key: 'test-file.txt'
|
|
190
190
|
});
|
|
191
191
|
await waitFor(()=>{
|
|
192
192
|
expect(result.current.isSuccess).toBe(true);
|
|
193
193
|
});
|
|
194
194
|
expect(capturedCommand).toBeInstanceOf(MockCommand);
|
|
195
195
|
expect(capturedCommand.input).toEqual({
|
|
196
|
-
Bucket:
|
|
197
|
-
Key:
|
|
196
|
+
Bucket: 'test-bucket',
|
|
197
|
+
Key: 'test-file.txt'
|
|
198
198
|
});
|
|
199
199
|
});
|
|
200
200
|
});
|
|
@@ -2,9 +2,9 @@ import { renderHook, waitFor } from "@testing-library/react";
|
|
|
2
2
|
import { useCreateS3QueryHook } from "../useCreateS3QueryHook.js";
|
|
3
3
|
import { useS3Client } from "../../useS3Client.js";
|
|
4
4
|
import { createS3OperationError, isNotFoundError } from "../../../utils/errorHandling.js";
|
|
5
|
-
import {
|
|
6
|
-
jest.mock(
|
|
7
|
-
jest.mock(
|
|
5
|
+
import { createTestWrapper, validateFactoryHook, validateHookResult } from "../../../test/testUtils.js";
|
|
6
|
+
jest.mock('../../useS3Client');
|
|
7
|
+
jest.mock('../../../utils/errorHandling');
|
|
8
8
|
const mockUseS3Client = useS3Client;
|
|
9
9
|
const mockCreateS3OperationError = createS3OperationError;
|
|
10
10
|
const mockIsNotFoundError = isNotFoundError;
|
|
@@ -17,48 +17,48 @@ class MockCommand {
|
|
|
17
17
|
const mockS3Client = {
|
|
18
18
|
send: jest.fn()
|
|
19
19
|
};
|
|
20
|
-
describe(
|
|
20
|
+
describe('useCreateS3QueryHook - Factory Specific', ()=>{
|
|
21
21
|
beforeEach(()=>{
|
|
22
22
|
jest.clearAllMocks();
|
|
23
23
|
mockUseS3Client.mockReturnValue(mockS3Client);
|
|
24
24
|
});
|
|
25
|
-
it(
|
|
26
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
27
|
-
validateFactoryHook(useTestQuery,
|
|
25
|
+
it('should create a functioning query hook', ()=>{
|
|
26
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'testOperation');
|
|
27
|
+
validateFactoryHook(useTestQuery, 'testOperation');
|
|
28
28
|
const { result } = renderHook(()=>useTestQuery({
|
|
29
|
-
testParam:
|
|
29
|
+
testParam: 'value'
|
|
30
30
|
}), {
|
|
31
|
-
wrapper:
|
|
31
|
+
wrapper: createTestWrapper()
|
|
32
32
|
});
|
|
33
|
-
validateHookResult(result.current,
|
|
33
|
+
validateHookResult(result.current, 'query');
|
|
34
34
|
});
|
|
35
|
-
it(
|
|
36
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
35
|
+
it('should accept and forward query options correctly', ()=>{
|
|
36
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'testOperation');
|
|
37
37
|
const customOptions = {
|
|
38
38
|
enabled: false,
|
|
39
39
|
staleTime: 5000,
|
|
40
40
|
refetchOnWindowFocus: false
|
|
41
41
|
};
|
|
42
42
|
const { result } = renderHook(()=>useTestQuery({
|
|
43
|
-
testParam:
|
|
43
|
+
testParam: 'value'
|
|
44
44
|
}, customOptions), {
|
|
45
|
-
wrapper:
|
|
45
|
+
wrapper: createTestWrapper()
|
|
46
46
|
});
|
|
47
|
-
expect(result.current.fetchStatus).toBe(
|
|
47
|
+
expect(result.current.fetchStatus).toBe('idle');
|
|
48
48
|
expect(result.current.isLoading).toBe(false);
|
|
49
49
|
});
|
|
50
|
-
it(
|
|
50
|
+
it('should handle successful query execution', async ()=>{
|
|
51
51
|
const mockResponse = {
|
|
52
|
-
data:
|
|
53
|
-
status:
|
|
52
|
+
data: 'test-response',
|
|
53
|
+
status: 'success'
|
|
54
54
|
};
|
|
55
55
|
mockS3Client.send.mockResolvedValue(mockResponse);
|
|
56
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
56
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'testOperation');
|
|
57
57
|
const { result } = renderHook(()=>useTestQuery({
|
|
58
|
-
Bucket:
|
|
59
|
-
Key:
|
|
58
|
+
Bucket: 'test-bucket',
|
|
59
|
+
Key: 'test-key'
|
|
60
60
|
}), {
|
|
61
|
-
wrapper:
|
|
61
|
+
wrapper: createTestWrapper()
|
|
62
62
|
});
|
|
63
63
|
await waitFor(()=>{
|
|
64
64
|
expect(result.current.isSuccess).toBe(true);
|
|
@@ -68,52 +68,52 @@ describe("useCreateS3QueryHook - Factory Specific", ()=>{
|
|
|
68
68
|
abortSignal: expect.any(AbortSignal)
|
|
69
69
|
}));
|
|
70
70
|
});
|
|
71
|
-
it(
|
|
72
|
-
const mockError = new Error(
|
|
73
|
-
const enhancedError = new Error(
|
|
71
|
+
it('should handle query errors with proper context', async ()=>{
|
|
72
|
+
const mockError = new Error('S3 Service Error');
|
|
73
|
+
const enhancedError = new Error('Enhanced S3 Service Error');
|
|
74
74
|
mockS3Client.send.mockRejectedValue(mockError);
|
|
75
75
|
mockCreateS3OperationError.mockReturnValue(enhancedError);
|
|
76
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
76
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'testOperation');
|
|
77
77
|
const { result } = renderHook(()=>useTestQuery({
|
|
78
|
-
Bucket:
|
|
79
|
-
Key:
|
|
78
|
+
Bucket: 'test-bucket',
|
|
79
|
+
Key: 'test-key'
|
|
80
80
|
}), {
|
|
81
|
-
wrapper:
|
|
81
|
+
wrapper: createTestWrapper()
|
|
82
82
|
});
|
|
83
83
|
await waitFor(()=>{
|
|
84
84
|
expect(result.current.isError).toBe(true);
|
|
85
85
|
});
|
|
86
86
|
expect(result.current.error).toBe(enhancedError);
|
|
87
|
-
expect(mockCreateS3OperationError).toHaveBeenCalledWith(mockError,
|
|
87
|
+
expect(mockCreateS3OperationError).toHaveBeenCalledWith(mockError, 'testOperation', 'test-bucket');
|
|
88
88
|
});
|
|
89
|
-
it(
|
|
90
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
89
|
+
it('should handle parameter validation correctly', ()=>{
|
|
90
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'testOperation');
|
|
91
91
|
const { result: invalidResult } = renderHook(()=>useTestQuery({
|
|
92
|
-
Bucket:
|
|
92
|
+
Bucket: 'test',
|
|
93
93
|
Key: void 0
|
|
94
94
|
}), {
|
|
95
|
-
wrapper:
|
|
95
|
+
wrapper: createTestWrapper()
|
|
96
96
|
});
|
|
97
|
-
expect(invalidResult.current.fetchStatus).toBe(
|
|
97
|
+
expect(invalidResult.current.fetchStatus).toBe('idle');
|
|
98
98
|
const { result: validResult } = renderHook(()=>useTestQuery({
|
|
99
|
-
Bucket:
|
|
100
|
-
Key:
|
|
99
|
+
Bucket: 'test',
|
|
100
|
+
Key: 'valid-key'
|
|
101
101
|
}), {
|
|
102
|
-
wrapper:
|
|
102
|
+
wrapper: createTestWrapper()
|
|
103
103
|
});
|
|
104
|
-
expect(validResult.current.fetchStatus).not.toBe(
|
|
104
|
+
expect(validResult.current.fetchStatus).not.toBe('idle');
|
|
105
105
|
});
|
|
106
|
-
it(
|
|
107
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
106
|
+
it('should handle empty string parameters correctly', ()=>{
|
|
107
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'testOperation');
|
|
108
108
|
const { result: emptyResult } = renderHook(()=>useTestQuery({
|
|
109
|
-
Bucket:
|
|
110
|
-
Key:
|
|
109
|
+
Bucket: 'test',
|
|
110
|
+
Key: ''
|
|
111
111
|
}), {
|
|
112
|
-
wrapper:
|
|
112
|
+
wrapper: createTestWrapper()
|
|
113
113
|
});
|
|
114
|
-
expect(emptyResult.current.fetchStatus).not.toBe(
|
|
114
|
+
expect(emptyResult.current.fetchStatus).not.toBe('idle');
|
|
115
115
|
});
|
|
116
|
-
it(
|
|
116
|
+
it('should pass AbortSignal correctly to S3 client', async ()=>{
|
|
117
117
|
let capturedAbortSignal;
|
|
118
118
|
mockS3Client.send.mockImplementation((_command, options)=>{
|
|
119
119
|
capturedAbortSignal = options?.abortSignal;
|
|
@@ -121,12 +121,12 @@ describe("useCreateS3QueryHook - Factory Specific", ()=>{
|
|
|
121
121
|
success: true
|
|
122
122
|
});
|
|
123
123
|
});
|
|
124
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
124
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'testOperation');
|
|
125
125
|
const { result } = renderHook(()=>useTestQuery({
|
|
126
|
-
Bucket:
|
|
127
|
-
Key:
|
|
126
|
+
Bucket: 'test',
|
|
127
|
+
Key: 'test'
|
|
128
128
|
}), {
|
|
129
|
-
wrapper:
|
|
129
|
+
wrapper: createTestWrapper()
|
|
130
130
|
});
|
|
131
131
|
await waitFor(()=>{
|
|
132
132
|
expect(result.current.isSuccess).toBe(true);
|
|
@@ -134,19 +134,19 @@ describe("useCreateS3QueryHook - Factory Specific", ()=>{
|
|
|
134
134
|
expect(capturedAbortSignal).toBeInstanceOf(AbortSignal);
|
|
135
135
|
expect(capturedAbortSignal?.aborted).toBe(false);
|
|
136
136
|
});
|
|
137
|
-
it(
|
|
138
|
-
const error = new Error(
|
|
139
|
-
error.name =
|
|
137
|
+
it('should return empty config for supported operations when NOT_FOUND error occurs', async ()=>{
|
|
138
|
+
const error = new Error('Configuration does not exist');
|
|
139
|
+
error.name = 'NoSuchConfiguration';
|
|
140
140
|
error.$metadata = {
|
|
141
141
|
httpStatusCode: 404
|
|
142
142
|
};
|
|
143
143
|
mockS3Client.send.mockRejectedValueOnce(error);
|
|
144
144
|
mockIsNotFoundError.mockReturnValueOnce(true);
|
|
145
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
145
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'GetBucketLifecycleConfiguration');
|
|
146
146
|
const { result } = renderHook(()=>useTestQuery({
|
|
147
|
-
Bucket:
|
|
147
|
+
Bucket: 'test-bucket'
|
|
148
148
|
}), {
|
|
149
|
-
wrapper:
|
|
149
|
+
wrapper: createTestWrapper()
|
|
150
150
|
});
|
|
151
151
|
await waitFor(()=>{
|
|
152
152
|
expect(result.current.isSuccess).toBe(true);
|
|
@@ -154,21 +154,21 @@ describe("useCreateS3QueryHook - Factory Specific", ()=>{
|
|
|
154
154
|
expect(result.current.data).toBeDefined();
|
|
155
155
|
expect(mockIsNotFoundError).toHaveBeenCalledWith(error);
|
|
156
156
|
});
|
|
157
|
-
it(
|
|
158
|
-
const error = new Error(
|
|
159
|
-
error.name =
|
|
157
|
+
it('should throw error when NOT_FOUND occurs for unsupported operations', async ()=>{
|
|
158
|
+
const error = new Error('Bucket not found');
|
|
159
|
+
error.name = 'NoSuchBucket';
|
|
160
160
|
error.$metadata = {
|
|
161
161
|
httpStatusCode: 404
|
|
162
162
|
};
|
|
163
|
-
const enhancedError = new Error(
|
|
163
|
+
const enhancedError = new Error('Enhanced error');
|
|
164
164
|
mockS3Client.send.mockRejectedValueOnce(error);
|
|
165
165
|
mockIsNotFoundError.mockReturnValueOnce(true);
|
|
166
166
|
mockCreateS3OperationError.mockReturnValueOnce(enhancedError);
|
|
167
|
-
const useTestQuery = useCreateS3QueryHook(MockCommand,
|
|
167
|
+
const useTestQuery = useCreateS3QueryHook(MockCommand, 'GetBucketAcl');
|
|
168
168
|
const { result } = renderHook(()=>useTestQuery({
|
|
169
|
-
Bucket:
|
|
169
|
+
Bucket: 'test-bucket'
|
|
170
170
|
}), {
|
|
171
|
-
wrapper:
|
|
171
|
+
wrapper: createTestWrapper()
|
|
172
172
|
});
|
|
173
173
|
await waitFor(()=>{
|
|
174
174
|
expect(result.current.isError).toBe(true);
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - AbortSignal support for cancellation
|
|
13
13
|
* - Bucket/object context extraction for errors
|
|
14
14
|
*/
|
|
15
|
-
export { useCreateS3QueryHook } from
|
|
16
|
-
export { useCreateS3MutationHook, useCreateS3FunctionMutationHook, } from
|
|
17
|
-
export { useCreateS3InfiniteQueryHook } from
|
|
18
|
-
export { useCreateS3LoginHook } from
|
|
15
|
+
export { useCreateS3QueryHook } from './useCreateS3QueryHook';
|
|
16
|
+
export { useCreateS3MutationHook, useCreateS3FunctionMutationHook, } from './useCreateS3MutationHook';
|
|
17
|
+
export { useCreateS3InfiniteQueryHook } from './useCreateS3InfiniteQueryHook';
|
|
18
|
+
export { useCreateS3LoginHook } from './useCreateS3LoginHook';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { UseInfiniteQueryOptions, UseInfiniteQueryResult } from
|
|
2
|
-
import { EnhancedS3Error } from
|
|
1
|
+
import { UseInfiniteQueryOptions, UseInfiniteQueryResult } from '@tanstack/react-query';
|
|
2
|
+
import { EnhancedS3Error } from '../../utils/errorHandling';
|
|
3
3
|
/**
|
|
4
4
|
* Factory function for creating S3 infinite query hooks
|
|
5
5
|
*
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { useInfiniteQuery } from "@tanstack/react-query";
|
|
2
2
|
import { useS3Client } from "../useS3Client.js";
|
|
3
|
+
import { useDataBrowserContext } from "../../components/providers/DataBrowserProvider.js";
|
|
3
4
|
import { createS3OperationError, shouldRetryError } from "../../utils/errorHandling.js";
|
|
4
5
|
function useCreateS3InfiniteQueryHook(Command, operationName) {
|
|
5
6
|
return (params, options)=>{
|
|
7
|
+
const { s3ConfigIdentifier } = useDataBrowserContext();
|
|
6
8
|
const s3Client = useS3Client();
|
|
7
9
|
const queryOptions = {
|
|
8
10
|
queryKey: [
|
|
11
|
+
s3ConfigIdentifier,
|
|
9
12
|
operationName,
|
|
10
13
|
params
|
|
11
14
|
],
|
|
@@ -20,7 +23,7 @@ function useCreateS3InfiniteQueryHook(Command, operationName) {
|
|
|
20
23
|
});
|
|
21
24
|
return response;
|
|
22
25
|
} catch (error) {
|
|
23
|
-
const bucketName =
|
|
26
|
+
const bucketName = 'Bucket' in params ? params.Bucket : void 0;
|
|
24
27
|
throw createS3OperationError(error, operationName, bucketName);
|
|
25
28
|
}
|
|
26
29
|
},
|
|
@@ -28,8 +31,8 @@ function useCreateS3InfiniteQueryHook(Command, operationName) {
|
|
|
28
31
|
initialPageParam: void 0,
|
|
29
32
|
getNextPageParam: (lastPage)=>getNextPageToken(operationName, lastPage),
|
|
30
33
|
enabled: params ? Object.entries(params).every(([key, value])=>{
|
|
31
|
-
if (
|
|
32
|
-
return void 0 !== value &&
|
|
34
|
+
if ('Prefix' === key) return void 0 !== value;
|
|
35
|
+
return void 0 !== value && '' !== value;
|
|
33
36
|
}) : true,
|
|
34
37
|
...options
|
|
35
38
|
};
|
|
@@ -38,18 +41,18 @@ function useCreateS3InfiniteQueryHook(Command, operationName) {
|
|
|
38
41
|
}
|
|
39
42
|
function getPaginationParams(operationName, pageParam) {
|
|
40
43
|
switch(operationName){
|
|
41
|
-
case
|
|
44
|
+
case 'ListObjects':
|
|
42
45
|
return {
|
|
43
46
|
ContinuationToken: pageParam
|
|
44
47
|
};
|
|
45
|
-
case
|
|
46
|
-
if (pageParam.includes(
|
|
47
|
-
const [keyMarker, versionIdMarker] = pageParam.split(
|
|
48
|
+
case 'ListObjectVersions':
|
|
49
|
+
if (pageParam.includes('|')) {
|
|
50
|
+
const [keyMarker, versionIdMarker] = pageParam.split('|');
|
|
48
51
|
return {
|
|
49
|
-
...keyMarker &&
|
|
52
|
+
...keyMarker && '' !== keyMarker ? {
|
|
50
53
|
KeyMarker: keyMarker
|
|
51
54
|
} : {},
|
|
52
|
-
...versionIdMarker &&
|
|
55
|
+
...versionIdMarker && '' !== versionIdMarker ? {
|
|
53
56
|
VersionIdMarker: versionIdMarker
|
|
54
57
|
} : {}
|
|
55
58
|
};
|
|
@@ -65,10 +68,10 @@ function getPaginationParams(operationName, pageParam) {
|
|
|
65
68
|
}
|
|
66
69
|
function getNextPageToken(operationName, lastPage) {
|
|
67
70
|
switch(operationName){
|
|
68
|
-
case
|
|
71
|
+
case 'ListObjects':
|
|
69
72
|
return lastPage.IsTruncated ? lastPage.NextContinuationToken : void 0;
|
|
70
|
-
case
|
|
71
|
-
return lastPage.IsTruncated && (lastPage.NextKeyMarker || lastPage.NextVersionIdMarker) ? `${lastPage.NextKeyMarker ||
|
|
73
|
+
case 'ListObjectVersions':
|
|
74
|
+
return lastPage.IsTruncated && (lastPage.NextKeyMarker || lastPage.NextVersionIdMarker) ? `${lastPage.NextKeyMarker || ''}|${lastPage.NextVersionIdMarker || ''}` : void 0;
|
|
72
75
|
default:
|
|
73
76
|
return lastPage.IsTruncated ? lastPage.NextContinuationToken : void 0;
|
|
74
77
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { UseMutationOptions, UseMutationResult } from
|
|
2
|
-
import { EnhancedS3Error } from
|
|
1
|
+
import { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
2
|
+
import { EnhancedS3Error } from '../../utils/errorHandling';
|
|
3
3
|
/**
|
|
4
4
|
* Factory function for creating S3 login mutation hooks
|
|
5
5
|
* This factory handles the special authentication case where we need
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { UseMutationOptions, UseMutationResult } from
|
|
2
|
-
import { EnhancedS3Error } from
|
|
3
|
-
import { S3Client } from
|
|
1
|
+
import { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';
|
|
2
|
+
import { EnhancedS3Error } from '../../utils/errorHandling';
|
|
3
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
4
4
|
export declare function useCreateS3MutationHook<TInput extends object, TOutput>(Command: new (input: TInput) => any, operationName: string, invalidationKeys?: string[]): (options?: Omit<UseMutationOptions<TOutput, EnhancedS3Error, TInput>, "mutationFn">) => UseMutationResult<TOutput, EnhancedS3Error, TInput>;
|
|
5
5
|
export declare function useCreateS3FunctionMutationHook<TInput, TOutput>(operation: (s3Client: S3Client, input: TInput) => Promise<TOutput>, invalidationKeys?: string[]): (options?: Omit<UseMutationOptions<TOutput, EnhancedS3Error, TInput>, "mutationFn">) => UseMutationResult<TOutput, EnhancedS3Error, TInput>;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
2
2
|
import { useS3Client } from "../useS3Client.js";
|
|
3
|
+
import { useDataBrowserContext } from "../../components/providers/DataBrowserProvider.js";
|
|
3
4
|
import { createS3OperationError } from "../../utils/errorHandling.js";
|
|
4
5
|
function useCreateS3MutationHook(Command, operationName, invalidationKeys) {
|
|
5
6
|
return (options)=>{
|
|
7
|
+
const { s3ConfigIdentifier } = useDataBrowserContext();
|
|
6
8
|
const s3Client = useS3Client();
|
|
7
9
|
const queryClient = useQueryClient();
|
|
8
10
|
return useMutation({
|
|
@@ -11,7 +13,7 @@ function useCreateS3MutationHook(Command, operationName, invalidationKeys) {
|
|
|
11
13
|
const command = new Command(params);
|
|
12
14
|
return await s3Client.send(command);
|
|
13
15
|
} catch (error) {
|
|
14
|
-
const bucketName =
|
|
16
|
+
const bucketName = 'Bucket' in params ? params.Bucket : void 0;
|
|
15
17
|
throw createS3OperationError(error, operationName, bucketName);
|
|
16
18
|
}
|
|
17
19
|
},
|
|
@@ -19,6 +21,7 @@ function useCreateS3MutationHook(Command, operationName, invalidationKeys) {
|
|
|
19
21
|
if (invalidationKeys) invalidationKeys.forEach((key)=>{
|
|
20
22
|
queryClient.invalidateQueries({
|
|
21
23
|
queryKey: [
|
|
24
|
+
s3ConfigIdentifier,
|
|
22
25
|
key
|
|
23
26
|
]
|
|
24
27
|
});
|
|
@@ -30,6 +33,7 @@ function useCreateS3MutationHook(Command, operationName, invalidationKeys) {
|
|
|
30
33
|
}
|
|
31
34
|
function useCreateS3FunctionMutationHook(operation, invalidationKeys) {
|
|
32
35
|
return (options)=>{
|
|
36
|
+
const { s3ConfigIdentifier } = useDataBrowserContext();
|
|
33
37
|
const s3Client = useS3Client();
|
|
34
38
|
const queryClient = useQueryClient();
|
|
35
39
|
return useMutation({
|
|
@@ -38,6 +42,7 @@ function useCreateS3FunctionMutationHook(operation, invalidationKeys) {
|
|
|
38
42
|
if (invalidationKeys) invalidationKeys.forEach((key)=>{
|
|
39
43
|
queryClient.invalidateQueries({
|
|
40
44
|
queryKey: [
|
|
45
|
+
s3ConfigIdentifier,
|
|
41
46
|
key
|
|
42
47
|
]
|
|
43
48
|
});
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { QueryKey, UseQueryOptions, UseQueryResult } from
|
|
2
|
-
import { EnhancedS3Error } from
|
|
1
|
+
import { QueryKey, UseQueryOptions, UseQueryResult } from '@tanstack/react-query';
|
|
2
|
+
import { EnhancedS3Error } from '../../utils/errorHandling';
|
|
3
3
|
export declare function useCreateS3QueryHook<TInput extends object, TOutput>(Command: new (input: TInput) => any, operationName: string): (params?: TInput, options?: Omit<UseQueryOptions<TOutput, EnhancedS3Error, TOutput, QueryKey>, "queryKey" | "queryFn">) => UseQueryResult<TOutput, EnhancedS3Error>;
|