Files
pole-book/server/node_modules/@strapi/database/dist/fields/shared/parsers.mjs

69 lines
2.7 KiB
JavaScript

import { toString, isString, padCharsEnd } from 'lodash/fp';
import * as dateFns from 'date-fns';
import InvalidTimeError from '../../errors/invalid-time.mjs';
import InvalidDateError from '../../errors/invalid-date.mjs';
import InvalidDateTimeError from '../../errors/invalid-datetime.mjs';
const isDate = (value)=>{
return dateFns.isDate(value);
};
const DATE_REGEX = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;
const PARTIAL_DATE_REGEX = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])/g;
const TIME_REGEX = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;
const parseDateTimeOrTimestamp = (value)=>{
if (isDate(value)) {
return value;
}
try {
const date = dateFns.parseISO(toString(value));
if (dateFns.isValid(date)) {
return date;
}
const milliUnixDate = dateFns.parse(toString(value), 'T', new Date());
if (dateFns.isValid(milliUnixDate)) {
return milliUnixDate;
}
throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);
} catch (error) {
throw new InvalidDateTimeError(`Invalid format, expected a timestamp or an ISO date`);
}
};
const parseDate = (value)=>{
if (isDate(value)) {
return dateFns.format(value, 'yyyy-MM-dd');
}
const found = isString(value) ? value.match(PARTIAL_DATE_REGEX) || [] : [];
const extractedValue = found[0];
if (extractedValue && !DATE_REGEX.test(toString(value))) {
// TODO V5: throw an error when format yyyy-MM-dd is not respected
// throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);
process.emitWarning(`[deprecated] Using a date format other than YYYY-MM-DD will be removed in future versions. Date received: ${value}. Date stored: ${extractedValue}.`);
}
if (!extractedValue) {
throw new InvalidDateError(`Invalid format, expected yyyy-MM-dd`);
}
const date = dateFns.parseISO(extractedValue);
if (!dateFns.isValid(date)) {
throw new InvalidDateError(`Invalid date`);
}
return extractedValue;
};
const parseTime = (value)=>{
if (isDate(value)) {
return dateFns.format(value, 'HH:mm:ss.SSS');
}
if (typeof value !== 'string') {
throw new InvalidTimeError(`Expected a string, got a ${typeof value}`);
}
const result = value.match(TIME_REGEX);
if (result === null) {
throw new InvalidTimeError('Invalid time format, expected HH:mm:ss.SSS');
}
const [, hours, minutes, seconds, fraction = '.000'] = result;
const fractionPart = padCharsEnd('0', 3, fraction.slice(1));
return `${hours}:${minutes}:${seconds}.${fractionPart}`;
};
export { parseDate, parseDateTimeOrTimestamp, parseTime };
//# sourceMappingURL=parsers.mjs.map