voltkit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +61 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +98 -0
- package/dist/app.js.map +1 -0
- package/dist/clipboard.d.ts +38 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +64 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/dialog.d.ts +95 -0
- package/dist/dialog.d.ts.map +1 -0
- package/dist/dialog.js +70 -0
- package/dist/dialog.js.map +1 -0
- package/dist/fs.d.ts +62 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +110 -0
- package/dist/fs.js.map +1 -0
- package/dist/globalShortcut.d.ts +32 -0
- package/dist/globalShortcut.d.ts.map +1 -0
- package/dist/globalShortcut.js +103 -0
- package/dist/globalShortcut.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +6 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +1 -0
- package/dist/ipc-contract/aliases.d.ts +4 -0
- package/dist/ipc-contract/aliases.d.ts.map +1 -0
- package/dist/ipc-contract/aliases.js +38 -0
- package/dist/ipc-contract/aliases.js.map +1 -0
- package/dist/ipc-contract/define.d.ts +3 -0
- package/dist/ipc-contract/define.d.ts.map +1 -0
- package/dist/ipc-contract/define.js +7 -0
- package/dist/ipc-contract/define.js.map +1 -0
- package/dist/ipc-contract/handlers.d.ts +3 -0
- package/dist/ipc-contract/handlers.d.ts.map +1 -0
- package/dist/ipc-contract/handlers.js +26 -0
- package/dist/ipc-contract/handlers.js.map +1 -0
- package/dist/ipc-contract/invoker.d.ts +4 -0
- package/dist/ipc-contract/invoker.d.ts.map +1 -0
- package/dist/ipc-contract/invoker.js +32 -0
- package/dist/ipc-contract/invoker.js.map +1 -0
- package/dist/ipc-contract/schema.d.ts +17 -0
- package/dist/ipc-contract/schema.d.ts.map +1 -0
- package/dist/ipc-contract/schema.js +78 -0
- package/dist/ipc-contract/schema.js.map +1 -0
- package/dist/ipc-contract/types.d.ts +45 -0
- package/dist/ipc-contract/types.d.ts.map +1 -0
- package/dist/ipc-contract/types.js +17 -0
- package/dist/ipc-contract/types.js.map +1 -0
- package/dist/ipc-contract/validation.d.ts +4 -0
- package/dist/ipc-contract/validation.d.ts.map +1 -0
- package/dist/ipc-contract/validation.js +24 -0
- package/dist/ipc-contract/validation.js.map +1 -0
- package/dist/ipc-contract.d.ts +25 -0
- package/dist/ipc-contract.d.ts.map +1 -0
- package/dist/ipc-contract.js +9 -0
- package/dist/ipc-contract.js.map +1 -0
- package/dist/ipc.d.ts +85 -0
- package/dist/ipc.d.ts.map +1 -0
- package/dist/ipc.js +196 -0
- package/dist/ipc.js.map +1 -0
- package/dist/menu.d.ts +72 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +179 -0
- package/dist/menu.js.map +1 -0
- package/dist/notification.d.ts +34 -0
- package/dist/notification.d.ts.map +1 -0
- package/dist/notification.js +42 -0
- package/dist/notification.js.map +1 -0
- package/dist/renderer.d.ts +9 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +7 -0
- package/dist/renderer.js.map +1 -0
- package/dist/runtime-modules.d.ts +161 -0
- package/dist/runtime-modules.d.ts.map +1 -0
- package/dist/runtime-modules.js +2 -0
- package/dist/runtime-modules.js.map +1 -0
- package/dist/shell.d.ts +22 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +36 -0
- package/dist/shell.js.map +1 -0
- package/dist/tray.d.ts +59 -0
- package/dist/tray.d.ts.map +1 -0
- package/dist/tray.js +114 -0
- package/dist/tray.js.map +1 -0
- package/dist/types.d.ts +200 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +61 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +128 -0
- package/dist/updater.js.map +1 -0
- package/dist/window/browser-window.d.ts +41 -0
- package/dist/window/browser-window.d.ts.map +1 -0
- package/dist/window/browser-window.js +219 -0
- package/dist/window/browser-window.js.map +1 -0
- package/dist/window/native-bridge.d.ts +13 -0
- package/dist/window/native-bridge.d.ts.map +1 -0
- package/dist/window/native-bridge.js +44 -0
- package/dist/window/native-bridge.js.map +1 -0
- package/dist/window/registry.d.ts +9 -0
- package/dist/window/registry.d.ts.map +1 -0
- package/dist/window/registry.js +32 -0
- package/dist/window/registry.js.map +1 -0
- package/dist/window/types.d.ts +23 -0
- package/dist/window/types.d.ts.map +1 -0
- package/dist/window/types.js +2 -0
- package/dist/window/types.js.map +1 -0
- package/dist/window.d.ts +3 -0
- package/dist/window.d.ts.map +1 -0
- package/dist/window.js +2 -0
- package/dist/window.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IpcSchema as IpcSchemaValue, createSchema } from './ipc-contract/schema.js';
|
|
2
|
+
export { IpcContractValidationError, isIpcContractValidationError, } from './ipc-contract/types.js';
|
|
3
|
+
export const IpcSchema = IpcSchemaValue;
|
|
4
|
+
export { createSchema };
|
|
5
|
+
export { defineCommands } from './ipc-contract/define.js';
|
|
6
|
+
export { resolveContractChannel } from './ipc-contract/aliases.js';
|
|
7
|
+
export { registerContractHandlers } from './ipc-contract/handlers.js';
|
|
8
|
+
export { createContractInvoker, createLegacyInvokeAdapter, } from './ipc-contract/invoker.js';
|
|
9
|
+
//# sourceMappingURL=ipc-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-contract.js","sourceRoot":"","sources":["../src/ipc-contract.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGrF,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAGjC,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC"}
|
package/dist/ipc.d.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC (Inter-Process Communication) module.
|
|
3
|
+
* Provides the `ipcMain` API for the backend (Node.js) side.
|
|
4
|
+
*/
|
|
5
|
+
type IpcHandler = (args: unknown) => Promise<unknown> | unknown;
|
|
6
|
+
export type IpcErrorCode = 'IPC_HANDLER_NOT_FOUND' | 'IPC_HANDLER_ERROR' | 'IPC_HANDLER_TIMEOUT' | 'IPC_PAYLOAD_TOO_LARGE' | 'IPC_IN_FLIGHT_LIMIT';
|
|
7
|
+
export interface IpcProcessResponse {
|
|
8
|
+
id: string;
|
|
9
|
+
result?: unknown;
|
|
10
|
+
error?: string;
|
|
11
|
+
errorCode?: IpcErrorCode;
|
|
12
|
+
errorDetails?: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface IpcProcessOptions {
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Backend IPC API (Electron-compatible pattern).
|
|
19
|
+
* Used in the main process to register handlers that the renderer can invoke.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ipcMain: {
|
|
22
|
+
/**
|
|
23
|
+
* Register a handler for an IPC channel.
|
|
24
|
+
* The handler receives arguments from the renderer and returns a result.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* ipcMain.handle('get-user', async (args) => {
|
|
29
|
+
* return { name: 'Alice', id: args.id };
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
handle(channel: string, handler: IpcHandler): void;
|
|
34
|
+
/**
|
|
35
|
+
* Remove a previously registered handler.
|
|
36
|
+
*/
|
|
37
|
+
removeHandler(channel: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Remove all registered handlers.
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
clearHandlers(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get a registered handler (internal use).
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
getHandler(channel: string): IpcHandler | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Check if a handler is registered for a channel.
|
|
50
|
+
*/
|
|
51
|
+
hasHandler(channel: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Process an IPC request from the renderer.
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
56
|
+
processRequest(id: string, method: string, args: unknown, options?: IpcProcessOptions): Promise<IpcProcessResponse>;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Renderer-side IPC API.
|
|
60
|
+
* These functions are available in the WebView context via `window.__volt__`.
|
|
61
|
+
* This module provides TypeScript types for the renderer API.
|
|
62
|
+
*/
|
|
63
|
+
/**
|
|
64
|
+
* Invoke an IPC handler registered in the main process.
|
|
65
|
+
* This is the renderer-side API - it calls through to the Rust IPC bridge.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* // In the renderer (browser context)
|
|
70
|
+
* const user = await invoke<User>('get-user', { id: 1 });
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function invoke<T = unknown>(channel: string, ...args: unknown[]): Promise<T>;
|
|
74
|
+
/**
|
|
75
|
+
* Listen for events emitted from the main process.
|
|
76
|
+
* This is the renderer-side API.
|
|
77
|
+
*/
|
|
78
|
+
export declare function on(event: string, callback: (...args: unknown[]) => void): void;
|
|
79
|
+
/**
|
|
80
|
+
* Remove an event listener.
|
|
81
|
+
* This is the renderer-side API.
|
|
82
|
+
*/
|
|
83
|
+
export declare function off(event: string, callback: (...args: unknown[]) => void): void;
|
|
84
|
+
export {};
|
|
85
|
+
//# sourceMappingURL=ipc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,KAAK,UAAU,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAIhE,MAAM,MAAM,YAAY,GACpB,uBAAuB,GACvB,mBAAmB,GACnB,qBAAqB,GACrB,uBAAuB,GACvB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;GAGG;AACH,eAAO,MAAM,OAAO;IAClB;;;;;;;;;;OAUG;oBACa,MAAM,WAAW,UAAU,GAAG,IAAI;IAOlD;;OAEG;2BACoB,MAAM,GAAG,IAAI;IAIpC;;;OAGG;qBACc,IAAI;IAIrB;;;OAGG;wBACiB,MAAM,GAAG,UAAU,GAAG,SAAS;IAInD;;OAEG;wBACiB,MAAM,GAAG,OAAO;IAIpC;;;OAGG;uBAEG,MAAM,UACF,MAAM,QACR,OAAO,YACJ,iBAAiB,GACzB,OAAO,CAAC,kBAAkB,CAAC;CAoC/B,CAAC;AAEF;;;;GAIG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,OAAO,EAChC,OAAO,EAAE,MAAM,EACf,GAAG,IAAI,EAAE,OAAO,EAAE,GACjB,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED;;;GAGG;AACH,wBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAS9E;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAS/E"}
|
package/dist/ipc.js
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC (Inter-Process Communication) module.
|
|
3
|
+
* Provides the `ipcMain` API for the backend (Node.js) side.
|
|
4
|
+
*/
|
|
5
|
+
const handlers = new Map();
|
|
6
|
+
const DEFAULT_HANDLER_TIMEOUT_MS = 5000;
|
|
7
|
+
/**
|
|
8
|
+
* Backend IPC API (Electron-compatible pattern).
|
|
9
|
+
* Used in the main process to register handlers that the renderer can invoke.
|
|
10
|
+
*/
|
|
11
|
+
export const ipcMain = {
|
|
12
|
+
/**
|
|
13
|
+
* Register a handler for an IPC channel.
|
|
14
|
+
* The handler receives arguments from the renderer and returns a result.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* ipcMain.handle('get-user', async (args) => {
|
|
19
|
+
* return { name: 'Alice', id: args.id };
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
handle(channel, handler) {
|
|
24
|
+
if (handlers.has(channel)) {
|
|
25
|
+
throw new Error(`IPC handler already registered for channel: ${channel}`);
|
|
26
|
+
}
|
|
27
|
+
handlers.set(channel, handler);
|
|
28
|
+
},
|
|
29
|
+
/**
|
|
30
|
+
* Remove a previously registered handler.
|
|
31
|
+
*/
|
|
32
|
+
removeHandler(channel) {
|
|
33
|
+
handlers.delete(channel);
|
|
34
|
+
},
|
|
35
|
+
/**
|
|
36
|
+
* Remove all registered handlers.
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
39
|
+
clearHandlers() {
|
|
40
|
+
handlers.clear();
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Get a registered handler (internal use).
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
getHandler(channel) {
|
|
47
|
+
return handlers.get(channel);
|
|
48
|
+
},
|
|
49
|
+
/**
|
|
50
|
+
* Check if a handler is registered for a channel.
|
|
51
|
+
*/
|
|
52
|
+
hasHandler(channel) {
|
|
53
|
+
return handlers.has(channel);
|
|
54
|
+
},
|
|
55
|
+
/**
|
|
56
|
+
* Process an IPC request from the renderer.
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
async processRequest(id, method, args, options = {}) {
|
|
60
|
+
const handler = handlers.get(method);
|
|
61
|
+
if (!handler) {
|
|
62
|
+
return {
|
|
63
|
+
id,
|
|
64
|
+
error: `Handler not found: ${method}`,
|
|
65
|
+
errorCode: 'IPC_HANDLER_NOT_FOUND',
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const timeoutMs = normalizeTimeout(options.timeoutMs);
|
|
69
|
+
try {
|
|
70
|
+
const result = await withTimeout(Promise.resolve(handler(args)), timeoutMs, `IPC handler timed out after ${timeoutMs}ms: ${method}`);
|
|
71
|
+
return { id, result: result ?? null };
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
75
|
+
if (isTimeoutError(err)) {
|
|
76
|
+
return {
|
|
77
|
+
id,
|
|
78
|
+
error: message,
|
|
79
|
+
errorCode: 'IPC_HANDLER_TIMEOUT',
|
|
80
|
+
errorDetails: { timeoutMs, method },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
id,
|
|
85
|
+
error: message,
|
|
86
|
+
errorCode: 'IPC_HANDLER_ERROR',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Renderer-side IPC API.
|
|
93
|
+
* These functions are available in the WebView context via `window.__volt__`.
|
|
94
|
+
* This module provides TypeScript types for the renderer API.
|
|
95
|
+
*/
|
|
96
|
+
/**
|
|
97
|
+
* Invoke an IPC handler registered in the main process.
|
|
98
|
+
* This is the renderer-side API - it calls through to the Rust IPC bridge.
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* // In the renderer (browser context)
|
|
103
|
+
* const user = await invoke<User>('get-user', { id: 1 });
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export function invoke(channel, ...args) {
|
|
107
|
+
// This function is meant to be used in the renderer context
|
|
108
|
+
// where window.__volt__ is available. In Node.js context, throw.
|
|
109
|
+
const volt = getVoltBridge();
|
|
110
|
+
if (volt) {
|
|
111
|
+
let payload = null;
|
|
112
|
+
if (args.length === 1) {
|
|
113
|
+
payload = args[0];
|
|
114
|
+
}
|
|
115
|
+
else if (args.length > 1) {
|
|
116
|
+
payload = args;
|
|
117
|
+
}
|
|
118
|
+
return volt.invoke(channel, payload);
|
|
119
|
+
}
|
|
120
|
+
throw new Error('invoke() can only be called from the renderer (WebView) context.');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Listen for events emitted from the main process.
|
|
124
|
+
* This is the renderer-side API.
|
|
125
|
+
*/
|
|
126
|
+
export function on(event, callback) {
|
|
127
|
+
const volt = getVoltBridge();
|
|
128
|
+
if (volt) {
|
|
129
|
+
volt.on(event, callback);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
throw new Error('on() can only be called from the renderer (WebView) context.');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Remove an event listener.
|
|
136
|
+
* This is the renderer-side API.
|
|
137
|
+
*/
|
|
138
|
+
export function off(event, callback) {
|
|
139
|
+
const volt = getVoltBridge();
|
|
140
|
+
if (volt) {
|
|
141
|
+
volt.off(event, callback);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
throw new Error('off() can only be called from the renderer (WebView) context.');
|
|
145
|
+
}
|
|
146
|
+
function normalizeTimeout(timeoutMs) {
|
|
147
|
+
if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs)) {
|
|
148
|
+
return DEFAULT_HANDLER_TIMEOUT_MS;
|
|
149
|
+
}
|
|
150
|
+
if (timeoutMs <= 0) {
|
|
151
|
+
return DEFAULT_HANDLER_TIMEOUT_MS;
|
|
152
|
+
}
|
|
153
|
+
return timeoutMs;
|
|
154
|
+
}
|
|
155
|
+
function isTimeoutError(err) {
|
|
156
|
+
if (!(err instanceof Error)) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
return err.name === 'TimeoutError';
|
|
160
|
+
}
|
|
161
|
+
function timeoutError(message) {
|
|
162
|
+
const err = new Error(message);
|
|
163
|
+
err.name = 'TimeoutError';
|
|
164
|
+
return err;
|
|
165
|
+
}
|
|
166
|
+
function withTimeout(promise, timeoutMs, message) {
|
|
167
|
+
return new Promise((resolve, reject) => {
|
|
168
|
+
const timer = setTimeout(() => {
|
|
169
|
+
reject(timeoutError(message));
|
|
170
|
+
}, timeoutMs);
|
|
171
|
+
if (typeof timer.unref === 'function') {
|
|
172
|
+
timer.unref();
|
|
173
|
+
}
|
|
174
|
+
promise.then((value) => {
|
|
175
|
+
clearTimeout(timer);
|
|
176
|
+
resolve(value);
|
|
177
|
+
}, (err) => {
|
|
178
|
+
clearTimeout(timer);
|
|
179
|
+
reject(err);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/** Get the Volt IPC bridge from the window global, or null in Node.js. */
|
|
184
|
+
function getVoltBridge() {
|
|
185
|
+
// Use globalThis to access window in a way that works in both Node.js and browser.
|
|
186
|
+
// In Node.js, globalThis.window is undefined. In browser, it's the Window object.
|
|
187
|
+
const g = globalThis;
|
|
188
|
+
if (typeof g['window'] !== 'undefined') {
|
|
189
|
+
const w = g['window'];
|
|
190
|
+
if (w['__volt__']) {
|
|
191
|
+
return w['__volt__'];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=ipc.js.map
|
package/dist/ipc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":"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"}
|
package/dist/menu.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native menu module.
|
|
3
|
+
* Provides Menu and MenuItem classes for building application and context menus.
|
|
4
|
+
* Electron-compatible API surface.
|
|
5
|
+
*/
|
|
6
|
+
/** Menu item role for predefined system actions. */
|
|
7
|
+
export type MenuItemRole = 'quit' | 'copy' | 'cut' | 'paste' | 'selectAll' | 'undo' | 'redo' | 'minimize' | 'separator';
|
|
8
|
+
/** Options for creating a menu item. */
|
|
9
|
+
export interface MenuItemOptions {
|
|
10
|
+
/** Internal menu item ID used for native event dispatch. */
|
|
11
|
+
id?: string;
|
|
12
|
+
/** Display label. */
|
|
13
|
+
label?: string;
|
|
14
|
+
/** Keyboard accelerator (e.g., 'CmdOrCtrl+C'). */
|
|
15
|
+
accelerator?: string;
|
|
16
|
+
/** Whether the item is enabled. Default: true. */
|
|
17
|
+
enabled?: boolean;
|
|
18
|
+
/** Item type: 'normal', 'separator', or 'submenu'. */
|
|
19
|
+
type?: 'normal' | 'separator' | 'submenu';
|
|
20
|
+
/** Predefined role. When set, label and accelerator are auto-configured. */
|
|
21
|
+
role?: MenuItemRole;
|
|
22
|
+
/** Click handler. */
|
|
23
|
+
click?: () => void;
|
|
24
|
+
/** Submenu items (only for type 'submenu'). */
|
|
25
|
+
submenu?: MenuItemOptions[];
|
|
26
|
+
}
|
|
27
|
+
/** A single menu item. */
|
|
28
|
+
export declare class MenuItem {
|
|
29
|
+
readonly id: string | undefined;
|
|
30
|
+
readonly label: string;
|
|
31
|
+
readonly accelerator: string | undefined;
|
|
32
|
+
readonly enabled: boolean;
|
|
33
|
+
readonly type: string;
|
|
34
|
+
readonly role: MenuItemRole | undefined;
|
|
35
|
+
readonly click: (() => void) | undefined;
|
|
36
|
+
readonly submenu: MenuItem[] | undefined;
|
|
37
|
+
constructor(options: MenuItemOptions);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Native application menu.
|
|
41
|
+
* Electron-compatible API for building menus.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const menu = Menu.buildFromTemplate([
|
|
46
|
+
* { label: 'File', submenu: [
|
|
47
|
+
* { label: 'Quit', role: 'quit' },
|
|
48
|
+
* ]},
|
|
49
|
+
* ]);
|
|
50
|
+
* Menu.setApplicationMenu(menu);
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare class Menu {
|
|
54
|
+
private items;
|
|
55
|
+
private _nativeMenu;
|
|
56
|
+
private static _applicationMenu;
|
|
57
|
+
/** Build a menu from a template array of options. */
|
|
58
|
+
static buildFromTemplate(template: MenuItemOptions[]): Menu;
|
|
59
|
+
/** Set the application menu bar. */
|
|
60
|
+
static setApplicationMenu(menu: Menu | null): void;
|
|
61
|
+
/** Get the current application menu. */
|
|
62
|
+
static getApplicationMenu(): Menu | null;
|
|
63
|
+
/** Append a menu item. */
|
|
64
|
+
append(item: MenuItem): void;
|
|
65
|
+
/** Get all items in this menu. */
|
|
66
|
+
getItems(): MenuItem[];
|
|
67
|
+
/** Convert menu to a serializable template for passing to native code. */
|
|
68
|
+
toJSON(): MenuItemOptions[];
|
|
69
|
+
}
|
|
70
|
+
/** @internal Dispatches a native menu event into the registered JS click callback. */
|
|
71
|
+
export declare function __internalDispatchMenuEvent(menuId: string): void;
|
|
72
|
+
//# sourceMappingURL=menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,oDAAoD;AACpD,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,MAAM,GACN,KAAK,GACL,OAAO,GACP,WAAW,GACX,MAAM,GACN,MAAM,GACN,UAAU,GACV,WAAW,CAAC;AAEhB,wCAAwC;AACxC,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;IAC1C,4EAA4E;IAC5E,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,qBAAqB;IACrB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,0BAA0B;AAC1B,qBAAa,QAAQ;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;gBAE7B,OAAO,EAAE,eAAe;CAcrC;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,WAAW,CAAyB;IAE5C,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAqB;IAEpD,qDAAqD;IACrD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,IAAI;IAa3D,oCAAoC;IACpC,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;IA6BlD,wCAAwC;IACxC,MAAM,CAAC,kBAAkB,IAAI,IAAI,GAAG,IAAI;IAIxC,0BAA0B;IAC1B,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAU5B,kCAAkC;IAClC,QAAQ,IAAI,QAAQ,EAAE;IAItB,0EAA0E;IAC1E,MAAM,IAAI,eAAe,EAAE;CAG5B;AA6DD,sFAAsF;AACtF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAUhE"}
|
package/dist/menu.js
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native menu module.
|
|
3
|
+
* Provides Menu and MenuItem classes for building application and context menus.
|
|
4
|
+
* Electron-compatible API surface.
|
|
5
|
+
*/
|
|
6
|
+
import { VoltMenu } from '@voltkit/volt-native';
|
|
7
|
+
import { getApp } from './app.js';
|
|
8
|
+
/** A single menu item. */
|
|
9
|
+
export class MenuItem {
|
|
10
|
+
id;
|
|
11
|
+
label;
|
|
12
|
+
accelerator;
|
|
13
|
+
enabled;
|
|
14
|
+
type;
|
|
15
|
+
role;
|
|
16
|
+
click;
|
|
17
|
+
submenu;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
const isSeparator = (options.type ?? 'normal') === 'separator';
|
|
20
|
+
const shouldGenerateId = !isSeparator && (!options.role || !!options.click);
|
|
21
|
+
this.id = options.id ?? (shouldGenerateId ? `menu-item-${nextMenuItemId++}` : undefined);
|
|
22
|
+
this.label = options.label ?? '';
|
|
23
|
+
this.accelerator = options.accelerator;
|
|
24
|
+
this.enabled = options.enabled ?? true;
|
|
25
|
+
this.type = options.type ?? 'normal';
|
|
26
|
+
this.role = options.role;
|
|
27
|
+
this.click = options.click;
|
|
28
|
+
if (options.submenu) {
|
|
29
|
+
this.submenu = options.submenu.map((item) => new MenuItem(item));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Native application menu.
|
|
35
|
+
* Electron-compatible API for building menus.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* const menu = Menu.buildFromTemplate([
|
|
40
|
+
* { label: 'File', submenu: [
|
|
41
|
+
* { label: 'Quit', role: 'quit' },
|
|
42
|
+
* ]},
|
|
43
|
+
* ]);
|
|
44
|
+
* Menu.setApplicationMenu(menu);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export class Menu {
|
|
48
|
+
items = [];
|
|
49
|
+
_nativeMenu = null;
|
|
50
|
+
static _applicationMenu = null;
|
|
51
|
+
/** Build a menu from a template array of options. */
|
|
52
|
+
static buildFromTemplate(template) {
|
|
53
|
+
ensureMenuPermission('Menu.buildFromTemplate()');
|
|
54
|
+
const menu = new Menu();
|
|
55
|
+
menu.items = template.map((item) => new MenuItem(item));
|
|
56
|
+
syncMenuClickHandlers(menu);
|
|
57
|
+
// Build the native menu from the serializable template
|
|
58
|
+
const nativeTemplate = menu.toJSON();
|
|
59
|
+
menu._nativeMenu = new VoltMenu(nativeTemplate);
|
|
60
|
+
return menu;
|
|
61
|
+
}
|
|
62
|
+
/** Set the application menu bar. */
|
|
63
|
+
static setApplicationMenu(menu) {
|
|
64
|
+
ensureMenuPermission('Menu.setApplicationMenu()');
|
|
65
|
+
const previousMenu = Menu._applicationMenu;
|
|
66
|
+
if (menu) {
|
|
67
|
+
const nextNativeMenu = menu._nativeMenu ?? new VoltMenu(menu.toJSON());
|
|
68
|
+
syncMenuClickHandlers(menu);
|
|
69
|
+
try {
|
|
70
|
+
nextNativeMenu.setAsAppMenu();
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (previousMenu !== menu) {
|
|
74
|
+
clearMenuClickHandlers(menu);
|
|
75
|
+
}
|
|
76
|
+
throw err;
|
|
77
|
+
}
|
|
78
|
+
if (previousMenu && previousMenu !== menu) {
|
|
79
|
+
clearMenuClickHandlers(previousMenu);
|
|
80
|
+
}
|
|
81
|
+
menu._nativeMenu = nextNativeMenu;
|
|
82
|
+
Menu._applicationMenu = menu;
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Explicitly clear native app menu when caller passes null.
|
|
86
|
+
new VoltMenu([]).setAsAppMenu();
|
|
87
|
+
if (previousMenu) {
|
|
88
|
+
clearMenuClickHandlers(previousMenu);
|
|
89
|
+
}
|
|
90
|
+
Menu._applicationMenu = null;
|
|
91
|
+
}
|
|
92
|
+
/** Get the current application menu. */
|
|
93
|
+
static getApplicationMenu() {
|
|
94
|
+
return Menu._applicationMenu;
|
|
95
|
+
}
|
|
96
|
+
/** Append a menu item. */
|
|
97
|
+
append(item) {
|
|
98
|
+
ensureMenuPermission('Menu.append()');
|
|
99
|
+
this.items.push(item);
|
|
100
|
+
this._nativeMenu = new VoltMenu(this.toJSON());
|
|
101
|
+
syncMenuClickHandlers(this);
|
|
102
|
+
if (Menu._applicationMenu === this) {
|
|
103
|
+
this._nativeMenu.setAsAppMenu();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Get all items in this menu. */
|
|
107
|
+
getItems() {
|
|
108
|
+
return [...this.items];
|
|
109
|
+
}
|
|
110
|
+
/** Convert menu to a serializable template for passing to native code. */
|
|
111
|
+
toJSON() {
|
|
112
|
+
return this.items.map((item) => serializeMenuItem(item));
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Recursively serialize a MenuItem to a plain object for native. */
|
|
116
|
+
function serializeMenuItem(item) {
|
|
117
|
+
const result = {
|
|
118
|
+
id: item.id,
|
|
119
|
+
label: item.label,
|
|
120
|
+
accelerator: item.accelerator,
|
|
121
|
+
enabled: item.enabled,
|
|
122
|
+
type: item.type,
|
|
123
|
+
role: item.role,
|
|
124
|
+
};
|
|
125
|
+
if (item.submenu) {
|
|
126
|
+
result.submenu = item.submenu.map((sub) => serializeMenuItem(sub));
|
|
127
|
+
}
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
const menuClickHandlers = new Map();
|
|
131
|
+
const menuHandlerIds = new WeakMap();
|
|
132
|
+
let nextMenuItemId = 1;
|
|
133
|
+
function ensureMenuPermission(apiName) {
|
|
134
|
+
const granted = new Set(getApp().getConfig().permissions ?? []);
|
|
135
|
+
if (!granted.has('menu')) {
|
|
136
|
+
throw new Error(`Permission denied: ${apiName} requires 'menu' in volt.config.ts permissions.`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function syncMenuClickHandlers(menu) {
|
|
140
|
+
clearMenuClickHandlers(menu);
|
|
141
|
+
const ids = new Set();
|
|
142
|
+
collectMenuClickHandlers(menu.getItems(), ids);
|
|
143
|
+
menuHandlerIds.set(menu, ids);
|
|
144
|
+
}
|
|
145
|
+
function clearMenuClickHandlers(menu) {
|
|
146
|
+
const ids = menuHandlerIds.get(menu);
|
|
147
|
+
if (!ids) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
for (const id of ids) {
|
|
151
|
+
menuClickHandlers.delete(id);
|
|
152
|
+
}
|
|
153
|
+
menuHandlerIds.delete(menu);
|
|
154
|
+
}
|
|
155
|
+
function collectMenuClickHandlers(items, ids) {
|
|
156
|
+
for (const item of items) {
|
|
157
|
+
if (item.id && item.click) {
|
|
158
|
+
menuClickHandlers.set(item.id, item.click);
|
|
159
|
+
ids.add(item.id);
|
|
160
|
+
}
|
|
161
|
+
if (item.submenu) {
|
|
162
|
+
collectMenuClickHandlers(item.submenu, ids);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** @internal Dispatches a native menu event into the registered JS click callback. */
|
|
167
|
+
export function __internalDispatchMenuEvent(menuId) {
|
|
168
|
+
const clickHandler = menuClickHandlers.get(menuId);
|
|
169
|
+
if (!clickHandler) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
clickHandler();
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
console.error('[volt] Menu click handler failed:', err);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=menu.js.map
|
package/dist/menu.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native notification module.
|
|
3
|
+
* Provides OS-level notifications.
|
|
4
|
+
* Requires `permissions: ['notification']` in volt.config.ts.
|
|
5
|
+
*/
|
|
6
|
+
/** Options for creating a notification. */
|
|
7
|
+
export interface NotificationOptions {
|
|
8
|
+
/** Notification title. */
|
|
9
|
+
title: string;
|
|
10
|
+
/** Notification body text. */
|
|
11
|
+
body?: string;
|
|
12
|
+
/** Path to an icon file. */
|
|
13
|
+
icon?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Native OS notification.
|
|
17
|
+
* Web Notification API compatible.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* new Notification({ title: 'New message', body: 'Hello!' }).show();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class Notification {
|
|
25
|
+
readonly title: string;
|
|
26
|
+
readonly body: string | undefined;
|
|
27
|
+
readonly icon: string | undefined;
|
|
28
|
+
constructor(options: NotificationOptions);
|
|
29
|
+
/** Display the notification. */
|
|
30
|
+
show(): void;
|
|
31
|
+
/** Check if the OS supports notifications. */
|
|
32
|
+
static isSupported(): boolean;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=notification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,2CAA2C;AAC3C,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEtB,OAAO,EAAE,mBAAmB;IAUxC,gCAAgC;IAChC,IAAI,IAAI,IAAI;IAQZ,8CAA8C;IAC9C,MAAM,CAAC,WAAW,IAAI,OAAO;CAG9B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native notification module.
|
|
3
|
+
* Provides OS-level notifications.
|
|
4
|
+
* Requires `permissions: ['notification']` in volt.config.ts.
|
|
5
|
+
*/
|
|
6
|
+
import { notificationShow } from '@voltkit/volt-native';
|
|
7
|
+
/**
|
|
8
|
+
* Native OS notification.
|
|
9
|
+
* Web Notification API compatible.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* new Notification({ title: 'New message', body: 'Hello!' }).show();
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export class Notification {
|
|
17
|
+
title;
|
|
18
|
+
body;
|
|
19
|
+
icon;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
const title = options.title.trim();
|
|
22
|
+
if (!title) {
|
|
23
|
+
throw new Error('Notification title must be a non-empty string.');
|
|
24
|
+
}
|
|
25
|
+
this.title = title;
|
|
26
|
+
this.body = options.body;
|
|
27
|
+
this.icon = options.icon;
|
|
28
|
+
}
|
|
29
|
+
/** Display the notification. */
|
|
30
|
+
show() {
|
|
31
|
+
notificationShow({
|
|
32
|
+
title: this.title,
|
|
33
|
+
body: this.body,
|
|
34
|
+
icon: this.icon,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/** Check if the OS supports notifications. */
|
|
38
|
+
static isSupported() {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=notification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification.js","sourceRoot":"","sources":["../src/notification.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAYxD;;;;;;;;GAQG;AACH,MAAM,OAAO,YAAY;IACd,KAAK,CAAS;IACd,IAAI,CAAqB;IACzB,IAAI,CAAqB;IAElC,YAAY,OAA4B;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,gCAAgC;IAChC,IAAI;QACF,gBAAgB,CAAC;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer-safe entrypoint.
|
|
3
|
+
* Exposes only APIs that are valid in the WebView/browser context.
|
|
4
|
+
*/
|
|
5
|
+
export { invoke, on, off } from './ipc.js';
|
|
6
|
+
export type { IpcErrorCode } from './ipc.js';
|
|
7
|
+
export { createContractInvoker, createLegacyInvokeAdapter, createSchema, defineCommands, IpcSchema, isIpcContractValidationError, resolveContractChannel, IpcContractValidationError, } from './ipc-contract.js';
|
|
8
|
+
export type { InferCommandRequest, InferCommandResponse, InferSchemaValue, IpcCommandDefinition, IpcCommandMap, IpcInvokeFn, IpcSchema as IpcSchemaType, TypedIpcInvoker, } from './ipc-contract.js';
|
|
9
|
+
//# sourceMappingURL=renderer.d.ts.map
|