123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- "use strict";
- exports.lightFormat = lightFormat;
- Object.defineProperty(exports, "lightFormatters", {
- enumerable: true,
- get: function () {
- return _index.lightFormatters;
- },
- });
- var _index = require("./_lib/format/lightFormatters.cjs");
- var _index2 = require("./isValid.cjs");
- var _index3 = require("./toDate.cjs");
- // Rexports of internal for libraries to use.
- // See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874
- // 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
- const formattingTokensRegExp = /(\w)\1*|''|'(''|[^'])+('|$)|./g;
- const escapedStringRegExp = /^'([^]*?)'?$/;
- const doubleQuoteRegExp = /''/g;
- const unescapedLatinCharacterRegExp = /[a-zA-Z]/;
- /**
- * @private
- */
- /**
- * @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 - The original date
- * @param format - The string of tokens
- *
- * @returns The formatted date string
- *
- * @throws `Invalid time value` if the date is invalid
- * @throws 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(date, formatStr) {
- const date_ = (0, _index3.toDate)(date);
- if (!(0, _index2.isValid)(date_)) {
- throw new RangeError("Invalid time value");
- }
- const tokens = formatStr.match(formattingTokensRegExp);
- // The only case when formattingTokensRegExp doesn't match the string is when it's empty
- if (!tokens) return "";
- const result = tokens
- .map((substring) => {
- // Replace two single quote characters with one single quote character
- if (substring === "''") {
- return "'";
- }
- const firstCharacter = substring[0];
- if (firstCharacter === "'") {
- return cleanEscapedString(substring);
- }
- const formatter = _index.lightFormatters[firstCharacter];
- if (formatter) {
- return formatter(date_, 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) {
- const matches = input.match(escapedStringRegExp);
- if (!matches) return input;
- return matches[1].replace(doubleQuoteRegExp, "'");
- }
|