@ureq/impl-axios 0.0.3-alpha.0 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # @ureq/impl-axios
2
+
3
+ 基于 Axios 的请求器实现。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @ureq/core @ureq/impl-axios axios
9
+ # 或
10
+ pnpm add @ureq/core @ureq/impl-axios axios
11
+ ```
12
+
13
+ > 注意:需要同时安装 `axios` 依赖
14
+
15
+ ## 使用
16
+
17
+ ```typescript
18
+ import { Request } from '@ureq/core';
19
+ import { AxiosRequestor } from '@ureq/impl-axios';
20
+
21
+ const request = new Request(new AxiosRequestor({
22
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1',
23
+ headers: {
24
+ 'Content-Type': 'application/json'
25
+ },
26
+ timeout: 5000
27
+ }));
28
+
29
+ // 发起请求
30
+ const users = await request.get('/users');
31
+ ```
32
+
33
+ ## 配置选项
34
+
35
+ ```typescript
36
+ interface AxiosRequestorConfig {
37
+ baseURL?: string; // API 基础 URL
38
+ headers?: Record<string, string>; // 默认请求头
39
+ timeout?: number; // 超时时间(毫秒)
40
+ withCredentials?: boolean; // 跨域请求是否携带凭证
41
+ // 其他 Axios 配置...
42
+ }
43
+ ```
44
+
45
+ ## 特性
46
+
47
+ - ✅ 功能丰富
48
+ - ✅ 广泛的浏览器支持
49
+ - ✅ 自动转换 JSON 数据
50
+ - ✅ 请求和响应拦截器
51
+ - ✅ 取消请求支持
52
+ - ✅ 进度监控
53
+
54
+ ## 浏览器兼容性
55
+
56
+ - Chrome
57
+ - Firefox
58
+ - Safari
59
+ - Edge
60
+ - IE 11+
61
+ - Node.js
62
+
63
+ ## 何时使用
64
+
65
+ 选择 AxiosRequestor 当你需要:
66
+
67
+ - 支持旧版本浏览器(IE 11+)
68
+ - 更多的配置选项
69
+ - 上传/下载进度监控
70
+ - 请求取消功能
71
+
72
+ ## 示例
73
+
74
+ ### 基础用法
75
+
76
+ ```typescript
77
+ const requestor = new AxiosRequestor({
78
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1'
79
+ });
80
+
81
+ const request = new Request(requestor);
82
+ const data = await request.get('/users');
83
+ ```
84
+
85
+ ### 带认证
86
+
87
+ ```typescript
88
+ const requestor = new AxiosRequestor({
89
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1',
90
+ headers: {
91
+ 'Authorization': 'Bearer your-token'
92
+ }
93
+ });
94
+ ```
95
+
96
+ ### 跨域请求
97
+
98
+ ```typescript
99
+ const requestor = new AxiosRequestor({
100
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1',
101
+ withCredentials: true // 携带 Cookie
102
+ });
103
+ ```
104
+
105
+ ## 文档
106
+
107
+ 查看完整文档:[https://sunny-117.github.io/ureq](https://sunny-117.github.io/ureq)
108
+
109
+ ## License
110
+
111
+ MIT
package/dist/index.js CHANGED
@@ -1,2 +1,97 @@
1
- 'use strict';var o=require('axios'),core=require('@ureq/core');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var o__default=/*#__PURE__*/_interopDefault(o);var n=class{constructor(e){this.instance=o__default.default.create({baseURL:e?.baseURL,timeout:e?.timeout,headers:e?.headers});}convertOptions(e){return {headers:e?.headers,signal:e?.signal,responseType:e?.responseType,...e}}convertResponse(e){return {data:e.data,status:e.status,statusText:e.statusText,headers:e.headers}}handleError(e,t,s){throw core.createRequestError(e,{method:t,url:s})}async get(e,t){try{let s=await this.instance.get(e,this.convertOptions(t));return this.convertResponse(s)}catch(s){this.handleError(s,"GET",e);}}async post(e,t,s){try{let r=await this.instance.post(e,t,this.convertOptions(s));return this.convertResponse(r)}catch(r){this.handleError(r,"POST",e);}}async put(e,t,s){try{let r=await this.instance.put(e,t,this.convertOptions(s));return this.convertResponse(r)}catch(r){this.handleError(r,"PUT",e);}}async delete(e,t){try{let s=await this.instance.delete(e,this.convertOptions(t));return this.convertResponse(s)}catch(s){this.handleError(s,"DELETE",e);}}async patch(e,t,s){try{let r=await this.instance.patch(e,t,this.convertOptions(s));return this.convertResponse(r)}catch(r){this.handleError(r,"PATCH",e);}}};exports.AxiosRequestor=n;//# sourceMappingURL=index.js.map
1
+ 'use strict';
2
+
3
+ var axios = require('axios');
4
+ var core = require('@ureq/core');
5
+
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
9
+
10
+ // src/index.ts
11
+ var responseTypeMap = {
12
+ json: "json",
13
+ text: "text",
14
+ blob: "blob",
15
+ arraybuffer: "arraybuffer",
16
+ formData: "json"
17
+ // axios 不直接支持 formData,回退到 json
18
+ };
19
+ var AxiosRequestor = class {
20
+ constructor(options) {
21
+ this.instance = axios__default.default.create({
22
+ baseURL: options?.baseURL,
23
+ timeout: options?.timeout,
24
+ headers: options?.headers
25
+ });
26
+ }
27
+ convertOptions(options) {
28
+ if (!options) return {};
29
+ const { responseType, responseTransformer, ...restOptions } = options;
30
+ const axiosResponseType = responseType ? responseTypeMap[responseType] || "json" : void 0;
31
+ return {
32
+ ...restOptions,
33
+ responseType: axiosResponseType
34
+ };
35
+ }
36
+ async convertResponse(response, options) {
37
+ let data;
38
+ if (options?.responseTransformer) {
39
+ data = await options.responseTransformer(response);
40
+ } else {
41
+ data = response.data;
42
+ }
43
+ return {
44
+ data,
45
+ status: response.status,
46
+ statusText: response.statusText,
47
+ headers: response.headers
48
+ };
49
+ }
50
+ handleError(error, method, url) {
51
+ throw core.createRequestError(error, { method, url });
52
+ }
53
+ async get(url, options) {
54
+ try {
55
+ const response = await this.instance.get(url, this.convertOptions(options));
56
+ return this.convertResponse(response, options);
57
+ } catch (error) {
58
+ this.handleError(error, "GET", url);
59
+ }
60
+ }
61
+ async post(url, data, options) {
62
+ try {
63
+ const response = await this.instance.post(url, data, this.convertOptions(options));
64
+ return this.convertResponse(response, options);
65
+ } catch (error) {
66
+ this.handleError(error, "POST", url);
67
+ }
68
+ }
69
+ async put(url, data, options) {
70
+ try {
71
+ const response = await this.instance.put(url, data, this.convertOptions(options));
72
+ return this.convertResponse(response, options);
73
+ } catch (error) {
74
+ this.handleError(error, "PUT", url);
75
+ }
76
+ }
77
+ async delete(url, options) {
78
+ try {
79
+ const response = await this.instance.delete(url, this.convertOptions(options));
80
+ return this.convertResponse(response, options);
81
+ } catch (error) {
82
+ this.handleError(error, "DELETE", url);
83
+ }
84
+ }
85
+ async patch(url, data, options) {
86
+ try {
87
+ const response = await this.instance.patch(url, data, this.convertOptions(options));
88
+ return this.convertResponse(response, options);
89
+ } catch (error) {
90
+ this.handleError(error, "PATCH", url);
91
+ }
92
+ }
93
+ };
94
+
95
+ exports.AxiosRequestor = AxiosRequestor;
96
+ //# sourceMappingURL=index.js.map
2
97
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["AxiosRequestor","options","axios","response","error","method","url","createRequestError","data"],"mappings":"+KASaA,IAAAA,CAAAA,CAAN,KAA0C,CAG/C,WAAYC,CAAAA,CAAAA,CAAiC,CAC3C,IAAA,CAAK,QAAWC,CAAAA,kBAAAA,CAAM,MAAO,CAAA,CAC3B,OAASD,CAAAA,CAAAA,EAAS,OAClB,CAAA,OAAA,CAASA,CAAS,EAAA,OAAA,CAClB,OAASA,CAAAA,CAAAA,EAAS,OACpB,CAAC,EACH,CAEQ,cAAA,CAAeA,CAA8C,CAAA,CACnE,OAAO,CACL,OAASA,CAAAA,CAAAA,EAAS,OAClB,CAAA,MAAA,CAAQA,CAAS,EAAA,MAAA,CACjB,YAAcA,CAAAA,CAAAA,EAAS,YACvB,CAAA,GAAGA,CACL,CACF,CAEQ,eAAA,CAAmBE,CAA4B,CAAA,CACrD,OAAO,CACL,IAAMA,CAAAA,CAAAA,CAAS,IACf,CAAA,MAAA,CAAQA,CAAS,CAAA,MAAA,CACjB,UAAYA,CAAAA,CAAAA,CAAS,WACrB,OAASA,CAAAA,CAAAA,CAAS,OACpB,CACF,CAEQ,WAAA,CAAYC,CAAYC,CAAAA,CAAAA,CAAiBC,CAAqB,CAAA,CACpE,MAAMC,uBAAAA,CAAmBH,CAAO,CAAA,CAAE,MAAAC,CAAAA,CAAAA,CAAQ,GAAAC,CAAAA,CAAI,CAAC,CACjD,CAEA,MAAM,GAAOA,CAAAA,CAAAA,CAAaL,CAAgD,CAAA,CACxE,GAAI,CACF,IAAME,CAAAA,CAAW,MAAM,IAAA,CAAK,SAAS,GAAIG,CAAAA,CAAAA,CAAK,IAAK,CAAA,cAAA,CAAeL,CAAO,CAAC,CAC1E,CAAA,OAAO,IAAK,CAAA,eAAA,CAAgBE,CAAQ,CACtC,CAASC,MAAAA,CAAAA,CAAO,CACd,IAAA,CAAK,YAAYA,CAAO,CAAA,KAAA,CAAOE,CAAG,EACpC,CACF,CAEA,MAAM,IAAA,CAAQA,CAAaE,CAAAA,CAAAA,CAAYP,CAAgD,CAAA,CACrF,GAAI,CACF,IAAME,CAAAA,CAAW,MAAM,IAAK,CAAA,QAAA,CAAS,IAAKG,CAAAA,CAAAA,CAAKE,CAAM,CAAA,IAAA,CAAK,cAAeP,CAAAA,CAAO,CAAC,CAAA,CACjF,OAAO,IAAA,CAAK,eAAgBE,CAAAA,CAAQ,CACtC,CAAA,MAASC,CAAO,CAAA,CACd,IAAK,CAAA,WAAA,CAAYA,CAAO,CAAA,MAAA,CAAQE,CAAG,EACrC,CACF,CAEA,MAAM,GAAA,CAAOA,CAAaE,CAAAA,CAAAA,CAAYP,CAAgD,CAAA,CACpF,GAAI,CACF,IAAME,CAAW,CAAA,MAAM,IAAK,CAAA,QAAA,CAAS,GAAIG,CAAAA,CAAAA,CAAKE,CAAM,CAAA,IAAA,CAAK,cAAeP,CAAAA,CAAO,CAAC,CAAA,CAChF,OAAO,IAAA,CAAK,gBAAgBE,CAAQ,CACtC,CAASC,MAAAA,CAAAA,CAAO,CACd,IAAA,CAAK,WAAYA,CAAAA,CAAAA,CAAO,KAAOE,CAAAA,CAAG,EACpC,CACF,CAEA,MAAM,MAAUA,CAAAA,CAAAA,CAAaL,EAAgD,CAC3E,GAAI,CACF,IAAME,CAAW,CAAA,MAAM,IAAK,CAAA,QAAA,CAAS,MAAOG,CAAAA,CAAAA,CAAK,IAAK,CAAA,cAAA,CAAeL,CAAO,CAAC,CAC7E,CAAA,OAAO,IAAK,CAAA,eAAA,CAAgBE,CAAQ,CACtC,CAASC,MAAAA,CAAAA,CAAO,CACd,IAAA,CAAK,WAAYA,CAAAA,CAAAA,CAAO,QAAUE,CAAAA,CAAG,EACvC,CACF,CAEA,MAAM,MAASA,CAAaE,CAAAA,CAAAA,CAAYP,CAAgD,CAAA,CACtF,GAAI,CACF,IAAME,CAAAA,CAAW,MAAM,IAAA,CAAK,QAAS,CAAA,KAAA,CAAMG,CAAKE,CAAAA,CAAAA,CAAM,IAAK,CAAA,cAAA,CAAeP,CAAO,CAAC,CAAA,CAClF,OAAO,IAAA,CAAK,eAAgBE,CAAAA,CAAQ,CACtC,CAAA,MAASC,CAAO,CAAA,CACd,IAAK,CAAA,WAAA,CAAYA,CAAO,CAAA,OAAA,CAASE,CAAG,EACtC,CACF,CACF","file":"index.js","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, ResponseType } from 'axios';\nimport { Requestor, RequestOptions, Response, createRequestError } from '@ureq/core';\n\nexport interface AxiosRequestorOptions {\n baseURL?: string;\n timeout?: number;\n headers?: Record<string, string>;\n}\n\nexport class AxiosRequestor implements Requestor {\n private instance: AxiosInstance;\n\n constructor(options?: AxiosRequestorOptions) {\n this.instance = axios.create({\n baseURL: options?.baseURL,\n timeout: options?.timeout,\n headers: options?.headers,\n });\n }\n\n private convertOptions(options?: RequestOptions): AxiosRequestConfig {\n return {\n headers: options?.headers,\n signal: options?.signal,\n responseType: options?.responseType as ResponseType | undefined,\n ...options,\n };\n }\n\n private convertResponse<T>(response: any): Response<T> {\n return {\n data: response.data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n private handleError(error: any, method?: string, url?: string): never {\n throw createRequestError(error, { method, url });\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.get(url, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'GET', url);\n }\n }\n\n async post<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.post(url, data, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'POST', url);\n }\n }\n\n async put<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.put(url, data, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'PUT', url);\n }\n }\n\n async delete<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.delete(url, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'DELETE', url);\n }\n }\n\n async patch<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.patch(url, data, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'PATCH', url);\n }\n }\n} "]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["axios","createRequestError"],"mappings":"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","file":"index.js","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, ResponseType as AxiosResponseType } from 'axios';\nimport { Requestor, RequestOptions, Response, createRequestError } from '@ureq/core';\n\nexport interface AxiosRequestorOptions {\n baseURL?: string;\n timeout?: number;\n headers?: Record<string, string>;\n}\n\n// ResponseType 映射:将 ureq 的 responseType 转换为 axios 的 responseType\nconst responseTypeMap: Record<string, AxiosResponseType> = {\n json: 'json',\n text: 'text',\n blob: 'blob',\n arraybuffer: 'arraybuffer',\n formData: 'json', // axios 不直接支持 formData,回退到 json\n};\n\nexport class AxiosRequestor implements Requestor {\n private instance: AxiosInstance;\n\n constructor(options?: AxiosRequestorOptions) {\n this.instance = axios.create({\n baseURL: options?.baseURL,\n timeout: options?.timeout,\n headers: options?.headers,\n });\n }\n\n private convertOptions(options?: RequestOptions): AxiosRequestConfig {\n if (!options) return {};\n\n // 解构出 ureq 特有的选项,避免传递给 axios\n const { responseType, responseTransformer, ...restOptions } = options;\n\n const axiosResponseType = responseType\n ? responseTypeMap[responseType] || 'json'\n : undefined;\n\n return {\n ...restOptions,\n responseType: axiosResponseType,\n };\n }\n\n private async convertResponse<T>(\n response: any,\n options?: RequestOptions\n ): Promise<Response<T>> {\n let data: T;\n\n // 优先使用自定义转换器\n if (options?.responseTransformer) {\n data = await options.responseTransformer(response);\n } else {\n data = response.data;\n }\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n private handleError(error: any, method?: string, url?: string): never {\n throw createRequestError(error, { method, url });\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.get(url, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'GET', url);\n }\n }\n\n async post<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.post(url, data, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'POST', url);\n }\n }\n\n async put<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.put(url, data, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'PUT', url);\n }\n }\n\n async delete<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.delete(url, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'DELETE', url);\n }\n }\n\n async patch<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.patch(url, data, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'PATCH', url);\n }\n }\n} "]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,91 @@
1
- import o from'axios';import {createRequestError}from'@ureq/core';var n=class{constructor(e){this.instance=o.create({baseURL:e?.baseURL,timeout:e?.timeout,headers:e?.headers});}convertOptions(e){return {headers:e?.headers,signal:e?.signal,responseType:e?.responseType,...e}}convertResponse(e){return {data:e.data,status:e.status,statusText:e.statusText,headers:e.headers}}handleError(e,t,s){throw createRequestError(e,{method:t,url:s})}async get(e,t){try{let s=await this.instance.get(e,this.convertOptions(t));return this.convertResponse(s)}catch(s){this.handleError(s,"GET",e);}}async post(e,t,s){try{let r=await this.instance.post(e,t,this.convertOptions(s));return this.convertResponse(r)}catch(r){this.handleError(r,"POST",e);}}async put(e,t,s){try{let r=await this.instance.put(e,t,this.convertOptions(s));return this.convertResponse(r)}catch(r){this.handleError(r,"PUT",e);}}async delete(e,t){try{let s=await this.instance.delete(e,this.convertOptions(t));return this.convertResponse(s)}catch(s){this.handleError(s,"DELETE",e);}}async patch(e,t,s){try{let r=await this.instance.patch(e,t,this.convertOptions(s));return this.convertResponse(r)}catch(r){this.handleError(r,"PATCH",e);}}};export{n as AxiosRequestor};//# sourceMappingURL=index.mjs.map
1
+ import axios from 'axios';
2
+ import { createRequestError } from '@ureq/core';
3
+
4
+ // src/index.ts
5
+ var responseTypeMap = {
6
+ json: "json",
7
+ text: "text",
8
+ blob: "blob",
9
+ arraybuffer: "arraybuffer",
10
+ formData: "json"
11
+ // axios 不直接支持 formData,回退到 json
12
+ };
13
+ var AxiosRequestor = class {
14
+ constructor(options) {
15
+ this.instance = axios.create({
16
+ baseURL: options?.baseURL,
17
+ timeout: options?.timeout,
18
+ headers: options?.headers
19
+ });
20
+ }
21
+ convertOptions(options) {
22
+ if (!options) return {};
23
+ const { responseType, responseTransformer, ...restOptions } = options;
24
+ const axiosResponseType = responseType ? responseTypeMap[responseType] || "json" : void 0;
25
+ return {
26
+ ...restOptions,
27
+ responseType: axiosResponseType
28
+ };
29
+ }
30
+ async convertResponse(response, options) {
31
+ let data;
32
+ if (options?.responseTransformer) {
33
+ data = await options.responseTransformer(response);
34
+ } else {
35
+ data = response.data;
36
+ }
37
+ return {
38
+ data,
39
+ status: response.status,
40
+ statusText: response.statusText,
41
+ headers: response.headers
42
+ };
43
+ }
44
+ handleError(error, method, url) {
45
+ throw createRequestError(error, { method, url });
46
+ }
47
+ async get(url, options) {
48
+ try {
49
+ const response = await this.instance.get(url, this.convertOptions(options));
50
+ return this.convertResponse(response, options);
51
+ } catch (error) {
52
+ this.handleError(error, "GET", url);
53
+ }
54
+ }
55
+ async post(url, data, options) {
56
+ try {
57
+ const response = await this.instance.post(url, data, this.convertOptions(options));
58
+ return this.convertResponse(response, options);
59
+ } catch (error) {
60
+ this.handleError(error, "POST", url);
61
+ }
62
+ }
63
+ async put(url, data, options) {
64
+ try {
65
+ const response = await this.instance.put(url, data, this.convertOptions(options));
66
+ return this.convertResponse(response, options);
67
+ } catch (error) {
68
+ this.handleError(error, "PUT", url);
69
+ }
70
+ }
71
+ async delete(url, options) {
72
+ try {
73
+ const response = await this.instance.delete(url, this.convertOptions(options));
74
+ return this.convertResponse(response, options);
75
+ } catch (error) {
76
+ this.handleError(error, "DELETE", url);
77
+ }
78
+ }
79
+ async patch(url, data, options) {
80
+ try {
81
+ const response = await this.instance.patch(url, data, this.convertOptions(options));
82
+ return this.convertResponse(response, options);
83
+ } catch (error) {
84
+ this.handleError(error, "PATCH", url);
85
+ }
86
+ }
87
+ };
88
+
89
+ export { AxiosRequestor };
90
+ //# sourceMappingURL=index.mjs.map
2
91
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["AxiosRequestor","options","axios","response","error","method","url","createRequestError","data"],"mappings":"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","file":"index.mjs","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, ResponseType } from 'axios';\nimport { Requestor, RequestOptions, Response, createRequestError } from '@ureq/core';\n\nexport interface AxiosRequestorOptions {\n baseURL?: string;\n timeout?: number;\n headers?: Record<string, string>;\n}\n\nexport class AxiosRequestor implements Requestor {\n private instance: AxiosInstance;\n\n constructor(options?: AxiosRequestorOptions) {\n this.instance = axios.create({\n baseURL: options?.baseURL,\n timeout: options?.timeout,\n headers: options?.headers,\n });\n }\n\n private convertOptions(options?: RequestOptions): AxiosRequestConfig {\n return {\n headers: options?.headers,\n signal: options?.signal,\n responseType: options?.responseType as ResponseType | undefined,\n ...options,\n };\n }\n\n private convertResponse<T>(response: any): Response<T> {\n return {\n data: response.data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n private handleError(error: any, method?: string, url?: string): never {\n throw createRequestError(error, { method, url });\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.get(url, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'GET', url);\n }\n }\n\n async post<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.post(url, data, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'POST', url);\n }\n }\n\n async put<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.put(url, data, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'PUT', url);\n }\n }\n\n async delete<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.delete(url, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'DELETE', url);\n }\n }\n\n async patch<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.patch(url, data, this.convertOptions(options));\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'PATCH', url);\n }\n }\n} "]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, ResponseType as AxiosResponseType } from 'axios';\nimport { Requestor, RequestOptions, Response, createRequestError } from '@ureq/core';\n\nexport interface AxiosRequestorOptions {\n baseURL?: string;\n timeout?: number;\n headers?: Record<string, string>;\n}\n\n// ResponseType 映射:将 ureq 的 responseType 转换为 axios 的 responseType\nconst responseTypeMap: Record<string, AxiosResponseType> = {\n json: 'json',\n text: 'text',\n blob: 'blob',\n arraybuffer: 'arraybuffer',\n formData: 'json', // axios 不直接支持 formData,回退到 json\n};\n\nexport class AxiosRequestor implements Requestor {\n private instance: AxiosInstance;\n\n constructor(options?: AxiosRequestorOptions) {\n this.instance = axios.create({\n baseURL: options?.baseURL,\n timeout: options?.timeout,\n headers: options?.headers,\n });\n }\n\n private convertOptions(options?: RequestOptions): AxiosRequestConfig {\n if (!options) return {};\n\n // 解构出 ureq 特有的选项,避免传递给 axios\n const { responseType, responseTransformer, ...restOptions } = options;\n\n const axiosResponseType = responseType\n ? responseTypeMap[responseType] || 'json'\n : undefined;\n\n return {\n ...restOptions,\n responseType: axiosResponseType,\n };\n }\n\n private async convertResponse<T>(\n response: any,\n options?: RequestOptions\n ): Promise<Response<T>> {\n let data: T;\n\n // 优先使用自定义转换器\n if (options?.responseTransformer) {\n data = await options.responseTransformer(response);\n } else {\n data = response.data;\n }\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n };\n }\n\n private handleError(error: any, method?: string, url?: string): never {\n throw createRequestError(error, { method, url });\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.get(url, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'GET', url);\n }\n }\n\n async post<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.post(url, data, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'POST', url);\n }\n }\n\n async put<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.put(url, data, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'PUT', url);\n }\n }\n\n async delete<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.delete(url, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'DELETE', url);\n }\n }\n\n async patch<T>(url: string, data?: any, options?: RequestOptions): Promise<Response<T>> {\n try {\n const response = await this.instance.patch(url, data, this.convertOptions(options));\n return this.convertResponse(response, options);\n } catch (error) {\n this.handleError(error, 'PATCH', url);\n }\n }\n} "]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ureq/impl-axios",
3
- "version": "0.0.3-alpha.0",
3
+ "version": "0.0.4",
4
4
  "description": "Axios implementation for universal request library",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "dependencies": {
22
22
  "axios": "^1.0.0",
23
- "@ureq/core": "0.0.3-alpha.0"
23
+ "@ureq/core": "0.0.4"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^20.0.0",
@@ -31,6 +31,6 @@
31
31
  "scripts": {
32
32
  "build": "tsup",
33
33
  "dev": "tsup --watch",
34
- "test": "vitest"
34
+ "test": "vitest --run"
35
35
  }
36
36
  }