@flighthq/host-tauri 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 (64) hide show
  1. package/dist/index.d.ts +13 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +13 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/tauriApp.d.ts +4 -0
  6. package/dist/tauriApp.d.ts.map +1 -0
  7. package/dist/tauriApp.js +159 -0
  8. package/dist/tauriApp.js.map +1 -0
  9. package/dist/tauriClipboard.d.ts +4 -0
  10. package/dist/tauriClipboard.d.ts.map +1 -0
  11. package/dist/tauriClipboard.js +108 -0
  12. package/dist/tauriClipboard.js.map +1 -0
  13. package/dist/tauriDialog.d.ts +4 -0
  14. package/dist/tauriDialog.d.ts.map +1 -0
  15. package/dist/tauriDialog.js +83 -0
  16. package/dist/tauriDialog.js.map +1 -0
  17. package/dist/tauriMenu.d.ts +4 -0
  18. package/dist/tauriMenu.d.ts.map +1 -0
  19. package/dist/tauriMenu.js +68 -0
  20. package/dist/tauriMenu.js.map +1 -0
  21. package/dist/tauriModule.d.ts +213 -0
  22. package/dist/tauriModule.d.ts.map +1 -0
  23. package/dist/tauriModule.js +25 -0
  24. package/dist/tauriModule.js.map +1 -0
  25. package/dist/tauriNotification.d.ts +4 -0
  26. package/dist/tauriNotification.d.ts.map +1 -0
  27. package/dist/tauriNotification.js +102 -0
  28. package/dist/tauriNotification.js.map +1 -0
  29. package/dist/tauriPlatform.d.ts +4 -0
  30. package/dist/tauriPlatform.d.ts.map +1 -0
  31. package/dist/tauriPlatform.js +33 -0
  32. package/dist/tauriPlatform.js.map +1 -0
  33. package/dist/tauriRegister.d.ts +3 -0
  34. package/dist/tauriRegister.d.ts.map +1 -0
  35. package/dist/tauriRegister.js +44 -0
  36. package/dist/tauriRegister.js.map +1 -0
  37. package/dist/tauriShell.d.ts +4 -0
  38. package/dist/tauriShell.d.ts.map +1 -0
  39. package/dist/tauriShell.js +67 -0
  40. package/dist/tauriShell.js.map +1 -0
  41. package/dist/tauriShortcut.d.ts +4 -0
  42. package/dist/tauriShortcut.d.ts.map +1 -0
  43. package/dist/tauriShortcut.js +53 -0
  44. package/dist/tauriShortcut.js.map +1 -0
  45. package/dist/tauriTray.d.ts +4 -0
  46. package/dist/tauriTray.d.ts.map +1 -0
  47. package/dist/tauriTray.js +167 -0
  48. package/dist/tauriTray.js.map +1 -0
  49. package/dist/tauriWindow.d.ts +4 -0
  50. package/dist/tauriWindow.d.ts.map +1 -0
  51. package/dist/tauriWindow.js +166 -0
  52. package/dist/tauriWindow.js.map +1 -0
  53. package/package.json +48 -0
  54. package/src/tauriApp.test.ts +80 -0
  55. package/src/tauriClipboard.test.ts +69 -0
  56. package/src/tauriDialog.test.ts +83 -0
  57. package/src/tauriMenu.test.ts +129 -0
  58. package/src/tauriNotification.test.ts +59 -0
  59. package/src/tauriPlatform.test.ts +56 -0
  60. package/src/tauriRegister.test.ts +67 -0
  61. package/src/tauriShell.test.ts +63 -0
  62. package/src/tauriShortcut.test.ts +77 -0
  63. package/src/tauriTray.test.ts +123 -0
  64. package/src/tauriWindow.test.ts +144 -0
@@ -0,0 +1,13 @@
1
+ export * from './tauriApp';
2
+ export * from './tauriClipboard';
3
+ export * from './tauriDialog';
4
+ export * from './tauriMenu';
5
+ export * from './tauriModule';
6
+ export * from './tauriNotification';
7
+ export * from './tauriPlatform';
8
+ export * from './tauriRegister';
9
+ export * from './tauriShell';
10
+ export * from './tauriShortcut';
11
+ export * from './tauriTray';
12
+ export * from './tauriWindow';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export * from './tauriApp';
2
+ export * from './tauriClipboard';
3
+ export * from './tauriDialog';
4
+ export * from './tauriMenu';
5
+ export * from './tauriModule';
6
+ export * from './tauriNotification';
7
+ export * from './tauriPlatform';
8
+ export * from './tauriRegister';
9
+ export * from './tauriShell';
10
+ export * from './tauriShortcut';
11
+ export * from './tauriTray';
12
+ export * from './tauriWindow';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AppBackend } from '@flighthq/types';
2
+ import type { TauriApi } from './tauriModule';
3
+ export declare function createTauriAppBackend(tauri: TauriApi): AppBackend;
4
+ //# sourceMappingURL=tauriApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauriApp.d.ts","sourceRoot":"","sources":["../src/tauriApp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,iBAAiB,CAAC;AAEhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAY9C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CAmJjE"}
@@ -0,0 +1,159 @@
1
+ // Maps Flight's AppBackend onto Tauri's `@tauri-apps/api/app` (identity + hide/show) and
2
+ // `@tauri-apps/plugin-process` (quit/relaunch), with the locale sourced from `@tauri-apps/plugin-os`.
3
+ //
4
+ // Async→sync bridge: AppBackend's getName/getVersion are synchronous, while Tauri's are async, so the
5
+ // adapter prefetches both once at construction and the getters return the cached value — '' until the
6
+ // first probe resolves. Control methods (quit/relaunch/hide/show) return void or a boolean and simply
7
+ // fire the async Tauri call and forget. The remaining surface — recent documents, dock, single-instance
8
+ // locking, badge, attention, login item, and the lifecycle subscriptions — has no modeled Tauri call
9
+ // here and reports the contract sentinels (''/[]/false/-1/no-op/inert unsubscribe). Deep-link and
10
+ // single-instance events would come from `plugin-deep-link` / `plugin-single-instance`, left to the app.
11
+ export function createTauriAppBackend(tauri) {
12
+ const app = tauri.app;
13
+ const os = tauri.os;
14
+ const process = tauri.process;
15
+ // Sync getters over async Tauri: prefetch once, serve the cached value.
16
+ let cachedName = '';
17
+ let cachedVersion = '';
18
+ app
19
+ .getName()
20
+ .then((name) => {
21
+ cachedName = name;
22
+ })
23
+ .catch(() => {
24
+ /* leave '' */
25
+ });
26
+ app
27
+ .getVersion()
28
+ .then((version) => {
29
+ cachedVersion = version;
30
+ })
31
+ .catch(() => {
32
+ /* leave '' */
33
+ });
34
+ return {
35
+ addRecentDocument() {
36
+ // No Tauri recent-documents API.
37
+ },
38
+ bounceDock() {
39
+ return -1;
40
+ },
41
+ cancelAttention() {
42
+ // No attention request to cancel.
43
+ },
44
+ cancelDockBounce() {
45
+ // No dock bounce to cancel.
46
+ },
47
+ clearRecentDocuments() {
48
+ // No Tauri recent-documents API.
49
+ },
50
+ focus() {
51
+ // App-level focus is a window concern in Tauri; handled by the window backend, no-op here.
52
+ },
53
+ getAppDirectoryPath() {
54
+ // App-relative paths come from `@tauri-apps/api/path` (async); not bridged into this sync getter.
55
+ return '';
56
+ },
57
+ getAppPath() {
58
+ return '';
59
+ },
60
+ getCommandLine() {
61
+ return [];
62
+ },
63
+ getExecutablePath() {
64
+ return '';
65
+ },
66
+ getLocale() {
67
+ return os.locale() ?? '';
68
+ },
69
+ getLoginItem() {
70
+ const out = { openAtLogin: false, openAsHidden: false, path: '', args: [] };
71
+ return out;
72
+ },
73
+ getName() {
74
+ return cachedName;
75
+ },
76
+ getPreferredSystemLanguages() {
77
+ const locale = os.locale();
78
+ return locale ? [locale] : [];
79
+ },
80
+ getSystemLocale() {
81
+ return os.locale() ?? '';
82
+ },
83
+ getVersion() {
84
+ return cachedVersion;
85
+ },
86
+ hasSingleInstanceLock() {
87
+ return false;
88
+ },
89
+ hideApp() {
90
+ app.hide().catch(() => { });
91
+ return true;
92
+ },
93
+ isAppHidden() {
94
+ return false;
95
+ },
96
+ quit() {
97
+ process.exit(0).catch(() => { });
98
+ },
99
+ relaunch() {
100
+ process.relaunch().catch(() => { });
101
+ },
102
+ releaseSingleInstanceLock() {
103
+ // No single-instance lock held.
104
+ },
105
+ requestAttention() {
106
+ return -1;
107
+ },
108
+ requestSingleInstanceLock() {
109
+ // Single-instance is a `plugin-single-instance` concern, configured app-side; report held.
110
+ return true;
111
+ },
112
+ setActivationPolicy() {
113
+ // No modeled Tauri activation-policy call.
114
+ },
115
+ setBadgeCount() {
116
+ return false;
117
+ },
118
+ setDockBadge() {
119
+ // No modeled Tauri dock-badge call.
120
+ },
121
+ setDockMenu() {
122
+ // No modeled Tauri dock-menu call.
123
+ },
124
+ setLoginItem() {
125
+ // Login item is an autostart-plugin concern, not modeled here.
126
+ return false;
127
+ },
128
+ setName() {
129
+ // Tauri's app name is fixed at build time; report unsupported.
130
+ return false;
131
+ },
132
+ setUserModelId() {
133
+ return false;
134
+ },
135
+ showApp() {
136
+ app.show().catch(() => { });
137
+ return true;
138
+ },
139
+ subscribeActivate() {
140
+ return () => { };
141
+ },
142
+ subscribeAllWindowsClosed() {
143
+ return () => { };
144
+ },
145
+ subscribeOpenFile() {
146
+ return () => { };
147
+ },
148
+ subscribeQuitRequest() {
149
+ return () => { };
150
+ },
151
+ subscribeReady() {
152
+ return () => { };
153
+ },
154
+ subscribeSecondInstance() {
155
+ return () => { };
156
+ },
157
+ };
158
+ }
159
+ //# sourceMappingURL=tauriApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauriApp.js","sourceRoot":"","sources":["../src/tauriApp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ClipboardBackend } from '@flighthq/types';
2
+ import type { TauriApi } from './tauriModule';
3
+ export declare function createTauriClipboardBackend(tauri: TauriApi): ClipboardBackend;
4
+ //# sourceMappingURL=tauriClipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauriClipboard.d.ts","sourceRoot":"","sources":["../src/tauriClipboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAO9C,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,QAAQ,GAAG,gBAAgB,CAiG7E"}
@@ -0,0 +1,108 @@
1
+ // Maps Flight's ClipboardBackend onto Tauri's async `@tauri-apps/plugin-clipboard-manager`. Both sides
2
+ // are Promise-based, so text and clear map directly. Tauri's clipboard has no HTML/RTF/bookmark read,
3
+ // no arbitrary MIME flavors, no file list, no change counter, and crosses images as an `Image` object
4
+ // rather than a data URL — those methods therefore report the contract's sentinels ('' / false / null /
5
+ // [] / -1) rather than a fabricated result. Reads resolve to sentinels on failure instead of throwing.
6
+ export function createTauriClipboardBackend(tauri) {
7
+ const clipboard = tauri.clipboard;
8
+ return {
9
+ async readText() {
10
+ try {
11
+ return await clipboard.readText();
12
+ }
13
+ catch {
14
+ return '';
15
+ }
16
+ },
17
+ async writeText(text) {
18
+ try {
19
+ await clipboard.writeText(text);
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ },
26
+ async readHtml() {
27
+ // Tauri's clipboard exposes no HTML read; report the empty sentinel.
28
+ return '';
29
+ },
30
+ async writeHtml() {
31
+ // Tauri's clipboard exposes no HTML write; report unsupported.
32
+ return false;
33
+ },
34
+ async hasText() {
35
+ try {
36
+ return (await clipboard.readText()).length > 0;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ },
42
+ async readImage() {
43
+ // Tauri crosses clipboard images as an `Image` object, not a data URL; report none.
44
+ return '';
45
+ },
46
+ async writeImage() {
47
+ // Writing a data URL is not expressible through Tauri's `Image`-typed clipboard write here.
48
+ return false;
49
+ },
50
+ async hasImage() {
51
+ return false;
52
+ },
53
+ async readRTF() {
54
+ return '';
55
+ },
56
+ async writeRTF() {
57
+ return false;
58
+ },
59
+ async readBookmark() {
60
+ return null;
61
+ },
62
+ async writeBookmark() {
63
+ return false;
64
+ },
65
+ async readFormat() {
66
+ return '';
67
+ },
68
+ async writeFormat() {
69
+ return false;
70
+ },
71
+ async hasFormat() {
72
+ return false;
73
+ },
74
+ async getFormats() {
75
+ return [];
76
+ },
77
+ async readItems() {
78
+ return {};
79
+ },
80
+ async writeItems() {
81
+ return false;
82
+ },
83
+ async readFiles() {
84
+ return [];
85
+ },
86
+ async writeFiles() {
87
+ return false;
88
+ },
89
+ async clear() {
90
+ try {
91
+ await clipboard.clear();
92
+ return true;
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ },
98
+ getChangeCount() {
99
+ // Tauri exposes no clipboard change counter; -1 sentinel per the contract.
100
+ return -1;
101
+ },
102
+ subscribeClipboardChange() {
103
+ // Tauri emits no clipboard-change event; inert unsubscribe.
104
+ return () => { };
105
+ },
106
+ };
107
+ }
108
+ //# sourceMappingURL=tauriClipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauriClipboard.js","sourceRoot":"","sources":["../src/tauriClipboard.ts"],"names":[],"mappings":"AAIA,uGAAuG;AACvG,sGAAsG;AACtG,sGAAsG;AACtG,wGAAwG;AACxG,uGAAuG;AACvG,MAAM,UAAU,2BAA2B,CAAC,KAAe;IACzD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,OAAO;QACL,KAAK,CAAC,QAAQ;YACZ,IAAI,CAAC;gBACH,OAAO,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,IAAI;YAClB,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChC,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,qEAAqE;YACrE,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,SAAS;YACb,+DAA+D;YAC/D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,OAAO;YACX,IAAI,CAAC;gBACH,OAAO,CAAC,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACjD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,KAAK,CAAC,SAAS;YACb,oFAAoF;YACpF,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,UAAU;YACd,4FAA4F;YAC5F,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,OAAO;YACX,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,QAAQ;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,YAAY;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,aAAa;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,UAAU;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,WAAW;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,SAAS;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,UAAU;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,SAAS;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,UAAU;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,SAAS;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,CAAC,UAAU;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QACD,KAAK,CAAC,KAAK;YACT,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,cAAc;YACZ,2EAA2E;YAC3E,OAAO,CAAC,CAAC,CAAC;QACZ,CAAC;QACD,wBAAwB;YACtB,4DAA4D;YAC5D,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DialogBackend } from '@flighthq/types';
2
+ import type { TauriApi } from './tauriModule';
3
+ export declare function createTauriDialogBackend(tauri: TauriApi): DialogBackend;
4
+ //# sourceMappingURL=tauriDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauriDialog.d.ts","sourceRoot":"","sources":["../src/tauriDialog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAyD,MAAM,iBAAiB,CAAC;AAE5G,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,eAAe,CAAC;AAQjE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAiDvE"}
@@ -0,0 +1,83 @@
1
+ // Maps Flight's DialogBackend onto Tauri's async `@tauri-apps/plugin-dialog`. Both sides are
2
+ // Promise-based. Open/save resolve to sentinels ([] / null) on cancel. Tauri returns real host paths,
3
+ // so FileDialogHandles carry a populated `path`. Two contract gaps are handled honestly: Tauri's
4
+ // `message` is a single-button acknowledgement (it cannot report a multi-button choice), so `message`
5
+ // resolves buttonIndex 0 / not-cancelled; and Tauri has no text-input dialog, so `prompt` resolves the
6
+ // null sentinel. The modal parent window is not threaded through, so dialogs are application-modal.
7
+ export function createTauriDialogBackend(tauri) {
8
+ const dialog = tauri.dialog;
9
+ return {
10
+ async openFile(options) {
11
+ const result = await dialog.open({
12
+ title: options.title,
13
+ defaultPath: options.defaultPath,
14
+ multiple: options.multiple,
15
+ directory: options.directory,
16
+ filters: options.filters?.map(toTauriFilter),
17
+ });
18
+ const kind = options.directory ? 'Directory' : 'File';
19
+ return toHandles(result, kind);
20
+ },
21
+ async openDirectory(options) {
22
+ const result = await dialog.open({
23
+ title: options.title,
24
+ multiple: options.multiple,
25
+ directory: true,
26
+ });
27
+ return toHandles(result, 'Directory');
28
+ },
29
+ async saveFile(options) {
30
+ const path = await dialog.save({
31
+ title: options.title,
32
+ defaultPath: options.defaultPath,
33
+ filters: options.filters?.map(toTauriFilter),
34
+ });
35
+ return path === null ? null : toFileHandle(path, 'File');
36
+ },
37
+ async message(options) {
38
+ await dialog.message(options.message, {
39
+ title: options.title,
40
+ kind: toTauriMessageKind(options.kind),
41
+ });
42
+ // Tauri's message is a single-button acknowledgement; it reports no button choice or checkbox.
43
+ return { buttonIndex: 0, cancelled: false, checkboxChecked: false };
44
+ },
45
+ async confirm(options) {
46
+ return dialog.confirm(options.message, {
47
+ title: options.title,
48
+ kind: toTauriMessageKind(options.kind),
49
+ });
50
+ },
51
+ async prompt() {
52
+ // Tauri has no native text-input dialog; report unsupported via the null sentinel.
53
+ return null;
54
+ },
55
+ };
56
+ }
57
+ function toFileHandle(path, kind) {
58
+ return { kind, name: basename(path), path };
59
+ }
60
+ function toHandles(result, kind) {
61
+ if (result === null)
62
+ return [];
63
+ const paths = Array.isArray(result) ? result : [result];
64
+ return paths.map((path) => toFileHandle(path, kind));
65
+ }
66
+ function toTauriFilter(filter) {
67
+ return { name: filter.name, extensions: [...filter.extensions] };
68
+ }
69
+ // Tauri's message/confirm accept only info/warning/error; Flight's 'question' has no Tauri glyph, so it
70
+ // falls back to 'info'.
71
+ function toTauriMessageKind(kind) {
72
+ if (kind === 'warning')
73
+ return 'warning';
74
+ if (kind === 'error')
75
+ return 'error';
76
+ return 'info';
77
+ }
78
+ function basename(path) {
79
+ const normalized = path.replace(/[/\\]+$/, '');
80
+ const index = Math.max(normalized.lastIndexOf('/'), normalized.lastIndexOf('\\'));
81
+ return index >= 0 ? normalized.slice(index + 1) : normalized;
82
+ }
83
+ //# sourceMappingURL=tauriDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauriDialog.js","sourceRoot":"","sources":["../src/tauriDialog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MenuBackend } from '@flighthq/types';
2
+ import type { TauriApi } from './tauriModule';
3
+ export declare function createTauriMenuBackend(tauri: TauriApi): MenuBackend;
4
+ //# sourceMappingURL=tauriMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauriMenu.d.ts","sourceRoot":"","sources":["../src/tauriMenu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,iBAAiB,CAAC;AAErE,OAAO,KAAK,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAC;AASnE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,CA+BnE"}
@@ -0,0 +1,68 @@
1
+ // Maps Flight's MenuBackend onto Tauri's `@tauri-apps/api/menu`. Tauri builds menus through async
2
+ // static factories (`Menu.new`, `MenuItem.new`, `Submenu.new`, `PredefinedMenuItem.new`), so the sync
3
+ // `setApplicationMenu` kicks off an async build-then-`setAsAppMenu` and optimistically returns true.
4
+ // Selection is delivered by each item's Tauri `action` callback, funneled through the listener set by
5
+ // subscribeSelect (application menu) or resolving the popup Promise (context menu) — mirroring the
6
+ // electron seam. `popupContextMenu` resolves null only if the async build/popup throws; otherwise it
7
+ // resolves on the first item click (Tauri exposes no menu-dismiss event).
8
+ export function createTauriMenuBackend(tauri) {
9
+ const menuModule = tauri.menu;
10
+ // The single application-menu select listener, owned by this backend.
11
+ let selectListener = null;
12
+ return {
13
+ setApplicationMenu(items) {
14
+ void (async () => {
15
+ const built = await buildItems(menuModule, items, (id) => selectListener?.(id));
16
+ const menu = await menuModule.Menu.new({ items: built });
17
+ await menu.setAsAppMenu();
18
+ })().catch(() => {
19
+ /* build/install failed — the previous menu stays in place */
20
+ });
21
+ return true;
22
+ },
23
+ popupContextMenu(items, x, y) {
24
+ return new Promise((resolve) => {
25
+ void (async () => {
26
+ const built = await buildItems(menuModule, items, (id) => resolve(id));
27
+ const menu = await menuModule.Menu.new({ items: built });
28
+ await menu.popup(new tauri.window.LogicalPosition(x, y));
29
+ })().catch(() => resolve(null));
30
+ });
31
+ },
32
+ subscribeSelect(listener) {
33
+ selectListener = listener;
34
+ return () => {
35
+ if (selectListener === listener)
36
+ selectListener = null;
37
+ };
38
+ },
39
+ };
40
+ }
41
+ // Recursively builds Tauri menu item handles from Flight templates. Separators become a predefined
42
+ // item; submenus recurse; a selectable leaf with an id gets an `action` that reports its id through
43
+ // onSelect. Every factory is async, so items are built sequentially and collected.
44
+ async function buildItems(menuModule, items, onSelect) {
45
+ const built = [];
46
+ for (const item of items) {
47
+ built.push(await buildItem(menuModule, item, onSelect));
48
+ }
49
+ return built;
50
+ }
51
+ async function buildItem(menuModule, item, onSelect) {
52
+ if (item.type === 'separator') {
53
+ return menuModule.PredefinedMenuItem.new({ item: 'Separator' });
54
+ }
55
+ if (item.submenu) {
56
+ const children = await buildItems(menuModule, item.submenu, onSelect);
57
+ return menuModule.Submenu.new({ text: item.label, enabled: item.enabled, items: children });
58
+ }
59
+ const id = item.id;
60
+ return menuModule.MenuItem.new({
61
+ id,
62
+ text: item.label,
63
+ enabled: item.enabled,
64
+ accelerator: item.accelerator,
65
+ action: id !== undefined ? () => onSelect(id) : undefined,
66
+ });
67
+ }
68
+ //# sourceMappingURL=tauriMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tauriMenu.js","sourceRoot":"","sources":["../src/tauriMenu.ts"],"names":[],"mappings":"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"}