@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.
Files changed (76) hide show
  1. package/client/app.ts +228 -0
  2. package/client/index.ts +42 -14
  3. package/client/websocket/hooks.ts +218 -510
  4. package/client/websocket/index.ts +6 -43
  5. package/client/websocket/instance.ts +10 -32
  6. package/client/websocket/manager.ts +173 -390
  7. package/client/websocket/types.ts +58 -222
  8. package/dist/app.d.ts +95 -0
  9. package/dist/app.d.ts.map +1 -0
  10. package/dist/app.js +147 -0
  11. package/dist/app.js.map +1 -0
  12. package/dist/index.d.ts +7 -7
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +10 -14
  15. package/dist/index.js.map +1 -1
  16. package/dist/websocket/hooks.d.ts +35 -58
  17. package/dist/websocket/hooks.d.ts.map +1 -1
  18. package/dist/websocket/hooks.js +134 -410
  19. package/dist/websocket/hooks.js.map +1 -1
  20. package/dist/websocket/index.d.ts +5 -10
  21. package/dist/websocket/index.d.ts.map +1 -1
  22. package/dist/websocket/index.js +5 -25
  23. package/dist/websocket/index.js.map +1 -1
  24. package/dist/websocket/instance.d.ts +1 -14
  25. package/dist/websocket/instance.d.ts.map +1 -1
  26. package/dist/websocket/instance.js +2 -20
  27. package/dist/websocket/instance.js.map +1 -1
  28. package/dist/websocket/manager.d.ts +23 -93
  29. package/dist/websocket/manager.d.ts.map +1 -1
  30. package/dist/websocket/manager.js +87 -227
  31. package/dist/websocket/manager.js.map +1 -1
  32. package/dist/websocket/types.d.ts +35 -122
  33. package/dist/websocket/types.d.ts.map +1 -1
  34. package/dist/websocket/types.js +4 -13
  35. package/dist/websocket/types.js.map +1 -1
  36. package/package.json +12 -11
  37. package/client/router/index.tsx +0 -54
  38. package/client/store/index.ts +0 -132
  39. package/client/store/reducers/config.ts +0 -135
  40. package/client/store/reducers/index.ts +0 -19
  41. package/client/store/reducers/route.ts +0 -126
  42. package/client/store/reducers/script.ts +0 -109
  43. package/client/store/reducers/ui.ts +0 -31
  44. package/client/websocket/messageHandler.ts +0 -208
  45. package/dist/router/index.d.ts +0 -25
  46. package/dist/router/index.d.ts.map +0 -1
  47. package/dist/router/index.js +0 -48
  48. package/dist/router/index.js.map +0 -1
  49. package/dist/store/index.d.ts +0 -19
  50. package/dist/store/index.d.ts.map +0 -1
  51. package/dist/store/index.js +0 -67
  52. package/dist/store/index.js.map +0 -1
  53. package/dist/store/reducers/config.d.ts +0 -54
  54. package/dist/store/reducers/config.d.ts.map +0 -1
  55. package/dist/store/reducers/config.js +0 -78
  56. package/dist/store/reducers/config.js.map +0 -1
  57. package/dist/store/reducers/index.d.ts +0 -13
  58. package/dist/store/reducers/index.d.ts.map +0 -1
  59. package/dist/store/reducers/index.js +0 -11
  60. package/dist/store/reducers/index.js.map +0 -1
  61. package/dist/store/reducers/route.d.ts +0 -30
  62. package/dist/store/reducers/route.d.ts.map +0 -1
  63. package/dist/store/reducers/route.js +0 -85
  64. package/dist/store/reducers/route.js.map +0 -1
  65. package/dist/store/reducers/script.d.ts +0 -13
  66. package/dist/store/reducers/script.d.ts.map +0 -1
  67. package/dist/store/reducers/script.js +0 -78
  68. package/dist/store/reducers/script.js.map +0 -1
  69. package/dist/store/reducers/ui.d.ts +0 -8
  70. package/dist/store/reducers/ui.d.ts.map +0 -1
  71. package/dist/store/reducers/ui.js +0 -23
  72. package/dist/store/reducers/ui.js.map +0 -1
  73. package/dist/websocket/messageHandler.d.ts +0 -58
  74. package/dist/websocket/messageHandler.d.ts.map +0 -1
  75. package/dist/websocket/messageHandler.js +0 -174
  76. 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 interface ScriptSyncMessage extends BaseMessage {
11
- type: 'sync';
12
- data: {
13
- key: 'entries';
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":"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"}
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"}
@@ -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 = 'WebSocketError';
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`, 'REQUEST_TIMEOUT');
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, 'CONNECTION_ERROR', originalError);
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, 'MESSAGE_ERROR', originalError);
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":"AAAA;;GAEG;AAqNH,+EAA+E;AAC/E,SAAS;AACT,+EAA+E;AAE/E,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,+EAA+E;AAC/E,OAAO;AACP,+EAA+E;AAE/E,MAAM,OAAO,cAAe,SAAQ,KAAK;IAG9B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,aAAqB;QAE5B,KAAK,CAAC,OAAO,CAAC,CAAA;QAHP,SAAI,GAAJ,IAAI,CAAQ;QACZ,kBAAa,GAAb,aAAa,CAAQ;QAG5B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,SAAiB;QAC3B,KAAK,CAAC,WAAW,SAAS,YAAY,EAAE,iBAAiB,CAAC,CAAA;IAC5D,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,cAAc;IACjD,YAAY,OAAe,EAAE,aAAqB;QAChD,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAA;IACnD,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,cAAc;IAC9C,YAAY,OAAe,EAAE,aAAqB;QAChD,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAA;IAChD,CAAC;CACF"}
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.16",
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
- "@reduxjs/toolkit": "^2.9.0",
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.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",
@@ -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
- }
@@ -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
- }