1&&void 0!==arguments[1]?arguments[1]:{},n=e.match(S.matchPattern);if(!n)return null;var a=n[0],r=e.match(S.parsePattern);if(!r)return null;var i=S.valueCallback?S.valueCallback(r[0]):r[0];i=t.valueCallback?t.valueCallback(i):i;var o=e.slice(a.length);return{value:i,rest:o}}),era:p({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:"any"}),quarter:p({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(e){return e+1}}),month:p({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:p({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:"any"}),dayPeriod:p({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:"any"})},T={code:"en-US",formatDistance:m,formatLong:g,formatRelative:w,localize:b,match:N,options:{weekStartsOn:0,firstWeekContainsDate:1}};function x(e){return function(e,t){if(null==e)throw new TypeError("assign requires that input parameter not be null or undefined");for(var n in t=t||{})Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}({},e)}function W(e){var t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()));return t.setUTCFullYear(e.getFullYear()),e.getTime()-t.getTime()}var P=1440,C=43200;function k(a,r){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};e(2,arguments);var o=i.locale||T;if(!o.formatDistance)throw new RangeError("locale must contain formatDistance property");var s=n(a,r);if(isNaN(s))throw new RangeError("Invalid time value");var d,l,f=x(i);f.addSuffix=Boolean(i.addSuffix),f.comparison=s,s>0?(d=t(r),l=t(a)):(d=t(a),l=t(r));var m,h=c(l,d),g=(W(l)-W(d))/1e3,v=Math.round((h-g)/60);if(v<2)return i.includeSeconds?h<5?o.formatDistance("lessThanXSeconds",5,f):h<10?o.formatDistance("lessThanXSeconds",10,f):h<20?o.formatDistance("lessThanXSeconds",20,f):h<40?o.formatDistance("halfAMinute",null,f):h<60?o.formatDistance("lessThanXMinutes",1,f):o.formatDistance("xMinutes",1,f):0===v?o.formatDistance("lessThanXMinutes",1,f):o.formatDistance("xMinutes",v,f);if(v<45)return o.formatDistance("xMinutes",v,f);if(v<90)return o.formatDistance("aboutXHours",1,f);if(v2&&void 0!==arguments[2]?arguments[2]:{};e(2,arguments);var o=i.locale||T;if(!o.formatDistance)throw new RangeError("locale must contain localize.formatDistance property");var u=n(a,r);if(isNaN(u))throw new RangeError("Invalid time value");var s,d,l=x(i);l.addSuffix=Boolean(i.addSuffix),l.comparison=u,u>0?(s=t(r),d=t(a)):(s=t(a),d=t(r));var c,f=null==i.roundingMethod?"round":String(i.roundingMethod);if("floor"===f)c=Math.floor;else if("ceil"===f)c=Math.ceil;else{if("round"!==f)throw new RangeError("roundingMethod must be 'floor', 'ceil' or 'round'");c=Math.round}var m,h=d.getTime()-s.getTime(),g=h/F,v=W(d)-W(s),w=(h-v)/F;if("second"===(m=null==i.unit?g<1?"second":g<60?"minute":g2)return n;if(/:/.test(a[0])?t=a[0]:(n.date=a[0],t=a[1],z.timeZoneDelimiter.test(n.date)&&(n.date=e.split(z.timeZoneDelimiter)[0],t=e.substr(n.date.length,e.length))),t){var r=z.timezone.exec(t);r?(n.time=t.replace(r[1],""),n.timezone=r[1]):n.time=t}return n}function Z(e,t){var n=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+t)+"})|(\\d{2}|[+-]\\d{"+(2+t)+"})$)"),a=e.match(n);if(!a)return{year:NaN,restDateString:""};var r=a[1]?parseInt(a[1]):null,i=a[2]?parseInt(a[2]):null;return{year:null===i?r:100*i,restDateString:e.slice((a[1]||a[2]).length)}}function B(e,t){if(null===t)return new Date(NaN);var n=e.match(q);if(!n)return new Date(NaN);var a=!!n[4],r=$(n[1]),i=$(n[2])-1,o=$(n[3]),u=$(n[4]),s=$(n[5])-1;if(a)return function(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}(0,u,s)?function(e,t,n){var a=new Date(0);a.setUTCFullYear(e,0,4);var r=a.getUTCDay()||7,i=7*(t-1)+n+1-r;return a.setUTCDate(a.getUTCDate()+i),a}(t,u,s):new Date(NaN);var d=new Date(0);return function(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(G[t]||(K(e)?29:28))}(t,i,o)&&function(e,t){return t>=1&&t<=(K(e)?366:365)}(t,r)?(d.setUTCFullYear(t,i,Math.max(r,o)),d):new Date(NaN)}function $(e){return e?parseInt(e):1}function Q(e){var t=e.match(H);if(!t)return NaN;var n=V(t[1]),a=V(t[2]),r=V(t[3]);return function(e,t,n){if(24===e)return 0===t&&0===n;return n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}(n,a,r)?n*U+6e4*a+1e3*r:NaN}function V(e){return e&&parseFloat(e.replace(",","."))||0}function L(e){if("Z"===e)return 0;var t=e.match(J);if(!t)return 0;var n="+"===t[1]?-1:1,a=parseInt(t[2]),r=t[3]&&parseInt(t[3])||0;return function(e,t){return t>=0&&t<=59}(0,r)?n*(a*U+6e4*r):NaN}var G=[31,null,31,30,31,30,31,31,30,31,30,31];function K(e){return e%400==0||e%4==0&&e%100!=0}function _(n){return e(1,arguments),t(n).getTime(){let u=r(n);const s=n=>{"string"==typeof n&&(n=function(t,n){e(1,arguments);var a=n||{},r=null==a.additionalDigits?2:O(a.additionalDigits);if(2!==r&&1!==r&&0!==r)throw new RangeError("additionalDigits must be 0, 1 or 2");if("string"!=typeof t&&"[object String]"!==Object.prototype.toString.call(t))return new Date(NaN);var i,o=R(t);if(o.date){var u=Z(o.date,r);i=B(u.restDateString,u.year)}if(!i||isNaN(i.getTime()))return new Date(NaN);var s,d=i.getTime(),l=0;if(o.time&&(l=Q(o.time),isNaN(l)))return new Date(NaN);if(!o.timezone){var c=new Date(d+l),f=new Date(0);return f.setFullYear(c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()),f.setHours(c.getUTCHours(),c.getUTCMinutes(),c.getUTCSeconds(),c.getUTCMilliseconds()),f}return s=L(o.timezone),isNaN(s)?new Date(NaN):new Date(d+l+s)}(n));try{if(a.includes("strict")){let e=a.includes("unit")&&a[a.findIndex((e=>"unit"===e))+1]||void 0;["second","minute","hour","day","month","year"].includes(e)||(e=void 0);let r=a.includes("rounding")&&a[a.findIndex((e=>"rounding"===e))+1]||void 0;["floor","ceil","round"].includes(r)||(r=void 0),t.textContent=A(n,{addSuffix:!a.includes("pure"),unit:e,roundingMethod:r,locale:ee})}else t.textContent=j(n,{addSuffix:!a.includes("pure"),includeSeconds:a.includes("seconds"),locale:ee});l(n)}catch(e){console.error(e)}};let d;const l=e=>{t.dispatchEvent(new CustomEvent("timeago:render",{detail:{isPast:_(e)},bubbles:!1}))},c=e=>{let t=3e4;a.includes("seconds")&&(t=5e3),d=setInterval((()=>{s(e)}),t)};new IntersectionObserver((e=>{const[t]=e,{isIntersecting:n}=t;n?u((e=>{d||(c(e),s(e))})):d&&(clearInterval(d),d=void 0)})).observe(t),i((()=>{u((e=>{d&&clearInterval(d),s(e),c(e)}))})),o((()=>clearInterval(d)))})),t.magic("timeago",(()=>(e,t,n,a)=>(null==t&&(t=!1),null==n&&(n=!1),null!=a&&a.strict?A(e,{addSuffix:!t,unit:a.unit||void 0,roundingMethod:a.roundingMethod||void 0,locale:ee}):j(e,{addSuffix:!t,includeSeconds:n,locale:ee}))))}te.configure=e=>(e.hasOwnProperty("locale")&&"object"==typeof e.locale&&e.locale.hasOwnProperty("formatDistance")&&(ee=e.locale),te),document.addEventListener("alpine:init",(()=>{te(window.Alpine)}))}));
2 | //# sourceMappingURL=alpine-timeago.min.js.map
3 |
--------------------------------------------------------------------------------
/dist/alpine-timeago.min.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"alpine-timeago.min.js","sources":["../node_modules/date-fns/esm/_lib/requiredArgs/index.js","../node_modules/date-fns/esm/toDate/index.js","../node_modules/date-fns/esm/compareAsc/index.js","../node_modules/date-fns/esm/differenceInCalendarMonths/index.js","../node_modules/date-fns/esm/endOfDay/index.js","../node_modules/date-fns/esm/endOfMonth/index.js","../node_modules/date-fns/esm/isLastDayOfMonth/index.js","../node_modules/date-fns/esm/differenceInMonths/index.js","../node_modules/date-fns/esm/differenceInMilliseconds/index.js","../node_modules/date-fns/esm/_lib/roundingMethods/index.js","../node_modules/date-fns/esm/differenceInSeconds/index.js","../node_modules/date-fns/esm/locale/en-US/_lib/formatDistance/index.js","../node_modules/date-fns/esm/locale/_lib/buildFormatLongFn/index.js","../node_modules/date-fns/esm/locale/en-US/_lib/formatLong/index.js","../node_modules/date-fns/esm/locale/en-US/_lib/formatRelative/index.js","../node_modules/date-fns/esm/locale/_lib/buildLocalizeFn/index.js","../node_modules/date-fns/esm/locale/en-US/_lib/localize/index.js","../node_modules/date-fns/esm/locale/_lib/buildMatchFn/index.js","../node_modules/date-fns/esm/locale/en-US/_lib/match/index.js","../node_modules/date-fns/esm/locale/_lib/buildMatchPatternFn/index.js","../node_modules/date-fns/esm/locale/en-US/index.js","../node_modules/date-fns/esm/_lib/cloneObject/index.js","../node_modules/date-fns/esm/_lib/assign/index.js","../node_modules/date-fns/esm/_lib/getTimezoneOffsetInMilliseconds/index.js","../node_modules/date-fns/esm/formatDistance/index.js","../node_modules/date-fns/esm/formatDistanceToNow/index.js","../node_modules/date-fns/esm/formatDistanceStrict/index.js","../node_modules/date-fns/esm/formatDistanceToNowStrict/index.js","../node_modules/date-fns/esm/constants/index.js","../node_modules/date-fns/esm/_lib/toInteger/index.js","../node_modules/date-fns/esm/parseISO/index.js","../node_modules/date-fns/esm/isPast/index.js","../src/index.js","../builds/cdn.js"],"sourcesContent":["export default function requiredArgs(required, args) {\n if (args.length < required) {\n throw new TypeError(required + ' argument' + (required > 1 ? 's' : '') + ' required, but only ' + args.length + ' present');\n }\n}","import requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @param {Date|Number} argument - the value to convert\n * @returns {Date} the parsed date in the local time zone\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\n\nexport default function toDate(argument) {\n requiredArgs(1, arguments);\n var argStr = Object.prototype.toString.call(argument); // Clone the date\n\n if (argument instanceof Date || typeof argument === 'object' && argStr === '[object Date]') {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new Date(argument.getTime());\n } else if (typeof argument === 'number' || argStr === '[object Number]') {\n return new Date(argument);\n } else {\n if ((typeof argument === 'string' || argStr === '[object String]') && typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\"Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule\"); // eslint-disable-next-line no-console\n\n console.warn(new Error().stack);\n }\n\n return new Date(NaN);\n }\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name compareAsc\n * @category Common Helpers\n * @summary Compare the two dates and return -1, 0 or 1.\n *\n * @description\n * Compare the two dates and return 1 if the first date is after the second,\n * -1 if the first date is before the second or 0 if dates are equal.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the first date to compare\n * @param {Date|Number} dateRight - the second date to compare\n * @returns {Number} the result of the comparison\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Compare 11 February 1987 and 10 July 1989:\n * const result = compareAsc(new Date(1987, 1, 11), new Date(1989, 6, 10))\n * //=> -1\n *\n * @example\n * // Sort the array of dates:\n * const result = [\n * new Date(1995, 6, 2),\n * new Date(1987, 1, 11),\n * new Date(1989, 6, 10)\n * ].sort(compareAsc)\n * //=> [\n * // Wed Feb 11 1987 00:00:00,\n * // Mon Jul 10 1989 00:00:00,\n * // Sun Jul 02 1995 00:00:00\n * // ]\n */\n\nexport default function compareAsc(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var dateLeft = toDate(dirtyDateLeft);\n var dateRight = toDate(dirtyDateRight);\n var diff = dateLeft.getTime() - dateRight.getTime();\n\n if (diff < 0) {\n return -1;\n } else if (diff > 0) {\n return 1; // Return 0 if diff is 0; return NaN if diff is NaN\n } else {\n return diff;\n }\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @returns {Number} the number of calendar months\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * var result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\n\nexport default function differenceInCalendarMonths(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var dateLeft = toDate(dirtyDateLeft);\n var dateRight = toDate(dirtyDateRight);\n var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear();\n var monthDiff = dateLeft.getMonth() - dateRight.getMonth();\n return yearDiff * 12 + monthDiff;\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the original date\n * @returns {Date} the end of a day\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\n\nexport default function endOfDay(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n date.setHours(23, 59, 59, 999);\n return date;\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the original date\n * @returns {Date} the end of a month\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\n\nexport default function endOfMonth(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var month = date.getMonth();\n date.setFullYear(date.getFullYear(), month + 1, 0);\n date.setHours(23, 59, 59, 999);\n return date;\n}","import toDate from \"../toDate/index.js\";\nimport endOfDay from \"../endOfDay/index.js\";\nimport endOfMonth from \"../endOfMonth/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name isLastDayOfMonth\n * @category Month Helpers\n * @summary Is the given date the last day of a month?\n *\n * @description\n * Is the given date the last day of a month?\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date to check\n * @returns {Boolean} the date is the last day of a month\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // Is 28 February 2014 the last day of a month?\n * var result = isLastDayOfMonth(new Date(2014, 1, 28))\n * //=> true\n */\n\nexport default function isLastDayOfMonth(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n return endOfDay(date).getTime() === endOfMonth(date).getTime();\n}","import toDate from \"../toDate/index.js\";\nimport differenceInCalendarMonths from \"../differenceInCalendarMonths/index.js\";\nimport compareAsc from \"../compareAsc/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport isLastDayOfMonth from \"../isLastDayOfMonth/index.js\";\n/**\n * @name differenceInMonths\n * @category Month Helpers\n * @summary Get the number of full months between the given dates.\n *\n * @description\n * Get the number of full months between the given dates using trunc as a default rounding method.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @returns {Number} the number of full months\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many full months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInMonths(new Date(2014, 8, 1), new Date(2014, 0, 31))\n * //=> 7\n */\n\nexport default function differenceInMonths(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var dateLeft = toDate(dirtyDateLeft);\n var dateRight = toDate(dirtyDateRight);\n var sign = compareAsc(dateLeft, dateRight);\n var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight));\n var result; // Check for the difference of less than month\n\n if (difference < 1) {\n result = 0;\n } else {\n if (dateLeft.getMonth() === 1 && dateLeft.getDate() > 27) {\n // This will check if the date is end of Feb and assign a higher end of month date\n // to compare it with Jan\n dateLeft.setDate(30);\n }\n\n dateLeft.setMonth(dateLeft.getMonth() - sign * difference); // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full\n // If so, result must be decreased by 1 in absolute value\n\n var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign; // Check for cases of one full calendar month\n\n if (isLastDayOfMonth(toDate(dirtyDateLeft)) && difference === 1 && compareAsc(dirtyDateLeft, dateRight) === 1) {\n isLastMonthNotFull = false;\n }\n\n result = sign * (difference - Number(isLastMonthNotFull));\n } // Prevent negative zero\n\n\n return result === 0 ? 0 : result;\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name differenceInMilliseconds\n * @category Millisecond Helpers\n * @summary Get the number of milliseconds between the given dates.\n *\n * @description\n * Get the number of milliseconds between the given dates.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @returns {Number} the number of milliseconds\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many milliseconds are between\n * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?\n * const result = differenceInMilliseconds(\n * new Date(2014, 6, 2, 12, 30, 21, 700),\n * new Date(2014, 6, 2, 12, 30, 20, 600)\n * )\n * //=> 1100\n */\n\nexport default function differenceInMilliseconds(dateLeft, dateRight) {\n requiredArgs(2, arguments);\n return toDate(dateLeft).getTime() - toDate(dateRight).getTime();\n}","var roundingMap = {\n ceil: Math.ceil,\n round: Math.round,\n floor: Math.floor,\n trunc: function (value) {\n return value < 0 ? Math.ceil(value) : Math.floor(value);\n } // Math.trunc is not supported by IE\n\n};\nvar defaultRoundingMethod = 'trunc';\nexport function getRoundingMethod(method) {\n return method ? roundingMap[method] : roundingMap[defaultRoundingMethod];\n}","import differenceInMilliseconds from \"../differenceInMilliseconds/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport { getRoundingMethod } from \"../_lib/roundingMethods/index.js\";\n/**\n * @name differenceInSeconds\n * @category Second Helpers\n * @summary Get the number of seconds between the given dates.\n *\n * @description\n * Get the number of seconds between the given dates.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @param {Object} [options] - an object with options.\n * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`)\n * @returns {Number} the number of seconds\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many seconds are between\n * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000?\n * const result = differenceInSeconds(\n * new Date(2014, 6, 2, 12, 30, 20, 0),\n * new Date(2014, 6, 2, 12, 30, 7, 999)\n * )\n * //=> 12\n */\n\nexport default function differenceInSeconds(dateLeft, dateRight, options) {\n requiredArgs(2, arguments);\n var diff = differenceInMilliseconds(dateLeft, dateRight) / 1000;\n return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff);\n}","var formatDistanceLocale = {\n lessThanXSeconds: {\n one: 'less than a second',\n other: 'less than {{count}} seconds'\n },\n xSeconds: {\n one: '1 second',\n other: '{{count}} seconds'\n },\n halfAMinute: 'half a minute',\n lessThanXMinutes: {\n one: 'less than a minute',\n other: 'less than {{count}} minutes'\n },\n xMinutes: {\n one: '1 minute',\n other: '{{count}} minutes'\n },\n aboutXHours: {\n one: 'about 1 hour',\n other: 'about {{count}} hours'\n },\n xHours: {\n one: '1 hour',\n other: '{{count}} hours'\n },\n xDays: {\n one: '1 day',\n other: '{{count}} days'\n },\n aboutXWeeks: {\n one: 'about 1 week',\n other: 'about {{count}} weeks'\n },\n xWeeks: {\n one: '1 week',\n other: '{{count}} weeks'\n },\n aboutXMonths: {\n one: 'about 1 month',\n other: 'about {{count}} months'\n },\n xMonths: {\n one: '1 month',\n other: '{{count}} months'\n },\n aboutXYears: {\n one: 'about 1 year',\n other: 'about {{count}} years'\n },\n xYears: {\n one: '1 year',\n other: '{{count}} years'\n },\n overXYears: {\n one: 'over 1 year',\n other: 'over {{count}} years'\n },\n almostXYears: {\n one: 'almost 1 year',\n other: 'almost {{count}} years'\n }\n};\n\nvar formatDistance = function (token, count, options) {\n var result;\n var tokenValue = formatDistanceLocale[token];\n\n if (typeof tokenValue === 'string') {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace('{{count}}', count.toString());\n }\n\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'in ' + result;\n } else {\n return result + ' ago';\n }\n }\n\n return result;\n};\n\nexport default formatDistance;","export default function buildFormatLongFn(args) {\n return function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // TODO: Remove String()\n var width = options.width ? String(options.width) : args.defaultWidth;\n var format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE, MMMM do, y',\n long: 'MMMM do, y',\n medium: 'MMM d, y',\n short: 'MM/dd/yyyy'\n};\nvar timeFormats = {\n full: 'h:mm:ss a zzzz',\n long: 'h:mm:ss a z',\n medium: 'h:mm:ss a',\n short: 'h:mm a'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","var formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: 'P'\n};\n\nvar formatRelative = function (token, _date, _baseDate, _options) {\n return formatRelativeLocale[token];\n};\n\nexport default formatRelative;","export default function buildLocalizeFn(args) {\n return function (dirtyIndex, dirtyOptions) {\n var options = dirtyOptions || {};\n var context = options.context ? String(options.context) : 'standalone';\n var valuesArray;\n\n if (context === 'formatting' && args.formattingValues) {\n var defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n var width = options.width ? String(options.width) : defaultWidth;\n valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n var _defaultWidth = args.defaultWidth;\n\n var _width = options.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[_width] || args.values[_defaultWidth];\n }\n\n var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex; // @ts-ignore: For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n\n return valuesArray[index];\n };\n}","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['B', 'A'],\n abbreviated: ['BC', 'AD'],\n wide: ['Before Christ', 'Anno Domini']\n};\nvar quarterValues = {\n narrow: ['1', '2', '3', '4'],\n abbreviated: ['Q1', 'Q2', 'Q3', 'Q4'],\n wide: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter']\n}; // Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\n\nvar monthValues = {\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n abbreviated: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n wide: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n};\nvar dayValues = {\n narrow: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n short: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n abbreviated: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n wide: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n};\nvar dayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mi',\n noon: 'n',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n }\n};\nvar formattingDayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mi',\n noon: 'n',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n }\n};\n\nvar ordinalNumber = function (dirtyNumber, _options) {\n var number = Number(dirtyNumber); // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n var rem100 = number % 100;\n\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + 'st';\n\n case 2:\n return number + 'nd';\n\n case 3:\n return number + 'rd';\n }\n }\n\n return number + 'th';\n};\n\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function (quarter) {\n return quarter - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide',\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: 'wide'\n })\n};\nexport default localize;","export default function buildMatchFn(args) {\n return function (string) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var width = options.width;\n var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];\n var matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n\n var matchedString = matchResult[0];\n var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];\n var key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, function (pattern) {\n return pattern.test(matchedString);\n }) : findKey(parsePatterns, function (pattern) {\n return pattern.test(matchedString);\n });\n var value;\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback ? options.valueCallback(value) : value;\n var rest = string.slice(matchedString.length);\n return {\n value: value,\n rest: rest\n };\n };\n}\n\nfunction findKey(object, predicate) {\n for (var key in object) {\n if (object.hasOwnProperty(key) && predicate(object[key])) {\n return key;\n }\n }\n\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (var key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n\n return undefined;\n}","import buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nimport buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i\n};\nvar parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i]\n};\nvar matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]\n};\nvar matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i\n};\nvar parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]\n};\nvar matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function (value) {\n return parseInt(value, 10);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function (index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'any',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","export default function buildMatchPatternFn(args) {\n return function (string) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n var matchedString = matchResult[0];\n var parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];\n value = options.valueCallback ? options.valueCallback(value) : value;\n var rest = string.slice(matchedString.length);\n return {\n value: value,\n rest: rest\n };\n };\n}","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n\n/**\n * @type {Locale}\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp]{@link https://github.com/kossnocorp}\n * @author Lesha Koss [@leshakoss]{@link https://github.com/leshakoss}\n */\nvar locale = {\n code: 'en-US',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0\n /* Sunday */\n ,\n firstWeekContainsDate: 1\n }\n};\nexport default locale;","import assign from \"../assign/index.js\";\nexport default function cloneObject(dirtyObject) {\n return assign({}, dirtyObject);\n}","export default function assign(target, dirtyObject) {\n if (target == null) {\n throw new TypeError('assign requires that input parameter not be null or undefined');\n }\n\n dirtyObject = dirtyObject || {};\n\n for (var property in dirtyObject) {\n if (Object.prototype.hasOwnProperty.call(dirtyObject, property)) {\n target[property] = dirtyObject[property];\n }\n }\n\n return target;\n}","/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport default function getTimezoneOffsetInMilliseconds(date) {\n var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));\n utcDate.setUTCFullYear(date.getFullYear());\n return date.getTime() - utcDate.getTime();\n}","import compareAsc from \"../compareAsc/index.js\";\nimport differenceInMonths from \"../differenceInMonths/index.js\";\nimport differenceInSeconds from \"../differenceInSeconds/index.js\";\nimport defaultLocale from \"../locale/en-US/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport cloneObject from \"../_lib/cloneObject/index.js\";\nimport getTimezoneOffsetInMilliseconds from \"../_lib/getTimezoneOffsetInMilliseconds/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nvar MINUTES_IN_DAY = 1440;\nvar MINUTES_IN_ALMOST_TWO_DAYS = 2520;\nvar MINUTES_IN_MONTH = 43200;\nvar MINUTES_IN_TWO_MONTHS = 86400;\n/**\n * @name formatDistance\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words.\n *\n * | Distance between dates | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance between dates | Result |\n * |------------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The function was renamed from `distanceInWords ` to `formatDistance`\n * to make its name consistent with `format` and `formatRelative`.\n *\n * - The order of arguments is swapped to make the function\n * consistent with `differenceIn...` functions.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWords(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 11, 32, 0),\n * { addSuffix: true }\n * ) //=> 'in about 1 hour'\n *\n * // v2.0.0 onward\n *\n * formatDistance(\n * new Date(1986, 3, 4, 11, 32, 0),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { addSuffix: true }\n * ) //=> 'in about 1 hour'\n * ```\n *\n * @param {Date|Number} date - the date\n * @param {Date|Number} baseDate - the date to compare with\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `baseDate` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * const result = formatDistance(new Date(2014, 6, 2), new Date(2015, 0, 1))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00, including seconds?\n * const result = formatDistance(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0),\n * { includeSeconds: true }\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * const result = formatDistance(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> 'about 1 year ago'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = formatDistance(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> 'pli ol 1 jaro'\n */\n\nexport default function formatDistance(dirtyDate, dirtyBaseDate) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n requiredArgs(2, arguments);\n var locale = options.locale || defaultLocale;\n\n if (!locale.formatDistance) {\n throw new RangeError('locale must contain formatDistance property');\n }\n\n var comparison = compareAsc(dirtyDate, dirtyBaseDate);\n\n if (isNaN(comparison)) {\n throw new RangeError('Invalid time value');\n }\n\n var localizeOptions = cloneObject(options);\n localizeOptions.addSuffix = Boolean(options.addSuffix);\n localizeOptions.comparison = comparison;\n var dateLeft;\n var dateRight;\n\n if (comparison > 0) {\n dateLeft = toDate(dirtyBaseDate);\n dateRight = toDate(dirtyDate);\n } else {\n dateLeft = toDate(dirtyDate);\n dateRight = toDate(dirtyBaseDate);\n }\n\n var seconds = differenceInSeconds(dateRight, dateLeft);\n var offsetInSeconds = (getTimezoneOffsetInMilliseconds(dateRight) - getTimezoneOffsetInMilliseconds(dateLeft)) / 1000;\n var minutes = Math.round((seconds - offsetInSeconds) / 60);\n var months; // 0 up to 2 mins\n\n if (minutes < 2) {\n if (options.includeSeconds) {\n if (seconds < 5) {\n return locale.formatDistance('lessThanXSeconds', 5, localizeOptions);\n } else if (seconds < 10) {\n return locale.formatDistance('lessThanXSeconds', 10, localizeOptions);\n } else if (seconds < 20) {\n return locale.formatDistance('lessThanXSeconds', 20, localizeOptions);\n } else if (seconds < 40) {\n return locale.formatDistance('halfAMinute', null, localizeOptions);\n } else if (seconds < 60) {\n return locale.formatDistance('lessThanXMinutes', 1, localizeOptions);\n } else {\n return locale.formatDistance('xMinutes', 1, localizeOptions);\n }\n } else {\n if (minutes === 0) {\n return locale.formatDistance('lessThanXMinutes', 1, localizeOptions);\n } else {\n return locale.formatDistance('xMinutes', minutes, localizeOptions);\n }\n } // 2 mins up to 0.75 hrs\n\n } else if (minutes < 45) {\n return locale.formatDistance('xMinutes', minutes, localizeOptions); // 0.75 hrs up to 1.5 hrs\n } else if (minutes < 90) {\n return locale.formatDistance('aboutXHours', 1, localizeOptions); // 1.5 hrs up to 24 hrs\n } else if (minutes < MINUTES_IN_DAY) {\n var hours = Math.round(minutes / 60);\n return locale.formatDistance('aboutXHours', hours, localizeOptions); // 1 day up to 1.75 days\n } else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) {\n return locale.formatDistance('xDays', 1, localizeOptions); // 1.75 days up to 30 days\n } else if (minutes < MINUTES_IN_MONTH) {\n var days = Math.round(minutes / MINUTES_IN_DAY);\n return locale.formatDistance('xDays', days, localizeOptions); // 1 month up to 2 months\n } else if (minutes < MINUTES_IN_TWO_MONTHS) {\n months = Math.round(minutes / MINUTES_IN_MONTH);\n return locale.formatDistance('aboutXMonths', months, localizeOptions);\n }\n\n months = differenceInMonths(dateRight, dateLeft); // 2 months up to 12 months\n\n if (months < 12) {\n var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH);\n return locale.formatDistance('xMonths', nearestMonth, localizeOptions); // 1 year up to max Date\n } else {\n var monthsSinceStartOfYear = months % 12;\n var years = Math.floor(months / 12); // N years up to 1 years 3 months\n\n if (monthsSinceStartOfYear < 3) {\n return locale.formatDistance('aboutXYears', years, localizeOptions); // N years 3 months up to N years 9 months\n } else if (monthsSinceStartOfYear < 9) {\n return locale.formatDistance('overXYears', years, localizeOptions); // N years 9 months up to N year 12 months\n } else {\n return locale.formatDistance('almostXYears', years + 1, localizeOptions);\n }\n }\n}","import distanceInWords from \"../formatDistance/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name formatDistanceToNow\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given date and now in words.\n *\n * | Distance to now | Result |\n * |-------------------------------------------------------------------|---------------------|\n * | 0 ... 30 secs | less than a minute |\n * | 30 secs ... 1 min 30 secs | 1 minute |\n * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes |\n * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour |\n * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours |\n * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day |\n * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days |\n * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month |\n * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months |\n * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months |\n * | 1 yr ... 1 yr 3 months | about 1 year |\n * | 1 yr 3 months ... 1 yr 9 month s | over 1 year |\n * | 1 yr 9 months ... 2 yrs | almost 2 years |\n * | N yrs ... N yrs 3 months | about N years |\n * | N yrs 3 months ... N yrs 9 months | over N years |\n * | N yrs 9 months ... N+1 yrs | almost N+1 years |\n *\n * With `options.includeSeconds == true`:\n * | Distance to now | Result |\n * |---------------------|----------------------|\n * | 0 secs ... 5 secs | less than 5 seconds |\n * | 5 secs ... 10 secs | less than 10 seconds |\n * | 10 secs ... 20 secs | less than 20 seconds |\n * | 20 secs ... 40 secs | half a minute |\n * | 40 secs ... 60 secs | less than a minute |\n * | 60 secs ... 90 secs | 1 minute |\n *\n * > ⚠️ Please note that this function is not present in the FP submodule as\n * > it uses `Date.now()` internally hence impure and can't be safely curried.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The function was renamed from `distanceInWordsToNow ` to `formatDistanceToNow`\n * to make its name consistent with `format` and `formatRelative`.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsToNow(new Date(2014, 6, 2), { addSuffix: true })\n * //=> 'in 6 months'\n *\n * // v2.0.0 onward\n *\n * formatDistanceToNow(new Date(2014, 6, 2), { addSuffix: true })\n * //=> 'in 6 months'\n * ```\n *\n * @param {Date|Number} date - the given date\n * @param {Object} [options] - the object with options\n * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed\n * @param {Boolean} [options.addSuffix=false] - result specifies if now is earlier or later than the passed date\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * var result = formatDistanceToNow(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * var result = formatDistanceToNow(\n * new Date(2015, 0, 1, 0, 0, 15),\n * {includeSeconds: true}\n * )\n * //=> 'less than 20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * var result = formatDistanceToNow(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in about 1 year'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = formatDistanceToNow(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> 'pli ol 1 jaro'\n */\n\nexport default function formatDistanceToNow(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n return distanceInWords(dirtyDate, Date.now(), dirtyOptions);\n}","import getTimezoneOffsetInMilliseconds from \"../_lib/getTimezoneOffsetInMilliseconds/index.js\";\nimport compareAsc from \"../compareAsc/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport cloneObject from \"../_lib/cloneObject/index.js\";\nimport defaultLocale from \"../locale/en-US/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nvar MILLISECONDS_IN_MINUTE = 1000 * 60;\nvar MINUTES_IN_DAY = 60 * 24;\nvar MINUTES_IN_MONTH = MINUTES_IN_DAY * 30;\nvar MINUTES_IN_YEAR = MINUTES_IN_DAY * 365;\n/**\n * @name formatDistanceStrict\n * @category Common Helpers\n * @summary Return the distance between the given dates in words.\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The function was renamed from `distanceInWordsStrict` to `formatDistanceStrict`\n * to make its name consistent with `format` and `formatRelative`.\n *\n * - The order of arguments is swapped to make the function\n * consistent with `differenceIn...` functions.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(2015, 0, 2),\n * new Date(2014, 6, 2)\n * ) //=> '6 months'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(2014, 6, 2),\n * new Date(2015, 0, 2)\n * ) //=> '6 months'\n * ```\n *\n * - `partialMethod` option is renamed to `roundingMethod`.\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { partialMethod: 'ceil' }\n * ) //=> '2 minutes'\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { roundingMethod: 'ceil' }\n * ) //=> '2 minutes'\n * ```\n *\n * - If `roundingMethod` is not specified, it now defaults to `round` instead of `floor`.\n *\n * - `unit` option now accepts one of the strings:\n * 'second', 'minute', 'hour', 'day', 'month' or 'year' instead of 's', 'm', 'h', 'd', 'M' or 'Y'\n *\n * ```javascript\n * // Before v2.0.0\n *\n * distanceInWordsStrict(\n * new Date(1986, 3, 4, 10, 32, 0),\n * new Date(1986, 3, 4, 10, 33, 1),\n * { unit: 'm' }\n * )\n *\n * // v2.0.0 onward\n *\n * formatDistanceStrict(\n * new Date(1986, 3, 4, 10, 33, 1),\n * new Date(1986, 3, 4, 10, 32, 0),\n * { unit: 'minute' }\n * )\n * ```\n *\n * @param {Date|Number} date - the date\n * @param {Date|Number} baseDate - the date to compare with\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `baseDate` must not be Invalid Date\n * @throws {RangeError} `options.roundingMethod` must be 'floor', 'ceil' or 'round'\n * @throws {RangeError} `options.unit` must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // What is the distance between 2 July 2014 and 1 January 2015?\n * const result = formatDistanceStrict(new Date(2014, 6, 2), new Date(2015, 0, 2))\n * //=> '6 months'\n *\n * @example\n * // What is the distance between 1 January 2015 00:00:15\n * // and 1 January 2015 00:00:00?\n * const result = formatDistanceStrict(\n * new Date(2015, 0, 1, 0, 0, 15),\n * new Date(2015, 0, 1, 0, 0, 0)\n * )\n * //=> '15 seconds'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, with a suffix?\n * const result = formatDistanceStrict(new Date(2015, 0, 1), new Date(2016, 0, 1), {\n * addSuffix: true\n * })\n * //=> '1 year ago'\n *\n * @example\n * // What is the distance from 1 January 2016\n * // to 1 January 2015, in minutes?\n * const result = formatDistanceStrict(new Date(2016, 0, 1), new Date(2015, 0, 1), {\n * unit: 'minute'\n * })\n * //=> '525600 minutes'\n *\n * @example\n * // What is the distance from 1 January 2015\n * // to 28 January 2015, in months, rounded up?\n * const result = formatDistanceStrict(new Date(2015, 0, 28), new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto?\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = formatDistanceStrict(new Date(2016, 7, 1), new Date(2015, 0, 1), {\n * locale: eoLocale\n * })\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceStrict(dirtyDate, dirtyBaseDate) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n requiredArgs(2, arguments);\n var locale = options.locale || defaultLocale;\n\n if (!locale.formatDistance) {\n throw new RangeError('locale must contain localize.formatDistance property');\n }\n\n var comparison = compareAsc(dirtyDate, dirtyBaseDate);\n\n if (isNaN(comparison)) {\n throw new RangeError('Invalid time value');\n }\n\n var localizeOptions = cloneObject(options);\n localizeOptions.addSuffix = Boolean(options.addSuffix);\n localizeOptions.comparison = comparison;\n var dateLeft;\n var dateRight;\n\n if (comparison > 0) {\n dateLeft = toDate(dirtyBaseDate);\n dateRight = toDate(dirtyDate);\n } else {\n dateLeft = toDate(dirtyDate);\n dateRight = toDate(dirtyBaseDate);\n }\n\n var roundingMethod = options.roundingMethod == null ? 'round' : String(options.roundingMethod);\n var roundingMethodFn;\n\n if (roundingMethod === 'floor') {\n roundingMethodFn = Math.floor;\n } else if (roundingMethod === 'ceil') {\n roundingMethodFn = Math.ceil;\n } else if (roundingMethod === 'round') {\n roundingMethodFn = Math.round;\n } else {\n throw new RangeError(\"roundingMethod must be 'floor', 'ceil' or 'round'\");\n }\n\n var milliseconds = dateRight.getTime() - dateLeft.getTime();\n var minutes = milliseconds / MILLISECONDS_IN_MINUTE;\n var timezoneOffset = getTimezoneOffsetInMilliseconds(dateRight) - getTimezoneOffsetInMilliseconds(dateLeft); // Use DST-normalized difference in minutes for years, months and days;\n // use regular difference in minutes for hours, minutes and seconds.\n\n var dstNormalizedMinutes = (milliseconds - timezoneOffset) / MILLISECONDS_IN_MINUTE;\n var unit;\n\n if (options.unit == null) {\n if (minutes < 1) {\n unit = 'second';\n } else if (minutes < 60) {\n unit = 'minute';\n } else if (minutes < MINUTES_IN_DAY) {\n unit = 'hour';\n } else if (dstNormalizedMinutes < MINUTES_IN_MONTH) {\n unit = 'day';\n } else if (dstNormalizedMinutes < MINUTES_IN_YEAR) {\n unit = 'month';\n } else {\n unit = 'year';\n }\n } else {\n unit = String(options.unit);\n } // 0 up to 60 seconds\n\n\n if (unit === 'second') {\n var seconds = roundingMethodFn(milliseconds / 1000);\n return locale.formatDistance('xSeconds', seconds, localizeOptions); // 1 up to 60 mins\n } else if (unit === 'minute') {\n var roundedMinutes = roundingMethodFn(minutes);\n return locale.formatDistance('xMinutes', roundedMinutes, localizeOptions); // 1 up to 24 hours\n } else if (unit === 'hour') {\n var hours = roundingMethodFn(minutes / 60);\n return locale.formatDistance('xHours', hours, localizeOptions); // 1 up to 30 days\n } else if (unit === 'day') {\n var days = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_DAY);\n return locale.formatDistance('xDays', days, localizeOptions); // 1 up to 12 months\n } else if (unit === 'month') {\n var months = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_MONTH);\n return months === 12 && options.unit !== 'month' ? locale.formatDistance('xYears', 1, localizeOptions) : locale.formatDistance('xMonths', months, localizeOptions); // 1 year up to max Date\n } else if (unit === 'year') {\n var years = roundingMethodFn(dstNormalizedMinutes / MINUTES_IN_YEAR);\n return locale.formatDistance('xYears', years, localizeOptions);\n }\n\n throw new RangeError(\"unit must be 'second', 'minute', 'hour', 'day', 'month' or 'year'\");\n}","import formatDistanceStrict from \"../formatDistanceStrict/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name formatDistanceToNowStrict\n * @category Common Helpers\n * @summary Return the distance between the given date and now in words.\n * @pure false\n *\n * @description\n * Return the distance between the given dates in words, using strict units.\n * This is like `formatDistance`, but does not use helpers like 'almost', 'over',\n * 'less than' and the like.\n *\n * | Distance between dates | Result |\n * |------------------------|---------------------|\n * | 0 ... 59 secs | [0..59] seconds |\n * | 1 ... 59 mins | [1..59] minutes |\n * | 1 ... 23 hrs | [1..23] hours |\n * | 1 ... 29 days | [1..29] days |\n * | 1 ... 11 months | [1..11] months |\n * | 1 ... N years | [1..N] years |\n *\n * @param {Date|Number} date - the given date\n * @param {Object} [options] - an object with options.\n * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first\n * @param {'second'|'minute'|'hour'|'day'|'month'|'year'} [options.unit] - if specified, will force a unit\n * @param {'floor'|'ceil'|'round'} [options.roundingMethod='round'] - which way to round partial units\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @returns {String} the distance in words\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `formatDistance` property\n *\n * @example\n * // If today is 1 January 2015, what is the distance to 2 July 2014?\n * var result = formatDistanceToNowStrict(\n * new Date(2014, 6, 2)\n * )\n * //=> '6 months'\n *\n * @example\n * // If now is 1 January 2015 00:00:00,\n * // what is the distance to 1 January 2015 00:00:15, including seconds?\n * var result = formatDistanceToNowStrict(\n * new Date(2015, 0, 1, 0, 0, 15)\n * )\n * //=> '20 seconds'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 January 2016, with a suffix?\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 0, 1),\n * {addSuffix: true}\n * )\n * //=> 'in 1 year'\n *\n * @example\n * // If today is 28 January 2015,\n * // what is the distance to 1 January 2015, in months, rounded up??\n * var result = formatDistanceToNowStrict(new Date(2015, 0, 1), {\n * unit: 'month',\n * roundingMethod: 'ceil'\n * })\n * //=> '1 month'\n *\n * @example\n * // If today is 1 January 2015,\n * // what is the distance to 1 August 2016 in Esperanto?\n * var eoLocale = require('date-fns/locale/eo')\n * var result = formatDistanceToNowStrict(\n * new Date(2016, 7, 1),\n * {locale: eoLocale}\n * )\n * //=> '1 jaro'\n */\n\nexport default function formatDistanceToNowStrict(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n return formatDistanceStrict(dirtyDate, Date.now(), dirtyOptions);\n}","/**\n * Days in 1 week.\n *\n * @name daysInWeek\n * @constant\n * @type {number}\n * @default\n */\nexport var daysInWeek = 7;\n/**\n * Maximum allowed time.\n *\n * @name maxTime\n * @constant\n * @type {number}\n * @default\n */\n\nexport var maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n/**\n * Milliseconds in 1 minute\n *\n * @name millisecondsInMinute\n * @constant\n * @type {number}\n * @default\n */\n\nexport var millisecondsInMinute = 60000;\n/**\n * Milliseconds in 1 hour\n *\n * @name millisecondsInHour\n * @constant\n * @type {number}\n * @default\n */\n\nexport var millisecondsInHour = 3600000;\n/**\n * Milliseconds in 1 second\n *\n * @name millisecondsInSecond\n * @constant\n * @type {number}\n * @default\n */\n\nexport var millisecondsInSecond = 1000;\n/**\n * Minimum allowed time.\n *\n * @name minTime\n * @constant\n * @type {number}\n * @default\n */\n\nexport var minTime = -maxTime;\n/**\n * Minutes in 1 hour\n *\n * @name minutesInHour\n * @constant\n * @type {number}\n * @default\n */\n\nexport var minutesInHour = 60;\n/**\n * Months in 1 quarter\n *\n * @name monthsInQuarter\n * @constant\n * @type {number}\n * @default\n */\n\nexport var monthsInQuarter = 3;\n/**\n * Months in 1 year\n *\n * @name monthsInYear\n * @constant\n * @type {number}\n * @default\n */\n\nexport var monthsInYear = 12;\n/**\n * Quarters in 1 year\n *\n * @name quartersInYear\n * @constant\n * @type {number}\n * @default\n */\n\nexport var quartersInYear = 4;\n/**\n * Seconds in 1 hour\n *\n * @name secondsInHour\n * @constant\n * @type {number}\n * @default\n */\n\nexport var secondsInHour = 3600;\n/**\n * Seconds in 1 minute\n *\n * @name secondsInMinute\n * @constant\n * @type {number}\n * @default\n */\n\nexport var secondsInMinute = 60;","export default function toInteger(dirtyNumber) {\n if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) {\n return NaN;\n }\n\n var number = Number(dirtyNumber);\n\n if (isNaN(number)) {\n return number;\n }\n\n return number < 0 ? Math.ceil(number) : Math.floor(number);\n}","import { millisecondsInHour, millisecondsInMinute } from \"../constants/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The previous `parse` implementation was renamed to `parseISO`.\n *\n * ```javascript\n * // Before v2.0.0\n * parse('2016-01-01')\n *\n * // v2.0.0 onward\n * parseISO('2016-01-01')\n * ```\n *\n * - `parseISO` now validates separate date and time values in ISO-8601 strings\n * and returns `Invalid Date` if the date is invalid.\n *\n * ```javascript\n * parseISO('2018-13-32')\n * //=> Invalid Date\n * ```\n *\n * - `parseISO` now doesn't fall back to `new Date` constructor\n * if it fails to parse a string argument. Instead, it returns `Invalid Date`.\n *\n * @param {String} argument - the value to convert\n * @param {Object} [options] - an object with options.\n * @param {0|1|2} [options.additionalDigits=2] - the additional number of digits in the extended year format\n * @returns {Date} the parsed date in the local time zone\n * @throws {TypeError} 1 argument required\n * @throws {RangeError} `options.additionalDigits` must be 0, 1 or 2\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\n\nexport default function parseISO(argument, dirtyOptions) {\n requiredArgs(1, arguments);\n var options = dirtyOptions || {};\n var additionalDigits = options.additionalDigits == null ? 2 : toInteger(options.additionalDigits);\n\n if (additionalDigits !== 2 && additionalDigits !== 1 && additionalDigits !== 0) {\n throw new RangeError('additionalDigits must be 0, 1 or 2');\n }\n\n if (!(typeof argument === 'string' || Object.prototype.toString.call(argument) === '[object String]')) {\n return new Date(NaN);\n }\n\n var dateStrings = splitDateString(argument);\n var date;\n\n if (dateStrings.date) {\n var parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n\n if (!date || isNaN(date.getTime())) {\n return new Date(NaN);\n }\n\n var timestamp = date.getTime();\n var time = 0;\n var offset;\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n\n if (isNaN(time)) {\n return new Date(NaN);\n }\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n\n if (isNaN(offset)) {\n return new Date(NaN);\n }\n } else {\n var dirtyDate = new Date(timestamp + time); // js parsed string assuming it's in UTC timezone\n // but we need it to be parsed in our timezone\n // so we use utc values to build date in our timezone.\n // Year values from 0 to 99 map to the years 1900 to 1999\n // so set year explicitly with setFullYear.\n\n var result = new Date(0);\n result.setFullYear(dirtyDate.getUTCFullYear(), dirtyDate.getUTCMonth(), dirtyDate.getUTCDate());\n result.setHours(dirtyDate.getUTCHours(), dirtyDate.getUTCMinutes(), dirtyDate.getUTCSeconds(), dirtyDate.getUTCMilliseconds());\n return result;\n }\n\n return new Date(timestamp + time + offset);\n}\nvar patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/\n};\nvar dateRegex = /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nvar timeRegex = /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nvar timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n var dateStrings = {};\n var array = dateString.split(patterns.dateTimeDelimiter);\n var timeString; // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n\n if (array.length > 2) {\n return dateStrings;\n }\n\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(dateStrings.date.length, dateString.length);\n }\n }\n\n if (timeString) {\n var token = patterns.timezone.exec(timeString);\n\n if (token) {\n dateStrings.time = timeString.replace(token[1], '');\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n\n return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n var regex = new RegExp('^(?:(\\\\d{4}|[+-]\\\\d{' + (4 + additionalDigits) + '})|(\\\\d{2}|[+-]\\\\d{' + (2 + additionalDigits) + '})$)');\n var captures = dateString.match(regex); // Invalid ISO-formatted year\n\n if (!captures) return {\n year: NaN,\n restDateString: ''\n };\n var year = captures[1] ? parseInt(captures[1]) : null;\n var century = captures[2] ? parseInt(captures[2]) : null; // either year or century is null, not both\n\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length)\n };\n}\n\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n var captures = dateString.match(dateRegex); // Invalid ISO-formatted string\n\n if (!captures) return new Date(NaN);\n var isWeekDate = !!captures[4];\n var dayOfYear = parseDateUnit(captures[1]);\n var month = parseDateUnit(captures[2]) - 1;\n var day = parseDateUnit(captures[3]);\n var week = parseDateUnit(captures[4]);\n var dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n var date = new Date(0);\n\n if (!validateDate(year, month, day) || !validateDayOfYearDate(year, dayOfYear)) {\n return new Date(NaN);\n }\n\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\n\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n var captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n var hours = parseTimeUnit(captures[1]);\n var minutes = parseTimeUnit(captures[2]);\n var seconds = parseTimeUnit(captures[3]);\n\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n\n return hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000;\n}\n\nfunction parseTimeUnit(value) {\n return value && parseFloat(value.replace(',', '.')) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n if (timezoneString === 'Z') return 0;\n var captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n var sign = captures[1] === '+' ? -1 : 1;\n var hours = parseInt(captures[2]);\n var minutes = captures[3] && parseInt(captures[3]) || 0;\n\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n var date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n var fourthOfJanuaryDay = date.getUTCDay() || 7;\n var diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n} // Validation functions\n// February is null to handle the leap year (using ||)\n\n\nvar daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0;\n}\n\nfunction validateDate(year, month, date) {\n return month >= 0 && month <= 11 && date >= 1 && date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28));\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n\n return seconds >= 0 && seconds < 60 && minutes >= 0 && minutes < 60 && hours >= 0 && hours < 25;\n}\n\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name isPast\n * @category Common Helpers\n * @summary Is the given date in the past?\n * @pure false\n *\n * @description\n * Is the given date in the past?\n *\n * > ⚠️ Please note that this function is not present in the FP submodule as\n * > it uses `Date.now()` internally hence impure and can't be safely curried.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date to check\n * @returns {Boolean} the date is in the past\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // If today is 6 October 2014, is 2 July 2014 in the past?\n * var result = isPast(new Date(2014, 6, 2))\n * //=> true\n */\n\nexport default function isPast(dirtyDate) {\n requiredArgs(1, arguments);\n return toDate(dirtyDate).getTime() < Date.now();\n}","import formatDistanceToNow from \"date-fns/formatDistanceToNow\";\nimport formatDistanceToNowStrict from \"date-fns/formatDistanceToNowStrict\";\nimport parseISO from \"date-fns/parseISO\";\nimport isPast from \"date-fns/isPast\";\n\nlet locale = null;\n\nfunction TimeAgo(Alpine) {\n Alpine.directive(\n \"timeago\",\n (el, { expression, modifiers }, { evaluateLater, effect, cleanup }) => {\n let evaluateDate = evaluateLater(expression);\n\n const render = (date) => {\n if (typeof date === \"string\") {\n date = parseISO(date);\n }\n\n try {\n if (modifiers.includes(\"strict\")) {\n let unit = modifiers.includes(\"unit\")\n ? modifiers[\n modifiers.findIndex((modifier) => modifier === \"unit\") + 1\n ] || undefined\n : undefined;\n if (\n ![\"second\", \"minute\", \"hour\", \"day\", \"month\", \"year\"].includes(\n unit\n )\n ) {\n unit = undefined;\n }\n let roundingMethod = modifiers.includes(\"rounding\")\n ? modifiers[\n modifiers.findIndex((modifier) => modifier === \"rounding\") + 1\n ] || undefined\n : undefined;\n if (![\"floor\", \"ceil\", \"round\"].includes(roundingMethod)) {\n roundingMethod = undefined;\n }\n el.textContent = formatDistanceToNowStrict(date, {\n addSuffix: !modifiers.includes(\"pure\"),\n unit,\n roundingMethod,\n locale,\n });\n } else {\n el.textContent = formatDistanceToNow(date, {\n addSuffix: !modifiers.includes(\"pure\"),\n includeSeconds: modifiers.includes(\"seconds\"),\n locale,\n });\n }\n\n dispatch(date);\n } catch (e) {\n console.error(e);\n }\n };\n\n let interval;\n\n const dispatch = (date) => {\n el.dispatchEvent(new CustomEvent(\"timeago:render\", { detail: { isPast: isPast(date) }, bubbles: false }));\n };\n\n const setupInterval = (date) => {\n let intervalDuration = 30000;\n if (modifiers.includes(\"seconds\")) {\n intervalDuration = 5000;\n }\n\n interval = setInterval(() => {\n render(date);\n }, intervalDuration);\n };\n\n const intersectionObserver = new IntersectionObserver((entries) => {\n const [entry] = entries;\n const {isIntersecting} = entry;\n if (isIntersecting) {\n evaluateDate((date) => {\n if (!interval) {\n setupInterval(date);\n render(date);\n }\n });\n } else {\n if (interval) {\n clearInterval(interval);\n interval = undefined;\n }\n }\n });\n\n intersectionObserver.observe(el);\n\n effect(() => {\n evaluateDate((date) => {\n if (interval) {\n clearInterval(interval);\n }\n\n render(date);\n\n setupInterval(date);\n });\n });\n\n cleanup(() => clearInterval(interval));\n }\n );\n\n Alpine.magic(\"timeago\", () => (expression, pure, seconds, strictOptions) => {\n if (pure == null) {\n pure = false;\n }\n if (seconds == null) {\n seconds = false;\n }\n if (strictOptions != null && (strictOptions[\"strict\"] || undefined)) {\n return formatDistanceToNowStrict(expression, {\n addSuffix: !pure,\n unit: strictOptions[\"unit\"] || undefined,\n roundingMethod: strictOptions[\"roundingMethod\"] || undefined,\n locale,\n });\n }\n return formatDistanceToNow(expression, {\n addSuffix: !pure,\n includeSeconds: seconds,\n locale,\n });\n });\n}\n\nTimeAgo.configure = (config) => {\n if (config.hasOwnProperty(\"locale\") && typeof config.locale === \"object\") {\n if (config.locale.hasOwnProperty(\"formatDistance\")) {\n locale = config.locale;\n }\n }\n\n return TimeAgo;\n};\n\nexport default TimeAgo;\n","import TimeAgo from '../src/index.js';\n\ndocument.addEventListener('alpine:init', () => {\n TimeAgo(window.Alpine);\n});\n"],"names":["requiredArgs","required","args","length","TypeError","toDate","argument","arguments","argStr","Object","prototype","toString","call","Date","getTime","console","warn","Error","stack","NaN","compareAsc","dirtyDateLeft","dirtyDateRight","dateLeft","dateRight","diff","differenceInCalendarMonths","yearDiff","getFullYear","monthDiff","getMonth","endOfDay","dirtyDate","date","setHours","endOfMonth","month","setFullYear","isLastDayOfMonth","differenceInMonths","result","sign","difference","Math","abs","getDate","setDate","setMonth","isLastMonthNotFull","Number","differenceInMilliseconds","roundingMap","ceil","round","floor","trunc","value","getRoundingMethod","method","differenceInSeconds","options","roundingMethod","formatDistanceLocale","lessThanXSeconds","one","other","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","formatDistance$2","token","count","tokenValue","replace","addSuffix","comparison","buildFormatLongFn","undefined","width","String","defaultWidth","format","formats","formatLong$1","full","long","medium","short","time","dateTime","formatRelativeLocale","lastWeek","yesterday","today","tomorrow","nextWeek","formatRelative$1","_date","_baseDate","_options","buildLocalizeFn","dirtyIndex","dirtyOptions","valuesArray","context","formattingValues","defaultFormattingWidth","_defaultWidth","_width","values","argumentCallback","localize$1","ordinalNumber","dirtyNumber","number","rem100","era","narrow","abbreviated","wide","quarter","day","dayPeriod","am","pm","midnight","noon","morning","afternoon","evening","night","buildMatchFn","string","matchPattern","matchPatterns","defaultMatchWidth","matchResult","match","matchedString","parsePatterns","defaultParseWidth","key","Array","isArray","findIndex","pattern","test","findKey","valueCallback","rest","slice","object","predicate","hasOwnProperty","array","parsePattern","parseInt","parseResult","any","index","defaultLocale","code","formatDistance","formatLong","formatRelative","localize","weekStartsOn","firstWeekContainsDate","cloneObject","dirtyObject","target","property","assign","getTimezoneOffsetInMilliseconds","utcDate","UTC","getHours","getMinutes","getSeconds","getMilliseconds","setUTCFullYear","MINUTES_IN_DAY","MINUTES_IN_MONTH","dirtyBaseDate","locale","RangeError","isNaN","localizeOptions","Boolean","months","seconds","offsetInSeconds","minutes","includeSeconds","hours","days","nearestMonth","monthsSinceStartOfYear","years","formatDistanceToNow","distanceInWords","now","MILLISECONDS_IN_MINUTE","MINUTES_IN_YEAR","formatDistanceStrict","roundingMethodFn","unit","milliseconds","timezoneOffset","dstNormalizedMinutes","roundedMinutes","formatDistanceToNowStrict","millisecondsInHour","toInteger","patterns","dateTimeDelimiter","timeZoneDelimiter","timezone","dateRegex","timeRegex","timezoneRegex","splitDateString","dateString","timeString","dateStrings","split","substr","exec","parseYear","additionalDigits","regex","RegExp","captures","year","restDateString","century","parseDate","isWeekDate","dayOfYear","parseDateUnit","week","dayOfWeek","_year","validateWeekDate","isoWeekYear","fourthOfJanuaryDay","getUTCDay","setUTCDate","getUTCDate","dayOfISOWeekYear","daysInMonths","isLeapYearIndex","validateDate","validateDayOfYearDate","max","parseTime","parseTimeUnit","validateTime","parseFloat","parseTimezone","timezoneString","_hours","validateTimezone","isPast","TimeAgo","Alpine","directive","el","expression","modifiers","evaluateLater","effect","cleanup","evaluateDate","render","parseYearResult","offset","timestamp","getUTCFullYear","getUTCMonth","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","parseISO","includes","modifier","textContent","dispatch","e","error","interval","dispatchEvent","CustomEvent","detail","bubbles","setupInterval","intervalDuration","setInterval","IntersectionObserver","entries","entry","isIntersecting","clearInterval","observe","magic","pure","strictOptions","configure","config","document","addEventListener","window"],"mappings":"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"}
--------------------------------------------------------------------------------
/examples/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | Alpine Timeago Examples
9 |
10 |
11 |
12 |
13 |
14 | Default
15 |
16 | Pure
17 |
18 | With seconds
19 |
20 | With pure seconds
21 |
22 | Strict
23 |
24 | Strict unit (seconds)
25 |
26 | Strict unit (minutes)
27 |
28 | Strict unit (hours)
29 |
30 | Strict unit (days)
31 |
32 | Strict unit (months)
33 |
34 | Strict unit (years)
35 |
36 | Strict roundingMethod (floor)
37 |
38 | Strict roundingMethod (ceil)
39 |
40 | Strict roundingMethod (round)
41 |
42 | Magic
43 |
44 | Magic (pure)
45 |
46 | Magic (seconds)
47 |
48 | Magic (pure seconds)
49 |
50 | Magic (strict)
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@marcreichel/alpine-timeago",
3 | "version": "0.0.0",
4 | "description": "Display the time difference between now and a given date in a human readable format",
5 | "license": "MIT",
6 | "author": {
7 | "name": "Marc Reichel",
8 | "url": "https://marcreichel.dev/"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://github.com/marcreichel/alpine-timeago.git"
13 | },
14 | "main": "src/index.js",
15 | "scripts": {
16 | "build": "rollup -c",
17 | "watch": "rollup -c -w"
18 | },
19 | "bugs": {
20 | "url": "https://github.com/marcreichel/alpine-timeago/issues"
21 | },
22 | "homepage": "https://github.com/marcreichel/alpine-timeago#readme",
23 | "dependencies": {
24 | "date-fns": "^2.14.0"
25 | },
26 | "devDependencies": {
27 | "@babel/core": "^7.17.8",
28 | "@babel/preset-env": "^7.16.11",
29 | "rollup": "^2.67.2",
30 | "rollup-plugin-babel": "^4.4.0",
31 | "rollup-plugin-filesize": "^9.1.2",
32 | "rollup-plugin-node-resolve": "^5.2.0",
33 | "rollup-plugin-terser": "^7.0.2"
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import babel from 'rollup-plugin-babel';
2 | import filesize from 'rollup-plugin-filesize';
3 | import resolve from 'rollup-plugin-node-resolve';
4 | import { terser } from 'rollup-plugin-terser';
5 |
6 | export default {
7 | input: 'builds/cdn.js',
8 | output: [
9 | {
10 | file: 'dist/alpine-timeago.js',
11 | format: 'umd',
12 | sourcemap: true,
13 | },
14 | {
15 | file: 'dist/alpine-timeago.min.js',
16 | format: 'umd',
17 | plugins: [terser()],
18 | sourcemap: true,
19 | },
20 | ],
21 | plugins: [
22 | resolve(),
23 | filesize(),
24 | babel({
25 | babelrc: false,
26 | exclude: 'node_modules/**',
27 | presets: [
28 | [
29 | '@babel/preset-env',
30 | {
31 | targets: {
32 | node: 'current',
33 | },
34 | },
35 | ],
36 | ],
37 | }),
38 | ],
39 | };
40 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import formatDistanceToNow from "date-fns/formatDistanceToNow";
2 | import formatDistanceToNowStrict from "date-fns/formatDistanceToNowStrict";
3 | import parseISO from "date-fns/parseISO";
4 | import isPast from "date-fns/isPast";
5 |
6 | let locale = null;
7 |
8 | function TimeAgo(Alpine) {
9 | Alpine.directive(
10 | "timeago",
11 | (el, { expression, modifiers }, { evaluateLater, effect, cleanup }) => {
12 | let evaluateDate = evaluateLater(expression);
13 |
14 | const render = (date) => {
15 | if (typeof date === "string") {
16 | date = parseISO(date);
17 | }
18 |
19 | try {
20 | if (modifiers.includes("strict")) {
21 | let unit = modifiers.includes("unit")
22 | ? modifiers[
23 | modifiers.findIndex((modifier) => modifier === "unit") + 1
24 | ] || undefined
25 | : undefined;
26 | if (
27 | !["second", "minute", "hour", "day", "month", "year"].includes(
28 | unit
29 | )
30 | ) {
31 | unit = undefined;
32 | }
33 | let roundingMethod = modifiers.includes("rounding")
34 | ? modifiers[
35 | modifiers.findIndex((modifier) => modifier === "rounding") + 1
36 | ] || undefined
37 | : undefined;
38 | if (!["floor", "ceil", "round"].includes(roundingMethod)) {
39 | roundingMethod = undefined;
40 | }
41 | el.textContent = formatDistanceToNowStrict(date, {
42 | addSuffix: !modifiers.includes("pure"),
43 | unit,
44 | roundingMethod,
45 | locale,
46 | });
47 | } else {
48 | el.textContent = formatDistanceToNow(date, {
49 | addSuffix: !modifiers.includes("pure"),
50 | includeSeconds: modifiers.includes("seconds"),
51 | locale,
52 | });
53 | }
54 |
55 | dispatch(date);
56 | } catch (e) {
57 | console.error(e);
58 | }
59 | };
60 |
61 | let interval;
62 |
63 | const dispatch = (date) => {
64 | el.dispatchEvent(new CustomEvent("timeago:render", { detail: { isPast: isPast(date) }, bubbles: false }));
65 | };
66 |
67 | const setupInterval = (date) => {
68 | let intervalDuration = 30000;
69 | if (modifiers.includes("seconds")) {
70 | intervalDuration = 5000;
71 | }
72 |
73 | interval = setInterval(() => {
74 | render(date);
75 | }, intervalDuration);
76 | };
77 |
78 | const intersectionObserver = new IntersectionObserver((entries) => {
79 | const [entry] = entries;
80 | const {isIntersecting} = entry;
81 | if (isIntersecting) {
82 | evaluateDate((date) => {
83 | if (!interval) {
84 | setupInterval(date);
85 | render(date);
86 | }
87 | });
88 | } else {
89 | if (interval) {
90 | clearInterval(interval);
91 | interval = undefined;
92 | }
93 | }
94 | });
95 |
96 | intersectionObserver.observe(el);
97 |
98 | effect(() => {
99 | evaluateDate((date) => {
100 | if (interval) {
101 | clearInterval(interval);
102 | }
103 |
104 | render(date);
105 |
106 | setupInterval(date);
107 | });
108 | });
109 |
110 | cleanup(() => clearInterval(interval));
111 | }
112 | );
113 |
114 | Alpine.magic("timeago", () => (expression, pure, seconds, strictOptions) => {
115 | if (pure == null) {
116 | pure = false;
117 | }
118 | if (seconds == null) {
119 | seconds = false;
120 | }
121 | if (strictOptions != null && (strictOptions["strict"] || undefined)) {
122 | return formatDistanceToNowStrict(expression, {
123 | addSuffix: !pure,
124 | unit: strictOptions["unit"] || undefined,
125 | roundingMethod: strictOptions["roundingMethod"] || undefined,
126 | locale,
127 | });
128 | }
129 | return formatDistanceToNow(expression, {
130 | addSuffix: !pure,
131 | includeSeconds: seconds,
132 | locale,
133 | });
134 | });
135 | }
136 |
137 | TimeAgo.configure = (config) => {
138 | if (config.hasOwnProperty("locale") && typeof config.locale === "object") {
139 | if (config.locale.hasOwnProperty("formatDistance")) {
140 | locale = config.locale;
141 | }
142 | }
143 |
144 | return TimeAgo;
145 | };
146 |
147 | export default TimeAgo;
148 |
--------------------------------------------------------------------------------