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
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAgOA,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-updater module.
|
|
3
|
+
* Checks for updates, downloads with Ed25519 signature verification, and applies.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { autoUpdater } from 'voltkit';
|
|
8
|
+
*
|
|
9
|
+
* autoUpdater.on('update-available', (info) => {
|
|
10
|
+
* console.log(`Update available: ${info.version}`);
|
|
11
|
+
* });
|
|
12
|
+
*
|
|
13
|
+
* const info = await autoUpdater.checkForUpdates();
|
|
14
|
+
* if (info) {
|
|
15
|
+
* await autoUpdater.downloadUpdate(info);
|
|
16
|
+
* autoUpdater.quitAndInstall();
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import { EventEmitter } from 'node:events';
|
|
21
|
+
/** Information about an available update. */
|
|
22
|
+
export interface UpdateInfo {
|
|
23
|
+
/** New version string (semver). */
|
|
24
|
+
version: string;
|
|
25
|
+
/** Download URL for the update binary. */
|
|
26
|
+
url: string;
|
|
27
|
+
/** Ed25519 signature (base64). */
|
|
28
|
+
signature: string;
|
|
29
|
+
/** SHA-256 hash (hex). */
|
|
30
|
+
sha256: string;
|
|
31
|
+
}
|
|
32
|
+
declare class AutoUpdater extends EventEmitter {
|
|
33
|
+
private _downloadedData;
|
|
34
|
+
/**
|
|
35
|
+
* Check for available updates.
|
|
36
|
+
* Emits 'checking-for-update', then 'update-available' or 'update-not-available'.
|
|
37
|
+
*/
|
|
38
|
+
checkForUpdates(): Promise<UpdateInfo | null>;
|
|
39
|
+
/**
|
|
40
|
+
* Download an update and verify its signature.
|
|
41
|
+
* Emits 'download-progress' during download, then 'update-downloaded' on success.
|
|
42
|
+
*/
|
|
43
|
+
downloadUpdate(info: UpdateInfo): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Quit the application and install the downloaded update.
|
|
46
|
+
* On Windows production builds this uses the external updater helper process.
|
|
47
|
+
*/
|
|
48
|
+
quitAndInstall(): void;
|
|
49
|
+
/** @internal Test-only reset hook. */
|
|
50
|
+
_reset(): void;
|
|
51
|
+
}
|
|
52
|
+
/** The auto-updater singleton instance. */
|
|
53
|
+
export declare const autoUpdater: AutoUpdater;
|
|
54
|
+
/**
|
|
55
|
+
* Reset the auto-updater singleton state.
|
|
56
|
+
* Clears downloaded data and removes all listeners.
|
|
57
|
+
* Intended for testing only.
|
|
58
|
+
*/
|
|
59
|
+
export declare function resetAutoUpdater(): void;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwB3C,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAoBD,cAAM,WAAY,SAAQ,YAAY;IACpC,OAAO,CAAC,eAAe,CAAuB;IAE9C;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA2BnD;;;OAGG;IACG,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBrD;;;OAGG;IACH,cAAc,IAAI,IAAI;IAUtB,sCAAsC;IACtC,MAAM,IAAI,IAAI;CAIf;AAED,2CAA2C;AAC3C,eAAO,MAAM,WAAW,aAAoB,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
package/dist/updater.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-updater module.
|
|
3
|
+
* Checks for updates, downloads with Ed25519 signature verification, and applies.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { autoUpdater } from 'voltkit';
|
|
8
|
+
*
|
|
9
|
+
* autoUpdater.on('update-available', (info) => {
|
|
10
|
+
* console.log(`Update available: ${info.version}`);
|
|
11
|
+
* });
|
|
12
|
+
*
|
|
13
|
+
* const info = await autoUpdater.checkForUpdates();
|
|
14
|
+
* if (info) {
|
|
15
|
+
* await autoUpdater.downloadUpdate(info);
|
|
16
|
+
* autoUpdater.quitAndInstall();
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
import { EventEmitter } from 'node:events';
|
|
21
|
+
import { updaterCheck, updaterDownloadAndVerify, updaterApply, } from '@voltkit/volt-native';
|
|
22
|
+
import { getApp } from './app.js';
|
|
23
|
+
const REQUIRED_UPDATER_PERMISSIONS = ['fs', 'http'];
|
|
24
|
+
function requireUpdaterPermissions(apiName) {
|
|
25
|
+
const granted = new Set(getApp().getConfig().permissions ?? []);
|
|
26
|
+
for (const permission of REQUIRED_UPDATER_PERMISSIONS) {
|
|
27
|
+
if (!granted.has(permission)) {
|
|
28
|
+
throw new Error(`Permission denied: ${apiName} requires '${permission}' in volt.config.ts permissions.`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Build the native UpdateConfig from the app configuration. */
|
|
33
|
+
function buildNativeConfig(apiName) {
|
|
34
|
+
requireUpdaterPermissions(apiName);
|
|
35
|
+
const app = getApp();
|
|
36
|
+
const config = app.getConfig();
|
|
37
|
+
const updater = config.updater;
|
|
38
|
+
if (!updater) {
|
|
39
|
+
throw new Error('Updater not configured. Add an "updater" section to volt.config.ts with endpoint and publicKey.');
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
endpoint: updater.endpoint,
|
|
43
|
+
public_key: updater.publicKey,
|
|
44
|
+
current_version: config.version ?? '0.0.0',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
class AutoUpdater extends EventEmitter {
|
|
48
|
+
_downloadedData = null;
|
|
49
|
+
/**
|
|
50
|
+
* Check for available updates.
|
|
51
|
+
* Emits 'checking-for-update', then 'update-available' or 'update-not-available'.
|
|
52
|
+
*/
|
|
53
|
+
async checkForUpdates() {
|
|
54
|
+
this.emit('checking-for-update');
|
|
55
|
+
try {
|
|
56
|
+
const nativeConfig = buildNativeConfig('autoUpdater.checkForUpdates()');
|
|
57
|
+
const result = await updaterCheck(nativeConfig);
|
|
58
|
+
if (result) {
|
|
59
|
+
const info = {
|
|
60
|
+
version: result.version,
|
|
61
|
+
url: result.url,
|
|
62
|
+
signature: result.signature,
|
|
63
|
+
sha256: result.sha256,
|
|
64
|
+
};
|
|
65
|
+
this.emit('update-available', info);
|
|
66
|
+
return info;
|
|
67
|
+
}
|
|
68
|
+
this.emit('update-not-available');
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
73
|
+
this.emit('error', error);
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Download an update and verify its signature.
|
|
79
|
+
* Emits 'download-progress' during download, then 'update-downloaded' on success.
|
|
80
|
+
*/
|
|
81
|
+
async downloadUpdate(info) {
|
|
82
|
+
try {
|
|
83
|
+
const nativeConfig = buildNativeConfig('autoUpdater.downloadUpdate()');
|
|
84
|
+
const nativeInfo = {
|
|
85
|
+
version: info.version,
|
|
86
|
+
url: info.url,
|
|
87
|
+
signature: info.signature,
|
|
88
|
+
sha256: info.sha256,
|
|
89
|
+
};
|
|
90
|
+
const data = await updaterDownloadAndVerify(nativeConfig, nativeInfo);
|
|
91
|
+
this._downloadedData = data;
|
|
92
|
+
this.emit('update-downloaded', info);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
96
|
+
this.emit('error', new Error(message));
|
|
97
|
+
throw err;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Quit the application and install the downloaded update.
|
|
102
|
+
* On Windows production builds this uses the external updater helper process.
|
|
103
|
+
*/
|
|
104
|
+
quitAndInstall() {
|
|
105
|
+
requireUpdaterPermissions('autoUpdater.quitAndInstall()');
|
|
106
|
+
if (!this._downloadedData) {
|
|
107
|
+
throw new Error('No update has been downloaded. Call downloadUpdate() first.');
|
|
108
|
+
}
|
|
109
|
+
updaterApply(this._downloadedData);
|
|
110
|
+
getApp().quit();
|
|
111
|
+
}
|
|
112
|
+
/** @internal Test-only reset hook. */
|
|
113
|
+
_reset() {
|
|
114
|
+
this._downloadedData = null;
|
|
115
|
+
this.removeAllListeners();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** The auto-updater singleton instance. */
|
|
119
|
+
export const autoUpdater = new AutoUpdater();
|
|
120
|
+
/**
|
|
121
|
+
* Reset the auto-updater singleton state.
|
|
122
|
+
* Clears downloaded data and removes all listeners.
|
|
123
|
+
* Intended for testing only.
|
|
124
|
+
*/
|
|
125
|
+
export function resetAutoUpdater() {
|
|
126
|
+
autoUpdater._reset();
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { WindowOptions } from '../types.js';
|
|
3
|
+
export declare class BrowserWindow extends EventEmitter {
|
|
4
|
+
private id;
|
|
5
|
+
private options;
|
|
6
|
+
private destroyed;
|
|
7
|
+
private loadedUrl;
|
|
8
|
+
private pendingCloseFallbackTimer;
|
|
9
|
+
constructor(options?: WindowOptions);
|
|
10
|
+
getId(): string;
|
|
11
|
+
loadURL(url: string): void;
|
|
12
|
+
loadFile(filePath: string): void;
|
|
13
|
+
getURL(): string | null;
|
|
14
|
+
setTitle(title: string): void;
|
|
15
|
+
getTitle(): string;
|
|
16
|
+
setSize(width: number, height: number): void;
|
|
17
|
+
getSize(): [number, number];
|
|
18
|
+
setPosition(x: number, y: number): void;
|
|
19
|
+
getPosition(): [number, number];
|
|
20
|
+
setResizable(resizable: boolean): void;
|
|
21
|
+
isResizable(): boolean;
|
|
22
|
+
setAlwaysOnTop(flag: boolean): void;
|
|
23
|
+
isAlwaysOnTop(): boolean;
|
|
24
|
+
maximize(): void;
|
|
25
|
+
minimize(): void;
|
|
26
|
+
restore(): void;
|
|
27
|
+
show(): void;
|
|
28
|
+
focus(): void;
|
|
29
|
+
close(): void;
|
|
30
|
+
destroy(): void;
|
|
31
|
+
isDestroyed(): boolean;
|
|
32
|
+
getNativeConfig(): Record<string, unknown>;
|
|
33
|
+
private dispatchWindowCommand;
|
|
34
|
+
private assertNotDestroyed;
|
|
35
|
+
private scheduleNativeCloseFallback;
|
|
36
|
+
private clearNativeCloseFallback;
|
|
37
|
+
static getAllWindows(): BrowserWindow[];
|
|
38
|
+
static getFocusedWindow(): BrowserWindow | null;
|
|
39
|
+
static fromId(id: string): BrowserWindow | undefined;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=browser-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-window.d.ts","sourceRoot":"","sources":["../../src/window/browser-window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAyCjD,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,yBAAyB,CAA+B;gBAEpD,OAAO,GAAE,aAAkB;IAavC,KAAK,IAAI,MAAM;IAIf,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAU1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKhC,MAAM,IAAI,MAAM,GAAG,IAAI;IAIvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,QAAQ,IAAI,MAAM;IAIlB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAO5C,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAI3B,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAOvC,WAAW,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;IAI/B,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,WAAW,IAAI,OAAO;IAItB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAKnC,aAAa,IAAI,OAAO;IAIxB,QAAQ,IAAI,IAAI;IAIhB,QAAQ,IAAI,IAAI;IAIhB,OAAO,IAAI,IAAI;IAIf,IAAI,IAAI,IAAI;IAKZ,KAAK,IAAI,IAAI;IAIb,KAAK,IAAI,IAAI;IAgBb,OAAO,IAAI,IAAI;IAoBf,WAAW,IAAI,OAAO;IAItB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAwB1C,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,2BAA2B;IAanC,OAAO,CAAC,wBAAwB;IAQhC,MAAM,CAAC,aAAa,IAAI,aAAa,EAAE;IAIvC,MAAM,CAAC,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAI/C,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;CAGrD"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { pathToFileURL } from 'node:url';
|
|
3
|
+
import { getApp } from '../app.js';
|
|
4
|
+
import { invokeNativeWindowCommand } from './native-bridge.js';
|
|
5
|
+
import { addWindowToRegistry, blurWindowInRegistry, focusWindowInRegistry, getFocusedRegisteredWindow, getRegisteredWindowById, getRegisteredWindows, removeWindowFromRegistry, } from './registry.js';
|
|
6
|
+
function resolveWindowOptions(options) {
|
|
7
|
+
return {
|
|
8
|
+
width: 800,
|
|
9
|
+
height: 600,
|
|
10
|
+
title: 'Volt',
|
|
11
|
+
resizable: true,
|
|
12
|
+
decorations: true,
|
|
13
|
+
devtools: process.env.NODE_ENV !== 'production',
|
|
14
|
+
...options,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function createCloseEvent() {
|
|
18
|
+
let prevented = false;
|
|
19
|
+
return {
|
|
20
|
+
get defaultPrevented() {
|
|
21
|
+
return prevented;
|
|
22
|
+
},
|
|
23
|
+
preventDefault() {
|
|
24
|
+
prevented = true;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export class BrowserWindow extends EventEmitter {
|
|
29
|
+
id;
|
|
30
|
+
options;
|
|
31
|
+
destroyed = false;
|
|
32
|
+
loadedUrl = null;
|
|
33
|
+
pendingCloseFallbackTimer = null;
|
|
34
|
+
constructor(options = {}) {
|
|
35
|
+
super();
|
|
36
|
+
this.id = crypto.randomUUID();
|
|
37
|
+
this.options = resolveWindowOptions(options);
|
|
38
|
+
addWindowToRegistry(this);
|
|
39
|
+
this.on('focus', () => {
|
|
40
|
+
focusWindowInRegistry(this);
|
|
41
|
+
});
|
|
42
|
+
this.on('blur', () => {
|
|
43
|
+
blurWindowInRegistry(this);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
getId() {
|
|
47
|
+
return this.id;
|
|
48
|
+
}
|
|
49
|
+
loadURL(url) {
|
|
50
|
+
this.assertNotDestroyed();
|
|
51
|
+
const parsed = new URL(url);
|
|
52
|
+
const protocol = parsed.protocol.toLowerCase();
|
|
53
|
+
if (protocol !== 'http:' && protocol !== 'https:' && protocol !== 'volt:') {
|
|
54
|
+
throw new Error(`Unsupported URL protocol "${protocol}". Allowed protocols are http:, https:, and volt:.`);
|
|
55
|
+
}
|
|
56
|
+
this.loadedUrl = parsed.toString();
|
|
57
|
+
}
|
|
58
|
+
loadFile(filePath) {
|
|
59
|
+
this.assertNotDestroyed();
|
|
60
|
+
this.loadedUrl = pathToFileURL(filePath).href;
|
|
61
|
+
}
|
|
62
|
+
getURL() {
|
|
63
|
+
return this.loadedUrl;
|
|
64
|
+
}
|
|
65
|
+
setTitle(title) {
|
|
66
|
+
this.assertNotDestroyed();
|
|
67
|
+
this.options.title = title;
|
|
68
|
+
}
|
|
69
|
+
getTitle() {
|
|
70
|
+
return this.options.title;
|
|
71
|
+
}
|
|
72
|
+
setSize(width, height) {
|
|
73
|
+
this.assertNotDestroyed();
|
|
74
|
+
this.options.width = width;
|
|
75
|
+
this.options.height = height;
|
|
76
|
+
this.emit('resize');
|
|
77
|
+
}
|
|
78
|
+
getSize() {
|
|
79
|
+
return [this.options.width, this.options.height];
|
|
80
|
+
}
|
|
81
|
+
setPosition(x, y) {
|
|
82
|
+
this.assertNotDestroyed();
|
|
83
|
+
this.options.x = x;
|
|
84
|
+
this.options.y = y;
|
|
85
|
+
this.emit('move');
|
|
86
|
+
}
|
|
87
|
+
getPosition() {
|
|
88
|
+
return [this.options.x ?? 0, this.options.y ?? 0];
|
|
89
|
+
}
|
|
90
|
+
setResizable(resizable) {
|
|
91
|
+
this.assertNotDestroyed();
|
|
92
|
+
this.options.resizable = resizable;
|
|
93
|
+
}
|
|
94
|
+
isResizable() {
|
|
95
|
+
return this.options.resizable;
|
|
96
|
+
}
|
|
97
|
+
setAlwaysOnTop(flag) {
|
|
98
|
+
this.assertNotDestroyed();
|
|
99
|
+
this.options.alwaysOnTop = flag;
|
|
100
|
+
}
|
|
101
|
+
isAlwaysOnTop() {
|
|
102
|
+
return this.options.alwaysOnTop ?? false;
|
|
103
|
+
}
|
|
104
|
+
maximize() {
|
|
105
|
+
this.dispatchWindowCommand('windowMaximize', 'maximize');
|
|
106
|
+
}
|
|
107
|
+
minimize() {
|
|
108
|
+
this.dispatchWindowCommand('windowMinimize', 'minimize');
|
|
109
|
+
}
|
|
110
|
+
restore() {
|
|
111
|
+
this.dispatchWindowCommand('windowRestore', 'restore');
|
|
112
|
+
}
|
|
113
|
+
show() {
|
|
114
|
+
this.assertNotDestroyed();
|
|
115
|
+
invokeNativeWindowCommand('windowShow', this.id);
|
|
116
|
+
}
|
|
117
|
+
focus() {
|
|
118
|
+
this.dispatchWindowCommand('windowFocus', 'focus');
|
|
119
|
+
}
|
|
120
|
+
close() {
|
|
121
|
+
this.assertNotDestroyed();
|
|
122
|
+
const event = createCloseEvent();
|
|
123
|
+
this.emit('close', event);
|
|
124
|
+
if (event.defaultPrevented) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const dispatchMode = invokeNativeWindowCommand('windowClose', this.id);
|
|
128
|
+
if (dispatchMode === 'runtime') {
|
|
129
|
+
this.scheduleNativeCloseFallback();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.destroy();
|
|
133
|
+
}
|
|
134
|
+
destroy() {
|
|
135
|
+
if (this.destroyed) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.clearNativeCloseFallback();
|
|
139
|
+
this.destroyed = true;
|
|
140
|
+
const noWindowsRemain = removeWindowFromRegistry(this);
|
|
141
|
+
if (noWindowsRemain) {
|
|
142
|
+
try {
|
|
143
|
+
getApp().emit('window-all-closed');
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// App may not be initialized in isolated tests or utility scripts.
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
this.emit('closed');
|
|
150
|
+
this.removeAllListeners();
|
|
151
|
+
}
|
|
152
|
+
isDestroyed() {
|
|
153
|
+
return this.destroyed;
|
|
154
|
+
}
|
|
155
|
+
getNativeConfig() {
|
|
156
|
+
return {
|
|
157
|
+
jsId: this.id,
|
|
158
|
+
window: {
|
|
159
|
+
title: this.options.title,
|
|
160
|
+
width: this.options.width,
|
|
161
|
+
height: this.options.height,
|
|
162
|
+
minWidth: this.options.minWidth,
|
|
163
|
+
minHeight: this.options.minHeight,
|
|
164
|
+
maxWidth: this.options.maxWidth,
|
|
165
|
+
maxHeight: this.options.maxHeight,
|
|
166
|
+
resizable: this.options.resizable,
|
|
167
|
+
decorations: this.options.decorations,
|
|
168
|
+
transparent: this.options.transparent,
|
|
169
|
+
alwaysOnTop: this.options.alwaysOnTop,
|
|
170
|
+
maximized: this.options.maximized,
|
|
171
|
+
x: this.options.x,
|
|
172
|
+
y: this.options.y,
|
|
173
|
+
},
|
|
174
|
+
url: this.loadedUrl,
|
|
175
|
+
devtools: this.options.devtools,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
dispatchWindowCommand(command, eventName) {
|
|
179
|
+
this.assertNotDestroyed();
|
|
180
|
+
invokeNativeWindowCommand(command, this.id);
|
|
181
|
+
if (eventName) {
|
|
182
|
+
this.emit(eventName);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
assertNotDestroyed() {
|
|
186
|
+
if (this.destroyed) {
|
|
187
|
+
throw new Error('Window has been destroyed');
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
scheduleNativeCloseFallback() {
|
|
191
|
+
this.clearNativeCloseFallback();
|
|
192
|
+
this.pendingCloseFallbackTimer = setTimeout(() => {
|
|
193
|
+
this.pendingCloseFallbackTimer = null;
|
|
194
|
+
if (!this.destroyed) {
|
|
195
|
+
this.destroy();
|
|
196
|
+
}
|
|
197
|
+
}, 1000);
|
|
198
|
+
if (typeof this.pendingCloseFallbackTimer.unref === 'function') {
|
|
199
|
+
this.pendingCloseFallbackTimer.unref();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
clearNativeCloseFallback() {
|
|
203
|
+
if (!this.pendingCloseFallbackTimer) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
clearTimeout(this.pendingCloseFallbackTimer);
|
|
207
|
+
this.pendingCloseFallbackTimer = null;
|
|
208
|
+
}
|
|
209
|
+
static getAllWindows() {
|
|
210
|
+
return getRegisteredWindows();
|
|
211
|
+
}
|
|
212
|
+
static getFocusedWindow() {
|
|
213
|
+
return getFocusedRegisteredWindow();
|
|
214
|
+
}
|
|
215
|
+
static fromId(id) {
|
|
216
|
+
return getRegisteredWindowById(id);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=browser-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-window.js","sourceRoot":"","sources":["../../src/window/browser-window.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface NativeWindowCommandBridge {
|
|
2
|
+
windowClose?(jsId: string): void;
|
|
3
|
+
windowShow?(jsId: string): void;
|
|
4
|
+
windowFocus?(jsId: string): void;
|
|
5
|
+
windowMaximize?(jsId: string): void;
|
|
6
|
+
windowMinimize?(jsId: string): void;
|
|
7
|
+
windowRestore?(jsId: string): void;
|
|
8
|
+
}
|
|
9
|
+
export type NativeWindowCommandName = keyof Required<NativeWindowCommandBridge>;
|
|
10
|
+
export type NativeDispatchMode = 'runtime' | 'direct' | 'none';
|
|
11
|
+
export declare function invokeNativeWindowCommand(command: NativeWindowCommandName, jsId: string): NativeDispatchMode;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=native-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-bridge.d.ts","sourceRoot":"","sources":["../../src/window/native-bridge.ts"],"names":[],"mappings":"AAUA,UAAU,yBAAyB;IACjC,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,MAAM,uBAAuB,GAAG,MAAM,QAAQ,CAAC,yBAAyB,CAAC,CAAC;AAChF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAuB/D,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,uBAAuB,EAChC,IAAI,EAAE,MAAM,GACX,kBAAkB,CAmBpB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { windowClose, windowFocus, windowMaximize, windowMinimize, windowRestore, windowShow, } from '@voltkit/volt-native';
|
|
2
|
+
import { getApp } from '../app.js';
|
|
3
|
+
const DIRECT_NATIVE_WINDOW_COMMANDS = {
|
|
4
|
+
windowClose,
|
|
5
|
+
windowShow,
|
|
6
|
+
windowFocus,
|
|
7
|
+
windowMaximize,
|
|
8
|
+
windowMinimize,
|
|
9
|
+
windowRestore,
|
|
10
|
+
};
|
|
11
|
+
function getNativeWindowCommandBridge() {
|
|
12
|
+
try {
|
|
13
|
+
const native = getApp().getNativeApp();
|
|
14
|
+
if (native && typeof native === 'object') {
|
|
15
|
+
return native;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Framework app may not be initialized in isolated tests and scripts.
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
export function invokeNativeWindowCommand(command, jsId) {
|
|
24
|
+
const runtimeBridge = getNativeWindowCommandBridge();
|
|
25
|
+
const runtimeCommand = runtimeBridge?.[command];
|
|
26
|
+
if (typeof runtimeCommand === 'function') {
|
|
27
|
+
try {
|
|
28
|
+
runtimeCommand.call(runtimeBridge, jsId);
|
|
29
|
+
return 'runtime';
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Fall back to direct native binding path below.
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
DIRECT_NATIVE_WINDOW_COMMANDS[command](jsId);
|
|
37
|
+
return 'direct';
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Runtime may be unavailable; JS-side state/events remain authoritative fallback.
|
|
41
|
+
return 'none';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=native-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-bridge.js","sourceRoot":"","sources":["../../src/window/native-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,WAAW,EACX,cAAc,EACd,cAAc,EACd,aAAa,EACb,UAAU,GACX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAcnC,MAAM,6BAA6B,GAAwC;IACzE,WAAW;IACX,UAAU;IACV,WAAW;IACX,cAAc;IACd,cAAc;IACd,aAAa;CACd,CAAC;AAEF,SAAS,4BAA4B;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,EAAsC,CAAC;QAC3E,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAgC,EAChC,IAAY;IAEZ,MAAM,aAAa,GAAG,4BAA4B,EAAE,CAAC;IACrD,MAAM,cAAc,GAAG,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,6BAA6B,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,kFAAkF;QAClF,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BrowserWindowRegistryEntry } from './types.js';
|
|
2
|
+
export declare function addWindowToRegistry(window: BrowserWindowRegistryEntry): void;
|
|
3
|
+
export declare function removeWindowFromRegistry(window: BrowserWindowRegistryEntry): boolean;
|
|
4
|
+
export declare function focusWindowInRegistry(window: BrowserWindowRegistryEntry): void;
|
|
5
|
+
export declare function blurWindowInRegistry(window: BrowserWindowRegistryEntry): void;
|
|
6
|
+
export declare function getRegisteredWindows<T extends BrowserWindowRegistryEntry>(): T[];
|
|
7
|
+
export declare function getFocusedRegisteredWindow<T extends BrowserWindowRegistryEntry>(): T | null;
|
|
8
|
+
export declare function getRegisteredWindowById<T extends BrowserWindowRegistryEntry>(id: string): T | undefined;
|
|
9
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/window/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAK7D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAE5E;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAMpF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAI9E;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,GAAG,IAAI,CAI7E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,0BAA0B,KAAK,CAAC,EAAE,CAEhF;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,0BAA0B,KAAK,CAAC,GAAG,IAAI,CAE3F;AAED,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,0BAA0B,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAEvG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const windows = new Map();
|
|
2
|
+
let focusedWindow = null;
|
|
3
|
+
export function addWindowToRegistry(window) {
|
|
4
|
+
windows.set(window.getId(), window);
|
|
5
|
+
}
|
|
6
|
+
export function removeWindowFromRegistry(window) {
|
|
7
|
+
windows.delete(window.getId());
|
|
8
|
+
if (focusedWindow === window) {
|
|
9
|
+
focusedWindow = null;
|
|
10
|
+
}
|
|
11
|
+
return windows.size === 0;
|
|
12
|
+
}
|
|
13
|
+
export function focusWindowInRegistry(window) {
|
|
14
|
+
if (!window.isDestroyed()) {
|
|
15
|
+
focusedWindow = window;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function blurWindowInRegistry(window) {
|
|
19
|
+
if (focusedWindow === window) {
|
|
20
|
+
focusedWindow = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function getRegisteredWindows() {
|
|
24
|
+
return Array.from(windows.values());
|
|
25
|
+
}
|
|
26
|
+
export function getFocusedRegisteredWindow() {
|
|
27
|
+
return focusedWindow;
|
|
28
|
+
}
|
|
29
|
+
export function getRegisteredWindowById(id) {
|
|
30
|
+
return windows.get(id);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/window/registry.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsC,CAAC;AAC9D,IAAI,aAAa,GAAsC,IAAI,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAAC,MAAkC;IACpE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAkC;IACzE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/B,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QAC7B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAkC;IACtE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,aAAa,GAAG,MAAM,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAkC;IACrE,IAAI,aAAa,KAAK,MAAM,EAAE,CAAC;QAC7B,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAQ,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,aAAyB,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAuC,EAAU;IACtF,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAkB,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { WindowOptions } from '../types.js';
|
|
2
|
+
export type BrowserWindowMutableOptions = Required<Pick<WindowOptions, 'width' | 'height' | 'title' | 'resizable' | 'decorations'>> & WindowOptions;
|
|
3
|
+
export type BrowserWindowLocalEvent = 'focus' | 'maximize' | 'minimize' | 'restore';
|
|
4
|
+
export interface BrowserWindowEvents {
|
|
5
|
+
close: [event: BrowserWindowCloseEvent];
|
|
6
|
+
closed: [];
|
|
7
|
+
focus: [];
|
|
8
|
+
blur: [];
|
|
9
|
+
maximize: [];
|
|
10
|
+
minimize: [];
|
|
11
|
+
restore: [];
|
|
12
|
+
resize: [];
|
|
13
|
+
move: [];
|
|
14
|
+
}
|
|
15
|
+
export interface BrowserWindowCloseEvent {
|
|
16
|
+
readonly defaultPrevented: boolean;
|
|
17
|
+
preventDefault(): void;
|
|
18
|
+
}
|
|
19
|
+
export interface BrowserWindowRegistryEntry {
|
|
20
|
+
getId(): string;
|
|
21
|
+
isDestroyed(): boolean;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/window/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAChD,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,aAAa,CAAC,CAChF,GAAG,aAAa,CAAC;AAElB,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;IACxC,MAAM,EAAE,EAAE,CAAC;IACX,KAAK,EAAE,EAAE,CAAC;IACV,IAAI,EAAE,EAAE,CAAC;IACT,QAAQ,EAAE,EAAE,CAAC;IACb,QAAQ,EAAE,EAAE,CAAC;IACb,OAAO,EAAE,EAAE,CAAC;IACZ,MAAM,EAAE,EAAE,CAAC;IACX,IAAI,EAAE,EAAE,CAAC;CACV;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,cAAc,IAAI,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,IAAI,MAAM,CAAC;IAChB,WAAW,IAAI,OAAO,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/window/types.ts"],"names":[],"mappings":""}
|
package/dist/window.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window.d.ts","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/window.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"window.js","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC"}
|