@ureq/impl-fetch 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,104 @@
1
+ # @ureq/impl-fetch
2
+
3
+ 基于 Fetch API 的请求器实现。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @ureq/core @ureq/impl-fetch
9
+ # 或
10
+ pnpm add @ureq/core @ureq/impl-fetch
11
+ ```
12
+
13
+ ## 使用
14
+
15
+ ```typescript
16
+ import { Request } from '@ureq/core';
17
+ import { FetchRequestor } from '@ureq/impl-fetch';
18
+
19
+ const request = new Request(new FetchRequestor({
20
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1',
21
+ headers: {
22
+ 'Content-Type': 'application/json'
23
+ },
24
+ timeout: 5000
25
+ }));
26
+
27
+ // 发起请求
28
+ const users = await request.get('/users');
29
+ ```
30
+
31
+ ## 配置选项
32
+
33
+ ```typescript
34
+ interface FetchRequestorOptions {
35
+ baseURL?: string; // API 基础 URL
36
+ defaultHeaders?: Record<string, string>; // 默认请求头
37
+ }
38
+ ```
39
+
40
+ ## 特性
41
+
42
+ - ✅ 轻量级,无额外依赖
43
+ - ✅ 支持现代浏览器和 Node.js 18+
44
+ - ✅ 原生 Promise 支持
45
+ - ✅ 支持 AbortController
46
+ - ✅ 完整的 TypeScript 类型
47
+
48
+ ## 浏览器兼容性
49
+
50
+ - Chrome 42+
51
+ - Firefox 39+
52
+ - Safari 10.1+
53
+ - Edge 14+
54
+ - Node.js 18+
55
+
56
+ ## 示例
57
+
58
+ ### 基础用法
59
+
60
+ ```typescript
61
+ const requestor = new FetchRequestor({
62
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1'
63
+ });
64
+
65
+ const request = new Request(requestor);
66
+ const data = await request.get('/users');
67
+ ```
68
+
69
+ ### 带认证
70
+
71
+ ```typescript
72
+ const requestor = new FetchRequestor({
73
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1',
74
+ defaultHeaders: {
75
+ 'Authorization': 'Bearer your-token'
76
+ }
77
+ });
78
+ ```
79
+
80
+ ### 使用拦截器添加超时
81
+
82
+ ```typescript
83
+ import { Request } from '@ureq/core';
84
+ import { FetchRequestor } from '@ureq/impl-fetch';
85
+
86
+ const request = new Request(
87
+ new FetchRequestor({
88
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1'
89
+ }),
90
+ {
91
+ timeout: {
92
+ timeout: 10000 // 10 秒超时
93
+ }
94
+ }
95
+ );
96
+ ```
97
+
98
+ ## 文档
99
+
100
+ 查看完整文档:[https://sunny-117.github.io/ureq](https://sunny-117.github.io/ureq)
101
+
102
+ ## License
103
+
104
+ MIT
package/dist/index.d.mts CHANGED
@@ -9,6 +9,7 @@ declare class FetchRequestor implements Requestor {
9
9
  private defaultHeaders;
10
10
  constructor(options?: FetchRequestorOptions);
11
11
  private getFullURL;
12
+ private parseResponseByType;
12
13
  private convertResponse;
13
14
  private handleError;
14
15
  private createRequestInit;
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ declare class FetchRequestor implements Requestor {
9
9
  private defaultHeaders;
10
10
  constructor(options?: FetchRequestorOptions);
11
11
  private getFullURL;
12
+ private parseResponseByType;
12
13
  private convertResponse;
13
14
  private handleError;
14
15
  private createRequestInit;
package/dist/index.js CHANGED
@@ -1,2 +1,145 @@
1
- 'use strict';var core=require('@ureq/core');var i=class{constructor(e){this.baseURL=e?.baseURL||"",this.defaultHeaders=e?.defaultHeaders||{};}getFullURL(e){return this.baseURL?new URL(e,this.baseURL).toString():e}async convertResponse(e){let r;try{r=await e.json();}catch{r=await e.text();}return {data:r,status:e.status,statusText:e.statusText,headers:Object.fromEntries(e.headers.entries())}}handleError(e,r,t){throw core.createRequestError(e,{method:r,url:t})}createRequestInit(e,r,t){return {method:e,headers:{"Content-Type":"application/json",...this.defaultHeaders,...t?.headers},body:r?JSON.stringify(r):void 0,signal:t?.signal,credentials:"same-origin",...t}}async get(e,r){try{let t=this.getFullURL(e),s=await fetch(t,this.createRequestInit("GET",void 0,r));if(!s.ok)throw s;return this.convertResponse(s)}catch(t){this.handleError(t,"GET",e);}}async post(e,r,t){try{let s=this.getFullURL(e),n=await fetch(s,this.createRequestInit("POST",r,t));if(!n.ok)throw n;return this.convertResponse(n)}catch(s){this.handleError(s,"POST",e);}}async put(e,r,t){try{let s=this.getFullURL(e),n=await fetch(s,this.createRequestInit("PUT",r,t));if(!n.ok)throw n;return this.convertResponse(n)}catch(s){this.handleError(s,"PUT",e);}}async delete(e,r){try{let t=this.getFullURL(e),s=await fetch(t,this.createRequestInit("DELETE",void 0,r));if(!s.ok)throw s;return this.convertResponse(s)}catch(t){this.handleError(t,"DELETE",e);}}async patch(e,r,t){try{let s=this.getFullURL(e),n=await fetch(s,this.createRequestInit("PATCH",r,t));if(!n.ok)throw n;return this.convertResponse(n)}catch(s){this.handleError(s,"PATCH",e);}}};exports.FetchRequestor=i;//# sourceMappingURL=index.js.map
1
+ 'use strict';
2
+
3
+ var core = require('@ureq/core');
4
+
5
+ // src/index.ts
6
+ var FetchRequestor = class {
7
+ constructor(options) {
8
+ this.baseURL = options?.baseURL || "";
9
+ this.defaultHeaders = options?.defaultHeaders || {};
10
+ }
11
+ getFullURL(url) {
12
+ return this.baseURL ? new URL(url, this.baseURL).toString() : url;
13
+ }
14
+ async parseResponseByType(response, responseType = "json") {
15
+ switch (responseType) {
16
+ case "text":
17
+ return await response.text();
18
+ case "blob":
19
+ return await response.blob();
20
+ case "arraybuffer":
21
+ return await response.arrayBuffer();
22
+ case "formData":
23
+ return await response.formData();
24
+ case "json":
25
+ default:
26
+ const text = await response.text();
27
+ try {
28
+ return JSON.parse(text);
29
+ } catch {
30
+ return text;
31
+ }
32
+ }
33
+ }
34
+ async convertResponse(response, options) {
35
+ let data;
36
+ if (options?.responseTransformer) {
37
+ data = await options.responseTransformer(response);
38
+ } else {
39
+ data = await this.parseResponseByType(response, options?.responseType);
40
+ }
41
+ return {
42
+ data,
43
+ status: response.status,
44
+ statusText: response.statusText,
45
+ headers: Object.fromEntries(response.headers.entries())
46
+ };
47
+ }
48
+ handleError(error, method, url) {
49
+ throw core.createRequestError(error, { method, url });
50
+ }
51
+ createRequestInit(method, data, options) {
52
+ const { headers: optionHeaders, responseType, responseTransformer, ...restOptions } = options || {};
53
+ return {
54
+ method,
55
+ headers: {
56
+ "Content-Type": "application/json",
57
+ ...this.defaultHeaders,
58
+ ...optionHeaders
59
+ },
60
+ body: data ? JSON.stringify(data) : void 0,
61
+ signal: options?.signal,
62
+ credentials: "same-origin",
63
+ ...restOptions
64
+ };
65
+ }
66
+ async get(url, options) {
67
+ try {
68
+ const fullUrl = this.getFullURL(url);
69
+ const response = await fetch(
70
+ fullUrl,
71
+ this.createRequestInit("GET", void 0, options)
72
+ );
73
+ if (!response.ok) {
74
+ throw response;
75
+ }
76
+ return this.convertResponse(response, options);
77
+ } catch (error) {
78
+ this.handleError(error, "GET", url);
79
+ }
80
+ }
81
+ async post(url, data, options) {
82
+ try {
83
+ const fullUrl = this.getFullURL(url);
84
+ const response = await fetch(
85
+ fullUrl,
86
+ this.createRequestInit("POST", data, options)
87
+ );
88
+ if (!response.ok) {
89
+ throw response;
90
+ }
91
+ return this.convertResponse(response, options);
92
+ } catch (error) {
93
+ this.handleError(error, "POST", url);
94
+ }
95
+ }
96
+ async put(url, data, options) {
97
+ try {
98
+ const fullUrl = this.getFullURL(url);
99
+ const response = await fetch(
100
+ fullUrl,
101
+ this.createRequestInit("PUT", data, options)
102
+ );
103
+ if (!response.ok) {
104
+ throw response;
105
+ }
106
+ return this.convertResponse(response, options);
107
+ } catch (error) {
108
+ this.handleError(error, "PUT", url);
109
+ }
110
+ }
111
+ async delete(url, options) {
112
+ try {
113
+ const fullUrl = this.getFullURL(url);
114
+ const response = await fetch(
115
+ fullUrl,
116
+ this.createRequestInit("DELETE", void 0, options)
117
+ );
118
+ if (!response.ok) {
119
+ throw response;
120
+ }
121
+ return this.convertResponse(response, options);
122
+ } catch (error) {
123
+ this.handleError(error, "DELETE", url);
124
+ }
125
+ }
126
+ async patch(url, data, options) {
127
+ try {
128
+ const fullUrl = this.getFullURL(url);
129
+ const response = await fetch(
130
+ fullUrl,
131
+ this.createRequestInit("PATCH", data, options)
132
+ );
133
+ if (!response.ok) {
134
+ throw response;
135
+ }
136
+ return this.convertResponse(response, options);
137
+ } catch (error) {
138
+ this.handleError(error, "PATCH", url);
139
+ }
140
+ }
141
+ };
142
+
143
+ exports.FetchRequestor = FetchRequestor;
144
+ //# sourceMappingURL=index.js.map
2
145
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["FetchRequestor","options","url","response","data","error","method","createRequestError","fullUrl"],"mappings":"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","file":"index.js","sourcesContent":["import { Requestor, RequestOptions, Response, RequestError, createRequestError } from '@ureq/core';\n\nexport interface FetchRequestorOptions {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class FetchRequestor implements Requestor {\n private baseURL: string;\n private defaultHeaders: Record<string, string>;\n\n constructor(options?: FetchRequestorOptions) {\n this.baseURL = options?.baseURL || '';\n this.defaultHeaders = options?.defaultHeaders || {};\n }\n\n private getFullURL(url: string): string {\n return this.baseURL ? new URL(url, this.baseURL).toString() : url;\n }\n\n private async convertResponse<T>(response: globalThis.Response): Promise<Response<T>> {\n let data: T;\n \n try {\n data = await response.json();\n } catch {\n data = await response.text() as any;\n }\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n };\n }\n\n private handleError(error: any, method?: string, url?: string): never {\n throw createRequestError(error, { method, url });\n }\n\n private createRequestInit(\n method: string,\n data?: any,\n options?: RequestOptions\n ): RequestInit {\n return {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...options?.headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: options?.signal,\n credentials: 'same-origin',\n ...options,\n };\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('GET', undefined, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('POST', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('PUT', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('DELETE', undefined, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('PATCH', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'PATCH', url);\n }\n }\n\n // 实现其他方法...\n} "]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["createRequestError"],"mappings":"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","file":"index.js","sourcesContent":["import { Requestor, RequestOptions, Response, ResponseType, createRequestError } from '@ureq/core';\n\nexport interface FetchRequestorOptions {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class FetchRequestor implements Requestor {\n private baseURL: string;\n private defaultHeaders: Record<string, string>;\n\n constructor(options?: FetchRequestorOptions) {\n this.baseURL = options?.baseURL || '';\n this.defaultHeaders = options?.defaultHeaders || {};\n }\n\n private getFullURL(url: string): string {\n return this.baseURL ? new URL(url, this.baseURL).toString() : url;\n }\n\n private async parseResponseByType<T>(\n response: globalThis.Response,\n responseType: ResponseType = 'json'\n ): Promise<T> {\n switch (responseType) {\n case 'text':\n return (await response.text()) as T;\n case 'blob':\n return (await response.blob()) as T;\n case 'arraybuffer':\n return (await response.arrayBuffer()) as T;\n case 'formData':\n return (await response.formData()) as T;\n case 'json':\n default:\n // 先读取为 text,再尝试解析为 JSON,兼容返回非 JSON 的情况\n const text = await response.text();\n try {\n return JSON.parse(text);\n } catch {\n return text as T;\n }\n }\n }\n\n private async convertResponse<T>(\n response: globalThis.Response,\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 = await this.parseResponseByType<T>(response, options?.responseType);\n }\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n };\n }\n\n private handleError(error: any, method?: string, url?: string): never {\n throw createRequestError(error, { method, url });\n }\n\n private createRequestInit(\n method: string,\n data?: any,\n options?: RequestOptions\n ): RequestInit {\n // 解构出需要特殊处理的选项\n const { headers: optionHeaders, responseType, responseTransformer, ...restOptions } = options || {};\n\n return {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...optionHeaders,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: options?.signal,\n credentials: 'same-origin',\n ...restOptions,\n };\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('GET', undefined, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('POST', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('PUT', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('DELETE', undefined, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('PATCH', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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,143 @@
1
- import {createRequestError}from'@ureq/core';var i=class{constructor(e){this.baseURL=e?.baseURL||"",this.defaultHeaders=e?.defaultHeaders||{};}getFullURL(e){return this.baseURL?new URL(e,this.baseURL).toString():e}async convertResponse(e){let r;try{r=await e.json();}catch{r=await e.text();}return {data:r,status:e.status,statusText:e.statusText,headers:Object.fromEntries(e.headers.entries())}}handleError(e,r,t){throw createRequestError(e,{method:r,url:t})}createRequestInit(e,r,t){return {method:e,headers:{"Content-Type":"application/json",...this.defaultHeaders,...t?.headers},body:r?JSON.stringify(r):void 0,signal:t?.signal,credentials:"same-origin",...t}}async get(e,r){try{let t=this.getFullURL(e),s=await fetch(t,this.createRequestInit("GET",void 0,r));if(!s.ok)throw s;return this.convertResponse(s)}catch(t){this.handleError(t,"GET",e);}}async post(e,r,t){try{let s=this.getFullURL(e),n=await fetch(s,this.createRequestInit("POST",r,t));if(!n.ok)throw n;return this.convertResponse(n)}catch(s){this.handleError(s,"POST",e);}}async put(e,r,t){try{let s=this.getFullURL(e),n=await fetch(s,this.createRequestInit("PUT",r,t));if(!n.ok)throw n;return this.convertResponse(n)}catch(s){this.handleError(s,"PUT",e);}}async delete(e,r){try{let t=this.getFullURL(e),s=await fetch(t,this.createRequestInit("DELETE",void 0,r));if(!s.ok)throw s;return this.convertResponse(s)}catch(t){this.handleError(t,"DELETE",e);}}async patch(e,r,t){try{let s=this.getFullURL(e),n=await fetch(s,this.createRequestInit("PATCH",r,t));if(!n.ok)throw n;return this.convertResponse(n)}catch(s){this.handleError(s,"PATCH",e);}}};export{i as FetchRequestor};//# sourceMappingURL=index.mjs.map
1
+ import { createRequestError } from '@ureq/core';
2
+
3
+ // src/index.ts
4
+ var FetchRequestor = class {
5
+ constructor(options) {
6
+ this.baseURL = options?.baseURL || "";
7
+ this.defaultHeaders = options?.defaultHeaders || {};
8
+ }
9
+ getFullURL(url) {
10
+ return this.baseURL ? new URL(url, this.baseURL).toString() : url;
11
+ }
12
+ async parseResponseByType(response, responseType = "json") {
13
+ switch (responseType) {
14
+ case "text":
15
+ return await response.text();
16
+ case "blob":
17
+ return await response.blob();
18
+ case "arraybuffer":
19
+ return await response.arrayBuffer();
20
+ case "formData":
21
+ return await response.formData();
22
+ case "json":
23
+ default:
24
+ const text = await response.text();
25
+ try {
26
+ return JSON.parse(text);
27
+ } catch {
28
+ return text;
29
+ }
30
+ }
31
+ }
32
+ async convertResponse(response, options) {
33
+ let data;
34
+ if (options?.responseTransformer) {
35
+ data = await options.responseTransformer(response);
36
+ } else {
37
+ data = await this.parseResponseByType(response, options?.responseType);
38
+ }
39
+ return {
40
+ data,
41
+ status: response.status,
42
+ statusText: response.statusText,
43
+ headers: Object.fromEntries(response.headers.entries())
44
+ };
45
+ }
46
+ handleError(error, method, url) {
47
+ throw createRequestError(error, { method, url });
48
+ }
49
+ createRequestInit(method, data, options) {
50
+ const { headers: optionHeaders, responseType, responseTransformer, ...restOptions } = options || {};
51
+ return {
52
+ method,
53
+ headers: {
54
+ "Content-Type": "application/json",
55
+ ...this.defaultHeaders,
56
+ ...optionHeaders
57
+ },
58
+ body: data ? JSON.stringify(data) : void 0,
59
+ signal: options?.signal,
60
+ credentials: "same-origin",
61
+ ...restOptions
62
+ };
63
+ }
64
+ async get(url, options) {
65
+ try {
66
+ const fullUrl = this.getFullURL(url);
67
+ const response = await fetch(
68
+ fullUrl,
69
+ this.createRequestInit("GET", void 0, options)
70
+ );
71
+ if (!response.ok) {
72
+ throw response;
73
+ }
74
+ return this.convertResponse(response, options);
75
+ } catch (error) {
76
+ this.handleError(error, "GET", url);
77
+ }
78
+ }
79
+ async post(url, data, options) {
80
+ try {
81
+ const fullUrl = this.getFullURL(url);
82
+ const response = await fetch(
83
+ fullUrl,
84
+ this.createRequestInit("POST", data, options)
85
+ );
86
+ if (!response.ok) {
87
+ throw response;
88
+ }
89
+ return this.convertResponse(response, options);
90
+ } catch (error) {
91
+ this.handleError(error, "POST", url);
92
+ }
93
+ }
94
+ async put(url, data, options) {
95
+ try {
96
+ const fullUrl = this.getFullURL(url);
97
+ const response = await fetch(
98
+ fullUrl,
99
+ this.createRequestInit("PUT", data, options)
100
+ );
101
+ if (!response.ok) {
102
+ throw response;
103
+ }
104
+ return this.convertResponse(response, options);
105
+ } catch (error) {
106
+ this.handleError(error, "PUT", url);
107
+ }
108
+ }
109
+ async delete(url, options) {
110
+ try {
111
+ const fullUrl = this.getFullURL(url);
112
+ const response = await fetch(
113
+ fullUrl,
114
+ this.createRequestInit("DELETE", void 0, options)
115
+ );
116
+ if (!response.ok) {
117
+ throw response;
118
+ }
119
+ return this.convertResponse(response, options);
120
+ } catch (error) {
121
+ this.handleError(error, "DELETE", url);
122
+ }
123
+ }
124
+ async patch(url, data, options) {
125
+ try {
126
+ const fullUrl = this.getFullURL(url);
127
+ const response = await fetch(
128
+ fullUrl,
129
+ this.createRequestInit("PATCH", data, options)
130
+ );
131
+ if (!response.ok) {
132
+ throw response;
133
+ }
134
+ return this.convertResponse(response, options);
135
+ } catch (error) {
136
+ this.handleError(error, "PATCH", url);
137
+ }
138
+ }
139
+ };
140
+
141
+ export { FetchRequestor };
142
+ //# sourceMappingURL=index.mjs.map
2
143
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["FetchRequestor","options","url","response","data","error","method","createRequestError","fullUrl"],"mappings":"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","file":"index.mjs","sourcesContent":["import { Requestor, RequestOptions, Response, RequestError, createRequestError } from '@ureq/core';\n\nexport interface FetchRequestorOptions {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class FetchRequestor implements Requestor {\n private baseURL: string;\n private defaultHeaders: Record<string, string>;\n\n constructor(options?: FetchRequestorOptions) {\n this.baseURL = options?.baseURL || '';\n this.defaultHeaders = options?.defaultHeaders || {};\n }\n\n private getFullURL(url: string): string {\n return this.baseURL ? new URL(url, this.baseURL).toString() : url;\n }\n\n private async convertResponse<T>(response: globalThis.Response): Promise<Response<T>> {\n let data: T;\n \n try {\n data = await response.json();\n } catch {\n data = await response.text() as any;\n }\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n };\n }\n\n private handleError(error: any, method?: string, url?: string): never {\n throw createRequestError(error, { method, url });\n }\n\n private createRequestInit(\n method: string,\n data?: any,\n options?: RequestOptions\n ): RequestInit {\n return {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...options?.headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: options?.signal,\n credentials: 'same-origin',\n ...options,\n };\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('GET', undefined, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('POST', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('PUT', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('DELETE', undefined, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('PATCH', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\n return this.convertResponse(response);\n } catch (error) {\n this.handleError(error, 'PATCH', url);\n }\n }\n\n // 实现其他方法...\n} "]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { Requestor, RequestOptions, Response, ResponseType, createRequestError } from '@ureq/core';\n\nexport interface FetchRequestorOptions {\n baseURL?: string;\n defaultHeaders?: Record<string, string>;\n}\n\nexport class FetchRequestor implements Requestor {\n private baseURL: string;\n private defaultHeaders: Record<string, string>;\n\n constructor(options?: FetchRequestorOptions) {\n this.baseURL = options?.baseURL || '';\n this.defaultHeaders = options?.defaultHeaders || {};\n }\n\n private getFullURL(url: string): string {\n return this.baseURL ? new URL(url, this.baseURL).toString() : url;\n }\n\n private async parseResponseByType<T>(\n response: globalThis.Response,\n responseType: ResponseType = 'json'\n ): Promise<T> {\n switch (responseType) {\n case 'text':\n return (await response.text()) as T;\n case 'blob':\n return (await response.blob()) as T;\n case 'arraybuffer':\n return (await response.arrayBuffer()) as T;\n case 'formData':\n return (await response.formData()) as T;\n case 'json':\n default:\n // 先读取为 text,再尝试解析为 JSON,兼容返回非 JSON 的情况\n const text = await response.text();\n try {\n return JSON.parse(text);\n } catch {\n return text as T;\n }\n }\n }\n\n private async convertResponse<T>(\n response: globalThis.Response,\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 = await this.parseResponseByType<T>(response, options?.responseType);\n }\n\n return {\n data,\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n };\n }\n\n private handleError(error: any, method?: string, url?: string): never {\n throw createRequestError(error, { method, url });\n }\n\n private createRequestInit(\n method: string,\n data?: any,\n options?: RequestOptions\n ): RequestInit {\n // 解构出需要特殊处理的选项\n const { headers: optionHeaders, responseType, responseTransformer, ...restOptions } = options || {};\n\n return {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...optionHeaders,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: options?.signal,\n credentials: 'same-origin',\n ...restOptions,\n };\n }\n\n async get<T>(url: string, options?: RequestOptions): Promise<Response<T>> {\n try {\n const fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('GET', undefined, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('POST', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('PUT', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('DELETE', undefined, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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 fullUrl = this.getFullURL(url);\n const response = await fetch(\n fullUrl,\n this.createRequestInit('PATCH', data, options)\n );\n\n if (!response.ok) {\n throw response;\n }\n\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-fetch",
3
- "version": "0.0.3-alpha.0",
3
+ "version": "0.0.4",
4
4
  "description": "Fetch implementation for universal request library",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -19,7 +19,7 @@
19
19
  "access": "public"
20
20
  },
21
21
  "dependencies": {
22
- "@ureq/core": "0.0.3-alpha.0"
22
+ "@ureq/core": "0.0.4"
23
23
  },
24
24
  "devDependencies": {
25
25
  "tsup": "^8.3.6",
@@ -28,6 +28,6 @@
28
28
  "scripts": {
29
29
  "build": "tsup --config tsup.config.ts",
30
30
  "dev": "tsup --watch",
31
- "test": "vitest"
31
+ "test": "vitest --run"
32
32
  }
33
33
  }