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
JavaScript
;
/*********************************************************************
* 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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