chore: add TypeScript tooling (#891)

* chore: add TypeScript tooling

* chore: remove unused tsconfig and migration script

* update settings

* add knip config

* format

* more reliable circuits tests

* fix workflow

* fix types

* updates

* ts updates

* more updates

* fix upgrade

* fixes
This commit is contained in:
Justin Hernandez
2025-08-13 21:02:07 -07:00
committed by GitHub
parent ae5e8ccd0f
commit 07addb2a9a
30 changed files with 800 additions and 220 deletions

View File

@@ -3,10 +3,9 @@
import type { configLoggerType } from 'react-native-logs';
import { logger } from 'react-native-logs';
import { interceptConsole } from './logger/consoleInterceptor';
import { lokiTransport } from './logger/lokiTransport';
import './logger/nativeLoggerBridge';
import { interceptConsole } from '@/utils/logger/consoleInterceptor';
import { lokiTransport } from '@/utils/logger/lokiTransport';
import { setupNativeLoggerBridge } from '@/utils/logger/nativeLoggerBridge';
export {
AppLogger,
@@ -41,9 +40,6 @@ const defaultConfig: configLoggerType<any, any> = {
const Logger = logger.createLogger(defaultConfig);
// Initialize console interceptor to route console logs to Loki
interceptConsole();
// loggers based on src/consts/analytics.ts
const AppLogger = Logger.extend('APP');
const NotificationLogger = Logger.extend('NOTIFICATION');
@@ -58,6 +54,9 @@ const DocumentLogger = Logger.extend('DOCUMENT');
//Native Modules
const NfcLogger = Logger.extend('NFC');
// Initialize console interceptor to route console logs to Loki
interceptConsole(AppLogger);
// Define log levels
export const logLevels = {
debug: 0,
@@ -65,3 +64,7 @@ export const logLevels = {
warn: 2,
error: 3,
};
// Initialize native logger bridge after all loggers are defined
// This avoids module cycle by injecting dependencies instead of importing them
setupNativeLoggerBridge({ AppLogger, NfcLogger, Logger });

View File

@@ -1,7 +1,5 @@
// SPDX-License-Identifier: BUSL-1.1; Copyright (c) 2025 Social Connect Labs, Inc.; Licensed under BUSL-1.1 (see LICENSE); Apache-2.0 from 2029-06-11
import { AppLogger } from '../logger';
// Store original console methods
const originalConsole = {
log: console.log,
@@ -11,29 +9,29 @@ const originalConsole = {
debug: console.debug,
};
const interceptConsole = () => {
const interceptConsole = (appLogger: any) => {
console.log = (...args: any[]) => {
AppLogger.info(...args);
appLogger.info(...args);
originalConsole.log(...args);
};
console.info = (...args: any[]) => {
AppLogger.info(...args);
appLogger.info(...args);
originalConsole.info(...args);
};
console.warn = (...args: any[]) => {
AppLogger.warn(...args);
appLogger.warn(...args);
originalConsole.warn(...args);
};
console.error = (...args: any[]) => {
AppLogger.error(...args);
appLogger.error(...args);
originalConsole.error(...args);
};
console.debug = (...args: any[]) => {
AppLogger.debug(...args);
appLogger.debug(...args);
originalConsole.debug(...args);
};
};

View File

@@ -133,6 +133,13 @@ registerDocumentChangeCallback((isMock: boolean) => {
isCurrentPassportMockFlag = isMock;
});
export const cleanupLokiTransport = () => {
try {
appStateSubscription.remove?.();
} catch {}
flushLokiTransport();
};
// Export flush function for manual flushing if needed
export const flushLokiTransport = () => {
if (batch.length > 0) {
@@ -145,6 +152,17 @@ export const flushLokiTransport = () => {
}
};
const handleAppStateChange = (nextAppState: AppStateStatus) => {
if (nextAppState === 'background' || nextAppState === 'inactive') {
flushLokiTransport();
}
};
const appStateSubscription = AppState.addEventListener(
'change',
handleAppStateChange,
);
// Create react-native-logs transport function
export const lokiTransport: transportFunctionType<any> = props => {
const { msg, rawMsg, level, extension } = props;
@@ -189,11 +207,3 @@ export const lokiTransport: transportFunctionType<any> = props => {
addToBatch(entry, namespace);
};
const handleAppStateChange = (nextAppState: AppStateStatus) => {
if (nextAppState === 'background' || nextAppState === 'inactive') {
flushLokiTransport();
}
};
AppState.addEventListener('change', handleAppStateChange);

View File

@@ -2,7 +2,8 @@
import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
import { AppLogger, Logger, NfcLogger } from '../logger';
// Remove direct imports to avoid module cycle
// Dependencies will be injected via setupNativeLoggerBridge
interface NativeLogEvent {
level: 'debug' | 'info' | 'warn' | 'error';
@@ -13,10 +14,22 @@ interface NativeLogEvent {
let eventEmitter: NativeEventEmitter | null = null;
let isInitialized = false;
let injectedLoggers: {
AppLogger: any;
NfcLogger: any;
Logger: any;
} | null = null;
const setupNativeLoggerBridge = () => {
const setupNativeLoggerBridge = (loggers: {
AppLogger: any;
NfcLogger: any;
Logger: any;
}) => {
if (isInitialized) return;
// Store injected loggers
injectedLoggers = loggers;
const moduleName =
Platform.OS === 'android' ? 'RNPassportReader' : 'NativeLoggerBridge';
@@ -48,38 +61,43 @@ const setupEventListeners = () => {
};
const handleNativeLogEvent = (event: NativeLogEvent) => {
if (!injectedLoggers) {
console.warn('NativeLoggerBridge not initialized with loggers');
return;
}
const { level, category, message, data } = event;
// Route to appropriate logger based on category
let logger;
let logger: any;
switch (category.toLowerCase()) {
case 'nfc':
logger = NfcLogger;
logger = injectedLoggers.NfcLogger;
break;
case 'app':
logger = AppLogger;
logger = injectedLoggers.AppLogger;
break;
default:
// For unknown categories, use AppLogger with category prefix
logger = Logger.extend(category.toUpperCase());
// For unknown categories, use Logger with category prefix
logger = injectedLoggers.Logger.extend(category.toUpperCase());
}
// Log with appropriate level
switch (level) {
case 'debug':
(logger as any).debug(message, data);
logger.debug(message, data);
break;
case 'info':
(logger as any).info(message, data);
logger.info(message, data);
break;
case 'warn':
(logger as any).warn(message, data);
logger.warn(message, data);
break;
case 'error':
(logger as any).error(message, data);
logger.error(message, data);
break;
default:
(logger as any).info(message, data);
logger.info(message, data);
}
};
@@ -89,9 +107,8 @@ const cleanup = () => {
eventEmitter = null;
}
isInitialized = false;
injectedLoggers = null;
};
// Initialize the bridge
setupNativeLoggerBridge();
export { cleanup };
// Export the setup function for explicit initialization
export { cleanup, setupNativeLoggerBridge };