@kevisual/router 0.2.11 → 0.2.12
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/app.js +1271 -550
- package/dist/commander.d.ts +53 -38
- package/dist/commander.js +1211 -492
- package/dist/opencode.d.ts +53 -38
- package/dist/opencode.js +1209 -488
- package/dist/router-browser.d.ts +53 -38
- package/dist/router-browser.js +1238 -519
- package/dist/router-define.d.ts +53 -38
- package/dist/router-simple.js +1 -1
- package/dist/router.d.ts +53 -38
- package/dist/router.js +1261 -540
- package/dist/ws.d.ts +53 -38
- package/dist/ws.js +14 -14
- package/package.json +7 -6
- package/src/route.ts +3 -30
- package/src/test/app-type.ts +1 -1
- package/src/test/run-schema.ts +15 -1
- package/src/types/index.ts +39 -0
- package/src/test/chat.ts +0 -17
package/dist/ws.d.ts
CHANGED
|
@@ -76,6 +76,57 @@ declare class MockProcess {
|
|
|
76
76
|
desctroy(): void;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
/** JSON Schema 基本类型映射到 TypeScript 类型 */
|
|
80
|
+
type JsonSchemaTypeToTS<T> = T extends {
|
|
81
|
+
type: "string";
|
|
82
|
+
} ? string : T extends {
|
|
83
|
+
type: "boolean";
|
|
84
|
+
} ? boolean : T extends {
|
|
85
|
+
type: "number";
|
|
86
|
+
} ? number : T extends {
|
|
87
|
+
type: "integer";
|
|
88
|
+
} ? number : T extends {
|
|
89
|
+
type: "object";
|
|
90
|
+
} ? object : T extends {
|
|
91
|
+
type: "array";
|
|
92
|
+
} ? any[] : any;
|
|
93
|
+
/** 将 args shape(key -> JSON Schema 类型)转换为 payload 类型,支持 optional: true 的字段为可选 */
|
|
94
|
+
type ArgsShapeToPayload<T> = {
|
|
95
|
+
[K in keyof T as T[K] extends {
|
|
96
|
+
optional: true;
|
|
97
|
+
} ? never : K]: JsonSchemaTypeToTS<T[K]>;
|
|
98
|
+
} & {
|
|
99
|
+
[K in keyof T as T[K] extends {
|
|
100
|
+
optional: true;
|
|
101
|
+
} ? K : never]?: JsonSchemaTypeToTS<T[K]>;
|
|
102
|
+
};
|
|
103
|
+
/** 处理两种 args 格式:完整 JSON Schema(含 properties)或简单 key->type 映射 */
|
|
104
|
+
type ArgsToPayload<T> = T extends {
|
|
105
|
+
type: "object";
|
|
106
|
+
properties: infer P;
|
|
107
|
+
} ? ArgsShapeToPayload<P> : ArgsShapeToPayload<T>;
|
|
108
|
+
/** 从 API 定义中提取 metadata.args */
|
|
109
|
+
type ExtractArgs<T> = T extends {
|
|
110
|
+
metadata: {
|
|
111
|
+
args: infer A;
|
|
112
|
+
};
|
|
113
|
+
} ? A : {};
|
|
114
|
+
/** 从 API 定义中提取 metadata.returns */
|
|
115
|
+
type ExtractReturns<T> = T extends {
|
|
116
|
+
metadata: {
|
|
117
|
+
returns: infer R;
|
|
118
|
+
};
|
|
119
|
+
} ? R : unknown;
|
|
120
|
+
/** runAction 第二个参数的类型,根据第一个参数的 metadata.args 推断 */
|
|
121
|
+
type RunActionPayload<T> = ArgsToPayload<ExtractArgs<T>>;
|
|
122
|
+
/** runAction 的返回类型,根据 API 定义中的 metadata.returns 推断 data 字段类型 */
|
|
123
|
+
type RunActionReturns<T> = {
|
|
124
|
+
code: number | string;
|
|
125
|
+
data?: unknown extends ExtractReturns<T> ? any : ArgsToPayload<ExtractReturns<T>>;
|
|
126
|
+
message?: string;
|
|
127
|
+
[key: string]: any;
|
|
128
|
+
};
|
|
129
|
+
|
|
79
130
|
type RouterContextT = {
|
|
80
131
|
code?: number;
|
|
81
132
|
[key: string]: any;
|
|
@@ -516,8 +567,9 @@ declare class QueryRouterServer<C extends SimpleObject = SimpleObject> extends Q
|
|
|
516
567
|
key?: string;
|
|
517
568
|
metadata?: {
|
|
518
569
|
args?: any;
|
|
570
|
+
returns?: any;
|
|
519
571
|
};
|
|
520
|
-
} = {}>(api: T, payload: RunActionPayload<T>, ctx?: RouteContext<C>): Promise<
|
|
572
|
+
} = {}>(api: T, payload: RunActionPayload<T>, ctx?: RouteContext<C>): Promise<RunActionReturns<T>>;
|
|
521
573
|
/**
|
|
522
574
|
* 创建认证相关的中间件,默认是 auth, auth-admin, auth-can 三个中间件
|
|
523
575
|
* @param fun 认证函数,接收 RouteContext 和认证类型
|
|
@@ -526,43 +578,6 @@ declare class QueryRouterServer<C extends SimpleObject = SimpleObject> extends Q
|
|
|
526
578
|
overwrite?: boolean;
|
|
527
579
|
}): Promise<void>;
|
|
528
580
|
}
|
|
529
|
-
/** JSON Schema 基本类型映射到 TypeScript 类型 */
|
|
530
|
-
type JsonSchemaTypeToTS<T> = T extends {
|
|
531
|
-
type: "string";
|
|
532
|
-
} ? string : T extends {
|
|
533
|
-
type: "boolean";
|
|
534
|
-
} ? boolean : T extends {
|
|
535
|
-
type: "number";
|
|
536
|
-
} ? number : T extends {
|
|
537
|
-
type: "integer";
|
|
538
|
-
} ? number : T extends {
|
|
539
|
-
type: "object";
|
|
540
|
-
} ? object : T extends {
|
|
541
|
-
type: "array";
|
|
542
|
-
} ? any[] : any;
|
|
543
|
-
/** 将 args shape(key -> JSON Schema 类型)转换为 payload 类型,支持 optional: true 的字段为可选 */
|
|
544
|
-
type ArgsShapeToPayload<T> = {
|
|
545
|
-
[K in keyof T as T[K] extends {
|
|
546
|
-
optional: true;
|
|
547
|
-
} ? never : K]: JsonSchemaTypeToTS<T[K]>;
|
|
548
|
-
} & {
|
|
549
|
-
[K in keyof T as T[K] extends {
|
|
550
|
-
optional: true;
|
|
551
|
-
} ? K : never]?: JsonSchemaTypeToTS<T[K]>;
|
|
552
|
-
};
|
|
553
|
-
/** 处理两种 args 格式:完整 JSON Schema(含 properties)或简单 key->type 映射 */
|
|
554
|
-
type ArgsToPayload<T> = T extends {
|
|
555
|
-
type: "object";
|
|
556
|
-
properties: infer P;
|
|
557
|
-
} ? ArgsShapeToPayload<P> : ArgsShapeToPayload<T>;
|
|
558
|
-
/** 从 API 定义中提取 metadata.args */
|
|
559
|
-
type ExtractArgs<T> = T extends {
|
|
560
|
-
metadata: {
|
|
561
|
-
args: infer A;
|
|
562
|
-
};
|
|
563
|
-
} ? A : {};
|
|
564
|
-
/** runAction 第二个参数的类型,根据第一个参数的 metadata.args 推断 */
|
|
565
|
-
type RunActionPayload<T> = ArgsToPayload<ExtractArgs<T>>;
|
|
566
581
|
|
|
567
582
|
type Cors = {
|
|
568
583
|
/**
|
package/dist/ws.js
CHANGED
|
@@ -32,7 +32,7 @@ var __toESM = (mod, isNodeMode, target) => {
|
|
|
32
32
|
var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
|
|
33
33
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
34
34
|
|
|
35
|
-
// node_modules/ws/lib/constants.js
|
|
35
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/constants.js
|
|
36
36
|
var require_constants = __commonJS((exports, module) => {
|
|
37
37
|
var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"];
|
|
38
38
|
var hasBlob = typeof Blob !== "undefined";
|
|
@@ -51,7 +51,7 @@ var require_constants = __commonJS((exports, module) => {
|
|
|
51
51
|
};
|
|
52
52
|
});
|
|
53
53
|
|
|
54
|
-
// node_modules/ws/lib/buffer-util.js
|
|
54
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/buffer-util.js
|
|
55
55
|
var require_buffer_util = __commonJS((exports, module) => {
|
|
56
56
|
var { EMPTY_BUFFER } = require_constants();
|
|
57
57
|
var FastBuffer = Buffer[Symbol.species];
|
|
@@ -112,7 +112,7 @@ var require_buffer_util = __commonJS((exports, module) => {
|
|
|
112
112
|
};
|
|
113
113
|
});
|
|
114
114
|
|
|
115
|
-
// node_modules/ws/lib/limiter.js
|
|
115
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/limiter.js
|
|
116
116
|
var require_limiter = __commonJS((exports, module) => {
|
|
117
117
|
var kDone = Symbol("kDone");
|
|
118
118
|
var kRun = Symbol("kRun");
|
|
@@ -144,7 +144,7 @@ var require_limiter = __commonJS((exports, module) => {
|
|
|
144
144
|
module.exports = Limiter;
|
|
145
145
|
});
|
|
146
146
|
|
|
147
|
-
// node_modules/ws/lib/permessage-deflate.js
|
|
147
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/permessage-deflate.js
|
|
148
148
|
var require_permessage_deflate = __commonJS((exports, module) => {
|
|
149
149
|
var zlib = __require("zlib");
|
|
150
150
|
var bufferUtil = require_buffer_util();
|
|
@@ -404,7 +404,7 @@ var require_permessage_deflate = __commonJS((exports, module) => {
|
|
|
404
404
|
}
|
|
405
405
|
});
|
|
406
406
|
|
|
407
|
-
// node_modules/ws/lib/validation.js
|
|
407
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/validation.js
|
|
408
408
|
var require_validation = __commonJS((exports, module) => {
|
|
409
409
|
var { isUtf8 } = __require("buffer");
|
|
410
410
|
var { hasBlob } = require_constants();
|
|
@@ -584,7 +584,7 @@ var require_validation = __commonJS((exports, module) => {
|
|
|
584
584
|
}
|
|
585
585
|
});
|
|
586
586
|
|
|
587
|
-
// node_modules/ws/lib/receiver.js
|
|
587
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/receiver.js
|
|
588
588
|
var require_receiver = __commonJS((exports, module) => {
|
|
589
589
|
var { Writable } = __require("stream");
|
|
590
590
|
var PerMessageDeflate = require_permessage_deflate();
|
|
@@ -965,7 +965,7 @@ var require_receiver = __commonJS((exports, module) => {
|
|
|
965
965
|
module.exports = Receiver;
|
|
966
966
|
});
|
|
967
967
|
|
|
968
|
-
// node_modules/ws/lib/sender.js
|
|
968
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/sender.js
|
|
969
969
|
var require_sender = __commonJS((exports, module) => {
|
|
970
970
|
var { Duplex } = __require("stream");
|
|
971
971
|
var { randomFillSync } = __require("crypto");
|
|
@@ -1319,7 +1319,7 @@ var require_sender = __commonJS((exports, module) => {
|
|
|
1319
1319
|
}
|
|
1320
1320
|
});
|
|
1321
1321
|
|
|
1322
|
-
// node_modules/ws/lib/event-target.js
|
|
1322
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/event-target.js
|
|
1323
1323
|
var require_event_target = __commonJS((exports, module) => {
|
|
1324
1324
|
var { kForOnEventAttribute, kListener } = require_constants();
|
|
1325
1325
|
var kCode = Symbol("kCode");
|
|
@@ -1470,7 +1470,7 @@ var require_event_target = __commonJS((exports, module) => {
|
|
|
1470
1470
|
}
|
|
1471
1471
|
});
|
|
1472
1472
|
|
|
1473
|
-
// node_modules/ws/lib/extension.js
|
|
1473
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/extension.js
|
|
1474
1474
|
var require_extension = __commonJS((exports, module) => {
|
|
1475
1475
|
var { tokenChars } = require_validation();
|
|
1476
1476
|
function push(dest, name, elem) {
|
|
@@ -1635,7 +1635,7 @@ var require_extension = __commonJS((exports, module) => {
|
|
|
1635
1635
|
module.exports = { format, parse };
|
|
1636
1636
|
});
|
|
1637
1637
|
|
|
1638
|
-
// node_modules/ws/lib/websocket.js
|
|
1638
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/websocket.js
|
|
1639
1639
|
var require_websocket = __commonJS((exports, module) => {
|
|
1640
1640
|
var EventEmitter = __require("events");
|
|
1641
1641
|
var https = __require("https");
|
|
@@ -2394,7 +2394,7 @@ var require_websocket = __commonJS((exports, module) => {
|
|
|
2394
2394
|
}
|
|
2395
2395
|
});
|
|
2396
2396
|
|
|
2397
|
-
// node_modules/ws/lib/stream.js
|
|
2397
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/stream.js
|
|
2398
2398
|
var require_stream = __commonJS((exports, module) => {
|
|
2399
2399
|
var WebSocket = require_websocket();
|
|
2400
2400
|
var { Duplex } = __require("stream");
|
|
@@ -2497,7 +2497,7 @@ var require_stream = __commonJS((exports, module) => {
|
|
|
2497
2497
|
module.exports = createWebSocketStream;
|
|
2498
2498
|
});
|
|
2499
2499
|
|
|
2500
|
-
// node_modules/ws/lib/subprotocol.js
|
|
2500
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/subprotocol.js
|
|
2501
2501
|
var require_subprotocol = __commonJS((exports, module) => {
|
|
2502
2502
|
var { tokenChars } = require_validation();
|
|
2503
2503
|
function parse(header) {
|
|
@@ -2542,7 +2542,7 @@ var require_subprotocol = __commonJS((exports, module) => {
|
|
|
2542
2542
|
module.exports = { parse };
|
|
2543
2543
|
});
|
|
2544
2544
|
|
|
2545
|
-
// node_modules/ws/lib/websocket-server.js
|
|
2545
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/lib/websocket-server.js
|
|
2546
2546
|
var require_websocket_server = __commonJS((exports, module) => {
|
|
2547
2547
|
var EventEmitter = __require("events");
|
|
2548
2548
|
var http = __require("http");
|
|
@@ -2841,7 +2841,7 @@ var require_websocket_server = __commonJS((exports, module) => {
|
|
|
2841
2841
|
}
|
|
2842
2842
|
});
|
|
2843
2843
|
|
|
2844
|
-
// node_modules/ws/wrapper.mjs
|
|
2844
|
+
// node_modules/.pnpm/@kevisual+ws@8.0.0/node_modules/@kevisual/ws/wrapper.mjs
|
|
2845
2845
|
var import_stream = __toESM(require_stream(), 1);
|
|
2846
2846
|
var import_receiver = __toESM(require_receiver(), 1);
|
|
2847
2847
|
var import_sender = __toESM(require_sender(), 1);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@kevisual/router",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.12",
|
|
5
5
|
"description": "",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/router.js",
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@kevisual/code-builder": "^0.0.7",
|
|
26
|
-
"@kevisual/context": "^0.
|
|
26
|
+
"@kevisual/context": "^0.1.1",
|
|
27
27
|
"@kevisual/dts": "^0.0.4",
|
|
28
28
|
"@kevisual/js-filter": "^0.0.6",
|
|
29
29
|
"@kevisual/local-proxy": "^0.0.8",
|
|
30
30
|
"@kevisual/query": "^0.0.56",
|
|
31
31
|
"@kevisual/remote-app": "^0.0.7",
|
|
32
32
|
"@kevisual/use-config": "^1.0.30",
|
|
33
|
-
"@opencode-ai/plugin": "^1.14.
|
|
33
|
+
"@opencode-ai/plugin": "^1.14.30",
|
|
34
34
|
"@types/bun": "^1.3.13",
|
|
35
35
|
"@types/crypto-js": "^4.2.2",
|
|
36
36
|
"@types/node": "^25.6.0",
|
|
@@ -39,10 +39,10 @@
|
|
|
39
39
|
"@types/xml2js": "^0.4.14",
|
|
40
40
|
"commander": "^14.0.3",
|
|
41
41
|
"crypto-js": "^4.2.0",
|
|
42
|
-
"es-toolkit": "^1.46.
|
|
42
|
+
"es-toolkit": "^1.46.1",
|
|
43
43
|
"eventemitter3": "^5.0.4",
|
|
44
44
|
"fast-glob": "^3.3.3",
|
|
45
|
-
"nanoid": "^5.1.
|
|
45
|
+
"nanoid": "^5.1.11",
|
|
46
46
|
"path-to-regexp": "^8.4.2",
|
|
47
47
|
"send": "^1.2.1",
|
|
48
48
|
"typescript": "^6.0.3",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"url": "git+https://github.com/abearxiong/kevisual-router.git"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"zod": "^4.
|
|
57
|
+
"zod": "^4.4.1"
|
|
58
58
|
},
|
|
59
59
|
"publishConfig": {
|
|
60
60
|
"access": "public"
|
|
@@ -70,6 +70,7 @@
|
|
|
70
70
|
"./ws": "./dist/ws.js",
|
|
71
71
|
"./mod.ts": "./mod.ts",
|
|
72
72
|
"./src/*": "./src/*",
|
|
73
|
+
"./types/*": "./src/types/*",
|
|
73
74
|
"./modules/*": "./src/modules/*"
|
|
74
75
|
}
|
|
75
76
|
}
|
package/src/route.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { listenProcess, MockProcess } from './utils/listen-process.ts';
|
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { hashIdMd5Sync, randomId } from './utils/random.ts';
|
|
6
6
|
import * as schema from './validator/schema.ts';
|
|
7
|
-
|
|
7
|
+
import type { RunActionPayload, RunActionReturns } from './types/index.ts'
|
|
8
8
|
export type RouterContextT = { code?: number;[key: string]: any };
|
|
9
9
|
|
|
10
10
|
type BuildRouteContext<M, U> = M extends { args?: infer A }
|
|
@@ -781,11 +781,11 @@ export class QueryRouterServer<C extends SimpleObject = SimpleObject> extends Qu
|
|
|
781
781
|
async runLocal(msg: { rid?: string; path?: string; key?: string; payload?: any, args?: any, token?: string, data?: any }, ctx?: Partial<RouteContext<C>>) {
|
|
782
782
|
return this.run(msg, { ...ctx, appId: this.appId } as RouteContext<C>);
|
|
783
783
|
}
|
|
784
|
-
async runAction<T extends { rid?: string; path?: string; key?: string; metadata?: { args?: any } } = {}>(
|
|
784
|
+
async runAction<T extends { rid?: string; path?: string; key?: string; metadata?: { args?: any, returns?: any } } = {}>(
|
|
785
785
|
api: T,
|
|
786
786
|
payload: RunActionPayload<T>,
|
|
787
787
|
ctx?: RouteContext<C>
|
|
788
|
-
) {
|
|
788
|
+
): Promise<RunActionReturns<T>> {
|
|
789
789
|
const { path, key, rid } = api as any;
|
|
790
790
|
return this.run({ path, key, rid, payload }, ctx);
|
|
791
791
|
}
|
|
@@ -834,30 +834,3 @@ export class QueryRouterServer<C extends SimpleObject = SimpleObject> extends Qu
|
|
|
834
834
|
|
|
835
835
|
export class Mini extends QueryRouterServer { }
|
|
836
836
|
|
|
837
|
-
/** JSON Schema 基本类型映射到 TypeScript 类型 */
|
|
838
|
-
type JsonSchemaTypeToTS<T> =
|
|
839
|
-
T extends { type: "string" } ? string :
|
|
840
|
-
T extends { type: "boolean" } ? boolean :
|
|
841
|
-
T extends { type: "number" } ? number :
|
|
842
|
-
T extends { type: "integer" } ? number :
|
|
843
|
-
T extends { type: "object" } ? object :
|
|
844
|
-
T extends { type: "array" } ? any[] :
|
|
845
|
-
any;
|
|
846
|
-
|
|
847
|
-
/** 将 args shape(key -> JSON Schema 类型)转换为 payload 类型,支持 optional: true 的字段为可选 */
|
|
848
|
-
type ArgsShapeToPayload<T> =
|
|
849
|
-
{ [K in keyof T as T[K] extends { optional: true } ? never : K]: JsonSchemaTypeToTS<T[K]> } &
|
|
850
|
-
{ [K in keyof T as T[K] extends { optional: true } ? K : never]?: JsonSchemaTypeToTS<T[K]> };
|
|
851
|
-
|
|
852
|
-
/** 处理两种 args 格式:完整 JSON Schema(含 properties)或简单 key->type 映射 */
|
|
853
|
-
type ArgsToPayload<T> =
|
|
854
|
-
T extends { type: "object"; properties: infer P }
|
|
855
|
-
? ArgsShapeToPayload<P>
|
|
856
|
-
: ArgsShapeToPayload<T>;
|
|
857
|
-
|
|
858
|
-
/** 从 API 定义中提取 metadata.args */
|
|
859
|
-
type ExtractArgs<T> =
|
|
860
|
-
T extends { metadata: { args: infer A } } ? A : {};
|
|
861
|
-
|
|
862
|
-
/** runAction 第二个参数的类型,根据第一个参数的 metadata.args 推断 */
|
|
863
|
-
export type RunActionPayload<T> = ArgsToPayload<ExtractArgs<T>>;
|
package/src/test/app-type.ts
CHANGED
package/src/test/run-schema.ts
CHANGED
|
@@ -70,6 +70,19 @@ const api = {
|
|
|
70
70
|
"includeProfile": {
|
|
71
71
|
"type": "boolean"
|
|
72
72
|
}
|
|
73
|
+
},
|
|
74
|
+
"returns": {
|
|
75
|
+
"type": "object",
|
|
76
|
+
"properties": {
|
|
77
|
+
"name": {
|
|
78
|
+
"type": "string"
|
|
79
|
+
},
|
|
80
|
+
"age": {
|
|
81
|
+
"type": "number"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"additionalProperties": false,
|
|
85
|
+
"required": ["name", "age"]
|
|
73
86
|
}
|
|
74
87
|
}
|
|
75
88
|
}
|
|
@@ -85,4 +98,5 @@ app.runAction(a2.app_domain_manager.get, { data: { idd: "1" }, })
|
|
|
85
98
|
app.runAction(api.app_domain_manager.delete, { domainId: "d1" })
|
|
86
99
|
|
|
87
100
|
// getUser 的 args 是 { userId: string, includeProfile: boolean }
|
|
88
|
-
app.runAction(api.user_manager.getUser, { userId: "u1", includeProfile: true })
|
|
101
|
+
const res = await app.runAction(api.user_manager.getUser, { userId: "u1", includeProfile: true })
|
|
102
|
+
const name: string = res.data.name;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/** JSON Schema 基本类型映射到 TypeScript 类型 */
|
|
2
|
+
type JsonSchemaTypeToTS<T> =
|
|
3
|
+
T extends { type: "string" } ? string :
|
|
4
|
+
T extends { type: "boolean" } ? boolean :
|
|
5
|
+
T extends { type: "number" } ? number :
|
|
6
|
+
T extends { type: "integer" } ? number :
|
|
7
|
+
T extends { type: "object" } ? object :
|
|
8
|
+
T extends { type: "array" } ? any[] :
|
|
9
|
+
any;
|
|
10
|
+
|
|
11
|
+
/** 将 args shape(key -> JSON Schema 类型)转换为 payload 类型,支持 optional: true 的字段为可选 */
|
|
12
|
+
type ArgsShapeToPayload<T> =
|
|
13
|
+
{ [K in keyof T as T[K] extends { optional: true } ? never : K]: JsonSchemaTypeToTS<T[K]> } &
|
|
14
|
+
{ [K in keyof T as T[K] extends { optional: true } ? K : never]?: JsonSchemaTypeToTS<T[K]> };
|
|
15
|
+
|
|
16
|
+
/** 处理两种 args 格式:完整 JSON Schema(含 properties)或简单 key->type 映射 */
|
|
17
|
+
type ArgsToPayload<T> =
|
|
18
|
+
T extends { type: "object"; properties: infer P }
|
|
19
|
+
? ArgsShapeToPayload<P>
|
|
20
|
+
: ArgsShapeToPayload<T>;
|
|
21
|
+
|
|
22
|
+
/** 从 API 定义中提取 metadata.args */
|
|
23
|
+
type ExtractArgs<T> =
|
|
24
|
+
T extends { metadata: { args: infer A } } ? A : {};
|
|
25
|
+
|
|
26
|
+
/** 从 API 定义中提取 metadata.returns */
|
|
27
|
+
type ExtractReturns<T> =
|
|
28
|
+
T extends { metadata: { returns: infer R } } ? R : unknown;
|
|
29
|
+
|
|
30
|
+
/** runAction 第二个参数的类型,根据第一个参数的 metadata.args 推断 */
|
|
31
|
+
export type RunActionPayload<T> = ArgsToPayload<ExtractArgs<T>>;
|
|
32
|
+
|
|
33
|
+
/** runAction 的返回类型,根据 API 定义中的 metadata.returns 推断 data 字段类型 */
|
|
34
|
+
export type RunActionReturns<T> = {
|
|
35
|
+
code: number | string;
|
|
36
|
+
data?: unknown extends ExtractReturns<T> ? any : ArgsToPayload<ExtractReturns<T>>;
|
|
37
|
+
message?: string;
|
|
38
|
+
[key: string]: any;
|
|
39
|
+
};
|
package/src/test/chat.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { App } from '../app.ts'
|
|
2
|
-
import { RouterChat } from '@/modules/chat.ts';
|
|
3
|
-
|
|
4
|
-
const app = new App();
|
|
5
|
-
|
|
6
|
-
app.prompt(`获取时间的工具`).define(async (ctx) => {
|
|
7
|
-
ctx.body = '123'
|
|
8
|
-
}).addTo(app);
|
|
9
|
-
|
|
10
|
-
app.prompt('获取天气的工具。\n参数是 city 为对应的城市').define(async (ctx) => {
|
|
11
|
-
ctx.body = '晴天'
|
|
12
|
-
}).addTo(app);
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
export const chat = new RouterChat({ router: app.router });
|
|
16
|
-
|
|
17
|
-
console.log(chat.getChatPrompt());
|