@auroraview/sdk 0.3.21

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/vue.d.ts ADDED
@@ -0,0 +1,132 @@
1
+ import { Ref } from 'vue';
2
+ import { A as AuroraViewClient, E as EventHandler, p as ProcessOutput, q as ProcessExit } from './bridge-CRwRGPq-.js';
3
+
4
+ /**
5
+ * AuroraView SDK Vue Adapter
6
+ *
7
+ * Provides Vue 3 composables for the AuroraView bridge API.
8
+ */
9
+
10
+ /**
11
+ * Composable to get the AuroraView client
12
+ *
13
+ * @example
14
+ * ```vue
15
+ * <script setup lang="ts">
16
+ * import { useAuroraView } from '@aspect/auroraview-sdk/vue';
17
+ *
18
+ * const { client, isReady } = useAuroraView();
19
+ *
20
+ * async function handleClick() {
21
+ * const result = await client.value?.call('api.echo', { message: 'Hello' });
22
+ * console.log(result);
23
+ * }
24
+ * </script>
25
+ * ```
26
+ */
27
+ declare function useAuroraView(): {
28
+ client: Ref<AuroraViewClient>;
29
+ isReady: Ref<boolean>;
30
+ };
31
+ /**
32
+ * Composable to subscribe to an event
33
+ *
34
+ * @example
35
+ * ```vue
36
+ * <script setup lang="ts">
37
+ * import { useAuroraEvent } from '@aspect/auroraview-sdk/vue';
38
+ *
39
+ * useAuroraEvent('custom:event', (data) => {
40
+ * console.log('Received:', data);
41
+ * });
42
+ * </script>
43
+ * ```
44
+ */
45
+ declare function useAuroraEvent<T = unknown>(event: string, handler: EventHandler<T>): void;
46
+ /**
47
+ * Composable to subscribe to multiple events
48
+ */
49
+ declare function useAuroraEvents(events: Record<string, EventHandler>): void;
50
+ /**
51
+ * Options for useProcessEvents composable
52
+ */
53
+ interface ProcessEventsOptions {
54
+ onStdout?: (data: ProcessOutput) => void;
55
+ onStderr?: (data: ProcessOutput) => void;
56
+ onExit?: (data: ProcessExit) => void;
57
+ pid?: number;
58
+ }
59
+ /**
60
+ * Composable to subscribe to process events
61
+ *
62
+ * @example
63
+ * ```vue
64
+ * <script setup lang="ts">
65
+ * import { ref } from 'vue';
66
+ * import { useProcessEvents } from '@aspect/auroraview-sdk/vue';
67
+ *
68
+ * const output = ref<string[]>([]);
69
+ *
70
+ * useProcessEvents({
71
+ * onStdout: (data) => output.value.push(data.data),
72
+ * onExit: (data) => console.log(`Exited with code ${data.code}`),
73
+ * });
74
+ * </script>
75
+ * ```
76
+ */
77
+ declare function useProcessEvents(options?: ProcessEventsOptions): void;
78
+ /**
79
+ * Composable to call an API method
80
+ *
81
+ * @example
82
+ * ```vue
83
+ * <script setup lang="ts">
84
+ * import { useAuroraCall } from '@aspect/auroraview-sdk/vue';
85
+ *
86
+ * const { execute, loading, error, data } = useAuroraCall<string>('api.greet');
87
+ * </script>
88
+ *
89
+ * <template>
90
+ * <button @click="execute({ name: 'World' })" :disabled="loading">Greet</button>
91
+ * <p v-if="data">{{ data }}</p>
92
+ * </template>
93
+ * ```
94
+ */
95
+ declare function useAuroraCall<T = unknown>(method: string): {
96
+ execute: (params?: unknown) => Promise<T>;
97
+ loading: Ref<boolean>;
98
+ error: Ref<Error | null>;
99
+ data: Ref<T | null>;
100
+ reset: () => void;
101
+ };
102
+ /**
103
+ * Composable to invoke a plugin command
104
+ */
105
+ declare function useAuroraInvoke<T = unknown>(cmd: string): {
106
+ execute: (args?: Record<string, unknown>) => Promise<T>;
107
+ loading: Ref<boolean>;
108
+ error: Ref<Error | null>;
109
+ data: Ref<T | null>;
110
+ reset: () => void;
111
+ };
112
+ /**
113
+ * Composable to access shared state
114
+ *
115
+ * @example
116
+ * ```vue
117
+ * <script setup lang="ts">
118
+ * import { useAuroraState } from '@aspect/auroraview-sdk/vue';
119
+ *
120
+ * const theme = useAuroraState<string>('theme', 'light');
121
+ * </script>
122
+ *
123
+ * <template>
124
+ * <button @click="theme = theme === 'light' ? 'dark' : 'light'">
125
+ * Current: {{ theme }}
126
+ * </button>
127
+ * </template>
128
+ * ```
129
+ */
130
+ declare function useAuroraState<T>(key: string, defaultValue?: T): Ref<T | undefined>;
131
+
132
+ export { AuroraViewClient, type ProcessEventsOptions, ProcessExit, ProcessOutput, useAuroraCall, useAuroraEvent, useAuroraEvents, useAuroraInvoke, useAuroraState, useAuroraView, useProcessEvents };
package/dist/vue.js ADDED
@@ -0,0 +1,381 @@
1
+ import { ref, onMounted, onUnmounted, watch } from 'vue';
2
+
3
+ // src/adapters/vue.ts
4
+
5
+ // src/core/events.ts
6
+ var EventEmitter = class {
7
+ constructor() {
8
+ this.handlers = /* @__PURE__ */ new Map();
9
+ }
10
+ /**
11
+ * Subscribe to an event
12
+ * @param event - Event name
13
+ * @param handler - Event handler function
14
+ * @returns Unsubscribe function
15
+ */
16
+ on(event, handler) {
17
+ if (!this.handlers.has(event)) {
18
+ this.handlers.set(event, /* @__PURE__ */ new Set());
19
+ }
20
+ const handlers = this.handlers.get(event);
21
+ handlers.add(handler);
22
+ return () => {
23
+ handlers.delete(handler);
24
+ if (handlers.size === 0) {
25
+ this.handlers.delete(event);
26
+ }
27
+ };
28
+ }
29
+ /**
30
+ * Subscribe to an event once
31
+ * @param event - Event name
32
+ * @param handler - Event handler function
33
+ * @returns Unsubscribe function
34
+ */
35
+ once(event, handler) {
36
+ const wrapper = (data) => {
37
+ unsubscribe();
38
+ handler(data);
39
+ };
40
+ const unsubscribe = this.on(event, wrapper);
41
+ return unsubscribe;
42
+ }
43
+ /**
44
+ * Emit an event to all handlers
45
+ * @param event - Event name
46
+ * @param data - Event data
47
+ */
48
+ emit(event, data) {
49
+ const handlers = this.handlers.get(event);
50
+ if (!handlers) return;
51
+ handlers.forEach((handler) => {
52
+ try {
53
+ handler(data);
54
+ } catch (e) {
55
+ console.error(`[AuroraView] Error in event handler for "${event}":`, e);
56
+ }
57
+ });
58
+ }
59
+ /**
60
+ * Remove event handler(s)
61
+ * @param event - Event name
62
+ * @param handler - Optional specific handler to remove
63
+ */
64
+ off(event, handler) {
65
+ if (handler) {
66
+ this.handlers.get(event)?.delete(handler);
67
+ } else {
68
+ this.handlers.delete(event);
69
+ }
70
+ }
71
+ /**
72
+ * Check if event has handlers
73
+ * @param event - Event name
74
+ */
75
+ hasHandlers(event) {
76
+ const handlers = this.handlers.get(event);
77
+ return handlers !== void 0 && handlers.size > 0;
78
+ }
79
+ /**
80
+ * Get handler count for an event
81
+ * @param event - Event name
82
+ */
83
+ handlerCount(event) {
84
+ return this.handlers.get(event)?.size ?? 0;
85
+ }
86
+ /**
87
+ * Remove all handlers
88
+ */
89
+ clear() {
90
+ this.handlers.clear();
91
+ }
92
+ };
93
+ var globalEmitter = null;
94
+ function getGlobalEmitter() {
95
+ if (!globalEmitter) {
96
+ globalEmitter = new EventEmitter();
97
+ }
98
+ return globalEmitter;
99
+ }
100
+
101
+ // src/core/bridge.ts
102
+ var AuroraViewClientImpl = class {
103
+ constructor() {
104
+ this.interceptInstalled = false;
105
+ this.events = getGlobalEmitter();
106
+ this.installTriggerIntercept();
107
+ }
108
+ /**
109
+ * Install intercept on window.auroraview.trigger to forward events
110
+ */
111
+ installTriggerIntercept() {
112
+ if (this.interceptInstalled) return;
113
+ if (typeof window === "undefined") return;
114
+ const install = () => {
115
+ const bridge = window.auroraview;
116
+ if (!bridge) return;
117
+ const originalTrigger = bridge.trigger;
118
+ bridge.trigger = (event, detail) => {
119
+ originalTrigger?.call(bridge, event, detail);
120
+ this.events.emit(event, detail);
121
+ };
122
+ this.interceptInstalled = true;
123
+ };
124
+ if (window.auroraview) {
125
+ install();
126
+ } else {
127
+ const checkInterval = setInterval(() => {
128
+ if (window.auroraview) {
129
+ clearInterval(checkInterval);
130
+ install();
131
+ }
132
+ }, 10);
133
+ setTimeout(() => clearInterval(checkInterval), 1e4);
134
+ }
135
+ }
136
+ call(method, params) {
137
+ const bridge = window.auroraview;
138
+ if (!bridge) {
139
+ return Promise.reject(new Error("AuroraView bridge not available"));
140
+ }
141
+ return bridge.call(method, params);
142
+ }
143
+ invoke(cmd, args) {
144
+ const bridge = window.auroraview;
145
+ if (!bridge) {
146
+ return Promise.reject(new Error("AuroraView bridge not available"));
147
+ }
148
+ return bridge.invoke(cmd, args);
149
+ }
150
+ emit(event, data) {
151
+ const bridge = window.auroraview;
152
+ if (bridge) {
153
+ bridge.send_event(event, data);
154
+ }
155
+ }
156
+ on(event, handler) {
157
+ return this.events.on(event, handler);
158
+ }
159
+ once(event, handler) {
160
+ return this.events.once(event, handler);
161
+ }
162
+ off(event, handler) {
163
+ this.events.off(event, handler);
164
+ }
165
+ isReady() {
166
+ return window.auroraview?._ready === true;
167
+ }
168
+ whenReady() {
169
+ return new Promise((resolve) => {
170
+ if (this.isReady()) {
171
+ resolve(this);
172
+ } else if (window.auroraview) {
173
+ window.auroraview.whenReady().then(() => {
174
+ this.installTriggerIntercept();
175
+ resolve(this);
176
+ });
177
+ } else {
178
+ const checkInterval = setInterval(() => {
179
+ if (window.auroraview) {
180
+ clearInterval(checkInterval);
181
+ window.auroraview.whenReady().then(() => {
182
+ this.installTriggerIntercept();
183
+ resolve(this);
184
+ });
185
+ }
186
+ }, 10);
187
+ setTimeout(() => {
188
+ clearInterval(checkInterval);
189
+ resolve(this);
190
+ }, 3e4);
191
+ }
192
+ });
193
+ }
194
+ getRawBridge() {
195
+ return window.auroraview;
196
+ }
197
+ get fs() {
198
+ return window.auroraview?.fs;
199
+ }
200
+ get dialog() {
201
+ return window.auroraview?.dialog;
202
+ }
203
+ get clipboard() {
204
+ return window.auroraview?.clipboard;
205
+ }
206
+ get shell() {
207
+ return window.auroraview?.shell;
208
+ }
209
+ get state() {
210
+ return window.auroraview?.state;
211
+ }
212
+ };
213
+ var clientInstance = null;
214
+ function createAuroraView() {
215
+ if (!clientInstance) {
216
+ clientInstance = new AuroraViewClientImpl();
217
+ }
218
+ return clientInstance;
219
+ }
220
+
221
+ // src/adapters/vue.ts
222
+ var clientInstance2 = null;
223
+ function getClient() {
224
+ if (!clientInstance2) {
225
+ clientInstance2 = createAuroraView();
226
+ }
227
+ return clientInstance2;
228
+ }
229
+ function useAuroraView() {
230
+ const client = ref(getClient());
231
+ const isReady = ref(false);
232
+ onMounted(async () => {
233
+ if (client.value.isReady()) {
234
+ isReady.value = true;
235
+ } else {
236
+ await client.value.whenReady();
237
+ isReady.value = true;
238
+ }
239
+ });
240
+ return { client, isReady };
241
+ }
242
+ function useAuroraEvent(event, handler) {
243
+ let unsubscribe = null;
244
+ onMounted(() => {
245
+ const client = getClient();
246
+ unsubscribe = client.on(event, handler);
247
+ });
248
+ onUnmounted(() => {
249
+ unsubscribe?.();
250
+ });
251
+ }
252
+ function useAuroraEvents(events) {
253
+ const unsubscribers = [];
254
+ onMounted(() => {
255
+ const client = getClient();
256
+ Object.entries(events).forEach(([event, handler]) => {
257
+ unsubscribers.push(client.on(event, handler));
258
+ });
259
+ });
260
+ onUnmounted(() => {
261
+ unsubscribers.forEach((unsub) => unsub());
262
+ });
263
+ }
264
+ function useProcessEvents(options = {}) {
265
+ const unsubscribers = [];
266
+ onMounted(() => {
267
+ const client = getClient();
268
+ if (options.onStdout) {
269
+ unsubscribers.push(
270
+ client.on("process:stdout", (data) => {
271
+ if (options.pid === void 0 || options.pid === data.pid) {
272
+ options.onStdout?.(data);
273
+ }
274
+ })
275
+ );
276
+ }
277
+ if (options.onStderr) {
278
+ unsubscribers.push(
279
+ client.on("process:stderr", (data) => {
280
+ if (options.pid === void 0 || options.pid === data.pid) {
281
+ options.onStderr?.(data);
282
+ }
283
+ })
284
+ );
285
+ }
286
+ if (options.onExit) {
287
+ unsubscribers.push(
288
+ client.on("process:exit", (data) => {
289
+ if (options.pid === void 0 || options.pid === data.pid) {
290
+ options.onExit?.(data);
291
+ }
292
+ })
293
+ );
294
+ }
295
+ });
296
+ onUnmounted(() => {
297
+ unsubscribers.forEach((unsub) => unsub());
298
+ });
299
+ }
300
+ function useAuroraCall(method) {
301
+ const loading = ref(false);
302
+ const error = ref(null);
303
+ const data = ref(null);
304
+ const execute = async (params) => {
305
+ const client = getClient();
306
+ loading.value = true;
307
+ error.value = null;
308
+ try {
309
+ const result = await client.call(method, params);
310
+ data.value = result;
311
+ return result;
312
+ } catch (e) {
313
+ const err = e instanceof Error ? e : new Error(String(e));
314
+ error.value = err;
315
+ throw err;
316
+ } finally {
317
+ loading.value = false;
318
+ }
319
+ };
320
+ const reset = () => {
321
+ loading.value = false;
322
+ error.value = null;
323
+ data.value = null;
324
+ };
325
+ return { execute, loading, error, data, reset };
326
+ }
327
+ function useAuroraInvoke(cmd) {
328
+ const loading = ref(false);
329
+ const error = ref(null);
330
+ const data = ref(null);
331
+ const execute = async (args) => {
332
+ const client = getClient();
333
+ loading.value = true;
334
+ error.value = null;
335
+ try {
336
+ const result = await client.invoke(cmd, args);
337
+ data.value = result;
338
+ return result;
339
+ } catch (e) {
340
+ const err = e instanceof Error ? e : new Error(String(e));
341
+ error.value = err;
342
+ throw err;
343
+ } finally {
344
+ loading.value = false;
345
+ }
346
+ };
347
+ const reset = () => {
348
+ loading.value = false;
349
+ error.value = null;
350
+ data.value = null;
351
+ };
352
+ return { execute, loading, error, data, reset };
353
+ }
354
+ function useAuroraState(key, defaultValue) {
355
+ const client = getClient();
356
+ const value = ref(defaultValue);
357
+ onMounted(() => {
358
+ const state = client.state;
359
+ if (!state) return;
360
+ if (state[key] !== void 0) {
361
+ value.value = state[key];
362
+ }
363
+ const unsubscribe = state.onChange((changedKey, newValue) => {
364
+ if (changedKey === key) {
365
+ value.value = newValue;
366
+ }
367
+ });
368
+ onUnmounted(unsubscribe);
369
+ });
370
+ watch(value, (newValue) => {
371
+ const state = client.state;
372
+ if (state && state[key] !== newValue) {
373
+ state[key] = newValue;
374
+ }
375
+ });
376
+ return value;
377
+ }
378
+
379
+ export { useAuroraCall, useAuroraEvent, useAuroraEvents, useAuroraInvoke, useAuroraState, useAuroraView, useProcessEvents };
380
+ //# sourceMappingURL=vue.js.map
381
+ //# sourceMappingURL=vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/events.ts","../src/core/bridge.ts","../src/adapters/vue.ts"],"names":["clientInstance"],"mappings":"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","file":"vue.js","sourcesContent":["/**\n * AuroraView SDK Event System\n *\n * Provides a type-safe event emitter with proper unsubscribe support.\n */\n\nimport type { EventHandler, Unsubscribe } from './types';\n\n/**\n * Event emitter with unsubscribe support\n */\nexport class EventEmitter {\n private handlers = new Map<string, Set<EventHandler>>();\n\n /**\n * Subscribe to an event\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n if (!this.handlers.has(event)) {\n this.handlers.set(event, new Set());\n }\n const handlers = this.handlers.get(event)!;\n handlers.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n this.handlers.delete(event);\n }\n };\n }\n\n /**\n * Subscribe to an event once\n * @param event - Event name\n * @param handler - Event handler function\n * @returns Unsubscribe function\n */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n const wrapper: EventHandler<T> = (data) => {\n unsubscribe();\n handler(data);\n };\n const unsubscribe = this.on(event, wrapper);\n return unsubscribe;\n }\n\n /**\n * Emit an event to all handlers\n * @param event - Event name\n * @param data - Event data\n */\n emit<T = unknown>(event: string, data: T): void {\n const handlers = this.handlers.get(event);\n if (!handlers) return;\n\n handlers.forEach((handler) => {\n try {\n handler(data);\n } catch (e) {\n console.error(`[AuroraView] Error in event handler for \"${event}\":`, e);\n }\n });\n }\n\n /**\n * Remove event handler(s)\n * @param event - Event name\n * @param handler - Optional specific handler to remove\n */\n off(event: string, handler?: EventHandler): void {\n if (handler) {\n this.handlers.get(event)?.delete(handler);\n } else {\n this.handlers.delete(event);\n }\n }\n\n /**\n * Check if event has handlers\n * @param event - Event name\n */\n hasHandlers(event: string): boolean {\n const handlers = this.handlers.get(event);\n return handlers !== undefined && handlers.size > 0;\n }\n\n /**\n * Get handler count for an event\n * @param event - Event name\n */\n handlerCount(event: string): number {\n return this.handlers.get(event)?.size ?? 0;\n }\n\n /**\n * Remove all handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n/** Singleton event emitter instance */\nlet globalEmitter: EventEmitter | null = null;\n\n/**\n * Get the global event emitter instance\n */\nexport function getGlobalEmitter(): EventEmitter {\n if (!globalEmitter) {\n globalEmitter = new EventEmitter();\n }\n return globalEmitter;\n}\n","/**\n * AuroraView SDK Bridge Client\n *\n * Provides a type-safe wrapper around the native bridge API.\n */\n\nimport { EventEmitter, getGlobalEmitter } from './events';\nimport type {\n EventHandler,\n Unsubscribe,\n AuroraViewBridge,\n FileSystemAPI,\n DialogAPI,\n ClipboardAPI,\n ShellAPI,\n AuroraViewState,\n} from './types';\n\n/**\n * AuroraView client interface\n */\nexport interface AuroraViewClient {\n /** Call a Python method (RPC-style) */\n call<T = unknown>(method: string, params?: unknown): Promise<T>;\n\n /** Invoke a plugin command */\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T>;\n\n /** Send an event to Python (fire-and-forget) */\n emit(event: string, data?: unknown): void;\n\n /** Subscribe to an event from Python */\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Subscribe to an event once */\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe;\n\n /** Unsubscribe from an event */\n off(event: string, handler?: EventHandler): void;\n\n /** Check if bridge is ready */\n isReady(): boolean;\n\n /** Wait for bridge to be ready */\n whenReady(): Promise<AuroraViewClient>;\n\n /** Get the raw bridge object */\n getRawBridge(): AuroraViewBridge | undefined;\n\n /** File system API */\n readonly fs: FileSystemAPI | undefined;\n\n /** Dialog API */\n readonly dialog: DialogAPI | undefined;\n\n /** Clipboard API */\n readonly clipboard: ClipboardAPI | undefined;\n\n /** Shell API */\n readonly shell: ShellAPI | undefined;\n\n /** Shared state */\n readonly state: AuroraViewState | undefined;\n}\n\n/**\n * Internal client implementation\n */\nclass AuroraViewClientImpl implements AuroraViewClient {\n private events: EventEmitter;\n private interceptInstalled = false;\n\n constructor() {\n this.events = getGlobalEmitter();\n this.installTriggerIntercept();\n }\n\n /**\n * Install intercept on window.auroraview.trigger to forward events\n */\n private installTriggerIntercept(): void {\n if (this.interceptInstalled) return;\n if (typeof window === 'undefined') return;\n\n const install = () => {\n const bridge = window.auroraview;\n if (!bridge) return;\n\n const originalTrigger = bridge.trigger;\n bridge.trigger = (event: string, detail?: unknown) => {\n // Call original trigger first\n originalTrigger?.call(bridge, event, detail);\n // Forward to our event system\n this.events.emit(event, detail);\n };\n\n this.interceptInstalled = true;\n };\n\n // Try to install immediately\n if (window.auroraview) {\n install();\n } else {\n // Wait for bridge to be available\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n clearInterval(checkInterval);\n install();\n }\n }, 10);\n\n // Stop checking after 10 seconds\n setTimeout(() => clearInterval(checkInterval), 10000);\n }\n }\n\n call<T = unknown>(method: string, params?: unknown): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.call<T>(method, params);\n }\n\n invoke<T = unknown>(cmd: string, args?: Record<string, unknown>): Promise<T> {\n const bridge = window.auroraview;\n if (!bridge) {\n return Promise.reject(new Error('AuroraView bridge not available'));\n }\n return bridge.invoke<T>(cmd, args);\n }\n\n emit(event: string, data?: unknown): void {\n const bridge = window.auroraview;\n if (bridge) {\n bridge.send_event(event, data);\n }\n }\n\n on<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.on(event, handler);\n }\n\n once<T = unknown>(event: string, handler: EventHandler<T>): Unsubscribe {\n return this.events.once(event, handler);\n }\n\n off(event: string, handler?: EventHandler): void {\n this.events.off(event, handler);\n }\n\n isReady(): boolean {\n return window.auroraview?._ready === true;\n }\n\n whenReady(): Promise<AuroraViewClient> {\n return new Promise((resolve) => {\n if (this.isReady()) {\n resolve(this);\n } else if (window.auroraview) {\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n } else {\n // Wait for bridge to appear\n const checkInterval = setInterval(() => {\n if (window.auroraview) {\n clearInterval(checkInterval);\n window.auroraview.whenReady().then(() => {\n this.installTriggerIntercept();\n resolve(this);\n });\n }\n }, 10);\n\n // Timeout after 30 seconds\n setTimeout(() => {\n clearInterval(checkInterval);\n resolve(this);\n }, 30000);\n }\n });\n }\n\n getRawBridge(): AuroraViewBridge | undefined {\n return window.auroraview;\n }\n\n get fs(): FileSystemAPI | undefined {\n return window.auroraview?.fs;\n }\n\n get dialog(): DialogAPI | undefined {\n return window.auroraview?.dialog;\n }\n\n get clipboard(): ClipboardAPI | undefined {\n return window.auroraview?.clipboard;\n }\n\n get shell(): ShellAPI | undefined {\n return window.auroraview?.shell;\n }\n\n get state(): AuroraViewState | undefined {\n return window.auroraview?.state;\n }\n}\n\n/** Singleton client instance */\nlet clientInstance: AuroraViewClient | null = null;\n\n/**\n * Create or get the AuroraView client instance\n */\nexport function createAuroraView(): AuroraViewClient {\n if (!clientInstance) {\n clientInstance = new AuroraViewClientImpl();\n }\n return clientInstance;\n}\n\n/**\n * Get the AuroraView client instance (alias for createAuroraView)\n */\nexport function getAuroraView(): AuroraViewClient {\n return createAuroraView();\n}\n","/**\n * AuroraView SDK Vue Adapter\n *\n * Provides Vue 3 composables for the AuroraView bridge API.\n */\n\nimport {\n ref,\n onMounted,\n onUnmounted,\n watch,\n type Ref,\n} from 'vue';\nimport { createAuroraView, type AuroraViewClient } from '../core/bridge';\nimport type {\n EventHandler,\n Unsubscribe,\n ProcessOutput,\n ProcessExit,\n} from '../core/types';\n\n/** Singleton client instance */\nlet clientInstance: AuroraViewClient | null = null;\n\nfunction getClient(): AuroraViewClient {\n if (!clientInstance) {\n clientInstance = createAuroraView();\n }\n return clientInstance;\n}\n\n/**\n * Composable to get the AuroraView client\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { useAuroraView } from '@aspect/auroraview-sdk/vue';\n *\n * const { client, isReady } = useAuroraView();\n *\n * async function handleClick() {\n * const result = await client.value?.call('api.echo', { message: 'Hello' });\n * console.log(result);\n * }\n * </script>\n * ```\n */\nexport function useAuroraView(): {\n client: Ref<AuroraViewClient>;\n isReady: Ref<boolean>;\n} {\n const client = ref<AuroraViewClient>(getClient());\n const isReady = ref(false);\n\n onMounted(async () => {\n if (client.value.isReady()) {\n isReady.value = true;\n } else {\n await client.value.whenReady();\n isReady.value = true;\n }\n });\n\n return { client: client as Ref<AuroraViewClient>, isReady };\n}\n\n/**\n * Composable to subscribe to an event\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { useAuroraEvent } from '@aspect/auroraview-sdk/vue';\n *\n * useAuroraEvent('custom:event', (data) => {\n * console.log('Received:', data);\n * });\n * </script>\n * ```\n */\nexport function useAuroraEvent<T = unknown>(\n event: string,\n handler: EventHandler<T>\n): void {\n let unsubscribe: Unsubscribe | null = null;\n\n onMounted(() => {\n const client = getClient();\n unsubscribe = client.on<T>(event, handler);\n });\n\n onUnmounted(() => {\n unsubscribe?.();\n });\n}\n\n/**\n * Composable to subscribe to multiple events\n */\nexport function useAuroraEvents(\n events: Record<string, EventHandler>\n): void {\n const unsubscribers: Unsubscribe[] = [];\n\n onMounted(() => {\n const client = getClient();\n Object.entries(events).forEach(([event, handler]) => {\n unsubscribers.push(client.on(event, handler));\n });\n });\n\n onUnmounted(() => {\n unsubscribers.forEach((unsub) => unsub());\n });\n}\n\n/**\n * Options for useProcessEvents composable\n */\nexport interface ProcessEventsOptions {\n onStdout?: (data: ProcessOutput) => void;\n onStderr?: (data: ProcessOutput) => void;\n onExit?: (data: ProcessExit) => void;\n pid?: number;\n}\n\n/**\n * Composable to subscribe to process events\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { ref } from 'vue';\n * import { useProcessEvents } from '@aspect/auroraview-sdk/vue';\n *\n * const output = ref<string[]>([]);\n *\n * useProcessEvents({\n * onStdout: (data) => output.value.push(data.data),\n * onExit: (data) => console.log(`Exited with code ${data.code}`),\n * });\n * </script>\n * ```\n */\nexport function useProcessEvents(options: ProcessEventsOptions = {}): void {\n const unsubscribers: Unsubscribe[] = [];\n\n onMounted(() => {\n const client = getClient();\n\n if (options.onStdout) {\n unsubscribers.push(\n client.on<ProcessOutput>('process:stdout', (data) => {\n if (options.pid === undefined || options.pid === data.pid) {\n options.onStdout?.(data);\n }\n })\n );\n }\n\n if (options.onStderr) {\n unsubscribers.push(\n client.on<ProcessOutput>('process:stderr', (data) => {\n if (options.pid === undefined || options.pid === data.pid) {\n options.onStderr?.(data);\n }\n })\n );\n }\n\n if (options.onExit) {\n unsubscribers.push(\n client.on<ProcessExit>('process:exit', (data) => {\n if (options.pid === undefined || options.pid === data.pid) {\n options.onExit?.(data);\n }\n })\n );\n }\n });\n\n onUnmounted(() => {\n unsubscribers.forEach((unsub) => unsub());\n });\n}\n\n/**\n * Composable to call an API method\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { useAuroraCall } from '@aspect/auroraview-sdk/vue';\n *\n * const { execute, loading, error, data } = useAuroraCall<string>('api.greet');\n * </script>\n *\n * <template>\n * <button @click=\"execute({ name: 'World' })\" :disabled=\"loading\">Greet</button>\n * <p v-if=\"data\">{{ data }}</p>\n * </template>\n * ```\n */\nexport function useAuroraCall<T = unknown>(method: string): {\n execute: (params?: unknown) => Promise<T>;\n loading: Ref<boolean>;\n error: Ref<Error | null>;\n data: Ref<T | null>;\n reset: () => void;\n} {\n const loading = ref(false);\n const error = ref<Error | null>(null);\n const data = ref<T | null>(null) as Ref<T | null>;\n\n const execute = async (params?: unknown): Promise<T> => {\n const client = getClient();\n loading.value = true;\n error.value = null;\n\n try {\n const result = await client.call<T>(method, params);\n data.value = result;\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n error.value = err;\n throw err;\n } finally {\n loading.value = false;\n }\n };\n\n const reset = () => {\n loading.value = false;\n error.value = null;\n data.value = null;\n };\n\n return { execute, loading, error, data, reset };\n}\n\n/**\n * Composable to invoke a plugin command\n */\nexport function useAuroraInvoke<T = unknown>(cmd: string): {\n execute: (args?: Record<string, unknown>) => Promise<T>;\n loading: Ref<boolean>;\n error: Ref<Error | null>;\n data: Ref<T | null>;\n reset: () => void;\n} {\n const loading = ref(false);\n const error = ref<Error | null>(null);\n const data = ref<T | null>(null) as Ref<T | null>;\n\n const execute = async (args?: Record<string, unknown>): Promise<T> => {\n const client = getClient();\n loading.value = true;\n error.value = null;\n\n try {\n const result = await client.invoke<T>(cmd, args);\n data.value = result;\n return result;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n error.value = err;\n throw err;\n } finally {\n loading.value = false;\n }\n };\n\n const reset = () => {\n loading.value = false;\n error.value = null;\n data.value = null;\n };\n\n return { execute, loading, error, data, reset };\n}\n\n/**\n * Composable to access shared state\n *\n * @example\n * ```vue\n * <script setup lang=\"ts\">\n * import { useAuroraState } from '@aspect/auroraview-sdk/vue';\n *\n * const theme = useAuroraState<string>('theme', 'light');\n * </script>\n *\n * <template>\n * <button @click=\"theme = theme === 'light' ? 'dark' : 'light'\">\n * Current: {{ theme }}\n * </button>\n * </template>\n * ```\n */\nexport function useAuroraState<T>(\n key: string,\n defaultValue?: T\n): Ref<T | undefined> {\n const client = getClient();\n const value = ref<T | undefined>(defaultValue) as Ref<T | undefined>;\n\n onMounted(() => {\n const state = client.state;\n if (!state) return;\n\n // Get initial value\n if (state[key] !== undefined) {\n value.value = state[key] as T;\n }\n\n // Subscribe to changes from Python\n const unsubscribe = state.onChange((changedKey, newValue) => {\n if (changedKey === key) {\n value.value = newValue as T;\n }\n });\n\n onUnmounted(unsubscribe);\n });\n\n // Watch for local changes and sync to state\n watch(value, (newValue) => {\n const state = client.state;\n if (state && state[key] !== newValue) {\n state[key] = newValue;\n }\n });\n\n return value;\n}\n\n// Re-export types\nexport type { ProcessOutput, ProcessExit } from '../core/types';\nexport type { AuroraViewClient } from '../core/bridge';\n"]}
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@auroraview/sdk",
3
+ "version": "0.3.21",
4
+ "description": "Framework-agnostic SDK for AuroraView WebView bridge",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./react": {
16
+ "types": "./dist/react.d.ts",
17
+ "import": "./dist/react.js",
18
+ "require": "./dist/react.cjs"
19
+ },
20
+ "./vue": {
21
+ "types": "./dist/vue.d.ts",
22
+ "import": "./dist/vue.js",
23
+ "require": "./dist/vue.cjs"
24
+ }
25
+ },
26
+ "scripts": {
27
+ "build": "tsup",
28
+ "build:assets": "tsup --config tsup.assets.config.ts",
29
+ "build:all": "npm run build && npm run build:assets",
30
+ "dev": "tsup --watch",
31
+ "dev:test": "npx serve tests/e2e/test-app -p 5173",
32
+ "test": "vitest run",
33
+ "test:watch": "vitest",
34
+ "test:coverage": "vitest run --coverage",
35
+ "test:e2e": "playwright test",
36
+ "test:e2e:ui": "playwright test --ui",
37
+ "test:all": "npm run test && npm run test:e2e",
38
+ "prepublishOnly": "npm run build",
39
+ "typecheck": "tsc --noEmit"
40
+ },
41
+ "peerDependencies": {
42
+ "react": ">=16.8.0",
43
+ "vue": ">=3.0.0"
44
+ },
45
+ "peerDependenciesMeta": {
46
+ "react": {
47
+ "optional": true
48
+ },
49
+ "vue": {
50
+ "optional": true
51
+ }
52
+ },
53
+ "devDependencies": {
54
+ "@playwright/test": "^1.49.0",
55
+ "@types/node": "^20.0.0",
56
+ "@types/react": "^19.2.7",
57
+ "@vitest/coverage-v8": "^3.2.4",
58
+ "serve": "^14.2.0",
59
+ "tsup": "^8.0.0",
60
+ "typescript": "^5.0.0",
61
+ "vitest": "^3.2.4",
62
+ "vue": "^3.5.25"
63
+ },
64
+ "files": [
65
+ "dist"
66
+ ],
67
+ "keywords": [
68
+ "auroraview",
69
+ "webview",
70
+ "dcc",
71
+ "ipc",
72
+ "bridge",
73
+ "tauri-like"
74
+ ],
75
+ "license": "MIT",
76
+ "repository": {
77
+ "type": "git",
78
+ "url": "https://github.com/loonghao/auroraview"
79
+ }
80
+ }