Skip to content

Commit b7f9ed3

Browse files
author
Weffe
committed
Merge branch 'dev' into quickfix/strategy-url-path
2 parents 93d7a01 + 1e86608 commit b7f9ed3

13 files changed

+15414
-264
lines changed

package-lock.json

Lines changed: 15143 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 67 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,70 @@
11
{
2-
"name": "axios-api-versioning",
3-
"author": "Rogelio Negrete (Weffe)",
4-
"version": "2.1.0",
5-
"description": "Adds api versioning for axios",
6-
"main": "dist/index.js",
7-
"module": "dist/axios-api-versioning.js",
8-
"typings": "dist/index.d.ts",
9-
"sideEffects": false,
10-
"scripts": {
11-
"start": "tsdx watch",
12-
"build": "tsdx build",
13-
"test": "tsdx test",
14-
"sandbox": "tsc -p sandbox/tsconfig.sandbox.json",
15-
"clean": "rimraf dist/",
16-
"release": "standard-version",
17-
"docs": "docsify serve docs -o --port 2065"
18-
},
19-
"keywords": [
20-
"axios",
21-
"api versioning"
22-
],
23-
"license": "MIT",
24-
"repository": {
25-
"type": "git",
26-
"url": "https://github.com/Weffe/axios-api-versioning"
27-
},
28-
"bugs": {
29-
"url": "https://github.com/Weffe/axios-api-versioning/issues"
30-
},
31-
"homepage": "https://github.com/Weffe/axios-api-versioning",
32-
"peerDependencies": {
33-
"axios": "^0.18.0"
34-
},
35-
"devDependencies": {
36-
"@types/jest": "^24.0.15",
37-
"axios": "0.18.0",
38-
"axios-mock-adapter": "^1.16.0",
39-
"docsify-cli": "^4.3.0",
40-
"http-status-codes": "^1.3.2",
41-
"husky": "^2.4.1",
42-
"prettier": "^1.18.2",
43-
"pretty-quick": "^1.11.1",
44-
"standard-version": "^6.0.1",
45-
"tsdx": "^0.7.1",
46-
"tslib": "^1.10.0",
47-
"typescript": "^3.5.2"
48-
},
49-
"files": [
50-
"dist",
51-
"README.md",
52-
"LICENSE"
53-
],
54-
"husky": {
55-
"hooks": {
56-
"pre-commit": "pretty-quick --staged"
2+
"name": "axios-api-versioning",
3+
"author": "Rogelio Negrete (Weffe)",
4+
"version": "2.1.0",
5+
"description": "Adds api versioning for axios",
6+
"main": "dist/index.js",
7+
"module": "dist/axios-api-versioning.esm.js",
8+
"typings": "dist/index.d.ts",
9+
"sideEffects": false,
10+
"scripts": {
11+
"start": "tsdx watch",
12+
"build": "tsdx build",
13+
"test": "tsdx test",
14+
"sandbox": "tsc -p sandbox/tsconfig.sandbox.json",
15+
"prettier": "pretty-quick",
16+
"prerelease": "run-s test build",
17+
"release": "standard-version",
18+
"docs": "docsify serve docs -o --port 2065"
19+
},
20+
"keywords": [
21+
"axios",
22+
"api versioning"
23+
],
24+
"license": "MIT",
25+
"repository": {
26+
"type": "git",
27+
"url": "https://github.com/Weffe/axios-api-versioning"
28+
},
29+
"bugs": {
30+
"url": "https://github.com/Weffe/axios-api-versioning/issues"
31+
},
32+
"homepage": "https://github.com/Weffe/axios-api-versioning",
33+
"peerDependencies": {
34+
"axios": "^0.18.0"
35+
},
36+
"devDependencies": {
37+
"@types/jest": "^25.1.2",
38+
"axios": "^0.19.2",
39+
"axios-mock-adapter": "^1.17.0",
40+
"docsify-cli": "^4.3.0",
41+
"http-status-codes": "^1.3.2",
42+
"husky": "^4.2.1",
43+
"npm-run-all": "^4.1.5",
44+
"prettier": "^1.19.1",
45+
"pretty-quick": "^2.0.1",
46+
"standard-version": "^7.1.0",
47+
"ts-jest": "^25.2.0",
48+
"tsdx": "^0.12.3",
49+
"typescript": "^3.7.5"
50+
},
51+
"files": [
52+
"dist",
53+
"README.md",
54+
"LICENSE"
55+
],
56+
"husky": {
57+
"hooks": {
58+
"pre-commit": "pretty-quick --staged"
59+
}
60+
},
61+
"prettier": {
62+
"printWidth": 130,
63+
"trailingComma": "es5",
64+
"tabWidth": 4,
65+
"useTabs": false,
66+
"singleQuote": true,
67+
"arrowParens": "always",
68+
"endOfLine": "lf"
5769
}
58-
}
5970
}

src/axios-api-versioning-interceptor.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { AxiosInstance } from 'axios';
2-
import { VersioningStrategy, IVersioningConfig, } from './types'
3-
import { AxiosRequestConfigWithVersioning } from './types/axios';
2+
import { VersioningStrategy, IVersioningConfig, AxiosRequestConfigWithVersioning } from './types';
43

54
function replaceUrlPathWithVersion(url: string, apiVersion: string) {
65
// the template name of the api version must be "apiVersion"
76
return url.replace('{apiVersion}', apiVersion);
87
}
98

10-
function enhanceConfigByVersioningStrategy(requestConfig: AxiosRequestConfigWithVersioning, versioningConfig: IVersioningConfig): AxiosRequestConfigWithVersioning {
11-
9+
function enhanceConfigByVersioningStrategy(
10+
requestConfig: AxiosRequestConfigWithVersioning,
11+
versioningConfig: IVersioningConfig
12+
): AxiosRequestConfigWithVersioning {
1213
// we prioritize the apiVersion passed via the RequestConfig first
1314
// then use the initial versioningConfig last
1415
const apiVersion = requestConfig['apiVersion'] || versioningConfig['apiVersion'];
@@ -19,13 +20,13 @@ function enhanceConfigByVersioningStrategy(requestConfig: AxiosRequestConfigWith
1920
if (versioningStrategy === VersioningStrategy.QueryString) {
2021
requestConfig.params = {
2122
...requestConfig.params,
22-
[versioningConfig.queryStringKeyName]: apiVersion
23+
[versioningConfig.queryStringKeyName]: apiVersion,
2324
};
2425
}
2526

2627
if (versioningStrategy === VersioningStrategy.MediaType) {
27-
const defaultAcceptHeader: string = requestConfig.headers.common["Accept"];
28-
const reqAcceptHeader: string | undefined = requestConfig.headers["Accept"] || undefined;
28+
const defaultAcceptHeader: string = requestConfig.headers.common['Accept'];
29+
const reqAcceptHeader: string | undefined = requestConfig.headers['Accept'] || undefined;
2930

3031
// we prioritize an accept header passed in the RequestConfig but default to the
3132
// the common default accept header value axios provides
@@ -35,19 +36,18 @@ function enhanceConfigByVersioningStrategy(requestConfig: AxiosRequestConfigWith
3536
const formattedAcceptHeader = versioningConfig.mediaTypeFormatter({
3637
apiVersion,
3738
acceptHeader,
38-
mediaTypeKeyName: versioningConfig.mediaTypeKeyName
39-
})
39+
mediaTypeKeyName: versioningConfig.mediaTypeKeyName,
40+
});
4041

4142
requestConfig.headers = {
4243
...requestConfig.headers,
43-
["Accept"]: formattedAcceptHeader
44-
}
45-
}
46-
else {
44+
['Accept']: formattedAcceptHeader,
45+
};
46+
} else {
4747
requestConfig.headers = {
4848
...requestConfig.headers,
49-
["Accept"]: acceptHeader + `;${versioningConfig.mediaTypeKeyName}=${apiVersion}`
50-
}
49+
['Accept']: acceptHeader + `;${versioningConfig.mediaTypeKeyName}=${apiVersion}`,
50+
};
5151
}
5252
}
5353

src/axios-api-versioning.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import axios, { AxiosInstance, AxiosStatic } from 'axios';
22
import { AxiosInstanceWithVersioning } from './types/axios';
3-
import { IWithVersioningConfig, IVersioningConfig } from './types'
4-
import { injectApiVersioningInterceptor } from './axios-api-versioning-interceptor'
3+
import { IWithVersioningConfig, IVersioningConfig } from './types';
4+
import { injectApiVersioningInterceptor } from './axios-api-versioning-interceptor';
55
import { defaultWithVersioningConfig } from './defaultConfig';
66

77
export function withVersioning(instance: AxiosInstance | AxiosStatic, config: IWithVersioningConfig) {
@@ -15,4 +15,4 @@ export function withVersioning(instance: AxiosInstance | AxiosStatic, config: IW
1515
injectApiVersioningInterceptor(clonedInstance, versioningConfig);
1616

1717
return clonedInstance as AxiosInstanceWithVersioning;
18-
}
18+
}

src/defaultConfig.ts

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

3-
export const defaultWithVersioningConfig: PickPartial<IVersioningConfig, "apiVersion" | "versioningStrategy"> = {
3+
export const defaultWithVersioningConfig: PickPartial<IVersioningConfig, 'apiVersion' | 'versioningStrategy'> = {
44
mediaTypeKeyName: 'v',
55
queryStringKeyName: 'api-version',
6-
}
6+
};

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { withVersioning } from './axios-api-versioning';
22
export { VersioningStrategy, IWithVersioningConfig, MediaTypeFormatterFn } from './types';
3+
export * from './types/axios';

src/types/axios/axios.types.ts

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
// Matching type definitions for axios 0.18
22

3-
import {
4-
AxiosRequestConfig,
5-
AxiosPromise,
6-
AxiosInterceptorManager,
7-
AxiosResponse,
8-
} from 'axios';
3+
import { AxiosRequestConfig, AxiosPromise, AxiosInterceptorManager, AxiosResponse } from 'axios';
94

105
/**
116
* In order to only expose the apiVersion and versioningStrategy to axios instances with
@@ -44,15 +39,27 @@ export interface AxiosInstanceWithVersioning {
4439
get<T = any, R = AxiosResponseWithVersioning<T>>(url: string, config?: AxiosRequestConfigWithVersioning): Promise<R>;
4540
delete<T = any, R = AxiosResponseWithVersioning<T>>(url: string, config?: AxiosRequestConfigWithVersioning): Promise<R>;
4641
head<T = any, R = AxiosResponseWithVersioning<T>>(url: string, config?: AxiosRequestConfigWithVersioning): Promise<R>;
47-
post<T = any, R = AxiosResponseWithVersioning<T>>(url: string, data?: any, config?: AxiosRequestConfigWithVersioning): Promise<R>;
48-
put<T = any, R = AxiosResponseWithVersioning<T>>(url: string, data?: any, config?: AxiosRequestConfigWithVersioning): Promise<R>;
49-
patch<T = any, R = AxiosResponseWithVersioning<T>>(url: string, data?: any, config?: AxiosRequestConfigWithVersioning): Promise<R>;
42+
post<T = any, R = AxiosResponseWithVersioning<T>>(
43+
url: string,
44+
data?: any,
45+
config?: AxiosRequestConfigWithVersioning
46+
): Promise<R>;
47+
put<T = any, R = AxiosResponseWithVersioning<T>>(
48+
url: string,
49+
data?: any,
50+
config?: AxiosRequestConfigWithVersioning
51+
): Promise<R>;
52+
patch<T = any, R = AxiosResponseWithVersioning<T>>(
53+
url: string,
54+
data?: any,
55+
config?: AxiosRequestConfigWithVersioning
56+
): Promise<R>;
5057
}
5158

5259
export default interface AxiosTypes {
53-
AxiosRequestConfigWithVersioning: AxiosRequestConfigWithVersioning,
54-
AxiosAdapterWithVersioning: AxiosAdapterWithVersioning,
55-
AxiosResponseWithVersioning: AxiosResponseWithVersioning,
56-
AxiosErrorWithVersioning: AxiosErrorWithVersioning,
57-
AxiosInstanceWithVersioning: AxiosInstanceWithVersioning,
58-
}
60+
AxiosRequestConfigWithVersioning: AxiosRequestConfigWithVersioning;
61+
AxiosAdapterWithVersioning: AxiosAdapterWithVersioning;
62+
AxiosResponseWithVersioning: AxiosResponseWithVersioning;
63+
AxiosErrorWithVersioning: AxiosErrorWithVersioning;
64+
AxiosInstanceWithVersioning: AxiosInstanceWithVersioning;
65+
}

src/types/axios/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ export {
44
AxiosResponseWithVersioning,
55
AxiosErrorWithVersioning,
66
AxiosInstanceWithVersioning,
7-
} from './axios.types'
7+
} from './axios.types';

src/types/index.ts

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

src/types/types.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
export enum VersioningStrategy {
22
QueryString = 'QUERY_STRING',
33
UrlPath = 'URL_PATH',
4-
MediaType = 'MEDIA_TYPE'
4+
MediaType = 'MEDIA_TYPE',
55
}
66

7-
export type MediaTypeFormatterFn = (data: {
8-
apiVersion: string,
9-
mediaTypeKeyName: string,
10-
acceptHeader: string
11-
}) => string;
7+
export type MediaTypeFormatterFn = (data: { apiVersion: string; mediaTypeKeyName: string; acceptHeader: string }) => string;
128

139
export interface IVersioningConfig {
1410
apiVersion: string;
@@ -18,10 +14,8 @@ export interface IVersioningConfig {
1814
mediaTypeFormatter?: MediaTypeFormatterFn;
1915
}
2016

21-
export interface IWithVersioningConfig
22-
extends PickPartial<IVersioningConfig, "mediaTypeKeyName" | "queryStringKeyName"> {
23-
}
17+
export interface IWithVersioningConfig extends PickPartial<IVersioningConfig, 'mediaTypeKeyName' | 'queryStringKeyName'> {}
2418

2519
// type helper
2620
// @see https://stackoverflow.com/a/53742583
27-
export type PickPartial<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>
21+
export type PickPartial<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>>;

0 commit comments

Comments
 (0)