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,134 @@
1
+ import * as k8s from '@kubernetes/client-node';
2
+ import { Writable } from 'stream';
3
+ // Helper function to add timeout to promises
4
+ function withTimeout(promise, timeoutMs, operation) {
5
+ return Promise.race([
6
+ promise,
7
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms: ${operation}`)), timeoutMs)),
8
+ ]);
9
+ }
10
+ export function getContexts() {
11
+ const kc = new k8s.KubeConfig();
12
+ kc.loadFromDefault();
13
+ return kc.contexts.map(ctx => ctx.name);
14
+ }
15
+ export function getCurrentContext() {
16
+ const kc = new k8s.KubeConfig();
17
+ kc.loadFromDefault();
18
+ return kc.currentContext;
19
+ }
20
+ export async function getNamespaces(context, timeoutMs = 5000) {
21
+ const kc = new k8s.KubeConfig();
22
+ kc.loadFromDefault();
23
+ if (context) {
24
+ kc.setCurrentContext(context);
25
+ }
26
+ const coreApi = kc.makeApiClient(k8s.CoreV1Api);
27
+ try {
28
+ const response = await withTimeout(coreApi.listNamespace(), timeoutMs, `listing namespaces${context ? ` (context: ${context})` : ''}`);
29
+ return response.items.map((item) => item.metadata?.name || '').filter(Boolean);
30
+ }
31
+ catch (error) {
32
+ throw new Error(`Failed to list namespaces: ${error instanceof Error ? error.message : String(error)}`);
33
+ }
34
+ }
35
+ export async function getDeployments(namespace, context, timeoutMs = 15000) {
36
+ const kc = new k8s.KubeConfig();
37
+ kc.loadFromDefault();
38
+ if (context) {
39
+ kc.setCurrentContext(context);
40
+ }
41
+ const appsApi = kc.makeApiClient(k8s.AppsV1Api);
42
+ try {
43
+ const response = await withTimeout(appsApi.listNamespacedDeployment({ namespace }), timeoutMs, `listing deployments in namespace "${namespace}"${context ? ` (context: ${context})` : ''}`);
44
+ return response.items.map((item) => item.metadata?.name || '').filter(Boolean);
45
+ }
46
+ catch (error) {
47
+ if (error instanceof Error && error.message.includes('timed out')) {
48
+ throw new Error(`Connection timeout: Unable to connect to cluster${context ? ` "${context}"` : ''}. Please check your network connection and cluster availability.`);
49
+ }
50
+ throw new Error(`Failed to list deployments: ${error instanceof Error ? error.message : String(error)}`);
51
+ }
52
+ }
53
+ export async function followLogs(deployment, namespace, context, tailLines, onLog, onError, onProgress, timeoutMs = 10000) {
54
+ const kc = new k8s.KubeConfig();
55
+ kc.loadFromDefault();
56
+ if (context) {
57
+ kc.setCurrentContext(context);
58
+ }
59
+ const coreApi = kc.makeApiClient(k8s.CoreV1Api);
60
+ const appsApi = kc.makeApiClient(k8s.AppsV1Api);
61
+ try {
62
+ // Get deployment
63
+ onProgress?.('Fetching deployment info...');
64
+ let deploymentResponse;
65
+ try {
66
+ deploymentResponse = await withTimeout(appsApi.readNamespacedDeployment({ name: deployment, namespace }), timeoutMs, `reading deployment "${deployment}"`);
67
+ }
68
+ catch (error) {
69
+ if (error instanceof Error && error.message.includes('timed out')) {
70
+ throw new Error(`Connection timeout: Unable to connect to cluster${context ? ` "${context}"` : ''}. Please check your network connection and cluster availability.`);
71
+ }
72
+ if (error.response?.statusCode === 404) {
73
+ throw new Error(`Deployment "${deployment}" not found in namespace "${namespace}". Use 'kubectl get deployments -n ${namespace}' to list available deployments.`);
74
+ }
75
+ throw error;
76
+ }
77
+ const selector = deploymentResponse.spec?.selector?.matchLabels;
78
+ if (!selector) {
79
+ throw new Error('Deployment has no selector labels');
80
+ }
81
+ // Convert selector to label selector string
82
+ const labelSelector = Object.entries(selector)
83
+ .map(([key, value]) => `${key}=${value}`)
84
+ .join(',');
85
+ // Get pods
86
+ onProgress?.('Finding pods...');
87
+ const podsResponse = await withTimeout(coreApi.listNamespacedPod({
88
+ namespace,
89
+ labelSelector,
90
+ }), timeoutMs, `listing pods for deployment "${deployment}"`);
91
+ if (podsResponse.items.length === 0) {
92
+ throw new Error(`No pods found for deployment "${deployment}". The deployment may have 0 replicas.`);
93
+ }
94
+ // Follow logs from the first running pod
95
+ const pod = podsResponse.items.find((p) => p.status?.phase === 'Running');
96
+ if (!pod || !pod.metadata?.name) {
97
+ throw new Error('No running pods found');
98
+ }
99
+ const podName = pod.metadata.name;
100
+ const containerName = pod.spec?.containers[0]?.name || '';
101
+ // Create log stream
102
+ onProgress?.(`Connecting to pod ${podName}...`);
103
+ const logStream = new k8s.Log(kc);
104
+ const stream = new Writable({
105
+ write(chunk, encoding, callback) {
106
+ const lines = chunk.toString().split('\n').filter(Boolean);
107
+ lines.forEach((line) => {
108
+ onLog({
109
+ pod: podName,
110
+ container: containerName,
111
+ line,
112
+ timestamp: new Date(),
113
+ });
114
+ });
115
+ callback();
116
+ },
117
+ });
118
+ try {
119
+ await logStream.log(namespace, podName, containerName, stream, {
120
+ follow: true,
121
+ tailLines,
122
+ pretty: false,
123
+ timestamps: false,
124
+ });
125
+ }
126
+ catch (error) {
127
+ onError(error instanceof Error ? error : new Error(String(error)));
128
+ }
129
+ }
130
+ catch (error) {
131
+ onError(error instanceof Error ? error : new Error(String(error)));
132
+ }
133
+ }
134
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/k8s/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getCachedDeployments(context: string, namespace: string): string[] | null;
2
+ export declare function setCachedDeployments(context: string, namespace: string, deployments: string[]): void;
@@ -0,0 +1,40 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ const CACHE_FILE = path.join(os.homedir(), '.kfc_cache.json');
5
+ let memoryCache = { deployments: {} };
6
+ let isLoaded = false;
7
+ function loadCache() {
8
+ if (isLoaded)
9
+ return;
10
+ try {
11
+ if (fs.existsSync(CACHE_FILE)) {
12
+ const content = fs.readFileSync(CACHE_FILE, 'utf-8');
13
+ memoryCache = JSON.parse(content);
14
+ }
15
+ }
16
+ catch (e) {
17
+ // ignore errors
18
+ }
19
+ isLoaded = true;
20
+ }
21
+ function saveCache() {
22
+ try {
23
+ fs.writeFileSync(CACHE_FILE, JSON.stringify(memoryCache, null, 2));
24
+ }
25
+ catch (e) {
26
+ // ignore
27
+ }
28
+ }
29
+ export function getCachedDeployments(context, namespace) {
30
+ loadCache();
31
+ const key = `${context}:${namespace}`;
32
+ return memoryCache.deployments[key] || null;
33
+ }
34
+ export function setCachedDeployments(context, namespace, deployments) {
35
+ loadCache();
36
+ const key = `${context}:${namespace}`;
37
+ memoryCache.deployments[key] = deployments;
38
+ saveCache();
39
+ }
40
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAM9D,IAAI,WAAW,GAAc,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,SAAS,SAAS;IACd,IAAI,QAAQ;QAAE,OAAO;IACrB,IAAI,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrD,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,gBAAgB;IACpB,CAAC;IACD,QAAQ,GAAG,IAAI,CAAC;AACpB,CAAC;AAED,SAAS,SAAS;IACd,IAAI,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,SAAS;IACb,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,SAAiB;IACnE,SAAS,EAAE,CAAC;IACZ,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;IACtC,OAAO,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,SAAiB,EAAE,WAAqB;IAC1F,SAAS,EAAE,CAAC;IACZ,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;IACtC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;IAC3C,SAAS,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function colorizeLogLine(line: string): string;
@@ -0,0 +1,165 @@
1
+ import chalk from 'chalk';
2
+ // ASP.NET Core log format: [13:29:11.454 INF]
3
+ const aspNetLogPattern = /\[(\d{2}:\d{2}:\d{2}\.\d+)\s+(INF|ERR|WRN|DBG|TRC|FATAL|ERROR|WARN|WARNING|INFO|DEBUG|TRACE)\]/;
4
+ export function colorizeLogLine(line) {
5
+ let result = line;
6
+ // Handle ASP.NET Core log format: [13:29:11.454 INF]
7
+ const aspNetMatch = result.match(aspNetLogPattern);
8
+ if (aspNetMatch) {
9
+ const [fullMatch, time, level] = aspNetMatch;
10
+ const coloredTime = chalk.blue(time);
11
+ let coloredLevel;
12
+ // Color based on log level
13
+ const upperLevel = level.toUpperCase();
14
+ if (upperLevel.includes('ERR') || upperLevel.includes('FATAL')) {
15
+ coloredLevel = chalk.red.bold(level);
16
+ }
17
+ else if (upperLevel.includes('WRN') || upperLevel.includes('WARN')) {
18
+ coloredLevel = chalk.yellow.bold(level);
19
+ }
20
+ else if (upperLevel.includes('INF') || upperLevel.includes('INFO') || upperLevel.includes('SUCCESS')) {
21
+ coloredLevel = chalk.green.bold(level);
22
+ }
23
+ else if (upperLevel.includes('DBG') || upperLevel.includes('DEBUG')) {
24
+ coloredLevel = chalk.cyan.bold(level);
25
+ }
26
+ else if (upperLevel.includes('TRC') || upperLevel.includes('TRACE')) {
27
+ coloredLevel = chalk.gray.bold(level);
28
+ }
29
+ else {
30
+ coloredLevel = chalk.white(level);
31
+ }
32
+ const coloredBracket = chalk.gray('[') + coloredTime + ' ' + coloredLevel + chalk.gray(']');
33
+ result = result.replace(fullMatch, coloredBracket);
34
+ }
35
+ // Check if line is JSON
36
+ const trimmed = result.trim();
37
+ if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
38
+ try {
39
+ const parsed = JSON.parse(trimmed);
40
+ return colorizeJSON(parsed);
41
+ }
42
+ catch {
43
+ // Not valid JSON, continue with regular colorization
44
+ }
45
+ }
46
+ // Apply syntax highlighting to the rest
47
+ result = colorizeSyntax(result);
48
+ return result;
49
+ }
50
+ function colorizeSyntax(text) {
51
+ // Store already colored segments to avoid re-coloring
52
+ const segments = [];
53
+ // Pattern matching with non-overlapping replacement
54
+ const patterns = [
55
+ // HTTP status codes (with context)
56
+ {
57
+ regex: /StatusCode:\s*(\d{3})/gi,
58
+ colorFn: (match) => {
59
+ const code = parseInt(match.match(/\d{3}/)?.[0] || '0');
60
+ const num = match.match(/\d{3}/)?.[0] || '';
61
+ if (code >= 200 && code < 300)
62
+ return match.replace(num, chalk.green(num));
63
+ if (code >= 300 && code < 400)
64
+ return match.replace(num, chalk.cyan(num));
65
+ if (code >= 400 && code < 500)
66
+ return match.replace(num, chalk.yellow(num));
67
+ if (code >= 500)
68
+ return match.replace(num, chalk.red(num));
69
+ return match;
70
+ }
71
+ },
72
+ // Duration values
73
+ {
74
+ regex: /Duration:\s*[\d.]+/gi,
75
+ colorFn: (match) => chalk.red(match)
76
+ },
77
+ // HTTP methods
78
+ {
79
+ regex: /\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\b/g,
80
+ colorFn: (match) => chalk.blue(match)
81
+ },
82
+ // API paths
83
+ {
84
+ regex: /\/api\/[a-zA-Z0-9_\-./]*/g,
85
+ colorFn: (match) => chalk.magenta(match)
86
+ },
87
+ // URLs (before general paths)
88
+ {
89
+ regex: /https?:\/\/[^\s"]+/g,
90
+ colorFn: (match) => chalk.blue.underline(match)
91
+ },
92
+ // UUIDs
93
+ {
94
+ regex: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,
95
+ colorFn: (match) => chalk.yellow(match)
96
+ },
97
+ // IP addresses
98
+ {
99
+ regex: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g,
100
+ colorFn: (match) => chalk.magenta(match)
101
+ },
102
+ // JSON-like quoted strings (simple approach)
103
+ {
104
+ regex: /"([^"\\]|\\.)*"/g,
105
+ colorFn: (match) => chalk.green(match)
106
+ },
107
+ // Booleans
108
+ {
109
+ regex: /\b(true|false)\b/g,
110
+ colorFn: (match) => chalk.yellow(match)
111
+ },
112
+ // Null
113
+ {
114
+ regex: /\bnull\b/g,
115
+ colorFn: (match) => chalk.gray(match)
116
+ },
117
+ // Numbers (last to avoid conflicts)
118
+ {
119
+ regex: /\b\d+\.?\d*\b/g,
120
+ colorFn: (match) => chalk.cyan(match)
121
+ },
122
+ ];
123
+ let result = text;
124
+ // Apply patterns one by one
125
+ for (const { regex, colorFn } of patterns) {
126
+ result = result.replace(regex, colorFn);
127
+ }
128
+ return result;
129
+ }
130
+ function colorizeJSON(obj, indent = 0) {
131
+ const indentStr = ' '.repeat(indent);
132
+ if (obj === null) {
133
+ return chalk.gray('null');
134
+ }
135
+ if (typeof obj === 'boolean') {
136
+ return chalk.yellow(String(obj));
137
+ }
138
+ if (typeof obj === 'number') {
139
+ return chalk.cyan(String(obj));
140
+ }
141
+ if (typeof obj === 'string') {
142
+ return chalk.green(`"${obj}"`);
143
+ }
144
+ if (Array.isArray(obj)) {
145
+ if (obj.length === 0) {
146
+ return chalk.gray('[]');
147
+ }
148
+ const items = obj.map(item => `${indentStr} ${colorizeJSON(item, indent + 1)}`);
149
+ return chalk.gray('[') + '\n' + items.join(',\n') + '\n' + indentStr + chalk.gray(']');
150
+ }
151
+ if (typeof obj === 'object') {
152
+ const keys = Object.keys(obj);
153
+ if (keys.length === 0) {
154
+ return chalk.gray('{}');
155
+ }
156
+ const items = keys.map(key => {
157
+ const coloredKey = chalk.cyan(`"${key}"`);
158
+ const coloredValue = colorizeJSON(obj[key], indent + 1);
159
+ return `${indentStr} ${coloredKey}: ${coloredValue}`;
160
+ });
161
+ return chalk.gray('{') + '\n' + items.join(',\n') + '\n' + indentStr + chalk.gray('}');
162
+ }
163
+ return String(obj);
164
+ }
165
+ //# sourceMappingURL=colorize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorize.js","sourceRoot":"","sources":["../../src/utils/colorize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface Config {
2
+ defaultNamespace?: string;
3
+ }
4
+ export declare function loadConfig(): Config;
5
+ export declare function saveConfig(config: Config): void;
6
+ export declare function getDefaultNamespace(): string | undefined;
7
+ export declare function setDefaultNamespace(namespace: string): void;
8
+ export {};
@@ -0,0 +1,33 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ const CONFIG_FILE = path.join(os.homedir(), '.kfc-config.json');
5
+ export function loadConfig() {
6
+ try {
7
+ if (fs.existsSync(CONFIG_FILE)) {
8
+ const content = fs.readFileSync(CONFIG_FILE, 'utf-8');
9
+ return JSON.parse(content);
10
+ }
11
+ }
12
+ catch (error) {
13
+ // Ignore errors, return empty config
14
+ }
15
+ return {};
16
+ }
17
+ export function saveConfig(config) {
18
+ try {
19
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
20
+ }
21
+ catch (error) {
22
+ console.error('Failed to save config:', error);
23
+ }
24
+ }
25
+ export function getDefaultNamespace() {
26
+ return loadConfig().defaultNamespace;
27
+ }
28
+ export function setDefaultNamespace(namespace) {
29
+ const config = loadConfig();
30
+ config.defaultNamespace = namespace;
31
+ saveConfig(config);
32
+ }
33
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAMhE,MAAM,UAAU,UAAU;IACzB,IAAI,CAAC;QACJ,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,qCAAqC;IACtC,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACxC,IAAI,CAAC;QACJ,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB;IAClC,OAAO,UAAU,EAAE,CAAC,gBAAgB,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACpD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAC;IACpC,UAAU,CAAC,MAAM,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Log filtering utilities
3
+ * Pure functions for filtering and processing log lines
4
+ */
5
+ export interface BufferedLine {
6
+ podPrefix: string;
7
+ line: string;
8
+ coloredLine: string;
9
+ timestamp: number;
10
+ }
11
+ export interface FilteredLine {
12
+ bufferedLine: BufferedLine;
13
+ isMatch: boolean;
14
+ index: number;
15
+ }
16
+ export interface FilterOptions {
17
+ pattern: string;
18
+ ignoreCase: boolean;
19
+ invert: boolean;
20
+ contextLines: number;
21
+ beforeLines: number;
22
+ afterLines: number;
23
+ }
24
+ /**
25
+ * Check if a line should be shown based on filter criteria
26
+ * @note This creates a new RegExp every call. For bulk filtering, use filterLines.
27
+ */
28
+ export declare function shouldShowLine(line: string, pattern: string, ignoreCase: boolean, invert: boolean): boolean;
29
+ /**
30
+ * Filter lines based on pattern and context
31
+ */
32
+ export declare function filterLines(lines: BufferedLine[], pattern: string, ignoreCase: boolean, invert: boolean, contextLines: number, beforeLines: number, afterLines: number): FilteredLine[];
33
+ /**
34
+ * Get indices of lines that should be shown with context
35
+ */
36
+ export declare function getContextIndices(matchIndices: Set<number>, totalLines: number, before: number, after: number): Set<number>;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Log filtering utilities
3
+ * Pure functions for filtering and processing log lines
4
+ */
5
+ /**
6
+ * Check if a line should be shown based on filter criteria
7
+ * @note This creates a new RegExp every call. For bulk filtering, use filterLines.
8
+ */
9
+ export function shouldShowLine(line, pattern, ignoreCase, invert) {
10
+ if (!pattern)
11
+ return true;
12
+ try {
13
+ const regex = new RegExp(pattern, ignoreCase ? 'i' : '');
14
+ const matches = regex.test(line);
15
+ return invert ? !matches : matches;
16
+ }
17
+ catch (e) {
18
+ // Fallback for invalid regex: show line (safer than hiding)
19
+ return true;
20
+ }
21
+ }
22
+ /**
23
+ * Filter lines based on pattern and context
24
+ */
25
+ export function filterLines(lines, pattern, ignoreCase, invert, contextLines, beforeLines, afterLines) {
26
+ if (!pattern) {
27
+ return lines.map((line, index) => ({
28
+ bufferedLine: line,
29
+ isMatch: false,
30
+ index,
31
+ }));
32
+ }
33
+ let regex;
34
+ try {
35
+ regex = new RegExp(pattern, ignoreCase ? 'i' : '');
36
+ }
37
+ catch (e) {
38
+ // Invalid regex: return all lines as non-matches (same as no filter)
39
+ return lines.map((line, index) => ({
40
+ bufferedLine: line,
41
+ isMatch: false,
42
+ index,
43
+ }));
44
+ }
45
+ // Find matching lines
46
+ const matchIndices = new Set();
47
+ lines.forEach((line, index) => {
48
+ const matches = regex.test(line.line);
49
+ const isMatch = invert ? !matches : matches;
50
+ if (isMatch) {
51
+ matchIndices.add(index);
52
+ }
53
+ });
54
+ // Add context lines
55
+ const linesToShow = new Set();
56
+ const before = contextLines > 0 ? contextLines : beforeLines;
57
+ const after = contextLines > 0 ? contextLines : afterLines;
58
+ matchIndices.forEach((matchIdx) => {
59
+ // Add the match itself
60
+ linesToShow.add(matchIdx);
61
+ // Add before context
62
+ for (let i = Math.max(0, matchIdx - before); i < matchIdx; i++) {
63
+ linesToShow.add(i);
64
+ }
65
+ // Add after context
66
+ for (let i = matchIdx + 1; i <= Math.min(lines.length - 1, matchIdx + after); i++) {
67
+ linesToShow.add(i);
68
+ }
69
+ });
70
+ // Convert to array and sort
71
+ const result = [];
72
+ Array.from(linesToShow)
73
+ .sort((a, b) => a - b)
74
+ .forEach((index) => {
75
+ result.push({
76
+ bufferedLine: lines[index],
77
+ isMatch: matchIndices.has(index),
78
+ index,
79
+ });
80
+ });
81
+ return result;
82
+ }
83
+ /**
84
+ * Get indices of lines that should be shown with context
85
+ */
86
+ export function getContextIndices(matchIndices, totalLines, before, after) {
87
+ const indices = new Set();
88
+ matchIndices.forEach((matchIdx) => {
89
+ // Add the match itself
90
+ indices.add(matchIdx);
91
+ // Add before context
92
+ for (let i = Math.max(0, matchIdx - before); i < matchIdx; i++) {
93
+ indices.add(i);
94
+ }
95
+ // Add after context
96
+ for (let i = matchIdx + 1; i <= Math.min(totalLines - 1, matchIdx + after); i++) {
97
+ indices.add(i);
98
+ }
99
+ });
100
+ return indices;
101
+ }
102
+ //# sourceMappingURL=logFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logFilter.js","sourceRoot":"","sources":["../../src/utils/logFilter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Log highlighting utilities
3
+ * Functions for highlighting matching text in log lines
4
+ */
5
+ /**
6
+ * Highlight matching text in a line with yellow background
7
+ */
8
+ export declare function highlightMatches(text: string, pattern: string, ignoreCase: boolean): string;
9
+ /**
10
+ * Check if text contains a match for the pattern
11
+ */
12
+ export declare function hasMatch(text: string, pattern: string, ignoreCase: boolean): boolean;
13
+ /**
14
+ * Get all matches in a text
15
+ */
16
+ export declare function getMatches(text: string, pattern: string, ignoreCase: boolean): string[];
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Log highlighting utilities
3
+ * Functions for highlighting matching text in log lines
4
+ */
5
+ import chalk from 'chalk';
6
+ /**
7
+ * Highlight matching text in a line with yellow background
8
+ */
9
+ export function highlightMatches(text, pattern, ignoreCase) {
10
+ if (!pattern)
11
+ return text;
12
+ try {
13
+ const regex = new RegExp(pattern, ignoreCase ? 'gi' : 'g');
14
+ return text.replace(regex, (match) => chalk.black.bgYellow(match));
15
+ }
16
+ catch (error) {
17
+ // If regex is invalid, return original text
18
+ return text;
19
+ }
20
+ }
21
+ /**
22
+ * Check if text contains a match for the pattern
23
+ */
24
+ export function hasMatch(text, pattern, ignoreCase) {
25
+ if (!pattern)
26
+ return false;
27
+ try {
28
+ const regex = new RegExp(pattern, ignoreCase ? 'i' : '');
29
+ return regex.test(text);
30
+ }
31
+ catch (error) {
32
+ return false;
33
+ }
34
+ }
35
+ /**
36
+ * Get all matches in a text
37
+ */
38
+ export function getMatches(text, pattern, ignoreCase) {
39
+ if (!pattern)
40
+ return [];
41
+ try {
42
+ const regex = new RegExp(pattern, ignoreCase ? 'gi' : 'g');
43
+ return text.match(regex) || [];
44
+ }
45
+ catch (error) {
46
+ return [];
47
+ }
48
+ }
49
+ //# sourceMappingURL=logHighlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logHighlight.js","sourceRoot":"","sources":["../../src/utils/logHighlight.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC/B,IAAY,EACZ,OAAe,EACf,UAAmB;IAEnB,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,4CAA4C;QAC5C,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CACvB,IAAY,EACZ,OAAe,EACf,UAAmB;IAEnB,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAE3B,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACzB,IAAY,EACZ,OAAe,EACf,UAAmB;IAEnB,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC"}