@corentinth/chisels
Version:
Collection of utilities for JavaScript and TypeScript, lightweight and tree-shakable.
1 lines • 8.64 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/bytes.ts","../src/errors.ts","../src/injection.ts","../src/memo.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 ? keyof Args extends never\n ? () => ReturnType<Functions[K]>\n // eslint-disable-next-line ts/no-empty-object-type\n : {} extends Args\n ? (args?: Args) => ReturnType<Functions[K]>\n : (args: Args) => ReturnType<Functions[K]>\n : never;\n };\n}\n","/**\n * This function takes a function that returns a value and returns a new function that caches the result of the first call. Basically a argument-less memoization.\n *\n * @example\n * ```typescript\n * const getCwd = memoizeOnce(() => process.cwd());\n *\n * // process.cwd() is only called once\n * console.log(getCwd());\n * console.log(getCwd());\n * ```\n */\nexport function memoizeOnce<T>(value: () => T): () => T {\n let isCalled = false;\n let cache: T | undefined;\n\n return () => {\n if (!isCalled) {\n isCalled = true;\n cache = value();\n }\n\n return cache;\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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"}