#914 Refactor: Luxon-Depenency, formatFromMillis() (#924)

This commit is contained in:
Charalambos Makridakis
2024-04-29 23:20:12 +02:00
committed by GitHub
parent 0966659596
commit 8b0e03e980
4 changed files with 325 additions and 26 deletions
-2
View File
@@ -13,11 +13,9 @@
},
"dependencies": {
"deepmerge-ts": "^5.1.0",
"luxon": "^3.4.4",
"nanoid": "^5.0.4"
},
"devDependencies": {
"@types/luxon": "^3.4.0",
"@typescript-eslint/eslint-plugin": "^6.10.0",
"@typescript-eslint/parser": "^6.10.0",
"eslint": "^8.53.0",
@@ -1,6 +1,6 @@
import { dayInMs } from '../timeConstants';
import { MILLIS_PER_HOUR } from './conversionUtils';
import { millisToString, removeLeadingZero } from './timeFormatting';
import { formatFromMillis, millisToString, removeLeadingZero } from './timeFormatting';
describe('millisToString()', () => {
it('returns fallback if millis is null', () => {
@@ -61,3 +61,159 @@ describe('removeLeadingZero()', () => {
expect(removeLeadingZero('-00:08:47')).toBe('-8:47');
});
});
describe('formatFromMillis()', () => {
it('milliseconds', () => {
const millis = 76211123; // Jan 1, 1970 21:10:11.123 UTC
const format = 'S';
const expectedResult = '123';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('seconds (no padding)', () => {
const millis = 76211123;
const format = 's';
const expectedResult = '11';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('seconds (padding)', () => {
const millis = 76211123;
const format = 'ss';
const expectedResult = '11';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('minute (no padding)', () => {
const millis = 76211123;
const format = 'm';
const expectedResult = '10';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('minute (padding)', () => {
const millis = 76211123;
const format = 'mm';
const expectedResult = '10';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('hour - 12 (no padding)', () => {
const millis = 76211123;
const format = 'h';
const expectedResult = '9';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('hour - 12 (padding)', () => {
const millis = 76211123;
const format = 'hh';
const expectedResult = '09';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('hour - 24 (no padding)', () => {
const millis = 76211123;
const format = 'H';
const expectedResult = '21';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('hour - 24 (padding)', () => {
const millis = 76211123;
const format = 'HH';
const expectedResult = '21';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('formatted time HH:mm:ss', () => {
const millis = 76211123;
const format = 'HH:mm:ss';
const expectedResult = '21:10:11';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('formatted time hh:mm a', () => {
const millis = 76211123;
const format = 'hh:mm a';
const expectedResult = '09:10 PM';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('milliseconds', () => {
const millis = 29167345; // 08:06:08.345
const format = 'S';
const expectedResult = '345';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('seconds (no padding)', () => {
const millis = 29167345;
const format = 's';
const expectedResult = '7';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('seconds (padding)', () => {
const millis = 29167345;
const format = 'ss';
const expectedResult = '07';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('minute (no padding)', () => {
const millis = 29167345;
const format = 'm';
const expectedResult = '6';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('minute (padding)', () => {
const millis = 29167345;
const format = 'mm';
const expectedResult = '06';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('hour - 12 (no padding)', () => {
const millis = 29167345;
const format = 'h';
const expectedResult = '8';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('hour - 12 (padding)', () => {
const millis = 29167345;
const format = 'hh';
const expectedResult = '08';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('hour - 24 (no padding)', () => {
const millis = 29167345;
const format = 'H';
const expectedResult = '8';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('hour - 24 (padding)', () => {
const millis = 29167345;
const format = 'HH';
const expectedResult = '08';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('formatted time HH:mm:ss', () => {
const millis = 29167345;
const format = 'HH:mm:ss';
const expectedResult = '08:06:07';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
it('formatted time hh:mm a', () => {
const millis = 29167345;
const format = 'hh:mm a';
const expectedResult = '08:06 AM';
expect(formatFromMillis(millis, format)).toBe(expectedResult);
});
});
@@ -1,4 +1,3 @@
import { DateTime } from 'luxon';
import type { MaybeNumber } from 'ontime-types';
import { millisToHours, millisToMinutes, millisToSeconds } from './conversionUtils.js';
@@ -71,11 +70,60 @@ export function removeSeconds(timer: string): string {
}
/**
* @description utility function to format a date in milliseconds using luxon
* @param {number} millis
* @param {string} format
* @return {string}
* Formats a given date into a custom string format based on UTC time.
*
* @param millis - The number of milliseconds.
* @param format - A string specifying the desired output format.
* For example, 'ss' will format the millis as '07' seconds.
*
* @returns The formatted date as a string according to the provided `format` string.
* If input `millis` is smaller than zero, it returns undefined.
*
*/
export function formatFromMillis(millis: number, format: string): string {
return DateTime.fromMillis(millis).toUTC().toFormat(format);
export function formatFromMillis(millis: number, format: string): string | undefined {
if (millis < 0) {
return undefined;
}
const date: Date = new Date(millis);
const hour24Padded = date.getUTCHours().toString().padStart(2, '0');
const hour24 = date.getUTCHours().toString();
const minutePadded = date.getUTCMinutes().toString().padStart(2, '0');
const minute = date.getUTCMinutes().toString();
const secondPadded = date.getUTCSeconds().toString().padStart(2, '0');
const second = date.getUTCSeconds().toString();
const milliseconds = date.getUTCMilliseconds().toString().padStart(3, '0');
const hour12 = ((date.getUTCHours() % 12) || 12).toString();
const hour12Padded = hour12.padStart(2, '0');
const amPm = date.getUTCHours() >= 12 ? 'PM' : 'AM';
const replacements: Record<string, string> = {
'HH': hour24Padded,
'H': hour24,
'hh': hour12Padded,
'h': hour12,
'mm': minutePadded,
'm': minute,
'ss': secondPadded,
's': second,
'S': milliseconds,
'a': amPm
};
return applyReplacements(format, replacements);
}
/**
* Applies replacements to a template string based on a dictionary of tokens and their corresponding values.
*
* @param {string} template - The format template string containing tokens to be replaced.
* @param {Record<string, string>} replacements - A record of tokens and their corresponding values.
* @returns {string} The formatted string with all tokens replaced by their values.
*/
function applyReplacements(template: string, replacements: Record<string, string>): string {
return Object.keys(replacements).reduce((result, token) => {
const regex = new RegExp(`\\b${token}\\b`, 'g');
return result.replace(regex, replacements[token]);
}, template);
}