Skip to content

Commit 648b9fb

Browse files
author
Weffe
committed
fix: properly scope versioning types to axios clients with versioning
closes #5
1 parent c287d5c commit 648b9fb

File tree

2 files changed

+52
-25
lines changed

2 files changed

+52
-25
lines changed

src/axios.types.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Matching type definitions for axios 0.18
2+
3+
import {
4+
AxiosRequestConfig,
5+
AxiosPromise,
6+
AxiosInterceptorManager,
7+
AxiosResponse,
8+
} from 'axios';
9+
10+
/**
11+
* In order to only expose the apiVersion and versioningStrategy to axios instances with
12+
* versioning. We had to copy over the types and redefine them with a custom
13+
* axios request config that has versioning fields defined in them.
14+
*/
15+
16+
export interface AxiosRequestConfigWithVersioning extends AxiosRequestConfig {
17+
apiVersion?: string;
18+
versioningStrategy?: string;
19+
adapter?: AxiosAdapterWithVersioning;
20+
}
21+
22+
export interface AxiosAdapterWithVersioning {
23+
(config: AxiosRequestConfigWithVersioning): AxiosPromise<any>;
24+
}
25+
26+
export interface AxiosResponseWithVersioning<T = any> extends AxiosResponse {
27+
config: AxiosRequestConfigWithVersioning;
28+
}
29+
30+
export interface AxiosErrorWithVersioning extends Error {
31+
config: AxiosRequestConfigWithVersioning;
32+
}
33+
34+
export interface AxiosInstanceWithVersioning {
35+
(config: AxiosRequestConfigWithVersioning): AxiosPromise;
36+
(url: string, config?: AxiosRequestConfigWithVersioning): AxiosPromise;
37+
defaults: AxiosRequestConfigWithVersioning;
38+
interceptors: {
39+
request: AxiosInterceptorManager<AxiosRequestConfigWithVersioning>;
40+
response: AxiosInterceptorManager<AxiosResponseWithVersioning>;
41+
};
42+
getUri(config?: AxiosRequestConfigWithVersioning): string;
43+
request<T = any, R = AxiosResponseWithVersioning<T>>(config: AxiosRequestConfigWithVersioning): Promise<R>;
44+
get<T = any, R = AxiosResponseWithVersioning<T>>(url: string, config?: AxiosRequestConfigWithVersioning): Promise<R>;
45+
delete<T = any, R = AxiosResponseWithVersioning<T>>(url: string, config?: AxiosRequestConfigWithVersioning): Promise<R>;
46+
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>;
50+
}

src/types.ts

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,3 @@
1-
import { AxiosInstance, AxiosStatic } from 'axios';
2-
3-
type AxiosType = AxiosInstance | AxiosStatic;
4-
type WithVersioning = {
5-
defaults: {
6-
apiVersion: string;
7-
versioningStrategy: VersioningStrategy;
8-
}
9-
}
10-
11-
export type AxiosWithVersioning = AxiosType & WithVersioning;
12-
131
export enum VersioningStrategy {
142
QueryString = 'QUERY_STRING',
153
UrlPath = 'URL_PATH',
@@ -23,6 +11,7 @@ export type MediaTypeFormatterFn = (data: {
2311
}) => string;
2412

2513
export interface IVersioningConfig {
14+
apiVersion: string;
2615
versioningStrategy: VersioningStrategy;
2716
mediaTypeKeyName: string;
2817
queryStringKeyName: string;
@@ -31,20 +20,8 @@ export interface IVersioningConfig {
3120

3221
export interface IWithVersioningConfig
3322
extends PickPartial<IVersioningConfig, "mediaTypeKeyName" | "queryStringKeyName"> {
34-
apiVersion?: string;
35-
}
36-
37-
/**
38-
* modify the global axios type of AxiosRequestConfig
39-
* to add "apiVersion" & "versioningStrategy" to config object
40-
*/
41-
declare module "axios" {
42-
interface AxiosRequestConfig {
43-
apiVersion?: string;
44-
versioningStrategy?: string
45-
}
4623
}
4724

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

0 commit comments

Comments
 (0)