@kevisual/query 0.0.44 → 0.0.45

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.
@@ -263,17 +263,35 @@ type InferFromJSONSchema<T> = T extends {
263
263
  } ? number : T extends {
264
264
  type: "boolean";
265
265
  } ? boolean : T extends {
266
+ type: "array";
267
+ items: infer I;
268
+ } ? Array<InferFromJSONSchema<I>> : T extends {
266
269
  type: "object";
267
270
  properties: infer P;
271
+ required: infer R extends readonly string[];
268
272
  } ? {
269
- [K in keyof P]: InferFromJSONSchema<P[K]>;
273
+ [K in keyof P as K extends R[number] ? K : never]: InferFromJSONSchema<P[K]>;
274
+ } & {
275
+ [K in keyof P as K extends R[number] ? never : K]?: InferFromJSONSchema<P[K]>;
276
+ } : T extends {
277
+ type: "object";
278
+ properties: infer P;
279
+ } ? {
280
+ [K in keyof P]?: InferFromJSONSchema<P[K]>;
281
+ } : T extends {
282
+ type: "object";
283
+ additionalProperties: infer A;
284
+ } ? (A extends false ? Record<string, never> : Record<string, any>) : T extends Record<string, any> ? T extends {
285
+ properties: infer P;
286
+ required: infer R extends readonly string[];
287
+ } ? {
288
+ [K in keyof P as K extends R[number] ? K : never]: InferFromJSONSchema<P[K]>;
289
+ } & {
290
+ [K in keyof P as K extends R[number] ? never : K]?: InferFromJSONSchema<P[K]>;
270
291
  } : T extends {
271
- type: "array";
272
- items: infer I;
273
- } ? Array<InferFromJSONSchema<I>> : T extends Record<string, any> ? T extends {
274
292
  properties: infer P;
275
293
  } ? {
276
- [K in keyof P]: InferFromJSONSchema<P[K]>;
294
+ [K in keyof P]?: InferFromJSONSchema<P[K]>;
277
295
  } : unknown : unknown;
278
296
  type InferType<T> = T extends z.ZodType<infer U> ? U : T extends {
279
297
  type: infer TType;
@@ -293,7 +311,7 @@ type ApiMethods<P extends {
293
311
  };
294
312
  }> = {
295
313
  [Path in keyof P]: {
296
- [Key in keyof P[Path]]: (data?: Partial<ExtractArgsFromMetadata<P[Path][Key]>>, opts?: DataOpts) => ReturnType<Query['post']>;
314
+ [Key in keyof P[Path]]: (data?: ExtractArgsFromMetadata<P[Path][Key]>, opts?: DataOpts) => ReturnType<Query['post']>;
297
315
  };
298
316
  };
299
317
  type QueryApiOpts<P extends {
@@ -311,7 +329,7 @@ declare class QueryApi<P extends {
311
329
  } = {}> {
312
330
  query: Query;
313
331
  constructor(opts?: QueryApiOpts<P>);
314
- post<T extends Pos>(pos: T, data?: Partial<ExtractArgsFromMetadata<T>>, opts?: DataOpts): Promise<{
332
+ post<T extends Pos>(pos: T, data?: ExtractArgsFromMetadata<T>, opts?: DataOpts): Promise<{
315
333
  code: number;
316
334
  data?: any;
317
335
  message?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevisual/query",
3
- "version": "0.0.44",
3
+ "version": "0.0.45",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "build": "npm run clean && bun run bun.config.ts",
package/src/query-api.ts CHANGED
@@ -25,18 +25,35 @@ type InferFromJSONSchema<T> =
25
25
  T extends { type: "number" } ? number :
26
26
  T extends { type: "integer" } ? number :
27
27
  T extends { type: "boolean" } ? boolean :
28
- // 对象类型 - 检查是否有 properties
28
+ // 数组类型
29
+ T extends { type: "array"; items: infer I }
30
+ ? Array<InferFromJSONSchema<I>>
31
+ : // 对象类型 - 带 required 字段(必需字段 + 可选字段)
32
+ // 注意:必须在 additionalProperties 检查之前,因为两者可能同时存在
33
+ T extends { type: "object"; properties: infer P; required: infer R extends readonly string[] }
34
+ ? {
35
+ [K in keyof P as K extends R[number] ? K : never]: InferFromJSONSchema<P[K]>
36
+ } & {
37
+ [K in keyof P as K extends R[number] ? never : K]?: InferFromJSONSchema<P[K]>
38
+ }
39
+ : // 对象类型 - 不带 required 字段(所有字段可选)
29
40
  T extends { type: "object"; properties: infer P }
30
41
  ? {
31
- [K in keyof P]: InferFromJSONSchema<P[K]>
42
+ [K in keyof P]?: InferFromJSONSchema<P[K]>
32
43
  }
33
- : // 数组类型
34
- T extends { type: "array"; items: infer I }
35
- ? Array<InferFromJSONSchema<I>>
44
+ : // 对象类型 - 只有 additionalProperties(纯动态对象)
45
+ T extends { type: "object"; additionalProperties: infer A }
46
+ ? (A extends false ? Record<string, never> : Record<string, any>)
36
47
  : // 默认情况 - 如果是对象但没有 type 字段,尝试递归推断
37
48
  T extends Record<string, any>
38
- ? T extends { properties: infer P }
39
- ? { [K in keyof P]: InferFromJSONSchema<P[K]> }
49
+ ? T extends { properties: infer P; required: infer R extends readonly string[] }
50
+ ? {
51
+ [K in keyof P as K extends R[number] ? K : never]: InferFromJSONSchema<P[K]>
52
+ } & {
53
+ [K in keyof P as K extends R[number] ? never : K]?: InferFromJSONSchema<P[K]>
54
+ }
55
+ : T extends { properties: infer P }
56
+ ? { [K in keyof P]?: InferFromJSONSchema<P[K]> }
40
57
  : unknown
41
58
  : unknown;
42
59
 
@@ -58,7 +75,7 @@ type ExtractArgsFromMetadata<T> = T extends { metadata?: { args?: infer A } }
58
75
  type ApiMethods<P extends { [path: string]: { [key: string]: Pos } }> = {
59
76
  [Path in keyof P]: {
60
77
  [Key in keyof P[Path]]: (
61
- data?: Partial<ExtractArgsFromMetadata<P[Path][Key]>>,
78
+ data?: ExtractArgsFromMetadata<P[Path][Key]>,
62
79
  opts?: DataOpts
63
80
  ) => ReturnType<Query['post']>
64
81
  }
@@ -80,7 +97,7 @@ export class QueryApi<P extends { [path: string]: { [key: string]: Pos } } = {}>
80
97
  // 使用泛型来推断类型
81
98
  post<T extends Pos>(
82
99
  pos: T,
83
- data?: Partial<ExtractArgsFromMetadata<T>>,
100
+ data?: ExtractArgsFromMetadata<T>,
84
101
  opts?: DataOpts
85
102
  ) {
86
103
  const _pos = pick(pos, ['path', 'key', 'id']);
@@ -104,7 +121,7 @@ export class QueryApi<P extends { [path: string]: { [key: string]: Pos } } = {}>
104
121
  }
105
122
 
106
123
  for (const [key, pos] of Object.entries(methods)) {
107
- that[path][key] = (data?: Partial<ExtractArgsFromMetadata<typeof pos>>, opts?: DataOpts) => {
124
+ that[path][key] = (data?: ExtractArgsFromMetadata<typeof pos>, opts?: DataOpts) => {
108
125
  const _pos = pick(pos, ['path', 'key', 'id']);
109
126
  return that.query.post({
110
127
  ..._pos,