@google/gemini-cli 0.12.0-preview.4 → 0.13.0-nightly.20251031.c89bc30d
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/dist/google-gemini-cli-0.13.0-nightly.20251029.cca41edc.tgz +0 -0
- package/dist/package.json +2 -2
- package/dist/src/commands/extensions/install.js +2 -2
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +27 -16
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.js +2 -2
- package/dist/src/commands/extensions/link.js.map +1 -1
- package/dist/src/commands/extensions/update.js +3 -2
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/extensions/validate.d.ts +12 -0
- package/dist/src/commands/extensions/validate.js +83 -0
- package/dist/src/commands/extensions/validate.js.map +1 -0
- package/dist/src/commands/extensions/validate.test.d.ts +6 -0
- package/dist/src/commands/extensions/validate.test.js +93 -0
- package/dist/src/commands/extensions/validate.test.js.map +1 -0
- package/dist/src/commands/extensions.js +2 -0
- package/dist/src/commands/extensions.js.map +1 -1
- package/dist/src/config/auth.js +0 -5
- package/dist/src/config/auth.js.map +1 -1
- package/dist/src/config/auth.test.js +1 -3
- package/dist/src/config/auth.test.js.map +1 -1
- package/dist/src/config/config.js +2 -1
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +6 -10
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extensions/update.d.ts +2 -2
- package/dist/src/config/extensions/update.js +28 -22
- package/dist/src/config/extensions/update.js.map +1 -1
- package/dist/src/config/sandboxConfig.d.ts +1 -1
- package/dist/src/config/sandboxConfig.js +6 -3
- package/dist/src/config/sandboxConfig.js.map +1 -1
- package/dist/src/config/settings.js +2 -2
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settings.test.js +13 -53
- package/dist/src/config/settings.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +25 -7
- package/dist/src/config/settingsSchema.js +24 -6
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +2 -0
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/gemini.js +8 -1
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +1 -0
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/nonInteractiveCli.d.ts +9 -1
- package/dist/src/nonInteractiveCli.js +16 -1
- package/dist/src/nonInteractiveCli.js.map +1 -1
- package/dist/src/nonInteractiveCli.test.js +209 -103
- package/dist/src/nonInteractiveCli.test.js.map +1 -1
- package/dist/src/test-utils/async.d.ts +9 -0
- package/dist/src/test-utils/async.js +29 -0
- package/dist/src/test-utils/async.js.map +1 -0
- package/dist/src/test-utils/render.d.ts +2 -1
- package/dist/src/test-utils/render.js +23 -1
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/test-utils/render.test.js +29 -4
- package/dist/src/test-utils/render.test.js.map +1 -1
- package/dist/src/ui/App.test.js +1 -1
- package/dist/src/ui/App.test.js.map +1 -1
- package/dist/src/ui/AppContainer.js +33 -4
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +205 -99
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/auth/ApiAuthDialog.d.ts +14 -0
- package/dist/src/ui/auth/ApiAuthDialog.js +26 -0
- package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -0
- package/dist/src/ui/auth/ApiAuthDialog.test.d.ts +6 -0
- package/dist/src/ui/auth/ApiAuthDialog.test.js +91 -0
- package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -0
- package/dist/src/ui/auth/AuthDialog.js +7 -3
- package/dist/src/ui/auth/AuthDialog.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/auth/useAuth.d.ts +2 -0
- package/dist/src/ui/auth/useAuth.js +31 -2
- package/dist/src/ui/auth/useAuth.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.test.js +1 -1
- package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
- package/dist/src/ui/components/Composer.test.js +1 -1
- package/dist/src/ui/components/Composer.test.js.map +1 -1
- package/dist/src/ui/components/ConsentPrompt.test.js +18 -8
- package/dist/src/ui/components/ConsentPrompt.test.js.map +1 -1
- package/dist/src/ui/components/ContextSummaryDisplay.test.js +11 -6
- package/dist/src/ui/components/ContextSummaryDisplay.test.js.map +1 -1
- package/dist/src/ui/components/DialogManager.js +4 -0
- package/dist/src/ui/components/DialogManager.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +4 -3
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +3 -2
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Footer.test.js +59 -0
- package/dist/src/ui/components/Footer.test.js.map +1 -1
- package/dist/src/ui/components/Header.test.js +9 -5
- package/dist/src/ui/components/Header.test.js.map +1 -1
- package/dist/src/ui/components/Help.test.js +5 -3
- package/dist/src/ui/components/Help.test.js.map +1 -1
- package/dist/src/ui/components/InputPrompt.test.js +139 -111
- package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
- package/dist/src/ui/components/LoadingIndicator.test.js +27 -14
- package/dist/src/ui/components/LoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.test.js +20 -10
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
- package/dist/src/ui/components/ModelStatsDisplay.test.js +1 -1
- package/dist/src/ui/components/ModelStatsDisplay.test.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +11 -10
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/PrepareLabel.test.js +13 -7
- package/dist/src/ui/components/PrepareLabel.test.js.map +1 -1
- package/dist/src/ui/components/ProQuotaDialog.test.js +14 -6
- package/dist/src/ui/components/ProQuotaDialog.test.js.map +1 -1
- package/dist/src/ui/components/QueuedMessageDisplay.test.js +11 -6
- package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -1
- package/dist/src/ui/components/SessionSummaryDisplay.test.js +1 -1
- package/dist/src/ui/components/SessionSummaryDisplay.test.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +438 -512
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/StatsDisplay.test.js +1 -1
- package/dist/src/ui/components/StatsDisplay.test.js.map +1 -1
- package/dist/src/ui/components/ThemeDialog.test.js +3 -2
- package/dist/src/ui/components/ThemeDialog.test.js.map +1 -1
- package/dist/src/ui/components/ToolStatsDisplay.test.js +1 -1
- package/dist/src/ui/components/ToolStatsDisplay.test.js.map +1 -1
- package/dist/src/ui/components/messages/CompressionMessage.test.js +25 -17
- package/dist/src/ui/components/messages/CompressionMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.test.js +1 -1
- package/dist/src/ui/components/messages/DiffRenderer.test.js.map +1 -1
- package/dist/src/ui/components/messages/Todo.js +27 -5
- package/dist/src/ui/components/messages/Todo.js.map +1 -1
- package/dist/src/ui/components/messages/Todo.test.js +20 -8
- package/dist/src/ui/components/messages/Todo.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +29 -15
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +12 -11
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
- package/dist/src/ui/components/shared/MaxSizedBox.test.js +43 -22
- package/dist/src/ui/components/shared/MaxSizedBox.test.js.map +1 -1
- package/dist/src/ui/components/shared/TextInput.d.ts +15 -0
- package/dist/src/ui/components/shared/TextInput.js +38 -0
- package/dist/src/ui/components/shared/TextInput.js.map +1 -0
- package/dist/src/ui/components/shared/TextInput.test.d.ts +6 -0
- package/dist/src/ui/components/shared/TextInput.test.js +242 -0
- package/dist/src/ui/components/shared/TextInput.test.js.map +1 -0
- package/dist/src/ui/components/shared/text-buffer.d.ts +8 -2
- package/dist/src/ui/components/shared/text-buffer.js +28 -13
- package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.test.js +137 -0
- package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
- package/dist/src/ui/components/views/ChatList.test.js +7 -4
- package/dist/src/ui/components/views/ChatList.test.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionsList.js +1 -0
- package/dist/src/ui/components/views/ExtensionsList.js.map +1 -1
- package/dist/src/ui/components/views/ExtensionsList.test.js +13 -5
- package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -1
- package/dist/src/ui/components/views/McpStatus.test.js +23 -12
- package/dist/src/ui/components/views/McpStatus.test.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +132 -252
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.test.js +9 -5
- package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
- package/dist/src/ui/contexts/UIActionsContext.d.ts +2 -0
- package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
- package/dist/src/ui/contexts/UIStateContext.d.ts +2 -0
- package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +29 -7
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.test.js +163 -64
- package/dist/src/ui/hooks/atCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/shellCommandProcessor.test.js +47 -34
- package/dist/src/ui/hooks/shellCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/slashCommandProcessor.test.js +141 -104
- package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.test.js +23 -21
- package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useCommandCompletion.test.js +16 -15
- package/dist/src/ui/hooks/useCommandCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useConsoleMessages.test.js +1 -1
- package/dist/src/ui/hooks/useConsoleMessages.test.js.map +1 -1
- package/dist/src/ui/hooks/useEditorSettings.test.js +1 -1
- package/dist/src/ui/hooks/useEditorSettings.test.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.d.ts +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.js +9 -3
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +10 -9
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
- package/dist/src/ui/hooks/useFocus.test.js +1 -1
- package/dist/src/ui/hooks/useFocus.test.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js +7 -6
- package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.test.js +39 -38
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useGitBranchName.test.js +5 -4
- package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
- package/dist/src/ui/hooks/useIdeTrustListener.test.js +25 -11
- package/dist/src/ui/hooks/useIdeTrustListener.test.js.map +1 -1
- package/dist/src/ui/hooks/useKeypress.test.js +1 -1
- package/dist/src/ui/hooks/useKeypress.test.js.map +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js +1 -1
- package/dist/src/ui/hooks/useLoadingIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useMemoryMonitor.test.js +1 -1
- package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +1 -1
- package/dist/src/ui/hooks/useMessageQueue.test.js +5 -4
- package/dist/src/ui/hooks/useMessageQueue.test.js.map +1 -1
- package/dist/src/ui/hooks/useModelCommand.test.js +7 -4
- package/dist/src/ui/hooks/useModelCommand.test.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.test.js +46 -16
- package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
- package/dist/src/ui/hooks/usePrivacySettings.test.js +11 -7
- package/dist/src/ui/hooks/usePrivacySettings.test.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +28 -14
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
- package/dist/src/ui/hooks/useSelectionList.test.js +116 -109
- package/dist/src/ui/hooks/useSelectionList.test.js.map +1 -1
- package/dist/src/ui/hooks/useShellHistory.test.js +25 -17
- package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.js +18 -7
- package/dist/src/ui/hooks/useSlashCompletion.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +244 -111
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useTimer.test.js +1 -1
- package/dist/src/ui/hooks/useTimer.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +6 -2
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/hooks/vim.test.js +6 -21
- package/dist/src/ui/hooks/vim.test.js.map +1 -1
- package/dist/src/ui/state/extensions.d.ts +1 -0
- package/dist/src/ui/state/extensions.js +1 -0
- package/dist/src/ui/state/extensions.js.map +1 -1
- package/dist/src/ui/types.d.ts +1 -0
- package/dist/src/ui/types.js +2 -0
- package/dist/src/ui/types.js.map +1 -1
- package/dist/src/ui/utils/clipboardUtils.js +2 -2
- package/dist/src/ui/utils/clipboardUtils.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.js +6 -3
- package/dist/src/ui/utils/updateCheck.js.map +1 -1
- package/dist/src/ui/utils/updateCheck.test.js +5 -1
- package/dist/src/ui/utils/updateCheck.test.js.map +1 -1
- package/dist/src/utils/commentJson.js +2 -2
- package/dist/src/utils/commentJson.js.map +1 -1
- package/dist/src/utils/commentJson.test.js +7 -6
- package/dist/src/utils/commentJson.test.js.map +1 -1
- package/dist/src/utils/version.js +6 -2
- package/dist/src/utils/version.js.map +1 -1
- package/dist/src/zed-integration/acp.js +2 -1
- package/dist/src/zed-integration/acp.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/google-gemini-cli-0.12.0-preview.3.tgz +0 -0
- package/dist/src/utils/package.d.ts +0 -12
- package/dist/src/utils/package.js +0 -24
- package/dist/src/utils/package.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpStatus.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/views/McpStatus.test.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"McpStatus.test.js","sourceRoot":"","sources":["../../../../../src/ui/components/views/McpStatus.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { act } from 'react';
|
|
3
3
|
import { renderHook } from '../../test-utils/render.js';
|
|
4
|
+
import { waitFor } from '../../test-utils/async.js';
|
|
4
5
|
import { vi } from 'vitest';
|
|
5
6
|
import { KeypressProvider, useKeypressContext, DRAG_COMPLETION_TIMEOUT_MS, KITTY_SEQUENCE_TIMEOUT_MS,
|
|
6
7
|
// CSI_END_O,
|
|
@@ -32,6 +33,14 @@ class MockStdin extends EventEmitter {
|
|
|
32
33
|
this.emit('data', text);
|
|
33
34
|
}
|
|
34
35
|
}
|
|
36
|
+
// Helper function to setup keypress test with standard configuration
|
|
37
|
+
const setupKeypressTest = (kittyProtocolEnabled = true) => {
|
|
38
|
+
const keyHandler = vi.fn();
|
|
39
|
+
const wrapper = ({ children }) => (_jsx(KeypressProvider, { kittyProtocolEnabled: kittyProtocolEnabled, children: children }));
|
|
40
|
+
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
41
|
+
act(() => result.current.subscribe(keyHandler));
|
|
42
|
+
return { result, keyHandler };
|
|
43
|
+
};
|
|
35
44
|
describe('KeypressContext - Kitty Protocol', () => {
|
|
36
45
|
let stdin;
|
|
37
46
|
const mockSetRawMode = vi.fn();
|
|
@@ -45,100 +54,55 @@ describe('KeypressContext - Kitty Protocol', () => {
|
|
|
45
54
|
});
|
|
46
55
|
});
|
|
47
56
|
describe('Enter key handling', () => {
|
|
48
|
-
it(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
name: 'return',
|
|
60
|
-
kittyProtocol: true,
|
|
61
|
-
ctrl: false,
|
|
62
|
-
meta: false,
|
|
63
|
-
shift: false,
|
|
64
|
-
}));
|
|
65
|
-
});
|
|
66
|
-
it('should recognize numpad enter key (keycode 57414) in kitty protocol', async () => {
|
|
67
|
-
const keyHandler = vi.fn();
|
|
68
|
-
const { result } = renderHook(() => useKeypressContext(), {
|
|
69
|
-
wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
|
|
70
|
-
});
|
|
71
|
-
act(() => result.current.subscribe(keyHandler));
|
|
72
|
-
// Send kitty protocol sequence for numpad enter: ESC[57414u
|
|
73
|
-
act(() => {
|
|
74
|
-
stdin.write(`\x1b[57414u`);
|
|
75
|
-
});
|
|
76
|
-
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
77
|
-
name: 'return',
|
|
78
|
-
kittyProtocol: true,
|
|
79
|
-
ctrl: false,
|
|
80
|
-
meta: false,
|
|
81
|
-
shift: false,
|
|
82
|
-
}));
|
|
83
|
-
});
|
|
84
|
-
it('should handle numpad enter with modifiers', async () => {
|
|
85
|
-
const keyHandler = vi.fn();
|
|
86
|
-
const { result } = renderHook(() => useKeypressContext(), {
|
|
87
|
-
wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
|
|
88
|
-
});
|
|
89
|
-
act(() => result.current.subscribe(keyHandler));
|
|
90
|
-
// Send kitty protocol sequence for numpad enter with Shift (modifier 2): ESC[57414;2u
|
|
57
|
+
it.each([
|
|
58
|
+
{
|
|
59
|
+
name: 'regular enter key (keycode 13)',
|
|
60
|
+
sequence: '\x1b[13u',
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'numpad enter key (keycode 57414)',
|
|
64
|
+
sequence: '\x1b[57414u',
|
|
65
|
+
},
|
|
66
|
+
])('should recognize $name in kitty protocol', async ({ sequence }) => {
|
|
67
|
+
const { keyHandler } = setupKeypressTest(true);
|
|
91
68
|
act(() => {
|
|
92
|
-
stdin.write(
|
|
69
|
+
stdin.write(sequence);
|
|
93
70
|
});
|
|
94
71
|
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
95
72
|
name: 'return',
|
|
96
73
|
kittyProtocol: true,
|
|
97
74
|
ctrl: false,
|
|
98
75
|
meta: false,
|
|
99
|
-
shift: true,
|
|
100
|
-
}));
|
|
101
|
-
});
|
|
102
|
-
it('should handle numpad enter with Ctrl modifier', async () => {
|
|
103
|
-
const keyHandler = vi.fn();
|
|
104
|
-
const { result } = renderHook(() => useKeypressContext(), {
|
|
105
|
-
wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
|
|
106
|
-
});
|
|
107
|
-
act(() => result.current.subscribe(keyHandler));
|
|
108
|
-
// Send kitty protocol sequence for numpad enter with Ctrl (modifier 5): ESC[57414;5u
|
|
109
|
-
act(() => stdin.write(`\x1b[57414;5u`));
|
|
110
|
-
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
111
|
-
name: 'return',
|
|
112
|
-
kittyProtocol: true,
|
|
113
|
-
ctrl: true,
|
|
114
|
-
meta: false,
|
|
115
76
|
shift: false,
|
|
116
77
|
}));
|
|
117
78
|
});
|
|
118
|
-
it(
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
79
|
+
it.each([
|
|
80
|
+
{
|
|
81
|
+
modifier: 'Shift',
|
|
82
|
+
sequence: '\x1b[57414;2u',
|
|
83
|
+
expected: { ctrl: false, meta: false, shift: true },
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
modifier: 'Ctrl',
|
|
87
|
+
sequence: '\x1b[57414;5u',
|
|
88
|
+
expected: { ctrl: true, meta: false, shift: false },
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
modifier: 'Alt',
|
|
92
|
+
sequence: '\x1b[57414;3u',
|
|
93
|
+
expected: { ctrl: false, meta: true, shift: false },
|
|
94
|
+
},
|
|
95
|
+
])('should handle numpad enter with $modifier modifier', async ({ sequence, expected }) => {
|
|
96
|
+
const { keyHandler } = setupKeypressTest(true);
|
|
97
|
+
act(() => stdin.write(sequence));
|
|
128
98
|
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
129
99
|
name: 'return',
|
|
130
100
|
kittyProtocol: true,
|
|
131
|
-
|
|
132
|
-
meta: true,
|
|
133
|
-
shift: false,
|
|
101
|
+
...expected,
|
|
134
102
|
}));
|
|
135
103
|
});
|
|
136
104
|
it('should not process kitty sequences when kitty protocol is disabled', async () => {
|
|
137
|
-
const keyHandler =
|
|
138
|
-
const { result } = renderHook(() => useKeypressContext(), {
|
|
139
|
-
wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: false }),
|
|
140
|
-
});
|
|
141
|
-
act(() => result.current.subscribe(keyHandler));
|
|
105
|
+
const { keyHandler } = setupKeypressTest(false);
|
|
142
106
|
// Send kitty protocol sequence for numpad enter
|
|
143
107
|
act(() => {
|
|
144
108
|
stdin.write(`\x1b[57414u`);
|
|
@@ -153,11 +117,7 @@ describe('KeypressContext - Kitty Protocol', () => {
|
|
|
153
117
|
});
|
|
154
118
|
describe('Escape key handling', () => {
|
|
155
119
|
it('should recognize escape key (keycode 27) in kitty protocol', async () => {
|
|
156
|
-
const keyHandler =
|
|
157
|
-
const { result } = renderHook(() => useKeypressContext(), {
|
|
158
|
-
wrapper: ({ children }) => wrapper({ children, kittyProtocolEnabled: true }),
|
|
159
|
-
});
|
|
160
|
-
act(() => result.current.subscribe(keyHandler));
|
|
120
|
+
const { keyHandler } = setupKeypressTest(true);
|
|
161
121
|
// Send kitty protocol sequence for escape: ESC[27u
|
|
162
122
|
act(() => {
|
|
163
123
|
stdin.write('\x1b[27u');
|
|
@@ -169,132 +129,80 @@ describe('KeypressContext - Kitty Protocol', () => {
|
|
|
169
129
|
});
|
|
170
130
|
});
|
|
171
131
|
describe('Tab and Backspace handling', () => {
|
|
172
|
-
it(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
name: '
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
const keyHandler = vi.fn();
|
|
201
|
-
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
202
|
-
act(() => result.current.subscribe(keyHandler));
|
|
203
|
-
act(() => {
|
|
204
|
-
stdin.write(`\x1b[127u`);
|
|
205
|
-
});
|
|
206
|
-
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
207
|
-
name: 'backspace',
|
|
208
|
-
kittyProtocol: true,
|
|
209
|
-
meta: false,
|
|
210
|
-
}));
|
|
211
|
-
});
|
|
212
|
-
it('should recognize Option+Backspace in kitty protocol', async () => {
|
|
213
|
-
const keyHandler = vi.fn();
|
|
214
|
-
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
215
|
-
act(() => result.current.subscribe(keyHandler));
|
|
216
|
-
// Modifier 3 is Alt/Option
|
|
217
|
-
act(() => {
|
|
218
|
-
stdin.write(`\x1b[127;3u`);
|
|
219
|
-
});
|
|
220
|
-
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
221
|
-
name: 'backspace',
|
|
222
|
-
kittyProtocol: true,
|
|
223
|
-
meta: true,
|
|
224
|
-
}));
|
|
225
|
-
});
|
|
226
|
-
it('should recognize Ctrl+Backspace in kitty protocol', async () => {
|
|
227
|
-
const keyHandler = vi.fn();
|
|
228
|
-
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
229
|
-
act(() => result.current.subscribe(keyHandler));
|
|
230
|
-
// Modifier 5 is Ctrl
|
|
132
|
+
it.each([
|
|
133
|
+
{
|
|
134
|
+
name: 'Tab key',
|
|
135
|
+
sequence: '\x1b[9u',
|
|
136
|
+
expected: { name: 'tab', shift: false },
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: 'Shift+Tab',
|
|
140
|
+
sequence: '\x1b[9;2u',
|
|
141
|
+
expected: { name: 'tab', shift: true },
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
name: 'Backspace',
|
|
145
|
+
sequence: '\x1b[127u',
|
|
146
|
+
expected: { name: 'backspace', meta: false },
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: 'Option+Backspace',
|
|
150
|
+
sequence: '\x1b[127;3u',
|
|
151
|
+
expected: { name: 'backspace', meta: true },
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
name: 'Ctrl+Backspace',
|
|
155
|
+
sequence: '\x1b[127;5u',
|
|
156
|
+
expected: { name: 'backspace', ctrl: true },
|
|
157
|
+
},
|
|
158
|
+
])('should recognize $name in kitty protocol', async ({ sequence, expected }) => {
|
|
159
|
+
const { keyHandler } = setupKeypressTest(true);
|
|
231
160
|
act(() => {
|
|
232
|
-
stdin.write(
|
|
161
|
+
stdin.write(sequence);
|
|
233
162
|
});
|
|
234
163
|
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
235
|
-
|
|
164
|
+
...expected,
|
|
236
165
|
kittyProtocol: true,
|
|
237
|
-
ctrl: true,
|
|
238
166
|
}));
|
|
239
167
|
});
|
|
240
168
|
});
|
|
241
169
|
describe('paste mode', () => {
|
|
242
|
-
it(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
stdin.write(PASTE_START.slice(3));
|
|
274
|
-
stdin.write(pastedText);
|
|
275
|
-
stdin.write(PASTE_END);
|
|
276
|
-
});
|
|
277
|
-
await vi.waitFor(() => {
|
|
278
|
-
expect(keyHandler).toHaveBeenCalledTimes(1);
|
|
279
|
-
});
|
|
280
|
-
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
281
|
-
paste: true,
|
|
282
|
-
sequence: pastedText,
|
|
283
|
-
}));
|
|
284
|
-
});
|
|
285
|
-
it('should paste end code split over multiple writes', async () => {
|
|
170
|
+
it.each([
|
|
171
|
+
{
|
|
172
|
+
name: 'handle multiline paste as a single event',
|
|
173
|
+
pastedText: 'This \n is \n a \n multiline \n paste.',
|
|
174
|
+
writeSequence: (text) => {
|
|
175
|
+
stdin.write(PASTE_START);
|
|
176
|
+
stdin.write(text);
|
|
177
|
+
stdin.write(PASTE_END);
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'handle paste start code split over multiple writes',
|
|
182
|
+
pastedText: 'pasted content',
|
|
183
|
+
writeSequence: (text) => {
|
|
184
|
+
stdin.write(PASTE_START.slice(0, 3));
|
|
185
|
+
stdin.write(PASTE_START.slice(3));
|
|
186
|
+
stdin.write(text);
|
|
187
|
+
stdin.write(PASTE_END);
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: 'handle paste end code split over multiple writes',
|
|
192
|
+
pastedText: 'pasted content',
|
|
193
|
+
writeSequence: (text) => {
|
|
194
|
+
stdin.write(PASTE_START);
|
|
195
|
+
stdin.write(text);
|
|
196
|
+
stdin.write(PASTE_END.slice(0, 3));
|
|
197
|
+
stdin.write(PASTE_END.slice(3));
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
])('should $name', async ({ pastedText, writeSequence }) => {
|
|
286
201
|
const keyHandler = vi.fn();
|
|
287
|
-
const pastedText = 'pasted content';
|
|
288
202
|
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
289
203
|
act(() => result.current.subscribe(keyHandler));
|
|
290
|
-
act(() =>
|
|
291
|
-
|
|
292
|
-
stdin.write(pastedText);
|
|
293
|
-
// Split PASTE_END into two parts
|
|
294
|
-
stdin.write(PASTE_END.slice(0, 3));
|
|
295
|
-
stdin.write(PASTE_END.slice(3));
|
|
296
|
-
});
|
|
297
|
-
await vi.waitFor(() => {
|
|
204
|
+
act(() => writeSequence(pastedText));
|
|
205
|
+
await waitFor(() => {
|
|
298
206
|
expect(keyHandler).toHaveBeenCalledTimes(1);
|
|
299
207
|
});
|
|
300
208
|
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -429,26 +337,20 @@ describe('KeypressContext - Kitty Protocol', () => {
|
|
|
429
337
|
});
|
|
430
338
|
describe('Double-tap and batching', () => {
|
|
431
339
|
it('should emit two delete events for double-tap CSI[3~', async () => {
|
|
432
|
-
const keyHandler =
|
|
433
|
-
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
434
|
-
act(() => result.current.subscribe(keyHandler));
|
|
340
|
+
const { keyHandler } = setupKeypressTest(true);
|
|
435
341
|
act(() => stdin.write(`\x1b[3~`));
|
|
436
342
|
act(() => stdin.write(`\x1b[3~`));
|
|
437
343
|
expect(keyHandler).toHaveBeenNthCalledWith(1, expect.objectContaining({ name: 'delete' }));
|
|
438
344
|
expect(keyHandler).toHaveBeenNthCalledWith(2, expect.objectContaining({ name: 'delete' }));
|
|
439
345
|
});
|
|
440
346
|
it('should parse two concatenated tilde-coded sequences in one chunk', async () => {
|
|
441
|
-
const keyHandler =
|
|
442
|
-
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
443
|
-
act(() => result.current.subscribe(keyHandler));
|
|
347
|
+
const { keyHandler } = setupKeypressTest(true);
|
|
444
348
|
act(() => stdin.write(`\x1b[3~\x1b[5~`));
|
|
445
349
|
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({ name: 'delete' }));
|
|
446
350
|
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({ name: 'pageup' }));
|
|
447
351
|
});
|
|
448
352
|
it('should ignore incomplete CSI then parse the next complete sequence', async () => {
|
|
449
|
-
const keyHandler =
|
|
450
|
-
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
451
|
-
act(() => result.current.subscribe(keyHandler));
|
|
353
|
+
const { keyHandler } = setupKeypressTest(true);
|
|
452
354
|
// Incomplete ESC sequence then a complete Delete
|
|
453
355
|
act(() => {
|
|
454
356
|
// Provide an incomplete ESC sequence chunk with a real ESC character
|
|
@@ -477,65 +379,45 @@ describe('Drag and Drop Handling', () => {
|
|
|
477
379
|
vi.useRealTimers();
|
|
478
380
|
});
|
|
479
381
|
describe('drag start by quotes', () => {
|
|
480
|
-
it(
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
act(() => stdin.write(SINGLE_QUOTE));
|
|
485
|
-
expect(keyHandler).not.toHaveBeenCalled();
|
|
486
|
-
});
|
|
487
|
-
it('should start collecting when double quote arrives and not broadcast immediately', async () => {
|
|
382
|
+
it.each([
|
|
383
|
+
{ name: 'single quote', quote: SINGLE_QUOTE },
|
|
384
|
+
{ name: 'double quote', quote: DOUBLE_QUOTE },
|
|
385
|
+
])('should start collecting when $name arrives and not broadcast immediately', async ({ quote }) => {
|
|
488
386
|
const keyHandler = vi.fn();
|
|
489
387
|
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
490
388
|
act(() => result.current.subscribe(keyHandler));
|
|
491
|
-
act(() => stdin.write(
|
|
389
|
+
act(() => stdin.write(quote));
|
|
492
390
|
expect(keyHandler).not.toHaveBeenCalled();
|
|
493
391
|
});
|
|
494
392
|
});
|
|
495
393
|
describe('drag collection and completion', () => {
|
|
496
|
-
it(
|
|
394
|
+
it.each([
|
|
395
|
+
{
|
|
396
|
+
name: 'collect single character inputs during drag mode',
|
|
397
|
+
characters: ['a'],
|
|
398
|
+
expectedText: 'a',
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
name: 'collect multiple characters and complete on timeout',
|
|
402
|
+
characters: ['p', 'a', 't', 'h'],
|
|
403
|
+
expectedText: 'path',
|
|
404
|
+
},
|
|
405
|
+
])('should $name', async ({ characters, expectedText }) => {
|
|
497
406
|
const keyHandler = vi.fn();
|
|
498
407
|
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
499
408
|
act(() => result.current.subscribe(keyHandler));
|
|
500
|
-
// Start by single quote
|
|
501
409
|
act(() => stdin.write(SINGLE_QUOTE));
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
// Character should not be immediately broadcast
|
|
505
|
-
expect(keyHandler).not.toHaveBeenCalled();
|
|
506
|
-
// Fast-forward to completion timeout
|
|
507
|
-
act(() => {
|
|
508
|
-
vi.advanceTimersByTime(DRAG_COMPLETION_TIMEOUT_MS + 10);
|
|
410
|
+
characters.forEach((char) => {
|
|
411
|
+
act(() => stdin.write(char));
|
|
509
412
|
});
|
|
510
|
-
// Should broadcast the collected path as paste (includes starting quote)
|
|
511
|
-
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
512
|
-
name: '',
|
|
513
|
-
paste: true,
|
|
514
|
-
sequence: `${SINGLE_QUOTE}a`,
|
|
515
|
-
}));
|
|
516
|
-
});
|
|
517
|
-
it('should collect multiple characters and complete on timeout', async () => {
|
|
518
|
-
const keyHandler = vi.fn();
|
|
519
|
-
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
520
|
-
act(() => result.current.subscribe(keyHandler));
|
|
521
|
-
// Start by single quote
|
|
522
|
-
act(() => stdin.write(SINGLE_QUOTE));
|
|
523
|
-
// Send multiple characters
|
|
524
|
-
act(() => stdin.write('p'));
|
|
525
|
-
act(() => stdin.write('a'));
|
|
526
|
-
act(() => stdin.write('t'));
|
|
527
|
-
act(() => stdin.write('h'));
|
|
528
|
-
// Characters should not be immediately broadcast
|
|
529
413
|
expect(keyHandler).not.toHaveBeenCalled();
|
|
530
|
-
// Fast-forward to completion timeout
|
|
531
414
|
act(() => {
|
|
532
415
|
vi.advanceTimersByTime(DRAG_COMPLETION_TIMEOUT_MS + 10);
|
|
533
416
|
});
|
|
534
|
-
// Should broadcast the collected path as paste (includes starting quote)
|
|
535
417
|
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
536
418
|
name: '',
|
|
537
419
|
paste: true,
|
|
538
|
-
sequence: `${SINGLE_QUOTE}
|
|
420
|
+
sequence: `${SINGLE_QUOTE}${expectedText}`,
|
|
539
421
|
}));
|
|
540
422
|
});
|
|
541
423
|
});
|
|
@@ -650,9 +532,7 @@ describe('Kitty Sequence Parsing', () => {
|
|
|
650
532
|
vi.useRealTimers();
|
|
651
533
|
});
|
|
652
534
|
it('should treat backslash as a regular keystroke', () => {
|
|
653
|
-
const keyHandler =
|
|
654
|
-
const { result } = renderHook(() => useKeypressContext(), { wrapper });
|
|
655
|
-
act(() => result.current.subscribe(keyHandler));
|
|
535
|
+
const { keyHandler } = setupKeypressTest(true);
|
|
656
536
|
act(() => stdin.write('\\'));
|
|
657
537
|
// Advance timers to trigger the backslash timeout
|
|
658
538
|
act(() => {
|
|
@@ -794,10 +674,10 @@ describe('Kitty Sequence Parsing', () => {
|
|
|
794
674
|
act(() => {
|
|
795
675
|
stdin.emit('data', Buffer.from(char));
|
|
796
676
|
});
|
|
797
|
-
await new Promise((resolve) =>
|
|
677
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
798
678
|
}
|
|
799
679
|
// Should parse once complete
|
|
800
|
-
await
|
|
680
|
+
await waitFor(() => {
|
|
801
681
|
expect(keyHandler).toHaveBeenCalledWith(expect.objectContaining({
|
|
802
682
|
name: 'escape',
|
|
803
683
|
kittyProtocol: true,
|