@kevisual/query 0.0.47 → 0.0.49

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.
@@ -106,13 +106,14 @@ type QueryOpts$1 = {
106
106
  } & AdapterOpts;
107
107
  type QueryOptions = {
108
108
  url?: string;
109
+ baseURL?: string;
110
+ beforeRequest?: Fn;
109
111
  adapter?: typeof adapter;
110
112
  headers?: Record<string, string>;
111
113
  timeout?: number;
112
114
  isClient?: boolean;
113
115
  tokenName?: string;
114
116
  storage?: Storage;
115
- beforeRequest?: Fn;
116
117
  };
117
118
  type Data = {
118
119
  path?: string;
@@ -155,6 +156,7 @@ declare const wrapperError: ({ code, message }: {
155
156
  */
156
157
  declare class Query {
157
158
  adapter: typeof adapter;
159
+ baseURL: string;
158
160
  url: string;
159
161
  /**
160
162
  * 请求前处理函数
@@ -317,6 +317,7 @@ var wrapperError = ({ code, message }) => {
317
317
 
318
318
  class Query {
319
319
  adapter;
320
+ baseURL;
320
321
  url;
321
322
  beforeRequest;
322
323
  afterResponse;
@@ -333,6 +334,11 @@ class Query {
333
334
  this.storage = opts?.storage || globalThis?.localStorage;
334
335
  const defaultURL = opts?.isClient ? "/client/router" : "/api/router";
335
336
  this.url = opts?.url || defaultURL;
337
+ if (this.url.startsWith("http")) {
338
+ const urlObj = new URL(this.url);
339
+ this.baseURL = urlObj.origin;
340
+ }
341
+ this.baseURL = opts?.baseURL || this.baseURL;
336
342
  this.headers = opts?.headers || {
337
343
  "Content-Type": "application/json"
338
344
  };
@@ -376,6 +382,13 @@ class Query {
376
382
  timeout: _timeout,
377
383
  ...rest
378
384
  };
385
+ const isStartsWithHttp = req.url.startsWith("http");
386
+ if (!isStartsWithHttp) {
387
+ if (this.baseURL) {
388
+ const baseURL = new URL(this.baseURL || globalThis?.location?.origin).origin;
389
+ req.url = baseURL + req.url;
390
+ }
391
+ }
379
392
  try {
380
393
  if (_beforeRequest) {
381
394
  const res = await _beforeRequest(req);
package/dist/query.d.ts CHANGED
@@ -106,13 +106,14 @@ type QueryOpts = {
106
106
  } & AdapterOpts;
107
107
  type QueryOptions = {
108
108
  url?: string;
109
+ baseURL?: string;
110
+ beforeRequest?: Fn;
109
111
  adapter?: typeof adapter;
110
112
  headers?: Record<string, string>;
111
113
  timeout?: number;
112
114
  isClient?: boolean;
113
115
  tokenName?: string;
114
116
  storage?: Storage;
115
- beforeRequest?: Fn;
116
117
  };
117
118
  type Data = {
118
119
  path?: string;
@@ -155,6 +156,7 @@ declare const wrapperError: ({ code, message }: {
155
156
  */
156
157
  declare class Query {
157
158
  adapter: typeof adapter;
159
+ baseURL: string;
158
160
  url: string;
159
161
  /**
160
162
  * 请求前处理函数
package/dist/query.js CHANGED
@@ -120,6 +120,7 @@ var wrapperError = ({ code, message }) => {
120
120
 
121
121
  class Query {
122
122
  adapter;
123
+ baseURL;
123
124
  url;
124
125
  beforeRequest;
125
126
  afterResponse;
@@ -136,6 +137,11 @@ class Query {
136
137
  this.storage = opts?.storage || globalThis?.localStorage;
137
138
  const defaultURL = opts?.isClient ? "/client/router" : "/api/router";
138
139
  this.url = opts?.url || defaultURL;
140
+ if (this.url.startsWith("http")) {
141
+ const urlObj = new URL(this.url);
142
+ this.baseURL = urlObj.origin;
143
+ }
144
+ this.baseURL = opts?.baseURL || this.baseURL;
139
145
  this.headers = opts?.headers || {
140
146
  "Content-Type": "application/json"
141
147
  };
@@ -179,6 +185,13 @@ class Query {
179
185
  timeout: _timeout,
180
186
  ...rest
181
187
  };
188
+ const isStartsWithHttp = req.url.startsWith("http");
189
+ if (!isStartsWithHttp) {
190
+ if (this.baseURL) {
191
+ const baseURL = new URL(this.baseURL || globalThis?.location?.origin).origin;
192
+ req.url = baseURL + req.url;
193
+ }
194
+ }
182
195
  try {
183
196
  if (_beforeRequest) {
184
197
  const res = await _beforeRequest(req);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevisual/query",
3
- "version": "0.0.47",
3
+ "version": "0.0.49",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "build": "npm run clean && bun run bun.config.ts",
@@ -19,7 +19,7 @@
19
19
  "description": "",
20
20
  "devDependencies": {
21
21
  "@kevisual/code-builder": "^0.0.6",
22
- "@kevisual/router": "^0.0.75",
22
+ "@kevisual/router": "^0.0.80",
23
23
  "@types/node": "^25.2.3",
24
24
  "typescript": "^5.9.3",
25
25
  "es-toolkit": "^1.44.0",
@@ -1,4 +1,5 @@
1
1
 
2
+ import { toJSONSchema, fromJSONSchema } from '@kevisual/router/browser'
2
3
  type RouteInfo = {
3
4
  path: string;
4
5
  key: string;
@@ -44,6 +45,14 @@ export const createQueryByRoutes = (list: RouteInfo[]) => {
44
45
  if (!obj[route.path]) {
45
46
  obj[route.path] = {};
46
47
  }
48
+ if (route.metadata?.args) {
49
+ const args = route.metadata.args;
50
+ if (args?.$schema) {
51
+ // 将 args 转换为 JSON Schema
52
+ const jsonSchema = fromJSONSchema(args);
53
+ route.metadata.args = toJSONSchema(jsonSchema);
54
+ }
55
+ }
47
56
  obj[route.path][route.key] = route;
48
57
  }
49
58
  const code = `
package/src/query-api.ts CHANGED
@@ -64,18 +64,27 @@ type InferType<T> =
64
64
  T extends { properties: infer P } ? InferFromJSONSchema<T> : // 处理没有 type 但有 properties 的对象
65
65
  T;
66
66
 
67
+ // 检查是否标记为可选
68
+ type IsOptional<T> = T extends { optional: true } ? true : false;
69
+
67
70
  // 提取 args 对象,将每个 Zod schema 或 JSON Schema 转换为实际类型
71
+ // 根据 optional 字段分离必需字段和可选字段
68
72
  type ExtractArgsFromMetadata<T> = T extends { metadata?: { args?: infer A } }
69
73
  ? A extends Record<string, any>
70
- ? { [K in keyof A]: InferType<A[K]> }
71
- : never
74
+ ? (
75
+ // 必需字段(没有 optional: true)
76
+ { [K in keyof A as IsOptional<A[K]> extends true ? never : K]: InferType<A[K]> } &
77
+ // 可选字段(有 optional: true)
78
+ { [K in keyof A as IsOptional<A[K]> extends true ? K : never]?: InferType<A[K]> }
79
+ )
80
+ : never
72
81
  : never;
73
82
 
74
83
  // 类型映射:将 API 配置转换为方法签名
75
84
  type ApiMethods<P extends { [path: string]: { [key: string]: Pos } }> = {
76
85
  [Path in keyof P]: {
77
86
  [Key in keyof P[Path]]: (
78
- data?: Partial<ExtractArgsFromMetadata<P[Path][Key]>>,
87
+ data?: ExtractArgsFromMetadata<P[Path][Key]>,
79
88
  opts?: DataOpts
80
89
  ) => ReturnType<Query['post']>
81
90
  }
@@ -97,7 +106,7 @@ export class QueryApi<P extends { [path: string]: { [key: string]: Pos } } = {}>
97
106
  // 使用泛型来推断类型
98
107
  post<T extends Pos>(
99
108
  pos: T,
100
- data?: Partial<ExtractArgsFromMetadata<T>>,
109
+ data?: ExtractArgsFromMetadata<T>,
101
110
  opts?: DataOpts
102
111
  ) {
103
112
  const _pos = pick(pos, ['path', 'key', 'id']);
@@ -121,7 +130,7 @@ export class QueryApi<P extends { [path: string]: { [key: string]: Pos } } = {}>
121
130
  }
122
131
 
123
132
  for (const [key, pos] of Object.entries(methods)) {
124
- that[path][key] = (data?: Partial<ExtractArgsFromMetadata<typeof pos>>, opts: DataOpts = {}) => {
133
+ that[path][key] = (data?: ExtractArgsFromMetadata<typeof pos>, opts: DataOpts = {}) => {
125
134
  const _pos = pick(pos, ['path', 'key', 'id']);
126
135
  if (pos.metadata?.viewItem?.api?.url && !opts.url) {
127
136
  opts.url = pos.metadata.viewItem.api.url;
package/src/query.ts CHANGED
@@ -20,13 +20,14 @@ export type QueryOpts = {
20
20
 
21
21
  export type QueryOptions = {
22
22
  url?: string;
23
+ baseURL?: string;
24
+ beforeRequest?: Fn;
23
25
  adapter?: typeof adapter;
24
26
  headers?: Record<string, string>;
25
27
  timeout?: number;
26
28
  isClient?: boolean;
27
29
  tokenName?: string;
28
30
  storage?: Storage;
29
- beforeRequest?: Fn;
30
31
  }
31
32
  export type Data = {
32
33
  path?: string;
@@ -67,6 +68,7 @@ export const wrapperError = ({ code, message }: { code?: number; message?: strin
67
68
  */
68
69
  export class Query {
69
70
  adapter: typeof adapter;
71
+ baseURL: string;
70
72
  url: string;
71
73
  /**
72
74
  * 请求前处理函数
@@ -93,6 +95,11 @@ export class Query {
93
95
  this.storage = opts?.storage || globalThis?.localStorage;
94
96
  const defaultURL = opts?.isClient ? '/client/router' : '/api/router';
95
97
  this.url = opts?.url || defaultURL;
98
+ if (this.url.startsWith('http')) {
99
+ const urlObj = new URL(this.url);
100
+ this.baseURL = urlObj.origin;
101
+ }
102
+ this.baseURL = opts?.baseURL || this.baseURL; // 如果opts中有baseURL优先
96
103
  this.headers = opts?.headers || {
97
104
  'Content-Type': 'application/json',
98
105
  };
@@ -155,6 +162,14 @@ export class Query {
155
162
  timeout: _timeout,
156
163
  ...rest,
157
164
  };
165
+ const isStartsWithHttp = req.url.startsWith('http');
166
+ // 如果是完整的url,直接使用, 如果不是完整的url,且baseURL存在,则拼接baseURL
167
+ if (!isStartsWithHttp) {
168
+ if (this.baseURL) {
169
+ const baseURL = new URL(this.baseURL || globalThis?.location?.origin).origin;
170
+ req.url = baseURL + req.url;
171
+ }
172
+ }
158
173
  try {
159
174
  if (_beforeRequest) {
160
175
  const res = await _beforeRequest(req);