@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,217 @@
1
+ import { createApplicationWindow } from '@flighthq/application';
2
+ import { connectSignal } from '@flighthq/signals';
3
+
4
+ import type { ElectronApi, ElectronBrowserWindowOptions, ElectronRectangle } from './electronModule';
5
+ import {
6
+ createElectronWindowBackend,
7
+ getApplicationWindowForElectronId,
8
+ getElectronBrowserWindow,
9
+ getElectronWindowId,
10
+ } from './electronWindow';
11
+
12
+ interface FakeBrowserWindow {
13
+ id: number;
14
+ options: ElectronBrowserWindowOptions;
15
+ calls: { method: string; args: unknown[] }[];
16
+ bounds: ElectronRectangle;
17
+ minimized: boolean;
18
+ fire(event: string): void;
19
+ }
20
+
21
+ function fakeElectron(): { electron: ElectronApi; created: FakeBrowserWindow[] } {
22
+ const created: FakeBrowserWindow[] = [];
23
+ let nextId = 1;
24
+ class FakeWindow {
25
+ id = nextId++;
26
+ options: ElectronBrowserWindowOptions;
27
+ calls: { method: string; args: unknown[] }[] = [];
28
+ bounds: ElectronRectangle = { x: 0, y: 0, width: 0, height: 0 };
29
+ minimized = false;
30
+ listeners = new Map<string, (() => void)[]>();
31
+ constructor(options?: ElectronBrowserWindowOptions) {
32
+ this.options = options ?? {};
33
+ created.push(this as unknown as FakeBrowserWindow);
34
+ }
35
+ record(method: string, ...args: unknown[]) {
36
+ this.calls.push({ method, args });
37
+ }
38
+ setTitle(title: string) {
39
+ this.record('setTitle', title);
40
+ }
41
+ setPosition(x: number, y: number) {
42
+ this.record('setPosition', x, y);
43
+ }
44
+ setSize(width: number, height: number) {
45
+ this.record('setSize', width, height);
46
+ }
47
+ getBounds() {
48
+ return this.bounds;
49
+ }
50
+ minimize() {
51
+ this.record('minimize');
52
+ }
53
+ maximize() {
54
+ this.record('maximize');
55
+ }
56
+ unmaximize() {
57
+ this.record('unmaximize');
58
+ }
59
+ restore() {
60
+ this.record('restore');
61
+ }
62
+ isMinimized() {
63
+ return this.minimized;
64
+ }
65
+ isMaximized() {
66
+ return false;
67
+ }
68
+ focus() {
69
+ this.record('focus');
70
+ }
71
+ show() {
72
+ this.record('show');
73
+ }
74
+ hide() {
75
+ this.record('hide');
76
+ }
77
+ center() {
78
+ this.record('center');
79
+ }
80
+ setResizable(flag: boolean) {
81
+ this.record('setResizable', flag);
82
+ }
83
+ setAlwaysOnTop(flag: boolean) {
84
+ this.record('setAlwaysOnTop', flag);
85
+ }
86
+ setMinimumSize(width: number, height: number) {
87
+ this.record('setMinimumSize', width, height);
88
+ }
89
+ setMaximumSize(width: number, height: number) {
90
+ this.record('setMaximumSize', width, height);
91
+ }
92
+ setFullScreen(flag: boolean) {
93
+ this.record('setFullScreen', flag);
94
+ }
95
+ setIcon(icon: unknown) {
96
+ this.record('setIcon', icon);
97
+ }
98
+ setOpacity(opacity: number) {
99
+ this.record('setOpacity', opacity);
100
+ }
101
+ setProgressBar(progress: number) {
102
+ this.record('setProgressBar', progress);
103
+ }
104
+ flashFrame(flag: boolean) {
105
+ this.record('flashFrame', flag);
106
+ }
107
+ setSkipTaskbar(skip: boolean) {
108
+ this.record('setSkipTaskbar', skip);
109
+ }
110
+ setMenuBarVisibility(visible: boolean) {
111
+ this.record('setMenuBarVisibility', visible);
112
+ }
113
+ setParentWindow(parent: unknown) {
114
+ this.record('setParentWindow', parent);
115
+ }
116
+ close() {
117
+ this.record('close');
118
+ }
119
+ on(event: string, cb: () => void) {
120
+ const list = this.listeners.get(event) ?? [];
121
+ list.push(cb);
122
+ this.listeners.set(event, list);
123
+ }
124
+ fire(event: string) {
125
+ for (const cb of this.listeners.get(event) ?? []) cb();
126
+ }
127
+ }
128
+ const electron = { BrowserWindow: FakeWindow } as unknown as ElectronApi;
129
+ return { electron, created };
130
+ }
131
+
132
+ describe('createElectronWindowBackend', () => {
133
+ it('open creates a BrowserWindow and forwards commands to it', () => {
134
+ const { electron, created } = fakeElectron();
135
+ const backend = createElectronWindowBackend(electron);
136
+ const win = createApplicationWindow();
137
+ expect(backend.open(win, { title: 'Flight', width: 640, height: 480 })).toBe(true);
138
+ expect(created).toHaveLength(1);
139
+ expect(created[0].options.title).toBe('Flight');
140
+ backend.setTitle(win, 'Renamed');
141
+ expect(created[0].calls).toContainEqual({ method: 'setTitle', args: ['Renamed'] });
142
+ });
143
+
144
+ it('getBounds reads from the BrowserWindow into out', () => {
145
+ const { electron, created } = fakeElectron();
146
+ const backend = createElectronWindowBackend(electron);
147
+ const win = createApplicationWindow();
148
+ backend.open(win, {});
149
+ created[0].bounds = { x: 10, y: 20, width: 300, height: 400 };
150
+ const out = { x: 0, y: 0, width: 0, height: 0 };
151
+ const result = backend.getBounds(win, out);
152
+ expect(result).toBe(out);
153
+ expect(out).toEqual({ x: 10, y: 20, width: 300, height: 400 });
154
+ });
155
+
156
+ it('getBounds falls back to the entity when no window is mapped', () => {
157
+ const { electron } = fakeElectron();
158
+ const backend = createElectronWindowBackend(electron);
159
+ const win = createApplicationWindow();
160
+ win.x = 5;
161
+ win.y = 6;
162
+ win.width = 70;
163
+ win.height = 80;
164
+ const out = { x: 0, y: 0, width: 0, height: 0 };
165
+ backend.getBounds(win, out);
166
+ expect(out).toEqual({ x: 5, y: 6, width: 70, height: 80 });
167
+ });
168
+
169
+ it('forwards an OS minimize event to the entity and emits onMinimize', () => {
170
+ const { electron, created } = fakeElectron();
171
+ const backend = createElectronWindowBackend(electron);
172
+ const win = createApplicationWindow();
173
+ backend.open(win, {});
174
+ let emitted = false;
175
+ connectSignal(win.onMinimize, () => {
176
+ emitted = true;
177
+ });
178
+ created[0].fire('minimize');
179
+ expect(win.minimized).toBe(true);
180
+ expect(emitted).toBe(true);
181
+ });
182
+ });
183
+
184
+ describe('getApplicationWindowForElectronId', () => {
185
+ it('returns the ApplicationWindow for a known Electron id and null for an unknown one', () => {
186
+ const { electron, created } = fakeElectron();
187
+ const backend = createElectronWindowBackend(electron);
188
+ const win = createApplicationWindow();
189
+ backend.open(win, {});
190
+ const id = created[0].id;
191
+ expect(getApplicationWindowForElectronId(id)).toBe(win);
192
+ expect(getApplicationWindowForElectronId(9999)).toBeNull();
193
+ });
194
+ });
195
+
196
+ describe('getElectronBrowserWindow', () => {
197
+ it('returns the backing BrowserWindow after open and null before', () => {
198
+ const { electron, created } = fakeElectron();
199
+ const backend = createElectronWindowBackend(electron);
200
+ const win = createApplicationWindow();
201
+ expect(getElectronBrowserWindow(win)).toBeNull();
202
+ backend.open(win, {});
203
+ expect(getElectronBrowserWindow(win)).toBe(created[0]);
204
+ });
205
+ });
206
+
207
+ describe('getElectronWindowId', () => {
208
+ it('returns the numeric Electron window id after open and -1 before', () => {
209
+ const { electron, created } = fakeElectron();
210
+ const backend = createElectronWindowBackend(electron);
211
+ const win = createApplicationWindow();
212
+ expect(getElectronWindowId(win)).toBe(-1);
213
+ backend.open(win, {});
214
+ const expectedId = created[0].id;
215
+ expect(getElectronWindowId(win)).toBe(expectedId);
216
+ });
217
+ });