utils.cjs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. "use strict";
  2. exports.dayPeriodEnumToHours = dayPeriodEnumToHours;
  3. exports.isLeapYearIndex = isLeapYearIndex;
  4. exports.mapValue = mapValue;
  5. exports.normalizeTwoDigitYear = normalizeTwoDigitYear;
  6. exports.parseAnyDigitsSigned = parseAnyDigitsSigned;
  7. exports.parseNDigits = parseNDigits;
  8. exports.parseNDigitsSigned = parseNDigitsSigned;
  9. exports.parseNumericPattern = parseNumericPattern;
  10. exports.parseTimezonePattern = parseTimezonePattern;
  11. var _index = require("../../constants.cjs");
  12. var _constants = require("./constants.cjs");
  13. function mapValue(parseFnResult, mapFn) {
  14. if (!parseFnResult) {
  15. return parseFnResult;
  16. }
  17. return {
  18. value: mapFn(parseFnResult.value),
  19. rest: parseFnResult.rest,
  20. };
  21. }
  22. function parseNumericPattern(pattern, dateString) {
  23. const matchResult = dateString.match(pattern);
  24. if (!matchResult) {
  25. return null;
  26. }
  27. return {
  28. value: parseInt(matchResult[0], 10),
  29. rest: dateString.slice(matchResult[0].length),
  30. };
  31. }
  32. function parseTimezonePattern(pattern, dateString) {
  33. const matchResult = dateString.match(pattern);
  34. if (!matchResult) {
  35. return null;
  36. }
  37. // Input is 'Z'
  38. if (matchResult[0] === "Z") {
  39. return {
  40. value: 0,
  41. rest: dateString.slice(1),
  42. };
  43. }
  44. const sign = matchResult[1] === "+" ? 1 : -1;
  45. const hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0;
  46. const minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0;
  47. const seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0;
  48. return {
  49. value:
  50. sign *
  51. (hours * _index.millisecondsInHour +
  52. minutes * _index.millisecondsInMinute +
  53. seconds * _index.millisecondsInSecond),
  54. rest: dateString.slice(matchResult[0].length),
  55. };
  56. }
  57. function parseAnyDigitsSigned(dateString) {
  58. return parseNumericPattern(
  59. _constants.numericPatterns.anyDigitsSigned,
  60. dateString,
  61. );
  62. }
  63. function parseNDigits(n, dateString) {
  64. switch (n) {
  65. case 1:
  66. return parseNumericPattern(
  67. _constants.numericPatterns.singleDigit,
  68. dateString,
  69. );
  70. case 2:
  71. return parseNumericPattern(
  72. _constants.numericPatterns.twoDigits,
  73. dateString,
  74. );
  75. case 3:
  76. return parseNumericPattern(
  77. _constants.numericPatterns.threeDigits,
  78. dateString,
  79. );
  80. case 4:
  81. return parseNumericPattern(
  82. _constants.numericPatterns.fourDigits,
  83. dateString,
  84. );
  85. default:
  86. return parseNumericPattern(new RegExp("^\\d{1," + n + "}"), dateString);
  87. }
  88. }
  89. function parseNDigitsSigned(n, dateString) {
  90. switch (n) {
  91. case 1:
  92. return parseNumericPattern(
  93. _constants.numericPatterns.singleDigitSigned,
  94. dateString,
  95. );
  96. case 2:
  97. return parseNumericPattern(
  98. _constants.numericPatterns.twoDigitsSigned,
  99. dateString,
  100. );
  101. case 3:
  102. return parseNumericPattern(
  103. _constants.numericPatterns.threeDigitsSigned,
  104. dateString,
  105. );
  106. case 4:
  107. return parseNumericPattern(
  108. _constants.numericPatterns.fourDigitsSigned,
  109. dateString,
  110. );
  111. default:
  112. return parseNumericPattern(new RegExp("^-?\\d{1," + n + "}"), dateString);
  113. }
  114. }
  115. function dayPeriodEnumToHours(dayPeriod) {
  116. switch (dayPeriod) {
  117. case "morning":
  118. return 4;
  119. case "evening":
  120. return 17;
  121. case "pm":
  122. case "noon":
  123. case "afternoon":
  124. return 12;
  125. case "am":
  126. case "midnight":
  127. case "night":
  128. default:
  129. return 0;
  130. }
  131. }
  132. function normalizeTwoDigitYear(twoDigitYear, currentYear) {
  133. const isCommonEra = currentYear > 0;
  134. // Absolute number of the current year:
  135. // 1 -> 1 AC
  136. // 0 -> 1 BC
  137. // -1 -> 2 BC
  138. const absCurrentYear = isCommonEra ? currentYear : 1 - currentYear;
  139. let result;
  140. if (absCurrentYear <= 50) {
  141. result = twoDigitYear || 100;
  142. } else {
  143. const rangeEnd = absCurrentYear + 50;
  144. const rangeEndCentury = Math.trunc(rangeEnd / 100) * 100;
  145. const isPreviousCentury = twoDigitYear >= rangeEnd % 100;
  146. result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0);
  147. }
  148. return isCommonEra ? result : 1 - result;
  149. }
  150. function isLeapYearIndex(year) {
  151. return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);
  152. }