formatDuration.cjs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. "use strict";
  2. exports.formatDuration = formatDuration;
  3. var _index = require("./_lib/defaultLocale.cjs");
  4. var _index2 = require("./_lib/defaultOptions.cjs");
  5. /**
  6. * The {@link formatDuration} function options.
  7. */
  8. const defaultFormat = [
  9. "years",
  10. "months",
  11. "weeks",
  12. "days",
  13. "hours",
  14. "minutes",
  15. "seconds",
  16. ];
  17. /**
  18. * @name formatDuration
  19. * @category Common Helpers
  20. * @summary Formats a duration in human-readable format
  21. *
  22. * @description
  23. * Return human-readable duration string i.e. "9 months 2 days"
  24. *
  25. * @param duration - The duration to format
  26. * @param options - An object with options.
  27. *
  28. * @returns The formatted date string
  29. *
  30. * @example
  31. * // Format full duration
  32. * formatDuration({
  33. * years: 2,
  34. * months: 9,
  35. * weeks: 1,
  36. * days: 7,
  37. * hours: 5,
  38. * minutes: 9,
  39. * seconds: 30
  40. * })
  41. * //=> '2 years 9 months 1 week 7 days 5 hours 9 minutes 30 seconds'
  42. *
  43. * @example
  44. * // Format partial duration
  45. * formatDuration({ months: 9, days: 2 })
  46. * //=> '9 months 2 days'
  47. *
  48. * @example
  49. * // Customize the format
  50. * formatDuration(
  51. * {
  52. * years: 2,
  53. * months: 9,
  54. * weeks: 1,
  55. * days: 7,
  56. * hours: 5,
  57. * minutes: 9,
  58. * seconds: 30
  59. * },
  60. * { format: ['months', 'weeks'] }
  61. * ) === '9 months 1 week'
  62. *
  63. * @example
  64. * // Customize the zeros presence
  65. * formatDuration({ years: 0, months: 9 })
  66. * //=> '9 months'
  67. * formatDuration({ years: 0, months: 9 }, { zero: true })
  68. * //=> '0 years 9 months'
  69. *
  70. * @example
  71. * // Customize the delimiter
  72. * formatDuration({ years: 2, months: 9, weeks: 3 }, { delimiter: ', ' })
  73. * //=> '2 years, 9 months, 3 weeks'
  74. */
  75. function formatDuration(duration, options) {
  76. const defaultOptions = (0, _index2.getDefaultOptions)();
  77. const locale =
  78. options?.locale ?? defaultOptions.locale ?? _index.defaultLocale;
  79. const format = options?.format ?? defaultFormat;
  80. const zero = options?.zero ?? false;
  81. const delimiter = options?.delimiter ?? " ";
  82. if (!locale.formatDistance) {
  83. return "";
  84. }
  85. const result = format
  86. .reduce((acc, unit) => {
  87. const token = `x${unit.replace(/(^.)/, (m) => m.toUpperCase())}`;
  88. const value = duration[unit];
  89. if (value !== undefined && (zero || duration[unit])) {
  90. return acc.concat(locale.formatDistance(token, value));
  91. }
  92. return acc;
  93. }, [])
  94. .join(delimiter);
  95. return result;
  96. }