datemapper
Version:
A lightweight date utility for format conversion, validation, and date manipulation.
54 lines • 2.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const moment = require("moment-timezone"); // Import moment-timezone for timezone handling
/**
* Custom error class for invalid date inputs.
* This improves error handling clarity compared to a generic `Error`.
*/
class DateValidationError extends Error {
constructor(message) {
super(message);
this.name = "DateValidationError";
}
}
/**
* Validates and normalizes date range inputs while applying timezone adjustments.
*
* - Ensures that the input dates are in a valid format.
* - Converts dates to the beginning (`from`) and end (`to`) of the day.
* - Ensures that `from` is not later than `to`.
* - Applies timezone adjustments to align with the provided timezone.
* - Provides default values if `from` or `to` is missing.
* - Supports customizable date format (defaults to `"YYYY-MM-DD"`).
*
* @param range - An object containing `from` and `to` date strings.
* @param timezone - The timezone to apply (default: UTC).
* @param format - The expected date format (default: "YYYY-MM-DD").
* @returns An object containing normalized `from` and `to` Date objects.
* @throws {DateValidationError} If the provided dates are invalid or incorrectly ordered.
*/
const validateDate = (range, timezone = "UTC", format = "YYYY-MM-DD") => {
const { from, to } = range; // Extract `from` and `to` from input
// Validate that `from` and `to` match the expected format
if (from && !moment.tz(from, format, timezone).isValid()) {
throw new DateValidationError(`Invalid starting date format. Expected format: ${format}.`);
}
if (to && !moment.tz(to, format, timezone).isValid()) {
throw new DateValidationError(`Invalid ending date format. Expected format: ${format}.`);
}
// Parse and normalize `from` date (default: 1 month ago)
const fromDate = from
? moment.tz(from, format, timezone).startOf("day").toDate()
: moment.tz(to, format, timezone).subtract(1, "months").startOf("day").toDate();
// Parse and normalize `to` date (default: today)
const toDate = to
? moment.tz(to, format, timezone).endOf("day").toDate()
: moment.tz(fromDate, timezone).endOf("day").toDate();
// Ensure that `from` is not greater than `to`
if (fromDate > toDate) {
throw new DateValidationError("Starting date cannot be later than the ending date.");
}
return { from: fromDate, to: toDate };
};
exports.default = validateDate;
//# sourceMappingURL=validate-date.js.map