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.
- package/LICENSE +21 -0
- package/README.md +621 -0
- package/bin/file-browser +0 -0
- package/bin/heyvm +0 -0
- package/bin/heyvm-core +0 -0
- package/bin/heyvm.js +61 -0
- package/core/README.md +51 -0
- package/core/cmd/heyvm-core/main.go +73 -0
- package/core/go.mod +25 -0
- package/core/go.sum +47 -0
- package/core/internal/auth/errors.go +29 -0
- package/core/internal/auth/password.go +187 -0
- package/core/internal/auth/provider.go +33 -0
- package/core/internal/auth/ssh_key.go +142 -0
- package/core/internal/config/config.go +111 -0
- package/core/internal/ipc/actions.go +738 -0
- package/core/internal/ipc/handler.go +281 -0
- package/core/internal/ipc/protocol.go +126 -0
- package/core/internal/sftp/errors.go +29 -0
- package/core/internal/sftp/manager.go +303 -0
- package/core/internal/sftp/types.go +30 -0
- package/core/internal/ssh/errors.go +23 -0
- package/core/internal/ssh/manager.go +226 -0
- package/core/internal/ssh/session.go +105 -0
- package/core/internal/vm/errors.go +35 -0
- package/core/internal/vm/models.go +84 -0
- package/core/internal/vm/registry.go +240 -0
- package/package.json +59 -0
- package/scripts/install.js +100 -0
- package/ui/README.md +43 -0
- package/ui/dist/App.d.ts +3 -0
- package/ui/dist/App.d.ts.map +1 -0
- package/ui/dist/App.js +142 -0
- package/ui/dist/App.js.map +1 -0
- package/ui/dist/components/ConfirmDialog.d.ts +9 -0
- package/ui/dist/components/ConfirmDialog.d.ts.map +1 -0
- package/ui/dist/components/ConfirmDialog.js +22 -0
- package/ui/dist/components/ConfirmDialog.js.map +1 -0
- package/ui/dist/components/ErrorMessage.d.ts +8 -0
- package/ui/dist/components/ErrorMessage.d.ts.map +1 -0
- package/ui/dist/components/ErrorMessage.js +10 -0
- package/ui/dist/components/ErrorMessage.js.map +1 -0
- package/ui/dist/components/Header.d.ts +8 -0
- package/ui/dist/components/Header.d.ts.map +1 -0
- package/ui/dist/components/Header.js +10 -0
- package/ui/dist/components/Header.js.map +1 -0
- package/ui/dist/components/LoadingSpinner.d.ts +7 -0
- package/ui/dist/components/LoadingSpinner.d.ts.map +1 -0
- package/ui/dist/components/LoadingSpinner.js +7 -0
- package/ui/dist/components/LoadingSpinner.js.map +1 -0
- package/ui/dist/components/StatusBar.d.ts +11 -0
- package/ui/dist/components/StatusBar.d.ts.map +1 -0
- package/ui/dist/components/StatusBar.js +11 -0
- package/ui/dist/components/StatusBar.js.map +1 -0
- package/ui/dist/core/ipc.d.ts +96 -0
- package/ui/dist/core/ipc.d.ts.map +1 -0
- package/ui/dist/core/ipc.js +310 -0
- package/ui/dist/core/ipc.js.map +1 -0
- package/ui/dist/core/types.d.ts +45 -0
- package/ui/dist/core/types.d.ts.map +1 -0
- package/ui/dist/core/types.js +3 -0
- package/ui/dist/core/types.js.map +1 -0
- package/ui/dist/hooks/useFiles.d.ts +14 -0
- package/ui/dist/hooks/useFiles.d.ts.map +1 -0
- package/ui/dist/hooks/useFiles.js +102 -0
- package/ui/dist/hooks/useFiles.js.map +1 -0
- package/ui/dist/hooks/useVM.d.ts +10 -0
- package/ui/dist/hooks/useVM.d.ts.map +1 -0
- package/ui/dist/hooks/useVM.js +54 -0
- package/ui/dist/hooks/useVM.js.map +1 -0
- package/ui/dist/hooks/useVMList.d.ts +10 -0
- package/ui/dist/hooks/useVMList.d.ts.map +1 -0
- package/ui/dist/hooks/useVMList.js +56 -0
- package/ui/dist/hooks/useVMList.js.map +1 -0
- package/ui/dist/index.d.ts +3 -0
- package/ui/dist/index.d.ts.map +1 -0
- package/ui/dist/index.js +7488 -0
- package/ui/dist/index.js.map +1 -0
- package/ui/dist/keybindings.d.ts +146 -0
- package/ui/dist/keybindings.d.ts.map +1 -0
- package/ui/dist/keybindings.js +96 -0
- package/ui/dist/keybindings.js.map +1 -0
- package/ui/dist/screens/AddVMScreen.d.ts +9 -0
- package/ui/dist/screens/AddVMScreen.d.ts.map +1 -0
- package/ui/dist/screens/AddVMScreen.js +163 -0
- package/ui/dist/screens/AddVMScreen.js.map +1 -0
- package/ui/dist/screens/VMDetailScreen.d.ts +12 -0
- package/ui/dist/screens/VMDetailScreen.d.ts.map +1 -0
- package/ui/dist/screens/VMDetailScreen.js +96 -0
- package/ui/dist/screens/VMDetailScreen.js.map +1 -0
- package/ui/dist/screens/VMListScreen.d.ts +12 -0
- package/ui/dist/screens/VMListScreen.d.ts.map +1 -0
- package/ui/dist/screens/VMListScreen.js +158 -0
- package/ui/dist/screens/VMListScreen.js.map +1 -0
- package/ui/dist/screens/tabs/FilesTab.d.ts +9 -0
- package/ui/dist/screens/tabs/FilesTab.d.ts.map +1 -0
- package/ui/dist/screens/tabs/FilesTab.js +374 -0
- package/ui/dist/screens/tabs/FilesTab.js.map +1 -0
- package/ui/dist/screens/tabs/OverviewTab.d.ts +10 -0
- package/ui/dist/screens/tabs/OverviewTab.d.ts.map +1 -0
- package/ui/dist/screens/tabs/OverviewTab.js +110 -0
- package/ui/dist/screens/tabs/OverviewTab.js.map +1 -0
- package/ui/dist/screens/tabs/TerminalTab.d.ts +9 -0
- package/ui/dist/screens/tabs/TerminalTab.d.ts.map +1 -0
- package/ui/dist/screens/tabs/TerminalTab.js +270 -0
- package/ui/dist/screens/tabs/TerminalTab.js.map +1 -0
- package/ui/dist/utils/terminalEmulator.d.ts +49 -0
- package/ui/dist/utils/terminalEmulator.d.ts.map +1 -0
- package/ui/dist/utils/terminalEmulator.js +88 -0
- package/ui/dist/utils/terminalEmulator.js.map +1 -0
- package/ui/package.json +34 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":""}
|