@cranberry-money/shared-utils
Version:
Shared utility functions for Blueberry platform
158 lines (102 loc) • 4.28 kB
Markdown
Shared utility functions for the Blueberry platform, supporting both web (Blueberry) and mobile (Blackberry) applications.
## Installation
```bash
npm install @myportfolio/shared-utils
```
## Usage
```typescript
import { formatCurrency, formatDate, hasActiveFilters, truncateText } from '@myportfolio/shared-utils';
// Currency formatting
const amount = formatCurrency(1234.56); // "1,234.56"
// Date formatting
const date = formatDate('2024-01-15T10:30:00Z'); // "1/15/2024"
// Filter utilities
const hasFilters = hasActiveFilters({ name: 'Apple', category: '', page: 1 }); // true
// Text utilities
const short = truncateText('This is a very long text', 10); // "This is a..."
```
- `formatCurrency(value)` - Format number with commas and 2 decimals
- `parseCurrencyInput(value)` - Parse currency string to number
- `formatCurrencyWithCode(value, code, locale, minDigits, maxDigits)` - Format with currency code
- `formatDefaultCurrency(value, minDigits, maxDigits)` - Format with default currency (AUD)
#### Dates (`formatters/dates.ts`)
- `formatDate(dateString, fallback)` - Format ISO date to localized date
- `formatShortDate(dateString, locale)` - Format to short date (e.g., "Jan 15")
- `formatTime(dateString, locale)` - Format to 24-hour time
- `formatDateTime(dateString, locale)` - Format to "Jan 15 14:30"
#### Numbers (`formatters/numbers.ts`)
- `formatShares(shares, locale)` - Format share quantities (no decimals)
### Helpers
#### Filters (`helpers/filters.ts`)
- `hasActiveFilters<T>(filters, excludeFields)` - Check if any filters are active
- `countActiveFilters<T>(filters, excludeFields)` - Count active filters
- `clearAllFilters<T>(filters, preserveFields)` - Clear all filter values
- `updateFilters<T>(currentFilters, updates)` - Type-safe filter updates
#### Text (`helpers/text.ts`)
- `truncateText(text, maxLength)` - Truncate text with ellipsis
## Platform Compatibility
This package is designed to work across:
- Web applications (React) - Direct use of utility functions
- Mobile applications (React Native) - Platform-agnostic implementations
- Node.js environments - For server-side utility needs
### Platform-Specific Considerations
#### Date Formatting
The date formatters use `Intl.DateTimeFormat` and `toLocaleDateString` which work consistently across web and React Native platforms.
#### Currency Formatting
Currency formatters use `Intl.NumberFormat` which provides consistent formatting across platforms with proper locale support.
#### Filter Utilities
Filter utilities are completely platform-agnostic and work with any TypeScript object structure.
## Examples
### Currency Formatting
```typescript
import { formatCurrency, formatCurrencyWithCode } from '@myportfolio/shared-utils';
// Basic formatting
formatCurrency(1234.56); // "1,234.56"
formatCurrency('1234.56'); // "1,234.56"
// With currency code
formatCurrencyWithCode(1234.56, 'USD', 'en-US', 2, 2); // "$1,234.56"
formatCurrencyWithCode(1234.56, 'AUD', 'en-AU', 0, 0); // "A$1,235"
```
```typescript
import { hasActiveFilters, countActiveFilters, clearAllFilters } from '@myportfolio/shared-utils';
const filters = {
searchQuery: 'apple',
category: 'technology',
minPrice: 100,
maxPrice: null,
tags: [],
};
// Check for active filters (excluding searchQuery by default)
hasActiveFilters(filters); // true (category and minPrice are active)
// Count active filters
countActiveFilters(filters); // 2 (category and minPrice)
// Clear all filters while preserving searchQuery
const cleared = clearAllFilters(filters, ['searchQuery']);
// Result: { searchQuery: 'apple' }
```
```typescript
import { formatDate, formatDateTime, formatShortDate } from '@myportfolio/shared-utils';
const isoDate = '2024-01-15T14:30:00Z';
formatDate(isoDate); // "1/15/2024"
formatShortDate(isoDate); // "Jan 15"
formatDateTime(isoDate); // "Jan 15 14:30"
```
```bash
npm run build
npm run dev
npm run typecheck
```
- `@myportfolio/shared-constants` - For currency and formatting constants
MIT