@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,4 @@
1
+ import type { AppBackend } from '@flighthq/types';
2
+ import type { ElectronApi } from './electronModule';
3
+ export declare function createElectronAppBackend(electron: ElectronApi): AppBackend;
4
+ //# sourceMappingURL=electronApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronApp.d.ts","sourceRoot":"","sources":["../src/electronApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA+C,MAAM,iBAAiB,CAAC;AAE/F,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AAM7E,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,GAAG,UAAU,CA4J1E"}
@@ -0,0 +1,184 @@
1
+ // Maps Flight's AppBackend onto Electron's `app` module (plus `app.dock` on macOs). Dock-only
2
+ // operations no-op or return -1 where there is no dock. Subscribe methods wire an electron event
3
+ // listener and return an unsubscribe that removes that exact handler; the wrapper adapts Electron's
4
+ // (event, ...) argument shape to Flight's listener signature.
5
+ export function createElectronAppBackend(electron) {
6
+ const app = electron.app;
7
+ return {
8
+ addRecentDocument(path) {
9
+ app.addRecentDocument(path);
10
+ },
11
+ bounceDock() {
12
+ return app.dock?.bounce() ?? -1;
13
+ },
14
+ cancelAttention(id) {
15
+ // App-level attention is a macOS dock bounce; cancel it by request id.
16
+ app.dock?.cancelBounce(id);
17
+ },
18
+ cancelDockBounce(id) {
19
+ app.dock?.cancelBounce(id);
20
+ },
21
+ clearRecentDocuments() {
22
+ app.clearRecentDocuments();
23
+ },
24
+ focus() {
25
+ app.focus();
26
+ },
27
+ getAppDirectoryPath(kind) {
28
+ return app.getPath(toElectronPathName(kind));
29
+ },
30
+ getAppPath() {
31
+ return app.getAppPath();
32
+ },
33
+ getCommandLine() {
34
+ // Electron exposes no command-line accessor on `app` (it lives on process.argv, outside this
35
+ // dependency-free facade); report the empty sentinel rather than reaching into Node.
36
+ return [];
37
+ },
38
+ getExecutablePath() {
39
+ return app.getPath('exe');
40
+ },
41
+ getLocale() {
42
+ return app.getLocale();
43
+ },
44
+ getLoginItem() {
45
+ const settings = app.getLoginItemSettings();
46
+ const out = {
47
+ openAtLogin: settings.openAtLogin,
48
+ openAsHidden: settings.openAsHidden,
49
+ path: '',
50
+ args: [],
51
+ };
52
+ return out;
53
+ },
54
+ getName() {
55
+ return app.getName();
56
+ },
57
+ getPreferredSystemLanguages() {
58
+ return app.getPreferredSystemLanguages();
59
+ },
60
+ getSystemLocale() {
61
+ return app.getSystemLocale();
62
+ },
63
+ getVersion() {
64
+ return app.getVersion();
65
+ },
66
+ hasSingleInstanceLock() {
67
+ return app.hasSingleInstanceLock();
68
+ },
69
+ hideApp() {
70
+ app.hide();
71
+ return true;
72
+ },
73
+ isAppHidden() {
74
+ return app.isHidden();
75
+ },
76
+ quit() {
77
+ app.quit();
78
+ },
79
+ relaunch() {
80
+ app.relaunch();
81
+ },
82
+ releaseSingleInstanceLock() {
83
+ app.releaseSingleInstanceLock();
84
+ },
85
+ requestAttention(_critical) {
86
+ // App-level attention maps to a dock bounce on macOS; returns the bounce id (or -1 with no dock).
87
+ return app.dock?.bounce(_critical ? 'critical' : 'informational') ?? -1;
88
+ },
89
+ requestSingleInstanceLock() {
90
+ return app.requestSingleInstanceLock();
91
+ },
92
+ setActivationPolicy(policy) {
93
+ app.setActivationPolicy(policy);
94
+ },
95
+ setBadgeCount(count) {
96
+ return app.setBadgeCount(count);
97
+ },
98
+ setDockBadge(text) {
99
+ app.dock?.setBadge(text);
100
+ },
101
+ setDockMenu(items) {
102
+ if (!app.dock)
103
+ return;
104
+ app.dock.setMenu(electron.Menu.buildFromTemplate(items.map(toMenuItemOptions)));
105
+ },
106
+ setLoginItem(settings) {
107
+ app.setLoginItemSettings({
108
+ openAtLogin: settings.openAtLogin,
109
+ openAsHidden: settings.openAsHidden,
110
+ path: settings.path,
111
+ args: settings.args ? [...settings.args] : undefined,
112
+ });
113
+ return true;
114
+ },
115
+ setName(name) {
116
+ app.setName(name);
117
+ return true;
118
+ },
119
+ setUserModelId(id) {
120
+ app.setAppUserModelId(id);
121
+ return true;
122
+ },
123
+ showApp() {
124
+ app.show();
125
+ return true;
126
+ },
127
+ subscribeActivate(listener) {
128
+ app.on('activate', listener);
129
+ return () => app.removeListener('activate', listener);
130
+ },
131
+ subscribeAllWindowsClosed(listener) {
132
+ app.on('window-all-closed', listener);
133
+ return () => app.removeListener('window-all-closed', listener);
134
+ },
135
+ subscribeOpenFile(listener) {
136
+ // Electron passes (event, path); Flight wants just the path.
137
+ const handler = (...args) => listener(String(args[1] ?? ''));
138
+ app.on('open-file', handler);
139
+ return () => app.removeListener('open-file', handler);
140
+ },
141
+ subscribeQuitRequest(listener) {
142
+ // Electron's 'before-quit' passes (event); event.preventDefault() vetoes the quit, so the host-
143
+ // cancel callback Flight hands the listener calls preventDefault on that event.
144
+ const handler = (...args) => {
145
+ const event = args[0];
146
+ listener(() => event?.preventDefault?.());
147
+ };
148
+ app.on('before-quit', handler);
149
+ return () => app.removeListener('before-quit', handler);
150
+ },
151
+ subscribeReady(listener) {
152
+ app.on('ready', listener);
153
+ return () => app.removeListener('ready', listener);
154
+ },
155
+ subscribeSecondInstance(listener) {
156
+ // Electron passes (event, argv, cwd); Flight wants just argv.
157
+ const handler = (...args) => listener(args[1] ?? []);
158
+ app.on('second-instance', handler);
159
+ return () => app.removeListener('second-instance', handler);
160
+ },
161
+ };
162
+ }
163
+ function toElectronPathName(kind) {
164
+ if (kind === 'logs')
165
+ return 'logs';
166
+ if (kind === 'crashDumps')
167
+ return 'crashDumps';
168
+ return 'userData';
169
+ }
170
+ function toMenuItemOptions(item) {
171
+ const out = {
172
+ id: item.id,
173
+ label: item.label,
174
+ type: item.type,
175
+ role: item.role,
176
+ accelerator: item.accelerator,
177
+ enabled: item.enabled,
178
+ checked: item.checked,
179
+ };
180
+ if (item.submenu)
181
+ out.submenu = item.submenu.map(toMenuItemOptions);
182
+ return out;
183
+ }
184
+ //# sourceMappingURL=electronApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronApp.js","sourceRoot":"","sources":["../src/electronApp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ClipboardBackend } from '@flighthq/types';
2
+ import type { ElectronApi } from './electronModule';
3
+ export declare function createElectronClipboardBackend(electron: ElectronApi): ClipboardBackend;
4
+ //# sourceMappingURL=electronClipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronClipboard.d.ts","sourceRoot":"","sources":["../src/electronClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAqB,MAAM,iBAAiB,CAAC;AAE3E,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,kBAAkB,CAAC;AAK3E,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,WAAW,GAAG,gBAAgB,CA6KtF"}
@@ -0,0 +1,211 @@
1
+ // Maps Flight's ClipboardBackend onto Electron's synchronous clipboard module, adapting to the
2
+ // async Promise contract. Images cross the seam as data URLs (Flight's convention), converted via
3
+ // nativeImage. Reads resolve to sentinels ('' / null / false) on failure rather than throwing.
4
+ export function createElectronClipboardBackend(electron) {
5
+ const cb = electron.clipboard;
6
+ return {
7
+ async readText() {
8
+ try {
9
+ return cb.readText();
10
+ }
11
+ catch {
12
+ return '';
13
+ }
14
+ },
15
+ async writeText(text) {
16
+ try {
17
+ cb.writeText(text);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ },
24
+ async readHtml() {
25
+ try {
26
+ return cb.readHtml();
27
+ }
28
+ catch {
29
+ return '';
30
+ }
31
+ },
32
+ async writeHtml(html) {
33
+ try {
34
+ cb.writeHtml(html);
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ },
41
+ async hasText() {
42
+ try {
43
+ return cb.readText().length > 0;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ },
49
+ async readImage() {
50
+ try {
51
+ const image = cb.readImage();
52
+ return image.isEmpty() ? '' : image.toDataUrl();
53
+ }
54
+ catch {
55
+ return '';
56
+ }
57
+ },
58
+ async writeImage(dataUrl) {
59
+ try {
60
+ cb.writeImage(electron.nativeImage.createFromDataUrl(dataUrl));
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ },
67
+ async hasImage() {
68
+ try {
69
+ return !cb.readImage().isEmpty();
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ },
75
+ async readRTF() {
76
+ try {
77
+ return cb.readRTF();
78
+ }
79
+ catch {
80
+ return '';
81
+ }
82
+ },
83
+ async writeRTF(rtf) {
84
+ try {
85
+ cb.writeRTF(rtf);
86
+ return true;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ },
92
+ async readBookmark() {
93
+ try {
94
+ const bookmark = cb.readBookmark();
95
+ if (bookmark.title === '' && bookmark.url === '')
96
+ return null;
97
+ const out = { title: bookmark.title, url: bookmark.url };
98
+ return out;
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ },
104
+ async writeBookmark(title, url) {
105
+ try {
106
+ cb.writeBookmark(title, url);
107
+ return true;
108
+ }
109
+ catch {
110
+ return false;
111
+ }
112
+ },
113
+ async readFormat(format) {
114
+ try {
115
+ return cb.read(format);
116
+ }
117
+ catch {
118
+ return '';
119
+ }
120
+ },
121
+ async writeFormat(format, data) {
122
+ try {
123
+ const payload = {};
124
+ payload[formatKey(format)] = data;
125
+ cb.write(payload);
126
+ return true;
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ },
132
+ async hasFormat(format) {
133
+ try {
134
+ return cb.has(format);
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ },
140
+ async getFormats() {
141
+ try {
142
+ return cb.availableFormats();
143
+ }
144
+ catch {
145
+ return [];
146
+ }
147
+ },
148
+ async readItems(formats) {
149
+ const out = {};
150
+ for (const format of formats) {
151
+ try {
152
+ if (cb.has(format))
153
+ out[format] = cb.read(format);
154
+ }
155
+ catch {
156
+ /* skip a format that cannot be read */
157
+ }
158
+ }
159
+ return out;
160
+ },
161
+ async writeItems(items) {
162
+ try {
163
+ const data = {};
164
+ for (const item of items)
165
+ data[formatKey(item.format)] = item.data;
166
+ cb.write(data);
167
+ return true;
168
+ }
169
+ catch {
170
+ return false;
171
+ }
172
+ },
173
+ async readFiles() {
174
+ // Electron's clipboard has no first-class file-list flavor; report none.
175
+ return [];
176
+ },
177
+ async writeFiles() {
178
+ // Electron's clipboard has no first-class file-list flavor; report unsupported.
179
+ return false;
180
+ },
181
+ getChangeCount() {
182
+ // Electron does not expose a clipboard change counter; -1 sentinel per the contract.
183
+ return -1;
184
+ },
185
+ subscribeClipboardChange() {
186
+ // Electron emits no clipboard-change event; inert unsubscribe.
187
+ return () => { };
188
+ },
189
+ async clear() {
190
+ try {
191
+ cb.clear();
192
+ return true;
193
+ }
194
+ catch {
195
+ return false;
196
+ }
197
+ },
198
+ };
199
+ }
200
+ // Maps a MIME/flavor string to the keyed field Electron's clipboard.write accepts. Unknown flavors
201
+ // fall back to the plain-text slot.
202
+ function formatKey(format) {
203
+ if (format === 'text/html' || format === 'html')
204
+ return 'html';
205
+ if (format === 'text/rtf' || format === 'application/rtf' || format === 'rtf')
206
+ return 'rtf';
207
+ if (format === 'bookmark')
208
+ return 'bookmark';
209
+ return 'text';
210
+ }
211
+ //# sourceMappingURL=electronClipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronClipboard.js","sourceRoot":"","sources":["../src/electronClipboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DialogBackend } from '@flighthq/types';
2
+ import type { ElectronApi } from './electronModule';
3
+ export declare function createElectronDialogBackend(electron: ElectronApi): DialogBackend;
4
+ //# sourceMappingURL=electronDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronDialog.d.ts","sourceRoot":"","sources":["../src/electronDialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,iBAAiB,CAAC;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,WAAW,GAAG,aAAa,CAoEhF"}
@@ -0,0 +1,85 @@
1
+ // Maps Flight's DialogBackend onto Electron's main-process dialog module. Open/save dialogs resolve
2
+ // to sentinels ([] / null) on cancel rather than throwing, matching the backend contract. Native paths
3
+ // are wrapped as FileDialogHandles (path populated, since Electron exposes real host paths). The
4
+ // modal-parent window is not threaded through here, so dialogs are application-modal (window undefined).
5
+ export function createElectronDialogBackend(electron) {
6
+ const dialog = electron.dialog;
7
+ return {
8
+ async openFile(options) {
9
+ const properties = ['openFile'];
10
+ if (options.multiple)
11
+ properties.push('multiSelections');
12
+ if (options.directory)
13
+ properties.push('openDirectory');
14
+ const r = await dialog.showOpenDialog(undefined, {
15
+ title: options.title,
16
+ defaultPath: options.defaultPath,
17
+ filters: options.filters,
18
+ properties,
19
+ });
20
+ const kind = options.directory ? 'Directory' : 'File';
21
+ return r.canceled ? [] : r.filePaths.map((path) => toFileHandle(path, kind));
22
+ },
23
+ async openDirectory(options) {
24
+ const properties = ['openDirectory'];
25
+ if (options.multiple)
26
+ properties.push('multiSelections');
27
+ const r = await dialog.showOpenDialog(undefined, {
28
+ title: options.title,
29
+ properties,
30
+ });
31
+ return r.canceled ? [] : r.filePaths.map((path) => toFileHandle(path, 'Directory'));
32
+ },
33
+ async saveFile(options) {
34
+ const r = await dialog.showSaveDialog(undefined, {
35
+ title: options.title,
36
+ defaultPath: options.defaultPath,
37
+ filters: options.filters,
38
+ });
39
+ return r.canceled || !r.filePath ? null : toFileHandle(r.filePath, 'File');
40
+ },
41
+ async message(options) {
42
+ const r = await dialog.showMessageBox(undefined, {
43
+ type: options.kind,
44
+ title: options.title,
45
+ message: options.message,
46
+ detail: options.detail,
47
+ buttons: options.buttons,
48
+ defaultId: options.defaultId,
49
+ cancelId: options.cancelId,
50
+ checkboxLabel: options.checkboxLabel,
51
+ checkboxChecked: options.checkboxChecked,
52
+ });
53
+ return {
54
+ buttonIndex: r.response,
55
+ cancelled: options.cancelId !== undefined && r.response === options.cancelId,
56
+ checkboxChecked: r.checkboxChecked,
57
+ };
58
+ },
59
+ async confirm(options) {
60
+ const r = await dialog.showMessageBox(undefined, {
61
+ type: options.kind,
62
+ title: options.title,
63
+ message: options.message,
64
+ detail: options.detail,
65
+ buttons: ['OK', 'Cancel'],
66
+ defaultId: 0,
67
+ cancelId: 1,
68
+ });
69
+ return r.response === 0;
70
+ },
71
+ prompt() {
72
+ // Electron has no native text-input dialog; report unsupported via the null sentinel.
73
+ return Promise.resolve(null);
74
+ },
75
+ };
76
+ }
77
+ function toFileHandle(path, kind) {
78
+ return { kind, name: basename(path), path };
79
+ }
80
+ function basename(path) {
81
+ const normalized = path.replace(/[/\\]+$/, '');
82
+ const index = Math.max(normalized.lastIndexOf('/'), normalized.lastIndexOf('\\'));
83
+ return index >= 0 ? normalized.slice(index + 1) : normalized;
84
+ }
85
+ //# sourceMappingURL=electronDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronDialog.js","sourceRoot":"","sources":["../src/electronDialog.ts"],"names":[],"mappings":"AAIA,oGAAoG;AACpG,uGAAuG;AACvG,iGAAiG;AACjG,yGAAyG;AACzG,MAAM,UAAU,2BAA2B,CAAC,QAAqB;IAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,OAAO;YACpB,MAAM,UAAU,GAAa,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,OAAO,CAAC,QAAQ;gBAAE,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzD,IAAI,OAAO,CAAC,SAAS;gBAAE,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE;gBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU;aACX,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;YACtD,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,OAAO;YACzB,MAAM,UAAU,GAAa,CAAC,eAAe,CAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,QAAQ;gBAAE,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzD,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE;gBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU;aACX,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,OAAO;YACpB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE;gBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE;gBAC/C,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,eAAe,EAAE,OAAO,CAAC,eAAe;aACzC,CAAC,CAAC;YACH,OAAO;gBACL,WAAW,EAAE,CAAC,CAAC,QAAQ;gBACvB,SAAS,EAAE,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;gBAC5E,eAAe,EAAE,CAAC,CAAC,eAAe;aACnC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE;gBAC/C,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;gBACzB,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,OAAO,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM;YACJ,sFAAsF;YACtF,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,IAA0B;IAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAClF,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { IpcBackend } from '@flighthq/types';
2
+ import type { ElectronApi } from './electronModule';
3
+ export declare function createElectronIpcBackend(electron: ElectronApi): IpcBackend;
4
+ //# sourceMappingURL=electronIpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronIpc.d.ts","sourceRoot":"","sources":["../src/electronIpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKpD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,GAAG,UAAU,CAgB1E"}
@@ -0,0 +1,21 @@
1
+ // Maps Flight's IpcBackend onto Electron's ipcMain. This is the main-process side: it can receive
2
+ // messages from renderers (subscribe) but cannot itself send or invoke without a webContents target,
3
+ // so send no-ops and invoke resolves to undefined — the same inert shape the web default uses.
4
+ export function createElectronIpcBackend(electron) {
5
+ const ipcMain = electron.ipcMain;
6
+ return {
7
+ send() {
8
+ // Main-to-renderer send needs a specific webContents; out of scope for this generic backend.
9
+ },
10
+ invoke() {
11
+ // The main side has no invoke target; resolve to the undefined sentinel.
12
+ return Promise.resolve(undefined);
13
+ },
14
+ subscribe(channel, listener) {
15
+ const handler = (_event, ...args) => listener(args);
16
+ ipcMain.on(channel, handler);
17
+ return () => ipcMain.removeListener(channel, handler);
18
+ },
19
+ };
20
+ }
21
+ //# sourceMappingURL=electronIpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronIpc.js","sourceRoot":"","sources":["../src/electronIpc.ts"],"names":[],"mappings":"AAIA,kGAAkG;AAClG,qGAAqG;AACrG,+FAA+F;AAC/F,MAAM,UAAU,wBAAwB,CAAC,QAAqB;IAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,OAAO;QACL,IAAI;YACF,6FAA6F;QAC/F,CAAC;QACD,MAAM;YACJ,yEAAyE;YACzE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,SAAS,CAAC,OAAO,EAAE,QAAQ;YACzB,MAAM,OAAO,GAAG,CAAC,MAAe,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { MenuBackend } from '@flighthq/types';
2
+ import type { ElectronApi } from './electronModule';
3
+ export declare function createElectronMenuBackend(electron: ElectronApi): MenuBackend;
4
+ //# sourceMappingURL=electronMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronMenu.d.ts","sourceRoot":"","sources":["../src/electronMenu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,iBAAiB,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,kBAAkB,CAAC;AAM7E,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,CA+B5E"}
@@ -0,0 +1,59 @@
1
+ // Maps Flight's MenuBackend onto Electron's Menu module. Flight menu items are plain templates with a
2
+ // stable `id`; Electron delivers selection through per-item `click` callbacks, so the seam funnels
3
+ // those clicks back through an explicit onSelect. The application menu's clicks go to the listener
4
+ // registered via subscribeSelect; context-menu clicks resolve the popup Promise with the clicked id.
5
+ export function createElectronMenuBackend(electron) {
6
+ // The single application-menu select listener, owned by this backend. setApplicationMenu wires it
7
+ // as onSelect; subscribeSelect sets it and returns an unsubscribe that clears it.
8
+ let selectListener = null;
9
+ return {
10
+ setApplicationMenu(items) {
11
+ electron.Menu.setApplicationMenu(electron.Menu.buildFromTemplate(toElectronTemplate(items, (id) => selectListener?.(id))));
12
+ return true;
13
+ },
14
+ popupContextMenu(items, x, y) {
15
+ // The Electron seam exposes no menu close event, so the Promise resolves on the first item
16
+ // click and never resolves to null from a dismissal — callers treat a non-resolving Promise as
17
+ // "still open". We resolve null only if popup throws.
18
+ return new Promise((resolve) => {
19
+ const menu = electron.Menu.buildFromTemplate(toElectronTemplate(items, (id) => resolve(id)));
20
+ try {
21
+ menu.popup({ x, y });
22
+ }
23
+ catch {
24
+ resolve(null);
25
+ }
26
+ });
27
+ },
28
+ subscribeSelect(listener) {
29
+ selectListener = listener;
30
+ return () => {
31
+ if (selectListener === listener)
32
+ selectListener = null;
33
+ };
34
+ },
35
+ };
36
+ }
37
+ // Recursively maps Flight menu templates to Electron menu options. A selectable leaf with an id gets a
38
+ // `click` that reports its id through onSelect; submenus recurse with the same onSelect.
39
+ function toElectronTemplate(items, onSelect) {
40
+ return items.map((item) => {
41
+ const options = {
42
+ id: item.id,
43
+ label: item.label,
44
+ type: item.type,
45
+ role: item.role,
46
+ accelerator: item.accelerator,
47
+ enabled: item.enabled,
48
+ checked: item.checked,
49
+ };
50
+ if (item.submenu) {
51
+ options.submenu = toElectronTemplate(item.submenu, onSelect);
52
+ }
53
+ else if (onSelect && item.id !== undefined) {
54
+ options.click = () => onSelect(item.id);
55
+ }
56
+ return options;
57
+ });
58
+ }
59
+ //# sourceMappingURL=electronMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electronMenu.js","sourceRoot":"","sources":["../src/electronMenu.ts"],"names":[],"mappings":"AAIA,sGAAsG;AACtG,mGAAmG;AACnG,mGAAmG;AACnG,qGAAqG;AACrG,MAAM,UAAU,yBAAyB,CAAC,QAAqB;IAC7D,kGAAkG;IAClG,kFAAkF;IAClF,IAAI,cAAc,GAAkC,IAAI,CAAC;IACzD,OAAO;QACL,kBAAkB,CAAC,KAAK;YACtB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAC9B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CACzF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,gBAAgB,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;YAC1B,2FAA2F;YAC3F,+FAA+F;YAC/F,sDAAsD;YACtD,OAAO,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;gBAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7F,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QACD,eAAe,CAAC,QAAQ;YACtB,cAAc,GAAG,QAAQ,CAAC;YAC1B,OAAO,GAAG,EAAE;gBACV,IAAI,cAAc,KAAK,QAAQ;oBAAE,cAAc,GAAG,IAAI,CAAC;YACzD,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,yFAAyF;AACzF,SAAS,kBAAkB,CACzB,KAAkC,EAClC,QAA+B;IAE/B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,MAAM,OAAO,GAA4B;YACvC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC/D,CAAC;aAAM,IAAI,QAAQ,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAG,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC"}