2
0
mirror of https://github.com/tenrok/axios.git synced 2026-06-23 20:40:40 +03:00

Fix TypeScript exports (#4884)

TypeScript 4.7 introduced the `node16` module option. This requires
CommonJS libraries like axios to be properly typed as CommonJS.

The proper type for `module.export =` in JavaScript, is to use
`exports =` in TypeScript. In order to export additional types, a
namespace can be used. However, no values can be exported like this.
Values are exported using the `AxiosStatic` interface.

This change should be non-breaking. If TypeScript users previously
relied on the faux default export, they now need to enable
`esModuleInterop`, as they should have been doing in the first place.

Co-authored-by: Jay <jasonsaayman@gmail.com>
This commit is contained in:
Remco Haszing
2022-09-28 20:30:21 +02:00
committed by GitHub
parent 65977f995c
commit 9588fcdec8
3 changed files with 321 additions and 324 deletions
Vendored
+134 -127
View File
@@ -2,37 +2,93 @@
type AxiosHeaders = Record<string, string | string[] | number | boolean>;
type MethodsHeaders = {
[Key in Method as Lowercase<Key>]: AxiosHeaders;
[Key in axios.Method as Lowercase<Key>]: AxiosHeaders;
};
interface CommonHeaders {
common: AxiosHeaders;
}
export type AxiosRequestHeaders = Partial<AxiosHeaders & MethodsHeaders & CommonHeaders>;
declare class AxiosError_<T = unknown, D = any> extends Error {
constructor(
message?: string,
code?: string,
config?: axios.AxiosRequestConfig<D>,
request?: any,
response?: axios.AxiosResponse<T, D>
);
export type AxiosResponseHeaders = Record<string, string> & {
config?: axios.AxiosRequestConfig<D>;
code?: string;
request?: any;
response?: axios.AxiosResponse<T, D>;
isAxiosError: boolean;
status?: number;
toJSON: () => object;
cause?: Error;
static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS";
static readonly ERR_BAD_OPTION_VALUE = "ERR_BAD_OPTION_VALUE";
static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION";
static readonly ERR_NETWORK = "ERR_NETWORK";
static readonly ERR_DEPRECATED = "ERR_DEPRECATED";
static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE";
static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST";
static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT";
static readonly ERR_INVALID_URL = "ERR_INVALID_URL";
static readonly ERR_CANCELED = "ERR_CANCELED";
static readonly ECONNABORTED = "ECONNABORTED";
static readonly ETIMEDOUT = "ETIMEDOUT";
}
declare class CanceledError_<T> extends AxiosError_<T> {
}
declare class Axios_ {
constructor(config?: axios.AxiosRequestConfig);
defaults: axios.AxiosDefaults;
interceptors: {
request: axios.AxiosInterceptorManager<axios.AxiosRequestConfig>;
response: axios.AxiosInterceptorManager<axios.AxiosResponse>;
};
getUri(config?: axios.AxiosRequestConfig): string;
request<T = any, R = axios.AxiosResponse<T>, D = any>(config: axios.AxiosRequestConfig<D>): Promise<R>;
get<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R>;
delete<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R>;
head<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R>;
options<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, config?: axios.AxiosRequestConfig<D>): Promise<R>;
post<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>;
put<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>;
patch<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>;
postForm<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>;
putForm<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>;
patchForm<T = any, R = axios.AxiosResponse<T>, D = any>(url: string, data?: D, config?: axios.AxiosRequestConfig<D>): Promise<R>;
}
declare namespace axios {
type AxiosRequestHeaders = Partial<AxiosHeaders & MethodsHeaders & CommonHeaders>;
type AxiosResponseHeaders = Record<string, string> & {
"set-cookie"?: string[]
};
};
export interface AxiosRequestTransformer {
interface AxiosRequestTransformer {
(data: any, headers: AxiosRequestHeaders): any;
}
}
export interface AxiosResponseTransformer {
interface AxiosResponseTransformer {
(data: any, headers?: AxiosResponseHeaders, status?: number): any;
}
}
export interface AxiosAdapter {
interface AxiosAdapter {
(config: AxiosRequestConfig): AxiosPromise;
}
}
export interface AxiosBasicCredentials {
interface AxiosBasicCredentials {
username: string;
password: string;
}
}
export interface AxiosProxyConfig {
interface AxiosProxyConfig {
host: string;
port: number;
auth?: {
@@ -40,9 +96,9 @@ export interface AxiosProxyConfig {
password: string;
};
protocol?: string;
}
}
export type Method =
type Method =
| 'get' | 'GET'
| 'delete' | 'DELETE'
| 'head' | 'HEAD'
@@ -54,7 +110,7 @@ export type Method =
| 'link' | 'LINK'
| 'unlink' | 'UNLINK';
export type ResponseType =
type ResponseType =
| 'arraybuffer'
| 'blob'
| 'document'
@@ -62,7 +118,7 @@ export type ResponseType =
| 'text'
| 'stream';
export type responseEncoding =
type responseEncoding =
| 'ascii' | 'ASCII'
| 'ansi' | 'ANSI'
| 'binary' | 'BINARY'
@@ -76,26 +132,26 @@ export type ResponseType =
| 'utf8' | 'UTF8'
| 'utf16le' | 'UTF16LE';
export interface TransitionalOptions {
interface TransitionalOptions {
silentJSONParsing?: boolean;
forcedJSONParsing?: boolean;
clarifyTimeoutError?: boolean;
}
}
export interface GenericAbortSignal {
interface GenericAbortSignal {
aborted: boolean;
onabort: ((...args: any) => any) | null;
addEventListener: (...args: any) => any;
removeEventListener: (...args: any) => any;
}
}
export interface FormDataVisitorHelpers {
interface FormDataVisitorHelpers {
defaultVisitor: SerializerVisitor;
convertValue: (value: any) => any;
isVisitable: (value: any) => boolean;
}
}
export interface SerializerVisitor {
interface SerializerVisitor {
(
this: GenericFormData,
value: any,
@@ -103,28 +159,28 @@ export interface SerializerVisitor {
path: null | Array<string | number>,
helpers: FormDataVisitorHelpers
): boolean;
}
}
export interface SerializerOptions {
interface SerializerOptions {
visitor?: SerializerVisitor;
dots?: boolean;
metaTokens?: boolean;
indexes?: boolean;
}
}
// tslint:disable-next-line
export interface FormSerializerOptions extends SerializerOptions {
}
// tslint:disable-next-line
interface FormSerializerOptions extends SerializerOptions {
}
export interface ParamEncoder {
interface ParamEncoder {
(value: any, defaultEncoder: (value: any) => any): any;
}
}
export interface ParamsSerializerOptions extends SerializerOptions {
interface ParamsSerializerOptions extends SerializerOptions {
encode?: ParamEncoder;
}
}
export interface AxiosRequestConfig<D = any> {
interface AxiosRequestConfig<D = any> {
url?: string;
method?: Method | string;
baseURL?: string;
@@ -163,9 +219,9 @@ export interface AxiosRequestConfig<D = any> {
FormData?: new (...args: any[]) => object;
};
formSerializer?: FormSerializerOptions;
}
}
export interface HeadersDefaults {
interface HeadersDefaults {
common: AxiosRequestHeaders;
delete: AxiosRequestHeaders;
get: AxiosRequestHeaders;
@@ -177,121 +233,66 @@ export interface HeadersDefaults {
purge?: AxiosRequestHeaders;
link?: AxiosRequestHeaders;
unlink?: AxiosRequestHeaders;
}
}
export interface AxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
interface AxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
headers: HeadersDefaults;
}
}
export interface CreateAxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
interface CreateAxiosDefaults<D = any> extends Omit<AxiosRequestConfig<D>, 'headers'> {
headers?: AxiosRequestHeaders | Partial<HeadersDefaults>;
}
}
export interface AxiosResponse<T = any, D = any> {
interface AxiosResponse<T = any, D = any> {
data: T;
status: number;
statusText: string;
headers: AxiosResponseHeaders;
config: AxiosRequestConfig<D>;
request?: any;
}
}
export class AxiosError<T = unknown, D = any> extends Error {
constructor(
message?: string,
code?: string,
config?: AxiosRequestConfig<D>,
request?: any,
response?: AxiosResponse<T, D>
);
type AxiosPromise<T = any> = Promise<AxiosResponse<T>>;
config?: AxiosRequestConfig<D>;
code?: string;
request?: any;
response?: AxiosResponse<T, D>;
isAxiosError: boolean;
status?: number;
toJSON: () => object;
cause?: Error;
static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS";
static readonly ERR_BAD_OPTION_VALUE = "ERR_BAD_OPTION_VALUE";
static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION";
static readonly ERR_NETWORK = "ERR_NETWORK";
static readonly ERR_DEPRECATED = "ERR_DEPRECATED";
static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE";
static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST";
static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT";
static readonly ERR_INVALID_URL = "ERR_INVALID_URL";
static readonly ERR_CANCELED = "ERR_CANCELED";
static readonly ECONNABORTED = "ECONNABORTED";
static readonly ETIMEDOUT = "ETIMEDOUT";
}
export class CanceledError<T> extends AxiosError<T> {
}
export type AxiosPromise<T = any> = Promise<AxiosResponse<T>>;
export interface CancelStatic {
interface CancelStatic {
new (message?: string): Cancel;
}
}
export interface Cancel {
interface Cancel {
message: string | undefined;
}
}
export interface Canceler {
interface Canceler {
(message?: string, config?: AxiosRequestConfig, request?: any): void;
}
}
export interface CancelTokenStatic {
interface CancelTokenStatic {
new (executor: (cancel: Canceler) => void): CancelToken;
source(): CancelTokenSource;
}
}
export interface CancelToken {
interface CancelToken {
promise: Promise<Cancel>;
reason?: Cancel;
throwIfRequested(): void;
}
}
export interface CancelTokenSource {
interface CancelTokenSource {
token: CancelToken;
cancel: Canceler;
}
}
export interface AxiosInterceptorOptions {
interface AxiosInterceptorOptions {
synchronous?: boolean;
runWhen?: (config: AxiosRequestConfig) => boolean;
}
}
export interface AxiosInterceptorManager<V> {
interface AxiosInterceptorManager<V> {
use<T = V>(onFulfilled?: (value: V) => T | Promise<T>, onRejected?: (error: any) => any, options?: AxiosInterceptorOptions): number;
eject(id: number): void;
}
}
export class Axios {
constructor(config?: AxiosRequestConfig);
defaults: AxiosDefaults;
interceptors: {
request: AxiosInterceptorManager<AxiosRequestConfig>;
response: AxiosInterceptorManager<AxiosResponse>;
};
getUri(config?: AxiosRequestConfig): string;
request<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): Promise<R>;
get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
delete<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
head<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
options<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): Promise<R>;
post<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
put<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
patch<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
postForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
putForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
patchForm<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>): Promise<R>;
}
export interface AxiosInstance extends Axios {
interface AxiosInstance extends Axios {
<T = any, R = AxiosResponse<T>, D = any>(config: AxiosRequestConfig<D>): AxiosPromise<R>;
<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>): AxiosPromise<R>;
@@ -300,24 +301,29 @@ export interface AxiosInstance extends Axios {
[key: string]: string | number | boolean | undefined
}
};
}
}
export interface GenericFormData {
interface GenericFormData {
append(name: string, value: any, options?: any): any;
}
}
export interface GenericHTMLFormElement {
interface GenericHTMLFormElement {
name: string;
method: string;
submit(): void;
}
}
export interface AxiosStatic extends AxiosInstance {
type Axios = Axios_;
type AxiosError<T = unknown, D = any> = AxiosError_<T, D>;
type CanceledError<T> = CanceledError_<T>;
interface AxiosStatic extends AxiosInstance {
create(config?: CreateAxiosDefaults): AxiosInstance;
Cancel: CancelStatic;
CancelToken: CancelTokenStatic;
Axios: typeof Axios;
AxiosError: typeof AxiosError;
Axios: typeof Axios_;
AxiosError: typeof AxiosError_;
CanceledError: typeof CanceledError_;
readonly VERSION: string;
isCancel(value: any): value is Cancel;
all<T>(values: Array<T | Promise<T>>): Promise<T[]>;
@@ -325,8 +331,9 @@ export interface AxiosStatic extends AxiosInstance {
isAxiosError<T = any, D = any>(payload: any): payload is AxiosError<T, D>;
toFormData(sourceObj: object, targetFormData?: GenericFormData, options?: FormSerializerOptions): GenericFormData;
formToJSON(form: GenericFormData|GenericHTMLFormElement): object;
}
}
declare const axios: AxiosStatic;
declare const axios: axios.AxiosStatic;
export default axios;
export = axios;
+28 -38
View File
@@ -1,16 +1,6 @@
import axios, {
AxiosRequestConfig,
AxiosResponse,
AxiosError,
AxiosInstance,
AxiosAdapter,
Cancel,
CancelToken,
CancelTokenSource,
Canceler
} from 'axios';
import axios = require('axios');
const config: AxiosRequestConfig = {
const config: axios.AxiosRequestConfig = {
url: '/user',
method: 'get',
baseURL: 'https://api.example.com/',
@@ -44,18 +34,18 @@ const config: AxiosRequestConfig = {
host: '127.0.0.1',
port: 9000
},
cancelToken: new axios.CancelToken((cancel: Canceler) => {})
cancelToken: new axios.CancelToken((cancel: axios.Canceler) => {})
};
const nullValidateStatusConfig: AxiosRequestConfig = {
const nullValidateStatusConfig: axios.AxiosRequestConfig = {
validateStatus: null
};
const undefinedValidateStatusConfig: AxiosRequestConfig = {
const undefinedValidateStatusConfig: axios.AxiosRequestConfig = {
validateStatus: undefined
};
const handleResponse = (response: AxiosResponse) => {
const handleResponse = (response: axios.AxiosResponse) => {
console.log(response.data);
console.log(response.status);
console.log(response.statusText);
@@ -63,7 +53,7 @@ const handleResponse = (response: AxiosResponse) => {
console.log(response.config);
};
const handleError = (error: AxiosError) => {
const handleError = (error: axios.AxiosError) => {
if (error.response) {
console.log(error.response.data);
console.log(error.response.status);
@@ -125,7 +115,7 @@ interface User {
// with default AxiosResponse<T> result
const handleUserResponse = (response: AxiosResponse<User>) => {
const handleUserResponse = (response: axios.AxiosResponse<User>) => {
console.log(response.data.id);
console.log(response.data.name);
console.log(response.status);
@@ -221,8 +211,8 @@ axios.request<User, string>({
// Instances
const instance1: AxiosInstance = axios.create();
const instance2: AxiosInstance = axios.create(config);
const instance1: axios.AxiosInstance = axios.create();
const instance2: axios.AxiosInstance = axios.create(config);
instance1(config)
.then(handleResponse)
@@ -274,39 +264,39 @@ axios.create({ headers: { common: { foo: 'bar' } } });
// Interceptors
const requestInterceptorId: number = axios.interceptors.request.use(
(config: AxiosRequestConfig) => config,
(config: axios.AxiosRequestConfig) => config,
(error: any) => Promise.reject(error)
);
axios.interceptors.request.eject(requestInterceptorId);
axios.interceptors.request.use(
(config: AxiosRequestConfig) => Promise.resolve(config),
(config: axios.AxiosRequestConfig) => Promise.resolve(config),
(error: any) => Promise.reject(error)
);
axios.interceptors.request.use((config: AxiosRequestConfig) => config);
axios.interceptors.request.use((config: AxiosRequestConfig) => Promise.resolve(config));
axios.interceptors.request.use((config: axios.AxiosRequestConfig) => config);
axios.interceptors.request.use((config: axios.AxiosRequestConfig) => Promise.resolve(config));
const responseInterceptorId: number = axios.interceptors.response.use(
(response: AxiosResponse) => response,
(response: axios.AxiosResponse) => response,
(error: any) => Promise.reject(error)
);
axios.interceptors.response.eject(responseInterceptorId);
axios.interceptors.response.use(
(response: AxiosResponse) => Promise.resolve(response),
(response: axios.AxiosResponse) => Promise.resolve(response),
(error: any) => Promise.reject(error)
);
axios.interceptors.response.use((response: AxiosResponse) => response);
axios.interceptors.response.use((response: AxiosResponse) => Promise.resolve(response));
axios.interceptors.response.use((response: axios.AxiosResponse) => response);
axios.interceptors.response.use((response: axios.AxiosResponse) => Promise.resolve(response));
// Adapters
const adapter: AxiosAdapter = (config: AxiosRequestConfig) => {
const response: AxiosResponse = {
const adapter: axios.AxiosAdapter = (config: axios.AxiosRequestConfig) => {
const response: axios.AxiosResponse = {
data: { foo: 'bar' },
status: 200,
statusText: 'OK',
@@ -335,19 +325,19 @@ const fn2: (arr: number[]) => string = axios.spread(fn1);
// Promises
axios.get('/user')
.then((response: AxiosResponse) => 'foo')
.then((response: axios.AxiosResponse) => 'foo')
.then((value: string) => {});
axios.get('/user')
.then((response: AxiosResponse) => Promise.resolve('foo'))
.then((response: axios.AxiosResponse) => Promise.resolve('foo'))
.then((value: string) => {});
axios.get('/user')
.then((response: AxiosResponse) => 'foo', (error: any) => 'bar')
.then((response: axios.AxiosResponse) => 'foo', (error: any) => 'bar')
.then((value: string) => {});
axios.get('/user')
.then((response: AxiosResponse) => 'foo', (error: any) => 123)
.then((response: axios.AxiosResponse) => 'foo', (error: any) => 123)
.then((value: string | number) => {});
axios.get('/user')
@@ -360,13 +350,13 @@ axios.get('/user')
// Cancellation
const source: CancelTokenSource = axios.CancelToken.source();
const source: axios.CancelTokenSource = axios.CancelToken.source();
axios.get('/user', {
cancelToken: source.token
}).catch((thrown: AxiosError | Cancel) => {
}).catch((thrown: axios.AxiosError | axios.Cancel) => {
if (axios.isCancel(thrown)) {
const cancel: Cancel = thrown;
const cancel: axios.Cancel = thrown;
console.log(cancel.message);
}
});
@@ -378,7 +368,7 @@ source.cancel('Operation has been canceled.');
axios.get('/user')
.catch((error) => {
if (axios.isAxiosError(error)) {
const axiosError: AxiosError = error;
const axiosError: axios.AxiosError = error;
}
});
+1 -1
View File
@@ -1,6 +1,6 @@
{
"compilerOptions": {
"module": "es2015",
"module": "commonjs",
"lib": ["dom", "es2015"],
"types": [],
"moduleResolution": "node",