@zhin.js/client 1.1.5 → 1.1.6

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 (99) hide show
  1. package/README.md +25 -19
  2. package/client/app.test.ts +37 -0
  3. package/client/app.ts +130 -138
  4. package/client/bootstrap/loadConsoleEntries.test.ts +0 -15
  5. package/client/bootstrap/loadConsoleEntries.ts +1 -20
  6. package/client/console-client-context.ts +24 -0
  7. package/client/console-client.test.ts +46 -0
  8. package/client/console-client.ts +70 -0
  9. package/client/console-events.ts +4 -3
  10. package/client/console-utils/remoteApi.ts +0 -7
  11. package/client/index.ts +21 -13
  12. package/client/persistence/idb-store.test.ts +0 -18
  13. package/client/persistence/idb-store.ts +3 -6
  14. package/client/{websocket/manager.test.ts → transport/console-transport.test.ts} +79 -34
  15. package/client/{websocket/manager.ts → transport/console-transport.ts} +237 -178
  16. package/client/{websocket → transport}/hooks.ts +240 -23
  17. package/client/transport/index.ts +23 -0
  18. package/client/{websocket → transport}/types.ts +11 -17
  19. package/client/types.ts +0 -3
  20. package/client/workroom/registerWorkroomConsole.test.ts +0 -1
  21. package/dist/app.d.ts +17 -52
  22. package/dist/app.d.ts.map +1 -1
  23. package/dist/app.js +110 -95
  24. package/dist/app.js.map +1 -1
  25. package/dist/bootstrap/loadConsoleEntries.d.ts +0 -6
  26. package/dist/bootstrap/loadConsoleEntries.d.ts.map +1 -1
  27. package/dist/bootstrap/loadConsoleEntries.js +0 -9
  28. package/dist/bootstrap/loadConsoleEntries.js.map +1 -1
  29. package/dist/console-client-context.d.ts +9 -0
  30. package/dist/console-client-context.d.ts.map +1 -0
  31. package/dist/console-client-context.js +13 -0
  32. package/dist/console-client-context.js.map +1 -0
  33. package/dist/console-client.d.ts +25 -0
  34. package/dist/console-client.d.ts.map +1 -0
  35. package/dist/console-client.js +45 -0
  36. package/dist/console-client.js.map +1 -0
  37. package/dist/console-events.d.ts +1 -0
  38. package/dist/console-events.d.ts.map +1 -1
  39. package/dist/console-events.js +3 -3
  40. package/dist/console-events.js.map +1 -1
  41. package/dist/console-utils/remoteApi.d.ts +0 -1
  42. package/dist/console-utils/remoteApi.d.ts.map +1 -1
  43. package/dist/console-utils/remoteApi.js +0 -6
  44. package/dist/console-utils/remoteApi.js.map +1 -1
  45. package/dist/index.d.ts +7 -6
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +9 -8
  48. package/dist/index.js.map +1 -1
  49. package/dist/persistence/idb-store.d.ts.map +1 -1
  50. package/dist/persistence/idb-store.js +3 -5
  51. package/dist/persistence/idb-store.js.map +1 -1
  52. package/dist/transport/console-transport.d.ts +217 -0
  53. package/dist/transport/console-transport.d.ts.map +1 -0
  54. package/dist/{websocket/manager.js → transport/console-transport.js} +147 -165
  55. package/dist/transport/console-transport.js.map +1 -0
  56. package/dist/transport/hooks.d.ts +253 -0
  57. package/dist/transport/hooks.d.ts.map +1 -0
  58. package/dist/{websocket → transport}/hooks.js +234 -19
  59. package/dist/transport/hooks.js.map +1 -0
  60. package/dist/transport/index.d.ts +4 -0
  61. package/dist/transport/index.d.ts.map +1 -0
  62. package/dist/transport/index.js +4 -0
  63. package/dist/transport/index.js.map +1 -0
  64. package/dist/{websocket → transport}/types.d.ts +10 -13
  65. package/dist/transport/types.d.ts.map +1 -0
  66. package/dist/{websocket → transport}/types.js +4 -9
  67. package/dist/transport/types.js.map +1 -0
  68. package/dist/types.d.ts +0 -1
  69. package/dist/types.d.ts.map +1 -1
  70. package/package.json +3 -3
  71. package/client/runtime/index.ts +0 -12
  72. package/client/websocket/index.ts +0 -11
  73. package/client/websocket/instance.ts +0 -24
  74. package/client/websocket/remote-settings.ts +0 -47
  75. package/dist/runtime/index.d.ts +0 -6
  76. package/dist/runtime/index.d.ts.map +0 -1
  77. package/dist/runtime/index.js +0 -10
  78. package/dist/runtime/index.js.map +0 -1
  79. package/dist/websocket/hooks.d.ts +0 -114
  80. package/dist/websocket/hooks.d.ts.map +0 -1
  81. package/dist/websocket/hooks.js.map +0 -1
  82. package/dist/websocket/index.d.ts +0 -7
  83. package/dist/websocket/index.d.ts.map +0 -1
  84. package/dist/websocket/index.js +0 -7
  85. package/dist/websocket/index.js.map +0 -1
  86. package/dist/websocket/instance.d.ts +0 -5
  87. package/dist/websocket/instance.d.ts.map +0 -1
  88. package/dist/websocket/instance.js +0 -21
  89. package/dist/websocket/instance.js.map +0 -1
  90. package/dist/websocket/manager.d.ts +0 -131
  91. package/dist/websocket/manager.d.ts.map +0 -1
  92. package/dist/websocket/manager.js.map +0 -1
  93. package/dist/websocket/remote-settings.d.ts +0 -5
  94. package/dist/websocket/remote-settings.d.ts.map +0 -1
  95. package/dist/websocket/remote-settings.js +0 -47
  96. package/dist/websocket/remote-settings.js.map +0 -1
  97. package/dist/websocket/types.d.ts.map +0 -1
  98. package/dist/websocket/types.js.map +0 -1
  99. /package/client/{websocket → transport}/hooks.test.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
- import { getWebSocketManager } from "./instance";
3
- import type { UseWebSocketOptions } from "./types";
2
+ import { useConsoleClient } from "../console-client-context.js";
3
+ import type { UseConsoleTransportOptions } from "./types.js";
4
4
 
5
5
  /**
6
6
  * 每次连接会话只对同一 key 自动加载一次:失败后不再零退避死循环
@@ -20,9 +20,9 @@ function useAutoLoadOnce(connected: boolean, key: unknown, ready: boolean, fire:
20
20
  });
21
21
  }
22
22
 
23
- export function useWebSocket(options: UseWebSocketOptions = {}) {
23
+ export function useConsoleTransport(options: UseConsoleTransportOptions = {}) {
24
24
  const { autoConnect = true } = options;
25
- const wsManager = getWebSocketManager();
25
+ const wsManager = useConsoleClient().transport;
26
26
  const [connected, setConnected] = useState(wsManager.isConnected());
27
27
 
28
28
  useEffect(() => {
@@ -58,7 +58,7 @@ export function resolveKeyedValue<T>(
58
58
 
59
59
  export function useConfig(pluginName: string, options?: { autoLoad?: boolean; autoLoadSchema?: boolean }) {
60
60
  const { autoLoad = true, autoLoadSchema = true } = options ?? {};
61
- const wsManager = getWebSocketManager();
61
+ const wsManager = useConsoleClient().transport;
62
62
  const [connected, setConnected] = useState(wsManager.isConnected());
63
63
  const [configEntry, setConfigEntry] = useState<{ key: string; value: unknown } | null>(null);
64
64
  const [schemaEntry, setSchemaEntry] = useState<{ key: string; value: unknown } | null>(null);
@@ -123,11 +123,13 @@ export function useConfig(pluginName: string, options?: { autoLoad?: boolean; au
123
123
  );
124
124
  }
125
125
 
126
- export function useConfigYaml() {
127
- const wsManager = getWebSocketManager();
126
+ export function useConfigSource() {
127
+ const wsManager = useConsoleClient().transport;
128
128
  const [connected, setConnected] = useState(wsManager.isConnected());
129
- const [yaml, setYaml] = useState("");
130
- const [pluginKeys, setPluginKeys] = useState<string[]>([]);
129
+ const [source, setSource] = useState("");
130
+ const [format, setFormat] = useState<'yaml' | 'json'>('yaml');
131
+ const [revision, setRevision] = useState("");
132
+ const [configKeys, setConfigKeys] = useState<string[]>([]);
131
133
  const [loading, setLoading] = useState(false);
132
134
  const [error, setError] = useState<string | null>(null);
133
135
 
@@ -137,9 +139,11 @@ export function useConfigYaml() {
137
139
  setLoading(true);
138
140
  setError(null);
139
141
  try {
140
- const result = await wsManager.getConfigYaml();
141
- setYaml(result.yaml);
142
- setPluginKeys(result.pluginKeys);
142
+ const result = await wsManager.getConfigSource();
143
+ setSource(result.source);
144
+ setFormat(result.format);
145
+ setRevision(result.revision);
146
+ setConfigKeys([...result.configKeys]);
143
147
  return result;
144
148
  } catch (e) {
145
149
  setError(e instanceof Error ? e.message : "Unknown error");
@@ -154,8 +158,10 @@ export function useConfigYaml() {
154
158
  setLoading(true);
155
159
  setError(null);
156
160
  try {
157
- const result = await wsManager.saveConfigYaml(content);
158
- setYaml(content);
161
+ if (!revision) throw new Error('Config source must be loaded before it can be replaced');
162
+ const result = await wsManager.replaceConfigSource(content, revision);
163
+ setSource(content);
164
+ setRevision(result.revision);
159
165
  return result;
160
166
  } catch (e) {
161
167
  setError(e instanceof Error ? e.message : "Unknown error");
@@ -164,20 +170,231 @@ export function useConfigYaml() {
164
170
  setLoading(false);
165
171
  }
166
172
  },
167
- [wsManager],
173
+ [revision, wsManager],
168
174
  );
169
175
 
170
- useAutoLoadOnce(connected, "config-yaml", !!yaml || loading, () => {
176
+ useAutoLoadOnce(connected, "config-source", !!revision || loading, () => {
171
177
  load().catch(() => {});
172
178
  });
173
179
 
174
- return useMemo(() => ({ yaml, pluginKeys, loading, error, load, save }), [yaml, pluginKeys, loading, error, load, save]);
180
+ return useMemo(
181
+ () => ({ source, format, revision, configKeys, loading, error, load, save }),
182
+ [source, format, revision, configKeys, loading, error, load, save],
183
+ );
184
+ }
185
+
186
+ /** Shared Console flow for previewing and committing a plugin installation. */
187
+ export function usePluginInstall() {
188
+ const wsManager = useConsoleClient().transport;
189
+ const [loading, setLoading] = useState(false);
190
+ const [error, setError] = useState<string | null>(null);
191
+ const [plan, setPlan] = useState<Awaited<ReturnType<typeof wsManager.planPluginInstall>> | null>(null);
192
+
193
+ const preview = useCallback(async (packageName: string) => {
194
+ setLoading(true);
195
+ setError(null);
196
+ try {
197
+ const next = await wsManager.planPluginInstall(packageName);
198
+ setPlan(next);
199
+ return next;
200
+ } catch (e) {
201
+ setError(e instanceof Error ? e.message : 'Unknown error');
202
+ throw e;
203
+ } finally {
204
+ setLoading(false);
205
+ }
206
+ }, [wsManager]);
207
+
208
+ const install = useCallback(async (packageName: string, expectedRevision?: string) => {
209
+ setLoading(true);
210
+ setError(null);
211
+ try {
212
+ return await wsManager.installPlugin(packageName, expectedRevision);
213
+ } catch (e) {
214
+ setError(e instanceof Error ? e.message : 'Unknown error');
215
+ throw e;
216
+ } finally {
217
+ setLoading(false);
218
+ }
219
+ }, [wsManager]);
220
+
221
+ return useMemo(() => ({ plan, loading, error, preview, install }), [
222
+ plan, loading, error, preview, install,
223
+ ]);
224
+ }
225
+
226
+ export function usePluginConfigValidation(pluginName: string) {
227
+ const wsManager = useConsoleClient().transport;
228
+ const [loading, setLoading] = useState(false);
229
+ const [error, setError] = useState<string | null>(null);
230
+ const validate = useCallback(async (data: unknown) => {
231
+ setLoading(true);
232
+ setError(null);
233
+ try {
234
+ return await wsManager.validatePluginConfig(pluginName, data);
235
+ } catch (e) {
236
+ setError(e instanceof Error ? e.message : 'Unknown error');
237
+ throw e;
238
+ } finally {
239
+ setLoading(false);
240
+ }
241
+ }, [pluginName, wsManager]);
242
+ return useMemo(() => ({ loading, error, validate }), [loading, error, validate]);
243
+ }
244
+
245
+ export function usePluginDiagnostics(pluginName: string) {
246
+ const wsManager = useConsoleClient().transport;
247
+ const [loading, setLoading] = useState(false);
248
+ const [error, setError] = useState<string | null>(null);
249
+ const diagnose = useCallback(async () => {
250
+ setLoading(true);
251
+ setError(null);
252
+ try {
253
+ return await wsManager.diagnosePlugin(pluginName);
254
+ } catch (e) {
255
+ setError(e instanceof Error ? e.message : 'Unknown error');
256
+ throw e;
257
+ } finally {
258
+ setLoading(false);
259
+ }
260
+ }, [pluginName, wsManager]);
261
+ return useMemo(() => ({ loading, error, diagnose }), [loading, error, diagnose]);
262
+ }
263
+
264
+ export function usePluginLifecycle(instanceKey: string) {
265
+ const wsManager = useConsoleClient().transport;
266
+ const [loading, setLoading] = useState(false);
267
+ const [error, setError] = useState<string | null>(null);
268
+ const setEnabled = useCallback(async (enabled: boolean) => {
269
+ setLoading(true);
270
+ setError(null);
271
+ try {
272
+ return await wsManager.setPluginEnabled(instanceKey, enabled);
273
+ } catch (e) {
274
+ setError(e instanceof Error ? e.message : 'Unknown error');
275
+ throw e;
276
+ } finally {
277
+ setLoading(false);
278
+ }
279
+ }, [instanceKey, wsManager]);
280
+ return useMemo(() => ({ loading, error, setEnabled }), [loading, error, setEnabled]);
281
+ }
282
+
283
+ export function usePluginUninstall() {
284
+ const wsManager = useConsoleClient().transport;
285
+ const [loading, setLoading] = useState(false);
286
+ const [error, setError] = useState<string | null>(null);
287
+ const preview = useCallback(async (packageName: string) => {
288
+ setLoading(true);
289
+ setError(null);
290
+ try {
291
+ return await wsManager.planPluginUninstall(packageName);
292
+ } catch (e) {
293
+ setError(e instanceof Error ? e.message : 'Unknown error');
294
+ throw e;
295
+ } finally {
296
+ setLoading(false);
297
+ }
298
+ }, [wsManager]);
299
+ const uninstall = useCallback(async (packageName: string, expectedRevision?: string) => {
300
+ setLoading(true);
301
+ setError(null);
302
+ try {
303
+ return await wsManager.uninstallPlugin(packageName, expectedRevision);
304
+ } catch (e) {
305
+ setError(e instanceof Error ? e.message : 'Unknown error');
306
+ throw e;
307
+ } finally {
308
+ setLoading(false);
309
+ }
310
+ }, [wsManager]);
311
+ return useMemo(() => ({ loading, error, preview, uninstall }), [
312
+ loading, error, preview, uninstall,
313
+ ]);
314
+ }
315
+
316
+ export function usePluginUpdate() {
317
+ const wsManager = useConsoleClient().transport;
318
+ const [loading, setLoading] = useState(false);
319
+ const [error, setError] = useState<string | null>(null);
320
+ const preview = useCallback((packageName: string, targetVersion: string) => {
321
+ setLoading(true);
322
+ setError(null);
323
+ return wsManager.planPluginUpdate(packageName, targetVersion)
324
+ .catch((e) => {
325
+ setError(e instanceof Error ? e.message : 'Unknown error');
326
+ throw e;
327
+ })
328
+ .finally(() => setLoading(false));
329
+ }, [wsManager]);
330
+ const update = useCallback((packageName: string, targetVersion: string, expectedRevision?: string) => {
331
+ setLoading(true);
332
+ setError(null);
333
+ return wsManager.updatePlugin(packageName, targetVersion, expectedRevision)
334
+ .catch((e) => {
335
+ setError(e instanceof Error ? e.message : 'Unknown error');
336
+ throw e;
337
+ })
338
+ .finally(() => setLoading(false));
339
+ }, [wsManager]);
340
+ return useMemo(() => ({ loading, error, preview, update }), [loading, error, preview, update]);
341
+ }
342
+
343
+ export function useEndpointTest(adapter: string, endpointKey: string) {
344
+ const wsManager = useConsoleClient().transport;
345
+ const [loading, setLoading] = useState(false);
346
+ const [error, setError] = useState<string | null>(null);
347
+ const test = useCallback(async () => {
348
+ setLoading(true);
349
+ setError(null);
350
+ try {
351
+ return await wsManager.testEndpoint(adapter, endpointKey);
352
+ } catch (e) {
353
+ setError(e instanceof Error ? e.message : 'Unknown error');
354
+ throw e;
355
+ } finally {
356
+ setLoading(false);
357
+ }
358
+ }, [adapter, endpointKey, wsManager]);
359
+ return useMemo(() => ({ loading, error, test }), [loading, error, test]);
360
+ }
361
+
362
+ export function usePluginMarketplace() {
363
+ const wsManager = useConsoleClient().transport;
364
+ const [loading, setLoading] = useState(false);
365
+ const [error, setError] = useState<string | null>(null);
366
+ const run = useCallback(async <T>(operation: () => Promise<T>) => {
367
+ setLoading(true);
368
+ setError(null);
369
+ try {
370
+ return await operation();
371
+ } catch (e) {
372
+ setError(e instanceof Error ? e.message : 'Unknown error');
373
+ throw e;
374
+ } finally {
375
+ setLoading(false);
376
+ }
377
+ }, []);
378
+ const search = useCallback(
379
+ (query?: Parameters<typeof wsManager.searchMarketplace>[0]) =>
380
+ run(() => wsManager.searchMarketplace(query)),
381
+ [run, wsManager],
382
+ );
383
+ const detail = useCallback(
384
+ (packageName: string) => run(() => wsManager.getMarketplacePlugin(packageName)),
385
+ [run, wsManager],
386
+ );
387
+ const updates = useCallback(() => run(() => wsManager.getPluginUpdates()), [run, wsManager]);
388
+ const installed = useCallback(() => run(() => wsManager.listPlugins()), [run, wsManager]);
389
+ return useMemo(() => ({ loading, error, search, detail, updates, installed }), [
390
+ loading, error, search, detail, updates, installed,
391
+ ]);
175
392
  }
176
393
 
177
394
  export function useFiles() {
178
- const wsManager = getWebSocketManager();
395
+ const wsManager = useConsoleClient().transport;
179
396
  const [connected, setConnected] = useState(wsManager.isConnected());
180
- const [tree, setTree] = useState<import("./types").FileTreeNode[]>([]);
397
+ const [tree, setTree] = useState<import("./types.js").FileTreeNode[]>([]);
181
398
  const [loading, setLoading] = useState(false);
182
399
  const [error, setError] = useState<string | null>(null);
183
400
 
@@ -212,7 +429,7 @@ export function useFiles() {
212
429
  }
213
430
 
214
431
  export function useEnvFiles() {
215
- const wsManager = getWebSocketManager();
432
+ const wsManager = useConsoleClient().transport;
216
433
  const [connected, setConnected] = useState(wsManager.isConnected());
217
434
  const [files, setFiles] = useState<Array<{ name: string; exists: boolean }>>([]);
218
435
  const [loading, setLoading] = useState(false);
@@ -259,10 +476,10 @@ export function useEnvFiles() {
259
476
  }
260
477
 
261
478
  export function useDatabase() {
262
- const wsManager = getWebSocketManager();
479
+ const wsManager = useConsoleClient().transport;
263
480
  const [connected, setConnected] = useState(wsManager.isConnected());
264
- const [info, setInfo] = useState<import("./types").DatabaseInfo | null>(null);
265
- const [tables, setTables] = useState<import("./types").TableInfo[]>([]);
481
+ const [info, setInfo] = useState<import("./types.js").DatabaseInfo | null>(null);
482
+ const [tables, setTables] = useState<import("./types.js").TableInfo[]>([]);
266
483
  const [loading, setLoading] = useState(false);
267
484
  const [error, setError] = useState<string | null>(null);
268
485
 
@@ -0,0 +1,23 @@
1
+ export * from "./types.js";
2
+ export {
3
+ ConsoleTransport,
4
+ type ConsoleEventListener,
5
+ type ConsoleEventRecoveryGap,
6
+ type ConsoleEventRecoveryGapListener,
7
+ } from "./console-transport.js";
8
+ export {
9
+ useConsoleTransport,
10
+ useConfig,
11
+ useConfigSource,
12
+ usePluginInstall,
13
+ usePluginConfigValidation,
14
+ usePluginDiagnostics,
15
+ usePluginLifecycle,
16
+ usePluginUninstall,
17
+ usePluginUpdate,
18
+ useEndpointTest,
19
+ usePluginMarketplace,
20
+ useFiles,
21
+ useEnvFiles,
22
+ useDatabase,
23
+ } from "./hooks.js";
@@ -10,23 +10,23 @@ export interface BaseMessage {
10
10
  error?: string;
11
11
  }
12
12
 
13
- export type WebSocketMessage = BaseMessage & { data?: unknown; [key: string]: unknown };
13
+ export type ConsoleTransportMessage = BaseMessage & { data?: unknown; [key: string]: unknown };
14
14
 
15
- export interface WebSocketConfig {
16
- url?: string;
15
+ export interface ConsoleTransportConfig {
16
+ fetch?: typeof globalThis.fetch;
17
17
  reconnectInterval?: number;
18
18
  maxReconnectAttempts?: number;
19
19
  requestTimeout?: number;
20
20
  }
21
21
 
22
- export interface WebSocketCallbacks {
22
+ export interface ConsoleTransportCallbacks {
23
23
  onConnect?: () => void;
24
24
  onDisconnect?: () => void;
25
- onError?: (error: Event) => void;
26
- onMessage?: (message: WebSocketMessage) => void;
25
+ onError?: (error: Error) => void;
26
+ onMessage?: (message: ConsoleTransportMessage) => void;
27
27
  }
28
28
 
29
- export interface UseWebSocketOptions {
29
+ export interface UseConsoleTransportOptions {
30
30
  autoConnect?: boolean;
31
31
  }
32
32
 
@@ -38,30 +38,24 @@ export enum ConnectionState {
38
38
  ERROR = "error",
39
39
  }
40
40
 
41
- export class WebSocketError extends Error {
41
+ export class ConsoleTransportError extends Error {
42
42
  constructor(
43
43
  message: string,
44
44
  public code: string,
45
45
  public originalError?: Error,
46
46
  ) {
47
47
  super(message);
48
- this.name = "WebSocketError";
48
+ this.name = "ConsoleTransportError";
49
49
  }
50
50
  }
51
51
 
52
- export class RequestTimeoutError extends WebSocketError {
53
- constructor(requestId: number) {
54
- super(`Request ${requestId} timed out`, "REQUEST_TIMEOUT");
55
- }
56
- }
57
-
58
- export class ConnectionError extends WebSocketError {
52
+ export class ConnectionError extends ConsoleTransportError {
59
53
  constructor(message: string, originalError?: Error) {
60
54
  super(message, "CONNECTION_ERROR", originalError);
61
55
  }
62
56
  }
63
57
 
64
- export class MessageError extends WebSocketError {
58
+ export class MessageError extends ConsoleTransportError {
65
59
  constructor(message: string, originalError?: Error) {
66
60
  super(message, "MESSAGE_ERROR", originalError);
67
61
  }
package/client/types.ts CHANGED
@@ -6,8 +6,5 @@ export interface MessageSegment {
6
6
  platform?: Record<string, unknown>
7
7
  }
8
8
 
9
- // 消息元素别名(兼容不同命名习惯)
10
- export type MessageElement = MessageSegment
11
-
12
9
  // 发送内容类型
13
10
  export type SendContent = MessageSegment | MessageSegment[] | string
@@ -10,7 +10,6 @@ describe('registerWorkroomConsole', () => {
10
10
  registerWorkroomConsole({
11
11
  React: React as never,
12
12
  addRoute,
13
- addPage: addRoute,
14
13
  addTool,
15
14
  });
16
15
 
package/dist/app.d.ts CHANGED
@@ -1,26 +1,7 @@
1
1
  import * as React from "react";
2
- export type AddRouteInput = {
3
- path: string;
4
- name: string;
5
- element: React.ReactNode;
6
- parent?: string | null;
7
- icon?: React.ReactNode | string;
8
- requiredPermissions?: string[];
9
- requiredRoles?: string[];
10
- meta?: {
11
- hideInMenu?: boolean;
12
- order?: number;
13
- group?: string;
14
- fullWidth?: boolean;
15
- };
16
- };
17
- export type AddToolInput = {
18
- id?: string;
19
- name: string;
20
- icon?: React.ReactNode;
21
- parent?: string | null;
22
- path?: string;
23
- };
2
+ import type { PluginAddRouteInput, PluginAddToolInput } from '@zhin.js/contract';
3
+ export type AddRouteInput = PluginAddRouteInput;
4
+ export type AddToolInput = PluginAddToolInput;
24
5
  export type ConsoleRouteRecord = {
25
6
  path: string;
26
7
  name: string;
@@ -49,18 +30,18 @@ export type RouteTreeNode = ConsoleRouteRecord & {
49
30
  export type ToolTreeNode = InternalToolRecord & {
50
31
  children: ToolTreeNode[];
51
32
  };
52
- type SidebarRenderer = (options: {
33
+ export type SidebarRenderer = (options: {
53
34
  routes: RouteTreeNode[];
54
35
  }) => React.ReactNode;
55
- type ToolbarRenderer = (options: {
36
+ export type ToolbarRenderer = (options: {
56
37
  tools: ToolTreeNode[];
57
38
  }) => React.ReactNode;
58
39
  export type ConsoleRouteRenderer = (route: ConsoleRouteRecord) => React.ReactNode;
59
- declare function subscribe(listener: () => void): () => boolean;
60
- declare function getVersion(): number;
61
- declare function createConsoleApp(): {
62
- subscribe: typeof subscribe;
63
- getVersion: typeof getVersion;
40
+ /** Owner-scoped registry for one mounted Remote Console application. */
41
+ export declare class ConsoleApp {
42
+ #private;
43
+ readonly subscribe: (listener: () => void) => (() => void);
44
+ readonly getVersion: () => number;
64
45
  defineSidebar(render: SidebarRenderer): void;
65
46
  defineToolbar(render: ToolbarRenderer): void;
66
47
  defineRouter(render: ConsoleRouteRenderer): void;
@@ -69,27 +50,11 @@ declare function createConsoleApp(): {
69
50
  addTool(input: AddToolInput): string;
70
51
  getRouteTree(): RouteTreeNode[];
71
52
  getToolTree(): ToolTreeNode[];
72
- _getRoutes(): readonly ConsoleRouteRecord[];
73
- _getSidebarRenderer(): SidebarRenderer | null;
74
- _getToolbarRenderer(): ToolbarRenderer | null;
75
- _renderRouteElement(route: ConsoleRouteRecord): React.ReactNode;
76
- };
77
- export type ConsoleApp = ReturnType<typeof createConsoleApp>;
78
- export declare const app: {
79
- subscribe: typeof subscribe;
80
- getVersion: typeof getVersion;
81
- defineSidebar(render: SidebarRenderer): void;
82
- defineToolbar(render: ToolbarRenderer): void;
83
- defineRouter(render: ConsoleRouteRenderer): void;
84
- addRoute(input: AddRouteInput): void;
85
- removeRoute(path: string): void;
86
- addTool(input: AddToolInput): string;
87
- getRouteTree(): RouteTreeNode[];
88
- getToolTree(): ToolTreeNode[];
89
- _getRoutes(): readonly ConsoleRouteRecord[];
90
- _getSidebarRenderer(): SidebarRenderer | null;
91
- _getToolbarRenderer(): ToolbarRenderer | null;
92
- _renderRouteElement(route: ConsoleRouteRecord): React.ReactNode;
93
- };
94
- export {};
53
+ getRoutes(): readonly ConsoleRouteRecord[];
54
+ getSidebarRenderer(): SidebarRenderer | null;
55
+ getToolbarRenderer(): ToolbarRenderer | null;
56
+ renderRouteElement(route: ConsoleRouteRecord): React.ReactNode;
57
+ dispose(): void;
58
+ }
59
+ export declare function createConsoleApp(): ConsoleApp;
95
60
  //# sourceMappingURL=app.d.ts.map
package/dist/app.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../client/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../client/app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAChD,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG;IAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC;AAC/E,MAAM,MAAM,YAAY,GAAG,kBAAkB,GAAG;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,KAAK,KAAK,CAAC,SAAS,CAAC;AACxF,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE;IAAE,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,KAAK,KAAK,CAAC,SAAS,CAAC;AACtF,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAC;AAsDlF,wEAAwE;AACxE,qBAAa,UAAU;;IAUrB,QAAQ,CAAC,SAAS,GAAI,UAAU,MAAM,IAAI,KAAG,CAAC,MAAM,IAAI,CAAC,CAIvD;IAEF,QAAQ,CAAC,UAAU,QAAO,MAAM,CAAkB;IAElD,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAM5C,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAM5C,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI;IAMhD,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAiBpC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM/B,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;IAoBpC,YAAY,IAAI,aAAa,EAAE;IAI/B,WAAW,IAAI,YAAY,EAAE;IAI7B,SAAS,IAAI,SAAS,kBAAkB,EAAE;IAI1C,kBAAkB,IAAI,eAAe,GAAG,IAAI;IAI5C,kBAAkB,IAAI,eAAe,GAAG,IAAI;IAI5C,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,KAAK,CAAC,SAAS;IAI9D,OAAO,IAAI,IAAI;CAmBhB;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAE7C"}