@leancodepl/api-date-datefns
Version:
Date-fns integration for API date type conversion
105 lines (93 loc) • 3.54 kB
JavaScript
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 };