Skip to content

Commit 4ffb8ee

Browse files
committed
feat: add configurable logger with quiet mode and ignoreLogs support
1 parent 7d2f461 commit 4ffb8ee

File tree

3 files changed

+100
-9
lines changed

3 files changed

+100
-9
lines changed

src/index.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import { createRequire } from 'node:module';
44
import type {
55
Channel,
66
Direction,
7+
InstallOptions,
78
IpcEventData,
89
IpcEventDataIndexed,
910
ServiceWorkerDetails,
1011
} from './types/shared';
1112
import { excludedIpcChannels } from './common/constants';
13+
import { logger } from './utils/Logger';
1214

1315
interface TrackIpcEventOptions {
1416
direction: Direction;
@@ -65,7 +67,7 @@ function trackIpcEvent({
6567
if (excludedIpcChannels.includes(channel)) return;
6668

6769
if (!devtronSW) {
68-
console.error('The service-worker for Devtron is not registered yet. Cannot track IPC event.');
70+
logger.warn('The service-worker for Devtron is not registered yet. Cannot track IPC event.');
6971
return;
7072
}
7173

@@ -208,7 +210,7 @@ async function startServiceWorker(ses: Electron.Session, extension: Electron.Ext
208210
registerIpcListeners(ses, sw);
209211
registerServiceWorkerSendListener(ses, sw);
210212
} catch (error) {
211-
console.warn(`Failed to start Devtron service-worker (${error}), trying again...`);
213+
logger.warn(`Failed to start Devtron service-worker (${error}), trying again...`);
212214
/**
213215
* This is a workaround for the issue where the Devtron service-worker fails to start
214216
* when the Electron app is launched for the first time, or when the service worker
@@ -226,12 +228,12 @@ async function startServiceWorker(ses: Electron.Session, extension: Electron.Ext
226228
registerIpcListeners(ses, sw);
227229
registerServiceWorkerSendListener(ses, sw);
228230
ses.serviceWorkers.removeListener('registration-completed', handleDetails);
229-
console.log(`Devtron service-worker started successfully`);
231+
logger.info(`Devtron service-worker started successfully`);
230232
}
231233
};
232234
ses.serviceWorkers.on('registration-completed', handleDetails);
233235
} catch (error) {
234-
console.error('Failed to start Devtron service-worker:', error);
236+
logger.error('Failed to start Devtron service-worker:', error);
235237
}
236238
}
237239
}
@@ -373,10 +375,14 @@ function patchIpcMain() {
373375
};
374376
}
375377

376-
async function install() {
378+
async function install(options: InstallOptions = {}) {
377379
if (isInstalled) return;
378380
isInstalled = true;
379381

382+
// set logger options
383+
if (options.quiet) logger.setQuiet(true);
384+
if (options.ignoreLogs) logger.setIgnoreLogs(options.ignoreLogs); // overrides `quiet` option
385+
380386
patchIpcMain();
381387

382388
const installToSession = async (ses: Electron.Session) => {
@@ -410,9 +416,9 @@ async function install() {
410416
const extensionPath = path.resolve(serviceWorkerPreloadPath, '..', '..', 'extension');
411417
devtron = await ses.extensions.loadExtension(extensionPath, { allowFileAccess: true });
412418
await startServiceWorker(ses, devtron);
413-
console.log('Devtron loaded successfully');
419+
logger.info('Devtron loaded successfully');
414420
} catch (error) {
415-
console.error('Failed to load Devtron:', error);
421+
logger.error('Failed to load Devtron:', error);
416422
}
417423
};
418424

@@ -430,12 +436,12 @@ async function install() {
430436
*/
431437
async function getEvents(): Promise<IpcEventDataIndexed[]> {
432438
if (!isInstalled) {
433-
console.warn('You are trying to get IPC events before Devtron is installed.');
439+
logger.warn('You are trying to get IPC events before Devtron is installed.');
434440
return [];
435441
}
436442

437443
if (!devtronSW) {
438-
console.warn('Devtron service-worker is not registered yet. Cannot get IPC events.');
444+
logger.warn('Devtron service-worker is not registered yet. Cannot get IPC events.');
439445
return [];
440446
}
441447

src/types/shared.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,30 @@ export interface IpcEventData {
2727
uuid?: UUID; // UUID to match requests and responses (for `invoke` and `sendSync` methods on `ipcRenderer`)
2828
}
2929

30+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
31+
32+
export interface InstallOptions {
33+
/**
34+
* Suppresses all logs except 'error' level logs from
35+
* appearing in the terminal.
36+
*
37+
* Precisely, it ignores 'debug', 'info', and 'warn' logs.
38+
*
39+
* @default false
40+
*/
41+
quiet?: boolean;
42+
43+
/**
44+
* List of log levels to ignore, e.g. ['debug', 'info'].
45+
* Overrides the `quiet` option if both are set.
46+
*
47+
* Possible values for log levels are: 'debug', 'info', 'warn', 'error'
48+
*
49+
* @default [] (no log levels are ignored)
50+
*/
51+
ignoreLogs?: LogLevel[];
52+
}
53+
3054
/* ------------------------------------------------------ */
3155

3256
/* ---------------------- EXTENSION --------------------- */

src/utils/Logger.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import type { LogLevel } from '../types/shared';
2+
3+
class Logger {
4+
private quiet = false;
5+
private ignoreLogs: Set<LogLevel> = new Set();
6+
7+
setQuiet(value: boolean) {
8+
if (this.quiet === value) return; // no change
9+
10+
this.quiet = value;
11+
12+
// if quiet is true, ignore all logs except 'error'
13+
if (this.quiet) {
14+
this.ignoreLogs.add('debug');
15+
this.ignoreLogs.add('info');
16+
this.ignoreLogs.add('warn');
17+
} else {
18+
this.ignoreLogs.delete('debug');
19+
this.ignoreLogs.delete('info');
20+
this.ignoreLogs.delete('warn');
21+
}
22+
}
23+
24+
setIgnoreLogs(levels: LogLevel[]) {
25+
this.ignoreLogs = new Set(levels);
26+
}
27+
28+
private log(level: LogLevel, ...args: any[]) {
29+
if (this.ignoreLogs.has(level)) return;
30+
31+
switch (level) {
32+
case 'debug':
33+
console.debug(...args);
34+
break;
35+
case 'info':
36+
console.log(...args);
37+
break;
38+
case 'warn':
39+
console.warn(...args);
40+
break;
41+
case 'error':
42+
console.error(...args);
43+
break;
44+
}
45+
}
46+
47+
debug(...args: any[]) {
48+
this.log('debug', ...args);
49+
}
50+
info(...args: any[]) {
51+
this.log('info', ...args);
52+
}
53+
warn(...args: any[]) {
54+
this.log('warn', ...args);
55+
}
56+
error(...args: any[]) {
57+
this.log('error', ...args);
58+
}
59+
}
60+
61+
export const logger = new Logger();

0 commit comments

Comments
 (0)