Skip to content

Commit 3788dfb

Browse files
author
Weffe
committed
feat: remove flexibilty of configuring versioning in axios.defaults
BREAKING CHANGE: withVersioning config is now required
1 parent 648b9fb commit 3788dfb

File tree

3 files changed

+21
-43
lines changed

3 files changed

+21
-43
lines changed

src/axios-api-versioning-interceptor.ts

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
1-
import { AxiosRequestConfig } from 'axios';
2-
import { AxiosWithVersioning, VersioningStrategy, IVersioningConfig } from './types'
1+
import { AxiosInstance } from 'axios';
2+
import { VersioningStrategy, IVersioningConfig, } from './types'
3+
import { AxiosRequestConfigWithVersioning } from './axios.types';
34

45
function replaceUrlPathWithVersion(url: string, apiVersion: string) {
56
// the template name of the api version must be "apiVersion"
67
return url.replace('{apiVersion}', apiVersion);
78
}
89

9-
function enhanceConfigByVersioningStrategy(instance: AxiosWithVersioning, requestConfig: AxiosRequestConfig, versioningConfig: IVersioningConfig): AxiosRequestConfig {
10-
if (instance.defaults.hasOwnProperty('apiVersion') === false && requestConfig['apiVersion'] === undefined) {
11-
return requestConfig;
12-
}
10+
function enhanceConfigByVersioningStrategy(requestConfig: AxiosRequestConfigWithVersioning, versioningConfig: IVersioningConfig): AxiosRequestConfigWithVersioning {
1311

1412
// we prioritize the apiVersion passed via the RequestConfig first
15-
// then use the global default apiVersion last
16-
const apiVersion = requestConfig['apiVersion'] || instance.defaults['apiVersion'];
13+
// then use the initial versioningConfig last
14+
const apiVersion = requestConfig['apiVersion'] || versioningConfig['apiVersion'];
1715

18-
// same way here, we prioritize the RequestConfig first then the global defaults
19-
const versioningStrategy = requestConfig['versioningStrategy'] || instance.defaults['versioningStrategy'];
16+
// same way here, we prioritize the RequestConfig first then the initial defaults
17+
const versioningStrategy = requestConfig['versioningStrategy'] || versioningConfig['versioningStrategy'];
2018

2119
if (versioningStrategy === VersioningStrategy.QueryString) {
2220
requestConfig.params = {
@@ -60,10 +58,10 @@ function enhanceConfigByVersioningStrategy(instance: AxiosWithVersioning, reques
6058
return requestConfig;
6159
}
6260

63-
export function injectApiVersioningInterceptor(instance: AxiosWithVersioning, versioningConfig: IVersioningConfig) {
61+
export function injectApiVersioningInterceptor(instance: AxiosInstance, versioningConfig: IVersioningConfig) {
6462
// add an interceptor
65-
instance.interceptors.request.use((requestConfig) => {
66-
const enhancedConfig = enhanceConfigByVersioningStrategy(instance, requestConfig, versioningConfig);
63+
instance.interceptors.request.use((requestConfig: AxiosRequestConfigWithVersioning) => {
64+
const enhancedConfig = enhanceConfigByVersioningStrategy(requestConfig, versioningConfig);
6765
return enhancedConfig;
6866
});
6967
}

src/axios-api-versioning.ts

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,18 @@
11
import axios, { AxiosInstance, AxiosStatic } from 'axios';
2-
import { AxiosWithVersioning, IWithVersioningConfig, IVersioningConfig } from './types'
2+
import { AxiosInstanceWithVersioning } from './axios.types';
3+
import { IWithVersioningConfig, IVersioningConfig } from './types'
34
import { injectApiVersioningInterceptor } from './axios-api-versioning-interceptor'
45
import { defaultWithVersioningConfig } from './defaultConfig';
56

6-
export function withVersioning(instance: AxiosInstance | AxiosStatic, config?: IWithVersioningConfig) {
7+
export function withVersioning(instance: AxiosInstance | AxiosStatic, config: IWithVersioningConfig) {
78
// merge default config options
8-
const versioningConfig: IWithVersioningConfig = { ...defaultWithVersioningConfig, ...config };
9+
const versioningConfig: IVersioningConfig = { ...defaultWithVersioningConfig, ...config };
910

10-
// deep clone the instance so we don't affect it in any way
11-
let clonedInstance = axios.create(instance.defaults);
12-
13-
// set up for modifying the instance.defaults object
14-
let value: any = {
15-
versioningStrategy: versioningConfig.versioningStrategy
16-
};
17-
18-
if (versioningConfig.apiVersion) {
19-
value['apiVersion'] = versioningConfig.apiVersion;
20-
}
21-
22-
value = {
23-
...clonedInstance.defaults,
24-
...value
25-
}
26-
27-
// set defaults property to new defaults w/ apiVersion and versioningStrategy
28-
Object.defineProperty(clonedInstance, 'defaults', {
29-
value,
30-
configurable: true,
31-
})
11+
// clone the instance so we don't affect it in any way
12+
let clonedInstance: AxiosInstance = axios.create(instance.defaults);
3213

3314
// add required api versioning interceptor
34-
injectApiVersioningInterceptor(clonedInstance as AxiosWithVersioning, versioningConfig as IVersioningConfig);
15+
injectApiVersioningInterceptor(clonedInstance, versioningConfig);
3516

36-
return clonedInstance as AxiosWithVersioning;
17+
return clonedInstance as AxiosInstanceWithVersioning;
3718
}

src/defaultConfig.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { IWithVersioningConfig, VersioningStrategy } from './types';
1+
import { IVersioningConfig, PickPartial } from './types';
22

3-
export const defaultWithVersioningConfig: IWithVersioningConfig = {
4-
versioningStrategy: VersioningStrategy.QueryString,
3+
export const defaultWithVersioningConfig: PickPartial<IVersioningConfig, "apiVersion" | "versioningStrategy"> = {
54
mediaTypeKeyName: 'v',
65
queryStringKeyName: 'api-version',
76
}

0 commit comments

Comments
 (0)