@naturalcycles/nodejs-lib
Version:
Standard library for Node.js
65 lines • 2.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const time_lib_1 = require("@naturalcycles/time-lib");
function dateStringExtension(joi) {
return {
base: joi.string(),
name: 'string',
language: {
dateString: 'needs to be a date string (yyyy-mm-dd)',
dateStringMin: 'needs to be not earlier than {{min}}',
dateStringMax: 'needs to be not later than {{max}}',
dateStringCalendarAccuracy: 'needs to be a calendar accurate date',
},
rules: [
{
name: 'dateString',
params: {
min: joi.string().optional(),
max: joi.string().optional(),
},
validate(params, v, state, options) {
let err;
let min = params.min;
let max = params.max;
// Today allows +-14 hours gap to account for different timezones
if (max === 'today') {
max = time_lib_1.dayjs()
.add(14, 'hour')
.toISODate();
}
if (min === 'today') {
min = time_lib_1.dayjs()
.subtract(14, 'hour')
.toISODate();
}
// console.log('min/max', min, max)
const m = v.match(/^(\d{4})-(\d{2})-(\d{2})$/);
if (!m || m.length <= 1) {
err = 'string.dateString';
}
else if (min && v < min) {
err = 'string.dateStringMin';
}
else if (max && v > max) {
err = 'string.dateStringMax';
}
else if (!time_lib_1.dayjs(v).isValid()) {
err = 'string.dateStringCalendarAccuracy';
}
if (err) {
// tslint:disable-next-line:no-invalid-this
return this.createError(err, {
v,
min,
max,
}, state, options);
}
return v; // validation passed
},
},
],
};
}
exports.dateStringExtension = dateStringExtension;
//# sourceMappingURL=dateString.extension.js.map