@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.
- package/dist/query-api.d.ts +13 -6
- package/dist/query-api.js +13787 -17
- package/dist/query-browser.d.ts +3 -1
- package/dist/query-browser.js +13 -0
- package/dist/query.d.ts +3 -1
- package/dist/query.js +13 -0
- package/package.json +2 -2
- package/src/create-query/index.ts +9 -0
- package/src/query-api.ts +14 -5
- package/src/query.ts +16 -1
package/dist/query-browser.d.ts
CHANGED
|
@@ -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
|
* 请求前处理函数
|
package/dist/query-browser.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
-
|
|
71
|
-
|
|
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?:
|
|
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?:
|
|
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?:
|
|
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);
|