UNPKG

@neodx/log

Version:

A lightweight universal logging framework

1 lines 7.92 kB
{"version":3,"file":"create-logger-factory-BmydF_vP.mjs","sources":["../../src/core/shared.ts","../../src/core/create-logger-factory.ts"],"sourcesContent":["import type { LoggerLevelsConfig, LoggerParamsWithLevels } from './types';\n\nexport type DefaultLoggerLevel = keyof DefaultLoggerLevelsConfig;\nexport type DefaultLoggerLevelsConfig = typeof DEFAULT_LOGGER_LEVELS;\n\nexport const LOGGER_SILENT_LEVEL = 'silent' as const;\nexport const DEFAULT_LOGGER_LEVELS = {\n error: 10,\n warn: 20,\n info: 30,\n done: 40,\n debug: 50,\n\n success: 'done' as const,\n verbose: 'debug' as const,\n [LOGGER_SILENT_LEVEL]: Infinity\n} satisfies Readonly<LoggerLevelsConfig<string>>;\n\nexport const DEFAULT_LOGGER_PARAMS = {\n levels: DEFAULT_LOGGER_LEVELS,\n level: 'done',\n name: '',\n transform: [],\n target: [],\n meta: {}\n} satisfies Readonly<LoggerParamsWithLevels<typeof DEFAULT_LOGGER_LEVELS>>;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isEmpty, isTruthy, isTypeOfFunction, isTypeOfString, keys, toArray } from '@neodx/std';\nimport type { LogArguments } from '../utils';\nimport { LOGGER_SILENT_LEVEL } from './shared';\nimport type {\n BaseLevelsConfig,\n CreateLogger,\n GetLevelNames,\n LogChunk,\n Logger,\n LoggerLevelsConfig,\n LoggerMethods,\n LoggerParamsWithLevels,\n LoggerTransformer\n} from './types';\n\nexport interface CreateLoggerFactoryParams<Levels extends LoggerLevelsConfig<string>> {\n defaultParams: LoggerParamsWithLevels<Levels>;\n readArguments(args: unknown[]): LogArguments;\n /**\n * Formats a message template with replaces.\n * @default Our lightweight implementation with %s, %d, %i, %f, %j/%o/%O (same output as %j) support\n * @example (template, replaces) => util.format(template, ...replaces) // Node.js util.format\n */\n formatMessage(template: string, replaces: unknown[]): string;\n}\n\nexport function createLoggerFactory<LevelsConfig extends LoggerLevelsConfig<string>>({\n defaultParams,\n formatMessage,\n readArguments\n}: CreateLoggerFactoryParams<LevelsConfig>): CreateLogger<GetLevelNames<LevelsConfig>> {\n function createLogger(userParams: any): Logger<any> {\n const params = { ...defaultParams, ...userParams } as Required<\n LoggerParamsWithLevels<LevelsConfig>\n >;\n const { meta, target, level: rootLevel, name = '', levels } = params;\n const transform = toArray(params.transform) as unknown as LoggerTransformer<\n GetLevelNames<LevelsConfig>\n >[];\n const targets = toArray(target)\n .filter(isTruthy)\n .map(target => (isTypeOfFunction(target) ? { target } : target))\n .map(({ target, level }) => ({\n level: level && getOriginalLevelName(level, levels),\n target: toArray(target).filter(isTruthy)\n }))\n .filter(target => !isEmpty(target.target) && !isSilent(target.level));\n\n const log = (levelOrAlias: GetLevelNames<LevelsConfig>, ...args: unknown[]) => {\n const level = getOriginalLevelName(levelOrAlias, levels);\n\n if (isSilent(rootLevel) || (rootLevel && levels[level]! > levels[rootLevel]!)) return;\n const [[unknownMsgTemplate = '', ...msgArgs], additionalFields, error] = readArguments(args);\n const msgTemplate = String(unknownMsgTemplate);\n const chunk = transform.reduce<LogChunk<GetLevelNames<LevelsConfig>>>(\n (chunk, transformer) => transformer(chunk),\n {\n name,\n level,\n error,\n meta: {\n ...meta,\n ...additionalFields\n },\n date: new Date(),\n msgArgs,\n msgTemplate,\n msg: isEmpty(msgArgs) ? msgTemplate : formatMessage(msgTemplate, msgArgs),\n __: {\n originalLevel: levelOrAlias,\n levels: levels as LoggerLevelsConfig<GetLevelNames<LevelsConfig>>\n }\n }\n );\n\n for (const handle of targets) {\n if (handle.level && levels[handle.level]! > levels[level]!) continue;\n handle.target.forEach(fn => fn(chunk as any));\n }\n };\n\n const methods = Object.fromEntries(\n keys(levels).map(level => [level, log.bind(null, level)])\n ) as LoggerMethods<GetLevelNames<LevelsConfig>>;\n\n return {\n ...methods,\n get meta() {\n return { ...params.meta };\n },\n fork: (params: any) => createLogger({ ...userParams, ...params }),\n child: (childName: string, params: any) =>\n createLogger({\n ...userParams,\n ...params,\n name: name ? `${name}:${childName}` : childName\n })\n } as Logger<GetLevelNames<LevelsConfig>>;\n }\n\n return createLogger;\n}\n\nconst isSilent = (value?: string): value is 'silent' => value === LOGGER_SILENT_LEVEL;\nconst getOriginalLevelName = <Config extends BaseLevelsConfig>(\n level: GetLevelNames<Config>,\n levels: Config\n): GetLevelNames<Config> => {\n const value = levels[level] as GetLevelNames<Config> | number;\n\n return isTypeOfString(value) ? getOriginalLevelName(value, levels) : level;\n};\n"],"names":["LOGGER_SILENT_LEVEL","DEFAULT_LOGGER_LEVELS","error","warn","info","done","debug","success","verbose","Infinity","DEFAULT_LOGGER_PARAMS","levels","level","name","transform","target","meta","createLoggerFactory","defaultParams","formatMessage","readArguments","createLogger","userParams","params","rootLevel","toArray","targets","filter","isTruthy","map","isTypeOfFunction","getOriginalLevelName","isEmpty","isSilent","log","levelOrAlias","args","unknownMsgTemplate","msgArgs","additionalFields","msgTemplate","String","chunk","reduce","transformer","date","Date","msg","__","originalLevel","handle","forEach","fn","Object","fromEntries","keys","bind","fork","child","childName","value","isTypeOfString"],"mappings":"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"}