@jasonbyrne/dry-types
v0.2.10
Published
Reusable utility functions for type conversions and checks
Downloads
1,525
Maintainers
Readme
dry-types
Reusable utility functions for type conversions and checks. Stop writing the same type conversion and validation code over and over.
Installation
npm install @jasonbyrne/dry-typesUsage
import { toNumber, isNumber, toString, isString } from "@jasonbyrne/dry-types";
// Type conversions
const num = toNumber("42"); // 42
const str = toString(42); // '42'
// Type checks
if (isNumber(value)) {
// TypeScript knows value is number here
console.log(value * 2);
}API Reference
Type Guards and Validators (is*)
Functions that check if a value matches a certain condition. Return boolean and use TypeScript type predicates when appropriate.
General Type Checks
isNullOrUndefined(value: unknown): value is null | undefined- Checks if value is null or undefinedisUndefined(value: unknown): value is undefined- Checks if value is undefinedisNull(value: unknown): value is null- Checks if value is nullisEmpty(value: unknown): boolean- Checks if value is empty (null, undefined, empty string, empty array, or empty object)isFalsy(value: unknown): boolean- Checks if value is falsyisTruthy(value: unknown): boolean- Checks if value is truthyisTrue(value: unknown): boolean- Checks if value is exactlytrueisFalse(value: unknown): boolean- Checks if value is exactlyfalseisBoolean(value: unknown): value is boolean- Checks if value is a booleanisFunction(value: unknown): value is Function- Checks if value is a functionisPrimitive(value: unknown): value is string | number | boolean | null | undefined | symbol | bigint- Checks if value is a primitive typeisSymbol(value: unknown): value is symbol- Checks if value is a Symbol
String Validators
isString(value: unknown): value is string- Checks if value is a stringisNonEmptyString(value: unknown): value is string- Checks if value is a non-empty string (after trimming)isEmail(value: unknown): boolean- Validates email formatisUrl(value: unknown): boolean- Validates URL formatisUuid(value: unknown): boolean- Validates UUID format (supports all UUID versions)isNumericString(value: unknown): boolean- Checks if string contains only numbersisJsonString(value: unknown): value is string- Checks if value is a valid JSON string
Number Validators
isNumber(value: unknown): value is number- Checks if value is a valid number (not NaN and finite)isInteger(value: unknown): value is number- Checks if value is an integerisPositiveNumber(value: unknown): value is number- Checks if value is a positive numberisNegativeNumber(value: unknown): value is number- Checks if value is a negative numberisNonNegativeNumber(value: unknown): value is number- Checks if value is a non-negative number (zero or positive)isNonPositiveNumber(value: unknown): value is number- Checks if value is a non-positive number (zero or negative)isNumberBetween(value: unknown, min: number, max: number): boolean- Checks if number is between two values (inclusive)isGreaterThan(value: unknown, min: number): boolean- Checks if number is greater than a minimum valueisGreaterThanOrEqualTo(value: unknown, min: number): boolean- Checks if number is greater than or equal to a minimum valueisLessThan(value: unknown, max: number): boolean- Checks if number is less than a maximum valueisLessThanOrEqualTo(value: unknown, max: number): boolean- Checks if number is less than or equal to a maximum value
Array Validators
isArray(value: unknown): value is any[]- Checks if value is an arrayisEmptyArray(value: unknown): value is any[]- Checks if array is emptyisNonEmptyArray(value: unknown): value is any[]- Checks if array has items (is not empty)
Object Validators
isObject(value: unknown): value is Record<string, unknown>- Checks if value is an object (not null, not array)isPlainObject(value: unknown): value is Record<string, unknown>- Checks if value is a plain object (not array, Date, RegExp, etc.)isEmptyObject(value: unknown): boolean- Checks if object has no keys
Date Validators
isDate(value: unknown): value is Date- Checks if value is a Date objectisDateString(value: unknown): value is string- Checks if value is a date string in YYYY-MM-DD formatisTimeString(value: unknown): value is string- Checks if value is a time string in HH:MM:SS formatisDateTimeString(value: unknown): value is string- Checks if value is a date-time string in YYYY-MM-DDTHH:MM:SS formatisDateBetween(value: unknown, start: unknown, end: unknown): boolean- Checks if date is between two other dates (inclusive)isAfter(value: unknown, date: unknown): boolean- Checks if date is after another dateisBefore(value: unknown, date: unknown): boolean- Checks if date is before another dateisBeforeEndDate(dateToCheck: unknown, endDate: unknown): boolean- Checks if date is before end date (treats end date as end of day)isAfterStartDate(dateToCheck: unknown, startDate: unknown): boolean- Checks if date is after start date (treats start date as start of day)isDateInRange(dateToCheck: unknown, startDate: unknown, endDate: unknown): boolean- Checks if date is within a date rangeisToday(date: unknown): boolean- Checks if date is today
Type Converters (to*)
Functions that transform or convert a value from one type/format to another. Return the converted value or a default value if conversion fails.
String Converters
toString(value: unknown, defaultValue?: string): string- Converts a value to a stringtoTrimmedString(value: unknown, defaultValue?: string): string- Converts a value to a trimmed string (removes leading and trailing whitespace)toLowerCase(value: unknown, defaultValue?: string): string- Converts a value to lowercasetoUpperCase(value: unknown, defaultValue?: string): string- Converts a value to uppercasetoCapitalized(value: unknown, defaultValue?: string): string- Capitalizes the first letter of a stringtoCamelCase(value: unknown, defaultValue?: string): string- Converts a string to camelCasetoSnakeCase(value: unknown, defaultValue?: string): string- Converts a string to snake_casetoKebabCase(str: string): string- Converts a string to kebab-case (lowercase with hyphens)toPascalCase(str: string): string- Converts a string to PascalCase (capitalizes first letter of each word, no separators)toTitleCase(str: string): string- Converts a string to title case (capitalizes first letter of each word, except common articles/prepositions)toSentenceCase(str: string): string- Converts a string to sentence case (capitalizes first letter of each word, rest lowercase)truncate(value: unknown, maxLength: number, suffix?: string): string- Truncates a string to a maximum length with an optional suffixstripSpecialCharacters(str: string): string- Removes special characters from a string, keeping only alphanumeric characters, hyphens, and spacesstripExtraWhitespace(str: string): string- Replaces multiple consecutive whitespace characters with a single spacegetClampedString<T extends string>(value: unknown, enumValues: T[]): T- Gets a clamped string from a value and an array of enum values
Number Converters
toNumber(value: unknown, defaultValue?: number): number- Converts a value to a numbertoInteger(value: unknown, defaultValue?: number): number- Converts a value to an integer (rounds to nearest)toPositiveNumber(value: unknown, defaultValue?: number): number- Converts a value to a positive numbertoNegativeNumber(value: unknown, defaultValue?: number): number- Converts a value to a negative numbertoNonNegativeNumber(value: unknown, defaultValue?: number): number- Converts a value to a non-negative number (zero or positive)toNonPositiveNumber(value: unknown, defaultValue?: number): number- Converts a value to a non-positive number (zero or negative)toClampedNumber(value: unknown, min: number, max: number): number- Clamps a number between a minimum and maximum valueround(value: unknown, precision?: number): number- Rounds a number to a specified precisionroundDown(value: unknown, precision?: number): number- Rounds a number down to a specified precisionroundUp(value: unknown, precision?: number): number- Rounds a number up to a specified precisionroundToNearest(value: unknown, divisor: number): number- Rounds a number to the nearest multiple of a divisor (e.g., round to nearest 10, 0.5, etc.)
Date Converters
toDate(value: unknown, defaultValue?: Date | null): Date | null- Converts a value to a Date objecttoEpochMsTimestamp(value: unknown, defaultValue?: number | null): number | null- Converts a value to an epoch timestamp in millisecondstoEpochSecondsTimestamp(value: unknown, defaultValue?: number | null): number | null- Converts a value to an epoch timestamp in secondstoISODateString(value: unknown, defaultValue?: string | null): string | null- Converts a value to an ISO date stringtoLocaleDateString(value: unknown, defaultValue?: string | null, opts?: DateTimeFormatOptions): string | null- Converts a value to a locale-formatted date stringtoLocaleTimeString(value: unknown, defaultValue?: string | null, opts?: DateTimeFormatOptions): string | null- Converts a value to a locale-formatted time stringtoDateString(value: unknown, defaultValue?: string | null): string | null- Converts a value to a date string in YYYY-MM-DD formattoTimeString(value: unknown, defaultValue?: string | null): string | null- Converts a value to a time string in HH:MM:SS formattoDateTimeString(value: unknown, defaultValue?: string | null): string | null- Converts a value to a date-time string in YYYY-MM-DD HH:MM:SS format
Array Converters
toArray(value: unknown, defaultValue?: any[]): any[]- Converts a value to an arraytoUniqueArray(value: unknown, defaultValue?: any[]): any[]- Converts a value to a unique array (removes duplicates)toStringArray(value: unknown, defaultValue?: string[]): string[]- Converts a value to an array of stringstoNumberArray(value: unknown, defaultValue?: number[]): number[]- Converts a value to an array of numberstoFlattenedArray<T>(array: T[] | undefined | null, depth?: number): any[]- Flattens a nested array to a specified depth
Object Converters
toObject(value: unknown, defaultValue?: Record<string, unknown>): Record<string, unknown>- Converts a value to an objecttoKeysArray(obj: unknown): string[]- Gets object keys as an arraytoValuesArray(obj: unknown): unknown[]- Gets object values as an array
Other Converters
toBoolean(value: unknown): boolean- Converts a value to a booleantoLength(value: unknown): number- Gets the length of a value (strings, arrays, objects, numbers)toNumberString(value: unknown, opts?: NumberStringOptions): string- Converts a value to a formatted number string using Intl.NumberFormattoCurrency(value: unknown, opts?: CurrencyFormatOptions): string- Converts a value to a currency-formatted stringtoJSON(value: unknown, defaultValue?: string | null): string | null- Safely stringify a value to JSONfromJSON<T>(value: unknown, defaultValue: T): T- Safely parse a JSON string
Getters and Computed Values (get*)
Functions that retrieve or compute a value from input(s). These don't convert types but rather extract or calculate values.
Array Getters
getFirst<T, D>(array: T[] | undefined | null, defaultValue?: D): T | D | undefined- Gets the first element of an arraygetLast<T, D>(array: T[] | undefined | null, defaultValue?: D): T | D | undefined- Gets the last element of an arraygetSum(array: unknown[] | undefined | null): number- Calculates the sum of an array of numbersgetAverage(array: unknown[] | undefined | null): number- Calculates the average of an array of numbersgetMax(array: unknown[] | undefined | null): number | undefined- Gets the maximum value from an arraygetMin(array: unknown[] | undefined | null): number | undefined- Gets the minimum value from an array
Date Getters
getDateDifference(value: unknown, date: unknown): number- Gets the difference between two dates in millisecondsgetDaysBetween(date1: unknown, date2: unknown): number | null- Gets the number of days between two datesgetMonthsBetween(date1: unknown, date2: unknown): number | null- Gets the number of months between two datesgetYearsBetween(date1: unknown, date2: unknown): number | null- Gets the number of years between two datesgetAge(birthDate: unknown): number | null- Calculates age from a birth dategetRelativeTime(date: unknown, options?: RelativeTimeOptions): string | null- Gets a human-readable relative time string (e.g., "2 years ago", "3 minutes ago")getLastDateOfMonth(value?: unknown): string- Gets the last date of the month for a given dategetLastDateOfYear(value?: unknown): string- Gets the last date of the year for a given dategetLastDateOfQuarter(value?: unknown): string- Gets the last date of the quarter for a given dategetFirstDateOfMonth(value?: unknown): string- Gets the first date of the month for a given dategetFirstDateOfYear(value?: unknown): string- Gets the first date of the year for a given dategetFirstDateOfWeek(value?: unknown): string- Gets the first date of the week (Sunday) for a given dategetFirstDateOfQuarter(value?: unknown): string- Gets the first date of the quarter for a given dategetStartOfDay(value: unknown): Date | null- Converts a date value to the start of that day (00:00:00.000)getEndOfDay(value: unknown): Date | null- Converts a date value to the end of that day (23:59:59.999)getCurrentDateString(): string- Returns the current date string in YYYY-MM-DD formatgetMinDate(values: Array<unknown>): Date | null- Returns the earliest (minimum) date from the provided valuesgetMaxDate(values: Array<unknown>): Date | null- Returns the latest (maximum) date from the provided valuesgetNumbersBetween(min: number, max: number, step?: number): number[]- Generates an array of numbers between min and max (inclusive) with a specified step
Object Getters
hasProperty(obj: unknown, key: string | number | symbol): boolean- Checks if an object has a propertygetProperty<T, K, D>(obj: T, key: K, defaultValue?: D): unknown- Safely gets a property from an object with a default value
Generators (generate*)
Functions that generate or create new values, often random or unique.
generatePassword(length?: number): string- Generates a secure random passwordgenerateUniqueId(prefix?: string): string- Generates a unique ID for form elements and other components
Random Selection (pick*)
Functions that randomly select or pick values from collections.
pickRandom<T>(arr: T[]): T- Picks a random element from an arraypickRandom<T>(arr: T[], count: number): T[]- Picks multiple random elements from an arraypickRandomIndex<T>(arr: T[]): number- Picks a random index from an arraypickRandomIndex<T>(arr: T[], count: number): number[]- Picks multiple random indices from an array
Random Generators
randomInt(min: number, max: number): number- Generates a random integer between min and max (inclusive)randomFloat(min: number, max: number): number- Generates a random floating-point number between min (inclusive) and max (exclusive)randomBoolean(): boolean- Generates a random boolean valuerandomString(length: number): string- Generates a random alphanumeric string of specified lengthrandomDate(min: Date, max: Date): Date- Generates a random Date between min and maxrandomColor(): string- Generates a random hex color code
Date Operations
addDays(days: number, date?: unknown): string- Adds days to a date and returns the result as a YYYY-MM-DD stringaddMonths(date: unknown, months: number): Date | null- Adds months to a dateaddYears(date: unknown, years: number): Date | null- Adds years to a dateaddHours(date: unknown, hours: number): Date | null- Adds hours to a dateaddMinutes(date: unknown, minutes: number): Date | null- Adds minutes to a dateaddSeconds(date: unknown, seconds: number): Date | null- Adds seconds to a datecompareDates(date1: unknown, date2: unknown): number | null- Compares two date values (-1 if date1 < date2, 0 if equal, 1 if date1 > date2)
Regex Utilities
matchesAnyPattern(input: string, patterns: Array<Pattern>): boolean- Tests if any of the provided patterns match the input stringmatchesAllPatterns(input: string, patterns: Array<Pattern>): boolean- Tests if all of the provided patterns match the input stringextractFromAnyPattern(input: string, patterns: Array<Pattern>): RegExpMatchArray | null- Returns the first successful match from any of the provided patternsextractAllMatches(input: string, patterns: Array<Pattern>): RegExpMatchArray[]- Returns all matches from all patterns that match the inputextractCaptureGroup(input: string, patterns: Array<Pattern>, groupIndex?: number): string | null- Extracts a specific capture group from the first matching patternextractAllCaptureGroups(input: string, patterns: Array<Pattern>): string[]- Extracts all capture groups from the first matching patternfindFirstMatchingPattern(input: string, patterns: Array<Pattern>): Pattern | null- Finds the first pattern that matches (returns the pattern itself, not the match)extractBetween(input: string, startPattern: Pattern, endPattern: Pattern): string | null- Extracts text between two patternsextractNumbers(input: string, patterns: Array<Pattern>): number[]- Extracts numeric values from the first matching pattern's capture groupsmatchAndExtract<T>(input: string, patterns: Array<Pattern>, extractor: (match: RegExpMatchArray) => T): T | null- Tests if input matches a pattern and extracts a specific data type using a custom extractor functiontoRegex(pattern: string, caseInsensitive?: boolean, escapeSpecialChars?: boolean): RegExp- Converts a string pattern to a RegExpcontainsAny(input: string, patterns: Array<Pattern>): boolean- Tests if the input string contains any of the provided patternscontainsAll(input: string, patterns: Array<Pattern>): boolean- Tests if the input string contains all of the provided patternsfindIndexOfFirstMatch(input: string, patterns: Array<Pattern>): number- Finds the index of the first pattern that matches the input
Hash Utilities
generateObjectHash(data: unknown): Promise<string>- Creates a SHA-256 hash from a JSON object (normalizes the object by sorting properties)generateQuickHash(data: unknown): number- Creates a deterministic hash from any JSON-serializable data (synchronous, not cryptographically secure)
Enum Utilities
createTypedEnum<T extends EnumDefinition>(enumMap: T): TypedEnum<T>- Creates a typed enum definition from a map of enum entriesEnum<T>- Type that extracts enum keys from either a TypedEnum instance or an EnumDefinition
Enum Types
EnumEntryProps- Properties that can be defined for each enum entryEnumEntryOutput- Output properties for enum entriesEnumDefinition- Map of enum keys to their propertiesTypedEnum<T>- Typed enum mapper that provides type-safe access to enum values, options, and utilities
Utility Functions
ifDefined<Input, Output>(value: Input | undefined, callback: (value: Input) => Output): Output | undefined- Type-safe conditional transformation: returns undefined if value is undefined, otherwise transforms the value using the callback functioncoalesce<T>(...values: T[]): T | null- Returns the first non-null, non-undefined value from the provided argumentsdefer(fn: () => Promise<void> | void, delay?: number): ReturnType<typeof setTimeout>- Defers execution of a function by a specified delaydebounce<TArgs, TResult>(func: (...args: TArgs) => Promise<TResult>, delay?: number): (...args: TArgs) => Promise<TResult>- Debounces an async function, executing it only after the specified delay has passed since the last invocationdeepEquals(a: unknown, b: unknown, aStack?: unknown[], bStack?: unknown[]): boolean- Performs a deep equality comparison between two values, handling circular references
Type Exports
The library also exports useful TypeScript utility types:
Generic Types (from generics.ts)
Maybe<T>-T | null | undefinedPrimitive- Union of all primitive typesObject<T>-Record<string, T>Nullable<T>-T | nullOptional<T>-T | undefinedRequired<T>- Makes T required (not undefined)Readonly<T>- Makes all properties readonlyWritable<T>- Makes all properties writableDeepReadonly<T>- Makes all properties recursively readonlyDeepWritable<T>- Makes all properties recursively writableWithRequired<T, K>- Make K in T requiredRequireOnly<T, K>- Make everything in T optional, except for the keys in KNumberConstraint- Constraint type for number formatting:"positive-only" | "negative-only" | "non-negative" | "non-positive" | "non-zero" | "zero-only"SignDisplay- Sign display type:"auto" | "always" | "exceptZero" | "negative" | "never" | "parentheses"
Regex Types (from regex.ts)
Pattern-RegExp | string- Type for regex patterns used in regex utility functions
Date Types (from date/constants.ts)
DateTimeFormatOptions- Options for locale-specific date/time formattingMonthFormatOptions- Options for formatting months (format, locale)DayOfWeekFormatOptions- Options for formatting days of week (format, locale)RelativeTimeOptions- Options for relative time formatting (referenceDate, threshold, round, maxUnit, minUnit)
Number Types (from number.ts)
NumberStringOptions- Options for number string formatting (locale, decimal places, constraint, signDisplay, nullValue, intlOptions)
Currency Types (from currency.ts)
CurrencyFormatOptions- Options for currency formatting (grain, currency, constraint, signDisplay, nullValue, maxDecimalPlaces, locale, intlOptions)
Password Types (from password.ts)
GeneratePasswordOptions- Options for password generationPasswordRules- Rules for password validation
Naming Conventions
This library follows consistent naming patterns to make the API predictable and easy to use:
is* - Type Guards and Validators
Functions that check if a value matches a certain condition. Return boolean and use TypeScript type predicates when appropriate.
Pattern: is[Condition](value, ...args): boolean
to* - Type Converters
Functions that transform or convert a value from one type/format to another. Return the converted value or a default value if conversion fails.
Pattern: to[TargetType](value, defaultValue?, ...opts?): TargetType | DefaultType
get* - Getters and Computed Values
Functions that retrieve or compute a value from input(s). These don't convert types but rather extract or calculate values.
Pattern: get[ComputedValue](value?, ...args?): ReturnType
generate* - Generators
Functions that generate or create new values, often random or unique.
Pattern: generate[Type](...args?): ReturnType
pick* - Random Selection
Functions that randomly select or pick values from collections.
Pattern: pick[Type](collection, count?): ReturnType
Development
# Install dependencies
npm install
# Build the library
npm run build
# Run tests
npm test
# Watch mode for development
npm run devLicense
MIT © Jason Byrne
