@zhin.js/client 1.0.16 → 1.0.18
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/client/app.ts +228 -0
- package/client/index.ts +42 -14
- package/client/websocket/hooks.ts +218 -510
- package/client/websocket/index.ts +6 -43
- package/client/websocket/instance.ts +10 -32
- package/client/websocket/manager.ts +173 -390
- package/client/websocket/types.ts +58 -222
- package/dist/app.d.ts +95 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +147 -0
- package/dist/app.js.map +1 -0
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -14
- package/dist/index.js.map +1 -1
- package/dist/websocket/hooks.d.ts +35 -58
- package/dist/websocket/hooks.d.ts.map +1 -1
- package/dist/websocket/hooks.js +134 -410
- package/dist/websocket/hooks.js.map +1 -1
- package/dist/websocket/index.d.ts +5 -10
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +5 -25
- package/dist/websocket/index.js.map +1 -1
- package/dist/websocket/instance.d.ts +1 -14
- package/dist/websocket/instance.d.ts.map +1 -1
- package/dist/websocket/instance.js +2 -20
- package/dist/websocket/instance.js.map +1 -1
- package/dist/websocket/manager.d.ts +23 -93
- package/dist/websocket/manager.d.ts.map +1 -1
- package/dist/websocket/manager.js +87 -227
- package/dist/websocket/manager.js.map +1 -1
- package/dist/websocket/types.d.ts +35 -122
- package/dist/websocket/types.d.ts.map +1 -1
- package/dist/websocket/types.js +4 -13
- package/dist/websocket/types.js.map +1 -1
- package/package.json +12 -11
- package/client/router/index.tsx +0 -54
- package/client/store/index.ts +0 -132
- package/client/store/reducers/config.ts +0 -135
- package/client/store/reducers/index.ts +0 -19
- package/client/store/reducers/route.ts +0 -126
- package/client/store/reducers/script.ts +0 -109
- package/client/store/reducers/ui.ts +0 -31
- package/client/websocket/messageHandler.ts +0 -208
- package/dist/router/index.d.ts +0 -25
- package/dist/router/index.d.ts.map +0 -1
- package/dist/router/index.js +0 -48
- package/dist/router/index.js.map +0 -1
- package/dist/store/index.d.ts +0 -19
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/index.js +0 -67
- package/dist/store/index.js.map +0 -1
- package/dist/store/reducers/config.d.ts +0 -54
- package/dist/store/reducers/config.d.ts.map +0 -1
- package/dist/store/reducers/config.js +0 -78
- package/dist/store/reducers/config.js.map +0 -1
- package/dist/store/reducers/index.d.ts +0 -13
- package/dist/store/reducers/index.d.ts.map +0 -1
- package/dist/store/reducers/index.js +0 -11
- package/dist/store/reducers/index.js.map +0 -1
- package/dist/store/reducers/route.d.ts +0 -30
- package/dist/store/reducers/route.d.ts.map +0 -1
- package/dist/store/reducers/route.js +0 -85
- package/dist/store/reducers/route.js.map +0 -1
- package/dist/store/reducers/script.d.ts +0 -13
- package/dist/store/reducers/script.d.ts.map +0 -1
- package/dist/store/reducers/script.js +0 -78
- package/dist/store/reducers/script.js.map +0 -1
- package/dist/store/reducers/ui.d.ts +0 -8
- package/dist/store/reducers/ui.d.ts.map +0 -1
- package/dist/store/reducers/ui.js +0 -23
- package/dist/store/reducers/ui.js.map +0 -1
- package/dist/websocket/messageHandler.d.ts +0 -58
- package/dist/websocket/messageHandler.d.ts.map +0 -1
- package/dist/websocket/messageHandler.js +0 -174
- package/dist/websocket/messageHandler.js.map +0 -1
|
@@ -1,144 +1,26 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket 相关类型定义
|
|
3
|
-
*/
|
|
4
1
|
export interface BaseMessage {
|
|
5
2
|
type: string;
|
|
6
3
|
timestamp?: number;
|
|
7
4
|
requestId?: number;
|
|
8
5
|
error?: string;
|
|
9
6
|
}
|
|
10
|
-
export
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
value: string[];
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
export interface ScriptAddMessage extends BaseMessage {
|
|
18
|
-
type: 'add';
|
|
19
|
-
data: {
|
|
20
|
-
key: 'entries';
|
|
21
|
-
value: string;
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
export interface ScriptDeleteMessage extends BaseMessage {
|
|
25
|
-
type: 'delete';
|
|
26
|
-
data: {
|
|
27
|
-
key: 'entries';
|
|
28
|
-
value: string;
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
export interface ConfigGetMessage extends BaseMessage {
|
|
32
|
-
type: 'config:get';
|
|
33
|
-
pluginName: string;
|
|
34
|
-
}
|
|
35
|
-
export interface ConfigSetMessage extends BaseMessage {
|
|
36
|
-
type: 'config:set';
|
|
37
|
-
pluginName: string;
|
|
38
|
-
data: any;
|
|
39
|
-
}
|
|
40
|
-
export interface ConfigUpdatedMessage extends BaseMessage {
|
|
41
|
-
type: 'config:updated';
|
|
42
|
-
pluginName: string;
|
|
43
|
-
data: any;
|
|
44
|
-
}
|
|
45
|
-
export interface ConfigBatchMessage extends BaseMessage {
|
|
46
|
-
type: 'config:batch';
|
|
47
|
-
data: Record<string, any>;
|
|
48
|
-
}
|
|
49
|
-
export interface ConfigErrorMessage extends BaseMessage {
|
|
50
|
-
type: 'config:error';
|
|
51
|
-
pluginName: string;
|
|
52
|
-
error: string;
|
|
53
|
-
}
|
|
54
|
-
export interface SchemaGetMessage extends BaseMessage {
|
|
55
|
-
type: 'schema:get';
|
|
56
|
-
pluginName: string;
|
|
57
|
-
}
|
|
58
|
-
export interface SchemaUpdatedMessage extends BaseMessage {
|
|
59
|
-
type: 'schema:updated';
|
|
60
|
-
pluginName: string;
|
|
61
|
-
data: any;
|
|
62
|
-
}
|
|
63
|
-
export interface SchemaBatchMessage extends BaseMessage {
|
|
64
|
-
type: 'schema:batch';
|
|
65
|
-
data: Record<string, any>;
|
|
66
|
-
}
|
|
67
|
-
export interface InitDataMessage extends BaseMessage {
|
|
68
|
-
type: 'init-data';
|
|
69
|
-
}
|
|
70
|
-
export interface DataUpdateMessage extends BaseMessage {
|
|
71
|
-
type: 'data-update';
|
|
72
|
-
}
|
|
73
|
-
export interface HmrReloadMessage extends BaseMessage {
|
|
74
|
-
type: 'hmr:reload';
|
|
75
|
-
data?: {
|
|
76
|
-
file?: string;
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
export interface SystemRestartingMessage extends BaseMessage {
|
|
80
|
-
type: 'system:restarting';
|
|
81
|
-
}
|
|
82
|
-
export interface FileTreeNode {
|
|
83
|
-
name: string;
|
|
84
|
-
path: string;
|
|
85
|
-
type: 'file' | 'directory';
|
|
86
|
-
children?: FileTreeNode[];
|
|
87
|
-
}
|
|
88
|
-
export type DatabaseType = 'related' | 'document' | 'keyvalue';
|
|
89
|
-
export interface DatabaseInfo {
|
|
90
|
-
dialect: string;
|
|
91
|
-
type: DatabaseType;
|
|
92
|
-
tables: string[];
|
|
93
|
-
}
|
|
94
|
-
export interface TableInfo {
|
|
95
|
-
name: string;
|
|
96
|
-
columns?: Record<string, {
|
|
97
|
-
type: string;
|
|
98
|
-
primary?: boolean;
|
|
99
|
-
nullable?: boolean;
|
|
100
|
-
default?: any;
|
|
101
|
-
}>;
|
|
102
|
-
}
|
|
103
|
-
export interface SelectResult {
|
|
104
|
-
rows: any[];
|
|
105
|
-
total: number;
|
|
106
|
-
page: number;
|
|
107
|
-
pageSize: number;
|
|
108
|
-
}
|
|
109
|
-
export interface KvEntry {
|
|
110
|
-
key: string;
|
|
111
|
-
value: any;
|
|
112
|
-
}
|
|
113
|
-
export type WebSocketMessage = ScriptSyncMessage | ScriptAddMessage | ScriptDeleteMessage | ConfigGetMessage | ConfigSetMessage | ConfigUpdatedMessage | ConfigBatchMessage | ConfigErrorMessage | SchemaGetMessage | SchemaUpdatedMessage | SchemaBatchMessage | InitDataMessage | DataUpdateMessage | HmrReloadMessage | SystemRestartingMessage;
|
|
7
|
+
export type WebSocketMessage = BaseMessage & {
|
|
8
|
+
data?: unknown;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
};
|
|
114
11
|
export interface WebSocketConfig {
|
|
115
|
-
/** WebSocket 服务器 URL */
|
|
116
12
|
url?: string;
|
|
117
|
-
/** 重连间隔时间(毫秒) */
|
|
118
13
|
reconnectInterval?: number;
|
|
119
|
-
/** 最大重连尝试次数 */
|
|
120
14
|
maxReconnectAttempts?: number;
|
|
121
|
-
/** 请求超时时间(毫秒) */
|
|
122
15
|
requestTimeout?: number;
|
|
123
16
|
}
|
|
124
17
|
export interface WebSocketCallbacks {
|
|
125
|
-
/** 连接建立回调 */
|
|
126
18
|
onConnect?: () => void;
|
|
127
|
-
/** 连接断开回调 */
|
|
128
19
|
onDisconnect?: () => void;
|
|
129
|
-
/** 连接错误回调 */
|
|
130
20
|
onError?: (error: Event) => void;
|
|
131
|
-
/** 消息接收回调 */
|
|
132
21
|
onMessage?: (message: WebSocketMessage) => void;
|
|
133
22
|
}
|
|
134
|
-
export interface UseConfigOptions {
|
|
135
|
-
/** 是否自动加载配置 */
|
|
136
|
-
autoLoad?: boolean;
|
|
137
|
-
/** 是否自动加载 Schema */
|
|
138
|
-
autoLoadSchema?: boolean;
|
|
139
|
-
}
|
|
140
23
|
export interface UseWebSocketOptions {
|
|
141
|
-
/** 是否自动连接 */
|
|
142
24
|
autoConnect?: boolean;
|
|
143
25
|
}
|
|
144
26
|
export declare enum ConnectionState {
|
|
@@ -162,4 +44,35 @@ export declare class ConnectionError extends WebSocketError {
|
|
|
162
44
|
export declare class MessageError extends WebSocketError {
|
|
163
45
|
constructor(message: string, originalError?: Error);
|
|
164
46
|
}
|
|
47
|
+
export interface FileTreeNode {
|
|
48
|
+
name: string;
|
|
49
|
+
path: string;
|
|
50
|
+
type: "file" | "directory";
|
|
51
|
+
children?: FileTreeNode[];
|
|
52
|
+
}
|
|
53
|
+
export type DatabaseType = "related" | "document" | "keyvalue";
|
|
54
|
+
export interface DatabaseInfo {
|
|
55
|
+
dialect: string;
|
|
56
|
+
type: DatabaseType;
|
|
57
|
+
tables: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface TableInfo {
|
|
60
|
+
name: string;
|
|
61
|
+
columns?: Record<string, {
|
|
62
|
+
type: string;
|
|
63
|
+
primary?: boolean;
|
|
64
|
+
nullable?: boolean;
|
|
65
|
+
default?: unknown;
|
|
66
|
+
}>;
|
|
67
|
+
}
|
|
68
|
+
export interface SelectResult {
|
|
69
|
+
rows: unknown[];
|
|
70
|
+
total: number;
|
|
71
|
+
page: number;
|
|
72
|
+
pageSize: number;
|
|
73
|
+
}
|
|
74
|
+
export interface KvEntry {
|
|
75
|
+
key: string;
|
|
76
|
+
value: unknown;
|
|
77
|
+
}
|
|
165
78
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../client/websocket/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../client/websocket/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,oBAAY,eAAe;IACzB,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,YAAY,iBAAiB;IAC7B,KAAK,UAAU;CAChB;AAED,qBAAa,cAAe,SAAQ,KAAK;IAG9B,IAAI,EAAE,MAAM;IACZ,aAAa,CAAC,EAAE,KAAK;gBAF5B,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,aAAa,CAAC,EAAE,KAAK,YAAA;CAK/B;AAED,qBAAa,mBAAoB,SAAQ,cAAc;gBACzC,SAAS,EAAE,MAAM;CAG9B;AAED,qBAAa,eAAgB,SAAQ,cAAc;gBACrC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK;CAGnD;AAED,qBAAa,YAAa,SAAQ,cAAc;gBAClC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,KAAK;CAGnD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACtG;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CAChB"}
|
package/dist/websocket/types.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* WebSocket 相关类型定义
|
|
3
|
-
*/
|
|
4
|
-
// ============================================================================
|
|
5
|
-
// 连接状态枚举
|
|
6
|
-
// ============================================================================
|
|
7
1
|
export var ConnectionState;
|
|
8
2
|
(function (ConnectionState) {
|
|
9
3
|
ConnectionState["DISCONNECTED"] = "disconnected";
|
|
@@ -12,9 +6,6 @@ export var ConnectionState;
|
|
|
12
6
|
ConnectionState["RECONNECTING"] = "reconnecting";
|
|
13
7
|
ConnectionState["ERROR"] = "error";
|
|
14
8
|
})(ConnectionState || (ConnectionState = {}));
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// 错误类型
|
|
17
|
-
// ============================================================================
|
|
18
9
|
export class WebSocketError extends Error {
|
|
19
10
|
code;
|
|
20
11
|
originalError;
|
|
@@ -22,22 +13,22 @@ export class WebSocketError extends Error {
|
|
|
22
13
|
super(message);
|
|
23
14
|
this.code = code;
|
|
24
15
|
this.originalError = originalError;
|
|
25
|
-
this.name =
|
|
16
|
+
this.name = "WebSocketError";
|
|
26
17
|
}
|
|
27
18
|
}
|
|
28
19
|
export class RequestTimeoutError extends WebSocketError {
|
|
29
20
|
constructor(requestId) {
|
|
30
|
-
super(`Request ${requestId} timed out`,
|
|
21
|
+
super(`Request ${requestId} timed out`, "REQUEST_TIMEOUT");
|
|
31
22
|
}
|
|
32
23
|
}
|
|
33
24
|
export class ConnectionError extends WebSocketError {
|
|
34
25
|
constructor(message, originalError) {
|
|
35
|
-
super(message,
|
|
26
|
+
super(message, "CONNECTION_ERROR", originalError);
|
|
36
27
|
}
|
|
37
28
|
}
|
|
38
29
|
export class MessageError extends WebSocketError {
|
|
39
30
|
constructor(message, originalError) {
|
|
40
|
-
super(message,
|
|
31
|
+
super(message, "MESSAGE_ERROR", originalError);
|
|
41
32
|
}
|
|
42
33
|
}
|
|
43
34
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../client/websocket/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../client/websocket/types.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,gDAA6B,CAAA;IAC7B,4CAAyB,CAAA;IACzB,0CAAuB,CAAA;IACvB,gDAA6B,CAAA;IAC7B,kCAAe,CAAA;AACjB,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,aAAqB;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,kBAAa,GAAb,aAAa,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,SAAiB;QAC3B,KAAK,CAAC,WAAW,SAAS,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,OAAe,EAAE,aAAqB;QAChD,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,cAAc;IAC9C,YAAY,OAAe,EAAE,aAAqB;QAChD,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;IACjD,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/client",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "Zhin
|
|
3
|
+
"version": "1.0.18",
|
|
4
|
+
"description": "Zhin console client: app singleton + WebSocket + re-exports (aligned with page-manager)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -11,22 +11,23 @@
|
|
|
11
11
|
"import": "./dist/index.js"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"dependencies": {
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@zhin.js/console-core": "0.1.1",
|
|
16
|
+
"@zhin.js/console-types": "0.1.1"
|
|
17
|
+
},
|
|
15
18
|
"peerDependencies": {
|
|
16
|
-
"
|
|
17
|
-
"clsx": "^2.1.1",
|
|
18
|
-
"react-redux": "9.2.0",
|
|
19
|
-
"react-router": "7.0.0",
|
|
20
|
-
"redux-persist": "6.0.0",
|
|
21
|
-
"tailwind-merge": "^3.3.1"
|
|
19
|
+
"react": ">=18"
|
|
22
20
|
},
|
|
23
21
|
"files": [
|
|
24
22
|
"dist",
|
|
25
23
|
"client"
|
|
26
24
|
],
|
|
27
25
|
"devDependencies": {
|
|
28
|
-
"@types/react": "^19.2.
|
|
29
|
-
"@types/react-dom": "^19.2.1"
|
|
26
|
+
"@types/react": "^19.2.14",
|
|
27
|
+
"@types/react-dom": "^19.2.1",
|
|
28
|
+
"react": "^18.3.1",
|
|
29
|
+
"rimraf": "^6.0.1",
|
|
30
|
+
"typescript": "^6.0.2"
|
|
30
31
|
},
|
|
31
32
|
"repository": {
|
|
32
33
|
"type": "git",
|
package/client/router/index.tsx
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { useMemo } from 'react'
|
|
2
|
-
import { createBrowserRouter, RouterProvider as ReactRouterProvider, RouteObject, Outlet} from 'react-router'
|
|
3
|
-
import { store, addRoute, removeRoute, updateRoute, clearRoutes, RouteMenuItem, useSelector } from '../store'
|
|
4
|
-
export { useOutlet, Outlet, Link, useNavigate, useParams } from 'react-router'
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export const addPage = (route: RouteMenuItem) => store.dispatch(addRoute(route))
|
|
10
|
-
export const removePage = (path: string) => store.dispatch(removeRoute(path))
|
|
11
|
-
export const updatePage = (path: string, route: RouteMenuItem) => store.dispatch(updateRoute({
|
|
12
|
-
path,
|
|
13
|
-
updates: route
|
|
14
|
-
}))
|
|
15
|
-
export const getPage = (path: string) => store.getState().route.routes.find(route => route.path === path)
|
|
16
|
-
export const getAllPages = () => store.getState().route.routes
|
|
17
|
-
export const clearPages = () => store.dispatch(clearRoutes())
|
|
18
|
-
|
|
19
|
-
// 动态路由组件(从 Redux store 读取)
|
|
20
|
-
export function DynamicRouter() {
|
|
21
|
-
const storeRoutes = useSelector((state) => state.route?.routes || [])
|
|
22
|
-
const router = useMemo(() => {
|
|
23
|
-
// 递归转换路由(支持多层嵌套)
|
|
24
|
-
const convertRoute = (route: RouteMenuItem): RouteObject => {
|
|
25
|
-
const routeObj: RouteObject = {
|
|
26
|
-
path: route.path,
|
|
27
|
-
element: route.element,
|
|
28
|
-
Component: route.Component,
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// 递归处理子路由
|
|
32
|
-
if (route.children && route.children.length > 0) {
|
|
33
|
-
routeObj.children = route.children.map((child: RouteMenuItem) => convertRoute(child))
|
|
34
|
-
}
|
|
35
|
-
return routeObj
|
|
36
|
-
}
|
|
37
|
-
const routeObjects: RouteObject[] = storeRoutes.map(convertRoute)
|
|
38
|
-
const defaultRoutes: RouteObject[] = [
|
|
39
|
-
{
|
|
40
|
-
path: '/',
|
|
41
|
-
element: <Outlet />,
|
|
42
|
-
children: routeObjects,
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
path: '*',
|
|
46
|
-
element: <div>404 - Page Not Found</div>,
|
|
47
|
-
}
|
|
48
|
-
]
|
|
49
|
-
|
|
50
|
-
return createBrowserRouter(defaultRoutes)
|
|
51
|
-
}, [storeRoutes])
|
|
52
|
-
|
|
53
|
-
return <ReactRouterProvider router={router} />
|
|
54
|
-
}
|
package/client/store/index.ts
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import {configureStore, Reducer, Action,combineReducers} from '@reduxjs/toolkit'
|
|
2
|
-
import {
|
|
3
|
-
FLUSH,
|
|
4
|
-
PAUSE,
|
|
5
|
-
PERSIST,
|
|
6
|
-
persistReducer,
|
|
7
|
-
persistStore,
|
|
8
|
-
PURGE,
|
|
9
|
-
REGISTER,
|
|
10
|
-
REHYDRATE,
|
|
11
|
-
createTransform,
|
|
12
|
-
} from 'redux-persist';
|
|
13
|
-
import storage from 'redux-persist/es/storage';
|
|
14
|
-
import {reducers, Reducers } from './reducers';
|
|
15
|
-
import { useDispatch as useReduxDispatch, TypedUseSelectorHook, useSelector as useReduxSelector } from 'react-redux';
|
|
16
|
-
|
|
17
|
-
// 创建 transform 过滤不可序列化的字段
|
|
18
|
-
const routeTransform = createTransform(
|
|
19
|
-
(inboundState: any) => {
|
|
20
|
-
const { routes, ...rest } = inboundState
|
|
21
|
-
return rest
|
|
22
|
-
},
|
|
23
|
-
(outboundState: any) => {
|
|
24
|
-
return { ...outboundState, routes: [] }
|
|
25
|
-
},
|
|
26
|
-
{ whitelist: ['route'] }
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
const scriptTransform = createTransform(
|
|
30
|
-
(inboundState: any) => {
|
|
31
|
-
const { entries, loadedScripts, synced, ...rest } = inboundState
|
|
32
|
-
return rest
|
|
33
|
-
},
|
|
34
|
-
(outboundState: any) => {
|
|
35
|
-
return { ...outboundState, entries: [], loadedScripts: [], synced: false }
|
|
36
|
-
},
|
|
37
|
-
{ whitelist: ['script'] }
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
const persistConfig: any = {
|
|
41
|
-
key: 'root',
|
|
42
|
-
storage: storage,
|
|
43
|
-
transforms: [routeTransform, scriptTransform],
|
|
44
|
-
}
|
|
45
|
-
const persistedReducer = persistReducer(persistConfig, combineReducers(reducers)) as any
|
|
46
|
-
export const store = configureStore<Reducers>({
|
|
47
|
-
reducer:persistedReducer as Reducer,
|
|
48
|
-
middleware: (getDefaultMiddleware) =>
|
|
49
|
-
getDefaultMiddleware({
|
|
50
|
-
serializableCheck: {
|
|
51
|
-
ignoredActions: [
|
|
52
|
-
FLUSH,
|
|
53
|
-
REHYDRATE,
|
|
54
|
-
PAUSE,
|
|
55
|
-
PERSIST,
|
|
56
|
-
PURGE,
|
|
57
|
-
REGISTER,
|
|
58
|
-
// 忽略包含 React 组件的路由 actions
|
|
59
|
-
'route/addRoute',
|
|
60
|
-
'route/updateRoute',
|
|
61
|
-
'route/setRoutes',
|
|
62
|
-
],
|
|
63
|
-
// 忽略 state 中的 routes 字段
|
|
64
|
-
ignoredPaths: ['route.routes'],
|
|
65
|
-
},
|
|
66
|
-
}),
|
|
67
|
-
})
|
|
68
|
-
export const persistor = persistStore(store);
|
|
69
|
-
|
|
70
|
-
// 将 store 挂载到 window 以供 DynamicRouter 使用
|
|
71
|
-
if (typeof window !== 'undefined') {
|
|
72
|
-
// @ts-ignore
|
|
73
|
-
window.__REDUX_STORE__ = store
|
|
74
|
-
}
|
|
75
|
-
export function addReducer<T,A extends Action>(name:keyof Reducers,reducer:Reducer<T,A>) {
|
|
76
|
-
reducers[name] = reducer
|
|
77
|
-
const newPersistedReducer = persistReducer(persistConfig, combineReducers(reducers)) as any
|
|
78
|
-
store.replaceReducer(newPersistedReducer as Reducer)
|
|
79
|
-
}
|
|
80
|
-
export type RootState = ReturnType<typeof store.getState>
|
|
81
|
-
export type AppDispatch = typeof store.dispatch
|
|
82
|
-
export const useDispatch:()=>AppDispatch = useReduxDispatch
|
|
83
|
-
export const useSelector:TypedUseSelectorHook<RootState> = useReduxSelector
|
|
84
|
-
|
|
85
|
-
// 导出 UI actions
|
|
86
|
-
export {
|
|
87
|
-
toggleSidebar,
|
|
88
|
-
setSidebarOpen,
|
|
89
|
-
setActiveMenu
|
|
90
|
-
} from './reducers/ui'
|
|
91
|
-
|
|
92
|
-
// 导出 Route actions
|
|
93
|
-
export {
|
|
94
|
-
addRoute,
|
|
95
|
-
removeRoute,
|
|
96
|
-
updateRoute,
|
|
97
|
-
setRoutes,
|
|
98
|
-
clearRoutes
|
|
99
|
-
} from './reducers/route'
|
|
100
|
-
|
|
101
|
-
// 导出 Script actions 和 thunks
|
|
102
|
-
export {
|
|
103
|
-
syncEntries,
|
|
104
|
-
addEntry,
|
|
105
|
-
removeEntry,
|
|
106
|
-
loadScript,
|
|
107
|
-
loadScripts,
|
|
108
|
-
unloadScript
|
|
109
|
-
} from './reducers/script'
|
|
110
|
-
|
|
111
|
-
// 导出 Config actions 和 selectors
|
|
112
|
-
export {
|
|
113
|
-
setConnected,
|
|
114
|
-
setLoading,
|
|
115
|
-
setError,
|
|
116
|
-
updateConfig,
|
|
117
|
-
updateSchema,
|
|
118
|
-
updateConfigs,
|
|
119
|
-
updateSchemas,
|
|
120
|
-
removeConfig,
|
|
121
|
-
clearConfigs,
|
|
122
|
-
selectConfig,
|
|
123
|
-
selectSchema,
|
|
124
|
-
selectConfigLoading,
|
|
125
|
-
selectConfigError,
|
|
126
|
-
selectConfigConnected,
|
|
127
|
-
selectAllConfigs,
|
|
128
|
-
selectAllSchemas
|
|
129
|
-
} from './reducers/config'
|
|
130
|
-
|
|
131
|
-
export type { RouteMenuItem } from './reducers/route'
|
|
132
|
-
export type { ConfigMessage } from './reducers/config'
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 配置管理 Redux Slice
|
|
3
|
-
* 通过 WebSocket 管理插件配置
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'
|
|
7
|
-
|
|
8
|
-
export interface ConfigState {
|
|
9
|
-
// 所有插件的配置,按插件名分发
|
|
10
|
-
configs: Record<string, any>
|
|
11
|
-
// 所有插件的 Schema,按插件名分发
|
|
12
|
-
schemas: Record<string, any>
|
|
13
|
-
// 加载状态
|
|
14
|
-
loading: Record<string, boolean>
|
|
15
|
-
// 错误信息
|
|
16
|
-
errors: Record<string, string | null>
|
|
17
|
-
// WebSocket 连接状态
|
|
18
|
-
connected: boolean
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const initialState: ConfigState = {
|
|
22
|
-
configs: {},
|
|
23
|
-
schemas: {},
|
|
24
|
-
loading: {},
|
|
25
|
-
errors: {},
|
|
26
|
-
connected: false
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// WebSocket 消息类型
|
|
30
|
-
export interface ConfigMessage {
|
|
31
|
-
type: 'config:get' | 'config:set' | 'config:updated' | 'schema:get' | 'schema:updated'
|
|
32
|
-
pluginName: string
|
|
33
|
-
data?: any
|
|
34
|
-
error?: string
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const configSlice = createSlice({
|
|
38
|
-
name: 'config',
|
|
39
|
-
initialState,
|
|
40
|
-
reducers: {
|
|
41
|
-
// WebSocket 连接状态
|
|
42
|
-
setConnected: (state, action: PayloadAction<boolean>) => {
|
|
43
|
-
state.connected = action.payload
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
// 设置配置加载状态
|
|
47
|
-
setLoading: (state, action: PayloadAction<{ pluginName: string; loading: boolean }>) => {
|
|
48
|
-
const { pluginName, loading } = action.payload
|
|
49
|
-
state.loading[pluginName] = loading
|
|
50
|
-
},
|
|
51
|
-
|
|
52
|
-
// 设置错误信息
|
|
53
|
-
setError: (state, action: PayloadAction<{ pluginName: string; error: string | null }>) => {
|
|
54
|
-
const { pluginName, error } = action.payload
|
|
55
|
-
state.errors[pluginName] = error
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
// 更新插件配置
|
|
59
|
-
updateConfig: (state, action: PayloadAction<{ pluginName: string; config: any }>) => {
|
|
60
|
-
const { pluginName, config } = action.payload
|
|
61
|
-
state.configs[pluginName] = config
|
|
62
|
-
state.loading[pluginName] = false
|
|
63
|
-
state.errors[pluginName] = null
|
|
64
|
-
},
|
|
65
|
-
|
|
66
|
-
// 更新插件 Schema
|
|
67
|
-
updateSchema: (state, action: PayloadAction<{ pluginName: string; schema: any }>) => {
|
|
68
|
-
const { pluginName, schema } = action.payload
|
|
69
|
-
state.schemas[pluginName] = schema
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
// 批量更新配置
|
|
73
|
-
updateConfigs: (state, action: PayloadAction<Record<string, any>>) => {
|
|
74
|
-
state.configs = { ...state.configs, ...action.payload }
|
|
75
|
-
},
|
|
76
|
-
|
|
77
|
-
// 批量更新 Schema
|
|
78
|
-
updateSchemas: (state, action: PayloadAction<Record<string, any>>) => {
|
|
79
|
-
state.schemas = { ...state.schemas, ...action.payload }
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
// 清除插件配置
|
|
83
|
-
removeConfig: (state, action: PayloadAction<string>) => {
|
|
84
|
-
const pluginName = action.payload
|
|
85
|
-
delete state.configs[pluginName]
|
|
86
|
-
delete state.schemas[pluginName]
|
|
87
|
-
delete state.loading[pluginName]
|
|
88
|
-
delete state.errors[pluginName]
|
|
89
|
-
},
|
|
90
|
-
|
|
91
|
-
// 清除所有配置
|
|
92
|
-
clearConfigs: (state) => {
|
|
93
|
-
state.configs = {}
|
|
94
|
-
state.schemas = {}
|
|
95
|
-
state.loading = {}
|
|
96
|
-
state.errors = {}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
export const {
|
|
102
|
-
setConnected,
|
|
103
|
-
setLoading,
|
|
104
|
-
setError,
|
|
105
|
-
updateConfig,
|
|
106
|
-
updateSchema,
|
|
107
|
-
updateConfigs,
|
|
108
|
-
updateSchemas,
|
|
109
|
-
removeConfig,
|
|
110
|
-
clearConfigs
|
|
111
|
-
} = configSlice.actions
|
|
112
|
-
|
|
113
|
-
export default configSlice.reducer
|
|
114
|
-
|
|
115
|
-
// Selectors
|
|
116
|
-
export const selectConfig = (state: { config: ConfigState }, pluginName: string) =>
|
|
117
|
-
state.config.configs[pluginName]
|
|
118
|
-
|
|
119
|
-
export const selectSchema = (state: { config: ConfigState }, pluginName: string) =>
|
|
120
|
-
state.config.schemas[pluginName]
|
|
121
|
-
|
|
122
|
-
export const selectConfigLoading = (state: { config: ConfigState }, pluginName: string) =>
|
|
123
|
-
state.config.loading[pluginName] || false
|
|
124
|
-
|
|
125
|
-
export const selectConfigError = (state: { config: ConfigState }, pluginName: string) =>
|
|
126
|
-
state.config.errors[pluginName] || null
|
|
127
|
-
|
|
128
|
-
export const selectConfigConnected = (state: { config: ConfigState }) =>
|
|
129
|
-
state.config.connected
|
|
130
|
-
|
|
131
|
-
export const selectAllConfigs = (state: { config: ConfigState }) =>
|
|
132
|
-
state.config.configs
|
|
133
|
-
|
|
134
|
-
export const selectAllSchemas = (state: { config: ConfigState }) =>
|
|
135
|
-
state.config.schemas
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Reducer } from "@reduxjs/toolkit"
|
|
2
|
-
import ui from "./ui"
|
|
3
|
-
import route from "./route"
|
|
4
|
-
import script from "./script"
|
|
5
|
-
import config from "./config"
|
|
6
|
-
|
|
7
|
-
export interface Reducers {
|
|
8
|
-
ui: ReturnType<typeof ui>
|
|
9
|
-
route: ReturnType<typeof route>
|
|
10
|
-
script: ReturnType<typeof script>
|
|
11
|
-
config: ReturnType<typeof config>
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const reducers: Record<keyof Reducers, Reducer<any, any>> = {
|
|
15
|
-
ui,
|
|
16
|
-
route,
|
|
17
|
-
script,
|
|
18
|
-
config
|
|
19
|
-
}
|