@kevisual/api 0.0.50 → 0.0.52

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,20 +1,14 @@
1
- // node_modules/.pnpm/@kevisual+query@0.0.40/node_modules/@kevisual/query/dist/query-browser.js
1
+ // node_modules/.pnpm/@kevisual+query@0.0.47/node_modules/@kevisual/query/dist/query-browser.js
2
2
  var isTextForContentType = (contentType) => {
3
3
  if (!contentType)
4
4
  return false;
5
- const textTypes = ["text/", "xml", "html", "javascript", "css", "csv", "plain", "x-www-form-urlencoded", "md"];
5
+ const textTypes = ["text/", "xml", "html", "javascript", "css", "csv", "plain", "x-www-form-urlencoded", "md", "json"];
6
6
  return textTypes.some((type) => contentType.includes(type));
7
7
  };
8
8
  var adapter = async (opts = {}, overloadOpts) => {
9
9
  const controller = new AbortController;
10
10
  const signal = controller.signal;
11
11
  const isPostFile = opts.isPostFile || false;
12
- let responseType = opts.responseType || "json";
13
- if (opts.isBlob) {
14
- responseType = "blob";
15
- } else if (opts.isText) {
16
- responseType = "text";
17
- }
18
12
  const timeout = opts.timeout || 60000 * 3;
19
13
  const timer = setTimeout(() => {
20
14
  controller.abort();
@@ -26,7 +20,7 @@ var adapter = async (opts = {}, overloadOpts) => {
26
20
  if (opts?.url?.startsWith("http")) {
27
21
  url = new URL(opts.url);
28
22
  } else {
29
- origin = window?.location?.origin || "http://localhost:51515";
23
+ origin = globalThis?.location?.origin || "http://localhost:51515";
30
24
  url = new URL(opts?.url || "", origin);
31
25
  }
32
26
  const isGet = method === "GET";
@@ -73,21 +67,31 @@ var adapter = async (opts = {}, overloadOpts) => {
73
67
  headers
74
68
  }).then(async (response) => {
75
69
  const contentType = response.headers.get("Content-Type");
76
- if (responseType === "blob") {
77
- return await response.blob();
78
- }
79
- const isText = responseType === "text";
80
70
  const isJson = contentType && contentType.includes("application/json");
81
- if (isJson && !isText) {
82
- return await response.json();
71
+ const isSuccess = response.ok;
72
+ if (isJson) {
73
+ const json = await response.json();
74
+ if (json?.code) {
75
+ return json;
76
+ }
77
+ return {
78
+ code: isSuccess ? 200 : response.status,
79
+ status: response.status,
80
+ data: json
81
+ };
83
82
  } else if (isTextForContentType(contentType)) {
84
83
  return {
85
- code: response.status,
84
+ code: isSuccess ? 200 : response.status,
86
85
  status: response.status,
87
86
  data: await response.text()
88
87
  };
89
88
  } else {
90
- return response;
89
+ return {
90
+ code: isSuccess ? 200 : response.status,
91
+ status: response.status,
92
+ data: "非文本非JSON响应, 请手动处理response。",
93
+ response
94
+ };
91
95
  }
92
96
  }).catch((err) => {
93
97
  if (err.name === "AbortError") {
@@ -107,10 +111,7 @@ var adapter = async (opts = {}, overloadOpts) => {
107
111
  var wrapperError = ({ code, message }) => {
108
112
  const result = {
109
113
  code: code || 500,
110
- success: false,
111
- message: message || "api request error",
112
- showError: (fn) => {},
113
- noMsg: true
114
+ message: message || "请求错误"
114
115
  };
115
116
  return result;
116
117
  };
@@ -124,9 +125,13 @@ class Query {
124
125
  timeout;
125
126
  stop;
126
127
  qws;
127
- isClient = false;
128
+ tokenName;
129
+ storage;
130
+ token;
128
131
  constructor(opts) {
129
132
  this.adapter = opts?.adapter || adapter;
133
+ this.tokenName = opts?.tokenName || "token";
134
+ this.storage = opts?.storage || globalThis?.localStorage;
130
135
  const defaultURL = opts?.isClient ? "/client/router" : "/api/router";
131
136
  this.url = opts?.url || defaultURL;
132
137
  this.headers = opts?.headers || {
@@ -137,7 +142,7 @@ class Query {
137
142
  this.beforeRequest = opts.beforeRequest;
138
143
  } else {
139
144
  this.beforeRequest = async (opts2) => {
140
- const token = globalThis?.localStorage?.getItem("token");
145
+ const token = this.token || this.storage?.getItem?.(this.tokenName);
141
146
  if (token) {
142
147
  opts2.headers = {
143
148
  ...opts2.headers,
@@ -178,7 +183,7 @@ class Query {
178
183
  if (res === false) {
179
184
  return wrapperError({
180
185
  code: 500,
181
- message: "request is cancel",
186
+ message: "请求取消",
182
187
  req
183
188
  });
184
189
  }
@@ -187,12 +192,13 @@ class Query {
187
192
  console.error("request beforeFn error", e, req);
188
193
  return wrapperError({
189
194
  code: 500,
190
- message: "api request beforeFn error"
195
+ message: "请求在请求前处理时发生错误",
196
+ req
191
197
  });
192
198
  }
193
199
  if (this.stop && !options?.noStop) {
194
200
  const that = this;
195
- await new Promise((resolve) => {
201
+ const res = await new Promise((resolve) => {
196
202
  let timer = 0;
197
203
  const detect = setInterval(() => {
198
204
  if (!that.stop) {
@@ -200,11 +206,20 @@ class Query {
200
206
  resolve(true);
201
207
  }
202
208
  timer++;
203
- if (timer > 30) {
204
- console.error("request stop: timeout", req.url, timer);
209
+ if (timer > 5) {
210
+ console.error("等待请求失败:", req.url, timer);
211
+ clearInterval(detect);
212
+ resolve(false);
205
213
  }
206
214
  }, 1000);
207
215
  });
216
+ if (!res) {
217
+ return wrapperError({
218
+ code: 500,
219
+ message: "请求取消,可能是因为用户未登录或者token过期",
220
+ req
221
+ });
222
+ }
208
223
  }
209
224
  return _adapter(req).then(async (res) => {
210
225
  try {
@@ -217,10 +232,11 @@ class Query {
217
232
  }
218
233
  return res;
219
234
  } catch (e) {
220
- console.error("request afterFn error", e, req);
235
+ console.error("请求在响应后处理时发生错误", e, req);
221
236
  return wrapperError({
222
237
  code: 500,
223
- message: "api request afterFn error"
238
+ message: "请求在响应后处理时发生错误",
239
+ req
224
240
  });
225
241
  }
226
242
  });
@@ -282,17 +298,6 @@ class BaseQuery {
282
298
  }
283
299
  }
284
300
 
285
- // node_modules/.pnpm/@kevisual+query@0.0.40/node_modules/@kevisual/query/dist/query.js
286
- var setBaseResponse = (res) => {
287
- res.success = res.code === 200;
288
- res.showError = (fn) => {
289
- if (!res.success && !res.noMsg) {
290
- fn?.();
291
- }
292
- };
293
- return res;
294
- };
295
-
296
301
  // query/query-login/login-cache.ts
297
302
  class LoginCacheStore {
298
303
  cache;
@@ -956,7 +961,6 @@ class QueryLogin extends BaseQuery {
956
961
  }
957
962
  return this.post({ key: "refreshToken", data }, {
958
963
  afterResponse: async (response, ctx) => {
959
- setBaseResponse(response);
960
964
  return response;
961
965
  }
962
966
  });
@@ -981,7 +985,6 @@ class QueryLogin extends BaseQuery {
981
985
  body,
982
986
  headers: { ...headers, Authorization: `Bearer ${accessToken}` }
983
987
  });
984
- setBaseResponse(res2);
985
988
  return res2;
986
989
  }
987
990
  } else {
@@ -1,20 +1,14 @@
1
- // node_modules/.pnpm/@kevisual+query@0.0.40/node_modules/@kevisual/query/dist/query-browser.js
1
+ // node_modules/.pnpm/@kevisual+query@0.0.47/node_modules/@kevisual/query/dist/query-browser.js
2
2
  var isTextForContentType = (contentType) => {
3
3
  if (!contentType)
4
4
  return false;
5
- const textTypes = ["text/", "xml", "html", "javascript", "css", "csv", "plain", "x-www-form-urlencoded", "md"];
5
+ const textTypes = ["text/", "xml", "html", "javascript", "css", "csv", "plain", "x-www-form-urlencoded", "md", "json"];
6
6
  return textTypes.some((type) => contentType.includes(type));
7
7
  };
8
8
  var adapter = async (opts = {}, overloadOpts) => {
9
9
  const controller = new AbortController;
10
10
  const signal = controller.signal;
11
11
  const isPostFile = opts.isPostFile || false;
12
- let responseType = opts.responseType || "json";
13
- if (opts.isBlob) {
14
- responseType = "blob";
15
- } else if (opts.isText) {
16
- responseType = "text";
17
- }
18
12
  const timeout = opts.timeout || 60000 * 3;
19
13
  const timer = setTimeout(() => {
20
14
  controller.abort();
@@ -26,7 +20,7 @@ var adapter = async (opts = {}, overloadOpts) => {
26
20
  if (opts?.url?.startsWith("http")) {
27
21
  url = new URL(opts.url);
28
22
  } else {
29
- origin = window?.location?.origin || "http://localhost:51515";
23
+ origin = globalThis?.location?.origin || "http://localhost:51515";
30
24
  url = new URL(opts?.url || "", origin);
31
25
  }
32
26
  const isGet = method === "GET";
@@ -73,21 +67,31 @@ var adapter = async (opts = {}, overloadOpts) => {
73
67
  headers
74
68
  }).then(async (response) => {
75
69
  const contentType = response.headers.get("Content-Type");
76
- if (responseType === "blob") {
77
- return await response.blob();
78
- }
79
- const isText = responseType === "text";
80
70
  const isJson = contentType && contentType.includes("application/json");
81
- if (isJson && !isText) {
82
- return await response.json();
71
+ const isSuccess = response.ok;
72
+ if (isJson) {
73
+ const json = await response.json();
74
+ if (json?.code) {
75
+ return json;
76
+ }
77
+ return {
78
+ code: isSuccess ? 200 : response.status,
79
+ status: response.status,
80
+ data: json
81
+ };
83
82
  } else if (isTextForContentType(contentType)) {
84
83
  return {
85
- code: response.status,
84
+ code: isSuccess ? 200 : response.status,
86
85
  status: response.status,
87
86
  data: await response.text()
88
87
  };
89
88
  } else {
90
- return response;
89
+ return {
90
+ code: isSuccess ? 200 : response.status,
91
+ status: response.status,
92
+ data: "非文本非JSON响应, 请手动处理response。",
93
+ response
94
+ };
91
95
  }
92
96
  }).catch((err) => {
93
97
  if (err.name === "AbortError") {
@@ -107,10 +111,7 @@ var adapter = async (opts = {}, overloadOpts) => {
107
111
  var wrapperError = ({ code, message }) => {
108
112
  const result = {
109
113
  code: code || 500,
110
- success: false,
111
- message: message || "api request error",
112
- showError: (fn) => {},
113
- noMsg: true
114
+ message: message || "请求错误"
114
115
  };
115
116
  return result;
116
117
  };
@@ -124,9 +125,13 @@ class Query {
124
125
  timeout;
125
126
  stop;
126
127
  qws;
127
- isClient = false;
128
+ tokenName;
129
+ storage;
130
+ token;
128
131
  constructor(opts) {
129
132
  this.adapter = opts?.adapter || adapter;
133
+ this.tokenName = opts?.tokenName || "token";
134
+ this.storage = opts?.storage || globalThis?.localStorage;
130
135
  const defaultURL = opts?.isClient ? "/client/router" : "/api/router";
131
136
  this.url = opts?.url || defaultURL;
132
137
  this.headers = opts?.headers || {
@@ -137,7 +142,7 @@ class Query {
137
142
  this.beforeRequest = opts.beforeRequest;
138
143
  } else {
139
144
  this.beforeRequest = async (opts2) => {
140
- const token = globalThis?.localStorage?.getItem("token");
145
+ const token = this.token || this.storage?.getItem?.(this.tokenName);
141
146
  if (token) {
142
147
  opts2.headers = {
143
148
  ...opts2.headers,
@@ -178,7 +183,7 @@ class Query {
178
183
  if (res === false) {
179
184
  return wrapperError({
180
185
  code: 500,
181
- message: "request is cancel",
186
+ message: "请求取消",
182
187
  req
183
188
  });
184
189
  }
@@ -187,12 +192,13 @@ class Query {
187
192
  console.error("request beforeFn error", e, req);
188
193
  return wrapperError({
189
194
  code: 500,
190
- message: "api request beforeFn error"
195
+ message: "请求在请求前处理时发生错误",
196
+ req
191
197
  });
192
198
  }
193
199
  if (this.stop && !options?.noStop) {
194
200
  const that = this;
195
- await new Promise((resolve) => {
201
+ const res = await new Promise((resolve) => {
196
202
  let timer = 0;
197
203
  const detect = setInterval(() => {
198
204
  if (!that.stop) {
@@ -200,11 +206,20 @@ class Query {
200
206
  resolve(true);
201
207
  }
202
208
  timer++;
203
- if (timer > 30) {
204
- console.error("request stop: timeout", req.url, timer);
209
+ if (timer > 5) {
210
+ console.error("等待请求失败:", req.url, timer);
211
+ clearInterval(detect);
212
+ resolve(false);
205
213
  }
206
214
  }, 1000);
207
215
  });
216
+ if (!res) {
217
+ return wrapperError({
218
+ code: 500,
219
+ message: "请求取消,可能是因为用户未登录或者token过期",
220
+ req
221
+ });
222
+ }
208
223
  }
209
224
  return _adapter(req).then(async (res) => {
210
225
  try {
@@ -217,10 +232,11 @@ class Query {
217
232
  }
218
233
  return res;
219
234
  } catch (e) {
220
- console.error("request afterFn error", e, req);
235
+ console.error("请求在响应后处理时发生错误", e, req);
221
236
  return wrapperError({
222
237
  code: 500,
223
- message: "api request afterFn error"
238
+ message: "请求在响应后处理时发生错误",
239
+ req
224
240
  });
225
241
  }
226
242
  });