pomeranian-durations
Version:
An immutable duration library based on the ISO-8601 format for durations.
130 lines (101 loc) • 3.96 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.toSql = exports.toPostgres = exports.toPostgresVerbose = void 0;
var _transformations = require("./transformations");
var _validate = require("./validate");
var _constants = require("./constants");
var _utils = require("./_utils");
var _math = require("./math");
var _normalize = require("./normalize");
var _remove = require("./remove");
var _compare = require("./compare");
var KEY_TO_POSTGRES_MAP = {
years: 'years',
months: 'mons',
days: 'days',
hours: 'hours',
minutes: 'mins',
seconds: 'seconds'
};
var leftPadZeros = function leftPadZeros(value) {
return (0, _utils.leftPad)(2, '0', value);
};
var isoStringToPostgresVerbose = function isoStringToPostgresVerbose(isoString) {
var fragments = (0, _transformations.toFragments)(isoString);
return Object.keys(fragments).sort(function (a, b) {
return _constants.UNIT_ORDER.indexOf(b) - _constants.UNIT_ORDER.indexOf(a);
}).filter(function (unit) {
return fragments[unit] !== 0;
}).map(function (unit) {
return "".concat(fragments[unit], " ").concat(KEY_TO_POSTGRES_MAP[unit]);
}).join(' ');
};
var fragmentsToSqlTime = (0, _utils.curry)(function (leftPadHours, isoString) {
if ((0, _compare.eq)(isoString, _constants.ZERO)) {
return '';
}
var updatedFragments = (0, _utils.pipe)(isoString, _math.absolute, _normalize.normalizeTime, _transformations.toFragments);
var sign = (0, _compare.lt)(isoString, _constants.ZERO) ? '-' : '';
return sign + [leftPadHours ? leftPadZeros(updatedFragments.hours) : updatedFragments.hours, leftPadZeros(updatedFragments.minutes), leftPadZeros(updatedFragments.seconds)].join(':');
});
var fragmentsToSqlDate = function fragmentsToSqlDate(isoString) {
var fragments = (0, _transformations.toFragments)(isoString);
if ((0, _utils.values)(fragments).every(function (fragment) {
return fragment === 0;
})) {
return '';
}
return "".concat(fragments.years, "-").concat(fragments.months, " ").concat(fragments.days);
};
/**
* Converts an ISO8601 duration to a Postgres verbose duration.
* @param isoString {string} - ISO8601 duration
* @returns {string} - postgres verbose duration string
* @example
* toPostgresVerbose('P2DT3M') // => '@ 2 days 3 mins'
*/
var toPostgresVerbose = function toPostgresVerbose(isoString) {
if ((0, _validate.isInvalid)(isoString)) {
return _constants.INVALID_DURATION;
}
return "@ ".concat(isoStringToPostgresVerbose(isoString)).trim();
};
/**
* Converts an ISO8601 duration to a Postgres duration.
* @param isoString {string} - ISO8601 duration
* @returns {string} - postgres duration string
* @example
* toPostgres('P2DT1M') // => '2 days 00:01:00'
*/
exports.toPostgresVerbose = toPostgresVerbose;
var toPostgres = function toPostgres(isoString) {
if ((0, _validate.isInvalid)(isoString)) {
return _constants.INVALID_DURATION;
}
var timeParts = (0, _utils.pipe)(isoString, _remove.removeDateUnits, fragmentsToSqlTime(true));
var dateParts = (0, _utils.pipe)(isoString, _remove.removeTimeUnits, isoStringToPostgresVerbose);
return (0, _utils.joinWhen)(function (value) {
return value !== '';
}, ' ', dateParts, timeParts);
};
/**
* Converts an ISO8601 duration to a SQL duration.
* @param isoString {string} - ISO8601 duration
* @returns {string} - sql duration string
* @example
* toSql('P1Y2DT1M') // => '1-0 2 0:01:00'
*/
exports.toPostgres = toPostgres;
var toSql = function toSql(isoString) {
if ((0, _validate.isInvalid)(isoString)) {
return _constants.INVALID_DURATION;
}
var timeParts = (0, _utils.pipe)(isoString, _remove.removeDateUnits, fragmentsToSqlTime(false));
var dateParts = (0, _utils.pipe)(isoString, _remove.removeTimeUnits, fragmentsToSqlDate);
return (0, _utils.joinWhen)(function (value) {
return value !== '';
}, ' ', dateParts, timeParts);
};
exports.toSql = toSql;