{"version":3,"file":"utils-mi8zWKAf.mjs","names":[],"sources":["../src/utils/create-auto-logger-factory.ts","../src/utils/serialize-json.ts","../src/utils/printf.ts","../src/utils/read-arguments.ts"],"sourcesContent":["import { isTypeOfString } from '@neodx/std';\nimport type { CreateLogger, Logger, LoggerParams } from '../core/types.ts';\n\nexport const createLoggerAutoFactory =\n  (factory: CreateLogger<any>) =>\n  <const Level extends string>(\n    log: AutoLoggerInput<Level>,\n    defaultParams?: Partial<LoggerParams<Level>>\n  ): Logger<Level> => {\n    const params = isTypeOfString(log) ? { level: log } : log;\n\n    return 'level' in params\n      ? factory({ ...defaultParams, ...params } as Partial<LoggerParams<Level>>)\n      : params;\n  };\n\nexport type AutoLoggerInput<Level extends string> =\n  | Level\n  | (Partial<LoggerParams<Level>> & Pick<LoggerParams<Level>, 'level'>)\n  | 'silent'\n  | Logger<Level>;\n","/**\n * Safe version of JSON.stringify, prevents circular refs\n * @example serializeJSON({ record: { value: 1, name: 'age' }, valid: false })\n */\nexport const serializeJSON = (value: unknown, space?: string | number) =>\n  JSON.stringify(value, createJSONReplacer(), space);\n\nexport const cycleRef = (tokens: string[] = []) =>\n  `[Circular${tokens.length > 0 ? ' ' + tokens.join('.') : ''}]`;\n\nfunction createJSONReplacer() {\n  const stack: unknown[] = [];\n  const keys: string[] = [];\n\n  const getCircularKey = (index: number) => cycleRef(index > 0 ? keys.slice(0, index) : []);\n\n  return function replacer(this: unknown, key: string, value: unknown) {\n    if (stack.length === 0) {\n      stack.push(value);\n\n      return value;\n    }\n\n    const thisIndex = stack.indexOf(this);\n    const thisInStack = thisIndex >= 0;\n\n    if (thisInStack) {\n      stack.splice(thisIndex + 1);\n      keys.splice(thisIndex, Infinity, key);\n    } else {\n      stack.push(this);\n      keys.push(key);\n    }\n\n    if (stack.includes(value)) {\n      return getCircularKey(stack.indexOf(value));\n    }\n\n    return value;\n  };\n}\n","import { hasOwn } from '@neodx/std';\nimport { serializeJSON } from './serialize-json';\n\n/**\n * Tiny implementation of printf function.\n * Supports only \"%s\" (string) and \"%d\" (number).\n * @see https://github.com/floatdrop/pff\n * @example printf('%s in %ds.', ['Done', 12]) => \"Done on 12s.\"\n */\nexport function printf(template: string, replaces: unknown[]) {\n  const currentReplaces = Array.from(replaces);\n  const [leading, ...parts] = template.split('%');\n  const result = parts.reduce(\n    (acc, part) => {\n      const tokenName = part[0]!;\n      const format = hasOwn(tokenFormatters, tokenName) ? tokenFormatters[tokenName] : null;\n\n      acc.push(format ? format(currentReplaces.shift()) : '%');\n      acc.push(format ? part.slice(tokenName.length) : part);\n      return acc;\n    },\n    [leading] as unknown[]\n  );\n\n  return result.join('');\n}\n\nconst tokenFormatters = {\n  s: (value: unknown) => String(value),\n  d: (value: unknown) => Math.floor(Number(value)),\n  i: (value: unknown) => Number.parseInt(String(value), 10),\n  f: (value: unknown) => Number.parseFloat(String(value)),\n  o: serializeJSON,\n  O: serializeJSON,\n  j: serializeJSON\n};\n","import { type AnyRecord, isEmpty, isError, isObjectLike } from '@neodx/std';\n\nexport type LogArguments = [messageFragments: unknown[], meta: AnyRecord, error?: Error];\n\n/**\n * Reads arguments array and extract fields, error and message arguments.\n * @return [messageFragments, fields, error]\n *\n * Strings\n * @example readArguments('hello') -> [ ['hello'], {} ]\n * @example readArguments('hello %s', 'world') -> [ ['hello %s', 'world'], {} ]\n * @example readArguments('hello %s %d %j', 'world', 1, { id: 2 }) -> [ ['hello %s %d %j', 'world', 1, { id: 2 }], {} ]\n *\n * Additional fields\n * @example readArguments({ id: 2 }) -> [ [], { id: 2 } ]\n * @example readArguments({ id: 2 }, 'hello') -> [ ['hello'], { id: 2 } ]\n * @example readArguments({ id: 2 }, 'hello %s', 'world') -> [ ['hello %s', 'world'], { id: 2 } ]\n *\n * Errors\n * @example readArguments(myError) -> [ ['my error'], {}, myError ]\n * @example readArguments({ err: myError }) -> [ ['my error'], {}, myError ]\n * @example readArguments({ err: myError, id: 2 }) -> [ ['my error'], { id: 2 }, myError ]\n * @example readArguments({ err: myError, id: 2 }, 'hello') -> [ ['hello'], { id: 2 }, myError ]\n * @example readArguments({ err: myError, id: 2 }, 'hello %s', 'world') -> [ ['hello %s', 'world'], { id: 2 }, myError ]\n */\nexport function readArguments(args: unknown[]): LogArguments {\n  const [firstArg, ...otherArgs] = args;\n\n  if (isError(firstArg)) {\n    return [isEmpty(otherArgs) ? [firstArg.message] : otherArgs, {}, firstArg];\n  }\n\n  if (isObjectLike(firstArg)) {\n    if ('err' in firstArg && isError(firstArg.err)) {\n      const { err, ...fields } = firstArg;\n\n      return [isEmpty(otherArgs) ? [err.message] : otherArgs, fields, err];\n    }\n\n    return [otherArgs, firstArg as any];\n  }\n\n  return [args, {}];\n}\n"],"mappings":";;AAGA,MAAa,2BACV,aAEC,KACA,kBACkB;CAClB,MAAM,SAAS,eAAe,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI;CAEtD,OAAO,WAAW,SACd,QAAQ;EAAE,GAAG;EAAe,GAAG;CAAO,CAAiC,IACvE;AACN;;;;;;;ACVF,MAAa,iBAAiB,OAAgB,UAC5C,KAAK,UAAU,OAAO,mBAAmB,GAAG,KAAK;AAEnD,MAAa,YAAY,SAAmB,CAAC,MAC3C,YAAY,OAAO,SAAS,IAAI,MAAM,OAAO,KAAK,GAAG,IAAI,GAAG;AAE9D,SAAS,qBAAqB;CAC5B,MAAM,QAAmB,CAAC;CAC1B,MAAM,OAAiB,CAAC;CAExB,MAAM,kBAAkB,UAAkB,SAAS,QAAQ,IAAI,KAAK,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC;CAExF,OAAO,SAAS,SAAwB,KAAa,OAAgB;EACnE,IAAI,MAAM,WAAW,GAAG;GACtB,MAAM,KAAK,KAAK;GAEhB,OAAO;EACT;EAEA,MAAM,YAAY,MAAM,QAAQ,IAAI;EAGpC,IAFoB,aAAa,GAEhB;GACf,MAAM,OAAO,YAAY,CAAC;GAC1B,KAAK,OAAO,WAAW,UAAU,GAAG;EACtC,OAAO;GACL,MAAM,KAAK,IAAI;GACf,KAAK,KAAK,GAAG;EACf;EAEA,IAAI,MAAM,SAAS,KAAK,GACtB,OAAO,eAAe,MAAM,QAAQ,KAAK,CAAC;EAG5C,OAAO;CACT;AACF;;;;;;;;;AC/BA,SAAgB,OAAO,UAAkB,UAAqB;CAC5D,MAAM,kBAAkB,MAAM,KAAK,QAAQ;CAC3C,MAAM,CAAC,SAAS,GAAG,SAAS,SAAS,MAAM,GAAG;CAa9C,OAZe,MAAM,QAClB,KAAK,SAAS;EACb,MAAM,YAAY,KAAK;EACvB,MAAM,SAAS,OAAO,iBAAiB,SAAS,IAAI,gBAAgB,aAAa;EAEjF,IAAI,KAAK,SAAS,OAAO,gBAAgB,MAAM,CAAC,IAAI,GAAG;EACvD,IAAI,KAAK,SAAS,KAAK,MAAM,UAAU,MAAM,IAAI,IAAI;EACrD,OAAO;CACT,GACA,CAAC,OAAO,CAGE,CAAC,CAAC,KAAK,EAAE;AACvB;AAEA,MAAM,kBAAkB;CACtB,IAAI,UAAmB,OAAO,KAAK;CACnC,IAAI,UAAmB,KAAK,MAAM,OAAO,KAAK,CAAC;CAC/C,IAAI,UAAmB,OAAO,SAAS,OAAO,KAAK,GAAG,EAAE;CACxD,IAAI,UAAmB,OAAO,WAAW,OAAO,KAAK,CAAC;CACtD,GAAG;CACH,GAAG;CACH,GAAG;AACL;;;;;;;;;;;;;;;;;;;;;;;;ACVA,SAAgB,cAAc,MAA+B;CAC3D,MAAM,CAAC,UAAU,GAAG,aAAa;CAEjC,IAAI,QAAQ,QAAQ,GAClB,OAAO;EAAC,QAAQ,SAAS,IAAI,CAAC,SAAS,OAAO,IAAI;EAAW,CAAC;EAAG;CAAQ;CAG3E,IAAI,aAAa,QAAQ,GAAG;EAC1B,IAAI,SAAS,YAAY,QAAQ,SAAS,GAAG,GAAG;GAC9C,MAAM,EAAE,KAAK,GAAG,WAAW;GAE3B,OAAO;IAAC,QAAQ,SAAS,IAAI,CAAC,IAAI,OAAO,IAAI;IAAW;IAAQ;GAAG;EACrE;EAEA,OAAO,CAAC,WAAW,QAAe;CACpC;CAEA,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB"}