@flighthq/host-electron 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.
Files changed (94) hide show
  1. package/dist/electronApp.d.ts +4 -0
  2. package/dist/electronApp.d.ts.map +1 -0
  3. package/dist/electronApp.js +184 -0
  4. package/dist/electronApp.js.map +1 -0
  5. package/dist/electronClipboard.d.ts +4 -0
  6. package/dist/electronClipboard.d.ts.map +1 -0
  7. package/dist/electronClipboard.js +211 -0
  8. package/dist/electronClipboard.js.map +1 -0
  9. package/dist/electronDialog.d.ts +4 -0
  10. package/dist/electronDialog.d.ts.map +1 -0
  11. package/dist/electronDialog.js +85 -0
  12. package/dist/electronDialog.js.map +1 -0
  13. package/dist/electronIpc.d.ts +4 -0
  14. package/dist/electronIpc.d.ts.map +1 -0
  15. package/dist/electronIpc.js +21 -0
  16. package/dist/electronIpc.js.map +1 -0
  17. package/dist/electronMenu.d.ts +4 -0
  18. package/dist/electronMenu.d.ts.map +1 -0
  19. package/dist/electronMenu.js +59 -0
  20. package/dist/electronMenu.js.map +1 -0
  21. package/dist/electronModule.d.ts +368 -0
  22. package/dist/electronModule.d.ts.map +1 -0
  23. package/dist/electronModule.js +12 -0
  24. package/dist/electronModule.js.map +1 -0
  25. package/dist/electronNotification.d.ts +4 -0
  26. package/dist/electronNotification.d.ts.map +1 -0
  27. package/dist/electronNotification.js +134 -0
  28. package/dist/electronNotification.js.map +1 -0
  29. package/dist/electronPlatform.d.ts +4 -0
  30. package/dist/electronPlatform.d.ts.map +1 -0
  31. package/dist/electronPlatform.js +30 -0
  32. package/dist/electronPlatform.js.map +1 -0
  33. package/dist/electronPower.d.ts +4 -0
  34. package/dist/electronPower.d.ts.map +1 -0
  35. package/dist/electronPower.js +92 -0
  36. package/dist/electronPower.js.map +1 -0
  37. package/dist/electronProtocol.d.ts +4 -0
  38. package/dist/electronProtocol.d.ts.map +1 -0
  39. package/dist/electronProtocol.js +55 -0
  40. package/dist/electronProtocol.js.map +1 -0
  41. package/dist/electronRegister.d.ts +6 -0
  42. package/dist/electronRegister.d.ts.map +1 -0
  43. package/dist/electronRegister.js +62 -0
  44. package/dist/electronRegister.js.map +1 -0
  45. package/dist/electronScreen.d.ts +4 -0
  46. package/dist/electronScreen.d.ts.map +1 -0
  47. package/dist/electronScreen.js +68 -0
  48. package/dist/electronScreen.js.map +1 -0
  49. package/dist/electronShell.d.ts +4 -0
  50. package/dist/electronShell.d.ts.map +1 -0
  51. package/dist/electronShell.js +105 -0
  52. package/dist/electronShell.js.map +1 -0
  53. package/dist/electronShortcut.d.ts +4 -0
  54. package/dist/electronShortcut.d.ts.map +1 -0
  55. package/dist/electronShortcut.js +40 -0
  56. package/dist/electronShortcut.js.map +1 -0
  57. package/dist/electronStorage.d.ts +4 -0
  58. package/dist/electronStorage.d.ts.map +1 -0
  59. package/dist/electronStorage.js +75 -0
  60. package/dist/electronStorage.js.map +1 -0
  61. package/dist/electronTray.d.ts +4 -0
  62. package/dist/electronTray.d.ts.map +1 -0
  63. package/dist/electronTray.js +164 -0
  64. package/dist/electronTray.js.map +1 -0
  65. package/dist/electronUpdater.d.ts +4 -0
  66. package/dist/electronUpdater.d.ts.map +1 -0
  67. package/dist/electronUpdater.js +113 -0
  68. package/dist/electronUpdater.js.map +1 -0
  69. package/dist/electronWindow.d.ts +7 -0
  70. package/dist/electronWindow.d.ts.map +1 -0
  71. package/dist/electronWindow.js +417 -0
  72. package/dist/electronWindow.js.map +1 -0
  73. package/dist/index.d.ts +19 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +19 -0
  76. package/dist/index.js.map +1 -0
  77. package/package.json +54 -0
  78. package/src/electronApp.test.ts +141 -0
  79. package/src/electronClipboard.test.ts +86 -0
  80. package/src/electronDialog.test.ts +95 -0
  81. package/src/electronIpc.test.ts +47 -0
  82. package/src/electronMenu.test.ts +85 -0
  83. package/src/electronNotification.test.ts +97 -0
  84. package/src/electronPlatform.test.ts +28 -0
  85. package/src/electronPower.test.ts +110 -0
  86. package/src/electronProtocol.test.ts +63 -0
  87. package/src/electronRegister.test.ts +57 -0
  88. package/src/electronScreen.test.ts +92 -0
  89. package/src/electronShell.test.ts +67 -0
  90. package/src/electronShortcut.test.ts +56 -0
  91. package/src/electronStorage.test.ts +70 -0
  92. package/src/electronTray.test.ts +107 -0
  93. package/src/electronUpdater.test.ts +117 -0
  94. package/src/electronWindow.test.ts +217 -0
@@ -0,0 +1,417 @@
1
+ import { emitSignal } from '@flighthq/signals';
2
+ // Maps Flight's WindowBackend onto Electron's BrowserWindow, one BrowserWindow per ApplicationWindow.
3
+ // open() constructs the real OS window from WindowOptions and wires BrowserWindow OS events back to
4
+ // the entity: each native event mutates the matching ApplicationWindow field and emits its signal, so
5
+ // user-driven state changes (minimize, move, focus, …) flow through the same signals the command
6
+ // functions emit. Other methods look up the BrowserWindow and no-op when it is absent (already closed
7
+ // or never opened). Risky native calls are wrapped so a destroyed window cannot throw across the seam.
8
+ export function createElectronWindowBackend(electron) {
9
+ return {
10
+ open(win, options) {
11
+ const bw = new electron.BrowserWindow({
12
+ title: options.title,
13
+ x: options.x,
14
+ y: options.y,
15
+ width: options.width,
16
+ height: options.height,
17
+ resizable: options.resizable,
18
+ alwaysOnTop: options.alwaysOnTop,
19
+ fullscreen: options.fullscreen,
20
+ show: options.visible,
21
+ minWidth: options.minWidth,
22
+ minHeight: options.minHeight,
23
+ maxWidth: options.maxWidth,
24
+ maxHeight: options.maxHeight,
25
+ frame: options.frame,
26
+ transparent: options.transparent,
27
+ });
28
+ _windows.set(win, bw);
29
+ _windowsById.set(bw.id, win);
30
+ bw.on('move', () => {
31
+ const bounds = bw.getBounds();
32
+ win.x = bounds.x;
33
+ win.y = bounds.y;
34
+ emitSignal(win.onMove);
35
+ });
36
+ bw.on('resize', () => {
37
+ const bounds = bw.getBounds();
38
+ win.width = bounds.width;
39
+ win.height = bounds.height;
40
+ emitSignal(win.onResize);
41
+ });
42
+ bw.on('minimize', () => {
43
+ win.minimized = true;
44
+ emitSignal(win.onMinimize);
45
+ });
46
+ bw.on('maximize', () => {
47
+ win.maximized = true;
48
+ emitSignal(win.onMaximize);
49
+ });
50
+ const onUnmaximize = () => {
51
+ win.minimized = false;
52
+ win.maximized = false;
53
+ emitSignal(win.onRestore);
54
+ };
55
+ bw.on('unmaximize', onUnmaximize);
56
+ bw.on('restore', onUnmaximize);
57
+ bw.on('enter-full-screen', () => {
58
+ win.fullscreen = true;
59
+ emitSignal(win.onFullscreenChanged);
60
+ });
61
+ bw.on('leave-full-screen', () => {
62
+ win.fullscreen = false;
63
+ emitSignal(win.onFullscreenChanged);
64
+ });
65
+ bw.on('focus', () => {
66
+ win.focused = true;
67
+ emitSignal(win.onFocusIn);
68
+ });
69
+ bw.on('blur', () => {
70
+ win.focused = false;
71
+ emitSignal(win.onFocusOut);
72
+ });
73
+ bw.on('close', () => emitSignal(win.onClose));
74
+ return true;
75
+ },
76
+ close(win) {
77
+ const bw = _windows.get(win);
78
+ if (bw === undefined)
79
+ return;
80
+ try {
81
+ bw.close();
82
+ }
83
+ catch {
84
+ /* window already destroyed */
85
+ }
86
+ _windows.delete(win);
87
+ _windowsById.delete(bw.id);
88
+ },
89
+ setTitle(win, title) {
90
+ const bw = _windows.get(win);
91
+ if (bw === undefined)
92
+ return;
93
+ try {
94
+ bw.setTitle(title);
95
+ }
96
+ catch {
97
+ /* window already destroyed */
98
+ }
99
+ },
100
+ setPosition(win, x, y) {
101
+ const bw = _windows.get(win);
102
+ if (bw === undefined)
103
+ return;
104
+ try {
105
+ bw.setPosition(x, y);
106
+ }
107
+ catch {
108
+ /* window already destroyed */
109
+ }
110
+ },
111
+ setSize(win, width, height) {
112
+ const bw = _windows.get(win);
113
+ if (bw === undefined)
114
+ return;
115
+ try {
116
+ bw.setSize(width, height);
117
+ }
118
+ catch {
119
+ /* window already destroyed */
120
+ }
121
+ },
122
+ getBounds(win, out) {
123
+ const bw = _windows.get(win);
124
+ if (bw === undefined) {
125
+ out.x = win.x;
126
+ out.y = win.y;
127
+ out.width = win.width;
128
+ out.height = win.height;
129
+ return out;
130
+ }
131
+ try {
132
+ const bounds = bw.getBounds();
133
+ out.x = bounds.x;
134
+ out.y = bounds.y;
135
+ out.width = bounds.width;
136
+ out.height = bounds.height;
137
+ }
138
+ catch {
139
+ out.x = win.x;
140
+ out.y = win.y;
141
+ out.width = win.width;
142
+ out.height = win.height;
143
+ }
144
+ return out;
145
+ },
146
+ minimize(win) {
147
+ const bw = _windows.get(win);
148
+ if (bw === undefined)
149
+ return;
150
+ try {
151
+ bw.minimize();
152
+ }
153
+ catch {
154
+ /* window already destroyed */
155
+ }
156
+ },
157
+ maximize(win) {
158
+ const bw = _windows.get(win);
159
+ if (bw === undefined)
160
+ return;
161
+ try {
162
+ bw.maximize();
163
+ }
164
+ catch {
165
+ /* window already destroyed */
166
+ }
167
+ },
168
+ restore(win) {
169
+ const bw = _windows.get(win);
170
+ if (bw === undefined)
171
+ return;
172
+ try {
173
+ if (bw.isMinimized())
174
+ bw.restore();
175
+ else
176
+ bw.unmaximize();
177
+ }
178
+ catch {
179
+ /* window already destroyed */
180
+ }
181
+ },
182
+ focus(win) {
183
+ const bw = _windows.get(win);
184
+ if (bw === undefined)
185
+ return;
186
+ try {
187
+ bw.focus();
188
+ }
189
+ catch {
190
+ /* window already destroyed */
191
+ }
192
+ },
193
+ show(win) {
194
+ const bw = _windows.get(win);
195
+ if (bw === undefined)
196
+ return;
197
+ try {
198
+ bw.show();
199
+ }
200
+ catch {
201
+ /* window already destroyed */
202
+ }
203
+ },
204
+ hide(win) {
205
+ const bw = _windows.get(win);
206
+ if (bw === undefined)
207
+ return;
208
+ try {
209
+ bw.hide();
210
+ }
211
+ catch {
212
+ /* window already destroyed */
213
+ }
214
+ },
215
+ center(win) {
216
+ const bw = _windows.get(win);
217
+ if (bw === undefined)
218
+ return;
219
+ try {
220
+ bw.center();
221
+ }
222
+ catch {
223
+ /* window already destroyed */
224
+ }
225
+ },
226
+ setResizable(win, resizable) {
227
+ const bw = _windows.get(win);
228
+ if (bw === undefined)
229
+ return;
230
+ try {
231
+ bw.setResizable(resizable);
232
+ }
233
+ catch {
234
+ /* window already destroyed */
235
+ }
236
+ },
237
+ setAlwaysOnTop(win, alwaysOnTop) {
238
+ const bw = _windows.get(win);
239
+ if (bw === undefined)
240
+ return;
241
+ try {
242
+ bw.setAlwaysOnTop(alwaysOnTop);
243
+ }
244
+ catch {
245
+ /* window already destroyed */
246
+ }
247
+ },
248
+ setMinimumSize(win, width, height) {
249
+ const bw = _windows.get(win);
250
+ if (bw === undefined)
251
+ return;
252
+ try {
253
+ bw.setMinimumSize(width, height);
254
+ }
255
+ catch {
256
+ /* window already destroyed */
257
+ }
258
+ },
259
+ setMaximumSize(win, width, height) {
260
+ const bw = _windows.get(win);
261
+ if (bw === undefined)
262
+ return;
263
+ try {
264
+ bw.setMaximumSize(width, height);
265
+ }
266
+ catch {
267
+ /* window already destroyed */
268
+ }
269
+ },
270
+ setFullscreen(win, fullscreen) {
271
+ const bw = _windows.get(win);
272
+ if (bw === undefined)
273
+ return;
274
+ try {
275
+ bw.setFullScreen(fullscreen);
276
+ }
277
+ catch {
278
+ /* window already destroyed */
279
+ }
280
+ },
281
+ setIcon(win, icon) {
282
+ const bw = _windows.get(win);
283
+ if (bw === undefined)
284
+ return;
285
+ try {
286
+ bw.setIcon(icon);
287
+ }
288
+ catch {
289
+ /* window already destroyed */
290
+ }
291
+ },
292
+ setOpacity(win, opacity) {
293
+ const bw = _windows.get(win);
294
+ if (bw === undefined)
295
+ return;
296
+ try {
297
+ bw.setOpacity(opacity);
298
+ }
299
+ catch {
300
+ /* window already destroyed */
301
+ }
302
+ },
303
+ setSkipTaskbar(win, skip) {
304
+ const bw = _windows.get(win);
305
+ if (bw === undefined)
306
+ return;
307
+ try {
308
+ bw.setSkipTaskbar(skip);
309
+ }
310
+ catch {
311
+ /* window already destroyed */
312
+ }
313
+ },
314
+ setMenuBarVisible(win, visible) {
315
+ const bw = _windows.get(win);
316
+ if (bw === undefined)
317
+ return;
318
+ try {
319
+ bw.setMenuBarVisibility(visible);
320
+ }
321
+ catch {
322
+ /* window already destroyed */
323
+ }
324
+ },
325
+ setParent(win, parent) {
326
+ const bw = _windows.get(win);
327
+ if (bw === undefined)
328
+ return;
329
+ const parentBw = parent === null ? null : (_windows.get(parent) ?? null);
330
+ try {
331
+ bw.setParentWindow(parentBw);
332
+ }
333
+ catch {
334
+ /* window already destroyed */
335
+ }
336
+ },
337
+ setProgress(win, progress) {
338
+ const bw = _windows.get(win);
339
+ if (bw === undefined)
340
+ return;
341
+ try {
342
+ bw.setProgressBar(progress);
343
+ }
344
+ catch {
345
+ /* window already destroyed */
346
+ }
347
+ },
348
+ requestAttention(win, attention) {
349
+ const bw = _windows.get(win);
350
+ if (bw === undefined)
351
+ return;
352
+ try {
353
+ bw.flashFrame(attention);
354
+ }
355
+ catch {
356
+ /* window already destroyed */
357
+ }
358
+ },
359
+ setContentProtection(win, enabled) {
360
+ const bw = _windows.get(win);
361
+ if (bw === undefined)
362
+ return;
363
+ try {
364
+ bw.setContentProtection(enabled);
365
+ }
366
+ catch {
367
+ /* window already destroyed */
368
+ }
369
+ },
370
+ flashWindowFrame(win) {
371
+ const bw = _windows.get(win);
372
+ if (bw === undefined)
373
+ return;
374
+ try {
375
+ bw.flashFrame(true);
376
+ }
377
+ catch {
378
+ /* window already destroyed */
379
+ }
380
+ },
381
+ setHasShadow(win, hasShadow) {
382
+ const bw = _windows.get(win);
383
+ if (bw === undefined)
384
+ return;
385
+ try {
386
+ bw.setHasShadow(hasShadow);
387
+ }
388
+ catch {
389
+ /* window already destroyed */
390
+ }
391
+ },
392
+ };
393
+ }
394
+ // Returns the ApplicationWindow mapped to the given Electron BrowserWindow id, or null when unknown.
395
+ // Allows tray/menu/protocol handlers to resolve a native window id back into a Flight window entity.
396
+ export function getApplicationWindowForElectronId(id) {
397
+ return _windowsById.get(id) ?? null;
398
+ }
399
+ // The Electron BrowserWindow backing a Flight window opened via openWindow, or null if not (yet)
400
+ // opened. The escape hatch a host app needs to do Electron-specific things the seam doesn't cover —
401
+ // most importantly loadFile/loadURL to put content in the window. Host-adapter-only by design.
402
+ export function getElectronBrowserWindow(win) {
403
+ return _windows.get(win) ?? null;
404
+ }
405
+ // Returns the Electron BrowserWindow id for a Flight window, or -1 when the window is not mapped.
406
+ // Useful for tray/menu click handlers that receive a native window id and need to resolve back to an
407
+ // ApplicationWindow; pair with getApplicationWindowForElectronId.
408
+ export function getElectronWindowId(win) {
409
+ return _windows.get(win)?.id ?? -1;
410
+ }
411
+ // Side table mapping each Flight ApplicationWindow to its Electron BrowserWindow, kept off the public
412
+ // entity. Entries are removed on close so a stale BrowserWindow is never reused.
413
+ const _windows = new WeakMap();
414
+ // Reverse lookup by Electron BrowserWindow id for getApplicationWindowForElectronId. Maintained in
415
+ // lockstep with _windows; entries are removed on close as well.
416
+ const _windowsById = new Map();
417
+ //# sourceMappingURL=electronWindow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronWindow.js","sourceRoot":"","sources":["../src/electronWindow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export * from './electronApp';
2
+ export * from './electronClipboard';
3
+ export * from './electronDialog';
4
+ export * from './electronIpc';
5
+ export * from './electronMenu';
6
+ export * from './electronModule';
7
+ export * from './electronNotification';
8
+ export * from './electronPlatform';
9
+ export * from './electronPower';
10
+ export * from './electronProtocol';
11
+ export * from './electronRegister';
12
+ export * from './electronScreen';
13
+ export * from './electronShell';
14
+ export * from './electronShortcut';
15
+ export * from './electronStorage';
16
+ export * from './electronTray';
17
+ export * from './electronUpdater';
18
+ export * from './electronWindow';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ export * from './electronApp';
2
+ export * from './electronClipboard';
3
+ export * from './electronDialog';
4
+ export * from './electronIpc';
5
+ export * from './electronMenu';
6
+ export * from './electronModule';
7
+ export * from './electronNotification';
8
+ export * from './electronPlatform';
9
+ export * from './electronPower';
10
+ export * from './electronProtocol';
11
+ export * from './electronRegister';
12
+ export * from './electronScreen';
13
+ export * from './electronShell';
14
+ export * from './electronShortcut';
15
+ export * from './electronStorage';
16
+ export * from './electronTray';
17
+ export * from './electronUpdater';
18
+ export * from './electronWindow';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@flighthq/host-electron",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ }
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "src/**/*.test.ts",
16
+ "!dist/**/*.test.js",
17
+ "!dist/**/*.test.d.ts",
18
+ "!dist/**/*.test.js.map",
19
+ "!dist/**/*.test.d.ts.map"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc -b",
23
+ "clean": "tsc -b --clean",
24
+ "test": "vitest run --config vitest.config.ts",
25
+ "test:watch": "vitest --watch --config vitest.config.ts",
26
+ "prepack": "npm run clean && npm run clean:dist && npm run build",
27
+ "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
28
+ },
29
+ "dependencies": {
30
+ "@flighthq/app": "0.1.0",
31
+ "@flighthq/application": "0.1.0",
32
+ "@flighthq/clipboard": "0.1.0",
33
+ "@flighthq/dialog": "0.1.0",
34
+ "@flighthq/ipc": "0.1.0",
35
+ "@flighthq/menu": "0.1.0",
36
+ "@flighthq/notification": "0.1.0",
37
+ "@flighthq/platform": "0.1.0",
38
+ "@flighthq/power": "0.1.0",
39
+ "@flighthq/protocol": "0.1.0",
40
+ "@flighthq/screen": "0.1.0",
41
+ "@flighthq/shell": "0.1.0",
42
+ "@flighthq/shortcut": "0.1.0",
43
+ "@flighthq/signals": "0.1.0",
44
+ "@flighthq/storage": "0.1.0",
45
+ "@flighthq/tray": "0.1.0",
46
+ "@flighthq/types": "0.1.0",
47
+ "@flighthq/updater": "0.1.0"
48
+ },
49
+ "devDependencies": {
50
+ "typescript": "^5.3.0"
51
+ },
52
+ "description": "Electron host backend: registers Electron main-process implementations of Flight's window/app/dialog/clipboard/menu/tray/shortcut/screen/power/notification/shell/protocol/updater/ipc/storage seams",
53
+ "sideEffects": false
54
+ }
@@ -0,0 +1,141 @@
1
+ import { createElectronAppBackend } from './electronApp';
2
+ import type { ElectronApi, ElectronMenu, ElectronMenuItemOptions } from './electronModule';
3
+
4
+ function fakeElectron(): {
5
+ electron: ElectronApi;
6
+ listeners: Map<string, ((...args: unknown[]) => void)[]>;
7
+ dockMenuTemplate: ElectronMenuItemOptions[] | null;
8
+ badgeText: string | null;
9
+ } {
10
+ const listeners = new Map<string, ((...args: unknown[]) => void)[]>();
11
+ const box = { dockMenuTemplate: null as ElectronMenuItemOptions[] | null, badgeText: null as string | null };
12
+ const electron = {
13
+ app: {
14
+ getName: () => 'Flight',
15
+ getVersion: () => '1.2.3',
16
+ getLocale: () => 'en-US',
17
+ quit: () => {},
18
+ relaunch: () => {},
19
+ focus: () => {},
20
+ requestSingleInstanceLock: () => true,
21
+ releaseSingleInstanceLock: () => {},
22
+ hasSingleInstanceLock: () => true,
23
+ setBadgeCount: () => true,
24
+ on: (event: string, listener: (...args: unknown[]) => void) => {
25
+ const list = listeners.get(event) ?? [];
26
+ list.push(listener);
27
+ listeners.set(event, list);
28
+ },
29
+ removeListener: (event: string, listener: (...args: unknown[]) => void) => {
30
+ const list = listeners.get(event) ?? [];
31
+ listeners.set(
32
+ event,
33
+ list.filter((l) => l !== listener),
34
+ );
35
+ },
36
+ dock: {
37
+ bounce: () => 7,
38
+ cancelBounce: () => {},
39
+ setBadge: (text: string) => {
40
+ box.badgeText = text;
41
+ },
42
+ setMenu: () => {},
43
+ },
44
+ },
45
+ Menu: {
46
+ buildFromTemplate: (template: ElectronMenuItemOptions[]): ElectronMenu => {
47
+ box.dockMenuTemplate = template;
48
+ return {} as ElectronMenu;
49
+ },
50
+ },
51
+ } as unknown as ElectronApi;
52
+ return {
53
+ electron,
54
+ listeners,
55
+ get dockMenuTemplate() {
56
+ return box.dockMenuTemplate;
57
+ },
58
+ get badgeText() {
59
+ return box.badgeText;
60
+ },
61
+ };
62
+ }
63
+
64
+ describe('createElectronAppBackend', () => {
65
+ it('delegates identity and lifecycle to electron.app', () => {
66
+ const { electron } = fakeElectron();
67
+ const backend = createElectronAppBackend(electron);
68
+ expect(backend.getName()).toBe('Flight');
69
+ expect(backend.getVersion()).toBe('1.2.3');
70
+ expect(backend.getLocale()).toBe('en-US');
71
+ expect(backend.requestSingleInstanceLock()).toBe(true);
72
+ expect(backend.hasSingleInstanceLock()).toBe(true);
73
+ expect(backend.setBadgeCount(3)).toBe(true);
74
+ });
75
+
76
+ it('builds a dock menu from the item template', () => {
77
+ const fake = fakeElectron();
78
+ const backend = createElectronAppBackend(fake.electron);
79
+ backend.setDockMenu([{ id: 'a', label: 'A', submenu: [{ id: 'b', label: 'B' }] }]);
80
+ expect(fake.dockMenuTemplate).toEqual([
81
+ {
82
+ id: 'a',
83
+ label: 'A',
84
+ type: undefined,
85
+ role: undefined,
86
+ accelerator: undefined,
87
+ enabled: undefined,
88
+ checked: undefined,
89
+ submenu: [
90
+ {
91
+ id: 'b',
92
+ label: 'B',
93
+ type: undefined,
94
+ role: undefined,
95
+ accelerator: undefined,
96
+ enabled: undefined,
97
+ checked: undefined,
98
+ },
99
+ ],
100
+ },
101
+ ]);
102
+ });
103
+
104
+ it('drives dock badge and bounce, returning the bounce id', () => {
105
+ const fake = fakeElectron();
106
+ const backend = createElectronAppBackend(fake.electron);
107
+ backend.setDockBadge('5');
108
+ expect(fake.badgeText).toBe('5');
109
+ expect(backend.bounceDock()).toBe(7);
110
+ });
111
+
112
+ it('subscribes to activate and unsubscribes', () => {
113
+ const fake = fakeElectron();
114
+ const backend = createElectronAppBackend(fake.electron);
115
+ let count = 0;
116
+ const off = backend.subscribeActivate(() => {
117
+ count++;
118
+ });
119
+ for (const l of fake.listeners.get('activate') ?? []) l();
120
+ expect(count).toBe(1);
121
+ off();
122
+ expect(fake.listeners.get('activate')).toHaveLength(0);
123
+ });
124
+
125
+ it('adapts open-file and second-instance argument shapes', () => {
126
+ const fake = fakeElectron();
127
+ const backend = createElectronAppBackend(fake.electron);
128
+ let openedPath = '';
129
+ let argv: readonly string[] = [];
130
+ backend.subscribeOpenFile((path) => {
131
+ openedPath = path;
132
+ });
133
+ backend.subscribeSecondInstance((next) => {
134
+ argv = next;
135
+ });
136
+ for (const l of fake.listeners.get('open-file') ?? []) l({}, '/tmp/file.txt');
137
+ for (const l of fake.listeners.get('second-instance') ?? []) l({}, ['--flag'], '/cwd');
138
+ expect(openedPath).toBe('/tmp/file.txt');
139
+ expect(argv).toEqual(['--flag']);
140
+ });
141
+ });