{"version":3,"file":"index.mjs","sources":["../src/bytes.ts","../src/errors.ts","../src/injection.ts","../src/safely.ts","../src/url.ts"],"sourcesContent":["export { formatBytes };\n\nconst unitsByBase = {\n  1000: ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],\n  1024: ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'],\n};\n\n/**\n * Formats a number of bytes into a human-readable string.\n *\n * @example\n * ```typescript\n * const formatted = formatBytes({ bytes: 4194304 });\n *\n * console.log(formatted); // 4 MiB\n * ```\n */\nfunction formatBytes({\n  bytes,\n  decimals = 2,\n  base = 1024,\n  units = unitsByBase[base],\n}: {\n  bytes: number;\n  decimals?: number;\n  base?: 1000 | 1024;\n  units?: string[];\n}) {\n  if (units === undefined || units.length === 0) {\n    throw new Error(`No units defined for base ${base}`);\n  }\n\n  if (bytes === 0) {\n    return `0 ${units[0]}`;\n  }\n\n  const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(base)), units.length - 1);\n  const value = bytes / base ** exponent;\n\n  return `${value.toFixed(decimals)} ${units[exponent]}`;\n}\n","export { castError };\n\n/**\n *  Casts an unknown value to an Error.\n *\n *  @example\n *  ```typescript\n *  try {\n *      // ...\n *  } catch (rawError) {\n *    const error = castError(rawError);\n *\n *    // Do something with a proper Error instance\n *  }\n *  ```\n */\nfunction castError(error: unknown): Error {\n  return error instanceof Error ? error : new Error(error ? String(error) : undefined);\n}\n","import type { Dictionary, Expand, Subtract } from './types';\n\nexport { injectArguments };\n\n/**\n *  Injects arguments into a set of functions. Useful for DI of repositories, services, etc.\n *\n *  @example\n *  ```typescript\n *  const functions = {\n *   getUser: ({ userId, db }) => db.users.find({ id: userId }),\n *   removeUser: ({ userId, db }) => db.users.remove({ id: userId }),\n *  };\n *\n *  const { getUser, removeUser } = injectArguments(functions, { db });\n *\n *  getUser({ userId: 1 });\n *  removeUser({ userId: 1 });\n * ```\n */\nfunction injectArguments<Functions extends Dictionary<(args: any) => any>, InjectedArgs>(functions: Functions, injectedArgs: InjectedArgs) {\n  return Object.fromEntries(Object.entries(functions).map(([key, fn]) => [key, (args: any) => fn({ ...args, ...injectedArgs })])) as {\n    [K in keyof Functions]: Expand<Subtract<Parameters<Functions[K]>[0], InjectedArgs>> extends infer Args\n      // eslint-disable-next-line ts/no-empty-object-type\n      ? {} extends Args\n          ? () => ReturnType<Functions[K]>\n          : (args: Args) => ReturnType<Functions[K]>\n      : never;\n  };\n}\n","import { castError } from './errors';\n\nexport { safely, safelySync };\n\n/**\n * Safely executes an async function or promise and return a tuple with the result and an error if any.\n *\n * @example\n * ```typescript\n * const [result, error] = await safely(myFunction);\n *\n * if (error) {\n *  console.error(error);\n * }\n *\n * console.log(result);\n * ```\n */\nasync function safely<T>(fn: (() => Promise<T> | T) | Promise<T>): Promise<[T, null] | [null, Error]> {\n  try {\n    const result = typeof fn === 'function' ? await fn() : await fn;\n    return [result, null];\n  } catch (error) {\n    return [null, castError(error)];\n  }\n}\n\n/**\n * Safely executes a function and return a tuple with the result and an error if any.\n *\n * @example\n * ```typescript\n * const [result, error] = safelySync(myFunction);\n *\n * if (error) {\n *  console.error(error);\n * }\n *\n * console.log(result);\n * ```\n */\nfunction safelySync<T>(fn: () => T): [T, null] | [null, Error] {\n  try {\n    return [fn(), null];\n  } catch (error) {\n    return [null, castError(error)];\n  }\n}\n","export { buildUrl, joinUrlPaths };\n\n/**\n * Join URL parts and trim slashes.\n *\n * @example\n * ```typescript\n * const url = joinUrlPaths('/part1/', '/part2/', 'part3', 'part4/');\n *\n * console.log(url); // 'part1/part2/part3/part4'\n * ```\n */\nfunction joinUrlPaths(...parts: (string | null | undefined)[]): string {\n  return parts.map(part => part?.replace(/(^\\/|\\/$)/g, '')).filter(Boolean).join('/');\n}\n\n/**\n * Functional wrapper around URL constructor to build an URL string from a base URL and optional path, query params and hash.\n *\n * @example\n * ```typescript\n * const url = buildUrl({ baseUrl: 'https://example.com', path: 'foo', queryParams: { a: '1', b: '2' }, hash: 'hash' });\n *\n * console.log(url); // 'https://example.com/foo?a=1&b=2#hash'\n * ```\n */\nfunction buildUrl({\n  path: pathOrPaths = '',\n  baseUrl,\n  queryParams,\n  hash,\n}: {\n  path?: string | string[];\n  baseUrl: string;\n  queryParams?: Record<string, string> | URLSearchParams;\n  hash?: string;\n}): string {\n  const path = Array.isArray(pathOrPaths) ? joinUrlPaths(...pathOrPaths) : pathOrPaths;\n  const url = new URL(path, baseUrl);\n\n  if (queryParams) {\n    if (queryParams instanceof URLSearchParams) {\n      url.search = queryParams.toString();\n    } else {\n      url.search = new URLSearchParams(queryParams).toString();\n    }\n  }\n\n  if (hash) {\n    url.hash = hash;\n  }\n\n  return url.toString();\n}\n"],"names":[],"mappings":"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"}