moment-relative-range
Version:
Calculate a date range in the past from a certain moment
180 lines (144 loc) • 6.39 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.formatRelative = exports.formatStatic = exports.DEFAULT_RELATIVE_RANGE_LOCALE = exports.DEFAULT_STATIC_RANGE_LOCALE = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var REMOVE_DAY_REGEX = /([^MY]*)D([^MY,]*)/;
var REMOVE_MONTH_REGEX = /([^D.]*)(M+)([^D.]*)/;
var REMOVE_YEAR_REGEX = /([^MD.]*)YYYY([^MD.]*)/;
var DEFAULT_STATIC_RANGE_LOCALE = exports.DEFAULT_STATIC_RANGE_LOCALE = {
separator: '-',
otherYear: '%s YYYY'
};
var DEFAULT_RELATIVE_RANGE_LOCALE = exports.DEFAULT_RELATIVE_RANGE_LOCALE = {
past: 'previous %d',
future: 'next %d',
current: 'this %d',
day: 'day',
day_plural: '%s days',
week: 'week',
week_plural: '%s weeks',
month: 'month',
month_plural: '%s months',
quarter: 'quarter',
quarter_plural: '%s quarters',
year: 'year',
year_plural: '%s years',
r: {
past: 'last %d',
future: 'coming %d',
current: '%d to date',
day_0: 'today',
day_1: 'tomorrow',
'day_-1': 'yesterday'
}
};
_moment2.default.updateLocale('en', {
staticRange: _extends({}, DEFAULT_STATIC_RANGE_LOCALE, {
otherYear: '%s, YYYY'
}),
relativeRange: DEFAULT_RELATIVE_RANGE_LOCALE
});
var cleanFormat = function cleanFormat(format, regex) {
var bool = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
return bool ? format.replace(regex, '') : format;
};
var formatStatic = function formatStatic(range) {
var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'll';
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var date = range.date,
start = range.start,
end = range.end,
_range$locale = range.locale,
locale = _range$locale === undefined ? _moment2.default.locale() : _range$locale;
var localMoment = (0, _moment2.default)().locale(locale);
var _ref = localMoment.localeData()._config.staticRange || DEFAULT_STATIC_RANGE_LOCALE,
_ref$separator = _ref.separator,
separator = _ref$separator === undefined ? '-' : _ref$separator,
_ref$otherYear = _ref.otherYear,
otherYearConfig = _ref$otherYear === undefined ? '%s YYYY' : _ref$otherYear;
var _options$attemptYearH = options.attemptYearHiding,
attemptYearHiding = _options$attemptYearH === undefined ? false : _options$attemptYearH,
_options$attemptDayHi = options.attemptDayHiding,
attemptDayHiding = _options$attemptDayHi === undefined ? false : _options$attemptDayHi;
var result = [];
var sameYear = start.year() === end.year();
var sameMonth = sameYear && start.month() === end.month();
var sameDay = sameMonth && start.date() === end.date();
var isReadable = format.toLowerCase() === 'll';
var monthsMergable = sameMonth && !sameDay && isReadable;
var year = date ? (0, _moment2.default)(date).year() : (0, _moment2.default)().year();
var startThisYear = start.year() === year;
var endThisYear = end.year() === year;
var hideDay = attemptDayHiding && isReadable && start.date() === 1 && end.date() === end.daysInMonth();
var longDateFormat = isReadable ? cleanFormat(localMoment.localeData().longDateFormat(format), REMOVE_DAY_REGEX, hideDay) : format;
var longMonthFormat = cleanFormat(longDateFormat, REMOVE_YEAR_REGEX, isReadable);
start.locale(locale);
end.locale(locale);
var startFormat = void 0;
var endFormat = void 0;
if (monthsMergable && !sameDay) {
var dayFirst = longDateFormat.indexOf('D') < longDateFormat.indexOf('M');
if (dayFirst) {
startFormat = cleanFormat(longMonthFormat, REMOVE_MONTH_REGEX);
endFormat = longMonthFormat;
} else {
startFormat = longMonthFormat;
endFormat = cleanFormat(longMonthFormat, REMOVE_MONTH_REGEX);
}
} else {
startFormat = startThisYear && sameYear && attemptYearHiding ? longMonthFormat : longDateFormat;
endFormat = endThisYear && sameYear && attemptYearHiding ? longMonthFormat : longDateFormat;
}
if (startFormat.length) {
result.push(start.format(startFormat));
}
if (!sameDay) {
if (result.length) {
result.push(separator);
}
if (monthsMergable && (!endThisYear || !attemptYearHiding) && endFormat !== longDateFormat) {
endFormat = otherYearConfig.replace('%s', endFormat);
}
result.push(end.format(endFormat));
}
return result.join(' ');
};
var relativeTypeByCount = function relativeTypeByCount(count) {
switch (count) {
case 0:
return 'current';
default:
return count > 0 ? 'future' : 'past';
}
};
var formatRelative = function formatRelative(range) {
var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'RR';
var count = range.count,
measure = range.measure,
_range$locale2 = range.locale,
locale = _range$locale2 === undefined ? _moment2.default.locale() : _range$locale2;
var localMoment = (0, _moment2.default)().locale(locale);
// eslint-disable-next-line no-underscore-dangle
var localeData = localMoment.localeData()._config.relativeRange || DEFAULT_RELATIVE_RANGE_LOCALE;
localeData = _extends({}, localeData, localeData[format]);
var type = relativeTypeByCount(count);
var countKey = [measure, count].join('_');
var countTranslation = localeData[countKey];
if (countTranslation) {
return countTranslation.replace('%s', Math.abs(count));
}
var absCount = Math.abs(count);
var plural = absCount > 1;
var pluralKey = plural ? measure + '_plural' : measure;
var translation = localeData[pluralKey] || localeData[measure] || '';
var typePluralKey = plural ? type + '_plural' : type;
var typeTranslation = localeData[type + '_' + measure] || localeData[type + '_' + absCount] || localeData[typePluralKey] || localeData[type] || '';
return typeTranslation.replace('%d', translation.replace('%s', '' + absCount));
};
exports.formatStatic = formatStatic;
exports.formatRelative = formatRelative;