diff --git a/apps/manadeck/apps/mobile/utils/logger.ts b/apps/manadeck/apps/mobile/utils/logger.ts index 92707c2f2..8f2b68f68 100644 --- a/apps/manadeck/apps/mobile/utils/logger.ts +++ b/apps/manadeck/apps/mobile/utils/logger.ts @@ -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'; diff --git a/apps/picture/apps/mobile/utils/logger.ts b/apps/picture/apps/mobile/utils/logger.ts index d1b21ace0..2829a1e4f 100644 --- a/apps/picture/apps/mobile/utils/logger.ts +++ b/apps/picture/apps/mobile/utils/logger.ts @@ -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'; diff --git a/docs/CONSOLIDATION_OPPORTUNITIES.md b/docs/CONSOLIDATION_OPPORTUNITIES.md index 0f61c05f0..ceb88a646 100644 --- a/docs/CONSOLIDATION_OPPORTUNITIES.md +++ b/docs/CONSOLIDATION_OPPORTUNITIES.md @@ -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) --- diff --git a/packages/shared-logger/package.json b/packages/shared-logger/package.json new file mode 100644 index 000000000..b0e1b0619 --- /dev/null +++ b/packages/shared-logger/package.json @@ -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" + } +} diff --git a/packages/shared-logger/src/index.ts b/packages/shared-logger/src/index.ts new file mode 100644 index 000000000..1861c0ebd --- /dev/null +++ b/packages/shared-logger/src/index.ts @@ -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; diff --git a/packages/shared-logger/tsconfig.json b/packages/shared-logger/tsconfig.json new file mode 100644 index 000000000..d92f40466 --- /dev/null +++ b/packages/shared-logger/tsconfig.json @@ -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/**/*"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ecaeb42f..58a212dc1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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':