UNPKG

ream.js

Version:

A comprehensive, functional datetime library for JavaScript/TypeScript with immutable data structures, real IANA timezone database support, DST handling, and a plugin system

140 lines (103 loc) 4.29 kB
# ream.js A comprehensive, functional datetime library for JavaScript/TypeScript with immutable data structures, **real IANA timezone database support**, and a plugin system. ## Features - 🚀 **Functional Programming**: Pure functions and immutable data structures - 🌍 **Real Timezone Database**: Full IANA timezone support with automatic DST detection - 🕐 **DST Handling**: Accurate daylight saving time transitions and calculations - 📅 **Calendar Arithmetic**: Safe date/time arithmetic with overflow handling - 🎨 **Formatting System**: Comprehensive token-based formatting with locale support - ⏱️ **Duration Operations**: Monoid operations and humanization - 🔄 **Recurrence Generators**: Flexible recurring date/time patterns - 🔌 **Plugin System**: Extensible architecture for custom functionality - 📦 **TypeScript**: Full TypeScript support with comprehensive type definitions - 🌐 **Zero Dependencies**: Uses built-in `Intl` API for timezone data ## Installation ```bash npm install ream.js ``` ## Quick Start ```typescript import ream from 'ream.js'; // Create dates const date = ream('2023-07-15T14:30:45.123Z'); const now = ream(); // Chain operations const result = date .add(1, 'days') .subtract(2, 'hours') .tz('America/New_York') .format('YYYY-MM-DD HH:mm:ss'); // Use generators const monthly = everyMonth()(date); const firstMonth = monthly.next().value; const secondMonth = monthly.next().value; // Use plugins const extended = extend(relativePlugin)(date); console.log(extended.fromNow()); // "2 hours ago" ``` ## Core Types - **Instant**: Point in time (epoch milliseconds) - **Duration**: Time span with monoid operations - **PlainDate**: Calendar date without timezone - **PlainTime**: Time of day without timezone - **PlainDateTime**: Combined date and time - **ZDT**: Zoned DateTime with functor operations ## API Documentation For complete API documentation, see the [REAM.md specification](./REAM.md). ## Development ```bash # Install dependencies npm install # Run tests npm test # Build the library npm run build # Watch mode for development npm run watch:test ``` ## Real Timezone Database Support ream.js includes comprehensive support for real IANA timezone data using the built-in JavaScript `Intl` API: ```typescript import ream, { getTimezoneInfo, isDST, isValidTimezone } from 'ream.js'; // Real timezone information const tzInfo = getTimezoneInfo('America/New_York', instant(Date.now())); console.log(tzInfo); // { // name: 'America/New_York', // offsetMinutes: -240, // EDT (UTC-4) or -300 (EST, UTC-5) // dst: true, // true during daylight saving time // abbreviation: 'EDT' // timezone abbreviation // } // Enhanced ReamDate with timezone methods const date = ream('2023-07-15T14:30:00', 'America/New_York'); console.log(date.timezone().name); // 'America/New_York' console.log(date.timezone().abbreviation); // 'EDT' console.log(date.isDST()); // true console.log(date.offset()); // -240 // Timezone validation and utilities console.log(isValidTimezone('America/New_York')); // true console.log(isDST('Europe/London')); // depends on current date // Convert between timezones const utcDate = ream('2023-07-15T16:30:00Z'); const nyDate = utcDate.tz('America/New_York'); const londonDate = utcDate.tz('Europe/London'); ``` ### Features: - ✅ Real IANA timezone data (no external dependencies) - ✅ Automatic DST detection and handling - ✅ Timezone abbreviations (EST, EDT, GMT, BST, etc.) - ✅ Timezone validation - ✅ Support for all IANA timezone identifiers - ✅ Works in browsers and Node.js See [TIMEZONE_FEATURES.md](./TIMEZONE_FEATURES.md) for comprehensive documentation. ## Publishing This library uses automated npm publishing via GitHub Actions. To publish a new version: 1. Update the version in `package.json` 2. Create a new GitHub release with a tag matching the version (e.g., `v1.0.1`) 3. The GitHub Action will automatically run tests and publish to npm ### Setup NPM Publishing (for maintainers) 1. Create an npm account and generate an access token 2. Add the token as a GitHub secret named `NPM_TOKEN` 3. Ensure the package name in `package.json` is available on npm ## License MIT