@kevisual/query 0.0.48 → 0.0.50
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 +10 -3
- package/dist/query-api.js +27 -7
- 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 +3 -3
- package/src/create-query/index.ts +18 -6
- package/src/query-api.ts +11 -10
- package/src/query.ts +16 -1
package/dist/query-api.d.ts
CHANGED
|
@@ -107,13 +107,14 @@ type QueryOpts = {
|
|
|
107
107
|
} & AdapterOpts;
|
|
108
108
|
type QueryOptions = {
|
|
109
109
|
url?: string;
|
|
110
|
+
baseURL?: string;
|
|
111
|
+
beforeRequest?: Fn;
|
|
110
112
|
adapter?: typeof adapter;
|
|
111
113
|
headers?: Record<string, string>;
|
|
112
114
|
timeout?: number;
|
|
113
115
|
isClient?: boolean;
|
|
114
116
|
tokenName?: string;
|
|
115
117
|
storage?: Storage;
|
|
116
|
-
beforeRequest?: Fn;
|
|
117
118
|
};
|
|
118
119
|
type Data = {
|
|
119
120
|
path?: string;
|
|
@@ -149,6 +150,7 @@ type DataOpts = Partial<QueryOpts> & {
|
|
|
149
150
|
*/
|
|
150
151
|
declare class Query {
|
|
151
152
|
adapter: typeof adapter;
|
|
153
|
+
baseURL: string;
|
|
152
154
|
url: string;
|
|
153
155
|
/**
|
|
154
156
|
* 请求前处理函数
|
|
@@ -227,7 +229,12 @@ type RouteInfo = {
|
|
|
227
229
|
};
|
|
228
230
|
};
|
|
229
231
|
};
|
|
230
|
-
|
|
232
|
+
type CreateQueryOptions = {
|
|
233
|
+
removeViewItem?: boolean;
|
|
234
|
+
before?: string;
|
|
235
|
+
after?: string;
|
|
236
|
+
};
|
|
237
|
+
declare const createQueryByRoutes: (list: RouteInfo[], options?: CreateQueryOptions) => string;
|
|
231
238
|
|
|
232
239
|
type Pos = {
|
|
233
240
|
path?: string;
|
|
@@ -309,7 +316,7 @@ type ApiMethods<P extends {
|
|
|
309
316
|
};
|
|
310
317
|
}> = {
|
|
311
318
|
[Path in keyof P]: {
|
|
312
|
-
[Key in keyof P[Path]]: (data?: ExtractArgsFromMetadata<P[Path][Key]>, opts?: DataOpts) =>
|
|
319
|
+
[Key in keyof P[Path]]: <T = any>(data?: ExtractArgsFromMetadata<P[Path][Key]>, opts?: DataOpts) => Promise<Result<T>>;
|
|
313
320
|
};
|
|
314
321
|
};
|
|
315
322
|
type QueryApiOpts<P extends {
|
package/dist/query-api.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);
|
|
@@ -275,7 +288,7 @@ class Query {
|
|
|
275
288
|
}
|
|
276
289
|
}
|
|
277
290
|
|
|
278
|
-
// node_modules/@kevisual/router/dist/router-browser.js
|
|
291
|
+
// node_modules/.pnpm/@kevisual+router@0.0.84/node_modules/@kevisual/router/dist/router-browser.js
|
|
279
292
|
var __create = Object.create;
|
|
280
293
|
var __getProtoOf = Object.getPrototypeOf;
|
|
281
294
|
var __defProp = Object.defineProperty;
|
|
@@ -14026,8 +14039,14 @@ var toJSONSchema3 = toJSONSchema2;
|
|
|
14026
14039
|
var fromJSONSchema3 = fromJSONSchema2;
|
|
14027
14040
|
|
|
14028
14041
|
// src/create-query/index.ts
|
|
14029
|
-
var
|
|
14042
|
+
var removeViewItemCotnextFromRoutes = (list, options) => {
|
|
14030
14043
|
for (const route of list) {
|
|
14044
|
+
if (options?.removeViewItem) {
|
|
14045
|
+
if (route.metadata?.viewItem) {
|
|
14046
|
+
delete route.metadata.viewItem;
|
|
14047
|
+
}
|
|
14048
|
+
continue;
|
|
14049
|
+
}
|
|
14031
14050
|
if (route.metadata?.viewItem) {
|
|
14032
14051
|
if (route.metadata.viewItem?.api?.query) {
|
|
14033
14052
|
delete route.metadata.viewItem.api.query;
|
|
@@ -14042,9 +14061,9 @@ var removeViewItemFromRoutes = (list) => {
|
|
|
14042
14061
|
}
|
|
14043
14062
|
return list;
|
|
14044
14063
|
};
|
|
14045
|
-
var createQueryByRoutes = (list) => {
|
|
14064
|
+
var createQueryByRoutes = (list, options) => {
|
|
14046
14065
|
const obj = {};
|
|
14047
|
-
list =
|
|
14066
|
+
list = removeViewItemCotnextFromRoutes(list, options);
|
|
14048
14067
|
for (const route of list) {
|
|
14049
14068
|
if (!obj[route.path]) {
|
|
14050
14069
|
obj[route.path] = {};
|
|
@@ -14058,11 +14077,12 @@ var createQueryByRoutes = (list) => {
|
|
|
14058
14077
|
}
|
|
14059
14078
|
obj[route.path][route.key] = route;
|
|
14060
14079
|
}
|
|
14061
|
-
const
|
|
14062
|
-
|
|
14080
|
+
const before = options?.before || `import { createQueryApi } from '@kevisual/query/api';`;
|
|
14081
|
+
const after = options?.after || `export { queryApi };`;
|
|
14082
|
+
const code = `${before}
|
|
14063
14083
|
const api = ${generateApiCode(obj)} as const;
|
|
14064
14084
|
const queryApi = createQueryApi({ api });
|
|
14065
|
-
|
|
14085
|
+
${after}
|
|
14066
14086
|
`;
|
|
14067
14087
|
return code;
|
|
14068
14088
|
};
|
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.50",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "npm run clean && bun run bun.config.ts",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"description": "",
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@kevisual/code-builder": "^0.0.6",
|
|
22
|
-
"@kevisual/router": "^0.0.
|
|
23
|
-
"@types/node": "^25.
|
|
22
|
+
"@kevisual/router": "^0.0.84",
|
|
23
|
+
"@types/node": "^25.3.0",
|
|
24
24
|
"typescript": "^5.9.3",
|
|
25
25
|
"es-toolkit": "^1.44.0",
|
|
26
26
|
"zod": "^4.3.6",
|
|
@@ -22,8 +22,14 @@ type RouteInfo = {
|
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
-
const
|
|
25
|
+
const removeViewItemCotnextFromRoutes = (list: RouteInfo[], options?: CreateQueryOptions) => {
|
|
26
26
|
for (const route of list) {
|
|
27
|
+
if (options?.removeViewItem) {
|
|
28
|
+
if (route.metadata?.viewItem) {
|
|
29
|
+
delete route.metadata.viewItem;
|
|
30
|
+
}
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
27
33
|
if (route.metadata?.viewItem) {
|
|
28
34
|
if (route.metadata.viewItem?.api?.query) {
|
|
29
35
|
delete route.metadata.viewItem.api.query;
|
|
@@ -38,9 +44,14 @@ const removeViewItemFromRoutes = (list: RouteInfo[]) => {
|
|
|
38
44
|
}
|
|
39
45
|
return list;
|
|
40
46
|
}
|
|
41
|
-
|
|
47
|
+
type CreateQueryOptions = {
|
|
48
|
+
removeViewItem?: boolean,
|
|
49
|
+
before?: string,
|
|
50
|
+
after?: string,
|
|
51
|
+
}
|
|
52
|
+
export const createQueryByRoutes = (list: RouteInfo[], options?: CreateQueryOptions) => {
|
|
42
53
|
const obj: any = {};
|
|
43
|
-
list =
|
|
54
|
+
list = removeViewItemCotnextFromRoutes(list, options);
|
|
44
55
|
for (const route of list) {
|
|
45
56
|
if (!obj[route.path]) {
|
|
46
57
|
obj[route.path] = {};
|
|
@@ -55,11 +66,12 @@ export const createQueryByRoutes = (list: RouteInfo[]) => {
|
|
|
55
66
|
}
|
|
56
67
|
obj[route.path][route.key] = route;
|
|
57
68
|
}
|
|
58
|
-
const
|
|
59
|
-
|
|
69
|
+
const before = options?.before || `import { createQueryApi } from '@kevisual/query/api';`;
|
|
70
|
+
const after = options?.after || `export { queryApi };`;
|
|
71
|
+
const code = `${before}
|
|
60
72
|
const api = ${generateApiCode(obj)} as const;
|
|
61
73
|
const queryApi = createQueryApi({ api });
|
|
62
|
-
|
|
74
|
+
${after}
|
|
63
75
|
`
|
|
64
76
|
return code;
|
|
65
77
|
}
|
package/src/query-api.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DataOpts, Query } from "./query.ts";
|
|
1
|
+
import { DataOpts, Query, Result } from "./query.ts";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { createQueryByRoutes } from "./create-query/index.ts";
|
|
4
4
|
import { pick } from 'es-toolkit'
|
|
@@ -71,22 +71,23 @@ type IsOptional<T> = T extends { optional: true } ? true : false;
|
|
|
71
71
|
// 根据 optional 字段分离必需字段和可选字段
|
|
72
72
|
type ExtractArgsFromMetadata<T> = T extends { metadata?: { args?: infer A } }
|
|
73
73
|
? A extends Record<string, any>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
|
81
81
|
: never;
|
|
82
82
|
|
|
83
|
+
|
|
83
84
|
// 类型映射:将 API 配置转换为方法签名
|
|
84
85
|
type ApiMethods<P extends { [path: string]: { [key: string]: Pos } }> = {
|
|
85
86
|
[Path in keyof P]: {
|
|
86
|
-
[Key in keyof P[Path]]: (
|
|
87
|
+
[Key in keyof P[Path]]: <T = any>(
|
|
87
88
|
data?: ExtractArgsFromMetadata<P[Path][Key]>,
|
|
88
89
|
opts?: DataOpts
|
|
89
|
-
) =>
|
|
90
|
+
) => Promise<Result<T>>
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
type QueryApiOpts<P extends { [path: string]: { [key: string]: Pos } } = {}> = {
|
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);
|