UNPKG

@dbs-portal/core-api

Version:

HTTP client and API utilities for DBS Portal

210 lines 8.6 kB
/** * 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