@ureq/impl-fetch 0.0.3 → 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 CHANGED
@@ -17,7 +17,7 @@ import { Request } from '@ureq/core';
17
17
  import { FetchRequestor } from '@ureq/impl-fetch';
18
18
 
19
19
  const request = new Request(new FetchRequestor({
20
- baseURL: 'https://api.example.com',
20
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1',
21
21
  headers: {
22
22
  'Content-Type': 'application/json'
23
23
  },
@@ -31,10 +31,9 @@ const users = await request.get('/users');
31
31
  ## 配置选项
32
32
 
33
33
  ```typescript
34
- interface FetchRequestorConfig {
35
- baseURL?: string; // API 基础 URL
36
- headers?: Record<string, string>; // 默认请求头
37
- timeout?: number; // 超时时间(毫秒)
34
+ interface FetchRequestorOptions {
35
+ baseURL?: string; // API 基础 URL
36
+ defaultHeaders?: Record<string, string>; // 默认请求头
38
37
  }
39
38
  ```
40
39
 
@@ -60,7 +59,7 @@ interface FetchRequestorConfig {
60
59
 
61
60
  ```typescript
62
61
  const requestor = new FetchRequestor({
63
- baseURL: 'https://api.example.com'
62
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1'
64
63
  });
65
64
 
66
65
  const request = new Request(requestor);
@@ -71,20 +70,29 @@ const data = await request.get('/users');
71
70
 
72
71
  ```typescript
73
72
  const requestor = new FetchRequestor({
74
- baseURL: 'https://api.example.com',
75
- headers: {
73
+ baseURL: 'https://jsonplaceholder.typicode.com/todos/1',
74
+ defaultHeaders: {
76
75
  'Authorization': 'Bearer your-token'
77
76
  }
78
77
  });
79
78
  ```
80
79
 
81
- ### 超时控制
80
+ ### 使用拦截器添加超时
82
81
 
83
82
  ```typescript
84
- const requestor = new FetchRequestor({
85
- baseURL: 'https://api.example.com',
86
- timeout: 10000 // 10 秒超时
87
- });
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
+ );
88
96
  ```
89
97
 
90
98
  ## 文档
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
@@ -11,12 +11,32 @@ var FetchRequestor = class {
11
11
  getFullURL(url) {
12
12
  return this.baseURL ? new URL(url, this.baseURL).toString() : url;
13
13
  }
14
- async convertResponse(response) {
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) {
15
35
  let data;
16
- try {
17
- data = await response.json();
18
- } catch {
19
- data = await response.text();
36
+ if (options?.responseTransformer) {
37
+ data = await options.responseTransformer(response);
38
+ } else {
39
+ data = await this.parseResponseByType(response, options?.responseType);
20
40
  }
21
41
  return {
22
42
  data,
@@ -29,17 +49,18 @@ var FetchRequestor = class {
29
49
  throw core.createRequestError(error, { method, url });
30
50
  }
31
51
  createRequestInit(method, data, options) {
52
+ const { headers: optionHeaders, responseType, responseTransformer, ...restOptions } = options || {};
32
53
  return {
33
54
  method,
34
55
  headers: {
35
56
  "Content-Type": "application/json",
36
57
  ...this.defaultHeaders,
37
- ...options?.headers
58
+ ...optionHeaders
38
59
  },
39
60
  body: data ? JSON.stringify(data) : void 0,
40
61
  signal: options?.signal,
41
62
  credentials: "same-origin",
42
- ...options
63
+ ...restOptions
43
64
  };
44
65
  }
45
66
  async get(url, options) {
@@ -52,7 +73,7 @@ var FetchRequestor = class {
52
73
  if (!response.ok) {
53
74
  throw response;
54
75
  }
55
- return this.convertResponse(response);
76
+ return this.convertResponse(response, options);
56
77
  } catch (error) {
57
78
  this.handleError(error, "GET", url);
58
79
  }
@@ -67,7 +88,7 @@ var FetchRequestor = class {
67
88
  if (!response.ok) {
68
89
  throw response;
69
90
  }
70
- return this.convertResponse(response);
91
+ return this.convertResponse(response, options);
71
92
  } catch (error) {
72
93
  this.handleError(error, "POST", url);
73
94
  }
@@ -82,7 +103,7 @@ var FetchRequestor = class {
82
103
  if (!response.ok) {
83
104
  throw response;
84
105
  }
85
- return this.convertResponse(response);
106
+ return this.convertResponse(response, options);
86
107
  } catch (error) {
87
108
  this.handleError(error, "PUT", url);
88
109
  }
@@ -97,7 +118,7 @@ var FetchRequestor = class {
97
118
  if (!response.ok) {
98
119
  throw response;
99
120
  }
100
- return this.convertResponse(response);
121
+ return this.convertResponse(response, options);
101
122
  } catch (error) {
102
123
  this.handleError(error, "DELETE", url);
103
124
  }
@@ -112,12 +133,11 @@ var FetchRequestor = class {
112
133
  if (!response.ok) {
113
134
  throw response;
114
135
  }
115
- return this.convertResponse(response);
136
+ return this.convertResponse(response, options);
116
137
  } catch (error) {
117
138
  this.handleError(error, "PATCH", url);
118
139
  }
119
140
  }
120
- // 实现其他方法...
121
141
  };
122
142
 
123
143
  exports.FetchRequestor = FetchRequestor;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["createRequestError"],"mappings":";;;;;AAOO,IAAM,iBAAN,MAA0C;AAAA,EAI/C,YAAY,OAAiC,EAAA;AAC3C,IAAK,IAAA,CAAA,OAAA,GAAU,SAAS,OAAW,IAAA,EAAA;AACnC,IAAK,IAAA,CAAA,cAAA,GAAiB,OAAS,EAAA,cAAA,IAAkB,EAAC;AAAA;AACpD,EAEQ,WAAW,GAAqB,EAAA;AACtC,IAAO,OAAA,IAAA,CAAK,UAAU,IAAI,GAAA,CAAI,KAAK,IAAK,CAAA,OAAO,CAAE,CAAA,QAAA,EAAa,GAAA,GAAA;AAAA;AAChE,EAEA,MAAc,gBAAmB,QAAqD,EAAA;AACpF,IAAI,IAAA,IAAA;AAEJ,IAAI,IAAA;AACF,MAAO,IAAA,GAAA,MAAM,SAAS,IAAK,EAAA;AAAA,KACrB,CAAA,MAAA;AACN,MAAO,IAAA,GAAA,MAAM,SAAS,IAAK,EAAA;AAAA;AAG7B,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAQ,QAAS,CAAA,MAAA;AAAA,MACjB,YAAY,QAAS,CAAA,UAAA;AAAA,MACrB,SAAS,MAAO,CAAA,WAAA,CAAY,QAAS,CAAA,OAAA,CAAQ,SAAS;AAAA,KACxD;AAAA;AACF,EAEQ,WAAA,CAAY,KAAY,EAAA,MAAA,EAAiB,GAAqB,EAAA;AACpE,IAAA,MAAMA,uBAAmB,CAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA;AACjD,EAEQ,iBAAA,CACN,MACA,EAAA,IAAA,EACA,OACa,EAAA;AACb,IAAO,OAAA;AAAA,MACL,MAAA;AAAA,MACA,OAAS,EAAA;AAAA,QACP,cAAgB,EAAA,kBAAA;AAAA,QAChB,GAAG,IAAK,CAAA,cAAA;AAAA,QACR,GAAG,OAAS,EAAA;AAAA,OACd;AAAA,MACA,IAAM,EAAA,IAAA,GAAO,IAAK,CAAA,SAAA,CAAU,IAAI,CAAI,GAAA,MAAA;AAAA,MACpC,QAAQ,OAAS,EAAA,MAAA;AAAA,MACjB,WAAa,EAAA,aAAA;AAAA,MACb,GAAG;AAAA,KACL;AAAA;AACF,EAEA,MAAM,GAAO,CAAA,GAAA,EAAa,OAAgD,EAAA;AACxE,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAAU,IAAK,CAAA,UAAA,CAAW,GAAG,CAAA;AACnC,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,OAAA;AAAA,QACA,IAAK,CAAA,iBAAA,CAAkB,KAAO,EAAA,KAAA,CAAA,EAAW,OAAO;AAAA,OAClD;AAEA,MAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,QAAM,MAAA,QAAA;AAAA;AAGR,MAAO,OAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,aAC7B,KAAO,EAAA;AACd,MAAK,IAAA,CAAA,WAAA,CAAY,KAAO,EAAA,KAAA,EAAO,GAAG,CAAA;AAAA;AACpC;AACF,EAEA,MAAM,IAAA,CAAQ,GAAa,EAAA,IAAA,EAAY,OAAgD,EAAA;AACrF,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAAU,IAAK,CAAA,UAAA,CAAW,GAAG,CAAA;AACnC,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,OAAA;AAAA,QACA,IAAK,CAAA,iBAAA,CAAkB,MAAQ,EAAA,IAAA,EAAM,OAAO;AAAA,OAC9C;AAEA,MAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,QAAM,MAAA,QAAA;AAAA;AAGR,MAAO,OAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,aAC7B,KAAO,EAAA;AACd,MAAK,IAAA,CAAA,WAAA,CAAY,KAAO,EAAA,MAAA,EAAQ,GAAG,CAAA;AAAA;AACrC;AACF,EAEA,MAAM,GAAA,CAAO,GAAa,EAAA,IAAA,EAAY,OAAgD,EAAA;AACpF,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAAU,IAAK,CAAA,UAAA,CAAW,GAAG,CAAA;AACnC,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,OAAA;AAAA,QACA,IAAK,CAAA,iBAAA,CAAkB,KAAO,EAAA,IAAA,EAAM,OAAO;AAAA,OAC7C;AAEA,MAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,QAAM,MAAA,QAAA;AAAA;AAGR,MAAO,OAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,aAC7B,KAAO,EAAA;AACd,MAAK,IAAA,CAAA,WAAA,CAAY,KAAO,EAAA,KAAA,EAAO,GAAG,CAAA;AAAA;AACpC;AACF,EAEA,MAAM,MAAU,CAAA,GAAA,EAAa,OAAgD,EAAA;AAC3E,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAAU,IAAK,CAAA,UAAA,CAAW,GAAG,CAAA;AACnC,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,OAAA;AAAA,QACA,IAAK,CAAA,iBAAA,CAAkB,QAAU,EAAA,KAAA,CAAA,EAAW,OAAO;AAAA,OACrD;AAEA,MAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,QAAM,MAAA,QAAA;AAAA;AAGR,MAAO,OAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,aAC7B,KAAO,EAAA;AACd,MAAK,IAAA,CAAA,WAAA,CAAY,KAAO,EAAA,QAAA,EAAU,GAAG,CAAA;AAAA;AACvC;AACF,EAEA,MAAM,KAAA,CAAS,GAAa,EAAA,IAAA,EAAY,OAAgD,EAAA;AACtF,IAAI,IAAA;AACF,MAAM,MAAA,OAAA,GAAU,IAAK,CAAA,UAAA,CAAW,GAAG,CAAA;AACnC,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,OAAA;AAAA,QACA,IAAK,CAAA,iBAAA,CAAkB,OAAS,EAAA,IAAA,EAAM,OAAO;AAAA,OAC/C;AAEA,MAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,QAAM,MAAA,QAAA;AAAA;AAGR,MAAO,OAAA,IAAA,CAAK,gBAAgB,QAAQ,CAAA;AAAA,aAC7B,KAAO,EAAA;AACd,MAAK,IAAA,CAAA,WAAA,CAAY,KAAO,EAAA,OAAA,EAAS,GAAG,CAAA;AAAA;AACtC;AACF;AAGF","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
@@ -9,12 +9,32 @@ var FetchRequestor = class {
9
9
  getFullURL(url) {
10
10
  return this.baseURL ? new URL(url, this.baseURL).toString() : url;
11
11
  }
12
- async convertResponse(response) {
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) {
13
33
  let data;
14
- try {
15
- data = await response.json();
16
- } catch {
17
- data = await response.text();
34
+ if (options?.responseTransformer) {
35
+ data = await options.responseTransformer(response);
36
+ } else {
37
+ data = await this.parseResponseByType(response, options?.responseType);
18
38
  }
19
39
  return {
20
40
  data,
@@ -27,17 +47,18 @@ var FetchRequestor = class {
27
47
  throw createRequestError(error, { method, url });
28
48
  }
29
49
  createRequestInit(method, data, options) {
50
+ const { headers: optionHeaders, responseType, responseTransformer, ...restOptions } = options || {};
30
51
  return {
31
52
  method,
32
53
  headers: {
33
54
  "Content-Type": "application/json",
34
55
  ...this.defaultHeaders,
35
- ...options?.headers
56
+ ...optionHeaders
36
57
  },
37
58
  body: data ? JSON.stringify(data) : void 0,
38
59
  signal: options?.signal,
39
60
  credentials: "same-origin",
40
- ...options
61
+ ...restOptions
41
62
  };
42
63
  }
43
64
  async get(url, options) {
@@ -50,7 +71,7 @@ var FetchRequestor = class {
50
71
  if (!response.ok) {
51
72
  throw response;
52
73
  }
53
- return this.convertResponse(response);
74
+ return this.convertResponse(response, options);
54
75
  } catch (error) {
55
76
  this.handleError(error, "GET", url);
56
77
  }
@@ -65,7 +86,7 @@ var FetchRequestor = class {
65
86
  if (!response.ok) {
66
87
  throw response;
67
88
  }
68
- return this.convertResponse(response);
89
+ return this.convertResponse(response, options);
69
90
  } catch (error) {
70
91
  this.handleError(error, "POST", url);
71
92
  }
@@ -80,7 +101,7 @@ var FetchRequestor = class {
80
101
  if (!response.ok) {
81
102
  throw response;
82
103
  }
83
- return this.convertResponse(response);
104
+ return this.convertResponse(response, options);
84
105
  } catch (error) {
85
106
  this.handleError(error, "PUT", url);
86
107
  }
@@ -95,7 +116,7 @@ var FetchRequestor = class {
95
116
  if (!response.ok) {
96
117
  throw response;
97
118
  }
98
- return this.convertResponse(response);
119
+ return this.convertResponse(response, options);
99
120
  } catch (error) {
100
121
  this.handleError(error, "DELETE", url);
101
122
  }
@@ -110,12 +131,11 @@ var FetchRequestor = class {
110
131
  if (!response.ok) {
111
132
  throw response;
112
133
  }
113
- return this.convertResponse(response);
134
+ return this.convertResponse(response, options);
114
135
  } catch (error) {
115
136
  this.handleError(error, "PATCH", url);
116
137
  }
117
138
  }
118
- // 实现其他方法...
119
139
  };
120
140
 
121
141
  export { FetchRequestor };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":[],"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",
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"
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
  }