kfctl 0.1.4

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.
@@ -0,0 +1,392 @@
1
+ import React, { useState, useEffect, useMemo } from 'react';
2
+ import { Box, Text, useInput, useApp, useStdout } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ import SelectInput from 'ink-select-input';
5
+ import { getDeployments, getContexts, getNamespaces, getCurrentContext } from '../k8s/client.js';
6
+ import LogViewer from './LogViewer.js';
7
+ import { getCachedDeployments, setCachedDeployments } from '../utils/cache.js';
8
+ import { getDefaultNamespace, setDefaultNamespace } from '../utils/config.js';
9
+ export default function App({ deploymentName: initialDeployment, namespace: initialNamespace, context: initialContext, tail, maxRetry, timeout, grepPattern, grepAfter = 0, grepBefore = 0, grepContext = 0, grepIgnoreCase = false, grepInvert = false, }) {
10
+ const { exit } = useApp();
11
+ const { stdout } = useStdout();
12
+ // Navigation State
13
+ const [layer, setLayer] = useState('context');
14
+ const [selectedContext, setSelectedContext] = useState(initialContext || '');
15
+ const [selectedNamespace, setSelectedNamespace] = useState(initialNamespace || 'default');
16
+ const [selectedDeployment, setSelectedDeployment] = useState(initialDeployment || '');
17
+ // Data selection state
18
+ const [isSelectingNamespace, setIsSelectingNamespace] = useState(false);
19
+ const [searchText, setSearchText] = useState('');
20
+ const [highlightedNamespace, setHighlightedNamespace] = useState('');
21
+ const [message, setMessage] = useState(null);
22
+ // Data Cache / State
23
+ const [contexts, setContexts] = useState([]);
24
+ const [namespaces, setNamespaces] = useState([]);
25
+ const [deployments, setDeployments] = useState([]);
26
+ // UI State
27
+ const [isLoading, setIsLoading] = useState(false);
28
+ const [error, setError] = useState(null);
29
+ // Initialization logic
30
+ useEffect(() => {
31
+ async function init() {
32
+ if (initialDeployment) {
33
+ if (initialContext)
34
+ setSelectedContext(initialContext);
35
+ setLayer('logs');
36
+ }
37
+ else if (initialContext) {
38
+ setSelectedContext(initialContext);
39
+ setLayer('deployment');
40
+ }
41
+ else {
42
+ loadContexts();
43
+ }
44
+ // Check for default namespace preference
45
+ if (!initialDeployment && initialNamespace === 'default') {
46
+ const pref = getDefaultNamespace();
47
+ if (pref && pref !== 'default') {
48
+ try {
49
+ const ctx = initialContext || getCurrentContext();
50
+ // Fetch namespaces to verify existence
51
+ // Note: This might delay startup slightly or run in parallel?
52
+ // We run it optimistically.
53
+ const nss = await getNamespaces(ctx);
54
+ if (nss.includes(pref)) {
55
+ setSelectedNamespace(pref);
56
+ }
57
+ }
58
+ catch (e) {
59
+ // Ignore error, fallback to default
60
+ }
61
+ }
62
+ }
63
+ }
64
+ init();
65
+ }, []);
66
+ // Clear search text when changing layers or mode
67
+ useEffect(() => {
68
+ setSearchText('');
69
+ setMessage(null);
70
+ }, [layer, isSelectingNamespace]);
71
+ // Loaders
72
+ async function loadContexts() {
73
+ try {
74
+ setIsLoading(true);
75
+ setError(null);
76
+ const ctxs = getContexts();
77
+ setContexts(ctxs);
78
+ // If no context selected yet, try to set current
79
+ if (!selectedContext) {
80
+ try {
81
+ const current = getCurrentContext();
82
+ // We don't auto-select in the UI list (SelectInput doesn't support 'default' index easily without finding it)
83
+ // But we can perhaps highlight it if we find the index.
84
+ // For now, simple list.
85
+ }
86
+ catch (e) { }
87
+ }
88
+ }
89
+ catch (err) {
90
+ setError(`Failed to load contexts: ${err instanceof Error ? err.message : String(err)}`);
91
+ }
92
+ finally {
93
+ setIsLoading(false);
94
+ }
95
+ }
96
+ async function loadNamespaces() {
97
+ try {
98
+ setIsLoading(true);
99
+ setError(null);
100
+ const nss = await getNamespaces(selectedContext || undefined);
101
+ setNamespaces(nss);
102
+ }
103
+ catch (err) {
104
+ setError(`Failed to load namespaces: ${err instanceof Error ? err.message : String(err)}`);
105
+ }
106
+ finally {
107
+ setIsLoading(false);
108
+ }
109
+ }
110
+ // Effects when entering layers
111
+ useEffect(() => {
112
+ if (layer === 'deployment') {
113
+ let active = true;
114
+ const ctx = selectedContext || getCurrentContext();
115
+ const ns = selectedNamespace;
116
+ // 1. Try Cache
117
+ const cached = getCachedDeployments(ctx, ns);
118
+ if (cached && cached.length > 0) {
119
+ setDeployments(cached);
120
+ // We have data, so we don't necessarily need to show 'Loading...'
121
+ // but we are syncing in background.
122
+ // If we want to show strict 'syncing' status we'd need another state.
123
+ // For now, let's keep isLoading false so user can interact immediately.
124
+ setIsLoading(false);
125
+ }
126
+ else {
127
+ setIsLoading(true);
128
+ setDeployments([]);
129
+ }
130
+ setError(null);
131
+ // 2. Background Sync
132
+ (async () => {
133
+ try {
134
+ const deps = await getDeployments(ns, selectedContext || undefined);
135
+ if (active) {
136
+ setCachedDeployments(ctx, ns, deps);
137
+ setDeployments(deps);
138
+ setIsLoading(false);
139
+ if (deps.length === 0) {
140
+ setError(`No deployments found in namespace "${ns}"`);
141
+ }
142
+ }
143
+ }
144
+ catch (err) {
145
+ if (active) {
146
+ // Only show error if we have no deployments (i.e. no cache or cache empty)
147
+ // If we have cache, we might want to swallow the error or show it unobtrusively?
148
+ // But existing error UI blocks the list.
149
+ // So if we have cache, we probably shouldn't set global 'error' that hides the list.
150
+ if (deployments.length === 0 && (!cached || cached.length === 0)) {
151
+ setError(`Failed to load deployments: ${err instanceof Error ? err.message : String(err)}`);
152
+ }
153
+ setIsLoading(false);
154
+ }
155
+ }
156
+ })();
157
+ return () => { active = false; };
158
+ }
159
+ }, [layer, selectedContext, selectedNamespace]);
160
+ useEffect(() => {
161
+ if (isSelectingNamespace) {
162
+ loadNamespaces();
163
+ }
164
+ }, [isSelectingNamespace]);
165
+ // Input Handling for Navigation (Global-ish)
166
+ // We use global input only for ESC when not in specific input modes?
167
+ // Actually, SelectInput consumes input.
168
+ // But we can add a listener that handles 'escape'.
169
+ // Note: distinct useInput hooks might conflict if all active.
170
+ // We should only enable our nav handler when NOT in LogViewer (LogViewer handles its own input).
171
+ useInput((input, key) => {
172
+ // LogViewer handles its own input (including safeExit/q) inside the component
173
+ if (layer === 'logs')
174
+ return;
175
+ if (key.escape) {
176
+ if (isSelectingNamespace) {
177
+ setIsSelectingNamespace(false);
178
+ return;
179
+ }
180
+ // Clear search text if present
181
+ if (searchText) {
182
+ setSearchText('');
183
+ return;
184
+ }
185
+ if (layer === 'deployment') {
186
+ setLayer('context');
187
+ loadContexts(); // Ensure contexts are loaded
188
+ return;
189
+ }
190
+ if (layer === 'context') {
191
+ exit();
192
+ return;
193
+ }
194
+ }
195
+ if (layer === 'deployment' && !isSelectingNamespace && (key.ctrl && input === 'n')) {
196
+ // Switch namespace
197
+ setIsSelectingNamespace(true);
198
+ return;
199
+ }
200
+ // Ensure we always have a valid highlighted namespace for Ctrl+S
201
+ // This handles the case where searching update the list but 'onHighlight' hasn't fired yet
202
+ if (key.ctrl && input === 's' && isSelectingNamespace) {
203
+ const target = highlightedNamespace || (filteredNamespaces.length > 0 ? filteredNamespaces[0] : '');
204
+ if (target) {
205
+ setDefaultNamespace(target);
206
+ setMessage(`Default namespace set to '${target}'`);
207
+ setTimeout(() => setMessage(null), 3000);
208
+ }
209
+ return;
210
+ }
211
+ // Search Input Handling
212
+ // Only capture if not navigating (arrow keys, enter, esc, tab) and not control keys
213
+ if ((layer === 'context' || layer === 'deployment')) {
214
+ // Handle Deletion
215
+ if (key.delete || key.backspace) {
216
+ if (key.meta) {
217
+ // Option+Delete / Meta+Backspace: Remove last word
218
+ setSearchText(prev => {
219
+ const words = prev.trimEnd().split(' ');
220
+ words.pop();
221
+ return words.join(' ') + (words.length > 0 ? ' ' : '');
222
+ });
223
+ return;
224
+ }
225
+ // Standard backspace
226
+ setSearchText(prev => prev.slice(0, -1));
227
+ return;
228
+ }
229
+ // Clear Line (Ctrl+U or Cmd+Delete mapped to ^U)
230
+ if (key.ctrl && input === 'u') {
231
+ setSearchText('');
232
+ return;
233
+ }
234
+ // Alternative Clear (Ctrl+Backspace if supported)
235
+ if (key.ctrl && (key.delete || key.backspace)) {
236
+ setSearchText('');
237
+ return;
238
+ }
239
+ if (input && !key.ctrl && !key.meta && !key.upArrow && !key.downArrow && !key.return && !key.escape && !key.tab) {
240
+ setSearchText(prev => prev + input);
241
+ }
242
+ }
243
+ }, { isActive: layer !== 'logs' });
244
+ // Handlers
245
+ const handleContextSelect = (item) => {
246
+ setSelectedContext(item.value);
247
+ setLayer('deployment');
248
+ };
249
+ const handleDeploymentSelect = (item) => {
250
+ setSelectedDeployment(item.value);
251
+ setLayer('logs');
252
+ };
253
+ const handleNamespaceSelect = (item) => {
254
+ setSelectedNamespace(item.value);
255
+ setIsSelectingNamespace(false);
256
+ // Effect will trigger reload of deployments
257
+ };
258
+ // --- Helpers ---
259
+ const filteredNamespaces = useMemo(() => {
260
+ if (!isSelectingNamespace)
261
+ return [];
262
+ return namespaces.filter(ns => ns.toLowerCase().includes(searchText.toLowerCase()));
263
+ }, [namespaces, searchText, isSelectingNamespace]);
264
+ // Sync highlighted namespace when filtered list changes (e.g. searching)
265
+ useEffect(() => {
266
+ if (isSelectingNamespace && filteredNamespaces.length > 0) {
267
+ // SelectInput resets to index 0 on items change, so we should track that
268
+ setHighlightedNamespace(filteredNamespaces[0]);
269
+ }
270
+ }, [filteredNamespaces, isSelectingNamespace]);
271
+ // --- Render Helpers ---
272
+ // Calculate limit for SelectInput
273
+ const height = stdout?.rows || 20;
274
+ // Accounting for header, search bar, footer
275
+ const listLimit = Math.max(5, height - 7);
276
+ // Context Selection View
277
+ if (layer === 'context') {
278
+ if (isLoading)
279
+ return React.createElement(Text, { color: "green" },
280
+ React.createElement(Spinner, { type: "dots" }),
281
+ " Loading contexts...");
282
+ if (error)
283
+ return React.createElement(Text, { color: "red" },
284
+ "Error: ",
285
+ error);
286
+ const filteredContexts = contexts.filter(c => c.toLowerCase().includes(searchText.toLowerCase()));
287
+ const items = filteredContexts.map(c => ({ label: c, value: c }));
288
+ return (React.createElement(Box, { flexDirection: "column" },
289
+ React.createElement(Box, { borderStyle: "round", borderColor: "blue", paddingX: 1 },
290
+ React.createElement(Text, null, "Select Kubernetes Context (Cluster)")),
291
+ React.createElement(Box, { marginBottom: 1 },
292
+ React.createElement(Text, null,
293
+ "Search: ",
294
+ React.createElement(Text, { color: "yellow" }, searchText),
295
+ searchText ? '_' : '')),
296
+ React.createElement(SelectInput, { items: items, onSelect: handleContextSelect, limit: listLimit }),
297
+ React.createElement(Box, { marginTop: 1 },
298
+ React.createElement(Text, { dimColor: true },
299
+ "Press ",
300
+ React.createElement(Text, { color: "yellow" }, "Enter"),
301
+ " to select, ",
302
+ React.createElement(Text, { color: "yellow" }, "Esc"),
303
+ " to exit"))));
304
+ }
305
+ // Deployment Selection View
306
+ if (layer === 'deployment') {
307
+ if (isSelectingNamespace) {
308
+ // Namespace Switcher Overlay
309
+ if (isLoading)
310
+ return React.createElement(Text, { color: "green" },
311
+ React.createElement(Spinner, { type: "dots" }),
312
+ " Loading namespaces...");
313
+ if (error)
314
+ return React.createElement(Box, { flexDirection: "column" },
315
+ React.createElement(Text, { color: "red" },
316
+ "Error: ",
317
+ error),
318
+ React.createElement(Text, { dimColor: true }, "Press Esc to cancel"));
319
+ const items = filteredNamespaces.map(ns => ({ label: ns, value: ns }));
320
+ return (React.createElement(Box, { flexDirection: "column" },
321
+ React.createElement(Box, { borderStyle: "double", borderColor: "yellow", paddingX: 1 },
322
+ React.createElement(Text, null, "Select Namespace")),
323
+ React.createElement(Box, { marginBottom: 1 },
324
+ React.createElement(Text, null,
325
+ "Search: ",
326
+ React.createElement(Text, { color: "yellow" }, searchText),
327
+ searchText ? '_' : '')),
328
+ message && React.createElement(Text, { color: "green", bold: true }, message),
329
+ React.createElement(SelectInput, { items: items, onSelect: handleNamespaceSelect, onHighlight: (item) => setHighlightedNamespace(item.value), limit: listLimit }),
330
+ React.createElement(Box, { marginTop: 1 },
331
+ React.createElement(Text, { dimColor: true },
332
+ React.createElement(Text, { color: "yellow" }, "Enter"),
333
+ " select |",
334
+ React.createElement(Text, { color: "yellow" }, " Ctrl+S"),
335
+ " set default |",
336
+ React.createElement(Text, { color: "yellow" }, " Esc"),
337
+ " cancel"))));
338
+ }
339
+ const filteredDeployments = deployments.filter(d => d.toLowerCase().includes(searchText.toLowerCase()));
340
+ const items = filteredDeployments.map(d => ({ label: d, value: d }));
341
+ return (React.createElement(Box, { flexDirection: "column" },
342
+ React.createElement(Box, { borderStyle: "round", borderColor: "cyan", paddingX: 1, flexDirection: "row", justifyContent: "space-between" },
343
+ React.createElement(Text, null,
344
+ "Context: ",
345
+ React.createElement(Text, { color: "blue" }, selectedContext || 'current'),
346
+ " | Namespace: ",
347
+ React.createElement(Text, { color: "yellow" }, selectedNamespace))),
348
+ isLoading ? (React.createElement(Text, null,
349
+ React.createElement(Spinner, { type: "dots" }),
350
+ " Loading deployments...")) : error ? (React.createElement(Text, { color: "red" },
351
+ "Error: ",
352
+ error)) : (React.createElement(Box, { flexDirection: "column" },
353
+ React.createElement(Box, { marginBottom: 1 },
354
+ React.createElement(Text, null,
355
+ "Search: ",
356
+ React.createElement(Text, { color: "yellow" }, searchText),
357
+ searchText ? '_' : '')),
358
+ React.createElement(SelectInput, { items: items, onSelect: handleDeploymentSelect, limit: listLimit }))),
359
+ React.createElement(Box, { marginTop: 1 },
360
+ React.createElement(Text, { dimColor: true },
361
+ React.createElement(Text, { color: "yellow" }, "Enter"),
362
+ " select deployment |",
363
+ React.createElement(Text, { color: "yellow" }, " Ctrl+N"),
364
+ " switch namespace |",
365
+ React.createElement(Text, { color: "yellow" }, " Esc"),
366
+ " back"))));
367
+ }
368
+ // Log Viewer View
369
+ if (layer === 'logs') {
370
+ // LogViewer handles its own "q" to exit.
371
+ // BUT we want "ESC" to go back to deployment layer.
372
+ // LogViewer actually calls exit() on 'q'.
373
+ // We might need to Modify LogViewer to take an `onBack` prop?
374
+ // User said: "In each layer... press esc to go back".
375
+ // IF I'm in LogViewer, ESC should go back to Deployment selection.
376
+ // Currently LogViewer's 'q' calls exit().
377
+ // I should ideally modify LogViewer to accept an `onExit` or `onBack` callback instead of calling `exit()` hard.
378
+ // Or I can wrap LogViewer.
379
+ // If I pass a custom key handler to LogViewer?
380
+ // LogViewer is complex.
381
+ // The user request applies to the whole app.
382
+ // "In every layer press esc to go back".
383
+ // Let's modify LogViewer slightly to accept `onBack` prop.
384
+ // If `onBack` is provided, 'q' (or strict ESC?) should call it.
385
+ // User said "Press ESC to go back".
386
+ // LogViewer currently: 'q' to quit.
387
+ // I should add ESC handling in LogViewer to call onBack.
388
+ return (React.createElement(LogViewer, { deployment: selectedDeployment, namespace: selectedNamespace, context: selectedContext, tail: tail, maxRetry: maxRetry, timeout: timeout, grepPattern: grepPattern, grepAfter: grepAfter, grepBefore: grepBefore, grepContext: grepContext, grepIgnoreCase: grepIgnoreCase, grepInvert: grepInvert, onBack: () => setLayer('deployment') }));
389
+ }
390
+ return null;
391
+ }
392
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sourceRoot":"","sources":["../../src/components/App.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ interface LogViewerProps {
3
+ deployment: string;
4
+ namespace: string;
5
+ context?: string;
6
+ tail: number;
7
+ maxRetry: number;
8
+ timeout: number;
9
+ grepPattern?: string;
10
+ grepAfter?: number;
11
+ grepBefore?: number;
12
+ grepContext?: number;
13
+ grepIgnoreCase?: boolean;
14
+ grepInvert?: boolean;
15
+ onBack?: () => void;
16
+ }
17
+ export default function LogViewer({ deployment, namespace, context, tail, maxRetry, timeout, grepPattern: initialPattern, grepAfter: initialAfter, grepBefore: initialBefore, grepContext: initialContext, grepIgnoreCase: initialIgnoreCase, grepInvert: initialInvert, onBack, }: LogViewerProps): React.JSX.Element;
18
+ export {};