@scality/data-browser-library 1.0.0-preview.9 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/DataBrowserUI.d.ts +12 -0
- package/dist/components/DataBrowserUI.js +99 -0
- package/dist/components/Editor.d.ts +1 -1
- package/dist/components/Editor.js +3 -3
- package/dist/components/__tests__/BucketAccessor.test.js +214 -0
- package/dist/components/__tests__/BucketCorsPage.test.d.ts +1 -0
- package/dist/components/__tests__/BucketCorsPage.test.js +263 -0
- package/dist/components/__tests__/BucketCreate.test.js +271 -105
- package/dist/components/__tests__/BucketDetails.test.d.ts +1 -0
- package/dist/components/__tests__/BucketDetails.test.js +421 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.d.ts +13 -0
- package/dist/components/__tests__/BucketLifecycleFormPage.test.js +178 -178
- package/dist/components/__tests__/BucketLifecycleList.test.js +85 -85
- package/dist/components/__tests__/BucketList.test.js +463 -239
- package/dist/components/__tests__/BucketNotificationFormPage.test.d.ts +1 -0
- package/dist/components/__tests__/BucketNotificationFormPage.test.js +348 -0
- package/dist/components/__tests__/BucketNotificationList.test.d.ts +1 -0
- package/dist/components/__tests__/BucketNotificationList.test.js +379 -0
- package/dist/components/__tests__/BucketOverview.test.js +281 -266
- package/dist/components/__tests__/BucketPolicyPage.test.js +151 -99
- package/dist/components/__tests__/BucketReplicationFormPage.test.d.ts +15 -0
- package/dist/components/__tests__/BucketReplicationFormPage.test.js +544 -544
- package/dist/components/__tests__/BucketReplicationList.test.js +106 -106
- package/dist/components/__tests__/CreateFolderButton.test.js +56 -56
- package/dist/components/__tests__/DeleteBucketButton.test.js +64 -64
- package/dist/components/__tests__/DeleteBucketConfigRuleButton.test.js +47 -47
- package/dist/components/__tests__/DeleteObjectButton.test.js +64 -64
- package/dist/components/__tests__/EmptyBucketButton.test.js +59 -59
- package/dist/components/__tests__/MetadataSearch.test.js +65 -65
- package/dist/components/__tests__/ObjectList.test.js +741 -240
- package/dist/components/__tests__/UploadButton.test.js +45 -45
- package/dist/components/breadcrumb/Breadcrumb.d.ts +6 -0
- package/dist/components/breadcrumb/Breadcrumb.js +37 -0
- package/dist/components/breadcrumb/DataBrowserBreadcrumb.d.ts +1 -0
- package/dist/components/breadcrumb/DataBrowserBreadcrumb.js +10 -0
- package/dist/components/breadcrumb/__tests__/Breadcrumb.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/Breadcrumb.test.js +196 -0
- package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/DataBrowserBreadcrumb.test.js +153 -0
- package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.d.ts +1 -0
- package/dist/components/breadcrumb/__tests__/useBreadcrumbPaths.test.js +134 -0
- package/dist/components/breadcrumb/index.d.ts +8 -0
- package/dist/components/breadcrumb/index.js +4 -0
- package/dist/components/breadcrumb/useBreadcrumbPaths.d.ts +2 -0
- package/dist/components/breadcrumb/useBreadcrumbPaths.js +82 -0
- package/dist/components/buckets/BucketAccessor.d.ts +2 -0
- package/dist/components/buckets/BucketAccessor.js +125 -0
- package/dist/components/buckets/BucketConfigEditButton.d.ts +8 -0
- package/dist/components/buckets/{BucketPolicyButton.js → BucketConfigEditButton.js} +9 -5
- package/dist/components/buckets/BucketCorsPage.d.ts +1 -0
- package/dist/components/buckets/BucketCorsPage.js +234 -0
- package/dist/components/buckets/BucketCreate.d.ts +3 -2
- package/dist/components/buckets/BucketCreate.js +93 -47
- package/dist/components/buckets/BucketDetails.d.ts +42 -0
- package/dist/components/buckets/BucketDetails.js +249 -85
- package/dist/components/buckets/BucketLifecycleFormPage.js +225 -191
- package/dist/components/buckets/BucketLifecycleList.d.ts +2 -2
- package/dist/components/buckets/BucketLifecycleList.js +59 -61
- package/dist/components/buckets/BucketList.d.ts +7 -8
- package/dist/components/buckets/BucketList.js +158 -101
- package/dist/components/buckets/BucketLocation.js +4 -4
- package/dist/components/buckets/BucketOverview.d.ts +22 -2
- package/dist/components/buckets/BucketOverview.js +394 -187
- package/dist/components/buckets/BucketPage.js +43 -21
- package/dist/components/buckets/BucketPolicyPage.js +155 -127
- package/dist/components/buckets/BucketReplicationFormPage.js +134 -133
- package/dist/components/buckets/BucketReplicationList.d.ts +2 -2
- package/dist/components/buckets/BucketReplicationList.js +48 -45
- package/dist/components/buckets/BucketVersioning.d.ts +4 -0
- package/dist/components/buckets/BucketVersioning.js +76 -0
- package/dist/components/buckets/DeleteBucketButton.js +8 -8
- package/dist/components/buckets/DeleteBucketConfigRuleButton.d.ts +2 -2
- package/dist/components/buckets/DeleteBucketConfigRuleButton.js +2 -2
- package/dist/components/buckets/EmptyBucketButton.js +24 -24
- package/dist/components/buckets/EmptyBucketSummary.d.ts +2 -2
- package/dist/components/buckets/EmptyBucketSummary.js +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.d.ts +1 -1
- package/dist/components/buckets/EmptyBucketSummaryList.js +22 -22
- package/dist/components/buckets/__tests__/BucketVersioning.test.d.ts +1 -0
- package/dist/components/buckets/__tests__/BucketVersioning.test.js +163 -0
- package/dist/components/buckets/notifications/BucketNotificationFormPage.d.ts +1 -0
- package/dist/components/buckets/notifications/BucketNotificationFormPage.js +316 -0
- package/dist/components/buckets/notifications/BucketNotificationList.d.ts +10 -0
- package/dist/components/buckets/notifications/BucketNotificationList.js +267 -0
- package/dist/components/buckets/notifications/EventsSection.js +145 -29
- package/dist/components/buckets/notifications/__tests__/events.test.d.ts +1 -0
- package/dist/components/buckets/notifications/__tests__/events.test.js +56 -0
- package/dist/components/buckets/notifications/events.d.ts +71 -7
- package/dist/components/buckets/notifications/events.js +98 -16
- package/dist/components/index.d.ts +27 -20
- package/dist/components/index.js +17 -10
- package/dist/components/layouts/ArrowNavigation.d.ts +3 -0
- package/dist/components/layouts/ArrowNavigation.js +28 -0
- package/dist/components/layouts/BrowserPageLayout.d.ts +5 -1
- package/dist/components/layouts/BrowserPageLayout.js +10 -5
- package/dist/components/objects/CreateFolderButton.d.ts +2 -2
- package/dist/components/objects/CreateFolderButton.js +12 -12
- package/dist/components/objects/DeleteObjectButton.d.ts +1 -1
- package/dist/components/objects/DeleteObjectButton.js +19 -21
- package/dist/components/objects/GetPresignedUrlButton.d.ts +7 -0
- package/dist/components/objects/GetPresignedUrlButton.js +255 -0
- package/dist/components/objects/ObjectDetails/ObjectMetadata.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectMetadata.js +289 -230
- package/dist/components/objects/ObjectDetails/ObjectSummary.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectSummary.js +540 -138
- package/dist/components/objects/ObjectDetails/ObjectTags.d.ts +2 -2
- package/dist/components/objects/ObjectDetails/ObjectTags.js +103 -123
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.d.ts +1 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectDetails.test.js +516 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.d.ts +1 -0
- package/dist/components/objects/ObjectDetails/__tests__/ObjectSummary.test.js +1064 -0
- package/dist/components/objects/ObjectDetails/formUtils.d.ts +15 -0
- package/dist/components/objects/ObjectDetails/formUtils.js +7 -0
- package/dist/components/objects/ObjectDetails/index.d.ts +18 -2
- package/dist/components/objects/ObjectDetails/index.js +152 -40
- package/dist/components/objects/ObjectList.d.ts +12 -10
- package/dist/components/objects/ObjectList.js +590 -263
- package/dist/components/objects/ObjectLock/EditRetentionButton.js +4 -4
- package/dist/components/objects/ObjectLock/ObjectLockRetentionSettings.js +15 -15
- package/dist/components/objects/ObjectLock/ObjectLockSettings.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettings.js +32 -31
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.d.ts +1 -1
- package/dist/components/objects/ObjectLock/ObjectLockSettingsUtils.js +6 -6
- package/dist/components/objects/ObjectLock/__tests__/EditRetentionButton.test.js +51 -51
- package/dist/components/objects/ObjectLock/__tests__/ObjectLockSettings.test.js +78 -78
- package/dist/components/objects/ObjectPage.js +12 -8
- package/dist/components/objects/UploadButton.d.ts +3 -3
- package/dist/components/objects/UploadButton.js +10 -10
- package/dist/components/objects/__tests__/GetPresignedUrlButton.test.d.ts +1 -0
- package/dist/components/objects/__tests__/GetPresignedUrlButton.test.js +531 -0
- package/dist/components/providers/DataBrowserProvider.d.ts +23 -12
- package/dist/components/providers/DataBrowserProvider.js +60 -38
- package/dist/components/providers/QueryProvider.d.ts +9 -0
- package/dist/components/providers/QueryProvider.js +21 -0
- package/dist/components/search/MetadataSearch.js +29 -28
- package/dist/components/search/SearchHints.js +1 -1
- package/dist/components/ui/ArrayFieldActions.js +12 -7
- package/dist/components/ui/ConfirmDeleteRuleModal.d.ts +2 -2
- package/dist/components/ui/ConfirmDeleteRuleModal.js +6 -1
- package/dist/components/ui/DeleteObjectModalContent.d.ts +1 -1
- package/dist/components/ui/DeleteObjectModalContent.js +12 -12
- package/dist/components/ui/FilterFormSection.d.ts +2 -2
- package/dist/components/ui/FilterFormSection.js +29 -29
- package/dist/components/ui/Search.elements.d.ts +2 -2
- package/dist/components/ui/Search.elements.js +7 -7
- package/dist/components/ui/Table.elements.d.ts +2 -1
- package/dist/components/ui/Table.elements.js +18 -12
- package/dist/config/__tests__/factory.test.d.ts +1 -0
- package/dist/config/__tests__/factory.test.js +311 -0
- package/dist/config/factory.d.ts +10 -56
- package/dist/config/factory.js +23 -71
- package/dist/config/types.d.ts +212 -34
- package/dist/contexts/DataBrowserUICustomizationContext.d.ts +27 -0
- package/dist/contexts/DataBrowserUICustomizationContext.js +13 -0
- package/dist/hooks/__tests__/useAccessibleBuckets.test.d.ts +1 -0
- package/dist/hooks/__tests__/useAccessibleBuckets.test.js +145 -0
- package/dist/hooks/__tests__/useISVBucketDetection.test.js +45 -45
- package/dist/hooks/__tests__/useIsBucketEmpty.test.js +27 -27
- package/dist/hooks/__tests__/useLoginMutation.test.d.ts +1 -0
- package/dist/hooks/__tests__/useLoginMutation.test.js +194 -0
- package/dist/hooks/bucketConfiguration.d.ts +8 -1
- package/dist/hooks/bucketConfiguration.js +52 -51
- package/dist/hooks/bucketOperations.d.ts +10 -1
- package/dist/hooks/bucketOperations.js +10 -9
- package/dist/hooks/factories/__tests__/useCreateS3FunctionMutationHook.test.js +80 -80
- package/dist/hooks/factories/__tests__/useCreateS3InfiniteQueryHook.test.js +80 -80
- package/dist/hooks/factories/__tests__/useCreateS3LoginHook.test.js +44 -44
- package/dist/hooks/factories/__tests__/useCreateS3MutationHook.test.js +63 -63
- package/dist/hooks/factories/__tests__/useCreateS3QueryHook.test.js +65 -65
- package/dist/hooks/factories/index.d.ts +4 -4
- package/dist/hooks/factories/index.js +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3InfiniteQueryHook.js +16 -13
- package/dist/hooks/factories/useCreateS3LoginHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3LoginHook.js +1 -1
- package/dist/hooks/factories/useCreateS3MutationHook.d.ts +3 -3
- package/dist/hooks/factories/useCreateS3MutationHook.js +7 -2
- package/dist/hooks/factories/useCreateS3QueryHook.d.ts +2 -2
- package/dist/hooks/factories/useCreateS3QueryHook.js +11 -6
- package/dist/hooks/index.d.ts +19 -12
- package/dist/hooks/index.js +16 -9
- package/dist/hooks/loginOperations.d.ts +1 -1
- package/dist/hooks/loginOperations.js +1 -1
- package/dist/hooks/objectOperations.d.ts +2 -2
- package/dist/hooks/objectOperations.js +50 -49
- package/dist/hooks/presignedOperations.d.ts +4 -4
- package/dist/hooks/presignedOperations.js +5 -5
- package/dist/hooks/useAccessibleBuckets.d.ts +11 -0
- package/dist/hooks/useAccessibleBuckets.js +115 -0
- package/dist/hooks/useBatchObjectLegalHold.d.ts +11 -0
- package/dist/hooks/useBatchObjectLegalHold.js +48 -0
- package/dist/hooks/useBucketConfigEditor.d.ts +31 -0
- package/dist/hooks/useBucketConfigEditor.js +82 -0
- package/dist/hooks/useDataBrowserNavigate.d.ts +28 -0
- package/dist/hooks/useDataBrowserNavigate.js +24 -0
- package/dist/hooks/useDeleteBucketConfigRule.d.ts +2 -2
- package/dist/hooks/useDeleteBucketConfigRule.js +4 -4
- package/dist/hooks/useEmptyBucket.js +11 -11
- package/dist/hooks/useFeatures.d.ts +7 -0
- package/dist/hooks/useFeatures.js +8 -0
- package/dist/hooks/useISVBucketDetection.js +6 -6
- package/dist/hooks/useIsBucketEmpty.js +4 -4
- package/dist/hooks/useLimitedAccessFlow.d.ts +48 -0
- package/dist/hooks/useLimitedAccessFlow.js +23 -0
- package/dist/hooks/useS3Client.d.ts +6 -0
- package/dist/hooks/useS3Client.js +3 -2
- package/dist/hooks/useS3ConfigSwitch.d.ts +11 -0
- package/dist/hooks/useS3ConfigSwitch.js +37 -0
- package/dist/hooks/useSupportedNotificationEvents.d.ts +6 -0
- package/dist/hooks/useSupportedNotificationEvents.js +8 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +2 -2
- package/dist/schemas/bucketPolicySchema.json +3 -13
- package/dist/test/msw/handlers/deleteBucket.d.ts +1 -1
- package/dist/test/msw/handlers/deleteBucket.js +20 -10
- package/dist/test/msw/handlers/getBucketAcl.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketAcl.js +29 -17
- package/dist/test/msw/handlers/getBucketLocation.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketLocation.js +29 -15
- package/dist/test/msw/handlers/getBucketPolicy.d.ts +1 -1
- package/dist/test/msw/handlers/getBucketPolicy.js +52 -32
- package/dist/test/msw/handlers/headObject.d.ts +1 -1
- package/dist/test/msw/handlers/headObject.js +31 -13
- package/dist/test/msw/handlers/listBuckets.d.ts +1 -1
- package/dist/test/msw/handlers/listBuckets.js +5 -3
- package/dist/test/msw/handlers/listObjectVersions.d.ts +1 -1
- package/dist/test/msw/handlers/listObjectVersions.js +38 -26
- package/dist/test/msw/handlers/listObjects.d.ts +1 -1
- package/dist/test/msw/handlers/listObjects.js +35 -23
- package/dist/test/msw/handlers/objectLegalHold.d.ts +1 -1
- package/dist/test/msw/handlers/objectLegalHold.js +32 -17
- package/dist/test/msw/handlers/objectRetention.d.ts +1 -1
- package/dist/test/msw/handlers/objectRetention.js +31 -17
- package/dist/test/msw/handlers/putBucketAcl.d.ts +1 -1
- package/dist/test/msw/handlers/putBucketAcl.js +29 -14
- package/dist/test/msw/handlers/putObject.d.ts +1 -1
- package/dist/test/msw/handlers/putObject.js +27 -12
- package/dist/test/msw/handlers.d.ts +3 -3
- package/dist/test/msw/handlers.js +77 -54
- package/dist/test/msw/index.d.ts +2 -2
- package/dist/test/msw/index.js +1 -1
- package/dist/test/msw/server.d.ts +1 -1
- package/dist/test/msw/server.js +1 -1
- package/dist/test/msw/utils.js +2 -2
- package/dist/test/setup.d.ts +1 -1
- package/dist/test/setup.js +13 -30
- package/dist/test/testUtils.d.ts +85 -33
- package/dist/test/testUtils.js +176 -111
- package/dist/test/utils/errorHandling.test.js +119 -119
- package/dist/types/index.d.ts +50 -37
- package/dist/types/monaco.d.ts +13 -0
- package/dist/types/monaco.js +0 -0
- package/dist/utils/__tests__/proxyMiddleware.test.d.ts +1 -0
- package/dist/utils/__tests__/proxyMiddleware.test.js +579 -0
- package/dist/utils/__tests__/s3Client.test.d.ts +1 -0
- package/dist/utils/__tests__/s3Client.test.js +340 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.d.ts +1 -0
- package/dist/utils/__tests__/s3ConfigIdentifier.test.js +437 -0
- package/dist/utils/constants.d.ts +10 -0
- package/dist/utils/constants.js +19 -9
- package/dist/utils/deletion/index.d.ts +2 -2
- package/dist/utils/deletion/index.js +1 -1
- package/dist/utils/deletion/messages.d.ts +1 -1
- package/dist/utils/deletion/messages.js +4 -4
- package/dist/utils/errorHandling.d.ts +3 -3
- package/dist/utils/errorHandling.js +6 -6
- package/dist/utils/hooks.js +8 -8
- package/dist/utils/index.d.ts +5 -4
- package/dist/utils/index.js +4 -2
- package/dist/utils/proxyMiddleware.d.ts +32 -13
- package/dist/utils/proxyMiddleware.js +90 -36
- package/dist/utils/s3Client.d.ts +14 -4
- package/dist/utils/s3Client.js +5 -26
- package/dist/utils/s3ConfigIdentifier.d.ts +79 -0
- package/dist/utils/s3ConfigIdentifier.js +57 -0
- package/dist/utils/s3RuleUtils.d.ts +5 -5
- package/dist/utils/s3RuleUtils.js +17 -17
- package/package.json +10 -8
- package/dist/components/__tests__/BucketNotificationCreatePage.test.js +0 -316
- package/dist/components/buckets/BucketPolicyButton.d.ts +0 -7
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.d.ts +0 -1
- package/dist/components/buckets/notifications/BucketNotificationCreatePage.js +0 -234
- package/dist/hooks/useLoginMutation.d.ts +0 -21
- package/dist/hooks/useLoginMutation.js +0 -9
- package/dist/utils/useFeatures.d.ts +0 -1
- package/dist/utils/useFeatures.js +0 -7
- /package/dist/components/__tests__/{BucketNotificationCreatePage.test.d.ts → BucketAccessor.test.d.ts} +0 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { HttpResponse, http } from "msw";
|
|
2
|
+
import { setupServer } from "msw/node";
|
|
3
|
+
import { loadRuntimeConfig, s3RuntimeConfigSchema } from "../factory.js";
|
|
4
|
+
const server = setupServer();
|
|
5
|
+
const CONFIG_URL = 'http://localhost/config.json';
|
|
6
|
+
describe('loadRuntimeConfig', ()=>{
|
|
7
|
+
beforeAll(()=>server.listen({
|
|
8
|
+
onUnhandledRequest: 'error'
|
|
9
|
+
}));
|
|
10
|
+
afterEach(()=>server.resetHandlers());
|
|
11
|
+
afterAll(()=>server.close());
|
|
12
|
+
describe('Successful configuration loading', ()=>{
|
|
13
|
+
it('should load and return valid runtime configuration', async ()=>{
|
|
14
|
+
const mockConfig = {
|
|
15
|
+
s3: {
|
|
16
|
+
endpoint: 'https://s3.us-west-2.amazonaws.com',
|
|
17
|
+
region: 'us-west-2',
|
|
18
|
+
forcePathStyle: true
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(mockConfig)));
|
|
22
|
+
const config = await loadRuntimeConfig(CONFIG_URL);
|
|
23
|
+
expect(config).toEqual(mockConfig);
|
|
24
|
+
expect(config.s3.endpoint).toBe('https://s3.us-west-2.amazonaws.com');
|
|
25
|
+
expect(config.s3.region).toBe('us-west-2');
|
|
26
|
+
expect(config.s3.forcePathStyle).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
it('should support generic type for extended configuration', async ()=>{
|
|
29
|
+
const mockConfig = {
|
|
30
|
+
s3: {
|
|
31
|
+
endpoint: 'https://s3.amazonaws.com',
|
|
32
|
+
region: 'us-east-1'
|
|
33
|
+
},
|
|
34
|
+
basePath: '/app',
|
|
35
|
+
theme: 'dark',
|
|
36
|
+
customSettings: {
|
|
37
|
+
feature1: true,
|
|
38
|
+
feature2: 42
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(mockConfig)));
|
|
42
|
+
const config = await loadRuntimeConfig(CONFIG_URL);
|
|
43
|
+
expect(config.basePath).toBe('/app');
|
|
44
|
+
expect(config.theme).toBe('dark');
|
|
45
|
+
expect(config.customSettings).toEqual({
|
|
46
|
+
feature1: true,
|
|
47
|
+
feature2: 42
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
it('should replace "origin" endpoint with window.location.origin', async ()=>{
|
|
51
|
+
const mockConfig = {
|
|
52
|
+
s3: {
|
|
53
|
+
endpoint: 'origin',
|
|
54
|
+
region: 'us-east-1'
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(mockConfig)));
|
|
58
|
+
const config = await loadRuntimeConfig(CONFIG_URL);
|
|
59
|
+
expect(config.s3.endpoint).not.toBe('origin');
|
|
60
|
+
expect(config.s3.endpoint).toBe(window.location.origin);
|
|
61
|
+
expect(config.s3.endpoint).toMatch(/^http/);
|
|
62
|
+
});
|
|
63
|
+
it('should handle configuration without optional forcePathStyle', async ()=>{
|
|
64
|
+
const mockConfig = {
|
|
65
|
+
s3: {
|
|
66
|
+
endpoint: 'https://s3.ap-northeast-1.amazonaws.com',
|
|
67
|
+
region: 'ap-northeast-1'
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(mockConfig)));
|
|
71
|
+
const config = await loadRuntimeConfig(CONFIG_URL);
|
|
72
|
+
expect(config.s3.forcePathStyle).toBeUndefined();
|
|
73
|
+
expect(config.s3.endpoint).toBe('https://s3.ap-northeast-1.amazonaws.com');
|
|
74
|
+
});
|
|
75
|
+
it('should handle configuration without endpoint', async ()=>{
|
|
76
|
+
const mockConfig = {
|
|
77
|
+
s3: {
|
|
78
|
+
region: 'us-east-1'
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(mockConfig)));
|
|
82
|
+
const config = await loadRuntimeConfig(CONFIG_URL);
|
|
83
|
+
expect(config.s3.endpoint).toBeUndefined();
|
|
84
|
+
expect(config.s3.region).toBe('us-east-1');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe('HTTP errors', ()=>{
|
|
88
|
+
it("should throw descriptive error when fetch returns 404", async ()=>{
|
|
89
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(null, {
|
|
90
|
+
status: 404
|
|
91
|
+
})));
|
|
92
|
+
await expect(loadRuntimeConfig(CONFIG_URL)).rejects.toThrow('Failed to load config: Not Found');
|
|
93
|
+
});
|
|
94
|
+
it("should throw descriptive error when fetch returns 500", async ()=>{
|
|
95
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(null, {
|
|
96
|
+
status: 500
|
|
97
|
+
})));
|
|
98
|
+
await expect(loadRuntimeConfig(CONFIG_URL)).rejects.toThrow('Failed to load config: Internal Server Error');
|
|
99
|
+
});
|
|
100
|
+
it('should throw error when fetch returns 403', async ()=>{
|
|
101
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(null, {
|
|
102
|
+
status: 403
|
|
103
|
+
})));
|
|
104
|
+
await expect(loadRuntimeConfig(CONFIG_URL)).rejects.toThrow('Failed to load config: Forbidden');
|
|
105
|
+
});
|
|
106
|
+
it('should throw error when response is network error', async ()=>{
|
|
107
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.error()));
|
|
108
|
+
await expect(loadRuntimeConfig(CONFIG_URL)).rejects.toThrow();
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('Validation errors', ()=>{
|
|
112
|
+
it('should reject config missing required s3.region field', async ()=>{
|
|
113
|
+
const invalidConfig = {
|
|
114
|
+
s3: {
|
|
115
|
+
endpoint: 'https://s3.amazonaws.com'
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(invalidConfig)));
|
|
119
|
+
const error = await loadRuntimeConfig(CONFIG_URL).catch((e)=>e);
|
|
120
|
+
expect(error).toBeInstanceOf(Error);
|
|
121
|
+
expect(error.message).toContain('Invalid config');
|
|
122
|
+
expect(error.message).toContain('region');
|
|
123
|
+
});
|
|
124
|
+
it('should reject config completely missing s3 section', async ()=>{
|
|
125
|
+
const invalidConfig = {
|
|
126
|
+
someOtherField: 'value',
|
|
127
|
+
anotherField: 123
|
|
128
|
+
};
|
|
129
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(invalidConfig)));
|
|
130
|
+
const error = await loadRuntimeConfig(CONFIG_URL).catch((e)=>e);
|
|
131
|
+
expect(error).toBeInstanceOf(Error);
|
|
132
|
+
expect(error.message).toContain('Invalid config');
|
|
133
|
+
expect(error.message).toContain('s3');
|
|
134
|
+
});
|
|
135
|
+
it('should reject config with invalid region type', async ()=>{
|
|
136
|
+
const invalidConfig = {
|
|
137
|
+
s3: {
|
|
138
|
+
endpoint: 'https://s3.amazonaws.com',
|
|
139
|
+
region: 123
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(invalidConfig)));
|
|
143
|
+
const error = await loadRuntimeConfig(CONFIG_URL).catch((e)=>e);
|
|
144
|
+
expect(error).toBeInstanceOf(Error);
|
|
145
|
+
expect(error.message).toContain('Invalid config');
|
|
146
|
+
});
|
|
147
|
+
it('should reject config with invalid forcePathStyle type', async ()=>{
|
|
148
|
+
const invalidConfig = {
|
|
149
|
+
s3: {
|
|
150
|
+
endpoint: 'https://s3.amazonaws.com',
|
|
151
|
+
region: 'us-east-1',
|
|
152
|
+
forcePathStyle: 'yes'
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(invalidConfig)));
|
|
156
|
+
const error = await loadRuntimeConfig(CONFIG_URL).catch((e)=>e);
|
|
157
|
+
expect(error).toBeInstanceOf(Error);
|
|
158
|
+
expect(error.message).toContain('Invalid config');
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('Edge cases', ()=>{
|
|
162
|
+
it('should handle empty s3 object with only region', async ()=>{
|
|
163
|
+
const mockConfig = {
|
|
164
|
+
s3: {
|
|
165
|
+
region: 'eu-west-1'
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(mockConfig)));
|
|
169
|
+
const config = await loadRuntimeConfig(CONFIG_URL);
|
|
170
|
+
expect(config.s3.region).toBe('eu-west-1');
|
|
171
|
+
expect(config.s3.endpoint).toBeUndefined();
|
|
172
|
+
expect(config.s3.forcePathStyle).toBeUndefined();
|
|
173
|
+
});
|
|
174
|
+
it('should preserve all unknown fields for extended configs', async ()=>{
|
|
175
|
+
const mockConfig = {
|
|
176
|
+
s3: {
|
|
177
|
+
region: 'us-east-1'
|
|
178
|
+
},
|
|
179
|
+
customField1: 'value1',
|
|
180
|
+
customField2: 42,
|
|
181
|
+
nested: {
|
|
182
|
+
field: true
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(mockConfig)));
|
|
186
|
+
const config = await loadRuntimeConfig(CONFIG_URL);
|
|
187
|
+
expect(config.customField1).toBe('value1');
|
|
188
|
+
expect(config.customField2).toBe(42);
|
|
189
|
+
expect(config.nested).toEqual({
|
|
190
|
+
field: true
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
it('should not modify original endpoint when not "origin"', async ()=>{
|
|
194
|
+
const originalEndpoint = 'https://custom-s3.example.com:9000';
|
|
195
|
+
const mockConfig = {
|
|
196
|
+
s3: {
|
|
197
|
+
endpoint: originalEndpoint,
|
|
198
|
+
region: 'us-east-1'
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
server.use(http.get(CONFIG_URL, ()=>HttpResponse.json(mockConfig)));
|
|
202
|
+
const config = await loadRuntimeConfig(CONFIG_URL);
|
|
203
|
+
expect(config.s3.endpoint).toBe(originalEndpoint);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('s3RuntimeConfigSchema', ()=>{
|
|
208
|
+
describe('Valid configurations', ()=>{
|
|
209
|
+
it('should validate complete configuration with all fields', ()=>{
|
|
210
|
+
const config = {
|
|
211
|
+
s3: {
|
|
212
|
+
endpoint: 'https://s3.amazonaws.com',
|
|
213
|
+
region: 'us-east-1',
|
|
214
|
+
forcePathStyle: true
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
const { error } = s3RuntimeConfigSchema.validate(config);
|
|
218
|
+
expect(error).toBeUndefined();
|
|
219
|
+
});
|
|
220
|
+
it('should validate minimal configuration with only required fields', ()=>{
|
|
221
|
+
const config = {
|
|
222
|
+
s3: {
|
|
223
|
+
region: 'eu-west-1'
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const { error } = s3RuntimeConfigSchema.validate(config);
|
|
227
|
+
expect(error).toBeUndefined();
|
|
228
|
+
});
|
|
229
|
+
it('should allow unknown fields when allowUnknown is true', ()=>{
|
|
230
|
+
const config = {
|
|
231
|
+
s3: {
|
|
232
|
+
endpoint: 'https://s3.amazonaws.com',
|
|
233
|
+
region: 'us-east-1'
|
|
234
|
+
},
|
|
235
|
+
customField: 'value',
|
|
236
|
+
anotherField: 123
|
|
237
|
+
};
|
|
238
|
+
const { error } = s3RuntimeConfigSchema.validate(config, {
|
|
239
|
+
allowUnknown: true
|
|
240
|
+
});
|
|
241
|
+
expect(error).toBeUndefined();
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
describe('Invalid configurations', ()=>{
|
|
245
|
+
it('should reject config without s3.region', ()=>{
|
|
246
|
+
const config = {
|
|
247
|
+
s3: {
|
|
248
|
+
endpoint: 'https://s3.amazonaws.com'
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
const { error } = s3RuntimeConfigSchema.validate(config);
|
|
252
|
+
expect(error).toBeDefined();
|
|
253
|
+
expect(error?.details[0].path).toContain('region');
|
|
254
|
+
expect(error?.message).toContain('region');
|
|
255
|
+
});
|
|
256
|
+
it('should reject config without s3 object', ()=>{
|
|
257
|
+
const config = {};
|
|
258
|
+
const { error } = s3RuntimeConfigSchema.validate(config);
|
|
259
|
+
expect(error).toBeDefined();
|
|
260
|
+
expect(error?.details[0].path).toContain('s3');
|
|
261
|
+
});
|
|
262
|
+
it('should reject config with wrong type for region', ()=>{
|
|
263
|
+
const config = {
|
|
264
|
+
s3: {
|
|
265
|
+
region: 123
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
const { error } = s3RuntimeConfigSchema.validate(config);
|
|
269
|
+
expect(error).toBeDefined();
|
|
270
|
+
expect(error?.message).toContain('string');
|
|
271
|
+
});
|
|
272
|
+
it('should reject config with wrong type for forcePathStyle', ()=>{
|
|
273
|
+
const config = {
|
|
274
|
+
s3: {
|
|
275
|
+
region: 'us-east-1',
|
|
276
|
+
forcePathStyle: 'not-a-boolean'
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const { error } = s3RuntimeConfigSchema.validate(config, {
|
|
280
|
+
convert: false
|
|
281
|
+
});
|
|
282
|
+
expect(error).toBeDefined();
|
|
283
|
+
expect(error?.message).toContain('boolean');
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe('Schema behavior', ()=>{
|
|
287
|
+
it('should return all validation errors when abortEarly is false', ()=>{
|
|
288
|
+
const config = {
|
|
289
|
+
s3: {}
|
|
290
|
+
};
|
|
291
|
+
const { error } = s3RuntimeConfigSchema.validate(config, {
|
|
292
|
+
abortEarly: false
|
|
293
|
+
});
|
|
294
|
+
expect(error).toBeDefined();
|
|
295
|
+
expect(error?.details.length).toBeGreaterThanOrEqual(1);
|
|
296
|
+
});
|
|
297
|
+
it('should preserve unknown fields when stripUnknown is false', ()=>{
|
|
298
|
+
const config = {
|
|
299
|
+
s3: {
|
|
300
|
+
region: 'us-east-1'
|
|
301
|
+
},
|
|
302
|
+
customField: 'should-be-kept'
|
|
303
|
+
};
|
|
304
|
+
const { value } = s3RuntimeConfigSchema.validate(config, {
|
|
305
|
+
allowUnknown: true,
|
|
306
|
+
stripUnknown: false
|
|
307
|
+
});
|
|
308
|
+
expect(value.customField).toBe('should-be-kept');
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
});
|
package/dist/config/factory.d.ts
CHANGED
|
@@ -1,63 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import { CoreUIThemeName } from "@scality/core-ui/dist/style/theme";
|
|
4
|
-
interface RuntimeConfig {
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
export type S3RuntimeConfig = {
|
|
5
3
|
s3: {
|
|
6
4
|
endpoint?: string;
|
|
7
5
|
region: string;
|
|
8
6
|
forcePathStyle?: boolean;
|
|
9
7
|
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Configuration factory that uses build-time constants
|
|
15
|
-
* No runtime environment detection or hardcoded values
|
|
16
|
-
*/
|
|
17
|
-
export declare class S3ConfigurationFactory {
|
|
18
|
-
/**
|
|
19
|
-
* Load runtime configuration from config.json
|
|
20
|
-
* Should be called at app startup
|
|
21
|
-
*/
|
|
22
|
-
static loadRuntimeConfig(configUrl: string): Promise<RuntimeConfig | null>;
|
|
23
|
-
private static getBuildTimeConfig;
|
|
24
|
-
/**
|
|
25
|
-
* Create S3 client configuration based on build-time settings
|
|
26
|
-
*/
|
|
27
|
-
static createClientConfiguration(credentials: S3Credentials): S3BrowserConfig & {
|
|
28
|
-
credentials: S3Credentials;
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* Create proxy middleware configuration
|
|
32
|
-
*/
|
|
33
|
-
static createProxyConfiguration(): S3ClientConfiguration;
|
|
34
|
-
/**
|
|
35
|
-
* Check if proxy middleware should be enabled
|
|
36
|
-
*/
|
|
37
|
-
static shouldUseProxyMiddleware(): boolean;
|
|
38
|
-
/**
|
|
39
|
-
* Get build-time environment info for debugging
|
|
40
|
-
*/
|
|
41
|
-
static getBuildInfo(): {
|
|
42
|
-
environment: string;
|
|
43
|
-
useProxy: boolean;
|
|
44
|
-
s3Endpoint: string;
|
|
45
|
-
proxyEndpoint: string | undefined;
|
|
46
|
-
};
|
|
47
|
-
}
|
|
8
|
+
};
|
|
9
|
+
export declare const s3RuntimeConfigSchema: Joi.ObjectSchema<any>;
|
|
48
10
|
/**
|
|
49
|
-
*
|
|
11
|
+
* Load runtime configuration from config.json
|
|
12
|
+
*
|
|
13
|
+
* @template T - Extended runtime config type that must include S3RuntimeConfig
|
|
14
|
+
* @param configUrl - URL to fetch the config.json from
|
|
15
|
+
* @returns Promise resolving to the loaded config
|
|
50
16
|
*/
|
|
51
|
-
export declare
|
|
52
|
-
credentials: S3Credentials;
|
|
53
|
-
};
|
|
54
|
-
export declare const shouldUseProxy: () => boolean;
|
|
55
|
-
export declare const getProxyConfig: () => S3ClientConfiguration;
|
|
56
|
-
export declare const getBuildInfo: () => {
|
|
57
|
-
environment: string;
|
|
58
|
-
useProxy: boolean;
|
|
59
|
-
s3Endpoint: string;
|
|
60
|
-
proxyEndpoint: string | undefined;
|
|
61
|
-
};
|
|
62
|
-
export declare const loadRuntimeConfig: (configUrl: string) => Promise<RuntimeConfig | null>;
|
|
63
|
-
export {};
|
|
17
|
+
export declare function loadRuntimeConfig<T extends S3RuntimeConfig = S3RuntimeConfig>(configUrl: string): Promise<T>;
|
package/dist/config/factory.js
CHANGED
|
@@ -1,73 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
s3: __S3_CONFIG__,
|
|
21
|
-
dev: __DEV_CONFIG__,
|
|
22
|
-
isDevelopment: __IS_DEVELOPMENT__,
|
|
23
|
-
isProduction: __IS_PRODUCTION__
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
static createClientConfiguration(credentials) {
|
|
27
|
-
const buildConfig = this.getBuildTimeConfig();
|
|
28
|
-
const s3Config = buildConfig.isProduction && runtimeConfig?.s3 ? runtimeConfig.s3 : buildConfig.s3;
|
|
29
|
-
const baseConfig = {
|
|
30
|
-
credentials,
|
|
31
|
-
region: s3Config.region,
|
|
32
|
-
forcePathStyle: s3Config.forcePathStyle ?? true,
|
|
33
|
-
endpoint: s3Config.endpoint
|
|
34
|
-
};
|
|
35
|
-
if (buildConfig.isDevelopment && buildConfig.dev.useProxy && buildConfig.dev.proxyEndpoint) baseConfig.endpoint = buildConfig.dev.proxyEndpoint;
|
|
36
|
-
return baseConfig;
|
|
37
|
-
}
|
|
38
|
-
static createProxyConfiguration() {
|
|
39
|
-
const buildConfig = this.getBuildTimeConfig();
|
|
40
|
-
const config = {
|
|
41
|
-
endpoint: buildConfig.s3.endpoint,
|
|
42
|
-
region: buildConfig.s3.region,
|
|
43
|
-
forcePathStyle: buildConfig.s3.forcePathStyle,
|
|
44
|
-
useProxy: buildConfig.isDevelopment && buildConfig.dev.useProxy
|
|
45
|
-
};
|
|
46
|
-
if (config.useProxy) config.proxyConfig = {
|
|
47
|
-
realHost: buildConfig.s3.realHost,
|
|
48
|
-
proxyBasePath: buildConfig.dev.proxyBasePath,
|
|
49
|
-
proxyHost: buildConfig.dev.proxyHost,
|
|
50
|
-
proxyPort: buildConfig.dev.proxyPort
|
|
51
|
-
};
|
|
52
|
-
return config;
|
|
53
|
-
}
|
|
54
|
-
static shouldUseProxyMiddleware() {
|
|
55
|
-
const buildConfig = this.getBuildTimeConfig();
|
|
56
|
-
return buildConfig.isDevelopment && buildConfig.dev.useProxy;
|
|
57
|
-
}
|
|
58
|
-
static getBuildInfo() {
|
|
59
|
-
const buildConfig = this.getBuildTimeConfig();
|
|
60
|
-
return {
|
|
61
|
-
environment: buildConfig.isDevelopment ? "development" : "production",
|
|
62
|
-
useProxy: buildConfig.dev.useProxy,
|
|
63
|
-
s3Endpoint: buildConfig.s3.endpoint,
|
|
64
|
-
proxyEndpoint: buildConfig.dev.proxyEndpoint
|
|
65
|
-
};
|
|
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}`);
|
|
66
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;
|
|
67
24
|
}
|
|
68
|
-
|
|
69
|
-
const shouldUseProxy = ()=>S3ConfigurationFactory.shouldUseProxyMiddleware();
|
|
70
|
-
const getProxyConfig = ()=>S3ConfigurationFactory.createProxyConfiguration();
|
|
71
|
-
const getBuildInfo = ()=>S3ConfigurationFactory.getBuildInfo();
|
|
72
|
-
const loadRuntimeConfig = (configUrl)=>S3ConfigurationFactory.loadRuntimeConfig(configUrl);
|
|
73
|
-
export { S3ConfigurationFactory, createS3Config, getBuildInfo, getProxyConfig, loadRuntimeConfig, shouldUseProxy };
|
|
25
|
+
export { loadRuntimeConfig, s3RuntimeConfigSchema };
|