{"version":3,"file":"create-logger-factory-gpFFxhZQ.cjs","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","isSilent","value","getOriginalLevelName","level","levels","isTypeOfString","name","transform","target","meta","defaultParams","formatMessage","readArguments","createLogger","userParams","params","rootLevel","toArray","targets","filter","isTruthy","map","isTypeOfFunction","isEmpty","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"],"mappings":"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"}