diff --git a/src/axios-api-versioning-interceptor.ts b/src/axios-api-versioning-interceptor.ts index d85d678..6bba650 100644 --- a/src/axios-api-versioning-interceptor.ts +++ b/src/axios-api-versioning-interceptor.ts @@ -1,50 +1,50 @@ import { AxiosRequestConfig } from 'axios'; -import { AxiosWithVersioning, VersioningStrategy } from './types' +import { AxiosWithVersioning, VersioningStrategy, IVersioningConfig } from './types' function replaceUrlPathWithVersion(url: string, apiVersion: string) { // the template name of the api version must be "apiVersion" return url.replace('{apiVersion}', apiVersion); } -function enhanceConfigByVersioningStrategy(instance: AxiosWithVersioning, config: AxiosRequestConfig): AxiosRequestConfig { - if (instance.defaults.hasOwnProperty('apiVersion') === false && config['apiVersion'] === undefined) { - return config; +function enhanceConfigByVersioningStrategy(instance: AxiosWithVersioning, requestConfig: AxiosRequestConfig, versioningConfig: IVersioningConfig): AxiosRequestConfig { + if (instance.defaults.hasOwnProperty('apiVersion') === false && requestConfig['apiVersion'] === undefined) { + return requestConfig; } // we prioritize the apiVersion passed via the RequestConfig first // then use the global default apiVersion last - const apiVersion = config['apiVersion'] || instance.defaults['apiVersion']; + const apiVersion = requestConfig['apiVersion'] || instance.defaults['apiVersion']; // same way here, we prioritize the RequestConfig first then the global defaults - const versioningStrategy = config['versioningStrategy'] || instance.defaults['versioningStrategy']; + const versioningStrategy = requestConfig['versioningStrategy'] || instance.defaults['versioningStrategy']; if (versioningStrategy === VersioningStrategy.QueryString) { - config.params = { - ...config.params, - 'api-version': apiVersion + requestConfig.params = { + ...requestConfig.params, + [versioningConfig.queryStringKeyName]: apiVersion }; } if (versioningStrategy === VersioningStrategy.MediaType) { - const defaultAcceptHeader = config.headers.common["Accept"] || ''; + const defaultAcceptHeader = requestConfig.headers.common["Accept"] || ''; - config.headers = { - ...config.headers, - ["Accept"]: defaultAcceptHeader + `;v=${apiVersion}` + requestConfig.headers = { + ...requestConfig.headers, + ["Accept"]: defaultAcceptHeader + `;${versioningConfig.mediaTypeKeyName}=${apiVersion}` } } if (versioningStrategy === VersioningStrategy.UrlPath) { - config.url = replaceUrlPathWithVersion(config.url!, apiVersion); + requestConfig.url = replaceUrlPathWithVersion(requestConfig.url!, apiVersion); } - return config; + return requestConfig; } -export function injectApiVersioningInterceptor(instance: AxiosWithVersioning) { +export function injectApiVersioningInterceptor(instance: AxiosWithVersioning, versioningConfig: IVersioningConfig) { // add an interceptor - instance.interceptors.request.use(config => { - const enhancedConfig = enhanceConfigByVersioningStrategy(instance, config); + instance.interceptors.request.use((requestConfig) => { + const enhancedConfig = enhanceConfigByVersioningStrategy(instance, requestConfig, versioningConfig); return enhancedConfig; }); } diff --git a/src/axios-api-versioning.ts b/src/axios-api-versioning.ts index 60f219c..9eeb8ca 100644 --- a/src/axios-api-versioning.ts +++ b/src/axios-api-versioning.ts @@ -1,19 +1,22 @@ import axios, { AxiosInstance, AxiosStatic } from 'axios'; -import { AxiosWithVersioning, IWithVersioningConfig } from './types' +import { AxiosWithVersioning, IWithVersioningConfig, IVersioningConfig } from './types' import { injectApiVersioningInterceptor } from './axios-api-versioning-interceptor' import { defaultWithVersioningConfig } from './defaultConfig'; -export function withVersioning(instance: AxiosInstance | AxiosStatic, config: IWithVersioningConfig = defaultWithVersioningConfig) { +export function withVersioning(instance: AxiosInstance | AxiosStatic, config?: IWithVersioningConfig) { + // merge default config options + const versioningConfig: IWithVersioningConfig = { ...defaultWithVersioningConfig, ...config }; + // deep clone the instance so we don't affect it in any way let clonedInstance = axios.create(instance.defaults); // set up for modifying the instance.defaults object let value: any = { - versioningStrategy: config.versioningStrategy + versioningStrategy: versioningConfig.versioningStrategy }; - if (config.apiVersion) { - value['apiVersion'] = config.apiVersion; + if (versioningConfig.apiVersion) { + value['apiVersion'] = versioningConfig.apiVersion; } value = { @@ -28,7 +31,7 @@ export function withVersioning(instance: AxiosInstance | AxiosStatic, config: IW }) // add required api versioning interceptor - injectApiVersioningInterceptor(clonedInstance as AxiosWithVersioning); + injectApiVersioningInterceptor(clonedInstance as AxiosWithVersioning, versioningConfig as IVersioningConfig); return clonedInstance as AxiosWithVersioning; } \ No newline at end of file