🔧 chore: create @manacore/shared-logger and migrate 2 mobile apps

- Create shared logger package with logger, perfLogger, networkLogger
- Support both __DEV__ (React Native) and NODE_ENV environments
- Migrate manadeck and picture mobile apps to use shared package

Savings: ~120 LOC (126 → 10 LOC in apps)
This commit is contained in:
Till-JS 2026-01-29 17:12:48 +01:00
parent 5663c3d3ce
commit 2d16f7c9ff
7 changed files with 254 additions and 129 deletions

View file

@ -1,33 +1,5 @@
/**
* Simple logger utility for consistent logging across the app
* Can be extended to integrate with crash reporting services
* Logger utility - re-exports from shared package
* @see @manacore/shared-logger
*/
const isDevelopment = process.env.NODE_ENV === 'development' || __DEV__;
export const debug = (...args: any[]): void => {
if (isDevelopment) {
console.debug('[DEBUG]', ...args);
}
};
export const info = (...args: any[]): void => {
if (isDevelopment) {
console.info('[INFO]', ...args);
}
};
export const warn = (...args: any[]): void => {
console.warn('[WARN]', ...args);
};
export const error = (...args: any[]): void => {
console.error('[ERROR]', ...args);
// TODO: Send to crash reporting service in production
};
export const log = (...args: any[]): void => {
if (isDevelopment) {
console.log('[LOG]', ...args);
}
};
export { debug, info, warn, error, log, logger } from '@manacore/shared-logger';

View file

@ -1,91 +1,5 @@
/**
* Centralized logging utility
* - Development: Logs to console
* - Production: Logs to console (can be extended for custom error tracking)
* Logger utilities - re-exports from shared package
* @see @manacore/shared-logger
*/
const isDevelopment = __DEV__;
export const logger = {
/**
* Log debug information (only in development)
*/
debug: (...args: any[]) => {
if (isDevelopment) {
console.log('[DEBUG]', ...args);
}
},
/**
* Log general information
*/
info: (...args: any[]) => {
if (isDevelopment) {
console.log('[INFO]', ...args);
}
},
/**
* Log warnings (always logged)
*/
warn: (...args: any[]) => {
console.warn('[WARN]', ...args);
// TODO: Send to error tracking service in production
},
/**
* Log errors (always logged)
*/
error: (...args: any[]) => {
console.error('[ERROR]', ...args);
// In production: can be extended for custom error tracking
},
/**
* Log success messages (only in development)
*/
success: (...args: any[]) => {
if (isDevelopment) {
console.log('[SUCCESS] ✅', ...args);
}
},
};
/**
* Performance logger for measuring execution time
*/
export const perfLogger = {
start: (label: string) => {
if (isDevelopment) {
console.time(label);
}
},
end: (label: string) => {
if (isDevelopment) {
console.timeEnd(label);
}
},
};
/**
* Network request logger
*/
export const networkLogger = {
request: (url: string, method: string, body?: any) => {
if (isDevelopment) {
console.log(`[NETWORK] ${method} ${url}`, body ? { body } : '');
}
},
response: (url: string, status: number, data?: any) => {
if (isDevelopment) {
console.log(`[NETWORK] Response ${status} from ${url}`, data ? { data } : '');
}
},
error: (url: string, error: any) => {
console.error(`[NETWORK] Error from ${url}`, error);
// TODO: Send to error tracking
},
};
export { logger, perfLogger, networkLogger } from '@manacore/shared-logger';

View file

@ -16,7 +16,7 @@
| ~~**MITTEL**~~ | ~~Vite Configs~~ | ~~300 LOC~~**~350 LOC entfernt** | ~~Niedrig~~ |
| ~~**MITTEL**~~ | ~~Navigation Stores~~ | ~~50 LOC~~**~50 LOC entfernt** | ~~Niedrig~~ |
| ~~**NIEDRIG**~~ | ~~Drizzle Configs~~ | ~~200 LOC~~**~160 LOC entfernt** | ~~Niedrig~~ |
| **NIEDRIG** | Logger Utilities | 130 LOC | Niedrig |
| ~~**NIEDRIG**~~ | ~~Logger Utilities~~ | ~~130 LOC~~**~120 LOC entfernt** | ~~Niedrig~~ |
---
@ -393,16 +393,21 @@ export default createDrizzleConfig({ dbName: 'chat' });
## 5. Utility Functions
### 5.1 NIEDRIG: Logger Utilities (130 LOC)
### ~~5.1 NIEDRIG: Logger Utilities~~ ✅ ERLEDIGT (~120 LOC gespart)
**Problem:** 2 Mobile Apps haben eigene Logger:
- `apps/manadeck/apps/mobile/utils/logger.ts` (34 LOC)
- `apps/picture/apps/mobile/utils/logger.ts` (92 LOC - erweitert)
**Status:** `@manacore/shared-logger` Package erstellt und 2 Mobile Apps migriert (29.01.2026)
**Empfehlung:** Erstelle `@manacore/shared-logger` mit:
- `logger.debug/info/warn/error/success`
- `perfLogger.start/end`
- `networkLogger.request/response/error`
**Erstelltes Package:** `packages/shared-logger/`
- `logger.debug/info/warn/error/success/log` - Standard Logger
- `perfLogger.start/end` - Performance-Messung
- `networkLogger.request/response/error` - Netzwerk-Debugging
- Individuelle Exports für Rückwärtskompatibilität: `debug`, `info`, `warn`, `error`, `log`
**Migrierte Apps:**
- ✅ `apps/manadeck/apps/mobile/utils/logger.ts` (34 → 5 LOC)
- ✅ `apps/picture/apps/mobile/utils/logger.ts` (92 → 5 LOC)
**Einsparung:** ~120 LOC (126 → 10 LOC, Shared Package: 100 LOC reusable)
---

View file

@ -0,0 +1,21 @@
{
"name": "@manacore/shared-logger",
"version": "1.0.0",
"description": "Shared logging utilities for ManaCore mobile and web apps",
"type": "module",
"main": "./src/index.ts",
"types": "./src/index.ts",
"exports": {
".": {
"types": "./src/index.ts",
"import": "./src/index.ts",
"default": "./src/index.ts"
}
},
"scripts": {
"type-check": "tsc --noEmit"
},
"devDependencies": {
"typescript": "^5.7.2"
}
}

View file

@ -0,0 +1,108 @@
/**
* Shared Logger Utilities for ManaCore Apps
* Provides consistent logging across mobile and web applications.
*/
// Check if we're in development mode
// Works in both React Native (__DEV__) and Node.js environments
declare const __DEV__: boolean | undefined;
const isDevelopment =
typeof __DEV__ !== 'undefined' ? __DEV__ : process.env.NODE_ENV === 'development';
/**
* Main logger object with standard log levels.
* Debug and info only log in development mode.
* Warn and error always log.
*/
export const logger = {
/** Log debug information (only in development) */
debug: (...args: unknown[]): void => {
if (isDevelopment) {
console.debug('[DEBUG]', ...args);
}
},
/** Log general information (only in development) */
info: (...args: unknown[]): void => {
if (isDevelopment) {
console.info('[INFO]', ...args);
}
},
/** Log warnings (always logged) */
warn: (...args: unknown[]): void => {
console.warn('[WARN]', ...args);
},
/** Log errors (always logged) */
error: (...args: unknown[]): void => {
console.error('[ERROR]', ...args);
},
/** Log success messages (only in development) */
success: (...args: unknown[]): void => {
if (isDevelopment) {
console.log('[SUCCESS]', ...args);
}
},
/** General log (only in development) */
log: (...args: unknown[]): void => {
if (isDevelopment) {
console.log('[LOG]', ...args);
}
},
};
/**
* Performance logger for measuring execution time.
* Only logs in development mode.
*/
export const perfLogger = {
/** Start a performance timer with a label */
start: (label: string): void => {
if (isDevelopment) {
console.time(label);
}
},
/** End a performance timer and log the duration */
end: (label: string): void => {
if (isDevelopment) {
console.timeEnd(label);
}
},
};
/**
* Network request logger for API debugging.
* Request and response only log in development.
* Errors always log.
*/
export const networkLogger = {
/** Log an outgoing network request */
request: (url: string, method: string, body?: unknown): void => {
if (isDevelopment) {
console.log(`[NETWORK] ${method} ${url}`, body ? { body } : '');
}
},
/** Log a network response */
response: (url: string, status: number, data?: unknown): void => {
if (isDevelopment) {
console.log(`[NETWORK] Response ${status} from ${url}`, data ? { data } : '');
}
},
/** Log a network error (always logged) */
error: (url: string, error: unknown): void => {
console.error(`[NETWORK] Error from ${url}`, error);
},
};
// Individual function exports for backwards compatibility with manadeck pattern
export const debug = logger.debug;
export const info = logger.info;
export const warn = logger.warn;
export const error = logger.error;
export const log = logger.log;

View file

@ -0,0 +1,14 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"esModuleInterop": true,
"strict": true,
"skipLibCheck": true,
"declaration": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"]
}

91
pnpm-lock.yaml generated
View file

@ -4780,6 +4780,12 @@ importers:
specifier: ^5.0.0
version: 5.9.3
packages/shared-logger:
devDependencies:
typescript:
specifier: ^5.7.2
version: 5.9.3
packages/shared-nestjs-auth:
devDependencies:
'@nestjs/common':
@ -5041,6 +5047,91 @@ importers:
specifier: ^5.9.3
version: 5.9.3
services/mana-api-gateway:
dependencies:
'@manacore/shared-nestjs-auth':
specifier: workspace:*
version: link:../../packages/shared-nestjs-auth
'@nestjs/common':
specifier: ^10.4.17
version: 10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/config':
specifier: ^3.3.0
version: 3.3.0(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)
'@nestjs/core':
specifier: ^10.4.17
version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@10.4.20)(@nestjs/websockets@10.4.20)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/platform-express':
specifier: ^10.4.17
version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.20)
class-transformer:
specifier: ^0.5.1
version: 0.5.1
class-validator:
specifier: ^0.14.1
version: 0.14.3
drizzle-orm:
specifier: ^0.38.4
version: 0.38.4(@opentelemetry/api@1.9.0)(@types/react@19.2.7)(expo-sqlite@15.2.14(expo@54.0.25)(react-native@0.81.5(@babel/core@7.28.5)(@types/react@19.2.7)(react@19.1.0))(react@19.1.0))(kysely@0.28.8)(postgres@3.4.7)(react@19.1.0)
ioredis:
specifier: ^5.4.2
version: 5.8.2
multer:
specifier: ^1.4.5-lts.1
version: 1.4.5-lts.2
postgres:
specifier: ^3.4.5
version: 3.4.7
prom-client:
specifier: ^15.1.3
version: 15.1.3
reflect-metadata:
specifier: ^0.2.2
version: 0.2.2
rxjs:
specifier: ^7.8.1
version: 7.8.2
devDependencies:
'@manacore/shared-drizzle-config':
specifier: workspace:*
version: link:../../packages/shared-drizzle-config
'@nestjs/cli':
specifier: ^10.4.9
version: 10.4.9
'@nestjs/schematics':
specifier: ^10.2.3
version: 10.2.3(chokidar@3.6.0)(typescript@5.9.3)
'@nestjs/testing':
specifier: ^10.4.17
version: 10.4.20(@nestjs/common@10.4.20(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@10.4.20)(@nestjs/platform-express@10.4.20)
'@types/express':
specifier: ^5.0.0
version: 5.0.5
'@types/multer':
specifier: ^1.4.12
version: 1.4.13
'@types/node':
specifier: ^22.10.7
version: 22.19.1
drizzle-kit:
specifier: ^0.30.4
version: 0.30.6
jest:
specifier: ^29.7.0
version: 29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3))
ts-jest:
specifier: ^29.2.5
version: 29.4.5(@babel/core@7.28.5)(@jest/transform@30.2.0)(@jest/types@30.2.0)(babel-jest@30.2.0(@babel/core@7.28.5))(esbuild@0.19.12)(jest-util@30.2.0)(jest@29.7.0(@types/node@22.19.1)(ts-node@10.9.2(@types/node@22.19.1)(typescript@5.9.3)))(typescript@5.9.3)
ts-node:
specifier: ^10.9.2
version: 10.9.2(@types/node@22.19.1)(typescript@5.9.3)
tsx:
specifier: ^4.19.2
version: 4.20.6
typescript:
specifier: ^5.7.3
version: 5.9.3
services/mana-core-auth:
dependencies:
'@google/generative-ai':