{"version":3,"file":"index.cjs","sources":["../src/casing/camelToKebab.ts","../src/casing/camelToSnake.ts","../src/casing/camelToSnakeObjKeys.ts","../src/casing/snakeToCamel.ts","../src/casing/snakeToCamelObjKeys.ts","../src/casing/deepSnakeToCamelObjKeys.ts","../src/casing/snakeToKebab.ts","../src/storage/storage.ts","../src/createCbCollector.ts","../src/createLogger.ts"],"sourcesContent":["/**\n * Converts string value from camel case to kebab case.\n * @param value - value to convert.\n */\nexport function camelToKebab(value: string): string {\n  return value.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n","export type CamelToSnakeCase<T extends string> = T extends `${infer First}${infer Rest}`\n  ? `${First extends Capitalize<First> ? '_' : ''}${Lowercase<First>}${CamelToSnakeCase<Rest>}`\n  : T;\n\n/**\n * Converts string value from camel case to snake case.\n * @param value - value to convert.\n */\nexport function camelToSnake<T extends string>(value: T): CamelToSnakeCase<T> {\n  return value.replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`) as CamelToSnakeCase<T>;\n}","import { camelToSnake, type CamelToSnakeCase } from '@/casing/camelToSnake.js';\n\nexport type ConvertCamelKeysToSnakeCase<T> = {\n  [K in keyof T as CamelToSnakeCase<string & K>]: T[K];\n};\n\n/**\n * Converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function camelToSnakeObjKeys<T extends object>(value: T): ConvertCamelKeysToSnakeCase<T> {\n  return Object.entries(value).reduce<ConvertCamelKeysToSnakeCase<T>>((acc, [k, v]) => {\n    acc[camelToSnake(k) as keyof ConvertCamelKeysToSnakeCase<T>] = v;\n    return acc;\n  }, {} as ConvertCamelKeysToSnakeCase<T>);\n}","export type SnakeToCamelCase<S extends string> =\n  S extends `${infer Head}_${infer Tail}`\n    ? `${Head}${Capitalize<SnakeToCamelCase<Tail>>}`\n    : S;\n\n/**\n * Converts string value from snake case to camel case.\n * @param value - value to convert.\n */\nexport function snakeToCamel<T extends string>(value: T): SnakeToCamelCase<T> {\n  return value.replace(/_[a-z]/g, (m) => m[1].toUpperCase()) as SnakeToCamelCase<T>;\n}","import { snakeToCamel, type SnakeToCamelCase } from '@/casing/snakeToCamel.js';\n\nexport type ConvertSnakeKeysToCamelCase<T> = {\n  [K in keyof T as SnakeToCamelCase<string & K>]: T[K];\n};\n\n/**\n * Converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function snakeToCamelObjKeys<T extends object>(value: T): ConvertSnakeKeysToCamelCase<T> {\n  return Object.entries(value).reduce<ConvertSnakeKeysToCamelCase<T>>((acc, [k, v]) => {\n    acc[snakeToCamel(k) as keyof ConvertSnakeKeysToCamelCase<T>] = v;\n    return acc;\n  }, {} as ConvertSnakeKeysToCamelCase<T>);\n}","import { snakeToCamelObjKeys } from '@/casing/snakeToCamelObjKeys.js';\nimport type { SnakeToCamelCase } from '@/casing/snakeToCamel.js';\n\nexport type DeepConvertSnakeKeysToCamelCase<T> = T extends infer U\n    ? U extends object\n      ? U extends Date\n        ? U\n        : U extends (infer Item)[]\n          ? DeepConvertSnakeKeysToCamelCase<Item>[]\n          : {\n            [K in keyof U as SnakeToCamelCase<string & K>]: DeepConvertSnakeKeysToCamelCase<U[K]>\n          } & {}\n      : U\n    : T;\n\n/**\n * Deeply converts object keys from snake to camel case.\n * @param value - value to convert.\n */\nexport function deepSnakeToCamelObjKeys<T extends object>(\n  value: T,\n): DeepConvertSnakeKeysToCamelCase<T> {\n  const camelCased = snakeToCamelObjKeys(value);\n  for (const key in camelCased) {\n    const value = camelCased[key];\n    if (value && typeof value === 'object' && !(value instanceof Date)) {\n      (camelCased as any)[key] = Array.isArray(value)\n        ? value.map(deepSnakeToCamelObjKeys)\n        : deepSnakeToCamelObjKeys(value);\n    }\n  }\n  return camelCased as DeepConvertSnakeKeysToCamelCase<T>;\n}","/**\n * Converts string value from snake case to kebab case.\n * @param value - value to convert.\n */\nexport function snakeToKebab(value: string): string {\n  return value.replace(/_([a-z])/g, (_, letter) => `-${letter.toLowerCase()}`);\n}\n","/**\n * Converts a passed storage key to the formatted state.\n * @param key - storage key.\n */\nfunction formatKey(key: string): string {\n  return `tapps/${key}`;\n}\n\n/**\n * Saves value in the storage.\n * @param key - storage key.\n * @param value - storage value.\n */\nexport function setStorageValue<T>(key: string, value: T): void {\n  sessionStorage.setItem(formatKey(key), JSON.stringify(value));\n}\n\n/**\n * Extracts value from the storage.\n * @param key - storage key.\n */\nexport function getStorageValue<R>(key: string): R | undefined {\n  const value = sessionStorage.getItem(formatKey(key));\n  try {\n    return value ? JSON.parse(value) as R : undefined;\n  } catch {\n  }\n}\n","export type CallbackFn = () => void;\n\n/**\n * Returns a tuple, containing function to add cleanup, call cleanup, and flag showing whether\n * cleanup was called. Cleanup will not be performed in case, it was done before.\n */\nexport function createCbCollector(...cbs: (CallbackFn | CallbackFn[])[]): [\n  add: (...fns: CallbackFn[]) => void,\n  call: () => void,\n] {\n  const callbacks = cbs.flat(1);\n\n  return [\n    callbacks.push.bind(callbacks),\n    () => {\n      callbacks.forEach(cb => {\n        cb();\n      });\n    },\n  ];\n}","/**\n * Message log level.\n */\nexport type LogLevel = 'log' | 'error' | 'warn';\n\nexport interface LoggerOptions {\n  bgColor?: string;\n  textColor?: string;\n  /**\n   * True if logs are enabled.\n   * @default true\n   */\n  shouldLog?: boolean | (() => boolean);\n}\n\nexport type LoggerFn = (...args: any[]) => void;\nexport type LoggerForceFn = (...args: any[]) => void;\n\nexport interface Logger {\n  /**\n   * Prints an error message into the console.\n   * @param args - items to log.\n   */\n  error: LoggerFn;\n  /**\n   * Prints an error message into the console ignoring the `shouldLog`\n   * constructor option.\n   * @param args - items to log.\n   */\n  forceError: LoggerForceFn;\n  /**\n   * Prints a log message into the console ignoring the `shouldLog` constructor\n   * option.\n   * @param args - items to log.\n   */\n  forceLog: LoggerForceFn;\n  /**\n   * Prints a warning message into the console ignoring the `shouldLog`\n   * constructor option.\n   * @param args - items to log.\n   */\n  forceWarn: LoggerForceFn;\n  /**\n   * Prints a log message into the console.\n   * @param args - items to log.\n   */\n  log: LoggerFn;\n  /**\n   * Prints a warning message into the console.\n   * @param args - items to log.\n   */\n  warn: LoggerFn;\n}\n\n/*@__NO_SIDE_EFFECTS__*/\nexport function createLogger(scope: string, options?: LoggerOptions): Logger {\n  options ||= {};\n  const {\n    textColor,\n    bgColor,\n    shouldLog: optionsShouldLog,\n  } = options;\n  const shouldLogValue = optionsShouldLog === undefined ? true : optionsShouldLog;\n  const shouldLog = typeof shouldLogValue === 'boolean'\n    ? () => shouldLogValue\n    : shouldLogValue;\n\n  /**\n   * Prints a message into the console.\n   * @param level - log level.\n   * @param force - should `shouldLog` value be ignored.\n   * @param args - arguments.\n   */\n  const print = (level: LogLevel, force: boolean, ...args: any[]): void => {\n    if (force || shouldLog()) {\n      const commonCss = 'font-weight:bold;padding:0 5px;border-radius:100px';\n      const [timeBgColor, timeTextColor, prefix] = {\n        log: ['#0089c3', 'white', 'INFO'],\n        error: ['#ff0000F0', 'white', 'ERR'],\n        warn: ['#D38E15', 'white', 'WARN'],\n      }[level];\n      console[level](\n        `%c${prefix} ${\n          Intl\n            .DateTimeFormat('en-GB', {\n              hour: '2-digit',\n              minute: '2-digit',\n              second: '2-digit',\n              fractionalSecondDigits: 3,\n              timeZone: 'UTC',\n            })\n            .format(new Date())\n        }%c %c${scope}`,\n        `${commonCss};background-color:${timeBgColor};color:${timeTextColor}`,\n        '',\n        `${commonCss};${textColor ? `color:${textColor};` : ''}${bgColor ? `background-color:${bgColor}` : ''}`,\n        ...args,\n      );\n    }\n  };\n\n  return ([\n    ['log', 'forceLog'],\n    ['warn', 'forceWarn'],\n    ['error', 'forceError'],\n  ] as const).reduce<Logger>((acc, [level, forceMethod]) => {\n    acc[level] = print.bind(undefined, level, false);\n    acc[forceMethod] = print.bind(undefined, level, true);\n    return acc;\n  }, {} as Logger);\n}"],"names":["camelToKebab","value","match","camelToSnake","camelToSnakeObjKeys","acc","k","v","snakeToCamel","m","snakeToCamelObjKeys","deepSnakeToCamelObjKeys","camelCased","key","snakeToKebab","_","letter","formatKey","setStorageValue","getStorageValue","createCbCollector","cbs","callbacks","cb","createLogger","scope","options","textColor","bgColor","optionsShouldLog","shouldLogValue","shouldLog","print","level","force","args","commonCss","timeBgColor","timeTextColor","prefix","forceMethod"],"mappings":"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"}