import { useMemo } from 'react'; import { createStore } from 'zustand'; export function useLogger(name: string): Logger { return useMemo(() => getLogger(name), [name]); } export interface Logger { (...data: any[]): void; debug(...data: any[]): void; info(...data: any[]): void; error(...data: any[]): void; warn(...data: any[]): void; } const Store = createStore<{ loggers: Record; }>(() => { return { loggers: {}, }; }); export function getLogger(name: string): Logger { const state = Store.getState(); let { loggers: { [name]: log }, } = state; if (!log) { log = createLogger(name); Store.setState({ loggers: { ...state.loggers, [name]: log } }); } return log; } function createLogger(name: string) { const log = (...args: any[]) => { if (!name) { return console.log(...args); } return console.log(`[${name}]`, ...args); }; return Object.assign(log, { log, debug: log, info: log, error: log, warn: log }); }