@dbs-portal/core-api
Version:
HTTP client and API utilities for DBS Portal
210 lines • 8.6 kB
JavaScript
/**
* Extended factory functions with MSW integration
*/
// import { ApiClient } from '../../client/api-client'
import { createApiClient as originalCreateApiClient, createAuthenticatedApiClient as originalCreateAuthenticatedApiClient, createDevelopmentApiClient as originalCreateDevelopmentApiClient, } from '../../client/factory';
import { createMockAwareConfig, createEnvironmentAwareConfig, initializeMockingForClient, MockAwareApiClient,
// type MockAwareApiClientConfig,
} from './api-client-integration';
const { VITE_NODE_ENV: NODE_ENV } = import.meta.env;
/**
* Create API client with MSW support
*/
export function createMockAwareApiClient(options) {
return createMockAwareApiClientSync(options);
}
/**
* Create API client with MSW support (synchronous)
*/
export function createMockAwareApiClientSync(options) {
const config = createMockAwareConfig(options);
const client = originalCreateApiClient(config);
return Promise.resolve(new MockAwareApiClient(client, config));
}
/**
* Create authenticated API client with MSW support
*/
export async function createMockAwareAuthenticatedApiClient(baseURL, getToken, options = {}) {
const mockAwareOptions = {
baseURL,
...(options.mockBaseURL && { mockBaseURL: options.mockBaseURL }),
...(options.enableMocking !== undefined && { enableMocking: options.enableMocking }),
...(options.mockConfig && { mockConfig: options.mockConfig }),
...(options.mockHandlers && { mockHandlers: options.mockHandlers }),
...(options.clientConfig && { clientConfig: options.clientConfig }),
};
const config = createMockAwareConfig(mockAwareOptions);
const client = originalCreateAuthenticatedApiClient(config.baseURL, getToken, config);
const mockAwareClient = new MockAwareApiClient(client, config);
// Initialize mocking if enabled
if (config.autoSetupMocks) {
await initializeMockingForClient(config);
}
return mockAwareClient;
}
/**
* Create environment-aware API client
*/
export async function createEnvironmentAwareApiClient(config) {
const clientConfig = createEnvironmentAwareConfig(config);
const client = originalCreateApiClient(clientConfig);
const mockAwareClient = new MockAwareApiClient(client, clientConfig);
// Initialize mocking if enabled
if (clientConfig.autoSetupMocks) {
await initializeMockingForClient(clientConfig);
}
return mockAwareClient;
}
/**
* Create development API client with MSW support
*/
export async function createMockAwareDevelopmentApiClient(baseURL, options = {}) {
const mockAwareOptions = {
baseURL,
...(options.mockBaseURL && { mockBaseURL: options.mockBaseURL }),
...(options.enableMocking !== undefined && { enableMocking: options.enableMocking }),
mockConfig: {
mode: 'development',
logging: true,
...options.mockConfig,
},
...(options.mockHandlers && { mockHandlers: options.mockHandlers }),
...(options.clientConfig && { clientConfig: options.clientConfig }),
};
const config = createMockAwareConfig(mockAwareOptions);
const client = originalCreateDevelopmentApiClient(config.baseURL, config);
const mockAwareClient = new MockAwareApiClient(client, config);
// Initialize mocking if enabled
if (config.autoSetupMocks) {
await initializeMockingForClient(config);
}
return mockAwareClient;
}
/**
* Create API client from configuration with MSW support
*/
export async function createMockAwareApiClientFromConfig(config) {
const mockAwareOptions = {
baseURL: config.baseURL,
...(config.mockBaseURL && { mockBaseURL: config.mockBaseURL }),
...(config.features?.mocking !== undefined && { enableMocking: config.features.mocking }),
...(config.mocking?.enabled !== undefined && { enableMocking: config.mocking.enabled }),
...(config.mocking?.config && { mockConfig: config.mocking.config }),
...(config.mocking?.handlers && { mockHandlers: config.mocking.handlers }),
clientConfig: {
...config.options,
// Convert features to client config
...(config.features?.cache && {
cache: {
enabled: true,
ttl: 5 * 60 * 1000,
maxSize: 100,
storage: 'memory',
}
}),
...(config.features?.retry && {
retry: {
retries: 3,
retryDelay: retryCount => Math.min(1000 * Math.pow(2, retryCount), 30000),
}
}),
...(config.features?.rateLimit && {
rateLimit: {
maxRequests: 100,
perMilliseconds: 60000,
}
}),
},
};
const clientConfig = createMockAwareConfig(mockAwareOptions);
const client = originalCreateApiClient(clientConfig);
// Add authentication if configured
if (config.auth) {
const getToken = () => {
switch (config.auth.type) {
case 'bearer':
return config.auth.token || null;
case 'basic':
if (config.auth.username && config.auth.password) {
return btoa(`${config.auth.username}:${config.auth.password}`);
}
return null;
case 'apiKey':
return config.auth.apiKey || null;
default:
return null;
}
};
// Add appropriate auth interceptor based on type
if (config.auth.type === 'bearer') {
client.addRequestInterceptor(requestConfig => {
const token = getToken();
if (token) {
requestConfig.headers = {
...requestConfig.headers,
Authorization: `Bearer ${token}`,
};
}
return requestConfig;
});
}
else if (config.auth.type === 'basic') {
client.addRequestInterceptor(requestConfig => {
const token = getToken();
if (token) {
requestConfig.headers = {
...requestConfig.headers,
Authorization: `Basic ${token}`,
};
}
return requestConfig;
});
}
else if (config.auth.type === 'apiKey') {
client.addRequestInterceptor(requestConfig => {
const apiKey = getToken();
if (apiKey) {
requestConfig.headers = {
...requestConfig.headers,
'X-API-Key': apiKey,
};
}
return requestConfig;
});
}
}
const mockAwareClient = new MockAwareApiClient(client, clientConfig);
// Initialize mocking if enabled
if (clientConfig.autoSetupMocks) {
await initializeMockingForClient(clientConfig);
}
return mockAwareClient;
}
/**
* Convenience function to create API client based on environment
*/
export async function createApiClientForEnvironment(baseURL, options = {}) {
const env = NODE_ENV || 'development';
const factoryOptions = {
baseURL,
...(options.mockBaseURL && { mockBaseURL: options.mockBaseURL }),
enableMocking: env === 'test' || env === 'development',
mockConfig: {
mode: env === 'test' ? 'testing' : 'development',
logging: env !== 'production',
},
...(options.mockHandlers && { mockHandlers: options.mockHandlers }),
...(options.clientConfig && { clientConfig: options.clientConfig }),
};
if (options.getToken) {
return createMockAwareAuthenticatedApiClient(baseURL, options.getToken, {
...(options.mockBaseURL && { mockBaseURL: options.mockBaseURL }),
...(factoryOptions.enableMocking !== undefined && { enableMocking: factoryOptions.enableMocking }),
...(factoryOptions.mockConfig && { mockConfig: factoryOptions.mockConfig }),
...(options.mockHandlers && { mockHandlers: options.mockHandlers }),
...(options.clientConfig && { clientConfig: options.clientConfig }),
});
}
return createMockAwareApiClient(factoryOptions);
}
//# sourceMappingURL=factory-extensions.js.map