Skip to content

Commit

Permalink
feat: allow for setting custom key names on QueryString and MediaType
Browse files Browse the repository at this point in the history
  • Loading branch information
Weffe committed Feb 26, 2019
1 parent 023999c commit dc3892f
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 24 deletions.
36 changes: 18 additions & 18 deletions src/axios-api-versioning-interceptor.ts
Original file line number Diff line number Diff line change
@@ -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;
});
}
15 changes: 9 additions & 6 deletions src/axios-api-versioning.ts
Original file line number Diff line number Diff line change
@@ -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 = {
Expand All @@ -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;
}

0 comments on commit dc3892f

Please sign in to comment.