minutesToSeconds,
secondsToMilliseconds,
} from 'date-fns';
-import clone from 'just-clone';
+import deepClone from 'deep-clone';
import { Constants } from './Constants';
import { type TimestampedData, WebSocketCloseEventStatusString } from '../types';
return formatDurationMilliSeconds(secondsToMilliseconds(duration));
};
-// More efficient date validation function than the one provided by date-fns
-export const isValidDate = (date: unknown): boolean => {
+// More efficient time validation function than the one provided by date-fns
+export const isValidTime = (date: unknown): boolean => {
if (typeof date === 'number') {
return !isNaN(date);
} else if (isDate(date)) {
return false;
};
-export const convertToDate = (
- value: Date | string | number | null | undefined,
-): Date | null | undefined => {
+export const convertToDate = (value: Date | string | number | undefined): Date | undefined => {
if (isNullOrUndefined(value)) {
- return value as null | undefined;
+ return value as undefined;
}
- if (value instanceof Date) {
- return value;
+ if (isDate(value)) {
+ return value as Date;
}
if (isString(value) || typeof value === 'number') {
- return new Date(value!);
+ const valueToDate = new Date(value as string | number);
+ if (isNaN(valueToDate.getTime())) {
+ throw new Error(`Cannot convert to date: '${value as string | number}'`);
+ }
+ return valueToDate;
}
- return null;
};
export const convertToInt = (value: unknown): number => {
changedValue = parseInt(value as string);
}
if (isNaN(changedValue)) {
- // eslint-disable-next-line @typescript-eslint/no-base-to-string
- throw new Error(`Cannot convert to integer: ${value.toString()}`);
+ throw new Error(`Cannot convert to integer: '${String(value)}'`);
}
return changedValue;
};
changedValue = parseFloat(value as string);
}
if (isNaN(changedValue)) {
- // eslint-disable-next-line @typescript-eslint/no-base-to-string
- throw new Error(`Cannot convert to float: ${value.toString()}`);
+ throw new Error(`Cannot convert to float: '${String(value)}'`);
}
return changedValue;
};
);
};
-export const cloneObject = <T extends object>(object: T): T => {
- return clone<T>(object);
+type CloneableData =
+ | number
+ | string
+ | boolean
+ | null
+ | undefined
+ | Date
+ | CloneableData[]
+ | { [key: string]: CloneableData };
+
+export const cloneObject = <T>(object: T): T => {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
+ return deepClone(object as CloneableData) as T;
};
export const hasOwnProp = (object: unknown, property: PropertyKey): boolean => {