@pavelpotemkin/utils
v1.1.0
Published
Shared TypeScript utilities: Result type, HTTP client, validation, formatting
Readme
@pavelpotemkin/utils
Shared TypeScript utilities: Result type, HTTP client, validation, formatting.
Install
npm install @pavelpotemkin/utilsAPI
Result
import { Ok, Err, isOk, isErr, unwrap, type Result } from '@pavelpotemkin/utils'
const result: Result<number> = Ok(42)
if (isOk(result)) {
console.log(result.value) // 42
}
unwrap(Ok(42)) // 42
unwrap(Err(new Error())) // throwsHttpClient
Axios-обёртка, возвращающая Result вместо исключений. Поддерживает zod-валидацию ответов.
import { HttpClient } from '@pavelpotemkin/utils'
import { z } from 'zod'
const client = new HttpClient({
baseURL: 'https://api.example.com',
headers: { Authorization: 'Bearer token' },
timeout: 5000,
})
const UserSchema = z.object({ id: z.number(), name: z.string() })
const result = await client.get('/users/1', { schema: UserSchema })
if (isOk(result)) {
console.log(result.value) // { id: 1, name: "..." }
}Методы: get, post, put, patch, delete.
Request options:
params— query params, arrays serialize as comma-separated valuesschema— zod-compatible schema withsafeParseheaders— request-level headerssignal—AbortSignalfor request cancellation
Ошибки:
ApiError— HTTP ошибки (4xx, 5xx) с полямиstatus,body,endpointResponseValidationError— невалидный ответ по zod-схемеNetworkError— сетевые ошибки
Validation
import { validateSchema, mustValue } from '@pavelpotemkin/utils'
import { z } from 'zod'
const data = validateSchema(z.object({ name: z.string() }), input) // throws ValidationError
const user = mustValue(maybeUser, 'User not found') // throws if null/undefinedFormat
import { formatFloatLine, formatCount } from '@pavelpotemkin/utils'
formatFloatLine(1234.5678, { accuracy: 2 }) // "1234.57"
formatFloatLine(1.999, { accuracy: 2, rounding: Decimal.ROUND_DOWN }) // "1.99"
formatCount(1500) // { full: "1.5K", value: "1.5", postfix: "K", raw: Decimal }
formatCount(2_500_000) // { full: "2.5M", ... }Nano
import { fromNanoToDecimal, fromDecimalToNano } from '@pavelpotemkin/utils'
fromNanoToDecimal('1500000000') // Decimal(1.5)
fromDecimalToNano(new Decimal(1.5)) // 1500000000Utils
import {
awaitMs,
getRandomInt,
debounce,
throttle,
createDelayedResolver,
hexToRgba,
} from '@pavelpotemkin/utils'
await awaitMs(100)
getRandomInt(1, 10)
const { debouncedFunction, cancel } = debounce(fn, 300)
const throttled = throttle(fn, 100)
const { promise, resolve } = createDelayedResolver<string>()
hexToRgba('#ff0000', 0.5) // "rgba(255, 0, 0, 0.5)"Types
import type { Optional, Brand } from '@pavelpotemkin/utils'
type UserId = Brand<string, 'UserId'>
const name: Optional<string> = null // string | null | undefined