@ahoo-wang/fetcher 0.0.8 → 0.1.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,cAAc,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EACL,cAAc,EAGd,cAAc,EAEd,YAAY,EACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cACf,SAAQ,cAAc,EACpB,cAAc,EACd,cAAc;CAAG;AASrB;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,cAAc,EAAE,WAAW;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACnC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,OAAQ,YAAW,cAAc,EAAE,cAAc;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,UAAU,CAAa;IAC/B,YAAY,EAAE,mBAAmB,CAA6B;IAE9D;;;;OAIG;gBACS,OAAO,GAAE,cAA+B;IAMpD;;;;;;OAMG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoCzE;;;;;;;;;;OAUG;YACW,YAAY;IAoC1B;;;;;;OAMG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAM,GAC1E,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,IAAI,CACR,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAM,GACtD,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAM,GACtD,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,MAAM,CACV,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAM,GACtD,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,KAAK,CACT,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAM,GACtD,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,IAAI,CACR,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAM,GAC1E,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,OAAO,CACX,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAM,GAC1E,OAAO,CAAC,QAAQ,CAAC;CAMrB"}
1
+ {"version":3,"file":"fetcher.d.ts","sourceRoot":"","sources":["../src/fetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,cAAc,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,EACL,cAAc,EAGd,cAAc,EAEd,YAAY,EACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,cACf,SAAQ,cAAc,EACpB,cAAc,EACd,cAAc;CAAG;AAWrB;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,cAAc,EAAE,WAAW;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACnC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,OAAQ,YAAW,cAAc,EAAE,cAAc;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAkB;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,UAAU,CAAa;IAC/B,YAAY,EAAE,mBAAmB,CAA6B;IAE9D;;;;OAIG;gBACS,OAAO,GAAE,cAA+B;IASpD;;;;;;OAMG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmCzE;;;;;;;;;;OAUG;YACW,YAAY;IAoC1B;;;;;;OAMG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAM,GAC1E,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,IAAI,CACR,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAM,GACtD,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,GAAG,CACP,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAM,GACtD,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,MAAM,CACV,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAM,GACtD,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,KAAK,CACT,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,CAAM,GACtD,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,IAAI,CACR,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAM,GAC1E,OAAO,CAAC,QAAQ,CAAC;IAOpB;;;;;;OAMG;IACG,OAAO,CACX,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAM,GAC1E,OAAO,CAAC,QAAQ,CAAC;CAMrB"}
package/dist/index.es.js CHANGED
@@ -1,10 +1,10 @@
1
- function d(r) {
1
+ function y(r) {
2
2
  return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(r);
3
3
  }
4
- function m(r, e) {
5
- return d(e) ? e : e ? r.replace(/\/?\/$/, "") + "/" + e.replace(/^\/+/, "") : r;
4
+ function T(r, e) {
5
+ return y(e) ? e : e ? r.replace(/\/?\/$/, "") + "/" + e.replace(/^\/+/, "") : r;
6
6
  }
7
- class T {
7
+ class b {
8
8
  /**
9
9
  * 创建UrlBuilder实例
10
10
  *
@@ -22,11 +22,11 @@ class T {
22
22
  * @returns 完整的URL字符串
23
23
  * @throws 当路径参数中缺少必需的占位符时抛出错误
24
24
  */
25
- build(e, t, s) {
26
- let i = m(this.baseURL, e), o = this.interpolateUrl(i, t);
27
- if (s) {
28
- const n = new URLSearchParams(s).toString();
29
- n && (o += "?" + n);
25
+ build(e, t, n) {
26
+ let s = T(this.baseURL, e), o = this.interpolateUrl(s, t);
27
+ if (n) {
28
+ const i = new URLSearchParams(n).toString();
29
+ i && (o += "?" + i);
30
30
  }
31
31
  return o;
32
32
  }
@@ -39,10 +39,10 @@ class T {
39
39
  * @throws 当路径参数中缺少必需的占位符时抛出错误
40
40
  */
41
41
  interpolateUrl(e, t) {
42
- return t ? e.replace(/{([^}]+)}/g, (s, i) => {
43
- const o = t[i];
42
+ return t ? e.replace(/{([^}]+)}/g, (n, s) => {
43
+ const o = t[s];
44
44
  if (o === void 0)
45
- throw new Error(`Missing required path parameter: ${i}`);
45
+ throw new Error(`Missing required path parameter: ${s}`);
46
46
  return String(o);
47
47
  }) : e;
48
48
  }
@@ -50,15 +50,15 @@ class T {
50
50
  function E(r, e) {
51
51
  return typeof r < "u" ? r : e;
52
52
  }
53
- class h extends Error {
54
- constructor(e, t, s) {
55
- const i = `Request timeout of ${s}ms exceeded for ${t?.method || "GET"} ${e}`;
56
- super(i), this.name = "FetchTimeoutError", this.url = e, this.request = t, Object.setPrototypeOf(this, h.prototype);
53
+ class d extends Error {
54
+ constructor(e, t, n) {
55
+ const s = `Request timeout of ${n}ms exceeded for ${t?.method || "GET"} ${e}`;
56
+ super(s), this.name = "FetchTimeoutError", this.url = e, this.request = t, Object.setPrototypeOf(this, d.prototype);
57
57
  }
58
58
  }
59
59
  var c = /* @__PURE__ */ ((r) => (r.GET = "GET", r.POST = "POST", r.PUT = "PUT", r.DELETE = "DELETE", r.PATCH = "PATCH", r.HEAD = "HEAD", r.OPTIONS = "OPTIONS", r))(c || {}), P = /* @__PURE__ */ ((r) => (r.METHOD = "method", r.BODY = "body", r))(P || {});
60
- const b = "Content-Type";
61
- var p = /* @__PURE__ */ ((r) => (r.APPLICATION_JSON = "application/json", r.TEXT_EVENT_STREAM = "text/event-stream", r))(p || {});
60
+ const h = "Content-Type";
61
+ var f = /* @__PURE__ */ ((r) => (r.APPLICATION_JSON = "application/json", r.TEXT_EVENT_STREAM = "text/event-stream", r))(f || {});
62
62
  class a {
63
63
  constructor() {
64
64
  this.interceptors = [];
@@ -92,21 +92,54 @@ class a {
92
92
  */
93
93
  async intercept(e) {
94
94
  let t = e;
95
- for (let s of this.interceptors)
96
- s && (t = await s.intercept(t));
95
+ for (let n of this.interceptors)
96
+ n && (t = await n.intercept(t));
97
97
  return t;
98
98
  }
99
99
  }
100
- class y {
100
+ class O {
101
101
  constructor() {
102
102
  this.request = new a(), this.response = new a(), this.error = new a();
103
103
  }
104
104
  }
105
- const O = {
106
- baseURL: "",
107
- headers: {
108
- ContentTypeHeader: p.APPLICATION_JSON
105
+ class w {
106
+ /**
107
+ * 尝试转换请求体为合法的 fetch API body 类型
108
+ *
109
+ * 根据 Fetch API 规范,body 可以是多种类型,但对于普通对象,需要转换为 JSON 字符串
110
+ * https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#setting_a_body
111
+ *
112
+ * 支持的类型:
113
+ * - a string
114
+ * - ArrayBuffer
115
+ * - TypedArray
116
+ * - DataView
117
+ * - Blob
118
+ * - File
119
+ * - URLSearchParams
120
+ * - FormData
121
+ * - ReadableStream
122
+ *
123
+ * 对于不支持的 object 类型(如普通对象),将自动转换为 JSON 字符串
124
+ *
125
+ * @param request 请求参数
126
+ * @returns 转换后的请求
127
+ */
128
+ intercept(e) {
129
+ if (e.body === void 0 || e.body === null || typeof e.body != "object" || e.body instanceof ArrayBuffer || ArrayBuffer.isView(e.body) || // 包括 TypedArray 和 DataView
130
+ e.body instanceof Blob || e.body instanceof File || e.body instanceof URLSearchParams || e.body instanceof FormData || e.body instanceof ReadableStream)
131
+ return e;
132
+ const t = { ...e };
133
+ t.body = JSON.stringify(e.body), t.headers || (t.headers = {});
134
+ const n = t.headers;
135
+ return n[h] || (n[h] = f.APPLICATION_JSON), t;
109
136
  }
137
+ }
138
+ const l = {
139
+ [h]: f.APPLICATION_JSON
140
+ }, A = {
141
+ baseURL: "",
142
+ headers: l
110
143
  };
111
144
  class g {
112
145
  /**
@@ -114,8 +147,8 @@ class g {
114
147
  *
115
148
  * @param options - Fetcher配置选项
116
149
  */
117
- constructor(e = O) {
118
- this.interceptors = new y(), this.urlBuilder = new T(e.baseURL), this.headers = e.headers, this.timeout = e.timeout;
150
+ constructor(e = A) {
151
+ this.headers = l, this.interceptors = new O(), this.urlBuilder = new b(e.baseURL), e.headers !== void 0 && (this.headers = e.headers), this.timeout = e.timeout, this.interceptors.request.use(new w());
119
152
  }
120
153
  /**
121
154
  * 发起HTTP请求
@@ -125,25 +158,25 @@ class g {
125
158
  * @returns Promise<Response> HTTP响应
126
159
  */
127
160
  async fetch(e, t = {}) {
128
- const s = {
161
+ const n = {
129
162
  ...this.headers || {},
130
163
  ...t.headers || {}
131
164
  };
132
- let i = {
165
+ let s = {
133
166
  ...t,
134
- headers: Object.keys(s).length > 0 ? s : void 0
167
+ headers: Object.keys(n).length > 0 ? n : void 0
135
168
  };
136
- const o = this.urlBuilder.build(
137
- e,
138
- t.pathParams,
139
- t.queryParams
140
- );
141
- i = await this.interceptors.request.intercept(i);
142
169
  try {
143
- let n = await this.timeoutFetch(o, i);
144
- return n = await this.interceptors.response.intercept(n), n;
145
- } catch (n) {
146
- throw await this.interceptors.error.intercept(n);
170
+ s = await this.interceptors.request.intercept(s);
171
+ const o = this.urlBuilder.build(
172
+ e,
173
+ t.pathParams,
174
+ t.queryParams
175
+ );
176
+ let i = await this.timeoutFetch(o, s);
177
+ return i = await this.interceptors.response.intercept(i), i;
178
+ } catch (o) {
179
+ throw await this.interceptors.error.intercept(o);
147
180
  }
148
181
  }
149
182
  /**
@@ -158,25 +191,25 @@ class g {
158
191
  * @throws FetchTimeoutError 当请求超时时抛出
159
192
  */
160
193
  async timeoutFetch(e, t) {
161
- const s = E(t.timeout, this.timeout);
162
- if (!s)
194
+ const n = E(t.timeout, this.timeout);
195
+ if (!n)
163
196
  return fetch(e, t);
164
- const i = new AbortController(), o = {
197
+ const s = new AbortController(), o = {
165
198
  ...t,
166
- signal: i.signal
199
+ signal: s.signal
167
200
  };
168
- let n = null;
169
- const u = new Promise((w, f) => {
170
- n = setTimeout(() => {
171
- n && clearTimeout(n);
172
- const l = new h(e, t, s);
173
- i.abort(l), f(l);
174
- }, s);
201
+ let i = null;
202
+ const p = new Promise((S, m) => {
203
+ i = setTimeout(() => {
204
+ i && clearTimeout(i);
205
+ const u = new d(e, t, n);
206
+ s.abort(u), m(u);
207
+ }, n);
175
208
  });
176
209
  try {
177
- return await Promise.race([fetch(e, o), u]);
210
+ return await Promise.race([fetch(e, o), p]);
178
211
  } finally {
179
- n && clearTimeout(n);
212
+ i && clearTimeout(i);
180
213
  }
181
214
  }
182
215
  /**
@@ -272,16 +305,16 @@ class g {
272
305
  }
273
306
  }
274
307
  export {
275
- b as ContentTypeHeader,
276
- p as ContentTypeValues,
277
- h as FetchTimeoutError,
308
+ h as ContentTypeHeader,
309
+ f as ContentTypeValues,
310
+ d as FetchTimeoutError,
278
311
  g as Fetcher,
279
- y as FetcherInterceptors,
312
+ O as FetcherInterceptors,
280
313
  c as HttpMethod,
281
314
  a as InterceptorManager,
282
315
  P as RequestField,
283
- T as UrlBuilder,
284
- m as combineURLs,
285
- d as isAbsoluteURL,
316
+ b as UrlBuilder,
317
+ T as combineURLs,
318
+ y as isAbsoluteURL,
286
319
  E as resolveTimeout
287
320
  };
package/dist/index.umd.js CHANGED
@@ -1 +1 @@
1
- (function(n,h){typeof exports=="object"&&typeof module<"u"?h(exports):typeof define=="function"&&define.amd?define(["exports"],h):(n=typeof globalThis<"u"?globalThis:n||self,h(n.Fetcher={}))})(this,(function(n){"use strict";function h(r){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(r)}function f(r,e){return h(e)?e:e?r.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):r}class m{constructor(e){this.baseURL=e}build(e,t,s){let o=f(this.baseURL,e),a=this.interpolateUrl(o,t);if(s){const i=new URLSearchParams(s).toString();i&&(a+="?"+i)}return a}interpolateUrl(e,t){return t?e.replace(/{([^}]+)}/g,(s,o)=>{const a=t[o];if(a===void 0)throw new Error(`Missing required path parameter: ${o}`);return String(a)}):e}}function p(r,e){return typeof r<"u"?r:e}class u extends Error{constructor(e,t,s){const o=`Request timeout of ${s}ms exceeded for ${t?.method||"GET"} ${e}`;super(o),this.name="FetchTimeoutError",this.url=e,this.request=t,Object.setPrototypeOf(this,u.prototype)}}var c=(r=>(r.GET="GET",r.POST="POST",r.PUT="PUT",r.DELETE="DELETE",r.PATCH="PATCH",r.HEAD="HEAD",r.OPTIONS="OPTIONS",r))(c||{}),T=(r=>(r.METHOD="method",r.BODY="body",r))(T||{});const O="Content-Type";var d=(r=>(r.APPLICATION_JSON="application/json",r.TEXT_EVENT_STREAM="text/event-stream",r))(d||{});class l{constructor(){this.interceptors=[]}use(e){const t=this.interceptors.length;return this.interceptors.push(e),t}eject(e){this.interceptors[e]&&(this.interceptors[e]=null)}clear(){this.interceptors=[]}async intercept(e){let t=e;for(let s of this.interceptors)s&&(t=await s.intercept(t));return t}}class E{constructor(){this.request=new l,this.response=new l,this.error=new l}}const b={baseURL:"",headers:{ContentTypeHeader:d.APPLICATION_JSON}};class w{constructor(e=b){this.interceptors=new E,this.urlBuilder=new m(e.baseURL),this.headers=e.headers,this.timeout=e.timeout}async fetch(e,t={}){const s={...this.headers||{},...t.headers||{}};let o={...t,headers:Object.keys(s).length>0?s:void 0};const a=this.urlBuilder.build(e,t.pathParams,t.queryParams);o=await this.interceptors.request.intercept(o);try{let i=await this.timeoutFetch(a,o);return i=await this.interceptors.response.intercept(i),i}catch(i){throw await this.interceptors.error.intercept(i)}}async timeoutFetch(e,t){const s=p(t.timeout,this.timeout);if(!s)return fetch(e,t);const o=new AbortController,a={...t,signal:o.signal};let i=null;const y=new Promise((S,g)=>{i=setTimeout(()=>{i&&clearTimeout(i);const P=new u(e,t,s);o.abort(P),g(P)},s)});try{return await Promise.race([fetch(e,a),y])}finally{i&&clearTimeout(i)}}async get(e,t={}){return this.fetch(e,{...t,method:c.GET})}async post(e,t={}){return this.fetch(e,{...t,method:c.POST})}async put(e,t={}){return this.fetch(e,{...t,method:c.PUT})}async delete(e,t={}){return this.fetch(e,{...t,method:c.DELETE})}async patch(e,t={}){return this.fetch(e,{...t,method:c.PATCH})}async head(e,t={}){return this.fetch(e,{...t,method:c.HEAD})}async options(e,t={}){return this.fetch(e,{...t,method:c.OPTIONS})}}n.ContentTypeHeader=O,n.ContentTypeValues=d,n.FetchTimeoutError=u,n.Fetcher=w,n.FetcherInterceptors=E,n.HttpMethod=c,n.InterceptorManager=l,n.RequestField=T,n.UrlBuilder=m,n.combineURLs=f,n.isAbsoluteURL=h,n.resolveTimeout=p,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(i,h){typeof exports=="object"&&typeof module<"u"?h(exports):typeof define=="function"&&define.amd?define(["exports"],h):(i=typeof globalThis<"u"?globalThis:i||self,h(i.Fetcher={}))})(this,(function(i){"use strict";function h(r){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(r)}function m(r,e){return h(e)?e:e?r.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):r}class p{constructor(e){this.baseURL=e}build(e,t,n){let o=m(this.baseURL,e),c=this.interpolateUrl(o,t);if(n){const s=new URLSearchParams(n).toString();s&&(c+="?"+s)}return c}interpolateUrl(e,t){return t?e.replace(/{([^}]+)}/g,(n,o)=>{const c=t[o];if(c===void 0)throw new Error(`Missing required path parameter: ${o}`);return String(c)}):e}}function y(r,e){return typeof r<"u"?r:e}class d extends Error{constructor(e,t,n){const o=`Request timeout of ${n}ms exceeded for ${t?.method||"GET"} ${e}`;super(o),this.name="FetchTimeoutError",this.url=e,this.request=t,Object.setPrototypeOf(this,d.prototype)}}var a=(r=>(r.GET="GET",r.POST="POST",r.PUT="PUT",r.DELETE="DELETE",r.PATCH="PATCH",r.HEAD="HEAD",r.OPTIONS="OPTIONS",r))(a||{}),T=(r=>(r.METHOD="method",r.BODY="body",r))(T||{});const u="Content-Type";var f=(r=>(r.APPLICATION_JSON="application/json",r.TEXT_EVENT_STREAM="text/event-stream",r))(f||{});class l{constructor(){this.interceptors=[]}use(e){const t=this.interceptors.length;return this.interceptors.push(e),t}eject(e){this.interceptors[e]&&(this.interceptors[e]=null)}clear(){this.interceptors=[]}async intercept(e){let t=e;for(let n of this.interceptors)n&&(t=await n.intercept(t));return t}}class b{constructor(){this.request=new l,this.response=new l,this.error=new l}}class O{intercept(e){if(e.body===void 0||e.body===null||typeof e.body!="object"||e.body instanceof ArrayBuffer||ArrayBuffer.isView(e.body)||e.body instanceof Blob||e.body instanceof File||e.body instanceof URLSearchParams||e.body instanceof FormData||e.body instanceof ReadableStream)return e;const t={...e};t.body=JSON.stringify(e.body),t.headers||(t.headers={});const n=t.headers;return n[u]||(n[u]=f.APPLICATION_JSON),t}}const E={[u]:f.APPLICATION_JSON},w={baseURL:"",headers:E};class S{constructor(e=w){this.headers=E,this.interceptors=new b,this.urlBuilder=new p(e.baseURL),e.headers!==void 0&&(this.headers=e.headers),this.timeout=e.timeout,this.interceptors.request.use(new O)}async fetch(e,t={}){const n={...this.headers||{},...t.headers||{}};let o={...t,headers:Object.keys(n).length>0?n:void 0};try{o=await this.interceptors.request.intercept(o);const c=this.urlBuilder.build(e,t.pathParams,t.queryParams);let s=await this.timeoutFetch(c,o);return s=await this.interceptors.response.intercept(s),s}catch(c){throw await this.interceptors.error.intercept(c)}}async timeoutFetch(e,t){const n=y(t.timeout,this.timeout);if(!n)return fetch(e,t);const o=new AbortController,c={...t,signal:o.signal};let s=null;const A=new Promise((U,g)=>{s=setTimeout(()=>{s&&clearTimeout(s);const P=new d(e,t,n);o.abort(P),g(P)},n)});try{return await Promise.race([fetch(e,c),A])}finally{s&&clearTimeout(s)}}async get(e,t={}){return this.fetch(e,{...t,method:a.GET})}async post(e,t={}){return this.fetch(e,{...t,method:a.POST})}async put(e,t={}){return this.fetch(e,{...t,method:a.PUT})}async delete(e,t={}){return this.fetch(e,{...t,method:a.DELETE})}async patch(e,t={}){return this.fetch(e,{...t,method:a.PATCH})}async head(e,t={}){return this.fetch(e,{...t,method:a.HEAD})}async options(e,t={}){return this.fetch(e,{...t,method:a.OPTIONS})}}i.ContentTypeHeader=u,i.ContentTypeValues=f,i.FetchTimeoutError=d,i.Fetcher=S,i.FetcherInterceptors=b,i.HttpMethod=a,i.InterceptorManager=l,i.RequestField=T,i.UrlBuilder=p,i.combineURLs=m,i.isAbsoluteURL=h,i.resolveTimeout=y,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})}));
@@ -0,0 +1,31 @@
1
+ import { RequestInterceptor } from './interceptor';
2
+ import { FetcherRequest } from './fetcher';
3
+ /**
4
+ * 请求体拦截器,负责将普通对象转换为JSON字符串
5
+ */
6
+ export declare class RequestBodyInterceptor implements RequestInterceptor {
7
+ /**
8
+ * 尝试转换请求体为合法的 fetch API body 类型
9
+ *
10
+ * 根据 Fetch API 规范,body 可以是多种类型,但对于普通对象,需要转换为 JSON 字符串
11
+ * https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch#setting_a_body
12
+ *
13
+ * 支持的类型:
14
+ * - a string
15
+ * - ArrayBuffer
16
+ * - TypedArray
17
+ * - DataView
18
+ * - Blob
19
+ * - File
20
+ * - URLSearchParams
21
+ * - FormData
22
+ * - ReadableStream
23
+ *
24
+ * 对于不支持的 object 类型(如普通对象),将自动转换为 JSON 字符串
25
+ *
26
+ * @param request 请求参数
27
+ * @returns 转换后的请求
28
+ */
29
+ intercept(request: FetcherRequest): FetcherRequest;
30
+ }
31
+ //# sourceMappingURL=requestBodyInterceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestBodyInterceptor.d.ts","sourceRoot":"","sources":["../src/requestBodyInterceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG3C;;GAEG;AACH,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc;CA0CnD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ahoo-wang/fetcher",
3
- "version": "0.0.8",
3
+ "version": "0.1.0",
4
4
  "description": "Core library providing basic HTTP client functionality for Fetcher",
5
5
  "keywords": [
6
6
  "fetch",
@@ -10,7 +10,7 @@
10
10
  ],
11
11
  "author": "Ahoo-Wang",
12
12
  "license": "Apache-2.0",
13
- "homepage": "https://github.com/Ahoo-Wang/fetcher/tree/master/packages/core",
13
+ "homepage": "https://github.com/Ahoo-Wang/fetcher/tree/master/packages/fetcher",
14
14
  "repository": {
15
15
  "type": "git",
16
16
  "url": "https://github.com/Ahoo-Wang/fetcher.git",