Skip to content

Commit

Permalink
refactor: Move default logger to demo app (#1004)
Browse files Browse the repository at this point in the history
When a logger is not specified as a prop of the entry point Hyperview
component, we currently instantiate a default logger that will emit log
lines to the console. This can causes performance issues for devs that
don't implement a logger, and is noticed in the current demo app.

This PR removes the default logger from core, and implement it
explicitly in the demo app. The default log level in the demo app is set
to `log`, to avoid logging behavior logs, which contribute to a more
sluggish UX.

---------

Co-authored-by: flochtililoch <[email protected]>
  • Loading branch information
flochtililoch and flochtililoch authored Dec 3, 2024
1 parent 7e86786 commit 42e1534
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 69 deletions.
3 changes: 2 additions & 1 deletion demo/App.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import './src/gesture-handler';
import { Logger, fetchWrapper, formatDate } from './src/Helpers';
import {
SafeAreaInsetsContext,
SafeAreaProvider,
} from 'react-native-safe-area-context';
import { fetchWrapper, formatDate } from './src/helpers';
import Behaviors from './src/Behaviors';
import { BottomTabBar } from './src/Core';
import { BottomTabBarContextProvider } from './src/Contexts';
Expand Down Expand Up @@ -36,6 +36,7 @@ export default () => (
entrypointUrl={`${Constants.expoConfig?.extra?.baseUrl}/hyperview/public/index.xml`}
fetch={fetchWrapper}
formatDate={formatDate}
logger={new Logger(Logger.Level.log)}
navigationComponents={{
BottomTabBar,
}}
Expand Down
2 changes: 2 additions & 0 deletions demo/src/Helpers/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './misc';
export * from './logger';
62 changes: 62 additions & 0 deletions demo/src/Helpers/logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// eslint-disable-next-line no-shadow
enum Level {
info = 0,
log = 1,
warn = 2,
error = 3,
}

const Levels = [Level.info, Level.log, Level.warn, Level.error];
const LogFunctions = {
[Level.info]: console.info,
[Level.log]: console.log,
[Level.warn]: console.warn,
[Level.error]: console.error,
};

/**
* Handles deferredToString objects by calling toString() prior to forwarding to console
*/
const convertDeferred = (m?: unknown): string | unknown => {
try {
return m?.toString();
} catch (e) {
return m;
}
};

export class Logger {
public static Level = Level;

protected level: number;

constructor(level: Level) {
this.level = Levels.indexOf(level);
}

public log = (m?: unknown, ...p: unknown[]): void => {
this.emitter(Level.log, m, ...p);
};

public info = (m?: unknown, ...p: unknown[]): void => {
this.emitter(Level.info, m, ...p);
};

public warn = (m?: unknown, ...p: unknown[]): void => {
this.emitter(Level.warn, m, ...p);
};

public error = (m?: unknown, ...p: unknown[]): void => {
this.emitter(Level.error, m, ...p);
};

protected emitter = (level: Level, m?: unknown, ...p: unknown[]): void => {
if (this.level > Levels.indexOf(level)) {
return;
}
LogFunctions[level](
convertDeferred(m),
p.map(param => convertDeferred(param)),
);
};
}
File renamed without changes.
39 changes: 0 additions & 39 deletions src/services/logging/default-logger.ts

This file was deleted.

11 changes: 5 additions & 6 deletions src/services/logging/index.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
/* eslint-disable @typescript-eslint/no-explicit-any */

import { DefaultLogger } from './default-logger';
import type { Logger } from './types';

let logger: Logger = new DefaultLogger();
let logger: Logger | null;

export function initialize(loggerInstance: Logger | undefined): void {
if (loggerInstance) {
logger = loggerInstance;
}
}

export const log = (m?: any, ...p: any[]): void => logger.log(m, ...p);
export const info = (m?: any, ...p: any[]): void => logger.info(m, ...p);
export const warn = (m?: any, ...p: any[]): void => logger.warn(m, ...p);
export const error = (m?: any, ...p: any[]): void => logger.error(m, ...p);
export const log = (m?: any, ...p: any[]): void => logger?.log(m, ...p);
export const info = (m?: any, ...p: any[]): void => logger?.info(m, ...p);
export const warn = (m?: any, ...p: any[]): void => logger?.warn(m, ...p);
export const error = (m?: any, ...p: any[]): void => logger?.error(m, ...p);

export type { Logger } from './types';
export { deferredToString } from './tostring-helper';
23 changes: 0 additions & 23 deletions src/services/logging/tostring-helper.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */

import { DefaultLogger } from './default-logger';
import { deferredToString } from './tostring-helper';

const logger = new DefaultLogger();

describe('deferredToString', () => {
describe('with string', () => {
const helper = deferredToString('foo');
Expand Down Expand Up @@ -40,16 +37,6 @@ describe('deferredToString', () => {
expect(helperSpy).toHaveBeenCalledTimes(1);
expect(helperVal).toEqual('foo');
});

it('does call toString when using custom logger', () => {
logger.log('helper', helper);
expect(helperSpy).toHaveBeenCalledTimes(1);
});

it('does call toString on each param when using custom logger', () => {
logger.log('helper', helper, helper, helper);
expect(helperSpy).toHaveBeenCalledTimes(3);
});
});

describe('with func', () => {
Expand Down Expand Up @@ -90,15 +77,5 @@ describe('deferredToString', () => {
expect(expensiveMock).toHaveBeenCalledTimes(1);
expect(helperVal).toEqual('this was expensive');
});

it('does call toString when using custom logger', () => {
logger.log('helper', helper);
expect(expensiveMock).toHaveBeenCalledTimes(1);
});

it('does call toString on each param when using custom logger', () => {
logger.log('helper', helper, helper, helper);
expect(expensiveMock).toHaveBeenCalledTimes(3);
});
});
});

0 comments on commit 42e1534

Please sign in to comment.