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

491 lines 45.6 kB
"use strict"; /********************************************************************* * REAM-DATETIME v3.0 — Full-blown Day.js/Moment replacement * Includes: IANA time-zones, DST math, calendars, locale, plug-ins * Everything is pure, total, and categorically composable. ********************************************************************/ Object.defineProperty(exports, "__esModule", { value: true }); exports.businessPlugin = exports.relativePlugin = exports.extend = exports.humanize = exports.everyMonth = exports.everyWeek = exports.everyDay = exports.every = exports.durationOfInterval = exports.interval = exports.isDST = exports.getTimezoneOffset = exports.isValidTimezone = exports.offset = exports.toZone = exports.toUTC = exports.withZoneName = exports.withZone = exports.zone = exports.UTC = exports.startOfWeek = exports.dayOfWeek = exports.addMilliseconds = exports.addSeconds = exports.addMinutes = exports.addHours = exports.addDays = exports.addMonths = exports.addYears = exports.addDuration = exports.parseISO = exports.toPlain = exports.fromPlain = exports.dateTime = exports.now = exports.duration = exports.instant = exports.durations = exports.sub = exports.add = exports.zero = exports.format = exports.formatToken = exports.calendars = exports.zfmap = exports.zdt = exports.getAvailableTimezones = exports.tzOffset = exports.getTimezoneInfo = exports.MILLIS = exports.daysInMonth = exports.isLeap = void 0; /* ------------------------------------------------------------------ * * 0. INTERNAL UTILS * ------------------------------------------------------------------ */ exports.isLeap = (y) => (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0; exports.daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; exports.MILLIS = { SECOND: 1000, MINUTE: 60000, HOUR: 3600000, DAY: 86400000, WEEK: 604800000, }; /* Real timezone data using Intl API */ exports.getTimezoneInfo = (tzName, instant) => { var _a; try { // Validate timezone name using Intl API new Intl.DateTimeFormat('en', { timeZone: tzName }); const date = new Date(instant.epochMs); // Simple and reliable method using Date.prototype.toLocaleString const utcTime = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' })); const localTime = new Date(date.toLocaleString('en-US', { timeZone: tzName })); // Calculate offset in minutes (Local - UTC, negated to match standard convention) const offsetMinutes = -Math.round((utcTime.getTime() - localTime.getTime()) / (1000 * 60)); // Determine if DST is active by comparing with standard time const year = date.getFullYear(); const januaryDate = new Date(year, 0, 1, 12, 0, 0); const julyDate = new Date(year, 6, 1, 12, 0, 0); const getOffsetForDate = (testDate) => { const utcTest = new Date(testDate.toLocaleString('en-US', { timeZone: 'UTC' })); const localTest = new Date(testDate.toLocaleString('en-US', { timeZone: tzName })); return -Math.round((utcTest.getTime() - localTest.getTime()) / (1000 * 60)); }; const janOffset = getOffsetForDate(januaryDate); const julOffset = getOffsetForDate(julyDate); // For northern hemisphere timezones like America/New_York: // - Winter (January) is standard time (more negative offset, e.g., -300 for EST) // - Summer (July) is DST (less negative offset, e.g., -240 for EDT) // Standard time is the more negative offset (smaller value) const standardOffset = Math.min(janOffset, julOffset); const dst = offsetMinutes > standardOffset; // Get timezone abbreviation const abbreviation = (_a = new Intl.DateTimeFormat('en', { timeZone: tzName, timeZoneName: 'short', }) .formatToParts(date) .find((part) => part.type === 'timeZoneName')) === null || _a === void 0 ? void 0 : _a.value; return { name: tzName, offsetMinutes, dst, abbreviation, }; } catch (_b) { // Fallback to UTC for invalid timezone names return { name: 'UTC', offsetMinutes: 0, dst: false, abbreviation: 'UTC', }; } }; /* compute offset for any instant using real TZDB */ exports.tzOffset = (tz, i) => { const tzInfo = exports.getTimezoneInfo(tz, i); return tzInfo.offsetMinutes; }; /* Get list of available timezones */ exports.getAvailableTimezones = () => { // Common IANA timezone identifiers return Object.freeze([ 'UTC', 'America/New_York', 'America/Chicago', 'America/Denver', 'America/Los_Angeles', 'America/Toronto', 'America/Vancouver', 'America/Mexico_City', 'America/Sao_Paulo', 'America/Argentina/Buenos_Aires', 'Europe/London', 'Europe/Paris', 'Europe/Berlin', 'Europe/Rome', 'Europe/Madrid', 'Europe/Amsterdam', 'Europe/Stockholm', 'Europe/Moscow', 'Asia/Tokyo', 'Asia/Shanghai', 'Asia/Hong_Kong', 'Asia/Singapore', 'Asia/Mumbai', 'Asia/Dubai', 'Asia/Seoul', 'Asia/Bangkok', 'Australia/Sydney', 'Australia/Melbourne', 'Australia/Perth', 'Pacific/Auckland', 'Pacific/Honolulu', 'Africa/Cairo', 'Africa/Johannesburg', 'Africa/Lagos', ]); }; exports.zdt = (i, z, p) => ({ instant: i, zone: z, payload: p, }); /* Functor map */ exports.zfmap = (f) => (z) => (Object.assign(Object.assign({}, z), { payload: f(z.payload) })); exports.calendars = { gregory: { firstDay: 1, monthNames: Array.from({ length: 12 }, (_, i) => new Date(2020, i).toLocaleString('en', { month: 'long' })), }, iso8601: { firstDay: 1, monthNames: Array.from({ length: 12 }, (_, i) => new Date(2020, i).toLocaleString('en', { month: 'long' })), }, buddhist: { firstDay: 1, monthNames: [ 'Poson', 'Āsāḷha', 'Sāvana', 'Bhādrapada', 'Āśvina', 'Kārttika', 'Mārgaśīrṣa', 'Pauṣa', 'Māgha', 'Phālguna', 'Caitra', 'Vaiśākha', ], }, persian: { firstDay: 1, monthNames: [ 'Farvardin', 'Ordibehesht', 'Khordad', 'Tir', 'Mordad', 'Shahrivar', 'Mehr', 'Aban', 'Azar', 'Dey', 'Bahman', 'Esfand', ], }, }; exports.formatToken = (token, pdt, locale) => { const d = new Date(pdt.y, pdt.m - 1, pdt.d, pdt.h, pdt.min, pdt.s, pdt.ms); switch (token) { case 'YYYY': return d.getFullYear().toString(); case 'YY': return d.getFullYear().toString().slice(-2); case 'MMMM': return d.toLocaleString(locale, { month: 'long' }); case 'MMM': return d.toLocaleString(locale, { month: 'short' }); case 'MM': return (d.getMonth() + 1).toString().padStart(2, '0'); case 'M': return (d.getMonth() + 1).toString(); case 'DD': return d.getDate().toString().padStart(2, '0'); case 'D': return d.getDate().toString(); case 'dddd': return d.toLocaleString(locale, { weekday: 'long' }); case 'ddd': return d.toLocaleString(locale, { weekday: 'short' }); case 'HH': return d.getHours().toString().padStart(2, '0'); case 'H': return d.getHours().toString(); case 'hh': return (d.getHours() % 12 || 12).toString().padStart(2, '0'); case 'h': return (d.getHours() % 12 || 12).toString(); case 'mm': return d.getMinutes().toString().padStart(2, '0'); case 'm': return d.getMinutes().toString(); case 'ss': return d.getSeconds().toString().padStart(2, '0'); case 's': return d.getSeconds().toString(); case 'SSS': return d.getMilliseconds().toString().padStart(3, '0'); case 'SS': return Math.floor(d.getMilliseconds() / 10) .toString() .padStart(2, '0'); case 'S': return Math.floor(d.getMilliseconds() / 100).toString(); case 'a': return d.getHours() < 12 ? 'am' : 'pm'; case 'A': return d.getHours() < 12 ? 'AM' : 'PM'; case 'Z': return '+00:00'; // UTC offset placeholder case 'ZZ': return '+0000'; // UTC offset placeholder default: return token; } }; exports.format = (pattern, pdt, locale = 'en') => pattern.replace(/(YYYY|YY|MMMM|MMM|MM|M|DD|D|dddd|ddd|HH|H|hh|h|mm|m|ss|s|SSS|SS|S|a|A|Z|ZZ)/g, (t) => exports.formatToken(t, pdt, locale)); /* ------------------------------------------------------------------ * * 6. DURATION ARITHMETIC (monoid) * ------------------------------------------------------------------ */ exports.zero = { ms: 0 }; exports.add = (d1, d2) => ({ ms: d1.ms + d2.ms, }); exports.sub = (d1, d2) => ({ ms: d1.ms - d2.ms, }); exports.durations = { milliseconds: (n) => ({ ms: n }), seconds: (n) => ({ ms: n * exports.MILLIS.SECOND }), minutes: (n) => ({ ms: n * exports.MILLIS.MINUTE }), hours: (n) => ({ ms: n * exports.MILLIS.HOUR }), days: (n) => ({ ms: n * exports.MILLIS.DAY }), weeks: (n) => ({ ms: n * exports.MILLIS.WEEK }), }; /* ------------------------------------------------------------------ * * 7. UTILITY FUNCTIONS * ------------------------------------------------------------------ */ exports.instant = (epochMs) => Object.freeze({ epochMs }); exports.duration = (ms) => Object.freeze({ ms }); exports.now = () => exports.instant(Date.now()); exports.dateTime = (y, month, d, h, min, s, ms) => ({ y, m: month, d, h, min, s, ms }); exports.fromPlain = (pdt) => { const epochMs = Date.UTC(pdt.y, pdt.m - 1, pdt.d, pdt.h, pdt.min, pdt.s, pdt.ms); return exports.instant(epochMs); }; exports.toPlain = (i) => { const d = new Date(i.epochMs); return { y: d.getUTCFullYear(), m: d.getUTCMonth() + 1, d: d.getUTCDate(), h: d.getUTCHours(), min: d.getUTCMinutes(), s: d.getUTCSeconds(), ms: d.getUTCMilliseconds(), }; }; exports.parseISO = (isoString) => { const d = new Date(isoString); if (isNaN(d.getTime())) { // Return epoch instead of throwing return { y: 1970, m: 1, d: 1, h: 0, min: 0, s: 0, ms: 0, }; } return { y: d.getUTCFullYear(), m: d.getUTCMonth() + 1, d: d.getUTCDate(), h: d.getUTCHours(), min: d.getUTCMinutes(), s: d.getUTCSeconds(), ms: d.getUTCMilliseconds(), }; }; exports.addDuration = (dur) => (i) => exports.instant(i.epochMs + dur.ms); /* ------------------------------------------------------------------ * * 8. CALENDAR ARITHMETIC (total, safe) * ------------------------------------------------------------------ */ const mod = (n, m) => ((n % m) + m) % m; exports.addYears = (n) => (d) => (Object.assign(Object.assign({}, d), { y: d.y + n })); exports.addMonths = (n) => (d) => { const total = d.m - 1 + n; const y = d.y + Math.floor(total / 12); const m = mod(total, 12) + 1; const dim = exports.daysInMonth[m - 1] + (m === 2 && exports.isLeap(y) ? 1 : 0); return { y, m, d: Math.min(d.d, dim) }; }; exports.addDays = (n) => (d) => { const ms = exports.fromPlain(exports.dateTime(d.y, d.m, d.d, 0, 0, 0, 0)).epochMs + n * exports.MILLIS.DAY; return exports.toPlain(exports.instant(ms)); }; exports.addHours = (n) => (dt) => { const ms = exports.fromPlain(dt).epochMs + n * exports.MILLIS.HOUR; return exports.toPlain(exports.instant(ms)); }; exports.addMinutes = (n) => (dt) => { const ms = exports.fromPlain(dt).epochMs + n * exports.MILLIS.MINUTE; return exports.toPlain(exports.instant(ms)); }; exports.addSeconds = (n) => (dt) => { const ms = exports.fromPlain(dt).epochMs + n * exports.MILLIS.SECOND; return exports.toPlain(exports.instant(ms)); }; exports.addMilliseconds = (n) => (dt) => { const ms = exports.fromPlain(dt).epochMs + n; return exports.toPlain(exports.instant(ms)); }; /* ------------------------------------------------------------------ * * 9. DAY-OF-WEEK / WEEK-BASED YEAR * ------------------------------------------------------------------ */ exports.dayOfWeek = (d) => { const t = new Date(d.y, d.m - 1, d.d).getDay(); return t === 0 ? 7 : t; }; exports.startOfWeek = (d, startOn = 1) => { const dow = exports.dayOfWeek(d); const diff = (dow - startOn + 7) % 7; return exports.addDays(-diff)(d); }; /* ------------------------------------------------------------------ * * 10. TIMEZONE SUPPORT * ------------------------------------------------------------------ */ exports.UTC = { name: 'UTC', offsetMinutes: 0, dst: false }; exports.zone = (name, instant = exports.now()) => { return exports.getTimezoneInfo(name, instant); }; exports.withZone = (z) => (dt) => exports.zdt(exports.fromPlain(dt), z, dt); exports.withZoneName = (zoneName) => (dt) => { const instant = exports.fromPlain(dt); const tz = exports.zone(zoneName, instant); return exports.zdt(instant, tz, dt); }; exports.toUTC = (zdtObj) => exports.zdt(exports.instant(zdtObj.instant.epochMs - zdtObj.zone.offsetMinutes * 60000), exports.UTC, zdtObj.payload); exports.toZone = (zoneName) => (zdtObj) => { const newZone = exports.zone(zoneName, zdtObj.instant); const adjustedMs = zdtObj.instant.epochMs + (newZone.offsetMinutes - zdtObj.zone.offsetMinutes) * 60000; return exports.zdt(exports.instant(adjustedMs), newZone, zdtObj.payload); }; exports.offset = (zdtObj) => exports.duration(zdtObj.zone.offsetMinutes * 60000); /* Timezone utility functions */ exports.isValidTimezone = (tzName) => { try { new Intl.DateTimeFormat('en', { timeZone: tzName }); return true; } catch (_a) { return false; } }; exports.getTimezoneOffset = (tzName, instant = exports.now()) => { return exports.tzOffset(tzName, instant); }; exports.isDST = (tzName, instant = exports.now()) => { const tzInfo = exports.getTimezoneInfo(tzName, instant); return tzInfo.dst; }; exports.interval = (s, e) => ({ start: s, end: e, }); exports.durationOfInterval = (iv) => exports.duration(iv.end.instant.epochMs - iv.start.instant.epochMs); exports.every = (dur) => function* (origin) { const generateNext = (cur) => { return (function* () { yield Object.assign(Object.assign({}, origin), { instant: exports.instant(cur) }); yield* generateNext(cur + dur.ms); })(); }; yield* generateNext(origin.instant.epochMs); }; exports.everyDay = exports.every(exports.durations.days(1)); exports.everyWeek = exports.every(exports.durations.weeks(1)); exports.everyMonth = (n = 1) => function* (origin) { const generateNext = (p) => { return (function* () { yield Object.assign(Object.assign({}, origin), { payload: p }); const newDate = exports.addMonths(n)(p); const newDateTime = Object.assign(Object.assign({}, newDate), { h: p.h, min: p.min, s: p.s, ms: p.ms }); yield* generateNext(newDateTime); })(); }; yield* generateNext(origin.payload); }; /* ------------------------------------------------------------------ * * 13. DURATION HUMANIZATION * ------------------------------------------------------------------ */ exports.humanize = (d) => { const abs = Math.abs(d.ms); const sign = d.ms < 0 ? '-' : ''; if (abs < 1000) return `${sign}${abs} ms`; if (abs < 60000) return `${sign}${Math.round(abs / 1000)} s`; if (abs < 3600000) return `${sign}${Math.round(abs / 60000)} min`; if (abs < 86400000) return `${sign}${Math.round(abs / 3600000)} h`; return `${sign}${Math.round(abs / 86400000)} d`; }; exports.extend = (plugin) => (rd) => plugin.install(rd); /* ------------------------------------------------------------------ * * 16. FACTORY AND IMPLEMENTATION * ------------------------------------------------------------------ */ /* Factory */ const ream = (input, zoneName = 'UTC') => { const instant = (() => { if (typeof input === 'string') { const parsed = exports.parseISO(input); return exports.fromPlain(parsed); } if (typeof input === 'number') return { epochMs: input }; if (input instanceof Date) return { epochMs: input.getTime() }; if (input) return exports.fromPlain(input); return exports.now(); })(); const timeZone = zoneName === 'UTC' ? exports.UTC : exports.zone(zoneName); return makeReam(instant, timeZone); }; const makeReam = (instant, timeZone) => ({ clone: () => makeReam(instant, timeZone), /* getters */ year: () => exports.toPlain(instant).y, month: () => exports.toPlain(instant).m, date: () => exports.toPlain(instant).d, day: () => exports.dayOfWeek(exports.toPlain(instant)), weekday: () => exports.dayOfWeek(exports.toPlain(instant)), hour: () => exports.toPlain(instant).h, minute: () => exports.toPlain(instant).min, second: () => exports.toPlain(instant).s, millisecond: () => exports.toPlain(instant).ms, /* mutators */ add: (v, unit) => makeReam(exports.addDuration(exports.durations[unit](v))(instant), timeZone), subtract: (v, unit) => makeReam(exports.addDuration(exports.durations[unit](-v))(instant), timeZone), /* formatters */ format: (p = 'YYYY-MM-DDTHH:mm:ss.SSSZ', l = 'en') => exports.format(p, exports.toPlain(instant), l), toISOString: () => { const d = new Date(instant.epochMs); return d.toISOString(); }, toLocaleString: (l = 'en') => exports.format('dddd, MMMM D, YYYY h:mm A', exports.toPlain(instant), l), /* timezone */ tz: (name) => makeReam(instant, exports.zone(name, instant)), utc: () => makeReam(instant, exports.UTC), timezone: () => timeZone, isDST: () => timeZone.dst, offset: () => timeZone.offsetMinutes, valueOf: () => instant.epochMs, }); exports.default = ream; /* ------------------------------------------------------------------ * * 17. EXAMPLE PLUGINS * ------------------------------------------------------------------ */ /* Plugin: relative-time */ const relative = (rd) => ({ fromNow: () => exports.humanize(exports.duration(Date.now() - rd.valueOf())), }); exports.relativePlugin = { install: (rd) => (Object.assign(Object.assign({}, rd), relative(rd))), }; /* Plugin: business days */ const business = (rd) => ({ nextBusinessDay: () => rd.day() === 6 || rd.day() === 0 ? rd.add(1, 'days') : rd, }); exports.businessPlugin = { install: (rd) => (Object.assign(Object.assign({}, rd), business(rd))), }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7c0VBSXNFOzs7QUFFdEU7O3dFQUV3RTtBQUMzRCxRQUFBLE1BQU0sR0FBRyxDQUFDLENBQVMsRUFBVyxFQUFFLENBQzNDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUNyQyxRQUFBLFdBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0QsUUFBQSxNQUFNLEdBQUc7SUFDcEIsTUFBTSxFQUFFLElBQUk7SUFDWixNQUFNLEVBQUUsS0FBTTtJQUNkLElBQUksRUFBRSxPQUFTO0lBQ2YsR0FBRyxFQUFFLFFBQVU7SUFDZixJQUFJLEVBQUUsU0FBVztDQUNsQixDQUFDO0FBOEJGLHVDQUF1QztBQUMxQixRQUFBLGVBQWUsR0FBRyxDQUFDLE1BQWMsRUFBRSxPQUFnQixFQUFZLEVBQUU7O0lBQzVFLElBQUk7UUFDRix3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXBELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV2QyxpRUFBaUU7UUFDakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFF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