@neodx/log
Version:
A lightweight universal logging framework
1 lines • 9.97 kB
Source Map (JSON)
{"version":3,"file":"read-arguments-CPC3VkQ4.mjs","sources":["../../../std/src/shared.ts","../../../std/src/guards.ts","../../src/utils/create-auto-logger-factory.ts","../../src/utils/read-arguments.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type Falsy = false | null | undefined | void | 0 | '';\nexport type Truthy = Exclude<any, Falsy>;\nexport type AnyKey = keyof any;\nexport type AnyRecord = Record<AnyKey, any>;\n\nexport const toArray = <T>(value: T | T[]) => (Array.isArray(value) ? value : [value]);\nexport const toInt = (value: string) => Number.parseInt(value, 10);\n\nexport const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\nexport const forEach = <T>(iterable: Iterable<T>, fn: (value: T) => void) => {\n for (const value of iterable) fn(value);\n};\n\nexport const identity = <T>(value: T): T => value;\nexport const isTruthy = Boolean as unknown as <T>(value: T | Falsy) => value is T;\n\nexport const True = (): true => true;\nexport const False = (): false => false;\n\nexport const test = (re: RegExp) => (value: string) => re.test(value);\n\nexport const rethrow = (error: unknown): never => {\n throw error;\n};\nexport function tryCatch<T>(fn: () => T): T | undefined;\nexport function tryCatch<T>(fn: () => T, fallback: () => T): T;\nexport function tryCatch<T, F>(fn: () => T, fallback: () => F): T | F;\nexport function tryCatch<T, F>(fn: () => T, fallback?: () => F): T | F {\n try {\n return fn();\n } catch {\n return fallback?.() as T | F;\n }\n}\n\nexport const lazyValue = <T>(fn: () => T): (() => T) => {\n let value: T | undefined;\n\n return () => (value ??= fn());\n};\n\n//#region Object\n\nexport const values = Object.values;\nexport const fromEntries = Object.fromEntries as {\n <T>(entries: Iterable<ObjectEntry<T>>): T;\n <T>(entries: Iterable<readonly [PropertyKey, T]>): Record<string, T>;\n};\nexport const entries = Object.entries as ObjectEntries;\nexport const hasOwn = Object.hasOwn as ObjectHasOwn;\nexport const keys = Object.keys as ObjectKeys;\n\nexport type ObjectEntry<T> = {\n [Key in Extract<keyof T, string>]: [Key, Exclude<T[Key], undefined>];\n}[Extract<keyof T, string>];\n\nexport interface ObjectEntries {\n <T>(target: T): ObjectEntry<T>[];\n}\n\nexport interface ObjectKeys {\n <T>(target: T): Array<Extract<keyof T, string>>;\n}\n\nexport interface ObjectHasOwn {\n <Key extends keyof any, T extends AnyRecord>(target: T, key: Key | keyof T): key is keyof T;\n <Key extends keyof T, T extends AnyRecord>(\n target: T,\n key: Key\n ): target is T & {\n [K in Key]-?: Exclude<T[K], undefined | void | never>;\n };\n}\n\n//#endregion\n","import { type AnyRecord, keys } from './shared';\n\nconst toString = Object.prototype.toString;\nconst getPrototypeOf = Object.getPrototypeOf;\nconst objectString = '[object Object]';\n\nexport type Nil = null | undefined;\nexport type AnyFunction = (...args: any[]) => any;\nexport type IsTypeOfFn<Type> = <T>(value: T | Type) => value is Type;\n\nexport const isEmpty = (target: unknown[]): target is [] => target.length === 0;\nexport const isError = (target: unknown): target is Error => target instanceof Error;\nexport const isEmptyObject = (target: AnyRecord): target is Record<never, never> =>\n isEmpty(keys(target));\n\nexport const not =\n <R>(fn: (value: unknown) => value is R) =>\n <Value>(value: Value): value is Exclude<Value, R> =>\n !fn(value);\nexport const some =\n <Args extends [...unknown[]]>(...predicates: [...((...args: Args) => boolean)[]]) =>\n (...args: Args): boolean =>\n predicates.some(predicate => predicate(...args));\nexport const every =\n <Args extends [...unknown[]]>(...predicates: [...((...args: Args) => boolean)[]]) =>\n (...args: Args): boolean =>\n predicates.every(predicate => predicate(...args));\n\nconst createTypeof =\n <T>(type: string) =>\n (value: unknown): value is T =>\n typeof value === type;\n\nexport const isTypeOfString = createTypeof<string>('string');\nexport const isTypeOfBoolean = createTypeof<boolean>('boolean');\nexport const isTypeOfFunction = createTypeof<AnyFunction>('function');\n\nexport const isNull = (value: unknown): value is null => value === null;\nexport const isUndefined = (value: unknown): value is undefined => value === undefined;\nexport const isPrimitive = (value: unknown) =>\n value === null || (typeof value !== 'function' && typeof value !== 'object');\nexport const isObject = (target: unknown): target is AnyRecord => {\n if (isNil(target) || !isObjectLike(target) || toString.call(target) !== objectString) {\n return false;\n }\n const proto = getPrototypeOf(target);\n\n return proto === null || proto === getLastPrototypeOf(target);\n};\n\nexport const isNil = (target: unknown): target is Nil => target == null;\nexport const isObjectLike = (target: unknown): target is object =>\n typeof target === 'object' && target !== null;\n\nconst getLastPrototypeOf = (target: unknown): unknown => {\n const proto = getPrototypeOf(target);\n\n return proto === null ? target : getLastPrototypeOf(proto);\n};\n\nexport const isDefined = not(isUndefined);\nexport const isNotNull = not(isNull);\nexport const isNotNil = not(isNil);\n","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","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"],"names":["toArray","value","Array","isArray","toInt","Number","parseInt","identity","isTruthy","Boolean","True","values","Object","entries","hasOwn","keys","toString","prototype","getPrototypeOf","isEmpty","target","length","isError","Error","isEmptyObject","createTypeof","type","isTypeOfString","isTypeOfFunction","isPrimitive","isObject","isNil","isObjectLike","call","proto","getLastPrototypeOf","createLoggerAutoFactory","factory","log","defaultParams","params","level","readArguments","args","firstArg","otherArgs","message","err","fields"],"mappings":"AAOO,IAAMA,EAAU,AAAIC,GAAoBC,MAAMC,OAAO,CAACF,GAASA,EAAQ,CAACA,EAAQ,CAC1EG,EAAQ,AAACH,GAAkBI,OAAOC,QAAQ,CAACL,EAAO,IAOlDM,EAAW,AAAIN,GAAgBA,EAC/BO,EAAWC,QAEXC,EAAO,IAAY,CAAA,EA2BnBC,EAASC,OAAOD,MAAO,CAKvBE,EAAUD,OAAOC,OAAyB,CAC1CC,EAASF,OAAOE,MAAuB,CACvCC,EAAOH,OAAOG,IAAmB,CClDxCC,EAAWJ,OAAOK,SAAS,CAACD,QAAQ,CACpCE,EAAiBN,OAAOM,cAAc,CAO/BC,EAAU,AAACC,GAAoCA,AAAkB,IAAlBA,EAAOC,MAAM,CAC5DC,EAAU,AAACF,GAAqCA,aAAkBG,MAClEC,EAAgB,AAACJ,GAC5BD,EAAQJ,EAAKK,IAeTK,EACJ,AAAIC,GACJ,AAACzB,GACC,OAAOA,IAAUyB,EAERC,EAAiBF,EAAqB,UAEtCG,EAAmBH,EAA0B,YAI7CI,EAAc,AAAC5B,GAC1BA,AAAU,OAAVA,GAAmB,AAAiB,YAAjB,OAAOA,GAAwB,AAAiB,UAAjB,OAAOA,EAC9C6B,EAAW,AAACV,IACvB,GAAIW,EAAMX,IAAW,CAACY,EAAaZ,IAAWJ,AAtC3B,oBAsC2BA,EAASiB,IAAI,CAACb,GAC1D,MAAO,CAAA,EAET,IAAMc,EAAQhB,EAAeE,GAE7B,OAAOc,AAAU,OAAVA,GAAkBA,IAAUC,EAAmBf,EACxD,EAEaW,EAAQ,AAACX,GAAmCA,AAAU,MAAVA,EAC5CY,EAAe,AAACZ,GAC3B,AAAkB,UAAlB,OAAOA,GAAuBA,AAAW,OAAXA,EAE1Be,EAAqB,AAACf,IAC1B,IAAMc,EAAQhB,EAAeE,GAE7B,OAAOc,AAAU,OAAVA,EAAiBd,EAASe,EAAmBD,EACtD,ECvDaE,EACX,AAACC,GACD,CACEC,EACAC,KAEA,IAAMC,EAASb,EAAeW,GAAO,CAAEG,MAAOH,CAAQA,EAAAA,EAEtD,MAAO,UAAWE,EACdH,EAAQ,CAAE,GAAGE,CAAa,CAAE,GAAGC,CAAM,AACrCA,GAAAA,GCYD,SAASE,EAAcC,CAAe,EAC3C,GAAM,CAACC,EAAU,GAAGC,EAAU,CAAGF,EAEjC,GAAIrB,EAAQsB,GACV,MAAO,CAACzB,EAAQ0B,GAAa,CAACD,EAASE,OAAO,CAAC,CAAGD,EAAW,CAAC,EAAGD,EAAS,CAG5E,GAAIZ,EAAaY,GAAW,CAC1B,GAAI,QAASA,GAAYtB,EAAQsB,EAASG,GAAG,EAAG,CAC9C,GAAM,CAAEA,IAAAA,CAAG,CAAE,GAAGC,EAAQ,CAAGJ,EAE3B,MAAO,CAACzB,EAAQ0B,GAAa,CAACE,EAAID,OAAO,CAAC,CAAGD,EAAWG,EAAQD,EAAI,AACtE,CAEA,MAAO,CAACF,EAAWD,EAAgB,AACrC,CAEA,MAAO,CAACD,EAAM,CAAC,EAAE,AACnB"}