@prairielearn/formatter 1.5.1 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/date.d.ts +3 -3
- package/dist/date.d.ts.map +1 -1
- package/dist/date.js.map +1 -1
- package/dist/date.test.d.ts.map +1 -1
- package/dist/date.test.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/interval.d.ts +1 -1
- package/dist/interval.d.ts.map +1 -1
- package/dist/interval.js.map +1 -1
- package/dist/interval.test.d.ts.map +1 -1
- package/dist/interval.test.js.map +1 -1
- package/package.json +7 -6
package/CHANGELOG.md
CHANGED
package/dist/date.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ type TimePrecision = 'hour' | 'minute' | 'second';
|
|
|
11
11
|
* @param options.longTz Whether to use the long time zone name (default false).
|
|
12
12
|
* @returns Human-readable string representing the date.
|
|
13
13
|
*/
|
|
14
|
-
export declare function formatDate(date: Date | Temporal.PlainDateTime, timeZone: string, { includeTz, longTz, includeMs
|
|
14
|
+
export declare function formatDate(date: Date | Temporal.PlainDateTime, timeZone: string, { includeTz, longTz, includeMs }?: {
|
|
15
15
|
includeTz?: boolean;
|
|
16
16
|
longTz?: boolean;
|
|
17
17
|
includeMs?: boolean;
|
|
@@ -88,7 +88,7 @@ export declare function formatDateWithinRange(date: Date, rangeStart: Date, rang
|
|
|
88
88
|
* @param options.minPrecision The minimum precision to always show for time (default 'hour').
|
|
89
89
|
* @returns Human-readable string representing the date and time.
|
|
90
90
|
*/
|
|
91
|
-
export declare function formatDateFriendly(date: Date | Temporal.PlainDateTime, timezone: string, { baseDate, includeTz, timeFirst, dateOnly, timeOnly, maxPrecision, minPrecision
|
|
91
|
+
export declare function formatDateFriendly(date: Date | Temporal.PlainDateTime, timezone: string, { baseDate, includeTz, timeFirst, dateOnly, timeOnly, maxPrecision, minPrecision }?: {
|
|
92
92
|
baseDate?: Date;
|
|
93
93
|
includeTz?: boolean;
|
|
94
94
|
timeFirst?: boolean;
|
|
@@ -120,6 +120,6 @@ export declare function formatDateFriendly(date: Date | Temporal.PlainDateTime,
|
|
|
120
120
|
* @param options.minPrecision The minimum precision to always show for time (default 'hour').
|
|
121
121
|
* @returns Human-readable string representing the datetime range.
|
|
122
122
|
*/
|
|
123
|
-
export declare function formatDateRangeFriendly(start: Date, end: Date, timezone: string, { baseDate, includeTz, timeFirst, dateOnly, maxPrecision, minPrecision
|
|
123
|
+
export declare function formatDateRangeFriendly(start: Date, end: Date, timezone: string, { baseDate, includeTz, timeFirst, dateOnly, maxPrecision, minPrecision }?: Parameters<typeof formatDateFriendly>[2]): string;
|
|
124
124
|
export {};
|
|
125
125
|
//# sourceMappingURL=date.d.ts.map
|
package/dist/date.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AAGpE,KAAK,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,aAAa,EACnC,QAAQ,EAAE,MAAM,EAChB,EACE,SAAgB,EAChB,MAAc,EACd,SAAiB,GAClB,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACrE,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYpE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,EAAE,SAAgB,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACjD,MAAM,CAeR;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,CAyDR;AA+ID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,aAAa,EACnC,QAAQ,EAAE,MAAM,EAChB,EACE,QAAqB,EACrB,SAAgB,EAChB,SAAiB,EACjB,QAAgB,EAChB,QAAgB,EAChB,YAAuB,EACvB,YAAqB,GACtB,GAAE;IACD,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;CACzB,GACL,MAAM,CA6BR;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,IAAI,EACT,QAAQ,EAAE,MAAM,EAChB,EACE,QAAqB,EACrB,SAAgB,EAChB,SAAiB,EACjB,QAAgB,EAChB,YAAuB,EACvB,YAAqB,GACtB,GAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAM,GAC/C,MAAM,CAyCR"}
|
|
1
|
+
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AAGpE,KAAK,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAElD;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,aAAa,EACnC,QAAQ,EAAE,MAAM,EAChB,EACE,SAAgB,EAChB,MAAc,EACd,SAAiB,EAClB,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACrE,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYpE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,EAAE,SAAgB,EAAE,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACjD,MAAM,CAeR;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,CAyDR;AA+ID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,aAAa,EACnC,QAAQ,EAAE,MAAM,EAChB,EACE,QAAqB,EACrB,SAAgB,EAChB,SAAiB,EACjB,QAAgB,EAChB,QAAgB,EAChB,YAAuB,EACvB,YAAqB,EACtB,GAAE;IACD,QAAQ,CAAC,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;CACzB,GACL,MAAM,CA6BR;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,IAAI,EACX,GAAG,EAAE,IAAI,EACT,QAAQ,EAAE,MAAM,EAChB,EACE,QAAqB,EACrB,SAAgB,EAChB,SAAiB,EACjB,QAAgB,EAChB,YAAuB,EACvB,YAAqB,EACtB,GAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAM,GAC/C,MAAM,CAyCR","sourcesContent":["import { Temporal, toTemporalInstant } from '@js-temporal/polyfill';\nimport keyBy from 'lodash/keyBy.js';\n\ntype TimePrecision = 'hour' | 'minute' | 'second';\n\n/**\n * Format a date to a human-readable string like '2020-03-27T12:34:56 (CDT)'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @param options\n * @param options.includeMs Whether to include milliseconds in the output (default false).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.longTz Whether to use the long time zone name (default false).\n * @returns Human-readable string representing the date.\n */\nexport function formatDate(\n date: Date | Temporal.PlainDateTime,\n timeZone: string,\n {\n includeTz = true,\n longTz = false,\n includeMs = false,\n }: { includeTz?: boolean; longTz?: boolean; includeMs?: boolean } = {},\n): string {\n if (date instanceof Temporal.PlainDateTime) {\n date = new Date(date.toZonedDateTime(timeZone).epochMilliseconds);\n }\n\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: includeMs ? 3 : undefined,\n timeZoneName: longTz ? 'long' : 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n let dateFormatted = `${parts.year.value}-${parts.month.value}-${parts.day.value} ${parts.hour.value}:${parts.minute.value}:${parts.second.value}`;\n if (includeMs) {\n dateFormatted = `${dateFormatted}.${parts.fractionalSecond.value}`;\n }\n if (includeTz) {\n dateFormatted = `${dateFormatted} (${parts.timeZoneName.value})`;\n }\n return dateFormatted;\n}\n\n/**\n * Format a date to a human-readable string like '2020-03-27'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateYMD(date: Date, timeZone: string): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n return `${parts.year.value}-${parts.month.value}-${parts.day.value}`;\n}\n\n/**\n * Format a date to a human-readable string like '2020-03-27 14:27'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateYMDHM(date: Date, timeZone: string): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n return `${parts.year.value}-${parts.month.value}-${parts.day.value} ${parts.hour.value}:${parts.minute.value}`;\n}\n\n/**\n * Format a time zone to a human-readable string like 'CDT'.\n *\n * @param timeZone The time zone to format.\n * @returns Human-readable string representing the time zone.\n */\nexport function formatTz(timeZone: string): string {\n const date = new Date();\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n timeZoneName: 'short',\n }).formatToParts(date);\n const tz = parts.find((p) => p.type === 'timeZoneName');\n return tz ? tz.value : timeZone;\n}\n\n/**\n * Format a date to a human-readable string like '14:27:00 (CDT)'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @param options\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @returns Human-readable string representing the date.\n */\nexport function formatDateHMS(\n date: Date,\n timeZone: string,\n { includeTz = true }: { includeTz?: boolean } = {},\n): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n timeZoneName: 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n let dateFormatted = `${parts.hour.value}:${parts.minute.value}:${parts.second.value}`;\n if (includeTz) {\n dateFormatted = `${dateFormatted} (${parts.timeZoneName.value})`;\n }\n return dateFormatted;\n}\n\n/**\n * Format a date to a human-readable string like '18:23' or 'May 2, 07:12',\n * where the precision is determined by the range.\n *\n * @param date The date to format.\n * @param rangeStart The start of the range.\n * @param rangeEnd The end of the range.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateWithinRange(\n date: Date,\n rangeStart: Date,\n rangeEnd: Date,\n timeZone: string,\n): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n timeZoneName: 'short',\n };\n const dateParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(date),\n (x) => x.type,\n );\n const startParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(rangeStart),\n (x) => x.type,\n );\n const endParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(rangeEnd),\n (x) => x.type,\n );\n\n // format the date (not time) parts\n const dateYMD = `${dateParts.year.value}-${dateParts.month.value}-${dateParts.day.value}`;\n const startYMD = `${startParts.year.value}-${startParts.month.value}-${startParts.day.value}`;\n const endYMD = `${endParts.year.value}-${endParts.month.value}-${endParts.day.value}`;\n\n if (dateYMD === startYMD && dateYMD === endYMD) {\n // only show the time if the date is the same for all three\n return `${dateParts.hour.value}:${dateParts.minute.value}`;\n }\n\n // format the year, but not the month or day\n const dateY = `${dateParts.year.value}`;\n const startY = `${startParts.year.value}`;\n const endY = `${endParts.year.value}`;\n\n // if the year is the same for all three, show the month, day, and time\n if (dateY === startY && dateY === endY) {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n };\n const dateParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(date),\n (x) => x.type,\n );\n return `${dateParts.month.value} ${dateParts.day.value}, ${dateParts.hour.value}:${dateParts.minute.value}`;\n }\n\n // fall back to the full date\n return `${dateParts.year.value}-${dateParts.month.value}-${dateParts.day.value} ${dateParts.hour.value}:${dateParts.minute.value}`;\n}\n\n/**\n * Format a Date to date and time strings in the given time zone. The date is\n * formatted like\n * - 'today'\n * - 'Mon, Mar 20' (if within 180 days of the base date)\n * - 'Wed, Jan 1, 2020'\n *\n * The time format leaves off zero minutes and seconds, and uses 12-hour time,\n * giving strings like\n * - '3pm'\n * - '3:34pm'\n * - '3:34:17pm'\n *\n * maxPrecision must be an equal or smaller unit than minPrecision.\n *\n * @param date The date to format.\n * @param timezone The time zone to use for formatting.\n * @param baseDate The base date to use for comparison.\n * @param maxPrecision Only show units as large or larger than the max precision.\n * @param minPrecision Always show that unit and larger, potentially showing smaller units.\n *\n */\nfunction formatDateFriendlyParts(\n date: Date,\n timezone: string,\n baseDate: Date,\n maxPrecision: TimePrecision = 'second',\n minPrecision: TimePrecision = 'hour',\n): { dateFormatted: string; timeFormatted: string; timezoneFormatted: string } {\n // compute the number of days from the base date (0 = today, 1 = tomorrow, etc.)\n\n const baseZonedDateTime = toTemporalInstant.call(baseDate).toZonedDateTimeISO(timezone);\n const zonedDateTime = toTemporalInstant.call(date).toZonedDateTimeISO(timezone);\n\n const basePlainDate = baseZonedDateTime.toPlainDate();\n const plainDate = zonedDateTime.toPlainDate();\n\n const daysOffset = plainDate.since(basePlainDate, { largestUnit: 'day' }).days;\n\n // format the parts of the date and time\n\n const options: Intl.DateTimeFormatOptions = {\n timeZone: timezone,\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n weekday: 'short',\n hourCycle: 'h12',\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n timeZoneName: 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n\n // format the date string\n\n let dateFormatted = '';\n if (daysOffset === 0) {\n dateFormatted = 'today';\n } else if (daysOffset === 1) {\n dateFormatted = 'tomorrow';\n } else if (daysOffset === -1) {\n dateFormatted = 'yesterday';\n } else if (Math.abs(daysOffset) <= 180) {\n // non-breaking-space (\\u00a0) is used between the month and day\n dateFormatted = `${parts.weekday.value}, ${parts.month.value}\\u00a0${parts.day.value}`;\n } else {\n dateFormatted = `${parts.weekday.value}, ${parts.month.value}\\u00a0${parts.day.value}, ${parts.year.value}`;\n }\n\n const precisionOrder: TimePrecision[] = ['second', 'minute', 'hour'];\n const maxIndex = precisionOrder.indexOf(maxPrecision);\n const minIndex = precisionOrder.indexOf(minPrecision);\n\n /**\n * The maximum precision must be a unit smaller than or equal to the minimum precision, otherwise the rules will contradict each other.\n *\n * If max is a larger unit than min, e.g. max = hour, min = minute, then by \"min\"\n * we must display minute and smaller but by \"max\" we can display hour and larger, which is a contradiction.\n *\n * If min is a larger unit than max, e.g. max = minute, min = hour, then by \"min\" we must display\n * hour and smaller and by \"max\" we can display minutes and larger. These do not contradict each other.\n *\n * V min/max > | h | m | s\n * h | X | X | X\n * m | I | X | X\n * s | I | I | X\n *\n * X - valid configuration\n * I - invalid configuration\n */\n\n // A higher index corresponds to a larger unit, so if maxIndex is larger than minIndex, then the rules contradict each other.\n if (maxIndex > minIndex) {\n throw new Error('maxPrecision must be an equal or smaller unit than minPrecision.');\n }\n\n /**\n * Examples:\n * min=h, max=h: 0:00:00AM -> 0AM, 0:00:01AM -> 0AM, 0:01:01AM -> 0AM\n * min=h, max=m: 0:00:00AM -> 0AM, 0:00:01AM -> 0AM, 0:01:01AM -> 0:01AM\n * min=h, max=s: 0:00:00AM -> 0AM, 0:00:01AM -> 0:00:01AM, 0:01:01AM -> 0:01:01AM\n *\n * min=m, max=m: 0:00:00AM -> 0:00AM, 0:00:01AM -> 0:00AM, 0:01:01AM -> 0:00AM\n * min=m, max=s: 0:00:00AM -> 0:00AM, 0:00:01AM -> 0:00AM, 0:01:01AM -> 0:01:01AM\n *\n * min=s, max=s: 0:00:00AM -> 0:00:00AM, 0:00:01AM -> 0:00:01AM, 0:01:01AM -> 0:01:01AM\n */\n\n let timeFormatted = parts.hour.value;\n\n const shouldShowMinutes =\n ['minute', 'second'].includes(minPrecision) ||\n (maxPrecision === 'minute' && parts.minute.value !== '00') ||\n (maxPrecision === 'second' && (parts.minute.value !== '00' || parts.second.value !== '00'));\n\n if (shouldShowMinutes) {\n timeFormatted += `:${parts.minute.value}`;\n }\n\n const shouldShowSeconds =\n minPrecision === 'second' || (maxPrecision === 'second' && parts.second.value !== '00');\n\n if (shouldShowSeconds) {\n timeFormatted += `:${parts.second.value}`;\n }\n // add the am/pm part\n timeFormatted = `${timeFormatted}${parts.dayPeriod.value.toLowerCase()}`;\n\n // format the timezone\n\n const timezoneFormatted = `(${parts.timeZoneName.value})`;\n\n return {\n dateFormatted,\n timeFormatted,\n timezoneFormatted,\n };\n}\n\n/**\n * Format a date to a string like:\n * - 'today, 3pm'\n * - 'tomorrow, 10:30am'\n * - 'yesterday, 11:45pm'\n * - 'Mon, Mar 20, 8:15am' (if within 180 days of the base date)\n * - 'Wed, Jan 1, 2020, 12pm'\n * - `today, 3pm (CDT)` (if `includeTz` is true)\n * - `3pm today` (if `timeFirst` is true)\n * - 'today' (if `dateOnly` is true)\n *\n * If using this within a sentence like `... at ${formatDateFriendlyString()}`,\n * use `timeFirst: true` to improve readability.\n *\n * @param date The date to format.\n * @param timezone The time zone to use for formatting.\n * @param options\n * @param options.baseDate The base date to use for comparison (default is the current date).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.timeFirst If true, the time is shown before the date (default false).\n * @param options.dateOnly If true, only the date is shown (default false).\n * @param options.timeOnly If true, only the time is shown (default false).\n * @param options.maxPrecision The maximum precision to show for time (default 'minute').\n * @param options.minPrecision The minimum precision to always show for time (default 'hour').\n * @returns Human-readable string representing the date and time.\n */\nexport function formatDateFriendly(\n date: Date | Temporal.PlainDateTime,\n timezone: string,\n {\n baseDate = new Date(),\n includeTz = true,\n timeFirst = false,\n dateOnly = false,\n timeOnly = false,\n maxPrecision = 'second',\n minPrecision = 'hour',\n }: {\n baseDate?: Date;\n includeTz?: boolean;\n timeFirst?: boolean;\n dateOnly?: boolean;\n timeOnly?: boolean;\n maxPrecision?: TimePrecision;\n minPrecision?: TimePrecision;\n } = {},\n): string {\n if (date instanceof Temporal.PlainDateTime) {\n date = new Date(date.toZonedDateTime(timezone).epochMilliseconds);\n }\n\n const { dateFormatted, timeFormatted, timezoneFormatted } = formatDateFriendlyParts(\n date,\n timezone,\n baseDate,\n maxPrecision,\n minPrecision,\n );\n\n let dateTimeFormatted = '';\n if (dateOnly) {\n dateTimeFormatted = dateFormatted;\n } else if (timeOnly) {\n dateTimeFormatted = timeFormatted;\n } else {\n if (timeFirst) {\n dateTimeFormatted = `${timeFormatted} ${dateFormatted}`;\n } else {\n dateTimeFormatted = `${dateFormatted}, ${timeFormatted}`;\n }\n }\n if (includeTz) {\n dateTimeFormatted = `${dateTimeFormatted} ${timezoneFormatted}`;\n }\n return dateTimeFormatted;\n}\n\n/**\n * Format a datetime range to a string like:\n * - 'today, 10am'\n * - 'today, 3pm to 5pm'\n * - 'today, 3pm to tomorrow, 5pm'\n * - 'today, 3pm to 5pm (CDT)' (if `includeTz` is true)\n * - '3pm today to 5pm tomorrow' (if `timeFirst` is true)\n * - 'today to tomorrow' (if `dateOnly` is true)\n *\n * This uses `formatDateFriendlyString()` to format the individual dates and times.\n *\n * @param start The start date and time.\n * @param end The end date and time.\n * @param timezone The time zone to use for formatting.\n * @param options Additional options for formatting the displayed date, taken from `formatDateFriendlyString()`.\n * @param options.baseDate The base date to use for comparison (default is the current date).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.timeFirst If true, the time is shown before the date (default false).\n * @param options.dateOnly If true, only the date is shown (default false).\n * @param options.maxPrecision The maximum precision to show for time (default 'minute').\n * @param options.minPrecision The minimum precision to always show for time (default 'hour').\n * @returns Human-readable string representing the datetime range.\n */\nexport function formatDateRangeFriendly(\n start: Date,\n end: Date,\n timezone: string,\n {\n baseDate = new Date(),\n includeTz = true,\n timeFirst = false,\n dateOnly = false,\n maxPrecision = 'second',\n minPrecision = 'hour',\n }: Parameters<typeof formatDateFriendly>[2] = {},\n): string {\n const {\n dateFormatted: startDateFormatted,\n timeFormatted: startTimeFormatted,\n timezoneFormatted,\n } = formatDateFriendlyParts(start, timezone, baseDate, maxPrecision, minPrecision);\n const { dateFormatted: endDateFormatted, timeFormatted: endTimeFormatted } =\n formatDateFriendlyParts(end, timezone, baseDate, maxPrecision, minPrecision);\n\n let result: string | undefined;\n if (dateOnly) {\n if (startDateFormatted === endDateFormatted) {\n result = startDateFormatted;\n } else {\n result = `${startDateFormatted} to ${endDateFormatted}`;\n }\n } else {\n if (startDateFormatted === endDateFormatted) {\n let timeRangeFormatted: string | undefined;\n if (startTimeFormatted === endTimeFormatted) {\n timeRangeFormatted = startTimeFormatted;\n } else {\n timeRangeFormatted = `${startTimeFormatted} to ${endTimeFormatted}`;\n }\n if (timeFirst) {\n result = `${timeRangeFormatted} ${startDateFormatted}`;\n } else {\n result = `${startDateFormatted}, ${timeRangeFormatted}`;\n }\n } else {\n if (timeFirst) {\n result = `${startTimeFormatted} ${startDateFormatted} to ${endTimeFormatted} ${endDateFormatted}`;\n } else {\n result = `${startDateFormatted}, ${startTimeFormatted} to ${endDateFormatted}, ${endTimeFormatted}`;\n }\n }\n }\n if (includeTz) {\n result = `${result} ${timezoneFormatted}`;\n }\n return result;\n}\n"]}
|
package/dist/date.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.js","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"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","sourcesContent":["import { Temporal, toTemporalInstant } from '@js-temporal/polyfill';\nimport keyBy from 'lodash/keyBy.js';\n\ntype TimePrecision = 'hour' | 'minute' | 'second';\n\n/**\n * Format a date to a human-readable string like '2020-03-27T12:34:56 (CDT)'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @param options\n * @param options.includeMs Whether to include milliseconds in the output (default false).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.longTz Whether to use the long time zone name (default false).\n * @returns Human-readable string representing the date.\n */\nexport function formatDate(\n date: Date | Temporal.PlainDateTime,\n timeZone: string,\n {\n includeTz = true,\n longTz = false,\n includeMs = false,\n }: { includeTz?: boolean; longTz?: boolean; includeMs?: boolean } = {},\n): string {\n if (date instanceof Temporal.PlainDateTime) {\n date = new Date(date.toZonedDateTime(timeZone).epochMilliseconds);\n }\n\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: includeMs ? 3 : undefined,\n timeZoneName: longTz ? 'long' : 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n let dateFormatted = `${parts.year.value}-${parts.month.value}-${parts.day.value} ${parts.hour.value}:${parts.minute.value}:${parts.second.value}`;\n if (includeMs) {\n dateFormatted = `${dateFormatted}.${parts.fractionalSecond.value}`;\n }\n if (includeTz) {\n dateFormatted = `${dateFormatted} (${parts.timeZoneName.value})`;\n }\n return dateFormatted;\n}\n\n/**\n * Format a date to a human-readable string like '2020-03-27'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateYMD(date: Date, timeZone: string): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n return `${parts.year.value}-${parts.month.value}-${parts.day.value}`;\n}\n\n/**\n * Format a date to a human-readable string like '2020-03-27 14:27'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateYMDHM(date: Date, timeZone: string): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n return `${parts.year.value}-${parts.month.value}-${parts.day.value} ${parts.hour.value}:${parts.minute.value}`;\n}\n\n/**\n * Format a time zone to a human-readable string like 'CDT'.\n *\n * @param timeZone The time zone to format.\n * @returns Human-readable string representing the time zone.\n */\nexport function formatTz(timeZone: string): string {\n const date = new Date();\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n timeZoneName: 'short',\n }).formatToParts(date);\n const tz = parts.find((p) => p.type === 'timeZoneName');\n return tz ? tz.value : timeZone;\n}\n\n/**\n * Format a date to a human-readable string like '14:27:00 (CDT)'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @param options\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @returns Human-readable string representing the date.\n */\nexport function formatDateHMS(\n date: Date,\n timeZone: string,\n { includeTz = true }: { includeTz?: boolean } = {},\n): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n timeZoneName: 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n let dateFormatted = `${parts.hour.value}:${parts.minute.value}:${parts.second.value}`;\n if (includeTz) {\n dateFormatted = `${dateFormatted} (${parts.timeZoneName.value})`;\n }\n return dateFormatted;\n}\n\n/**\n * Format a date to a human-readable string like '18:23' or 'May 2, 07:12',\n * where the precision is determined by the range.\n *\n * @param date The date to format.\n * @param rangeStart The start of the range.\n * @param rangeEnd The end of the range.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateWithinRange(\n date: Date,\n rangeStart: Date,\n rangeEnd: Date,\n timeZone: string,\n): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n timeZoneName: 'short',\n };\n const dateParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(date),\n (x) => x.type,\n );\n const startParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(rangeStart),\n (x) => x.type,\n );\n const endParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(rangeEnd),\n (x) => x.type,\n );\n\n // format the date (not time) parts\n const dateYMD = `${dateParts.year.value}-${dateParts.month.value}-${dateParts.day.value}`;\n const startYMD = `${startParts.year.value}-${startParts.month.value}-${startParts.day.value}`;\n const endYMD = `${endParts.year.value}-${endParts.month.value}-${endParts.day.value}`;\n\n if (dateYMD === startYMD && dateYMD === endYMD) {\n // only show the time if the date is the same for all three\n return `${dateParts.hour.value}:${dateParts.minute.value}`;\n }\n\n // format the year, but not the month or day\n const dateY = `${dateParts.year.value}`;\n const startY = `${startParts.year.value}`;\n const endY = `${endParts.year.value}`;\n\n // if the year is the same for all three, show the month, day, and time\n if (dateY === startY && dateY === endY) {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n };\n const dateParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(date),\n (x) => x.type,\n );\n return `${dateParts.month.value} ${dateParts.day.value}, ${dateParts.hour.value}:${dateParts.minute.value}`;\n }\n\n // fall back to the full date\n return `${dateParts.year.value}-${dateParts.month.value}-${dateParts.day.value} ${dateParts.hour.value}:${dateParts.minute.value}`;\n}\n\n/**\n * Format a Date to date and time strings in the given time zone. The date is\n * formatted like\n * - 'today'\n * - 'Mon, Mar 20' (if within 180 days of the base date)\n * - 'Wed, Jan 1, 2020'\n *\n * The time format leaves off zero minutes and seconds, and uses 12-hour time,\n * giving strings like\n * - '3pm'\n * - '3:34pm'\n * - '3:34:17pm'\n *\n * maxPrecision must be an equal or smaller unit than minPrecision.\n *\n * @param date The date to format.\n * @param timezone The time zone to use for formatting.\n * @param baseDate The base date to use for comparison.\n * @param maxPrecision Only show units as large or larger than the max precision.\n * @param minPrecision Always show that unit and larger, potentially showing smaller units.\n *\n */\nfunction formatDateFriendlyParts(\n date: Date,\n timezone: string,\n baseDate: Date,\n maxPrecision: TimePrecision = 'second',\n minPrecision: TimePrecision = 'hour',\n): { dateFormatted: string; timeFormatted: string; timezoneFormatted: string } {\n // compute the number of days from the base date (0 = today, 1 = tomorrow, etc.)\n\n const baseZonedDateTime = toTemporalInstant.call(baseDate).toZonedDateTimeISO(timezone);\n const zonedDateTime = toTemporalInstant.call(date).toZonedDateTimeISO(timezone);\n\n const basePlainDate = baseZonedDateTime.toPlainDate();\n const plainDate = zonedDateTime.toPlainDate();\n\n const daysOffset = plainDate.since(basePlainDate, { largestUnit: 'day' }).days;\n\n // format the parts of the date and time\n\n const options: Intl.DateTimeFormatOptions = {\n timeZone: timezone,\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n weekday: 'short',\n hourCycle: 'h12',\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n timeZoneName: 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n\n // format the date string\n\n let dateFormatted = '';\n if (daysOffset === 0) {\n dateFormatted = 'today';\n } else if (daysOffset === 1) {\n dateFormatted = 'tomorrow';\n } else if (daysOffset === -1) {\n dateFormatted = 'yesterday';\n } else if (Math.abs(daysOffset) <= 180) {\n // non-breaking-space (\\u00a0) is used between the month and day\n dateFormatted = `${parts.weekday.value}, ${parts.month.value}\\u00a0${parts.day.value}`;\n } else {\n dateFormatted = `${parts.weekday.value}, ${parts.month.value}\\u00a0${parts.day.value}, ${parts.year.value}`;\n }\n\n const precisionOrder: TimePrecision[] = ['second', 'minute', 'hour'];\n const maxIndex = precisionOrder.indexOf(maxPrecision);\n const minIndex = precisionOrder.indexOf(minPrecision);\n\n /**\n * The maximum precision must be a unit smaller than or equal to the minimum precision, otherwise the rules will contradict each other.\n *\n * If max is a larger unit than min, e.g. max = hour, min = minute, then by \"min\"\n * we must display minute and smaller but by \"max\" we can display hour and larger, which is a contradiction.\n *\n * If min is a larger unit than max, e.g. max = minute, min = hour, then by \"min\" we must display\n * hour and smaller and by \"max\" we can display minutes and larger. These do not contradict each other.\n *\n * V min/max > | h | m | s\n * h | X | X | X\n * m | I | X | X\n * s | I | I | X\n *\n * X - valid configuration\n * I - invalid configuration\n */\n\n // A higher index corresponds to a larger unit, so if maxIndex is larger than minIndex, then the rules contradict each other.\n if (maxIndex > minIndex) {\n throw new Error('maxPrecision must be an equal or smaller unit than minPrecision.');\n }\n\n /**\n * Examples:\n * min=h, max=h: 0:00:00AM -> 0AM, 0:00:01AM -> 0AM, 0:01:01AM -> 0AM\n * min=h, max=m: 0:00:00AM -> 0AM, 0:00:01AM -> 0AM, 0:01:01AM -> 0:01AM\n * min=h, max=s: 0:00:00AM -> 0AM, 0:00:01AM -> 0:00:01AM, 0:01:01AM -> 0:01:01AM\n *\n * min=m, max=m: 0:00:00AM -> 0:00AM, 0:00:01AM -> 0:00AM, 0:01:01AM -> 0:00AM\n * min=m, max=s: 0:00:00AM -> 0:00AM, 0:00:01AM -> 0:00AM, 0:01:01AM -> 0:01:01AM\n *\n * min=s, max=s: 0:00:00AM -> 0:00:00AM, 0:00:01AM -> 0:00:01AM, 0:01:01AM -> 0:01:01AM\n */\n\n let timeFormatted = parts.hour.value;\n\n const shouldShowMinutes =\n ['minute', 'second'].includes(minPrecision) ||\n (maxPrecision === 'minute' && parts.minute.value !== '00') ||\n (maxPrecision === 'second' && (parts.minute.value !== '00' || parts.second.value !== '00'));\n\n if (shouldShowMinutes) {\n timeFormatted += `:${parts.minute.value}`;\n }\n\n const shouldShowSeconds =\n minPrecision === 'second' || (maxPrecision === 'second' && parts.second.value !== '00');\n\n if (shouldShowSeconds) {\n timeFormatted += `:${parts.second.value}`;\n }\n // add the am/pm part\n timeFormatted = `${timeFormatted}${parts.dayPeriod.value.toLowerCase()}`;\n\n // format the timezone\n\n const timezoneFormatted = `(${parts.timeZoneName.value})`;\n\n return {\n dateFormatted,\n timeFormatted,\n timezoneFormatted,\n };\n}\n\n/**\n * Format a date to a string like:\n * - 'today, 3pm'\n * - 'tomorrow, 10:30am'\n * - 'yesterday, 11:45pm'\n * - 'Mon, Mar 20, 8:15am' (if within 180 days of the base date)\n * - 'Wed, Jan 1, 2020, 12pm'\n * - `today, 3pm (CDT)` (if `includeTz` is true)\n * - `3pm today` (if `timeFirst` is true)\n * - 'today' (if `dateOnly` is true)\n *\n * If using this within a sentence like `... at ${formatDateFriendlyString()}`,\n * use `timeFirst: true` to improve readability.\n *\n * @param date The date to format.\n * @param timezone The time zone to use for formatting.\n * @param options\n * @param options.baseDate The base date to use for comparison (default is the current date).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.timeFirst If true, the time is shown before the date (default false).\n * @param options.dateOnly If true, only the date is shown (default false).\n * @param options.timeOnly If true, only the time is shown (default false).\n * @param options.maxPrecision The maximum precision to show for time (default 'minute').\n * @param options.minPrecision The minimum precision to always show for time (default 'hour').\n * @returns Human-readable string representing the date and time.\n */\nexport function formatDateFriendly(\n date: Date | Temporal.PlainDateTime,\n timezone: string,\n {\n baseDate = new Date(),\n includeTz = true,\n timeFirst = false,\n dateOnly = false,\n timeOnly = false,\n maxPrecision = 'second',\n minPrecision = 'hour',\n }: {\n baseDate?: Date;\n includeTz?: boolean;\n timeFirst?: boolean;\n dateOnly?: boolean;\n timeOnly?: boolean;\n maxPrecision?: TimePrecision;\n minPrecision?: TimePrecision;\n } = {},\n): string {\n if (date instanceof Temporal.PlainDateTime) {\n date = new Date(date.toZonedDateTime(timezone).epochMilliseconds);\n }\n\n const { dateFormatted, timeFormatted, timezoneFormatted } = formatDateFriendlyParts(\n date,\n timezone,\n baseDate,\n maxPrecision,\n minPrecision,\n );\n\n let dateTimeFormatted = '';\n if (dateOnly) {\n dateTimeFormatted = dateFormatted;\n } else if (timeOnly) {\n dateTimeFormatted = timeFormatted;\n } else {\n if (timeFirst) {\n dateTimeFormatted = `${timeFormatted} ${dateFormatted}`;\n } else {\n dateTimeFormatted = `${dateFormatted}, ${timeFormatted}`;\n }\n }\n if (includeTz) {\n dateTimeFormatted = `${dateTimeFormatted} ${timezoneFormatted}`;\n }\n return dateTimeFormatted;\n}\n\n/**\n * Format a datetime range to a string like:\n * - 'today, 10am'\n * - 'today, 3pm to 5pm'\n * - 'today, 3pm to tomorrow, 5pm'\n * - 'today, 3pm to 5pm (CDT)' (if `includeTz` is true)\n * - '3pm today to 5pm tomorrow' (if `timeFirst` is true)\n * - 'today to tomorrow' (if `dateOnly` is true)\n *\n * This uses `formatDateFriendlyString()` to format the individual dates and times.\n *\n * @param start The start date and time.\n * @param end The end date and time.\n * @param timezone The time zone to use for formatting.\n * @param options Additional options for formatting the displayed date, taken from `formatDateFriendlyString()`.\n * @param options.baseDate The base date to use for comparison (default is the current date).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.timeFirst If true, the time is shown before the date (default false).\n * @param options.dateOnly If true, only the date is shown (default false).\n * @param options.maxPrecision The maximum precision to show for time (default 'minute').\n * @param options.minPrecision The minimum precision to always show for time (default 'hour').\n * @returns Human-readable string representing the datetime range.\n */\nexport function formatDateRangeFriendly(\n start: Date,\n end: Date,\n timezone: string,\n {\n baseDate = new Date(),\n includeTz = true,\n timeFirst = false,\n dateOnly = false,\n maxPrecision = 'second',\n minPrecision = 'hour',\n }: Parameters<typeof formatDateFriendly>[2] = {},\n): string {\n const {\n dateFormatted: startDateFormatted,\n timeFormatted: startTimeFormatted,\n timezoneFormatted,\n } = formatDateFriendlyParts(start, timezone, baseDate, maxPrecision, minPrecision);\n const { dateFormatted: endDateFormatted, timeFormatted: endTimeFormatted } =\n formatDateFriendlyParts(end, timezone, baseDate, maxPrecision, minPrecision);\n\n let result: string | undefined;\n if (dateOnly) {\n if (startDateFormatted === endDateFormatted) {\n result = startDateFormatted;\n } else {\n result = `${startDateFormatted} to ${endDateFormatted}`;\n }\n } else {\n if (startDateFormatted === endDateFormatted) {\n let timeRangeFormatted: string | undefined;\n if (startTimeFormatted === endTimeFormatted) {\n timeRangeFormatted = startTimeFormatted;\n } else {\n timeRangeFormatted = `${startTimeFormatted} to ${endTimeFormatted}`;\n }\n if (timeFirst) {\n result = `${timeRangeFormatted} ${startDateFormatted}`;\n } else {\n result = `${startDateFormatted}, ${timeRangeFormatted}`;\n }\n } else {\n if (timeFirst) {\n result = `${startTimeFormatted} ${startDateFormatted} to ${endTimeFormatted} ${endDateFormatted}`;\n } else {\n result = `${startDateFormatted}, ${startTimeFormatted} to ${endDateFormatted}, ${endTimeFormatted}`;\n }\n }\n }\n if (includeTz) {\n result = `${result} ${timezoneFormatted}`;\n }\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"date.js","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"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","sourcesContent":["import { Temporal, toTemporalInstant } from '@js-temporal/polyfill';\nimport keyBy from 'lodash/keyBy.js';\n\ntype TimePrecision = 'hour' | 'minute' | 'second';\n\n/**\n * Format a date to a human-readable string like '2020-03-27T12:34:56 (CDT)'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @param options\n * @param options.includeMs Whether to include milliseconds in the output (default false).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.longTz Whether to use the long time zone name (default false).\n * @returns Human-readable string representing the date.\n */\nexport function formatDate(\n date: Date | Temporal.PlainDateTime,\n timeZone: string,\n {\n includeTz = true,\n longTz = false,\n includeMs = false,\n }: { includeTz?: boolean; longTz?: boolean; includeMs?: boolean } = {},\n): string {\n if (date instanceof Temporal.PlainDateTime) {\n date = new Date(date.toZonedDateTime(timeZone).epochMilliseconds);\n }\n\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n fractionalSecondDigits: includeMs ? 3 : undefined,\n timeZoneName: longTz ? 'long' : 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n let dateFormatted = `${parts.year.value}-${parts.month.value}-${parts.day.value} ${parts.hour.value}:${parts.minute.value}:${parts.second.value}`;\n if (includeMs) {\n dateFormatted = `${dateFormatted}.${parts.fractionalSecond.value}`;\n }\n if (includeTz) {\n dateFormatted = `${dateFormatted} (${parts.timeZoneName.value})`;\n }\n return dateFormatted;\n}\n\n/**\n * Format a date to a human-readable string like '2020-03-27'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateYMD(date: Date, timeZone: string): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n return `${parts.year.value}-${parts.month.value}-${parts.day.value}`;\n}\n\n/**\n * Format a date to a human-readable string like '2020-03-27 14:27'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateYMDHM(date: Date, timeZone: string): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n return `${parts.year.value}-${parts.month.value}-${parts.day.value} ${parts.hour.value}:${parts.minute.value}`;\n}\n\n/**\n * Format a time zone to a human-readable string like 'CDT'.\n *\n * @param timeZone The time zone to format.\n * @returns Human-readable string representing the time zone.\n */\nexport function formatTz(timeZone: string): string {\n const date = new Date();\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n timeZoneName: 'short',\n }).formatToParts(date);\n const tz = parts.find((p) => p.type === 'timeZoneName');\n return tz ? tz.value : timeZone;\n}\n\n/**\n * Format a date to a human-readable string like '14:27:00 (CDT)'.\n *\n * @param date The date to format.\n * @param timeZone The time zone to use for formatting.\n * @param options\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @returns Human-readable string representing the date.\n */\nexport function formatDateHMS(\n date: Date,\n timeZone: string,\n { includeTz = true }: { includeTz?: boolean } = {},\n): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n timeZoneName: 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n let dateFormatted = `${parts.hour.value}:${parts.minute.value}:${parts.second.value}`;\n if (includeTz) {\n dateFormatted = `${dateFormatted} (${parts.timeZoneName.value})`;\n }\n return dateFormatted;\n}\n\n/**\n * Format a date to a human-readable string like '18:23' or 'May 2, 07:12',\n * where the precision is determined by the range.\n *\n * @param date The date to format.\n * @param rangeStart The start of the range.\n * @param rangeEnd The end of the range.\n * @param timeZone The time zone to use for formatting.\n * @returns Human-readable string representing the date.\n */\nexport function formatDateWithinRange(\n date: Date,\n rangeStart: Date,\n rangeEnd: Date,\n timeZone: string,\n): string {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n hourCycle: 'h23',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n timeZoneName: 'short',\n };\n const dateParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(date),\n (x) => x.type,\n );\n const startParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(rangeStart),\n (x) => x.type,\n );\n const endParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(rangeEnd),\n (x) => x.type,\n );\n\n // format the date (not time) parts\n const dateYMD = `${dateParts.year.value}-${dateParts.month.value}-${dateParts.day.value}`;\n const startYMD = `${startParts.year.value}-${startParts.month.value}-${startParts.day.value}`;\n const endYMD = `${endParts.year.value}-${endParts.month.value}-${endParts.day.value}`;\n\n if (dateYMD === startYMD && dateYMD === endYMD) {\n // only show the time if the date is the same for all three\n return `${dateParts.hour.value}:${dateParts.minute.value}`;\n }\n\n // format the year, but not the month or day\n const dateY = `${dateParts.year.value}`;\n const startY = `${startParts.year.value}`;\n const endY = `${endParts.year.value}`;\n\n // if the year is the same for all three, show the month, day, and time\n if (dateY === startY && dateY === endY) {\n const options: Intl.DateTimeFormatOptions = {\n timeZone,\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n };\n const dateParts = keyBy(\n new Intl.DateTimeFormat('en-US', options).formatToParts(date),\n (x) => x.type,\n );\n return `${dateParts.month.value} ${dateParts.day.value}, ${dateParts.hour.value}:${dateParts.minute.value}`;\n }\n\n // fall back to the full date\n return `${dateParts.year.value}-${dateParts.month.value}-${dateParts.day.value} ${dateParts.hour.value}:${dateParts.minute.value}`;\n}\n\n/**\n * Format a Date to date and time strings in the given time zone. The date is\n * formatted like\n * - 'today'\n * - 'Mon, Mar 20' (if within 180 days of the base date)\n * - 'Wed, Jan 1, 2020'\n *\n * The time format leaves off zero minutes and seconds, and uses 12-hour time,\n * giving strings like\n * - '3pm'\n * - '3:34pm'\n * - '3:34:17pm'\n *\n * maxPrecision must be an equal or smaller unit than minPrecision.\n *\n * @param date The date to format.\n * @param timezone The time zone to use for formatting.\n * @param baseDate The base date to use for comparison.\n * @param maxPrecision Only show units as large or larger than the max precision.\n * @param minPrecision Always show that unit and larger, potentially showing smaller units.\n *\n */\nfunction formatDateFriendlyParts(\n date: Date,\n timezone: string,\n baseDate: Date,\n maxPrecision: TimePrecision = 'second',\n minPrecision: TimePrecision = 'hour',\n): { dateFormatted: string; timeFormatted: string; timezoneFormatted: string } {\n // compute the number of days from the base date (0 = today, 1 = tomorrow, etc.)\n\n const baseZonedDateTime = toTemporalInstant.call(baseDate).toZonedDateTimeISO(timezone);\n const zonedDateTime = toTemporalInstant.call(date).toZonedDateTimeISO(timezone);\n\n const basePlainDate = baseZonedDateTime.toPlainDate();\n const plainDate = zonedDateTime.toPlainDate();\n\n const daysOffset = plainDate.since(basePlainDate, { largestUnit: 'day' }).days;\n\n // format the parts of the date and time\n\n const options: Intl.DateTimeFormatOptions = {\n timeZone: timezone,\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n weekday: 'short',\n hourCycle: 'h12',\n hour: 'numeric',\n minute: '2-digit',\n second: '2-digit',\n timeZoneName: 'short',\n };\n const parts = keyBy(new Intl.DateTimeFormat('en-US', options).formatToParts(date), (x) => x.type);\n\n // format the date string\n\n let dateFormatted = '';\n if (daysOffset === 0) {\n dateFormatted = 'today';\n } else if (daysOffset === 1) {\n dateFormatted = 'tomorrow';\n } else if (daysOffset === -1) {\n dateFormatted = 'yesterday';\n } else if (Math.abs(daysOffset) <= 180) {\n // non-breaking-space (\\u00a0) is used between the month and day\n dateFormatted = `${parts.weekday.value}, ${parts.month.value}\\u00a0${parts.day.value}`;\n } else {\n dateFormatted = `${parts.weekday.value}, ${parts.month.value}\\u00a0${parts.day.value}, ${parts.year.value}`;\n }\n\n const precisionOrder: TimePrecision[] = ['second', 'minute', 'hour'];\n const maxIndex = precisionOrder.indexOf(maxPrecision);\n const minIndex = precisionOrder.indexOf(minPrecision);\n\n /**\n * The maximum precision must be a unit smaller than or equal to the minimum precision, otherwise the rules will contradict each other.\n *\n * If max is a larger unit than min, e.g. max = hour, min = minute, then by \"min\"\n * we must display minute and smaller but by \"max\" we can display hour and larger, which is a contradiction.\n *\n * If min is a larger unit than max, e.g. max = minute, min = hour, then by \"min\" we must display\n * hour and smaller and by \"max\" we can display minutes and larger. These do not contradict each other.\n *\n * V min/max > | h | m | s\n * h | X | X | X\n * m | I | X | X\n * s | I | I | X\n *\n * X - valid configuration\n * I - invalid configuration\n */\n\n // A higher index corresponds to a larger unit, so if maxIndex is larger than minIndex, then the rules contradict each other.\n if (maxIndex > minIndex) {\n throw new Error('maxPrecision must be an equal or smaller unit than minPrecision.');\n }\n\n /**\n * Examples:\n * min=h, max=h: 0:00:00AM -> 0AM, 0:00:01AM -> 0AM, 0:01:01AM -> 0AM\n * min=h, max=m: 0:00:00AM -> 0AM, 0:00:01AM -> 0AM, 0:01:01AM -> 0:01AM\n * min=h, max=s: 0:00:00AM -> 0AM, 0:00:01AM -> 0:00:01AM, 0:01:01AM -> 0:01:01AM\n *\n * min=m, max=m: 0:00:00AM -> 0:00AM, 0:00:01AM -> 0:00AM, 0:01:01AM -> 0:00AM\n * min=m, max=s: 0:00:00AM -> 0:00AM, 0:00:01AM -> 0:00AM, 0:01:01AM -> 0:01:01AM\n *\n * min=s, max=s: 0:00:00AM -> 0:00:00AM, 0:00:01AM -> 0:00:01AM, 0:01:01AM -> 0:01:01AM\n */\n\n let timeFormatted = parts.hour.value;\n\n const shouldShowMinutes =\n ['minute', 'second'].includes(minPrecision) ||\n (maxPrecision === 'minute' && parts.minute.value !== '00') ||\n (maxPrecision === 'second' && (parts.minute.value !== '00' || parts.second.value !== '00'));\n\n if (shouldShowMinutes) {\n timeFormatted += `:${parts.minute.value}`;\n }\n\n const shouldShowSeconds =\n minPrecision === 'second' || (maxPrecision === 'second' && parts.second.value !== '00');\n\n if (shouldShowSeconds) {\n timeFormatted += `:${parts.second.value}`;\n }\n // add the am/pm part\n timeFormatted = `${timeFormatted}${parts.dayPeriod.value.toLowerCase()}`;\n\n // format the timezone\n\n const timezoneFormatted = `(${parts.timeZoneName.value})`;\n\n return {\n dateFormatted,\n timeFormatted,\n timezoneFormatted,\n };\n}\n\n/**\n * Format a date to a string like:\n * - 'today, 3pm'\n * - 'tomorrow, 10:30am'\n * - 'yesterday, 11:45pm'\n * - 'Mon, Mar 20, 8:15am' (if within 180 days of the base date)\n * - 'Wed, Jan 1, 2020, 12pm'\n * - `today, 3pm (CDT)` (if `includeTz` is true)\n * - `3pm today` (if `timeFirst` is true)\n * - 'today' (if `dateOnly` is true)\n *\n * If using this within a sentence like `... at ${formatDateFriendlyString()}`,\n * use `timeFirst: true` to improve readability.\n *\n * @param date The date to format.\n * @param timezone The time zone to use for formatting.\n * @param options\n * @param options.baseDate The base date to use for comparison (default is the current date).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.timeFirst If true, the time is shown before the date (default false).\n * @param options.dateOnly If true, only the date is shown (default false).\n * @param options.timeOnly If true, only the time is shown (default false).\n * @param options.maxPrecision The maximum precision to show for time (default 'minute').\n * @param options.minPrecision The minimum precision to always show for time (default 'hour').\n * @returns Human-readable string representing the date and time.\n */\nexport function formatDateFriendly(\n date: Date | Temporal.PlainDateTime,\n timezone: string,\n {\n baseDate = new Date(),\n includeTz = true,\n timeFirst = false,\n dateOnly = false,\n timeOnly = false,\n maxPrecision = 'second',\n minPrecision = 'hour',\n }: {\n baseDate?: Date;\n includeTz?: boolean;\n timeFirst?: boolean;\n dateOnly?: boolean;\n timeOnly?: boolean;\n maxPrecision?: TimePrecision;\n minPrecision?: TimePrecision;\n } = {},\n): string {\n if (date instanceof Temporal.PlainDateTime) {\n date = new Date(date.toZonedDateTime(timezone).epochMilliseconds);\n }\n\n const { dateFormatted, timeFormatted, timezoneFormatted } = formatDateFriendlyParts(\n date,\n timezone,\n baseDate,\n maxPrecision,\n minPrecision,\n );\n\n let dateTimeFormatted = '';\n if (dateOnly) {\n dateTimeFormatted = dateFormatted;\n } else if (timeOnly) {\n dateTimeFormatted = timeFormatted;\n } else {\n if (timeFirst) {\n dateTimeFormatted = `${timeFormatted} ${dateFormatted}`;\n } else {\n dateTimeFormatted = `${dateFormatted}, ${timeFormatted}`;\n }\n }\n if (includeTz) {\n dateTimeFormatted = `${dateTimeFormatted} ${timezoneFormatted}`;\n }\n return dateTimeFormatted;\n}\n\n/**\n * Format a datetime range to a string like:\n * - 'today, 10am'\n * - 'today, 3pm to 5pm'\n * - 'today, 3pm to tomorrow, 5pm'\n * - 'today, 3pm to 5pm (CDT)' (if `includeTz` is true)\n * - '3pm today to 5pm tomorrow' (if `timeFirst` is true)\n * - 'today to tomorrow' (if `dateOnly` is true)\n *\n * This uses `formatDateFriendlyString()` to format the individual dates and times.\n *\n * @param start The start date and time.\n * @param end The end date and time.\n * @param timezone The time zone to use for formatting.\n * @param options Additional options for formatting the displayed date, taken from `formatDateFriendlyString()`.\n * @param options.baseDate The base date to use for comparison (default is the current date).\n * @param options.includeTz Whether to include the time zone in the output (default true).\n * @param options.timeFirst If true, the time is shown before the date (default false).\n * @param options.dateOnly If true, only the date is shown (default false).\n * @param options.maxPrecision The maximum precision to show for time (default 'minute').\n * @param options.minPrecision The minimum precision to always show for time (default 'hour').\n * @returns Human-readable string representing the datetime range.\n */\nexport function formatDateRangeFriendly(\n start: Date,\n end: Date,\n timezone: string,\n {\n baseDate = new Date(),\n includeTz = true,\n timeFirst = false,\n dateOnly = false,\n maxPrecision = 'second',\n minPrecision = 'hour',\n }: Parameters<typeof formatDateFriendly>[2] = {},\n): string {\n const {\n dateFormatted: startDateFormatted,\n timeFormatted: startTimeFormatted,\n timezoneFormatted,\n } = formatDateFriendlyParts(start, timezone, baseDate, maxPrecision, minPrecision);\n const { dateFormatted: endDateFormatted, timeFormatted: endTimeFormatted } =\n formatDateFriendlyParts(end, timezone, baseDate, maxPrecision, minPrecision);\n\n let result: string | undefined;\n if (dateOnly) {\n if (startDateFormatted === endDateFormatted) {\n result = startDateFormatted;\n } else {\n result = `${startDateFormatted} to ${endDateFormatted}`;\n }\n } else {\n if (startDateFormatted === endDateFormatted) {\n let timeRangeFormatted: string | undefined;\n if (startTimeFormatted === endTimeFormatted) {\n timeRangeFormatted = startTimeFormatted;\n } else {\n timeRangeFormatted = `${startTimeFormatted} to ${endTimeFormatted}`;\n }\n if (timeFirst) {\n result = `${timeRangeFormatted} ${startDateFormatted}`;\n } else {\n result = `${startDateFormatted}, ${timeRangeFormatted}`;\n }\n } else {\n if (timeFirst) {\n result = `${startTimeFormatted} ${startDateFormatted} to ${endTimeFormatted} ${endDateFormatted}`;\n } else {\n result = `${startDateFormatted}, ${startTimeFormatted} to ${endDateFormatted}, ${endTimeFormatted}`;\n }\n }\n }\n if (includeTz) {\n result = `${result} ${timezoneFormatted}`;\n }\n return result;\n}\n"]}
|
package/dist/date.test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.test.d.ts","sourceRoot":"","sources":["../src/date.test.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"date.test.d.ts","sourceRoot":"","sources":["../src/date.test.ts"],"names":[],"mappings":"","sourcesContent":["import { assert, describe, it } from 'vitest';\n\nimport {\n formatDate,\n formatDateFriendly,\n formatDateRangeFriendly,\n formatDateWithinRange,\n formatDateYMD,\n formatDateYMDHM,\n} from './date.js';\n\ndescribe('date formatting', () => {\n describe('formatDate', () => {\n it('formats a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'UTC'), '2018-01-01 12:00:00 (UTC)');\n });\n it('formats a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'America/Chicago'), '2018-01-01 06:00:00 (CST)');\n });\n it('formats a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'America/Chicago'), '2018-07-01 07:00:00 (CDT)');\n });\n it('formats dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDate(date, 'UTC'), '2018-01-01 00:01:00 (UTC)');\n });\n it('formats dates with milliseconds', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 4, 1, 3, 12));\n assert.equal(formatDate(date, 'UTC', { includeMs: true }), '2018-01-01 04:01:03.012 (UTC)');\n });\n it('formats dates without the timezone', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'UTC', { includeTz: false }), '2018-01-01 12:00:00');\n });\n it('formats dates with the long timezone name', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(\n formatDate(date, 'America/Chicago', { longTz: true }),\n '2018-01-01 06:00:00 (Central Standard Time)',\n );\n });\n });\n\n describe('formatDateYMD()', () => {\n it('should handle a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDateYMD(date, 'UTC'), '2018-01-01');\n });\n it('should handle a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 3, 5, 0, 0));\n assert.equal(formatDateYMD(date, 'America/Chicago'), '2018-01-02');\n });\n it('should handle a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 12, 0, 0));\n assert.equal(formatDateYMD(date, 'America/Chicago'), '2018-07-01');\n });\n it('should correctly format dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDateYMD(date, 'UTC'), '2018-01-01');\n });\n });\n\n describe('formatDateYMDHM()', () => {\n it('should handle a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n assert.equal(formatDateYMDHM(date, 'UTC'), '2018-01-01 12:34');\n });\n it('should handle a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 3, 5, 10, 50));\n assert.equal(formatDateYMDHM(date, 'America/Chicago'), '2018-01-02 23:10');\n });\n it('should handle a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 19, 8, 19));\n assert.equal(formatDateYMDHM(date, 'America/Chicago'), '2018-07-01 14:08');\n });\n it('should correctly format dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDateYMDHM(date, 'UTC'), '2018-01-01 00:01');\n });\n });\n\n describe('formatDateWithinRange()', () => {\n it('should handle a date within the same day in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), '12:34');\n });\n it('should handle a date within the same day in CST', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 23, 8, 57));\n const start = new Date(Date.UTC(2018, 0, 1, 21, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 2, 2, 14, 0));\n assert.equal(formatDateWithinRange(date, start, end, 'America/Chicago'), '17:08');\n });\n it('should handle a date within the same year in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 4, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), 'Jan 1, 12:34');\n });\n it('should handle a date within different years in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2019, 0, 1, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), '2018-01-01 12:34');\n });\n });\n\n describe('formatDateFriendly()', () => {\n it('should handle a date on the same day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12:34pm (UTC)');\n });\n\n it('should handle a date on the same day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 4:34pm (UTC)');\n });\n\n it('should handle a date on the same day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 9:34am (UTC)');\n });\n\n it('should handle a date on the next day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 12:34pm (UTC)');\n });\n\n it('should handle a date on the next day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 4:34pm (UTC)');\n });\n\n it('should handle a date on the next day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 9:34am (UTC)');\n });\n\n it('should handle a date on the previous day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 12:34pm (UTC)');\n });\n\n it('should handle a date on the previous day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 4:34pm (UTC)');\n });\n\n it('should handle a date on the previous day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 9:34am (UTC)');\n });\n\n it('should handle a date in the near future', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sun, Apr\\u00a015, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the far future', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 9, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Mon, Oct\\u00a015, 2018, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the near past', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 9, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sun, Oct\\u00a015, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the far past', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sat, Apr\\u00a015, 2017, 12:34am (UTC)',\n );\n });\n\n it('should display without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, includeTz: false }),\n 'Sun, Apr\\u00a015, 12:34am',\n );\n });\n\n it('should handle a date in CDT', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'America/Chicago', { baseDate }),\n 'Sat, Apr\\u00a014, 7:34pm (CDT)',\n );\n });\n\n it('should handle a date in CDT without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'America/Chicago', { baseDate, includeTz: false }),\n 'Sat, Apr\\u00a014, 7:34pm',\n );\n });\n\n it('should handle displaying only the date', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, dateOnly: true }),\n 'Sun, Apr\\u00a015 (UTC)',\n );\n });\n\n it('should handle displaying only the date without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, dateOnly: true, includeTz: false }),\n 'Sun, Apr\\u00a015',\n );\n });\n\n it('should handle displaying only the time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate, timeOnly: true }), '12:34am (UTC)');\n });\n\n it('should handle displaying only the time without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, timeOnly: true, includeTz: false }),\n '12:34am',\n );\n });\n\n it('should handle displaying dates with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, timeFirst: true }),\n '12:34am Sun, Apr\\u00a015 (UTC)',\n );\n });\n\n it('should handle a time with seconds', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 34, 7));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1:34:07pm (UTC)');\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'minute' }),\n 'today, 1:34pm (UTC)',\n );\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'hour' }),\n 'today, 1pm (UTC)',\n );\n });\n\n it('should handle a time with minutes', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1:34pm (UTC)');\n });\n\n it('should handle a time with hours', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1pm (UTC)');\n });\n\n it('should handle midnight', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 0, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12am (UTC)');\n });\n\n it('should handle noon', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12pm (UTC)');\n });\n\n describe('maxPrecision option', () => {\n it('should limit to hour precision when maxPrecision is \"hour\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n });\n\n it('should limit to minute precision when maxPrecision is \"minute\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:45pm',\n );\n });\n\n it('should show second precision when maxPrecision is \"second\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:45:17pm',\n );\n });\n\n describe('minPrecision option', () => {\n it('should sometimes show minutes when minPrecision is \"hour\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date1 = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 1, 0));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3:01pm',\n );\n const date3 = new Date(Date.UTC(2018, 0, 1, 15, 0, 1));\n assert.equal(\n formatDateFriendly(date3, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:01pm',\n );\n });\n it('should always show minutes when minPrecision is \"minute\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 1, 0));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:01pm',\n );\n const date3 = new Date(Date.UTC(2018, 0, 1, 15, 0, 1));\n assert.equal(\n formatDateFriendly(date3, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:01pm',\n );\n });\n });\n\n describe('precision option combinations', () => {\n it('should work with fixed precision (min=max)', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date1 = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00pm',\n );\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:00pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 30, 45));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:30pm',\n );\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:30:45pm',\n );\n });\n });\n\n describe('precision with full date formatting', () => {\n it('should work with full date and time formatting', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'minute' }),\n 'today, 3:45pm (UTC)',\n );\n });\n\n it('should work with timeFirst option', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeFirst: true,\n }),\n '3:00pm today (UTC)',\n );\n });\n });\n });\n\n describe('formatDateRangeFriendly()', () => {\n it('should handle two different dates', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm to Wed, Jan\\u00a03, 10am (UTC)',\n );\n });\n\n it('should handle the same date with different times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm to 1pm (UTC)',\n );\n });\n\n it('should handle the same date with the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm (UTC)',\n );\n });\n\n it('should handle two different dates with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm today to 10am Wed, Jan\\u00a03 (UTC)',\n );\n });\n\n it('should handle the same date with different times with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm to 1pm today (UTC)',\n );\n });\n\n it('should handle the same date with the same time and the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm today (UTC)',\n );\n });\n\n it('should handle two different dates without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, includeTz: false }),\n 'today, 12:34pm to Wed, Jan\\u00a03, 10am',\n );\n });\n\n it('should handle two different dates with only dates and without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n dateOnly: true,\n includeTz: false,\n }),\n 'today to Wed, Jan\\u00a03',\n );\n });\n\n it('should handle two different dates with time first and without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n timeFirst: true,\n includeTz: false,\n }),\n '12:34pm today to 10am Wed, Jan\\u00a03',\n );\n });\n\n it('should handle two different dates in CST', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 0, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'America/Chicago', { baseDate }),\n 'yesterday, 6:34pm to Wed, Jan\\u00a03, 4am (CST)',\n );\n });\n\n it('should handle two different dates in CST without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 0, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'America/Chicago', {\n baseDate,\n includeTz: false,\n }),\n 'yesterday, 6:34pm to Wed, Jan\\u00a03, 4am',\n );\n });\n\n describe('precision options', () => {\n it('should apply maxPrecision to both start and end times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n includeTz: false,\n }),\n 'today, 3:45pm to 5:30pm',\n );\n });\n\n it('should apply minPrecision to both start and end times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n includeTz: false,\n }),\n 'today, 3:00pm to 5:00pm',\n );\n });\n\n it('should handle precision options with different dates', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 2, 10, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n includeTz: false,\n }),\n 'today, 3pm to tomorrow, 10am',\n );\n });\n\n it('should handle precision options with same times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n includeTz: false,\n }),\n 'today, 3:00:00pm',\n );\n });\n\n it('should work with timeFirst and precision options', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n timeFirst: true,\n includeTz: false,\n }),\n '3:45pm to 5:30pm today',\n );\n });\n });\n });\n });\n});\n"]}
|
package/dist/date.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.test.js","sourceRoot":"","sources":["../src/date.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, describe, it } from 'vitest';\n\nimport {\n formatDate,\n formatDateFriendly,\n formatDateRangeFriendly,\n formatDateWithinRange,\n formatDateYMD,\n formatDateYMDHM,\n} from './date.js';\n\ndescribe('date formatting', () => {\n describe('formatDate', () => {\n it('formats a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'UTC'), '2018-01-01 12:00:00 (UTC)');\n });\n it('formats a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'America/Chicago'), '2018-01-01 06:00:00 (CST)');\n });\n it('formats a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'America/Chicago'), '2018-07-01 07:00:00 (CDT)');\n });\n it('formats dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDate(date, 'UTC'), '2018-01-01 00:01:00 (UTC)');\n });\n it('formats dates with milliseconds', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 4, 1, 3, 12));\n assert.equal(formatDate(date, 'UTC', { includeMs: true }), '2018-01-01 04:01:03.012 (UTC)');\n });\n it('formats dates without the timezone', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'UTC', { includeTz: false }), '2018-01-01 12:00:00');\n });\n it('formats dates with the long timezone name', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(\n formatDate(date, 'America/Chicago', { longTz: true }),\n '2018-01-01 06:00:00 (Central Standard Time)',\n );\n });\n });\n\n describe('formatDateYMD()', () => {\n it('should handle a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDateYMD(date, 'UTC'), '2018-01-01');\n });\n it('should handle a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 3, 5, 0, 0));\n assert.equal(formatDateYMD(date, 'America/Chicago'), '2018-01-02');\n });\n it('should handle a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 12, 0, 0));\n assert.equal(formatDateYMD(date, 'America/Chicago'), '2018-07-01');\n });\n it('should correctly format dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDateYMD(date, 'UTC'), '2018-01-01');\n });\n });\n\n describe('formatDateYMDHM()', () => {\n it('should handle a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n assert.equal(formatDateYMDHM(date, 'UTC'), '2018-01-01 12:34');\n });\n it('should handle a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 3, 5, 10, 50));\n assert.equal(formatDateYMDHM(date, 'America/Chicago'), '2018-01-02 23:10');\n });\n it('should handle a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 19, 8, 19));\n assert.equal(formatDateYMDHM(date, 'America/Chicago'), '2018-07-01 14:08');\n });\n it('should correctly format dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDateYMDHM(date, 'UTC'), '2018-01-01 00:01');\n });\n });\n\n describe('formatDateWithinRange()', () => {\n it('should handle a date within the same day in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), '12:34');\n });\n it('should handle a date within the same day in CST', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 23, 8, 57));\n const start = new Date(Date.UTC(2018, 0, 1, 21, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 2, 2, 14, 0));\n assert.equal(formatDateWithinRange(date, start, end, 'America/Chicago'), '17:08');\n });\n it('should handle a date within the same year in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 4, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), 'Jan 1, 12:34');\n });\n it('should handle a date within different years in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2019, 0, 1, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), '2018-01-01 12:34');\n });\n });\n\n describe('formatDateFriendly()', () => {\n it('should handle a date on the same day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12:34pm (UTC)');\n });\n\n it('should handle a date on the same day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 4:34pm (UTC)');\n });\n\n it('should handle a date on the same day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 9:34am (UTC)');\n });\n\n it('should handle a date on the next day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 12:34pm (UTC)');\n });\n\n it('should handle a date on the next day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 4:34pm (UTC)');\n });\n\n it('should handle a date on the next day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 9:34am (UTC)');\n });\n\n it('should handle a date on the previous day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 12:34pm (UTC)');\n });\n\n it('should handle a date on the previous day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 4:34pm (UTC)');\n });\n\n it('should handle a date on the previous day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 9:34am (UTC)');\n });\n\n it('should handle a date in the near future', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sun, Apr\\u00a015, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the far future', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 9, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Mon, Oct\\u00a015, 2018, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the near past', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 9, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sun, Oct\\u00a015, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the far past', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sat, Apr\\u00a015, 2017, 12:34am (UTC)',\n );\n });\n\n it('should display without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, includeTz: false }),\n 'Sun, Apr\\u00a015, 12:34am',\n );\n });\n\n it('should handle a date in CDT', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'America/Chicago', { baseDate }),\n 'Sat, Apr\\u00a014, 7:34pm (CDT)',\n );\n });\n\n it('should handle a date in CDT without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'America/Chicago', { baseDate, includeTz: false }),\n 'Sat, Apr\\u00a014, 7:34pm',\n );\n });\n\n it('should handle displaying only the date', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, dateOnly: true }),\n 'Sun, Apr\\u00a015 (UTC)',\n );\n });\n\n it('should handle displaying only the date without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, dateOnly: true, includeTz: false }),\n 'Sun, Apr\\u00a015',\n );\n });\n\n it('should handle displaying only the time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate, timeOnly: true }), '12:34am (UTC)');\n });\n\n it('should handle displaying only the time without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, timeOnly: true, includeTz: false }),\n '12:34am',\n );\n });\n\n it('should handle displaying dates with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, timeFirst: true }),\n '12:34am Sun, Apr\\u00a015 (UTC)',\n );\n });\n\n it('should handle a time with seconds', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 34, 7));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1:34:07pm (UTC)');\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'minute' }),\n 'today, 1:34pm (UTC)',\n );\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'hour' }),\n 'today, 1pm (UTC)',\n );\n });\n\n it('should handle a time with minutes', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1:34pm (UTC)');\n });\n\n it('should handle a time with hours', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1pm (UTC)');\n });\n\n it('should handle midnight', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 0, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12am (UTC)');\n });\n\n it('should handle noon', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12pm (UTC)');\n });\n\n describe('maxPrecision option', () => {\n it('should limit to hour precision when maxPrecision is \"hour\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n });\n\n it('should limit to minute precision when maxPrecision is \"minute\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:45pm',\n );\n });\n\n it('should show second precision when maxPrecision is \"second\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:45:17pm',\n );\n });\n\n describe('minPrecision option', () => {\n it('should sometimes show minutes when minPrecision is \"hour\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date1 = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 1, 0));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3:01pm',\n );\n const date3 = new Date(Date.UTC(2018, 0, 1, 15, 0, 1));\n assert.equal(\n formatDateFriendly(date3, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:01pm',\n );\n });\n it('should always show minutes when minPrecision is \"minute\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 1, 0));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:01pm',\n );\n const date3 = new Date(Date.UTC(2018, 0, 1, 15, 0, 1));\n assert.equal(\n formatDateFriendly(date3, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:01pm',\n );\n });\n });\n\n describe('precision option combinations', () => {\n it('should work with fixed precision (min=max)', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date1 = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00pm',\n );\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:00pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 30, 45));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:30pm',\n );\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:30:45pm',\n );\n });\n });\n\n describe('precision with full date formatting', () => {\n it('should work with full date and time formatting', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'minute' }),\n 'today, 3:45pm (UTC)',\n );\n });\n\n it('should work with timeFirst option', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeFirst: true,\n }),\n '3:00pm today (UTC)',\n );\n });\n });\n });\n\n describe('formatDateRangeFriendly()', () => {\n it('should handle two different dates', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm to Wed, Jan\\u00a03, 10am (UTC)',\n );\n });\n\n it('should handle the same date with different times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm to 1pm (UTC)',\n );\n });\n\n it('should handle the same date with the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm (UTC)',\n );\n });\n\n it('should handle two different dates with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm today to 10am Wed, Jan\\u00a03 (UTC)',\n );\n });\n\n it('should handle the same date with different times with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm to 1pm today (UTC)',\n );\n });\n\n it('should handle the same date with the same time and the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm today (UTC)',\n );\n });\n\n it('should handle two different dates without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, includeTz: false }),\n 'today, 12:34pm to Wed, Jan\\u00a03, 10am',\n );\n });\n\n it('should handle two different dates with only dates and without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n dateOnly: true,\n includeTz: false,\n }),\n 'today to Wed, Jan\\u00a03',\n );\n });\n\n it('should handle two different dates with time first and without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n timeFirst: true,\n includeTz: false,\n }),\n '12:34pm today to 10am Wed, Jan\\u00a03',\n );\n });\n\n it('should handle two different dates in CST', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 0, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'America/Chicago', { baseDate }),\n 'yesterday, 6:34pm to Wed, Jan\\u00a03, 4am (CST)',\n );\n });\n\n it('should handle two different dates in CST without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 0, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'America/Chicago', {\n baseDate,\n includeTz: false,\n }),\n 'yesterday, 6:34pm to Wed, Jan\\u00a03, 4am',\n );\n });\n\n describe('precision options', () => {\n it('should apply maxPrecision to both start and end times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n includeTz: false,\n }),\n 'today, 3:45pm to 5:30pm',\n );\n });\n\n it('should apply minPrecision to both start and end times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n includeTz: false,\n }),\n 'today, 3:00pm to 5:00pm',\n );\n });\n\n it('should handle precision options with different dates', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 2, 10, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n includeTz: false,\n }),\n 'today, 3pm to tomorrow, 10am',\n );\n });\n\n it('should handle precision options with same times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n includeTz: false,\n }),\n 'today, 3:00:00pm',\n );\n });\n\n it('should work with timeFirst and precision options', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n timeFirst: true,\n includeTz: false,\n }),\n '3:45pm to 5:30pm today',\n );\n });\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"date.test.js","sourceRoot":"","sources":["../src/date.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, describe, it } from 'vitest';\n\nimport {\n formatDate,\n formatDateFriendly,\n formatDateRangeFriendly,\n formatDateWithinRange,\n formatDateYMD,\n formatDateYMDHM,\n} from './date.js';\n\ndescribe('date formatting', () => {\n describe('formatDate', () => {\n it('formats a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'UTC'), '2018-01-01 12:00:00 (UTC)');\n });\n it('formats a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'America/Chicago'), '2018-01-01 06:00:00 (CST)');\n });\n it('formats a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'America/Chicago'), '2018-07-01 07:00:00 (CDT)');\n });\n it('formats dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDate(date, 'UTC'), '2018-01-01 00:01:00 (UTC)');\n });\n it('formats dates with milliseconds', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 4, 1, 3, 12));\n assert.equal(formatDate(date, 'UTC', { includeMs: true }), '2018-01-01 04:01:03.012 (UTC)');\n });\n it('formats dates without the timezone', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDate(date, 'UTC', { includeTz: false }), '2018-01-01 12:00:00');\n });\n it('formats dates with the long timezone name', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(\n formatDate(date, 'America/Chicago', { longTz: true }),\n '2018-01-01 06:00:00 (Central Standard Time)',\n );\n });\n });\n\n describe('formatDateYMD()', () => {\n it('should handle a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDateYMD(date, 'UTC'), '2018-01-01');\n });\n it('should handle a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 3, 5, 0, 0));\n assert.equal(formatDateYMD(date, 'America/Chicago'), '2018-01-02');\n });\n it('should handle a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 12, 0, 0));\n assert.equal(formatDateYMD(date, 'America/Chicago'), '2018-07-01');\n });\n it('should correctly format dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDateYMD(date, 'UTC'), '2018-01-01');\n });\n });\n\n describe('formatDateYMDHM()', () => {\n it('should handle a UTC date', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n assert.equal(formatDateYMDHM(date, 'UTC'), '2018-01-01 12:34');\n });\n it('should handle a CST date', () => {\n const date = new Date(Date.UTC(2018, 0, 3, 5, 10, 50));\n assert.equal(formatDateYMDHM(date, 'America/Chicago'), '2018-01-02 23:10');\n });\n it('should handle a CDT date', () => {\n const date = new Date(Date.UTC(2018, 6, 1, 19, 8, 19));\n assert.equal(formatDateYMDHM(date, 'America/Chicago'), '2018-07-01 14:08');\n });\n it('should correctly format dates with zero hours', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 0, 1, 0));\n assert.equal(formatDateYMDHM(date, 'UTC'), '2018-01-01 00:01');\n });\n });\n\n describe('formatDateWithinRange()', () => {\n it('should handle a date within the same day in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), '12:34');\n });\n it('should handle a date within the same day in CST', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 23, 8, 57));\n const start = new Date(Date.UTC(2018, 0, 1, 21, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 2, 2, 14, 0));\n assert.equal(formatDateWithinRange(date, start, end, 'America/Chicago'), '17:08');\n });\n it('should handle a date within the same year in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 4, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), 'Jan 1, 12:34');\n });\n it('should handle a date within different years in UTC', () => {\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 7));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const end = new Date(Date.UTC(2019, 0, 1, 12, 59, 59));\n assert.equal(formatDateWithinRange(date, start, end, 'UTC'), '2018-01-01 12:34');\n });\n });\n\n describe('formatDateFriendly()', () => {\n it('should handle a date on the same day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12:34pm (UTC)');\n });\n\n it('should handle a date on the same day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 4:34pm (UTC)');\n });\n\n it('should handle a date on the same day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 9:34am (UTC)');\n });\n\n it('should handle a date on the next day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 12:34pm (UTC)');\n });\n\n it('should handle a date on the next day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 4:34pm (UTC)');\n });\n\n it('should handle a date on the next day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 0, 2, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'tomorrow, 9:34am (UTC)');\n });\n\n it('should handle a date on the previous day at the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 12, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 12:34pm (UTC)');\n });\n\n it('should handle a date on the previous day at a later time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 16, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 4:34pm (UTC)');\n });\n\n it('should handle a date on the previous day at an earlier time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 11, 31, 9, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'yesterday, 9:34am (UTC)');\n });\n\n it('should handle a date in the near future', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sun, Apr\\u00a015, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the far future', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 9, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Mon, Oct\\u00a015, 2018, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the near past', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 9, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sun, Oct\\u00a015, 12:34am (UTC)',\n );\n });\n\n it('should handle a date in the far past', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2017, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate }),\n 'Sat, Apr\\u00a015, 2017, 12:34am (UTC)',\n );\n });\n\n it('should display without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, includeTz: false }),\n 'Sun, Apr\\u00a015, 12:34am',\n );\n });\n\n it('should handle a date in CDT', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'America/Chicago', { baseDate }),\n 'Sat, Apr\\u00a014, 7:34pm (CDT)',\n );\n });\n\n it('should handle a date in CDT without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'America/Chicago', { baseDate, includeTz: false }),\n 'Sat, Apr\\u00a014, 7:34pm',\n );\n });\n\n it('should handle displaying only the date', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, dateOnly: true }),\n 'Sun, Apr\\u00a015 (UTC)',\n );\n });\n\n it('should handle displaying only the date without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, dateOnly: true, includeTz: false }),\n 'Sun, Apr\\u00a015',\n );\n });\n\n it('should handle displaying only the time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate, timeOnly: true }), '12:34am (UTC)');\n });\n\n it('should handle displaying only the time without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, timeOnly: true, includeTz: false }),\n '12:34am',\n );\n });\n\n it('should handle displaying dates with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const date = new Date(Date.UTC(2018, 3, 15, 0, 34, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, timeFirst: true }),\n '12:34am Sun, Apr\\u00a015 (UTC)',\n );\n });\n\n it('should handle a time with seconds', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 34, 7));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1:34:07pm (UTC)');\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'minute' }),\n 'today, 1:34pm (UTC)',\n );\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'hour' }),\n 'today, 1pm (UTC)',\n );\n });\n\n it('should handle a time with minutes', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 34, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1:34pm (UTC)');\n });\n\n it('should handle a time with hours', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 1pm (UTC)');\n });\n\n it('should handle midnight', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 0, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12am (UTC)');\n });\n\n it('should handle noon', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 2));\n const date = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n assert.equal(formatDateFriendly(date, 'UTC', { baseDate }), 'today, 12pm (UTC)');\n });\n\n describe('maxPrecision option', () => {\n it('should limit to hour precision when maxPrecision is \"hour\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n });\n\n it('should limit to minute precision when maxPrecision is \"minute\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:45pm',\n );\n });\n\n it('should show second precision when maxPrecision is \"second\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 17));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:45:17pm',\n );\n });\n\n describe('minPrecision option', () => {\n it('should sometimes show minutes when minPrecision is \"hour\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date1 = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 1, 0));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3:01pm',\n );\n const date3 = new Date(Date.UTC(2018, 0, 1, 15, 0, 1));\n assert.equal(\n formatDateFriendly(date3, 'UTC', {\n baseDate,\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:01pm',\n );\n });\n it('should always show minutes when minPrecision is \"minute\"', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 1, 0));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:01pm',\n );\n const date3 = new Date(Date.UTC(2018, 0, 1, 15, 0, 1));\n assert.equal(\n formatDateFriendly(date3, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:01pm',\n );\n });\n });\n\n describe('precision option combinations', () => {\n it('should work with fixed precision (min=max)', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date1 = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00pm',\n );\n assert.equal(\n formatDateFriendly(date1, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:00:00pm',\n );\n const date2 = new Date(Date.UTC(2018, 0, 1, 15, 30, 45));\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n minPrecision: 'hour',\n timeOnly: true,\n includeTz: false,\n }),\n '3pm',\n );\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n minPrecision: 'minute',\n timeOnly: true,\n includeTz: false,\n }),\n '3:30pm',\n );\n assert.equal(\n formatDateFriendly(date2, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n timeOnly: true,\n includeTz: false,\n }),\n '3:30:45pm',\n );\n });\n });\n\n describe('precision with full date formatting', () => {\n it('should work with full date and time formatting', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n assert.equal(\n formatDateFriendly(date, 'UTC', { baseDate, maxPrecision: 'minute' }),\n 'today, 3:45pm (UTC)',\n );\n });\n\n it('should work with timeFirst option', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const date = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateFriendly(date, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n timeFirst: true,\n }),\n '3:00pm today (UTC)',\n );\n });\n });\n });\n\n describe('formatDateRangeFriendly()', () => {\n it('should handle two different dates', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm to Wed, Jan\\u00a03, 10am (UTC)',\n );\n });\n\n it('should handle the same date with different times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm to 1pm (UTC)',\n );\n });\n\n it('should handle the same date with the same time', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate }),\n 'today, 12:34pm (UTC)',\n );\n });\n\n it('should handle two different dates with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm today to 10am Wed, Jan\\u00a03 (UTC)',\n );\n });\n\n it('should handle the same date with different times with the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 13, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm to 1pm today (UTC)',\n );\n });\n\n it('should handle the same date with the same time and the time first', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, timeFirst: true }),\n '12:34pm today (UTC)',\n );\n });\n\n it('should handle two different dates without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', { baseDate, includeTz: false }),\n 'today, 12:34pm to Wed, Jan\\u00a03, 10am',\n );\n });\n\n it('should handle two different dates with only dates and without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n dateOnly: true,\n includeTz: false,\n }),\n 'today to Wed, Jan\\u00a03',\n );\n });\n\n it('should handle two different dates with time first and without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n timeFirst: true,\n includeTz: false,\n }),\n '12:34pm today to 10am Wed, Jan\\u00a03',\n );\n });\n\n it('should handle two different dates in CST', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 0, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'America/Chicago', { baseDate }),\n 'yesterday, 6:34pm to Wed, Jan\\u00a03, 4am (CST)',\n );\n });\n\n it('should handle two different dates in CST without the timezone', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 34, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 0, 34, 0));\n const end = new Date(Date.UTC(2018, 0, 3, 10, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'America/Chicago', {\n baseDate,\n includeTz: false,\n }),\n 'yesterday, 6:34pm to Wed, Jan\\u00a03, 4am',\n );\n });\n\n describe('precision options', () => {\n it('should apply maxPrecision to both start and end times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n includeTz: false,\n }),\n 'today, 3:45pm to 5:30pm',\n );\n });\n\n it('should apply minPrecision to both start and end times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n minPrecision: 'minute',\n includeTz: false,\n }),\n 'today, 3:00pm to 5:00pm',\n );\n });\n\n it('should handle precision options with different dates', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 2, 10, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'hour',\n includeTz: false,\n }),\n 'today, 3pm to tomorrow, 10am',\n );\n });\n\n it('should handle precision options with same times', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n const end = new Date(Date.UTC(2018, 0, 1, 15, 0, 0));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'second',\n minPrecision: 'second',\n includeTz: false,\n }),\n 'today, 3:00:00pm',\n );\n });\n\n it('should work with timeFirst and precision options', () => {\n const baseDate = new Date(Date.UTC(2018, 0, 1, 12, 0, 0));\n const start = new Date(Date.UTC(2018, 0, 1, 15, 45, 17));\n const end = new Date(Date.UTC(2018, 0, 1, 17, 30, 45));\n assert.equal(\n formatDateRangeFriendly(start, end, 'UTC', {\n baseDate,\n maxPrecision: 'minute',\n timeFirst: true,\n includeTz: false,\n }),\n '3:45pm to 5:30pm today',\n );\n });\n });\n });\n });\n});\n"]}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,GACb,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,QAAQ,GACT,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,GACb,MAAM,eAAe,CAAC","sourcesContent":["export {\n formatDate,\n formatDateFriendly,\n formatDateRangeFriendly,\n formatDateWithinRange,\n formatDateYMD,\n formatDateYMDHM,\n formatTz,\n} from './date.js';\nexport {\n formatInterval,\n formatIntervalHM,\n formatIntervalMinutes,\n formatIntervalRelative,\n makeInterval,\n} from './interval.js';\n"]}
|
package/dist/interval.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export declare const DAY_IN_MILLISECONDS: number;
|
|
|
10
10
|
* @param param.minutes The number of minutes in the interval.
|
|
11
11
|
* @param param.seconds The number of seconds in the interval.
|
|
12
12
|
*/
|
|
13
|
-
export declare function makeInterval({ days, hours, minutes, seconds
|
|
13
|
+
export declare function makeInterval({ days, hours, minutes, seconds }: {
|
|
14
14
|
days?: number;
|
|
15
15
|
hours?: number;
|
|
16
16
|
minutes?: number;
|
package/dist/interval.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interval.d.ts","sourceRoot":"","sources":["../src/interval.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,sBAAsB,QAA8B,CAAC;AAClE,eAAO,MAAM,oBAAoB,QAA8B,CAAC;AAChE,eAAO,MAAM,mBAAmB,QAA4B,CAAC;AAE7D;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAQ,EACR,KAAS,EACT,OAAW,EACX,OAAW,
|
|
1
|
+
{"version":3,"file":"interval.d.ts","sourceRoot":"","sources":["../src/interval.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,sBAAsB,QAA8B,CAAC;AAClE,eAAO,MAAM,oBAAoB,QAA8B,CAAC;AAChE,eAAO,MAAM,mBAAmB,QAA4B,CAAC;AAE7D;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAQ,EACR,KAAS,EACT,OAAW,EACX,OAAW,EACZ,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAET;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2BvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAC3C,SAAS,EAAE,MAAM,GAChB,MAAM,CAUR;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,MAAc,EAAE,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAsB,GAC3D,MAAM,CAKR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ9D","sourcesContent":["export const SECOND_IN_MILLISECONDS = 1000;\nexport const MINUTE_IN_MILLISECONDS = 60 * SECOND_IN_MILLISECONDS;\nexport const HOUR_IN_MILLISECONDS = 60 * MINUTE_IN_MILLISECONDS;\nexport const DAY_IN_MILLISECONDS = 24 * HOUR_IN_MILLISECONDS;\n\n/**\n * Makes an interval (in milliseconds).\n * @param param\n * @param param.days The number of days in the interval.\n * @param param.hours The number of hours in the interval.\n * @param param.minutes The number of minutes in the interval.\n * @param param.seconds The number of seconds in the interval.\n */\nexport function makeInterval({\n days = 0,\n hours = 0,\n minutes = 0,\n seconds = 0,\n}: {\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n}): number {\n return (((days * 24 + hours) * 60 + minutes) * 60 + seconds) * 1000;\n}\n\n/**\n * Format an interval (in milliseconds) to a human-readable string like '3 h 40 m'.\n *\n * @param interval Time interval in milliseconds.\n * @returns Human-readable string representing the interval.\n */\nexport function formatInterval(interval: number): string {\n const sign = interval < 0 ? '-' : '';\n\n const days = Math.floor(Math.abs(interval) / DAY_IN_MILLISECONDS);\n const hours = Math.floor(Math.abs(interval) / HOUR_IN_MILLISECONDS) % 24;\n const mins = Math.floor(Math.abs(interval) / MINUTE_IN_MILLISECONDS) % 60;\n const secs = Math.floor(Math.abs(interval) / SECOND_IN_MILLISECONDS) % 60;\n\n const parts: string[] = [];\n\n if (days > 0) {\n parts.push(`${sign}${days} d`);\n }\n if (hours > 0) {\n parts.push(`${sign}${hours} h`);\n }\n if (mins > 0) {\n parts.push(`${sign}${mins} min`);\n }\n if (secs > 0) {\n parts.push(`${sign}${secs} s`);\n }\n if (parts.length === 0) {\n parts.push('0 s');\n }\n\n return parts.join(' ');\n}\n\n/**\n * Format an interval (in milliseconds) to a human-readable string like 'Until 6\n * minutes before the session start time'.\n *\n * @param interval Time interval in milliseconds relative to `reference` (positive intervals are after `reference`).\n * @param prefix The prefix to use, must be 'Until' or 'From' (or lowercase versions of these).\n * @param reference The reference time, for example 'session start time'.\n * @returns Human-readable string representing the interval.\n */\nexport function formatIntervalRelative(\n interval: number,\n prefix: 'Until' | 'until' | 'From' | 'from',\n reference: string,\n): string {\n if (interval > 0) {\n return `${prefix} ${formatInterval(interval)} after ${reference}`;\n } else if (interval < 0) {\n return `${prefix} ${formatInterval(-interval)} before ${reference}`;\n } else if (interval === 0) {\n return `${prefix} ${reference}`;\n } else {\n return `Invalid interval: ${interval}`;\n }\n}\n\n/**\n * Format an interval (in milliseconds) to a human-readable string like HH:MM or +HH:MM.\n *\n * @param interval Time interval in milliseconds.\n * @param options\n * @param options.signed Whether to include the sign in the output.\n * @returns Human-readable string representing the interval in minutes.\n */\nexport function formatIntervalHM(\n interval: number,\n { signed = false }: { signed?: boolean } = { signed: false },\n): string {\n const sign = interval < 0 ? '-' : interval > 0 ? (signed ? '+' : '') : '';\n const hours = Math.floor(Math.abs(interval) / HOUR_IN_MILLISECONDS);\n const mins = Math.floor(Math.abs(interval) / MINUTE_IN_MILLISECONDS) % 60;\n return `${sign}${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}`;\n}\n\n/**\n * Format an interval (in milliseconds) to a human-readable string with the number of minutes, like '7 minutes' or '1 minute'.\n *\n * @param interval Time interval in milliseconds.\n * @returns Human-readable string representing the interval in minutes.\n */\nexport function formatIntervalMinutes(interval: number): string {\n const sign = interval < 0 ? '-' : '';\n const minutes = Math.ceil(Math.abs(interval / MINUTE_IN_MILLISECONDS));\n if (minutes === 1) {\n return `${sign}1 minute`;\n } else {\n return `${sign}${minutes} minutes`;\n }\n}\n"]}
|
package/dist/interval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interval.js","sourceRoot":"","sources":["../src/interval.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,sBAAsB,CAAC;AAClE,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,GAAG,sBAAsB,CAAC;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,oBAAoB,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAC3B,IAAI,GAAG,CAAC,EACR,KAAK,GAAG,CAAC,EACT,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,GAMZ;
|
|
1
|
+
{"version":3,"file":"interval.js","sourceRoot":"","sources":["../src/interval.ts"],"names":[],"mappings":"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","sourcesContent":["export const SECOND_IN_MILLISECONDS = 1000;\nexport const MINUTE_IN_MILLISECONDS = 60 * SECOND_IN_MILLISECONDS;\nexport const HOUR_IN_MILLISECONDS = 60 * MINUTE_IN_MILLISECONDS;\nexport const DAY_IN_MILLISECONDS = 24 * HOUR_IN_MILLISECONDS;\n\n/**\n * Makes an interval (in milliseconds).\n * @param param\n * @param param.days The number of days in the interval.\n * @param param.hours The number of hours in the interval.\n * @param param.minutes The number of minutes in the interval.\n * @param param.seconds The number of seconds in the interval.\n */\nexport function makeInterval({\n days = 0,\n hours = 0,\n minutes = 0,\n seconds = 0,\n}: {\n days?: number;\n hours?: number;\n minutes?: number;\n seconds?: number;\n}): number {\n return (((days * 24 + hours) * 60 + minutes) * 60 + seconds) * 1000;\n}\n\n/**\n * Format an interval (in milliseconds) to a human-readable string like '3 h 40 m'.\n *\n * @param interval Time interval in milliseconds.\n * @returns Human-readable string representing the interval.\n */\nexport function formatInterval(interval: number): string {\n const sign = interval < 0 ? '-' : '';\n\n const days = Math.floor(Math.abs(interval) / DAY_IN_MILLISECONDS);\n const hours = Math.floor(Math.abs(interval) / HOUR_IN_MILLISECONDS) % 24;\n const mins = Math.floor(Math.abs(interval) / MINUTE_IN_MILLISECONDS) % 60;\n const secs = Math.floor(Math.abs(interval) / SECOND_IN_MILLISECONDS) % 60;\n\n const parts: string[] = [];\n\n if (days > 0) {\n parts.push(`${sign}${days} d`);\n }\n if (hours > 0) {\n parts.push(`${sign}${hours} h`);\n }\n if (mins > 0) {\n parts.push(`${sign}${mins} min`);\n }\n if (secs > 0) {\n parts.push(`${sign}${secs} s`);\n }\n if (parts.length === 0) {\n parts.push('0 s');\n }\n\n return parts.join(' ');\n}\n\n/**\n * Format an interval (in milliseconds) to a human-readable string like 'Until 6\n * minutes before the session start time'.\n *\n * @param interval Time interval in milliseconds relative to `reference` (positive intervals are after `reference`).\n * @param prefix The prefix to use, must be 'Until' or 'From' (or lowercase versions of these).\n * @param reference The reference time, for example 'session start time'.\n * @returns Human-readable string representing the interval.\n */\nexport function formatIntervalRelative(\n interval: number,\n prefix: 'Until' | 'until' | 'From' | 'from',\n reference: string,\n): string {\n if (interval > 0) {\n return `${prefix} ${formatInterval(interval)} after ${reference}`;\n } else if (interval < 0) {\n return `${prefix} ${formatInterval(-interval)} before ${reference}`;\n } else if (interval === 0) {\n return `${prefix} ${reference}`;\n } else {\n return `Invalid interval: ${interval}`;\n }\n}\n\n/**\n * Format an interval (in milliseconds) to a human-readable string like HH:MM or +HH:MM.\n *\n * @param interval Time interval in milliseconds.\n * @param options\n * @param options.signed Whether to include the sign in the output.\n * @returns Human-readable string representing the interval in minutes.\n */\nexport function formatIntervalHM(\n interval: number,\n { signed = false }: { signed?: boolean } = { signed: false },\n): string {\n const sign = interval < 0 ? '-' : interval > 0 ? (signed ? '+' : '') : '';\n const hours = Math.floor(Math.abs(interval) / HOUR_IN_MILLISECONDS);\n const mins = Math.floor(Math.abs(interval) / MINUTE_IN_MILLISECONDS) % 60;\n return `${sign}${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}`;\n}\n\n/**\n * Format an interval (in milliseconds) to a human-readable string with the number of minutes, like '7 minutes' or '1 minute'.\n *\n * @param interval Time interval in milliseconds.\n * @returns Human-readable string representing the interval in minutes.\n */\nexport function formatIntervalMinutes(interval: number): string {\n const sign = interval < 0 ? '-' : '';\n const minutes = Math.ceil(Math.abs(interval / MINUTE_IN_MILLISECONDS));\n if (minutes === 1) {\n return `${sign}1 minute`;\n } else {\n return `${sign}${minutes} minutes`;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interval.test.d.ts","sourceRoot":"","sources":["../src/interval.test.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"interval.test.d.ts","sourceRoot":"","sources":["../src/interval.test.ts"],"names":[],"mappings":"","sourcesContent":["import { assert, describe, it } from 'vitest';\n\nimport {\n formatInterval,\n formatIntervalHM,\n formatIntervalMinutes,\n formatIntervalRelative,\n makeInterval,\n} from './interval.js';\n\ndescribe('interval formatting', () => {\n describe('formatInterval()', () => {\n it('should handle seconds', () => {\n assert.equal(formatInterval(7000), '7 s');\n });\n it('should handle fractional seconds', () => {\n assert.equal(formatInterval(7321), '7 s');\n });\n it('should handle minutes', () => {\n assert.equal(formatInterval(2 * 60 * 1000), '2 min');\n });\n it('should handle hours', () => {\n assert.equal(formatInterval(3 * 60 * 60 * 1000), '3 h');\n });\n it('should handle hours', () => {\n assert.equal(formatInterval(4 * 24 * 60 * 60 * 1000), '4 d');\n });\n it('should handle complex intervals', () => {\n assert.equal(formatInterval((((4 * 24 + 3) * 60 + 2) * 60 + 7) * 1000), '4 d 3 h 2 min 7 s');\n });\n it('should handle zero', () => {\n assert.equal(formatInterval(0), '0 s');\n });\n it('should handle negative intervals', () => {\n assert.equal(\n formatInterval(-(((4 * 24 + 3) * 60 + 2) * 60 + 7) * 1000),\n '-4 d -3 h -2 min -7 s',\n );\n });\n });\n describe('formatIntervalRelative()', () => {\n it('should handle positive intervals', () => {\n assert.equal(\n formatIntervalRelative(3 * 1000, 'Until', 'the start time'),\n 'Until 3 s after the start time',\n );\n });\n it('should handle negative intervals', () => {\n assert.equal(\n formatIntervalRelative(-7 * 60 * 1000, 'From', 'the start time'),\n 'From 7 min before the start time',\n );\n });\n it('should handle zero intervals', () => {\n assert.equal(formatIntervalRelative(0, 'From', 'the start time'), 'From the start time');\n });\n });\n\n describe('formatIntervalMinutes()', () => {\n it('should correctly round up', () => {\n assert.equal(formatIntervalMinutes(3.2 * 60 * 1000), '4 minutes');\n });\n it('should correctly handle 1 minute', () => {\n assert.equal(formatIntervalMinutes(17 * 1000), '1 minute');\n });\n it('should correctly handle zero', () => {\n assert.equal(formatIntervalMinutes(0), '0 minutes');\n });\n it('should correctly handle -1 minute', () => {\n assert.equal(formatIntervalMinutes(-17 * 1000), '-1 minute');\n });\n it('should correctly handle negative intervals', () => {\n assert.equal(formatIntervalMinutes(-3.2 * 60 * 1000), '-4 minutes');\n });\n });\n\n describe('formatIntervalHM()', () => {\n it('should correctly handle positive minutes', () => {\n assert.equal(formatIntervalHM(3.2 * 60 * 1000), '00:03');\n });\n it('should correctly handle positive hours', () => {\n assert.equal(formatIntervalHM((4 * 60 + 17.8) * 60 * 1000), '04:17');\n });\n it('should correctly handle large positive hours', () => {\n assert.equal(formatIntervalHM((143 * 60 + 17.8) * 60 * 1000), '143:17');\n });\n it('should correctly handle an explicit sign', () => {\n assert.equal(formatIntervalHM((4 * 60 + 17.8) * 60 * 1000, { signed: true }), '+04:17');\n });\n it('should correctly handle negative minutes', () => {\n assert.equal(formatIntervalHM(-3.2 * 60 * 1000), '-00:03');\n });\n it('should correctly handle negative hours', () => {\n assert.equal(formatIntervalHM(-(4 * 60 + 17.8) * 60 * 1000), '-04:17');\n });\n });\n\n describe('makeInterval()', () => {\n it('should handle seconds', () => {\n assert.equal(makeInterval({ seconds: 7 }), 7 * 1000);\n });\n it('should handle minutes', () => {\n assert.equal(makeInterval({ minutes: 2 }), 2 * 60 * 1000);\n });\n it('should handle hours', () => {\n assert.equal(makeInterval({ hours: 3 }), 3 * 60 * 60 * 1000);\n });\n it('should handle days', () => {\n assert.equal(makeInterval({ days: 4 }), 4 * 24 * 60 * 60 * 1000);\n });\n it('should default to zero', () => {\n assert.equal(makeInterval({}), 0);\n });\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interval.test.js","sourceRoot":"","sources":["../src/interval.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,GACb,MAAM,eAAe,CAAC;AAEvB,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"interval.test.js","sourceRoot":"","sources":["../src/interval.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { assert, describe, it } from 'vitest';\n\nimport {\n formatInterval,\n formatIntervalHM,\n formatIntervalMinutes,\n formatIntervalRelative,\n makeInterval,\n} from './interval.js';\n\ndescribe('interval formatting', () => {\n describe('formatInterval()', () => {\n it('should handle seconds', () => {\n assert.equal(formatInterval(7000), '7 s');\n });\n it('should handle fractional seconds', () => {\n assert.equal(formatInterval(7321), '7 s');\n });\n it('should handle minutes', () => {\n assert.equal(formatInterval(2 * 60 * 1000), '2 min');\n });\n it('should handle hours', () => {\n assert.equal(formatInterval(3 * 60 * 60 * 1000), '3 h');\n });\n it('should handle hours', () => {\n assert.equal(formatInterval(4 * 24 * 60 * 60 * 1000), '4 d');\n });\n it('should handle complex intervals', () => {\n assert.equal(formatInterval((((4 * 24 + 3) * 60 + 2) * 60 + 7) * 1000), '4 d 3 h 2 min 7 s');\n });\n it('should handle zero', () => {\n assert.equal(formatInterval(0), '0 s');\n });\n it('should handle negative intervals', () => {\n assert.equal(\n formatInterval(-(((4 * 24 + 3) * 60 + 2) * 60 + 7) * 1000),\n '-4 d -3 h -2 min -7 s',\n );\n });\n });\n describe('formatIntervalRelative()', () => {\n it('should handle positive intervals', () => {\n assert.equal(\n formatIntervalRelative(3 * 1000, 'Until', 'the start time'),\n 'Until 3 s after the start time',\n );\n });\n it('should handle negative intervals', () => {\n assert.equal(\n formatIntervalRelative(-7 * 60 * 1000, 'From', 'the start time'),\n 'From 7 min before the start time',\n );\n });\n it('should handle zero intervals', () => {\n assert.equal(formatIntervalRelative(0, 'From', 'the start time'), 'From the start time');\n });\n });\n\n describe('formatIntervalMinutes()', () => {\n it('should correctly round up', () => {\n assert.equal(formatIntervalMinutes(3.2 * 60 * 1000), '4 minutes');\n });\n it('should correctly handle 1 minute', () => {\n assert.equal(formatIntervalMinutes(17 * 1000), '1 minute');\n });\n it('should correctly handle zero', () => {\n assert.equal(formatIntervalMinutes(0), '0 minutes');\n });\n it('should correctly handle -1 minute', () => {\n assert.equal(formatIntervalMinutes(-17 * 1000), '-1 minute');\n });\n it('should correctly handle negative intervals', () => {\n assert.equal(formatIntervalMinutes(-3.2 * 60 * 1000), '-4 minutes');\n });\n });\n\n describe('formatIntervalHM()', () => {\n it('should correctly handle positive minutes', () => {\n assert.equal(formatIntervalHM(3.2 * 60 * 1000), '00:03');\n });\n it('should correctly handle positive hours', () => {\n assert.equal(formatIntervalHM((4 * 60 + 17.8) * 60 * 1000), '04:17');\n });\n it('should correctly handle large positive hours', () => {\n assert.equal(formatIntervalHM((143 * 60 + 17.8) * 60 * 1000), '143:17');\n });\n it('should correctly handle an explicit sign', () => {\n assert.equal(formatIntervalHM((4 * 60 + 17.8) * 60 * 1000, { signed: true }), '+04:17');\n });\n it('should correctly handle negative minutes', () => {\n assert.equal(formatIntervalHM(-3.2 * 60 * 1000), '-00:03');\n });\n it('should correctly handle negative hours', () => {\n assert.equal(formatIntervalHM(-(4 * 60 + 17.8) * 60 * 1000), '-04:17');\n });\n });\n\n describe('makeInterval()', () => {\n it('should handle seconds', () => {\n assert.equal(makeInterval({ seconds: 7 }), 7 * 1000);\n });\n it('should handle minutes', () => {\n assert.equal(makeInterval({ minutes: 2 }), 2 * 60 * 1000);\n });\n it('should handle hours', () => {\n assert.equal(makeInterval({ hours: 3 }), 3 * 60 * 60 * 1000);\n });\n it('should handle days', () => {\n assert.equal(makeInterval({ days: 4 }), 4 * 24 * 60 * 60 * 1000);\n });\n it('should default to zero', () => {\n assert.equal(makeInterval({}), 0);\n });\n });\n});\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/formatter",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
},
|
|
10
10
|
"main": "dist/index.js",
|
|
11
11
|
"scripts": {
|
|
12
|
-
"build": "
|
|
13
|
-
"dev": "
|
|
12
|
+
"build": "tsgo",
|
|
13
|
+
"dev": "tsgo --watch --preserveWatchOutput",
|
|
14
14
|
"test": "vitest run --coverage"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
@@ -19,10 +19,11 @@
|
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@prairielearn/tsconfig": "^0.0.0",
|
|
22
|
-
"@types/node": "^22.19.
|
|
23
|
-
"@
|
|
22
|
+
"@types/node": "^22.19.5",
|
|
23
|
+
"@typescript/native-preview": "^7.0.0-dev.20260106.1",
|
|
24
|
+
"@vitest/coverage-v8": "^4.0.17",
|
|
24
25
|
"tsx": "^4.21.0",
|
|
25
26
|
"typescript": "^5.9.3",
|
|
26
|
-
"vitest": "^4.0.
|
|
27
|
+
"vitest": "^4.0.17"
|
|
27
28
|
}
|
|
28
29
|
}
|