144 lines
6.3 KiB
JavaScript
144 lines
6.3 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = lightFormat;
|
|
|
|
var _index = _interopRequireDefault(require("../toDate/index.js"));
|
|
|
|
var _index2 = _interopRequireDefault(require("../_lib/format/lightFormatters/index.js"));
|
|
|
|
var _index3 = _interopRequireDefault(require("../_lib/getTimezoneOffsetInMilliseconds/index.js"));
|
|
|
|
var _index4 = _interopRequireDefault(require("../isValid/index.js"));
|
|
|
|
var _index5 = _interopRequireDefault(require("../subMilliseconds/index.js"));
|
|
|
|
var _index6 = _interopRequireDefault(require("../_lib/requiredArgs/index.js"));
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
|
|
// This RegExp consists of three parts separated by `|`:
|
|
// - (\w)\1* matches any sequences of the same letter
|
|
// - '' matches two quote characters in a row
|
|
// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),
|
|
// except a single quote symbol, which ends the sequence.
|
|
// Two quote characters do not end the sequence.
|
|
// If there is no matching single quote
|
|
// then the sequence will continue until the end of the string.
|
|
// - . matches any single character unmatched by previous parts of the RegExps
|
|
var formattingTokensRegExp = /(\w)\1*|''|'(''|[^'])+('|$)|./g;
|
|
var escapedStringRegExp = /^'([^]*?)'?$/;
|
|
var doubleQuoteRegExp = /''/g;
|
|
var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
|
|
/**
|
|
* @name lightFormat
|
|
* @category Common Helpers
|
|
* @summary Format the date.
|
|
*
|
|
* @description
|
|
* Return the formatted date string in the given format. Unlike `format`,
|
|
* `lightFormat` doesn't use locales and outputs date using the most popular tokens.
|
|
*
|
|
* > ⚠️ Please note that the `lightFormat` tokens differ from Moment.js and other libraries.
|
|
* > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
*
|
|
* The characters wrapped between two single quotes characters (') are escaped.
|
|
* Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.
|
|
*
|
|
* Format of the string is based on Unicode Technical Standard #35:
|
|
* https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table
|
|
*
|
|
* Accepted patterns:
|
|
* | Unit | Pattern | Result examples |
|
|
* |---------------------------------|---------|-----------------------------------|
|
|
* | AM, PM | a..aaa | AM, PM |
|
|
* | | aaaa | a.m., p.m. |
|
|
* | | aaaaa | a, p |
|
|
* | Calendar year | y | 44, 1, 1900, 2017 |
|
|
* | | yy | 44, 01, 00, 17 |
|
|
* | | yyy | 044, 001, 000, 017 |
|
|
* | | yyyy | 0044, 0001, 1900, 2017 |
|
|
* | Month (formatting) | M | 1, 2, ..., 12 |
|
|
* | | MM | 01, 02, ..., 12 |
|
|
* | Day of month | d | 1, 2, ..., 31 |
|
|
* | | dd | 01, 02, ..., 31 |
|
|
* | Hour [1-12] | h | 1, 2, ..., 11, 12 |
|
|
* | | hh | 01, 02, ..., 11, 12 |
|
|
* | Hour [0-23] | H | 0, 1, 2, ..., 23 |
|
|
* | | HH | 00, 01, 02, ..., 23 |
|
|
* | Minute | m | 0, 1, ..., 59 |
|
|
* | | mm | 00, 01, ..., 59 |
|
|
* | Second | s | 0, 1, ..., 59 |
|
|
* | | ss | 00, 01, ..., 59 |
|
|
* | Fraction of second | S | 0, 1, ..., 9 |
|
|
* | | SS | 00, 01, ..., 99 |
|
|
* | | SSS | 000, 001, ..., 999 |
|
|
* | | SSSS | ... |
|
|
*
|
|
* @param {Date|Number} date - the original date
|
|
* @param {String} format - the string of tokens
|
|
* @returns {String} the formatted date string
|
|
* @throws {TypeError} 2 arguments required
|
|
* @throws {RangeError} format string contains an unescaped latin alphabet character
|
|
*
|
|
* @example
|
|
* const result = lightFormat(new Date(2014, 1, 11), 'yyyy-MM-dd')
|
|
* //=> '2014-02-11'
|
|
*/
|
|
|
|
function lightFormat(dirtyDate, formatStr) {
|
|
(0, _index6.default)(2, arguments);
|
|
var originalDate = (0, _index.default)(dirtyDate);
|
|
|
|
if (!(0, _index4.default)(originalDate)) {
|
|
throw new RangeError('Invalid time value');
|
|
} // Convert the date in system timezone to the same date in UTC+00:00 timezone.
|
|
// This ensures that when UTC functions will be implemented, locales will be compatible with them.
|
|
// See an issue about UTC functions: https://github.com/date-fns/date-fns/issues/376
|
|
|
|
|
|
var timezoneOffset = (0, _index3.default)(originalDate);
|
|
var utcDate = (0, _index5.default)(originalDate, timezoneOffset);
|
|
var tokens = formatStr.match(formattingTokensRegExp); // The only case when formattingTokensRegExp doesn't match the string is when it's empty
|
|
|
|
if (!tokens) return '';
|
|
var result = tokens.map(function (substring) {
|
|
// Replace two single quote characters with one single quote character
|
|
if (substring === "''") {
|
|
return "'";
|
|
}
|
|
|
|
var firstCharacter = substring[0];
|
|
|
|
if (firstCharacter === "'") {
|
|
return cleanEscapedString(substring);
|
|
}
|
|
|
|
var formatter = _index2.default[firstCharacter];
|
|
|
|
if (formatter) {
|
|
return formatter(utcDate, substring);
|
|
}
|
|
|
|
if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
|
|
throw new RangeError('Format string contains an unescaped latin alphabet character `' + firstCharacter + '`');
|
|
}
|
|
|
|
return substring;
|
|
}).join('');
|
|
return result;
|
|
}
|
|
|
|
function cleanEscapedString(input) {
|
|
var matches = input.match(escapedStringRegExp);
|
|
|
|
if (!matches) {
|
|
return input;
|
|
}
|
|
|
|
return matches[1].replace(doubleQuoteRegExp, "'");
|
|
}
|
|
|
|
module.exports = exports.default; |