UNPKG

@leancodepl/api-date-datefns

Version:

Date-fns integration for API date type conversion

105 lines (93 loc) 3.54 kB
export * from '@leancodepl/api-date'; import { parse, format, hoursToMilliseconds, minutesToMilliseconds, secondsToMilliseconds } from 'date-fns'; import { parseApiTimeSpan } from '@leancodepl/api-date-utils'; function fromApiTime(time) { if (!time) { return undefined; } return parse(time, "HH:mm:ss.SSS", new Date()); } function toApiTime(time) { if (!time) { return undefined; } return format(time, "HH:mm:ss.SSS"); } function fromApiDate(date) { if (date && typeof date === "string") { return parse(date, "yyyy-MM-dd", new Date()); } return undefined; } function toApiDate(date) { if (!date) { return undefined; } return format(date, "yyyy-MM-dd"); } function fromApiDateTimeOffset(dateTimeOffset) { if (!dateTimeOffset) { return undefined; } return parse(dateTimeOffset, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", new Date()); } function toApiDateTimeOffset(dateTimeOffset) { if (!dateTimeOffset) { return undefined; } return format(dateTimeOffset, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); } function fromApiTimeSpan(timeSpan) { if (!timeSpan) { return undefined; } const parsedApiTimeSpan = parseApiTimeSpan(timeSpan); const parsedApiTimeSpanValues = parsedApiTimeSpan.values; const daysInMilliseconds = hoursToMilliseconds(parsedApiTimeSpanValues.days * 24); const hoursInMilliseconds = hoursToMilliseconds(parsedApiTimeSpanValues.hours); const minutesInMilliseconds = minutesToMilliseconds(parsedApiTimeSpanValues.minutes); const secondsInMilliseconds = secondsToMilliseconds(parsedApiTimeSpanValues.seconds); const differenceInMilliseconds = daysInMilliseconds + hoursInMilliseconds + minutesInMilliseconds + secondsInMilliseconds + parsedApiTimeSpanValues.milliseconds; const signBasedMultiplier = parsedApiTimeSpan.sign === "-" ? -1 : 1; return signBasedMultiplier * differenceInMilliseconds; } function padTo2(x) { var _x_toFixed; const stringified = (_x_toFixed = x == null ? void 0 : x.toFixed(0)) != null ? _x_toFixed : "0"; return stringified.padStart(2, "0"); } function parseDifferenceInMilliseconds(differenceInMilliseconds) { const milliseconds = differenceInMilliseconds % 1000; const seconds = Math.floor(differenceInMilliseconds / 1000 % 60); const minutes = Math.floor(differenceInMilliseconds / (1000 * 60) % 60); const hours = Math.floor(differenceInMilliseconds / (1000 * 60 * 60) % 24); const days = Math.floor(differenceInMilliseconds / (1000 * 60 * 60 * 24)); return { milliseconds, seconds, minutes, hours, days }; } function toApiTimeSpan(differenceInMilliseconds) { let stringTimeSpan = ""; if (!differenceInMilliseconds) { return undefined; } const isNegative = differenceInMilliseconds < 0; const absDifferenceInMilliseconds = Math.abs(differenceInMilliseconds); const { milliseconds, seconds, minutes, hours, days } = parseDifferenceInMilliseconds(absDifferenceInMilliseconds); if (isNegative) { stringTimeSpan += "-"; } if (days > 0) { stringTimeSpan += `${days}.`; } stringTimeSpan += `${padTo2(hours)}:${padTo2(minutes)}:${padTo2(seconds)}`; if (milliseconds > 0) { stringTimeSpan += `.${milliseconds}`; } return stringTimeSpan; } export { fromApiDate, fromApiDateTimeOffset, fromApiTime, fromApiTimeSpan, toApiDate, toApiDateTimeOffset, toApiTime, toApiTimeSpan };