UNPKG

mvom

Version:

Multivalue Object Mapper

100 lines (90 loc) 3.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _dateFns = require("date-fns"); var _errors = require("../errors"); /** ISOTime Data Transformer */ class ISOTimeDataTransformer { /** Database time format is in milliseconds */ constructor(dbFormat = 's') { this.isDbInMs = dbFormat === 'ms'; } /** * Transform mv style time data to ISO 8601 approved time format (HH:mm:ss.SSS) * @throws {@link TransformDataError} Database value could not be transformed to external format */ transformFromDb(value) { if (value == null) { return null; } const internalTime = Number(value); if (!Number.isInteger(internalTime) || internalTime < 0) { throw new _errors.TransformDataError({ transformClass: this.constructor.name, transformValue: value }); } if (internalTime > 86400000 || !this.isDbInMs && internalTime > 86400) { throw new _errors.TransformDataError({ transformClass: this.constructor.name, transformValue: value }); } return this.convertInternalTimeToISOTime(internalTime); } /** * Transform ISO 8601 approved time format (HH:mm:ss.SSS) to mv style time data * @throws {@link TransformDataError} Value could not be transformed to database format */ transformToDb(value) { if (value == null) { return null; } if (typeof value !== 'string') { throw new _errors.TransformDataError({ transformClass: this.constructor.name, transformValue: value }); } const isoTimeRegex = /(\d{2}):(\d{2}):(\d{2})\.(\d{3})/; // hh:mm:ss.SSS const match = isoTimeRegex.exec(value); if (match == null) { throw new _errors.TransformDataError({ transformClass: this.constructor.name, transformValue: value }); } const [, hour, minute, second, millisecond] = match; return this.convertISOTimeToInternalTime(hour, minute, second, millisecond); } /** Transform query constants to internal u2 time format */ transformToQuery(value) { return value === '' || value == null ? '' : this.transformToDb(value); } /** Convert internal time to ISOTime format */ convertInternalTimeToISOTime(internalTime) { let workingValue = internalTime; const multiplier = this.isDbInMs ? 1000 : 1; const hours = String(Math.floor(workingValue / (3600 * multiplier))).padStart(2, '0'); workingValue %= 3600 * multiplier; const minutes = String(Math.floor(workingValue / (60 * multiplier))).padStart(2, '0'); workingValue %= 60 * multiplier; const seconds = String(Math.floor(workingValue / multiplier)).padStart(2, '0'); workingValue %= multiplier; const milliseconds = this.isDbInMs ? String(workingValue).padStart(3, '0') : '000'; return `${hours}:${minutes}:${seconds}.${milliseconds}`; } /** Convert hours, minutes, seconds, and milliseconds to multivalue internal time format */ convertISOTimeToInternalTime(hour, minute, second, millisecond) { let internalTime; if (this.isDbInMs) { internalTime = (0, _dateFns.hoursToMilliseconds)(Number(hour)) + (0, _dateFns.minutesToMilliseconds)(Number(minute)) + (0, _dateFns.secondsToMilliseconds)(Number(second)) + Number(millisecond); } else { internalTime = (0, _dateFns.hoursToSeconds)(Number(hour)) + (0, _dateFns.minutesToSeconds)(Number(minute)) + Number(second); } return String(internalTime); } } var _default = exports.default = ISOTimeDataTransformer;