heyvm 1.0.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 (112) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +621 -0
  3. package/bin/file-browser +0 -0
  4. package/bin/heyvm +0 -0
  5. package/bin/heyvm-core +0 -0
  6. package/bin/heyvm.js +61 -0
  7. package/core/README.md +51 -0
  8. package/core/cmd/heyvm-core/main.go +73 -0
  9. package/core/go.mod +25 -0
  10. package/core/go.sum +47 -0
  11. package/core/internal/auth/errors.go +29 -0
  12. package/core/internal/auth/password.go +187 -0
  13. package/core/internal/auth/provider.go +33 -0
  14. package/core/internal/auth/ssh_key.go +142 -0
  15. package/core/internal/config/config.go +111 -0
  16. package/core/internal/ipc/actions.go +738 -0
  17. package/core/internal/ipc/handler.go +281 -0
  18. package/core/internal/ipc/protocol.go +126 -0
  19. package/core/internal/sftp/errors.go +29 -0
  20. package/core/internal/sftp/manager.go +303 -0
  21. package/core/internal/sftp/types.go +30 -0
  22. package/core/internal/ssh/errors.go +23 -0
  23. package/core/internal/ssh/manager.go +226 -0
  24. package/core/internal/ssh/session.go +105 -0
  25. package/core/internal/vm/errors.go +35 -0
  26. package/core/internal/vm/models.go +84 -0
  27. package/core/internal/vm/registry.go +240 -0
  28. package/package.json +59 -0
  29. package/scripts/install.js +100 -0
  30. package/ui/README.md +43 -0
  31. package/ui/dist/App.d.ts +3 -0
  32. package/ui/dist/App.d.ts.map +1 -0
  33. package/ui/dist/App.js +142 -0
  34. package/ui/dist/App.js.map +1 -0
  35. package/ui/dist/components/ConfirmDialog.d.ts +9 -0
  36. package/ui/dist/components/ConfirmDialog.d.ts.map +1 -0
  37. package/ui/dist/components/ConfirmDialog.js +22 -0
  38. package/ui/dist/components/ConfirmDialog.js.map +1 -0
  39. package/ui/dist/components/ErrorMessage.d.ts +8 -0
  40. package/ui/dist/components/ErrorMessage.d.ts.map +1 -0
  41. package/ui/dist/components/ErrorMessage.js +10 -0
  42. package/ui/dist/components/ErrorMessage.js.map +1 -0
  43. package/ui/dist/components/Header.d.ts +8 -0
  44. package/ui/dist/components/Header.d.ts.map +1 -0
  45. package/ui/dist/components/Header.js +10 -0
  46. package/ui/dist/components/Header.js.map +1 -0
  47. package/ui/dist/components/LoadingSpinner.d.ts +7 -0
  48. package/ui/dist/components/LoadingSpinner.d.ts.map +1 -0
  49. package/ui/dist/components/LoadingSpinner.js +7 -0
  50. package/ui/dist/components/LoadingSpinner.js.map +1 -0
  51. package/ui/dist/components/StatusBar.d.ts +11 -0
  52. package/ui/dist/components/StatusBar.d.ts.map +1 -0
  53. package/ui/dist/components/StatusBar.js +11 -0
  54. package/ui/dist/components/StatusBar.js.map +1 -0
  55. package/ui/dist/core/ipc.d.ts +96 -0
  56. package/ui/dist/core/ipc.d.ts.map +1 -0
  57. package/ui/dist/core/ipc.js +310 -0
  58. package/ui/dist/core/ipc.js.map +1 -0
  59. package/ui/dist/core/types.d.ts +45 -0
  60. package/ui/dist/core/types.d.ts.map +1 -0
  61. package/ui/dist/core/types.js +3 -0
  62. package/ui/dist/core/types.js.map +1 -0
  63. package/ui/dist/hooks/useFiles.d.ts +14 -0
  64. package/ui/dist/hooks/useFiles.d.ts.map +1 -0
  65. package/ui/dist/hooks/useFiles.js +102 -0
  66. package/ui/dist/hooks/useFiles.js.map +1 -0
  67. package/ui/dist/hooks/useVM.d.ts +10 -0
  68. package/ui/dist/hooks/useVM.d.ts.map +1 -0
  69. package/ui/dist/hooks/useVM.js +54 -0
  70. package/ui/dist/hooks/useVM.js.map +1 -0
  71. package/ui/dist/hooks/useVMList.d.ts +10 -0
  72. package/ui/dist/hooks/useVMList.d.ts.map +1 -0
  73. package/ui/dist/hooks/useVMList.js +56 -0
  74. package/ui/dist/hooks/useVMList.js.map +1 -0
  75. package/ui/dist/index.d.ts +3 -0
  76. package/ui/dist/index.d.ts.map +1 -0
  77. package/ui/dist/index.js +7488 -0
  78. package/ui/dist/index.js.map +1 -0
  79. package/ui/dist/keybindings.d.ts +146 -0
  80. package/ui/dist/keybindings.d.ts.map +1 -0
  81. package/ui/dist/keybindings.js +96 -0
  82. package/ui/dist/keybindings.js.map +1 -0
  83. package/ui/dist/screens/AddVMScreen.d.ts +9 -0
  84. package/ui/dist/screens/AddVMScreen.d.ts.map +1 -0
  85. package/ui/dist/screens/AddVMScreen.js +163 -0
  86. package/ui/dist/screens/AddVMScreen.js.map +1 -0
  87. package/ui/dist/screens/VMDetailScreen.d.ts +12 -0
  88. package/ui/dist/screens/VMDetailScreen.d.ts.map +1 -0
  89. package/ui/dist/screens/VMDetailScreen.js +96 -0
  90. package/ui/dist/screens/VMDetailScreen.js.map +1 -0
  91. package/ui/dist/screens/VMListScreen.d.ts +12 -0
  92. package/ui/dist/screens/VMListScreen.d.ts.map +1 -0
  93. package/ui/dist/screens/VMListScreen.js +158 -0
  94. package/ui/dist/screens/VMListScreen.js.map +1 -0
  95. package/ui/dist/screens/tabs/FilesTab.d.ts +9 -0
  96. package/ui/dist/screens/tabs/FilesTab.d.ts.map +1 -0
  97. package/ui/dist/screens/tabs/FilesTab.js +374 -0
  98. package/ui/dist/screens/tabs/FilesTab.js.map +1 -0
  99. package/ui/dist/screens/tabs/OverviewTab.d.ts +10 -0
  100. package/ui/dist/screens/tabs/OverviewTab.d.ts.map +1 -0
  101. package/ui/dist/screens/tabs/OverviewTab.js +110 -0
  102. package/ui/dist/screens/tabs/OverviewTab.js.map +1 -0
  103. package/ui/dist/screens/tabs/TerminalTab.d.ts +9 -0
  104. package/ui/dist/screens/tabs/TerminalTab.d.ts.map +1 -0
  105. package/ui/dist/screens/tabs/TerminalTab.js +270 -0
  106. package/ui/dist/screens/tabs/TerminalTab.js.map +1 -0
  107. package/ui/dist/utils/terminalEmulator.d.ts +49 -0
  108. package/ui/dist/utils/terminalEmulator.d.ts.map +1 -0
  109. package/ui/dist/utils/terminalEmulator.js +88 -0
  110. package/ui/dist/utils/terminalEmulator.js.map +1 -0
  111. package/ui/package.json +34 -0
  112. package/ui/scripts/start-with-core.js +81 -0
@@ -0,0 +1,102 @@
1
+ import { useState, useCallback, useEffect } from 'react';
2
+ import { ipcClient } from '../core/ipc.js';
3
+ export function useFiles(vm) {
4
+ const [files, setFiles] = useState([]);
5
+ const [loading, setLoading] = useState(false);
6
+ const [transferring, setTransferring] = useState(false);
7
+ const [error, setError] = useState(null);
8
+ const [transferProgress, setTransferProgress] = useState(null);
9
+ // Listen for transfer progress events
10
+ useEffect(() => {
11
+ const handleProgress = (progress) => {
12
+ if (progress.vm_id === vm.id) {
13
+ setTransferProgress(progress);
14
+ }
15
+ };
16
+ ipcClient.on('TRANSFER_PROGRESS', handleProgress);
17
+ return () => {
18
+ ipcClient.off('TRANSFER_PROGRESS', handleProgress);
19
+ };
20
+ }, [vm.id]);
21
+ const listFiles = useCallback(async (path) => {
22
+ try {
23
+ setLoading(true);
24
+ setError(null);
25
+ const fileList = await ipcClient.listFiles(vm.id, path);
26
+ setFiles(fileList);
27
+ return fileList;
28
+ }
29
+ catch (err) {
30
+ setError(err instanceof Error ? err.message : 'Failed to list files');
31
+ throw err;
32
+ }
33
+ finally {
34
+ setLoading(false);
35
+ }
36
+ }, [vm.id]);
37
+ const uploadFile = useCallback(async (localPath, remotePath) => {
38
+ try {
39
+ setTransferring(true);
40
+ setError(null);
41
+ setTransferProgress(null);
42
+ await ipcClient.uploadFile(vm.id, localPath, remotePath);
43
+ setTransferProgress(null);
44
+ }
45
+ catch (err) {
46
+ setError(err instanceof Error ? err.message : 'Upload failed');
47
+ throw err;
48
+ }
49
+ finally {
50
+ setTransferring(false);
51
+ }
52
+ }, [vm.id]);
53
+ const downloadFile = useCallback(async (remotePath, localPath) => {
54
+ try {
55
+ setTransferring(true);
56
+ setError(null);
57
+ setTransferProgress(null);
58
+ await ipcClient.downloadFile(vm.id, remotePath, localPath);
59
+ setTransferProgress(null);
60
+ }
61
+ catch (err) {
62
+ setError(err instanceof Error ? err.message : 'Download failed');
63
+ throw err;
64
+ }
65
+ finally {
66
+ setTransferring(false);
67
+ }
68
+ }, [vm.id]);
69
+ const deleteFile = useCallback(async (path) => {
70
+ try {
71
+ setError(null);
72
+ await ipcClient.deleteFile(vm.id, path);
73
+ }
74
+ catch (err) {
75
+ setError(err instanceof Error ? err.message : 'Delete failed');
76
+ throw err;
77
+ }
78
+ }, [vm.id]);
79
+ const renameFile = useCallback(async (oldPath, newPath) => {
80
+ try {
81
+ setError(null);
82
+ await ipcClient.renameFile(vm.id, oldPath, newPath);
83
+ }
84
+ catch (err) {
85
+ setError(err instanceof Error ? err.message : 'Rename failed');
86
+ throw err;
87
+ }
88
+ }, [vm.id]);
89
+ return {
90
+ files,
91
+ loading,
92
+ transferring,
93
+ transferProgress,
94
+ error,
95
+ listFiles,
96
+ uploadFile,
97
+ downloadFile,
98
+ deleteFile,
99
+ renameFile,
100
+ };
101
+ }
102
+ //# sourceMappingURL=useFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFiles.js","sourceRoot":"","sources":["../../src/hooks/useFiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { VM } from '../core/types.js';
2
+ export declare function useVM(vm: VM): {
3
+ connecting: boolean;
4
+ disconnecting: boolean;
5
+ error: string;
6
+ connect: () => Promise<void>;
7
+ disconnect: () => Promise<void>;
8
+ executeCommand: (command: string) => Promise<string>;
9
+ };
10
+ //# sourceMappingURL=useVM.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVM.d.ts","sourceRoot":"","sources":["../../src/hooks/useVM.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAG3C,wBAAgB,KAAK,CAAC,EAAE,EAAE,EAAE;;;;;;8BA+BwB,MAAM;EAkBzD"}
@@ -0,0 +1,54 @@
1
+ import { useState, useCallback } from 'react';
2
+ import { ipcClient } from '../core/ipc.js';
3
+ export function useVM(vm) {
4
+ const [connecting, setConnecting] = useState(false);
5
+ const [disconnecting, setDisconnecting] = useState(false);
6
+ const [error, setError] = useState(null);
7
+ const connect = useCallback(async () => {
8
+ try {
9
+ setConnecting(true);
10
+ setError(null);
11
+ await ipcClient.connectVM(vm.id);
12
+ }
13
+ catch (err) {
14
+ setError(err instanceof Error ? err.message : 'Connection failed');
15
+ throw err;
16
+ }
17
+ finally {
18
+ setConnecting(false);
19
+ }
20
+ }, [vm.id]);
21
+ const disconnect = useCallback(async () => {
22
+ try {
23
+ setDisconnecting(true);
24
+ setError(null);
25
+ await ipcClient.disconnectVM(vm.id);
26
+ }
27
+ catch (err) {
28
+ setError(err instanceof Error ? err.message : 'Disconnect failed');
29
+ throw err;
30
+ }
31
+ finally {
32
+ setDisconnecting(false);
33
+ }
34
+ }, [vm.id]);
35
+ const executeCommand = useCallback(async (command) => {
36
+ try {
37
+ setError(null);
38
+ return await ipcClient.executeCommand(vm.id, command);
39
+ }
40
+ catch (err) {
41
+ setError(err instanceof Error ? err.message : 'Command execution failed');
42
+ throw err;
43
+ }
44
+ }, [vm.id]);
45
+ return {
46
+ connecting,
47
+ disconnecting,
48
+ error,
49
+ connect,
50
+ disconnect,
51
+ executeCommand,
52
+ };
53
+ }
54
+ //# sourceMappingURL=useVM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVM.js","sourceRoot":"","sources":["../../src/hooks/useVM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,UAAU,KAAK,CAAC,EAAM;IAC3B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC;YACJ,aAAa,CAAC,IAAI,CAAC,CAAC;YACpB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;YACnE,MAAM,GAAG,CAAC;QACX,CAAC;gBAAS,CAAC;YACV,aAAa,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACF,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEZ,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,CAAC;YACJ,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;YACnE,MAAM,GAAG,CAAC;QACX,CAAC;gBAAS,CAAC;YACV,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEZ,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAC5D,IAAI,CAAC;YACJ,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,OAAO,MAAM,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;YAC1E,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAEZ,OAAO;QACN,UAAU;QACV,aAAa;QACb,KAAK;QACL,OAAO;QACP,UAAU;QACV,cAAc;KACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { VM } from '../core/types.js';
2
+ export declare function useVMList(): {
3
+ vms: VM[];
4
+ loading: boolean;
5
+ error: string;
6
+ loadVMs: () => Promise<void>;
7
+ addVM: (vm: Partial<VM>) => Promise<void>;
8
+ removeVM: (vmId: string) => Promise<void>;
9
+ };
10
+ //# sourceMappingURL=useVMList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVMList.d.ts","sourceRoot":"","sources":["../../src/hooks/useVMList.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAG3C,wBAAgB,SAAS;;;;;gBAkBa,OAAO,CAAC,EAAE,CAAC;qBAWN,MAAM;EAwBhD"}
@@ -0,0 +1,56 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { ipcClient } from '../core/ipc.js';
3
+ export function useVMList() {
4
+ const [vms, setVMs] = useState([]);
5
+ const [loading, setLoading] = useState(true);
6
+ const [error, setError] = useState(null);
7
+ const loadVMs = useCallback(async () => {
8
+ try {
9
+ setLoading(true);
10
+ setError(null);
11
+ const vmList = await ipcClient.listVMs();
12
+ setVMs(vmList);
13
+ }
14
+ catch (err) {
15
+ setError(err instanceof Error ? err.message : 'Failed to load VMs');
16
+ }
17
+ finally {
18
+ setLoading(false);
19
+ }
20
+ }, []);
21
+ const addVM = useCallback(async (vm) => {
22
+ try {
23
+ setError(null);
24
+ await ipcClient.addVM(vm);
25
+ await loadVMs();
26
+ }
27
+ catch (err) {
28
+ setError(err instanceof Error ? err.message : 'Failed to add VM');
29
+ throw err;
30
+ }
31
+ }, [loadVMs]);
32
+ const removeVM = useCallback(async (vmId) => {
33
+ try {
34
+ setError(null);
35
+ await ipcClient.removeVM(vmId);
36
+ await loadVMs();
37
+ }
38
+ catch (err) {
39
+ setError(err instanceof Error ? err.message : 'Failed to remove VM');
40
+ throw err;
41
+ }
42
+ }, [loadVMs]);
43
+ // Load VMs on mount
44
+ useEffect(() => {
45
+ loadVMs();
46
+ }, [loadVMs]);
47
+ return {
48
+ vms,
49
+ loading,
50
+ error,
51
+ loadVMs,
52
+ addVM,
53
+ removeVM,
54
+ };
55
+ }
56
+ //# sourceMappingURL=useVMList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVMList.js","sourceRoot":"","sources":["../../src/hooks/useVMList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,UAAU,SAAS;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAO,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC;YACJ,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACrE,CAAC;gBAAS,CAAC;YACV,UAAU,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACF,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,EAAe,EAAE,EAAE;QACnD,IAAI,CAAC;YACJ,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,OAAO,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAClE,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QACnD,IAAI,CAAC;YACJ,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,OAAO,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;YACrE,MAAM,GAAG,CAAC;QACX,CAAC;IACF,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,oBAAoB;IACpB,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,EAAE,CAAC;IACX,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO;QACN,GAAG;QACH,OAAO;QACP,KAAK;QACL,OAAO;QACP,KAAK;QACL,QAAQ;KACR,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":""}