@transferwise/formatting 2.13.1 → 2.13.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/formatting.js +1 -1
- package/dist/formatting.js.map +1 -1
- package/dist/formatting.modern.js +1 -1
- package/dist/formatting.modern.js.map +1 -1
- package/dist/formatting.module.js +1 -1
- package/dist/formatting.module.js.map +1 -1
- package/dist/formatting.umd.js +1 -1
- package/dist/formatting.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/formatting.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e;function t(t){return void 0===e&&(e="object"==typeof Intl&&void 0!==Intl&&"function"==typeof Intl.NumberFormat&&Intl.NumberFormat&&"function"==typeof Intl.NumberFormat.supportedLocalesOf&&Intl.NumberFormat.supportedLocalesOf&&1===Intl.NumberFormat.supportedLocalesOf(t).length),e}var r={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},n={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},i={};function a(e,t){var r=t?""+e+Object.entries(t):e;return i[r]||(i[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),i[r]}function o(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}function u(e,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n=6),m(e,t,n,r.TYPE)}function m(e,i,u,m){if(void 0===i&&(i="en-GB"),void 0===m&&(m="FractionDigits"),!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));var s=m===r.TYPE?r:n,f=null!=u&&"number"==typeof u&&u>=s.MIN_PRECISION&&u<=s.MAX_PRECISION,l=o(i);return t(l)?(f?a(l,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(u,m)):a(l)).format(e):f?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(e,u,m):""+e}var s={BIF:0,BYR:0,CLP:0,DJF:0,GNF:0,IDR:0,JPY:0,KMF:0,KRW:0,MGA:0,PYG:0,RWF:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,HUF:0,UGX:0,KES:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};function f(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),m(e,r,function(e,t,r){return function(e){return e%1==0}(e)&&!r?0:function(e){void 0===e&&(e="");var t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(s,t)?s[t]:2}(t)}(e,t,n.alwaysShowDecimals))}function l(e,t,r){if("string"==typeof t)return v(e,t);var n=t&&t.significantFigures;return n?u(e,r||"en-GB",n):v(e,r||"en-GB")}function v(e,r){var n=4-Math.min(2,Math.max(0,Math.floor(Math.log10(e))-1));return function(e,r,n,i){var u=o(n);return t(u)?a(u,r).format(e):i}(e,{minimumFractionDigits:n,maximumFractionDigits:n},r,e.toFixed(n))}function c(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,a=e.rhsCurrency,o=(void 0===t?{}:t).significantFigures,m=void 0===o?6:o;return void 0===r&&(r="en-GB"),f(e.lhsValue,n,r)+" "+n+" = "+u(i,r,m)+" "+a}var h,d={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0},THB:{hasInversionEnabled:!0}};function y(e,t){return e||(d[t]||{}).multiplierForEquation||1}var p={},g=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],b=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function D(e,t,r){return void 0===t&&(t="en-GB"),void 0===h&&(h=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),h?new Intl.DateTimeFormat(function(e){return function(e){return void 0===p[e]&&(p[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),p[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r){void 0===r&&(r={});var n="UTC"===r.timeZone,i=[];if(r.day&&i.push(n?t.getUTCDate():t.getDate()),r.month){var a=function(e,t,r){return"short"===e.month?b[t?r.getUTCMonth():r.getMonth()]:(t?r.getUTCMonth():r.getMonth())+1}(r,n,t);!function(e){return"short"===e.month}(r)?i.push(a):i.unshift(a)}r.year&&i.push(t.getUTCFullYear());var o=function(e){return"short"===e.month?" ":"/"}(r),u=i.join(o);if(r.weekday){var m=g[n?t.getUTCDay():t.getDay()];u=u?m+", "+u:m}return u||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var I,F={cs:{"relative-format-in-seconds":"během pár vteřin","relative-format-in-minutes":"v {minutes} minutách","relative-format-in-hours":"v {hours} hodinách","relative-format-in-minute":"během 1 minuty","relative-format-in-hour":"během 1 hodiny","relative-format-by":"do {formattedDate}"},de:{"relative-format-in-seconds":"in Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in 1 Minute","relative-format-in-hour":"in 1 Stunde","relative-format-by":"bis {formattedDate}"},en:{"relative-format-in-seconds":"in seconds","relative-format-in-minutes":"in {minutes} minutes","relative-format-in-hours":"in {hours} hours","relative-format-in-minute":"in 1 minute","relative-format-in-hour":"in 1 hour","relative-format-by":"by {formattedDate}"},es:{"relative-format-in-seconds":"en segundos","relative-format-in-minutes":"en {minutes} minutos","relative-format-in-hours":"en {hours} horas","relative-format-in-minute":"en 1 minuto","relative-format-in-hour":"en 1 hora","relative-format-by":"antes del {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"en {hours} heures","relative-format-in-minute":"en 1 minute","relative-format-in-hour":"en 1 heure","relative-format-by":"d'ici au {formattedDate}"},hu:{"relative-format-in-seconds":"másodpercek alatt","relative-format-in-minutes":"{minutes} percen belül","relative-format-in-hours":"{hours} órán belül","relative-format-in-minute":"1 percen belül","relative-format-in-hour":"1 órán belül","relative-format-by":"ekkor: {formattedDate}"},id:{"relative-format-in-seconds":"dalam beberapa detik","relative-format-in-minutes":"dalam {minutes} menit","relative-format-in-hours":"dalam {hours} jam","relative-format-in-minute":"dalam 1 menit","relative-format-in-hour":"dalam 1 jam","relative-format-by":"sebelum {formattedDate}"},it:{"relative-format-in-seconds":"tra qualche secondo","relative-format-in-minutes":"tra {minutes} minuti","relative-format-in-hours":"tra {hours} ore","relative-format-in-minute":"in 1 minuto","relative-format-in-hour":"in 1 ora","relative-format-by":"entro il {formattedDate}"},ja:{"relative-format-in-seconds":"数秒","relative-format-in-minutes":"{minutes}分以内","relative-format-in-hours":"{hours}時間以内","relative-format-in-minute":"1分以内","relative-format-in-hour":"1時間以内","relative-format-by":"{formattedDate}まで"},pl:{"relative-format-in-seconds":"w ciągu kilku sekund","relative-format-in-minutes":"w ciągu {minutes} minut","relative-format-in-hours":"w ciągu {hours} godzin","relative-format-in-minute":"w ciągu 1 minuty","relative-format-in-hour":"w ciągu 1 godziny","relative-format-by":"do {formattedDate}"},pt:{"relative-format-in-seconds":"em segundos","relative-format-in-minutes":"em {minutes} minutos","relative-format-in-hours":"em {hours} horas","relative-format-in-minute":"em 1 minuto","relative-format-in-hour":"em 1 hora","relative-format-by":"até {formattedDate}"},ro:{"relative-format-in-seconds":"în câteva secunde","relative-format-in-minutes":"în {minutes} minute","relative-format-in-hours":"în {hours} ore","relative-format-in-minute":"în 1 minut","relative-format-in-hour":"în 1 oră","relative-format-by":"până pe {formattedDate}"},ru:{"relative-format-in-seconds":"через несколько секунд","relative-format-in-minutes":"через {minutes} мин.","relative-format-in-hours":"через {hours} ч.","relative-format-in-minute":"через минуту","relative-format-in-hour":"через 1 час","relative-format-by":"{formattedDate}"},th:{"relative-format-in-seconds":"ในไม่กี่วินาที","relative-format-in-minutes":"ใน {minutes} นาที","relative-format-in-hours":"ใน {hours} ชั่วโมง","relative-format-in-minute":"ใน 1 นาที","relative-format-in-hour":"ใน 1 ชั่วโมง","relative-format-by":"ภายใน {formattedDate}"},tr:{"relative-format-in-seconds":"saniyeler içinde","relative-format-in-minutes":"{minutes} dakika içinde","relative-format-in-hours":"{hours} saat içinde","relative-format-in-minute":"1 dakika içinde","relative-format-in-hour":"1 saat içinde","relative-format-by":"{formattedDate} itibarıyla"},uk:{"relative-format-in-seconds":"через кілька секунд","relative-format-in-minutes":"через {minutes} хв","relative-format-in-hours":"через {hours} год","relative-format-in-minute":"через 1 хвилину","relative-format-in-hour":"через 1 годину","relative-format-by":"до {formattedDate}"},"zh-CN":{"relative-format-in-seconds":"数秒内","relative-format-in-minutes":"{minutes} 分钟内","relative-format-in-hours":"{hours} 小时内","relative-format-in-minute":"1 分钟内","relative-format-in-hour":"1 小时内","relative-format-by":"{formattedDate} 前"},"zh-HK":{"relative-format-in-seconds":"數秒內","relative-format-in-minutes":"在{minutes}分鐘內","relative-format-in-hours":"在{hours}小時內","relative-format-in-minute":"在1分鐘內","relative-format-in-hour":"在1小時內","relative-format-by":"在{formattedDate}或之前"}};function w(e,t,r){var n;return void 0===t&&(t={}),(n=N(r,e)?F[r][e]:N("en",e)?F.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function N(e,t){return E(F,e)&&E(F[e],t)}function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function M(e,t){var r,n=((r={})[I.HOUR]=36e5,r[I.MINUTE]=6e4,r[I.SECOND]=1e3,r);return Math.ceil(e/n[t])}function C(e,t,r){var n;return 1===e?w("relative-format-in-"+r,{},t):w("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(I||(I={})),exports.formatAmount=f,exports.formatDate=D,exports.formatMoney=function(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),f(e,t,r,n)+" "+(t||"").toUpperCase()},exports.formatNumber=m,exports.formatNumberToSignificantDigits=u,exports.formatPercentage=function(e,t){return void 0===t&&(t="en-GB"),Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:2}).format(e)},exports.formatRate=l,exports.formatRelativeDate=function(e,t){return void 0===t&&(t="en-GB"),e<new Date(Date.now())?"":function(e){return function(e){var t=new Date(Date.now());return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}(e)&&function(e,t){return M(e-new Date(Date.now()),I.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(M(r,I.SECOND)<60)return function(e){return w("relative-format-in-seconds",{},e)}(t);var n=M(r,I.MINUTE);return n<60?C(n,t,I.MINUTE):C(M(r,I.HOUR),t,I.HOUR)}(e,t):function(e,t){return w("relative-format-by",{formattedDate:D(e,t,{month:"short",day:"numeric"})},t)}(e,t)},exports.getDisplayRate=function(e){var t=e.rate,r=e.sourceCurrency,n=e.targetCurrency,i=e.locale,a=function(e,t){return"BRL"===e&&t<=10||t<.1}(r,t),o=a?1/t:t,u="1 "+(a?n:r),m=l(o,i)+" "+(a?r:n);return{decimal:l(o,i),inverted:a,equation:u+" = "+m}},exports.getRateInAllFormats=function(e,t,r,n,i){var a=void 0===n?{}:n,o=a.reference,m=void 0===o?"auto":o,s=a.referenceMultiplier,f=a.significantFigures,l=void 0===f?6:f;void 0===i&&(i="en-GB");var v={suggested:{},formats:{}};v.formats.decimal={output:u(e,i,l),significantFigures:l};var h=function(e,t,r,n){var i=void 0===n?{}:n,a=i.reference,o=void 0===a?"auto":a,u=i.referenceMultiplier;return function(){if(!e)throw new Error("rate parameter is mandatory (got "+e+" instead).");if(!t)throw new Error("sourceCurrency parameter is mandatory (got "+t+" instead).");if(!r)throw new Error("targetCurrency parameter is mandatory (got "+r+" instead).");if(u&&"number"!=typeof u)throw new Error("referenceMultiplier must be a number (got "+typeof u+" "+u+" instead)")}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(d[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:y(u,r),rhsCurrency:t,rhsValue:y(u,r)/e}:{lhsCurrency:t,lhsValue:y(u,t),rhsCurrency:r,rhsValue:e*y(u,t)}}(e,t,r,{reference:m,referenceMultiplier:s});return v.formats.equation={output:c(h,{significantFigures:l},i),reference:h.lhsCurrency===t?"source":"target",referenceMultiplier:h.lhsValue,calculationInDecimal:u(h.rhsValue,i,l)},v.suggested=h.lhsCurrency===t&&1===h.lhsValue?{format:"decimal",output:v.formats.decimal.output}:{format:"equation",output:v.formats.equation.output},v};
|
|
1
|
+
var e;function t(t){return void 0===e&&(e="object"==typeof Intl&&void 0!==Intl&&"function"==typeof Intl.NumberFormat&&Intl.NumberFormat&&"function"==typeof Intl.NumberFormat.supportedLocalesOf&&Intl.NumberFormat.supportedLocalesOf&&1===Intl.NumberFormat.supportedLocalesOf(t).length),e}var r={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},n={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},i={};function a(e,t){var r=t?""+e+Object.entries(t):e;return i[r]||(i[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),i[r]}function o(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}function u(e,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n=6),m(e,t,n,r.TYPE)}function m(e,i,u,m){if(void 0===i&&(i="en-GB"),void 0===m&&(m="FractionDigits"),!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));var s=m===r.TYPE?r:n,f=null!=u&&"number"==typeof u&&u>=s.MIN_PRECISION&&u<=s.MAX_PRECISION,l=o(i);return t(l)?(f?a(l,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(u,m)):a(l)).format(e):f?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(e,u,m):""+e}var s={BIF:0,BYR:0,CLP:0,DJF:0,GNF:0,IDR:0,JPY:0,KMF:0,KRW:0,MGA:0,PYG:0,RWF:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,HUF:0,UGX:0,KES:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};function f(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),m(e,r,function(e,t,r){return function(e){return e%1==0}(e)&&!r?0:function(e){void 0===e&&(e="");var t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(s,t)?s[t]:2}(t)}(e,t,n.alwaysShowDecimals))}function l(e,t,r){if("string"==typeof t)return v(e,t);var n=t&&t.significantFigures;return n?u(e,r||"en-GB",n):v(e,r||"en-GB")}function v(e,r){var n=4-Math.min(2,Math.max(0,Math.floor(Math.log10(e))-1));return function(e,r,n,i){var u=o(n);return t(u)?a(u,r).format(e):i}(e,{minimumFractionDigits:n,maximumFractionDigits:n},r,e.toFixed(n))}function c(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,a=e.rhsCurrency,o=(void 0===t?{}:t).significantFigures,m=void 0===o?6:o;return void 0===r&&(r="en-GB"),f(e.lhsValue,n,r)+" "+n+" = "+u(i,r,m)+" "+a}var h,d={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0},THB:{hasInversionEnabled:!0}};function y(e,t){return e||(d[t]||{}).multiplierForEquation||1}var b={},g=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],p=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function D(e,t,r){return void 0===t&&(t="en-GB"),void 0===h&&(h=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),h?new Intl.DateTimeFormat(function(e){return function(e){return void 0===b[e]&&(b[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),b[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r){void 0===r&&(r={});var n="UTC"===r.timeZone,i=[];if(r.day&&i.push(n?t.getUTCDate():t.getDate()),r.month){var a=function(e,t,r){return"short"===e.month?p[t?r.getUTCMonth():r.getMonth()]:(t?r.getUTCMonth():r.getMonth())+1}(r,n,t);!function(e){return"short"===e.month}(r)?i.push(a):i.unshift(a)}r.year&&i.push(t.getUTCFullYear());var o=function(e){return"short"===e.month?" ":"/"}(r),u=i.join(o);if(r.weekday){var m=g[n?t.getUTCDay():t.getDay()];u=u?m+", "+u:m}return u||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var I,F={cs:{"relative-format-in-seconds":"během pár sekund","relative-format-in-minutes":"během {minutes} min.","relative-format-in-hours":"během {hours} hod.","relative-format-in-minute":"během 1 minuty","relative-format-in-hour":"během 1 hodiny","relative-format-by":"do {formattedDate}"},da:{"relative-format-in-seconds":"om sekunder","relative-format-in-minutes":"om {minutes} minutter","relative-format-in-hours":"om {hours} timer","relative-format-in-minute":"om 1 minut","relative-format-in-hour":"om 1 time","relative-format-by":"inden {formattedDate}"},de:{"relative-format-in-seconds":"in Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in 1 Minute","relative-format-in-hour":"in 1 Stunde","relative-format-by":"bis {formattedDate}"},en:{"relative-format-in-seconds":"in seconds","relative-format-in-minutes":"in {minutes} minutes","relative-format-in-hours":"in {hours} hours","relative-format-in-minute":"in 1 minute","relative-format-in-hour":"in 1 hour","relative-format-by":"by {formattedDate}"},es:{"relative-format-in-seconds":"en segundos","relative-format-in-minutes":"en {minutes} minutos","relative-format-in-hours":"en {hours} horas","relative-format-in-minute":"en 1 minuto","relative-format-in-hour":"en 1 hora","relative-format-by":"antes del {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"en {hours} heures","relative-format-in-minute":"en 1 minute","relative-format-in-hour":"en 1 heure","relative-format-by":"d'ici au {formattedDate}"},hu:{"relative-format-in-seconds":"másodpercek alatt","relative-format-in-minutes":"{minutes} percen belül","relative-format-in-hours":"{hours} órán belül","relative-format-in-minute":"1 percen belül","relative-format-in-hour":"1 órán belül","relative-format-by":"ekkor: {formattedDate}"},id:{"relative-format-in-seconds":"dalam beberapa detik","relative-format-in-minutes":"dalam {minutes} menit","relative-format-in-hours":"dalam {hours} jam","relative-format-in-minute":"dalam 1 menit","relative-format-in-hour":"dalam 1 jam","relative-format-by":"sebelum {formattedDate}"},it:{"relative-format-in-seconds":"tra qualche secondo","relative-format-in-minutes":"tra {minutes} minuti","relative-format-in-hours":"tra {hours} ore","relative-format-in-minute":"in 1 minuto","relative-format-in-hour":"in 1 ora","relative-format-by":"entro il {formattedDate}"},ja:{"relative-format-in-seconds":"数秒","relative-format-in-minutes":"{minutes}分以内","relative-format-in-hours":"{hours}時間以内","relative-format-in-minute":"1分以内","relative-format-in-hour":"1時間以内","relative-format-by":"{formattedDate}まで"},nb:{"relative-format-in-seconds":"om noen sekunder","relative-format-in-minutes":"om {minutes} minutter","relative-format-in-hours":"om {hours} timer","relative-format-in-minute":"om 1 minutt","relative-format-in-hour":"om 1 time","relative-format-by":"innen {formattedDate}"},nl:{"relative-format-in-seconds":"over enkele seconden","relative-format-in-minutes":"over {minutes} minuten","relative-format-in-hours":"over {hours} uur","relative-format-in-minute":"over 1 minuut","relative-format-in-hour":"over 1 uur","relative-format-by":"voor {formattedDate}"},pl:{"relative-format-in-seconds":"w ciągu kilku sekund","relative-format-in-minutes":"w ciągu {minutes} minut","relative-format-in-hours":"w ciągu {hours} godzin","relative-format-in-minute":"w ciągu 1 minuty","relative-format-in-hour":"w ciągu 1 godziny","relative-format-by":"do {formattedDate}"},pt:{"relative-format-in-seconds":"em segundos","relative-format-in-minutes":"em {minutes} minutos","relative-format-in-hours":"em {hours} horas","relative-format-in-minute":"em 1 minuto","relative-format-in-hour":"em 1 hora","relative-format-by":"até {formattedDate}"},ro:{"relative-format-in-seconds":"în câteva secunde","relative-format-in-minutes":"în {minutes} minute","relative-format-in-hours":"în {hours} ore","relative-format-in-minute":"în 1 minut","relative-format-in-hour":"în 1 oră","relative-format-by":"până pe {formattedDate}"},ru:{"relative-format-in-seconds":"через несколько секунд","relative-format-in-minutes":"через {minutes} мин.","relative-format-in-hours":"через {hours} ч.","relative-format-in-minute":"через минуту","relative-format-in-hour":"через 1 час","relative-format-by":"{formattedDate}"},sv:{"relative-format-in-seconds":"om några sekunder","relative-format-in-minutes":"om {minutes} minuter","relative-format-in-hours":"om {hours} timmar","relative-format-in-minute":"om 1 minut","relative-format-in-hour":"om 1 timme","relative-format-by":"senast {formattedDate}"},th:{"relative-format-in-seconds":"ในไม่กี่วินาที","relative-format-in-minutes":"ใน {minutes} นาที","relative-format-in-hours":"ใน {hours} ชั่วโมง","relative-format-in-minute":"ใน 1 นาที","relative-format-in-hour":"ใน 1 ชั่วโมง","relative-format-by":"ภายใน {formattedDate}"},tr:{"relative-format-in-seconds":"saniyeler içinde","relative-format-in-minutes":"{minutes} dakika içinde","relative-format-in-hours":"{hours} saat içinde","relative-format-in-minute":"1 dakika içinde","relative-format-in-hour":"1 saat içinde","relative-format-by":"{formattedDate} itibarıyla"},uk:{"relative-format-in-seconds":"через кілька секунд","relative-format-in-minutes":"через {minutes} хв","relative-format-in-hours":"через {hours} год","relative-format-in-minute":"через 1 хвилину","relative-format-in-hour":"через 1 годину","relative-format-by":"до {formattedDate}"},"zh-CN":{"relative-format-in-seconds":"数秒内","relative-format-in-minutes":"{minutes} 分钟内","relative-format-in-hours":"{hours} 小时内","relative-format-in-minute":"1 分钟内","relative-format-in-hour":"1 小时内","relative-format-by":"{formattedDate} 前"},"zh-HK":{"relative-format-in-seconds":"數秒內","relative-format-in-minutes":"在{minutes}分鐘內","relative-format-in-hours":"在{hours}小時內","relative-format-in-minute":"在1分鐘內","relative-format-in-hour":"在1小時內","relative-format-by":"在{formattedDate}或之前"}};function w(e,t,r){var n;return void 0===t&&(t={}),(n=N(r,e)?F[r][e]:N("en",e)?F.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function N(e,t){return E(F,e)&&E(F[e],t)}function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function M(e,t){var r,n=((r={})[I.HOUR]=36e5,r[I.MINUTE]=6e4,r[I.SECOND]=1e3,r);return Math.ceil(e/n[t])}function C(e,t,r){var n;return 1===e?w("relative-format-in-"+r,{},t):w("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(I||(I={})),exports.formatAmount=f,exports.formatDate=D,exports.formatMoney=function(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),f(e,t,r,n)+" "+(t||"").toUpperCase()},exports.formatNumber=m,exports.formatNumberToSignificantDigits=u,exports.formatPercentage=function(e,t){return void 0===t&&(t="en-GB"),Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:2}).format(e)},exports.formatRate=l,exports.formatRelativeDate=function(e,t){return void 0===t&&(t="en-GB"),e<new Date(Date.now())?"":function(e){return function(e){var t=new Date(Date.now());return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}(e)&&function(e,t){return M(e-new Date(Date.now()),I.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(M(r,I.SECOND)<60)return function(e){return w("relative-format-in-seconds",{},e)}(t);var n=M(r,I.MINUTE);return n<60?C(n,t,I.MINUTE):C(M(r,I.HOUR),t,I.HOUR)}(e,t):function(e,t){return w("relative-format-by",{formattedDate:D(e,t,{month:"short",day:"numeric"})},t)}(e,t)},exports.getDisplayRate=function(e){var t=e.rate,r=e.sourceCurrency,n=e.targetCurrency,i=e.locale,a=function(e,t){return"BRL"===e&&t<=10||t<.1}(r,t),o=a?1/t:t,u="1 "+(a?n:r),m=l(o,i)+" "+(a?r:n);return{decimal:l(o,i),inverted:a,equation:u+" = "+m}},exports.getRateInAllFormats=function(e,t,r,n,i){var a=void 0===n?{}:n,o=a.reference,m=void 0===o?"auto":o,s=a.referenceMultiplier,f=a.significantFigures,l=void 0===f?6:f;void 0===i&&(i="en-GB");var v={suggested:{},formats:{}};v.formats.decimal={output:u(e,i,l),significantFigures:l};var h=function(e,t,r,n){var i=void 0===n?{}:n,a=i.reference,o=void 0===a?"auto":a,u=i.referenceMultiplier;return function(){if(!e)throw new Error("rate parameter is mandatory (got "+e+" instead).");if(!t)throw new Error("sourceCurrency parameter is mandatory (got "+t+" instead).");if(!r)throw new Error("targetCurrency parameter is mandatory (got "+r+" instead).");if(u&&"number"!=typeof u)throw new Error("referenceMultiplier must be a number (got "+typeof u+" "+u+" instead)")}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(d[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:y(u,r),rhsCurrency:t,rhsValue:y(u,r)/e}:{lhsCurrency:t,lhsValue:y(u,t),rhsCurrency:r,rhsValue:e*y(u,t)}}(e,t,r,{reference:m,referenceMultiplier:s});return v.formats.equation={output:c(h,{significantFigures:l},i),reference:h.lhsCurrency===t?"source":"target",referenceMultiplier:h.lhsValue,calculationInDecimal:u(h.rhsValue,i,l)},v.suggested=h.lhsCurrency===t&&1===h.lhsValue?{format:"decimal",output:v.formats.decimal.output}:{format:"equation",output:v.formats.equation.output},v};
|
|
2
2
|
//# sourceMappingURL=formatting.js.map
|
package/dist/formatting.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.js","sources":["../src/number/feature-detection/intl.ts","../src/number/number.ts","../src/defaults/index.ts","../src/currency/currency.ts","../src/rate/formatRate.ts","../src/rate/formatRateEquation.ts","../src/rate/config.ts","../src/date/support-detection/intl.ts","../src/rate/getRateEquation.ts","../src/date/support-detection/selectedLocale.ts","../src/date/fallback-format/fallbackFormat.ts","../src/date/date.ts","../src/date/isToday.ts","../src/date/relative-date/relativeDateFormatter.ts","../src/translations/translator.ts","../src/percentage/percentage.ts","../src/rate/getDisplayRate.ts","../src/rate/getRateInAllFormats.ts"],"sourcesContent":["let isSupported: boolean | undefined;\n\n/**\n * Checks if Intl.NumberFormat is supported for a specific locale\n * @param {String} locale\n * @returns {Boolean}\n */\nexport function isIntlNumberFormatSupported(locale: string): boolean {\n if (isSupported === undefined) {\n isSupported =\n typeof Intl === 'object' &&\n Intl !== undefined &&\n typeof Intl.NumberFormat === 'function' &&\n Intl.NumberFormat &&\n typeof Intl.NumberFormat.supportedLocalesOf === 'function' &&\n Intl.NumberFormat.supportedLocalesOf &&\n Intl.NumberFormat.supportedLocalesOf(locale).length === 1;\n }\n return isSupported;\n}\n","import {\n DEFAULT_LOCALE,\n PRECISION,\n NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n PrecisionType,\n} from '../defaults';\nimport { isIntlNumberFormatSupported } from './feature-detection';\n\nconst { SIGNIFICANT_DIGITS, FRACTION_DIGITS } = PRECISION;\n\nconst formatters: Record<string, any> = {}; // cache, sample: { 'en-GB': formatter, 'en-GB2': formatter }\n\n/**\n * Returns a formatter for the specified locale and NumberFormatOptions\n * @param {String} locale\n * @param {Intl.NumberFormatOptions} options\n * @returns {Intl.NumberFormat}\n */\nfunction getFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const cacheKey = options ? `${locale}${Object.entries(options)}` : locale;\n if (!formatters[cacheKey]) {\n formatters[cacheKey] = options\n ? new Intl.NumberFormat(locale, options)\n : new Intl.NumberFormat(locale);\n }\n return formatters[cacheKey];\n}\n\n/**\n * Returns the desired options object for\n * `Number.toLocaleString` and `Intl.NumberFormat` methods\n * @param {Number} precision\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n */\nfunction getPrecisionOptions(precision: number, precisionType: PrecisionType) {\n return {\n [`minimum${precisionType}`]: precision,\n [`maximum${precisionType}`]: precision,\n };\n}\n\n/**\n * Returns the locale that was passed in if it works\n * with `toLocaleString` or otherwise falls back to `DEFAULT_LOCALE`\n * @param {String} locale\n */\nfunction getValidLocale(locale: string) {\n try {\n const noUnderscoreLocale = locale.replace(/_/, '-');\n\n Intl.NumberFormat(noUnderscoreLocale);\n return noUnderscoreLocale;\n } catch (e) {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Formats the number as a fallback for when `toLocaleString` method is not supported\n * by the browser. Will use `toFixed` to format `FractionDigits` precisionType and `toPrecision`\n * to format `SignificantDigits` precision type.\n * @param {Number} number\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nfunction formatNumberWithFallback(number: number, precision: number, precisionType: PrecisionType) {\n return precisionType === SIGNIFICANT_DIGITS.TYPE\n ? number.toPrecision(precision)\n : number.toFixed(precision);\n}\n\n/**\n * Formats a number to a significant number of digits with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {Number} significantDigits - this may be a value between 1 and 21, inclusive\n * @param {String} locale\n * @returns {String}\n */\nexport function formatNumberToSignificantDigits(\n number: number,\n locale = DEFAULT_LOCALE,\n significantDigits = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n) {\n return formatNumber(number, locale, significantDigits, SIGNIFICANT_DIGITS.TYPE);\n}\n\n/**\n * Formats a number precisely with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {String} locale\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nexport function formatNumber(\n number: number,\n locale = DEFAULT_LOCALE,\n precision?: number,\n precisionType: PrecisionType = 'FractionDigits',\n): string {\n if (!number && number !== 0) {\n return '';\n }\n\n if (typeof number === 'string' && Number(number)) {\n // eslint-disable-next-line no-param-reassign\n number = Number(number);\n }\n\n const { MIN_PRECISION, MAX_PRECISION } =\n precisionType === SIGNIFICANT_DIGITS.TYPE ? SIGNIFICANT_DIGITS : FRACTION_DIGITS;\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed#Parameters\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat#Parameters\n const isPrecisionValid =\n precision !== undefined &&\n precision !== null &&\n typeof precision === 'number' &&\n precision >= MIN_PRECISION &&\n precision <= MAX_PRECISION;\n\n const validatedLocale = getValidLocale(locale);\n\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return isPrecisionValid\n ? formatNumberWithFallback(number, precision!, precisionType)\n : `${number}`;\n }\n\n const formatter = isPrecisionValid\n ? getFormatter(validatedLocale, getPrecisionOptions(precision!, precisionType))\n : getFormatter(validatedLocale);\n\n return formatter.format(number);\n}\n\nexport function formatNumberWithOptions(\n value: number,\n options: Intl.NumberFormatOptions,\n locale: string,\n fallback: string,\n) {\n const validatedLocale = getValidLocale(locale);\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return fallback;\n }\n\n return getFormatter(validatedLocale, options).format(value);\n}\n","export const DEFAULT_LOCALE = 'en-GB';\nexport const DEFAULT_PRECISION_TYPE = 'FractionDigits';\nexport const NUMBER_OF_RATE_SIGNIFICANT_DIGITS = 6;\nexport const DEFAULT_RATE_MULTIPLIER = 1;\nexport const PRECISION = {\n SIGNIFICANT_DIGITS: {\n TYPE: 'SignificantDigits' as PrecisionType,\n MIN_PRECISION: 1,\n MAX_PRECISION: 21,\n },\n FRACTION_DIGITS: {\n TYPE: 'FractionDigits' as PrecisionType,\n MIN_PRECISION: 0,\n MAX_PRECISION: 20,\n },\n};\nexport type PrecisionType = 'SignificantDigits' | 'FractionDigits';\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumber } from '../number';\n\nconst currencyDecimals = {\n BIF: 0,\n BYR: 0,\n CLP: 0,\n DJF: 0,\n GNF: 0,\n IDR: 0,\n JPY: 0,\n KMF: 0,\n KRW: 0,\n MGA: 0,\n PYG: 0,\n RWF: 0,\n VND: 0,\n VUV: 0,\n XAF: 0,\n XOF: 0,\n XPF: 0,\n // technically HUF does have decimals, but due to the exchange rate banks\n // do not accept decimal amounts\n HUF: 0,\n UGX: 0,\n // local banks do not consistently support the ideal 2-decimal places fractional part\n KES: 0,\n\n BHD: 3,\n JOD: 3,\n KWD: 3,\n OMR: 3,\n TND: 3,\n};\n\nconst DEFAULT_CURRENCY_DECIMALS = 2;\n\nfunction getCurrencyDecimals(currency = '') {\n const upperCaseCurrency = currency.toUpperCase();\n if (Object.prototype.hasOwnProperty.call(currencyDecimals, upperCaseCurrency)) {\n return currencyDecimals[upperCaseCurrency as keyof typeof currencyDecimals];\n }\n return DEFAULT_CURRENCY_DECIMALS;\n}\n\nfunction amountHasNoDecimals(amount: number): boolean {\n return amount % 1 === 0;\n}\n\nfunction getPrecision(amount: number, currencyCode: string, alwaysShowDecimals: boolean): number {\n if (amountHasNoDecimals(amount) && !alwaysShowDecimals) {\n return 0;\n }\n\n return getCurrencyDecimals(currencyCode);\n}\n\nexport function formatAmount(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n): string {\n const availablePrecision = getPrecision(amount, currencyCode, options.alwaysShowDecimals);\n\n return formatNumber(amount, locale, availablePrecision);\n}\n\nexport function formatMoney(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n) {\n return `${formatAmount(amount, currencyCode, locale, options)} ${(\n currencyCode || ''\n ).toUpperCase()}`;\n}\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberWithOptions, formatNumberToSignificantDigits } from '../number';\n\nexport type FormatRateOptions = {\n significantFigures?: number;\n};\n\nfunction formatRate(rate: number, locale: string): string;\n/**\n * @deprecated Do not specify options, always specify a locale.\n */\nfunction formatRate(rate: number, options?: FormatRateOptions, locale?: string): string;\n\nfunction formatRate(\n rate: number,\n optionsOrLocale?: FormatRateOptions | string,\n locale?: string,\n): string {\n if (typeof optionsOrLocale === 'string') {\n return formatRateInternal(rate, optionsOrLocale);\n }\n\n const significantFigures = optionsOrLocale && optionsOrLocale.significantFigures;\n if (significantFigures) {\n return formatNumberToSignificantDigits(rate, locale || DEFAULT_LOCALE, significantFigures);\n }\n\n return formatRateInternal(rate, locale || DEFAULT_LOCALE);\n}\n\nfunction formatRateInternal(rate: number, locale: string) {\n // We lower the number of decimal places if the value is big, to minimun of 2\n const sizeAdjuster =\n // Upper bound 2\n Math.min(\n 2,\n // Low bound 0\n Math.max(\n 0,\n // Number of siginificant leading digits - 1\n Math.floor(Math.log10(rate)) - 1,\n ),\n );\n const fractionDigits = 4 - sizeAdjuster;\n\n return formatNumberWithOptions(\n rate,\n {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n },\n locale,\n rate.toFixed(fractionDigits),\n );\n}\n\nexport default formatRate;\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport { formatAmount } from '../currency';\n\nexport default function(\n {\n lhsValue,\n lhsCurrency,\n rhsValue,\n rhsCurrency,\n }: { lhsValue: number; lhsCurrency: string; rhsValue: number; rhsCurrency: string },\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return `${formatAmount(\n lhsValue,\n lhsCurrency,\n locale,\n )} ${lhsCurrency} = ${formatNumberToSignificantDigits(\n rhsValue,\n locale,\n significantFigures,\n )} ${rhsCurrency}`;\n}\n","export default {\n BRL: {\n hasInversionEnabled: true,\n },\n INR: {\n hasInversionEnabled: true,\n },\n JPY: {\n hasInversionEnabled: true,\n },\n IDR: {\n hasInversionEnabled: true\n },\n HUF: {\n hasInversionEnabled: true,\n },\n RON: {\n hasInversionEnabled: true,\n },\n THB: {\n hasInversionEnabled: true,\n },\n} as Record<string, { hasInversionEnabled?: boolean; multiplierForEquation?: number }>;\n","import { DEFAULT_LOCALE } from '../../defaults';\n\nlet intlSupported: boolean | undefined; // cache\n\nexport function isIntlSupported(): boolean {\n if (intlSupported === undefined) {\n intlSupported = intlDateTimeFormatReturnsCorrectValue();\n }\n return intlSupported;\n}\n\nfunction intlDateTimeFormatReturnsCorrectValue(): boolean {\n try {\n const date = new Date(2018, 11, 1);\n const dateString = new Intl.DateTimeFormat(DEFAULT_LOCALE).format(date);\n return dateString === '01/12/2018';\n } catch (e) {\n return false;\n }\n}\n","import config from './config';\nimport { DEFAULT_RATE_MULTIPLIER } from '../defaults';\n\nexport type Reference = 'auto' | 'source' | 'target';\n\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n }: { reference?: Reference; referenceMultiplier?: number } = {},\n) {\n validateParameters();\n\n if (shouldInvertEquation(reference, sourceCurrency)) {\n return {\n // inverted.\n lhsCurrency: targetCurrency,\n lhsValue: getMultiplier(referenceMultiplier, targetCurrency),\n rhsCurrency: sourceCurrency,\n rhsValue: getMultiplier(referenceMultiplier, targetCurrency) / rate,\n };\n }\n return {\n // normal.\n lhsCurrency: sourceCurrency,\n lhsValue: getMultiplier(referenceMultiplier, sourceCurrency),\n rhsCurrency: targetCurrency,\n rhsValue: rate * getMultiplier(referenceMultiplier, sourceCurrency),\n };\n\n function validateParameters(): void {\n if (!rate) throw new Error(`rate parameter is mandatory (got ${rate} instead).`);\n if (!sourceCurrency)\n throw new Error(`sourceCurrency parameter is mandatory (got ${sourceCurrency} instead).`);\n if (!targetCurrency)\n throw new Error(`targetCurrency parameter is mandatory (got ${targetCurrency} instead).`);\n if (referenceMultiplier && typeof referenceMultiplier !== 'number') {\n throw new Error(\n `referenceMultiplier must be a number (got ${typeof referenceMultiplier} ${referenceMultiplier} instead)`,\n );\n }\n // Let shouldInvertEquation() handle `reference`.\n }\n}\n\nfunction shouldInvertEquation(referenceConfig: Reference, sourceCurrency: string): boolean {\n if (referenceConfig === 'source') return false;\n if (referenceConfig === 'target') return true;\n if (['auto', undefined, null].indexOf(referenceConfig) > -1)\n return !!(config[sourceCurrency] || {}).hasInversionEnabled;\n throw new Error(\n `Unrecognized reference config value: ${referenceConfig} (valid values are auto, source, target).`,\n );\n}\n\nfunction getMultiplier(\n referenceMultiplierOverride: number | undefined,\n lhsCurrency: string,\n): number {\n return (\n referenceMultiplierOverride ||\n (config[lhsCurrency] || {}).multiplierForEquation ||\n DEFAULT_RATE_MULTIPLIER\n );\n}\n","const supportedLocales: Record<string, boolean> = {}; // cache\n\nexport function isSelectedLocaleSupported(locale: string): boolean {\n if (supportedLocales[locale] === undefined) {\n supportedLocales[locale] = checkForLocaleSupport(locale);\n }\n return supportedLocales[locale];\n}\n\nfunction checkForLocaleSupport(locale: string): boolean {\n try {\n return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;\n } catch (e) {\n return false;\n }\n}\n","const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst SHORT_MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nfunction getJoiningCharacter(options: Intl.DateTimeFormatOptions): string {\n return options.month === 'short' ? ' ' : '/';\n}\n\nfunction isMonthFirst(options: Intl.DateTimeFormatOptions) {\n return options.month === 'short';\n}\n\nfunction getFormattedMonth(\n options: Intl.DateTimeFormatOptions,\n isUTC: boolean,\n date: Date,\n): string | number {\n if (options.month === 'short') {\n return SHORT_MONTHS[isUTC ? date.getUTCMonth() : date.getMonth()];\n }\n return (isUTC ? date.getUTCMonth() : date.getMonth()) + 1;\n}\n\n// Sample outputs: 'Sat, 1/12/2018', '1/12/2018', '12/2018', Sat, 1'\nexport function getFallbackFormat(date: Date, options: Intl.DateTimeFormatOptions = {}): string {\n const isUTC = options.timeZone === 'UTC';\n\n const dateParts = [];\n if (options.day) dateParts.push(isUTC ? date.getUTCDate() : date.getDate());\n if (options.month) {\n const monthFormat = getFormattedMonth(options, isUTC, date);\n if (isMonthFirst(options)) {\n dateParts.unshift(monthFormat);\n } else {\n dateParts.push(monthFormat);\n }\n }\n if (options.year) dateParts.push(isUTC ? date.getUTCFullYear() : date.getUTCFullYear());\n\n const joiningCharacter = getJoiningCharacter(options);\n let fallbackDate = dateParts.join(joiningCharacter);\n\n if (options.weekday) {\n const dayName = WEEKDAYS[isUTC ? date.getUTCDay() : date.getDay()];\n fallbackDate = fallbackDate ? `${dayName}, ${fallbackDate}` : dayName;\n }\n return (\n fallbackDate ||\n getFallbackFormat(date, {\n timeZone: options.timeZone,\n day: 'true',\n month: 'true',\n year: 'true',\n })\n );\n}\n","import { isIntlSupported, isSelectedLocaleSupported } from './support-detection';\nimport { getFallbackFormat } from './fallback-format';\nimport { DEFAULT_LOCALE } from '../defaults';\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? new Intl.DateTimeFormat(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n","export default (date: Date): boolean => {\n const today = new Date(Date.now());\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n","import isToday from '../isToday';\nimport { formatDate } from '../date';\nimport { getTranslation } from '../../translations/translator';\nimport { DEFAULT_LOCALE } from '../../defaults';\n\nexport function formatRelativeDate(date: Date, locale = DEFAULT_LOCALE): string {\n if (date < new Date(Date.now())) {\n return '';\n }\n\n let formatted;\n if (shouldFormatRelative(date)) {\n formatted = formatRelative(date, locale);\n } else {\n formatted = formatAbsolute(date, locale);\n }\n return formatted;\n}\n\nfunction shouldFormatRelative(date: Date): boolean {\n return isToday(date) && isWithinHours(date, 12);\n}\n\nfunction isWithinHours(date: Date, boundary: number): boolean {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n return getDifferenceIn(diff, TimeUnit.HOUR) <= boundary;\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n\n if (getDifferenceIn(diff, TimeUnit.SECOND) < 60) {\n return formatSeconds(locale);\n }\n\n const differenceInMinutes = getDifferenceIn(diff, TimeUnit.MINUTE);\n if (differenceInMinutes < 60) {\n return formatTimeUnit(differenceInMinutes, locale, TimeUnit.MINUTE);\n }\n\n return formatTimeUnit(getDifferenceIn(diff, TimeUnit.HOUR), locale, TimeUnit.HOUR);\n}\n\nfunction formatAbsolute(date: Date, locale: string): string {\n const params = {\n formattedDate: formatDate(date, locale, { month: 'short', day: 'numeric' }),\n };\n return getTranslation('relative-format-by', params, locale);\n}\n\nfunction getDifferenceIn(diff: number, timeUnitValue: TimeUnit): number {\n const millisecondsMap = {\n [TimeUnit.HOUR]: 3600000,\n [TimeUnit.MINUTE]: 60000,\n [TimeUnit.SECOND]: 1000,\n };\n return Math.ceil(diff / millisecondsMap[timeUnitValue]);\n}\n\nfunction formatTimeUnit(value: number, locale: string, timeUnit: string): string {\n if (value === 1) {\n return getTranslation(`relative-format-in-${timeUnit}`, {}, locale);\n }\n return getTranslation(\n `relative-format-in-${timeUnit}s`,\n { [`${timeUnit}s`]: `${value}` },\n locale,\n );\n}\n\nfunction formatSeconds(locale: string) {\n return getTranslation('relative-format-in-seconds', {}, locale);\n}\n\nenum TimeUnit {\n SECOND = 'second',\n MINUTE = 'minute',\n HOUR = 'hour',\n}\n","// eslint-disable-next-line import/no-unresolved\nimport translations from './translations.json';\n\nexport function getTranslation(\n translationKey: string,\n params: Record<string, string> = {},\n locale: string,\n): string {\n let translatedMessage: string | undefined;\n if (hasTranslation(locale, translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>)[locale][\n translationKey\n ];\n } else if (hasTranslation('en', translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>).en[translationKey];\n } else {\n translatedMessage = translationKey;\n }\n\n if (translatedMessage && params) {\n Object.keys(params).forEach(key => {\n translatedMessage = (translatedMessage as string).replace(\n new RegExp(`{${key}}`, 'g'),\n params[key],\n );\n });\n }\n\n return translatedMessage || translationKey;\n}\n\nfunction hasTranslation(locale: string, translationKey: string): boolean {\n return (\n hasOwnProperty(translations, locale) &&\n hasOwnProperty((translations as Record<string, Record<string, string>>)[locale], translationKey)\n );\n}\n\nfunction hasOwnProperty(obj: any, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n","export const formatPercentage= (percentage: number, locale = 'en-GB'): string =>\n Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(percentage);\n\n\n","import formatRate from './formatRate';\n\nexport type DisplayRate = {\n /**\n * Numerical rate to 4 decimal places. Only use when there is another indicator on the screen\n * for if the rate is inverted or not, such as a multiply/divide icon.\n */\n decimal: string;\n /**\n * Rate equation such as `1 ABC = 0.5743 DEF`. Use this whenever you need to display a rate\n * without much context.\n */\n equation: string;\n /**\n * If the rates given are given in the opposite direction to now the function was called.\n * For example if source was BRL and target was EUR, an inverted equation of\n * `1 EUR = 5.1233 BRL` may be returned.\n */\n inverted: boolean;\n};\n\n/**\n * Returns rates for displaying to customers.\n */\nexport default function getDisplayRate({\n rate,\n sourceCurrency,\n targetCurrency,\n locale,\n}: {\n rate: number;\n sourceCurrency: string;\n targetCurrency: string;\n locale: string;\n}): DisplayRate {\n const inverted = shouldInvertEquation(sourceCurrency, rate);\n\n const rawValue = inverted ? 1 / rate : rate;\n\n const leftHandSide = `1 ${inverted ? targetCurrency : sourceCurrency}`;\n const rightHandSide = `${formatRate(rawValue, locale)} ${\n inverted ? sourceCurrency : targetCurrency\n }`;\n\n return {\n decimal: formatRate(rawValue, locale),\n inverted,\n equation: `${leftHandSide} = ${rightHandSide}`,\n };\n}\n\nfunction shouldInvertEquation(sourceCurrency: string, rate: number): boolean {\n if (sourceCurrency === 'BRL' && rate <= 10) {\n // Prefer to show BRL inverted unless the rate would be below 0.1\n return true;\n }\n\n // Prefer not to show very low rates\n return rate < 0.1;\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\n\n/**\n * @deprecated use getDisplayRate\n */\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n }: { reference?: Reference; referenceMultiplier?: number; significantFigures?: number } = {},\n locale = DEFAULT_LOCALE,\n) {\n const response = {\n suggested: {},\n formats: {} as Record<string, any>,\n };\n\n response.formats.decimal = {\n output: formatNumberToSignificantDigits(rate, locale, significantFigures),\n significantFigures,\n };\n\n const equation = getRateEquation(rate, sourceCurrency, targetCurrency, {\n reference,\n referenceMultiplier,\n });\n\n response.formats.equation = {\n output: formatRateEquation(equation, { significantFigures }, locale),\n reference: equation.lhsCurrency === sourceCurrency ? 'source' : 'target',\n referenceMultiplier: equation.lhsValue,\n calculationInDecimal: formatNumberToSignificantDigits(\n equation.rhsValue,\n locale,\n significantFigures,\n ),\n };\n\n if (equation.lhsCurrency === sourceCurrency && equation.lhsValue === 1) {\n response.suggested = {\n format: 'decimal',\n output: response.formats.decimal.output,\n };\n } else {\n response.suggested = {\n format: 'equation',\n output: response.formats.equation.output,\n };\n }\n\n return response;\n}\n"],"names":["isSupported","isIntlNumberFormatSupported","locale","undefined","Intl","NumberFormat","supportedLocalesOf","length","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","options","cacheKey","Object","entries","getValidLocale","noUnderscoreLocale","replace","e","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","IDR","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","formatRate","rate","optionsOrLocale","formatRateInternal","significantFigures","fractionDigits","Math","min","max","floor","log10","value","fallback","formatNumberWithOptions","minimumFractionDigits","maximumFractionDigits","lhsCurrency","rhsValue","rhsCurrency","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","RON","THB","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","checkForLocaleSupport","isSelectedLocaleSupported","getSupportedLocale","getFallbackFormat","isUTC","timeZone","dateParts","day","push","getUTCDate","getDate","month","monthFormat","getUTCMonth","getMonth","getFormattedMonth","isMonthFirst","unshift","year","getUTCFullYear","joiningCharacter","getJoiningCharacter","fallbackDate","join","weekday","dayName","getUTCDay","getDay","TimeUnit","getTranslation","translationKey","params","translatedMessage","hasTranslation","translations","en","keys","forEach","key","RegExp","obj","getDifferenceIn","diff","timeUnitValue","millisecondsMap","HOUR","MINUTE","SECOND","ceil","formatTimeUnit","timeUnit","percentage","style","now","today","getFullYear","isToday","boundary","isWithinHours","shouldFormatRelative","formatSeconds","differenceInMinutes","formatRelative","formattedDate","formatAbsolute","sourceCurrency","targetCurrency","inverted","shouldInvertEquation","rawValue","leftHandSide","rightHandSide","decimal","equation","reference","referenceMultiplier","response","suggested","formats","output","Error","validateParameters","referenceConfig","indexOf","getRateEquation","formatRateEquation","calculationInDecimal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formatting.js","sources":["../src/number/feature-detection/intl.ts","../src/number/number.ts","../src/defaults/index.ts","../src/currency/currency.ts","../src/rate/formatRate.ts","../src/rate/formatRateEquation.ts","../src/rate/config.ts","../src/date/support-detection/intl.ts","../src/rate/getRateEquation.ts","../src/date/support-detection/selectedLocale.ts","../src/date/fallback-format/fallbackFormat.ts","../src/date/date.ts","../src/date/isToday.ts","../src/date/relative-date/relativeDateFormatter.ts","../src/translations/translator.ts","../src/percentage/percentage.ts","../src/rate/getDisplayRate.ts","../src/rate/getRateInAllFormats.ts"],"sourcesContent":["let isSupported: boolean | undefined;\n\n/**\n * Checks if Intl.NumberFormat is supported for a specific locale\n * @param {String} locale\n * @returns {Boolean}\n */\nexport function isIntlNumberFormatSupported(locale: string): boolean {\n if (isSupported === undefined) {\n isSupported =\n typeof Intl === 'object' &&\n Intl !== undefined &&\n typeof Intl.NumberFormat === 'function' &&\n Intl.NumberFormat &&\n typeof Intl.NumberFormat.supportedLocalesOf === 'function' &&\n Intl.NumberFormat.supportedLocalesOf &&\n Intl.NumberFormat.supportedLocalesOf(locale).length === 1;\n }\n return isSupported;\n}\n","import {\n DEFAULT_LOCALE,\n PRECISION,\n NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n PrecisionType,\n} from '../defaults';\nimport { isIntlNumberFormatSupported } from './feature-detection';\n\nconst { SIGNIFICANT_DIGITS, FRACTION_DIGITS } = PRECISION;\n\nconst formatters: Record<string, any> = {}; // cache, sample: { 'en-GB': formatter, 'en-GB2': formatter }\n\n/**\n * Returns a formatter for the specified locale and NumberFormatOptions\n * @param {String} locale\n * @param {Intl.NumberFormatOptions} options\n * @returns {Intl.NumberFormat}\n */\nfunction getFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const cacheKey = options ? `${locale}${Object.entries(options)}` : locale;\n if (!formatters[cacheKey]) {\n formatters[cacheKey] = options\n ? new Intl.NumberFormat(locale, options)\n : new Intl.NumberFormat(locale);\n }\n return formatters[cacheKey];\n}\n\n/**\n * Returns the desired options object for\n * `Number.toLocaleString` and `Intl.NumberFormat` methods\n * @param {Number} precision\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n */\nfunction getPrecisionOptions(precision: number, precisionType: PrecisionType) {\n return {\n [`minimum${precisionType}`]: precision,\n [`maximum${precisionType}`]: precision,\n };\n}\n\n/**\n * Returns the locale that was passed in if it works\n * with `toLocaleString` or otherwise falls back to `DEFAULT_LOCALE`\n * @param {String} locale\n */\nfunction getValidLocale(locale: string) {\n try {\n const noUnderscoreLocale = locale.replace(/_/, '-');\n\n Intl.NumberFormat(noUnderscoreLocale);\n return noUnderscoreLocale;\n } catch (e) {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Formats the number as a fallback for when `toLocaleString` method is not supported\n * by the browser. Will use `toFixed` to format `FractionDigits` precisionType and `toPrecision`\n * to format `SignificantDigits` precision type.\n * @param {Number} number\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nfunction formatNumberWithFallback(number: number, precision: number, precisionType: PrecisionType) {\n return precisionType === SIGNIFICANT_DIGITS.TYPE\n ? number.toPrecision(precision)\n : number.toFixed(precision);\n}\n\n/**\n * Formats a number to a significant number of digits with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {Number} significantDigits - this may be a value between 1 and 21, inclusive\n * @param {String} locale\n * @returns {String}\n */\nexport function formatNumberToSignificantDigits(\n number: number,\n locale = DEFAULT_LOCALE,\n significantDigits = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n) {\n return formatNumber(number, locale, significantDigits, SIGNIFICANT_DIGITS.TYPE);\n}\n\n/**\n * Formats a number precisely with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {String} locale\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nexport function formatNumber(\n number: number,\n locale = DEFAULT_LOCALE,\n precision?: number,\n precisionType: PrecisionType = 'FractionDigits',\n): string {\n if (!number && number !== 0) {\n return '';\n }\n\n if (typeof number === 'string' && Number(number)) {\n // eslint-disable-next-line no-param-reassign\n number = Number(number);\n }\n\n const { MIN_PRECISION, MAX_PRECISION } =\n precisionType === SIGNIFICANT_DIGITS.TYPE ? SIGNIFICANT_DIGITS : FRACTION_DIGITS;\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed#Parameters\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat#Parameters\n const isPrecisionValid =\n precision !== undefined &&\n precision !== null &&\n typeof precision === 'number' &&\n precision >= MIN_PRECISION &&\n precision <= MAX_PRECISION;\n\n const validatedLocale = getValidLocale(locale);\n\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return isPrecisionValid\n ? formatNumberWithFallback(number, precision!, precisionType)\n : `${number}`;\n }\n\n const formatter = isPrecisionValid\n ? getFormatter(validatedLocale, getPrecisionOptions(precision!, precisionType))\n : getFormatter(validatedLocale);\n\n return formatter.format(number);\n}\n\nexport function formatNumberWithOptions(\n value: number,\n options: Intl.NumberFormatOptions,\n locale: string,\n fallback: string,\n) {\n const validatedLocale = getValidLocale(locale);\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return fallback;\n }\n\n return getFormatter(validatedLocale, options).format(value);\n}\n","export const DEFAULT_LOCALE = 'en-GB';\nexport const DEFAULT_PRECISION_TYPE = 'FractionDigits';\nexport const NUMBER_OF_RATE_SIGNIFICANT_DIGITS = 6;\nexport const DEFAULT_RATE_MULTIPLIER = 1;\nexport const PRECISION = {\n SIGNIFICANT_DIGITS: {\n TYPE: 'SignificantDigits' as PrecisionType,\n MIN_PRECISION: 1,\n MAX_PRECISION: 21,\n },\n FRACTION_DIGITS: {\n TYPE: 'FractionDigits' as PrecisionType,\n MIN_PRECISION: 0,\n MAX_PRECISION: 20,\n },\n};\nexport type PrecisionType = 'SignificantDigits' | 'FractionDigits';\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumber } from '../number';\n\nconst currencyDecimals = {\n BIF: 0,\n BYR: 0,\n CLP: 0,\n DJF: 0,\n GNF: 0,\n IDR: 0,\n JPY: 0,\n KMF: 0,\n KRW: 0,\n MGA: 0,\n PYG: 0,\n RWF: 0,\n VND: 0,\n VUV: 0,\n XAF: 0,\n XOF: 0,\n XPF: 0,\n // technically HUF does have decimals, but due to the exchange rate banks\n // do not accept decimal amounts\n HUF: 0,\n UGX: 0,\n // local banks do not consistently support the ideal 2-decimal places fractional part\n KES: 0,\n\n BHD: 3,\n JOD: 3,\n KWD: 3,\n OMR: 3,\n TND: 3,\n};\n\nconst DEFAULT_CURRENCY_DECIMALS = 2;\n\nfunction getCurrencyDecimals(currency = '') {\n const upperCaseCurrency = currency.toUpperCase();\n if (Object.prototype.hasOwnProperty.call(currencyDecimals, upperCaseCurrency)) {\n return currencyDecimals[upperCaseCurrency as keyof typeof currencyDecimals];\n }\n return DEFAULT_CURRENCY_DECIMALS;\n}\n\nfunction amountHasNoDecimals(amount: number): boolean {\n return amount % 1 === 0;\n}\n\nfunction getPrecision(amount: number, currencyCode: string, alwaysShowDecimals: boolean): number {\n if (amountHasNoDecimals(amount) && !alwaysShowDecimals) {\n return 0;\n }\n\n return getCurrencyDecimals(currencyCode);\n}\n\nexport function formatAmount(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n): string {\n const availablePrecision = getPrecision(amount, currencyCode, options.alwaysShowDecimals);\n\n return formatNumber(amount, locale, availablePrecision);\n}\n\nexport function formatMoney(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n) {\n return `${formatAmount(amount, currencyCode, locale, options)} ${(\n currencyCode || ''\n ).toUpperCase()}`;\n}\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberWithOptions, formatNumberToSignificantDigits } from '../number';\n\nexport type FormatRateOptions = {\n significantFigures?: number;\n};\n\nfunction formatRate(rate: number, locale: string): string;\n/**\n * @deprecated Do not specify options, always specify a locale.\n */\nfunction formatRate(rate: number, options?: FormatRateOptions, locale?: string): string;\n\nfunction formatRate(\n rate: number,\n optionsOrLocale?: FormatRateOptions | string,\n locale?: string,\n): string {\n if (typeof optionsOrLocale === 'string') {\n return formatRateInternal(rate, optionsOrLocale);\n }\n\n const significantFigures = optionsOrLocale && optionsOrLocale.significantFigures;\n if (significantFigures) {\n return formatNumberToSignificantDigits(rate, locale || DEFAULT_LOCALE, significantFigures);\n }\n\n return formatRateInternal(rate, locale || DEFAULT_LOCALE);\n}\n\nfunction formatRateInternal(rate: number, locale: string) {\n // We lower the number of decimal places if the value is big, to minimun of 2\n const sizeAdjuster =\n // Upper bound 2\n Math.min(\n 2,\n // Low bound 0\n Math.max(\n 0,\n // Number of siginificant leading digits - 1\n Math.floor(Math.log10(rate)) - 1,\n ),\n );\n const fractionDigits = 4 - sizeAdjuster;\n\n return formatNumberWithOptions(\n rate,\n {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n },\n locale,\n rate.toFixed(fractionDigits),\n );\n}\n\nexport default formatRate;\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport { formatAmount } from '../currency';\n\nexport default function(\n {\n lhsValue,\n lhsCurrency,\n rhsValue,\n rhsCurrency,\n }: { lhsValue: number; lhsCurrency: string; rhsValue: number; rhsCurrency: string },\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return `${formatAmount(\n lhsValue,\n lhsCurrency,\n locale,\n )} ${lhsCurrency} = ${formatNumberToSignificantDigits(\n rhsValue,\n locale,\n significantFigures,\n )} ${rhsCurrency}`;\n}\n","export default {\n BRL: {\n hasInversionEnabled: true,\n },\n INR: {\n hasInversionEnabled: true,\n },\n JPY: {\n hasInversionEnabled: true,\n },\n IDR: {\n hasInversionEnabled: true\n },\n HUF: {\n hasInversionEnabled: true,\n },\n RON: {\n hasInversionEnabled: true,\n },\n THB: {\n hasInversionEnabled: true,\n },\n} as Record<string, { hasInversionEnabled?: boolean; multiplierForEquation?: number }>;\n","import { DEFAULT_LOCALE } from '../../defaults';\n\nlet intlSupported: boolean | undefined; // cache\n\nexport function isIntlSupported(): boolean {\n if (intlSupported === undefined) {\n intlSupported = intlDateTimeFormatReturnsCorrectValue();\n }\n return intlSupported;\n}\n\nfunction intlDateTimeFormatReturnsCorrectValue(): boolean {\n try {\n const date = new Date(2018, 11, 1);\n const dateString = new Intl.DateTimeFormat(DEFAULT_LOCALE).format(date);\n return dateString === '01/12/2018';\n } catch (e) {\n return false;\n }\n}\n","import config from './config';\nimport { DEFAULT_RATE_MULTIPLIER } from '../defaults';\n\nexport type Reference = 'auto' | 'source' | 'target';\n\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n }: { reference?: Reference; referenceMultiplier?: number } = {},\n) {\n validateParameters();\n\n if (shouldInvertEquation(reference, sourceCurrency)) {\n return {\n // inverted.\n lhsCurrency: targetCurrency,\n lhsValue: getMultiplier(referenceMultiplier, targetCurrency),\n rhsCurrency: sourceCurrency,\n rhsValue: getMultiplier(referenceMultiplier, targetCurrency) / rate,\n };\n }\n return {\n // normal.\n lhsCurrency: sourceCurrency,\n lhsValue: getMultiplier(referenceMultiplier, sourceCurrency),\n rhsCurrency: targetCurrency,\n rhsValue: rate * getMultiplier(referenceMultiplier, sourceCurrency),\n };\n\n function validateParameters(): void {\n if (!rate) throw new Error(`rate parameter is mandatory (got ${rate} instead).`);\n if (!sourceCurrency)\n throw new Error(`sourceCurrency parameter is mandatory (got ${sourceCurrency} instead).`);\n if (!targetCurrency)\n throw new Error(`targetCurrency parameter is mandatory (got ${targetCurrency} instead).`);\n if (referenceMultiplier && typeof referenceMultiplier !== 'number') {\n throw new Error(\n `referenceMultiplier must be a number (got ${typeof referenceMultiplier} ${referenceMultiplier} instead)`,\n );\n }\n // Let shouldInvertEquation() handle `reference`.\n }\n}\n\nfunction shouldInvertEquation(referenceConfig: Reference, sourceCurrency: string): boolean {\n if (referenceConfig === 'source') return false;\n if (referenceConfig === 'target') return true;\n if (['auto', undefined, null].indexOf(referenceConfig) > -1)\n return !!(config[sourceCurrency] || {}).hasInversionEnabled;\n throw new Error(\n `Unrecognized reference config value: ${referenceConfig} (valid values are auto, source, target).`,\n );\n}\n\nfunction getMultiplier(\n referenceMultiplierOverride: number | undefined,\n lhsCurrency: string,\n): number {\n return (\n referenceMultiplierOverride ||\n (config[lhsCurrency] || {}).multiplierForEquation ||\n DEFAULT_RATE_MULTIPLIER\n );\n}\n","const supportedLocales: Record<string, boolean> = {}; // cache\n\nexport function isSelectedLocaleSupported(locale: string): boolean {\n if (supportedLocales[locale] === undefined) {\n supportedLocales[locale] = checkForLocaleSupport(locale);\n }\n return supportedLocales[locale];\n}\n\nfunction checkForLocaleSupport(locale: string): boolean {\n try {\n return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;\n } catch (e) {\n return false;\n }\n}\n","const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst SHORT_MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nfunction getJoiningCharacter(options: Intl.DateTimeFormatOptions): string {\n return options.month === 'short' ? ' ' : '/';\n}\n\nfunction isMonthFirst(options: Intl.DateTimeFormatOptions) {\n return options.month === 'short';\n}\n\nfunction getFormattedMonth(\n options: Intl.DateTimeFormatOptions,\n isUTC: boolean,\n date: Date,\n): string | number {\n if (options.month === 'short') {\n return SHORT_MONTHS[isUTC ? date.getUTCMonth() : date.getMonth()];\n }\n return (isUTC ? date.getUTCMonth() : date.getMonth()) + 1;\n}\n\n// Sample outputs: 'Sat, 1/12/2018', '1/12/2018', '12/2018', Sat, 1'\nexport function getFallbackFormat(date: Date, options: Intl.DateTimeFormatOptions = {}): string {\n const isUTC = options.timeZone === 'UTC';\n\n const dateParts = [];\n if (options.day) dateParts.push(isUTC ? date.getUTCDate() : date.getDate());\n if (options.month) {\n const monthFormat = getFormattedMonth(options, isUTC, date);\n if (isMonthFirst(options)) {\n dateParts.unshift(monthFormat);\n } else {\n dateParts.push(monthFormat);\n }\n }\n if (options.year) dateParts.push(isUTC ? date.getUTCFullYear() : date.getUTCFullYear());\n\n const joiningCharacter = getJoiningCharacter(options);\n let fallbackDate = dateParts.join(joiningCharacter);\n\n if (options.weekday) {\n const dayName = WEEKDAYS[isUTC ? date.getUTCDay() : date.getDay()];\n fallbackDate = fallbackDate ? `${dayName}, ${fallbackDate}` : dayName;\n }\n return (\n fallbackDate ||\n getFallbackFormat(date, {\n timeZone: options.timeZone,\n day: 'true',\n month: 'true',\n year: 'true',\n })\n );\n}\n","import { isIntlSupported, isSelectedLocaleSupported } from './support-detection';\nimport { getFallbackFormat } from './fallback-format';\nimport { DEFAULT_LOCALE } from '../defaults';\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? new Intl.DateTimeFormat(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n","export default (date: Date): boolean => {\n const today = new Date(Date.now());\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n","import isToday from '../isToday';\nimport { formatDate } from '../date';\nimport { getTranslation } from '../../translations/translator';\nimport { DEFAULT_LOCALE } from '../../defaults';\n\nexport function formatRelativeDate(date: Date, locale = DEFAULT_LOCALE): string {\n if (date < new Date(Date.now())) {\n return '';\n }\n\n let formatted;\n if (shouldFormatRelative(date)) {\n formatted = formatRelative(date, locale);\n } else {\n formatted = formatAbsolute(date, locale);\n }\n return formatted;\n}\n\nfunction shouldFormatRelative(date: Date): boolean {\n return isToday(date) && isWithinHours(date, 12);\n}\n\nfunction isWithinHours(date: Date, boundary: number): boolean {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n return getDifferenceIn(diff, TimeUnit.HOUR) <= boundary;\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n\n if (getDifferenceIn(diff, TimeUnit.SECOND) < 60) {\n return formatSeconds(locale);\n }\n\n const differenceInMinutes = getDifferenceIn(diff, TimeUnit.MINUTE);\n if (differenceInMinutes < 60) {\n return formatTimeUnit(differenceInMinutes, locale, TimeUnit.MINUTE);\n }\n\n return formatTimeUnit(getDifferenceIn(diff, TimeUnit.HOUR), locale, TimeUnit.HOUR);\n}\n\nfunction formatAbsolute(date: Date, locale: string): string {\n const params = {\n formattedDate: formatDate(date, locale, { month: 'short', day: 'numeric' }),\n };\n return getTranslation('relative-format-by', params, locale);\n}\n\nfunction getDifferenceIn(diff: number, timeUnitValue: TimeUnit): number {\n const millisecondsMap = {\n [TimeUnit.HOUR]: 3600000,\n [TimeUnit.MINUTE]: 60000,\n [TimeUnit.SECOND]: 1000,\n };\n return Math.ceil(diff / millisecondsMap[timeUnitValue]);\n}\n\nfunction formatTimeUnit(value: number, locale: string, timeUnit: string): string {\n if (value === 1) {\n return getTranslation(`relative-format-in-${timeUnit}`, {}, locale);\n }\n return getTranslation(\n `relative-format-in-${timeUnit}s`,\n { [`${timeUnit}s`]: `${value}` },\n locale,\n );\n}\n\nfunction formatSeconds(locale: string) {\n return getTranslation('relative-format-in-seconds', {}, locale);\n}\n\nenum TimeUnit {\n SECOND = 'second',\n MINUTE = 'minute',\n HOUR = 'hour',\n}\n","// eslint-disable-next-line import/no-unresolved\nimport translations from './translations.json';\n\nexport function getTranslation(\n translationKey: string,\n params: Record<string, string> = {},\n locale: string,\n): string {\n let translatedMessage: string | undefined;\n if (hasTranslation(locale, translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>)[locale][\n translationKey\n ];\n } else if (hasTranslation('en', translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>).en[translationKey];\n } else {\n translatedMessage = translationKey;\n }\n\n if (translatedMessage && params) {\n Object.keys(params).forEach(key => {\n translatedMessage = (translatedMessage as string).replace(\n new RegExp(`{${key}}`, 'g'),\n params[key],\n );\n });\n }\n\n return translatedMessage || translationKey;\n}\n\nfunction hasTranslation(locale: string, translationKey: string): boolean {\n return (\n hasOwnProperty(translations, locale) &&\n hasOwnProperty((translations as Record<string, Record<string, string>>)[locale], translationKey)\n );\n}\n\nfunction hasOwnProperty(obj: any, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n","export const formatPercentage= (percentage: number, locale = 'en-GB'): string =>\n Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(percentage);\n\n\n","import formatRate from './formatRate';\n\nexport type DisplayRate = {\n /**\n * Numerical rate to 4 decimal places. Only use when there is another indicator on the screen\n * for if the rate is inverted or not, such as a multiply/divide icon.\n */\n decimal: string;\n /**\n * Rate equation such as `1 ABC = 0.5743 DEF`. Use this whenever you need to display a rate\n * without much context.\n */\n equation: string;\n /**\n * If the rates given are given in the opposite direction to now the function was called.\n * For example if source was BRL and target was EUR, an inverted equation of\n * `1 EUR = 5.1233 BRL` may be returned.\n */\n inverted: boolean;\n};\n\n/**\n * Returns rates for displaying to customers.\n */\nexport default function getDisplayRate({\n rate,\n sourceCurrency,\n targetCurrency,\n locale,\n}: {\n rate: number;\n sourceCurrency: string;\n targetCurrency: string;\n locale: string;\n}): DisplayRate {\n const inverted = shouldInvertEquation(sourceCurrency, rate);\n\n const rawValue = inverted ? 1 / rate : rate;\n\n const leftHandSide = `1 ${inverted ? targetCurrency : sourceCurrency}`;\n const rightHandSide = `${formatRate(rawValue, locale)} ${\n inverted ? sourceCurrency : targetCurrency\n }`;\n\n return {\n decimal: formatRate(rawValue, locale),\n inverted,\n equation: `${leftHandSide} = ${rightHandSide}`,\n };\n}\n\nfunction shouldInvertEquation(sourceCurrency: string, rate: number): boolean {\n if (sourceCurrency === 'BRL' && rate <= 10) {\n // Prefer to show BRL inverted unless the rate would be below 0.1\n return true;\n }\n\n // Prefer not to show very low rates\n return rate < 0.1;\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\n\n/**\n * @deprecated use getDisplayRate\n */\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n }: { reference?: Reference; referenceMultiplier?: number; significantFigures?: number } = {},\n locale = DEFAULT_LOCALE,\n) {\n const response = {\n suggested: {},\n formats: {} as Record<string, any>,\n };\n\n response.formats.decimal = {\n output: formatNumberToSignificantDigits(rate, locale, significantFigures),\n significantFigures,\n };\n\n const equation = getRateEquation(rate, sourceCurrency, targetCurrency, {\n reference,\n referenceMultiplier,\n });\n\n response.formats.equation = {\n output: formatRateEquation(equation, { significantFigures }, locale),\n reference: equation.lhsCurrency === sourceCurrency ? 'source' : 'target',\n referenceMultiplier: equation.lhsValue,\n calculationInDecimal: formatNumberToSignificantDigits(\n equation.rhsValue,\n locale,\n significantFigures,\n ),\n };\n\n if (equation.lhsCurrency === sourceCurrency && equation.lhsValue === 1) {\n response.suggested = {\n format: 'decimal',\n output: response.formats.decimal.output,\n };\n } else {\n response.suggested = {\n format: 'equation',\n output: response.formats.equation.output,\n };\n }\n\n return response;\n}\n"],"names":["isSupported","isIntlNumberFormatSupported","locale","undefined","Intl","NumberFormat","supportedLocalesOf","length","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","options","cacheKey","Object","entries","getValidLocale","noUnderscoreLocale","replace","e","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","IDR","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","formatRate","rate","optionsOrLocale","formatRateInternal","significantFigures","fractionDigits","Math","min","max","floor","log10","value","fallback","formatNumberWithOptions","minimumFractionDigits","maximumFractionDigits","lhsCurrency","rhsValue","rhsCurrency","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","RON","THB","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","checkForLocaleSupport","isSelectedLocaleSupported","getSupportedLocale","getFallbackFormat","isUTC","timeZone","dateParts","day","push","getUTCDate","getDate","month","monthFormat","getUTCMonth","getMonth","getFormattedMonth","isMonthFirst","unshift","year","getUTCFullYear","joiningCharacter","getJoiningCharacter","fallbackDate","join","weekday","dayName","getUTCDay","getDay","TimeUnit","getTranslation","translationKey","params","translatedMessage","hasTranslation","translations","en","keys","forEach","key","RegExp","obj","getDifferenceIn","diff","timeUnitValue","millisecondsMap","HOUR","MINUTE","SECOND","ceil","formatTimeUnit","timeUnit","percentage","style","now","today","getFullYear","isToday","boundary","isWithinHours","shouldFormatRelative","formatSeconds","differenceInMinutes","formatRelative","formattedDate","formatAbsolute","sourceCurrency","targetCurrency","inverted","shouldInvertEquation","rawValue","leftHandSide","rightHandSide","decimal","equation","reference","referenceMultiplier","response","suggested","formats","output","Error","validateParameters","referenceConfig","indexOf","getRateEquation","formatRateEquation","calculationInDecimal"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e;function t(t){return void 0===e&&(e="object"==typeof Intl&&void 0!==Intl&&"function"==typeof Intl.NumberFormat&&Intl.NumberFormat&&"function"==typeof Intl.NumberFormat.supportedLocalesOf&&Intl.NumberFormat.supportedLocalesOf&&1===Intl.NumberFormat.supportedLocalesOf(t).length),e}const{SIGNIFICANT_DIGITS:r,FRACTION_DIGITS:n}={SIGNIFICANT_DIGITS:{TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},FRACTION_DIGITS:{TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20}},i={};function a(e,t){const r=t?`${e}${Object.entries(t)}`:e;return i[r]||(i[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),i[r]}function o(e){try{const t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}function u(e,t="en-GB",n=6){return m(e,t,n,r.TYPE)}function m(e,i="en-GB",u,m="FractionDigits"){if(!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));const{MIN_PRECISION:s,MAX_PRECISION:l}=m===r.TYPE?r:n,f=null!=u&&"number"==typeof u&&u>=s&&u<=l,c=o(i);return t(c)?(f?a(c,function(e,t){return{["minimum"+t]:e,["maximum"+t]:e}}(u,m)):a(c)).format(e):f?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(e,u,m):""+e}const s={BIF:0,BYR:0,CLP:0,DJF:0,GNF:0,IDR:0,JPY:0,KMF:0,KRW:0,MGA:0,PYG:0,RWF:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,HUF:0,UGX:0,KES:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};function l(e,t,r="en-GB",n={alwaysShowDecimals:!1}){return m(e,r,function(e,t,r){return function(e){return e%1==0}(e)&&!r?0:function(e=""){const t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(s,t)?s[t]:2}(t)}(e,t,n.alwaysShowDecimals))}function f(e,t,r="en-GB",n={alwaysShowDecimals:!1}){return`${l(e,t,r,n)} ${(t||"").toUpperCase()}`}function c(e,t,r){if("string"==typeof t)return h(e,t);const n=t&&t.significantFigures;return n?u(e,r||"en-GB",n):h(e,r||"en-GB")}function h(e,r){const n=4-Math.min(2,Math.max(0,Math.floor(Math.log10(e))-1));return function(e,r,n,i){const u=o(n);return t(u)?a(u,r).format(e):i}(e,{minimumFractionDigits:n,maximumFractionDigits:n},r,e.toFixed(n))}function v({lhsValue:e,lhsCurrency:t,rhsValue:r,rhsCurrency:n},{significantFigures:i=6}={},a="en-GB"){return`${l(e,t,a)} ${t} = ${u(r,a,i)} ${n}`}var d={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0},THB:{hasInversionEnabled:!0}};function y(e,t){return e||(d[t]||{}).multiplierForEquation||1}function g(e,t,r,{reference:n="auto",referenceMultiplier:i,significantFigures:a=6}={},o="en-GB"){const m={suggested:{},formats:{}};m.formats.decimal={output:u(e,o,a),significantFigures:a};const s=function(e,t,r,{reference:n="auto",referenceMultiplier:i}={}){return function(){if(!e)throw new Error(`rate parameter is mandatory (got ${e} instead).`);if(!t)throw new Error(`sourceCurrency parameter is mandatory (got ${t} instead).`);if(!r)throw new Error(`targetCurrency parameter is mandatory (got ${r} instead).`);if(i&&"number"!=typeof i)throw new Error(`referenceMultiplier must be a number (got ${typeof i} ${i} instead)`)}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(d[t]||{}).hasInversionEnabled;throw new Error(`Unrecognized reference config value: ${e} (valid values are auto, source, target).`)}(n,t)?{lhsCurrency:r,lhsValue:y(i,r),rhsCurrency:t,rhsValue:y(i,r)/e}:{lhsCurrency:t,lhsValue:y(i,t),rhsCurrency:r,rhsValue:e*y(i,t)}}(e,t,r,{reference:n,referenceMultiplier:i});return m.formats.equation={output:v(s,{significantFigures:a},o),reference:s.lhsCurrency===t?"source":"target",referenceMultiplier:s.lhsValue,calculationInDecimal:u(s.rhsValue,o,a)},m.suggested=s.lhsCurrency===t&&1===s.lhsValue?{format:"decimal",output:m.formats.decimal.output}:{format:"equation",output:m.formats.equation.output},m}function D({rate:e,sourceCurrency:t,targetCurrency:r,locale:n}){const i=function(e,t){return"BRL"===e&&t<=10||t<.1}(t,e),a=i?1/e:e,o="1 "+(i?r:t),u=`${c(a,n)} ${i?t:r}`;return{decimal:c(a,n),inverted:i,equation:`${o} = ${u}`}}const I=(e,t="en-GB")=>Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:2}).format(e);let b;const p={},F=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],N=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function w(e,t="en-GB",r){return void 0===b&&(b=function(){try{const e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),b?new Intl.DateTimeFormat(function(e){return function(e){return void 0===p[e]&&(p[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),p[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r={}){const n="UTC"===r.timeZone,i=[];if(r.day&&i.push(n?t.getUTCDate():t.getDate()),r.month){const e=function(e,t,r){return"short"===e.month?N[t?r.getUTCMonth():r.getMonth()]:(t?r.getUTCMonth():r.getMonth())+1}(r,n,t);!function(e){return"short"===e.month}(r)?i.push(e):i.unshift(e)}r.year&&i.push(t.getUTCFullYear());const a=function(e){return"short"===e.month?" ":"/"}(r);let o=i.join(a);if(r.weekday){const e=F[n?t.getUTCDay():t.getDay()];o=o?`${e}, ${o}`:e}return o||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var C,E={cs:{"relative-format-in-seconds":"během pár vteřin","relative-format-in-minutes":"v {minutes} minutách","relative-format-in-hours":"v {hours} hodinách","relative-format-in-minute":"během 1 minuty","relative-format-in-hour":"během 1 hodiny","relative-format-by":"do {formattedDate}"},de:{"relative-format-in-seconds":"in Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in 1 Minute","relative-format-in-hour":"in 1 Stunde","relative-format-by":"bis {formattedDate}"},en:{"relative-format-in-seconds":"in seconds","relative-format-in-minutes":"in {minutes} minutes","relative-format-in-hours":"in {hours} hours","relative-format-in-minute":"in 1 minute","relative-format-in-hour":"in 1 hour","relative-format-by":"by {formattedDate}"},es:{"relative-format-in-seconds":"en segundos","relative-format-in-minutes":"en {minutes} minutos","relative-format-in-hours":"en {hours} horas","relative-format-in-minute":"en 1 minuto","relative-format-in-hour":"en 1 hora","relative-format-by":"antes del {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"en {hours} heures","relative-format-in-minute":"en 1 minute","relative-format-in-hour":"en 1 heure","relative-format-by":"d'ici au {formattedDate}"},hu:{"relative-format-in-seconds":"másodpercek alatt","relative-format-in-minutes":"{minutes} percen belül","relative-format-in-hours":"{hours} órán belül","relative-format-in-minute":"1 percen belül","relative-format-in-hour":"1 órán belül","relative-format-by":"ekkor: {formattedDate}"},id:{"relative-format-in-seconds":"dalam beberapa detik","relative-format-in-minutes":"dalam {minutes} menit","relative-format-in-hours":"dalam {hours} jam","relative-format-in-minute":"dalam 1 menit","relative-format-in-hour":"dalam 1 jam","relative-format-by":"sebelum {formattedDate}"},it:{"relative-format-in-seconds":"tra qualche secondo","relative-format-in-minutes":"tra {minutes} minuti","relative-format-in-hours":"tra {hours} ore","relative-format-in-minute":"in 1 minuto","relative-format-in-hour":"in 1 ora","relative-format-by":"entro il {formattedDate}"},ja:{"relative-format-in-seconds":"数秒","relative-format-in-minutes":"{minutes}分以内","relative-format-in-hours":"{hours}時間以内","relative-format-in-minute":"1分以内","relative-format-in-hour":"1時間以内","relative-format-by":"{formattedDate}まで"},pl:{"relative-format-in-seconds":"w ciągu kilku sekund","relative-format-in-minutes":"w ciągu {minutes} minut","relative-format-in-hours":"w ciągu {hours} godzin","relative-format-in-minute":"w ciągu 1 minuty","relative-format-in-hour":"w ciągu 1 godziny","relative-format-by":"do {formattedDate}"},pt:{"relative-format-in-seconds":"em segundos","relative-format-in-minutes":"em {minutes} minutos","relative-format-in-hours":"em {hours} horas","relative-format-in-minute":"em 1 minuto","relative-format-in-hour":"em 1 hora","relative-format-by":"até {formattedDate}"},ro:{"relative-format-in-seconds":"în câteva secunde","relative-format-in-minutes":"în {minutes} minute","relative-format-in-hours":"în {hours} ore","relative-format-in-minute":"în 1 minut","relative-format-in-hour":"în 1 oră","relative-format-by":"până pe {formattedDate}"},ru:{"relative-format-in-seconds":"через несколько секунд","relative-format-in-minutes":"через {minutes} мин.","relative-format-in-hours":"через {hours} ч.","relative-format-in-minute":"через минуту","relative-format-in-hour":"через 1 час","relative-format-by":"{formattedDate}"},th:{"relative-format-in-seconds":"ในไม่กี่วินาที","relative-format-in-minutes":"ใน {minutes} นาที","relative-format-in-hours":"ใน {hours} ชั่วโมง","relative-format-in-minute":"ใน 1 นาที","relative-format-in-hour":"ใน 1 ชั่วโมง","relative-format-by":"ภายใน {formattedDate}"},tr:{"relative-format-in-seconds":"saniyeler içinde","relative-format-in-minutes":"{minutes} dakika içinde","relative-format-in-hours":"{hours} saat içinde","relative-format-in-minute":"1 dakika içinde","relative-format-in-hour":"1 saat içinde","relative-format-by":"{formattedDate} itibarıyla"},uk:{"relative-format-in-seconds":"через кілька секунд","relative-format-in-minutes":"через {minutes} хв","relative-format-in-hours":"через {hours} год","relative-format-in-minute":"через 1 хвилину","relative-format-in-hour":"через 1 годину","relative-format-by":"до {formattedDate}"},"zh-CN":{"relative-format-in-seconds":"数秒内","relative-format-in-minutes":"{minutes} 分钟内","relative-format-in-hours":"{hours} 小时内","relative-format-in-minute":"1 分钟内","relative-format-in-hour":"1 小时内","relative-format-by":"{formattedDate} 前"},"zh-HK":{"relative-format-in-seconds":"數秒內","relative-format-in-minutes":"在{minutes}分鐘內","relative-format-in-hours":"在{hours}小時內","relative-format-in-minute":"在1分鐘內","relative-format-in-hour":"在1小時內","relative-format-by":"在{formattedDate}或之前"}};function M(e,t={},r){let n;return n=O(r,e)?E[r][e]:O("en",e)?E.en[e]:e,n&&t&&Object.keys(t).forEach(e=>{n=n.replace(new RegExp(`{${e}}`,"g"),t[e])}),n||e}function O(e,t){return T(E,e)&&T(E[e],t)}function T(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function S(e,t="en-GB"){if(e<new Date(Date.now()))return"";let r;return r=function(e){return(e=>{const t=new Date(Date.now());return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()})(e)&&function(e,t){return G(e-new Date(Date.now()),C.HOUR)<=12}(e)}(e)?function(e,t){const r=e-new Date(Date.now());if(G(r,C.SECOND)<60)return function(e){return M("relative-format-in-seconds",{},e)}(t);const n=G(r,C.MINUTE);return n<60?R(n,t,C.MINUTE):R(G(r,C.HOUR),t,C.HOUR)}(e,t):function(e,t){return M("relative-format-by",{formattedDate:w(e,t,{month:"short",day:"numeric"})},t)}(e,t),r}function G(e,t){return Math.ceil(e/{[C.HOUR]:36e5,[C.MINUTE]:6e4,[C.SECOND]:1e3}[t])}function R(e,t,r){return 1===e?M("relative-format-in-"+r,{},t):M(`relative-format-in-${r}s`,{[r+"s"]:""+e},t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(C||(C={}));export{l as formatAmount,w as formatDate,f as formatMoney,m as formatNumber,u as formatNumberToSignificantDigits,I as formatPercentage,c as formatRate,S as formatRelativeDate,D as getDisplayRate,g as getRateInAllFormats};
|
|
1
|
+
let e;function t(t){return void 0===e&&(e="object"==typeof Intl&&void 0!==Intl&&"function"==typeof Intl.NumberFormat&&Intl.NumberFormat&&"function"==typeof Intl.NumberFormat.supportedLocalesOf&&Intl.NumberFormat.supportedLocalesOf&&1===Intl.NumberFormat.supportedLocalesOf(t).length),e}const{SIGNIFICANT_DIGITS:r,FRACTION_DIGITS:n}={SIGNIFICANT_DIGITS:{TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},FRACTION_DIGITS:{TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20}},i={};function a(e,t){const r=t?`${e}${Object.entries(t)}`:e;return i[r]||(i[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),i[r]}function o(e){try{const t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}function u(e,t="en-GB",n=6){return m(e,t,n,r.TYPE)}function m(e,i="en-GB",u,m="FractionDigits"){if(!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));const{MIN_PRECISION:s,MAX_PRECISION:f}=m===r.TYPE?r:n,l=null!=u&&"number"==typeof u&&u>=s&&u<=f,c=o(i);return t(c)?(l?a(c,function(e,t){return{["minimum"+t]:e,["maximum"+t]:e}}(u,m)):a(c)).format(e):l?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(e,u,m):""+e}const s={BIF:0,BYR:0,CLP:0,DJF:0,GNF:0,IDR:0,JPY:0,KMF:0,KRW:0,MGA:0,PYG:0,RWF:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,HUF:0,UGX:0,KES:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};function f(e,t,r="en-GB",n={alwaysShowDecimals:!1}){return m(e,r,function(e,t,r){return function(e){return e%1==0}(e)&&!r?0:function(e=""){const t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(s,t)?s[t]:2}(t)}(e,t,n.alwaysShowDecimals))}function l(e,t,r="en-GB",n={alwaysShowDecimals:!1}){return`${f(e,t,r,n)} ${(t||"").toUpperCase()}`}function c(e,t,r){if("string"==typeof t)return v(e,t);const n=t&&t.significantFigures;return n?u(e,r||"en-GB",n):v(e,r||"en-GB")}function v(e,r){const n=4-Math.min(2,Math.max(0,Math.floor(Math.log10(e))-1));return function(e,r,n,i){const u=o(n);return t(u)?a(u,r).format(e):i}(e,{minimumFractionDigits:n,maximumFractionDigits:n},r,e.toFixed(n))}function h({lhsValue:e,lhsCurrency:t,rhsValue:r,rhsCurrency:n},{significantFigures:i=6}={},a="en-GB"){return`${f(e,t,a)} ${t} = ${u(r,a,i)} ${n}`}var d={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0},THB:{hasInversionEnabled:!0}};function y(e,t){return e||(d[t]||{}).multiplierForEquation||1}function b(e,t,r,{reference:n="auto",referenceMultiplier:i,significantFigures:a=6}={},o="en-GB"){const m={suggested:{},formats:{}};m.formats.decimal={output:u(e,o,a),significantFigures:a};const s=function(e,t,r,{reference:n="auto",referenceMultiplier:i}={}){return function(){if(!e)throw new Error(`rate parameter is mandatory (got ${e} instead).`);if(!t)throw new Error(`sourceCurrency parameter is mandatory (got ${t} instead).`);if(!r)throw new Error(`targetCurrency parameter is mandatory (got ${r} instead).`);if(i&&"number"!=typeof i)throw new Error(`referenceMultiplier must be a number (got ${typeof i} ${i} instead)`)}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(d[t]||{}).hasInversionEnabled;throw new Error(`Unrecognized reference config value: ${e} (valid values are auto, source, target).`)}(n,t)?{lhsCurrency:r,lhsValue:y(i,r),rhsCurrency:t,rhsValue:y(i,r)/e}:{lhsCurrency:t,lhsValue:y(i,t),rhsCurrency:r,rhsValue:e*y(i,t)}}(e,t,r,{reference:n,referenceMultiplier:i});return m.formats.equation={output:h(s,{significantFigures:a},o),reference:s.lhsCurrency===t?"source":"target",referenceMultiplier:s.lhsValue,calculationInDecimal:u(s.rhsValue,o,a)},m.suggested=s.lhsCurrency===t&&1===s.lhsValue?{format:"decimal",output:m.formats.decimal.output}:{format:"equation",output:m.formats.equation.output},m}function D({rate:e,sourceCurrency:t,targetCurrency:r,locale:n}){const i=function(e,t){return"BRL"===e&&t<=10||t<.1}(t,e),a=i?1/e:e,o="1 "+(i?r:t),u=`${c(a,n)} ${i?t:r}`;return{decimal:c(a,n),inverted:i,equation:`${o} = ${u}`}}const g=(e,t="en-GB")=>Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:2}).format(e);let I;const p={},F=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],N=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function w(e,t="en-GB",r){return void 0===I&&(I=function(){try{const e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),I?new Intl.DateTimeFormat(function(e){return function(e){return void 0===p[e]&&(p[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),p[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r={}){const n="UTC"===r.timeZone,i=[];if(r.day&&i.push(n?t.getUTCDate():t.getDate()),r.month){const e=function(e,t,r){return"short"===e.month?N[t?r.getUTCMonth():r.getMonth()]:(t?r.getUTCMonth():r.getMonth())+1}(r,n,t);!function(e){return"short"===e.month}(r)?i.push(e):i.unshift(e)}r.year&&i.push(t.getUTCFullYear());const a=function(e){return"short"===e.month?" ":"/"}(r);let o=i.join(a);if(r.weekday){const e=F[n?t.getUTCDay():t.getDay()];o=o?`${e}, ${o}`:e}return o||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var C,E={cs:{"relative-format-in-seconds":"během pár sekund","relative-format-in-minutes":"během {minutes} min.","relative-format-in-hours":"během {hours} hod.","relative-format-in-minute":"během 1 minuty","relative-format-in-hour":"během 1 hodiny","relative-format-by":"do {formattedDate}"},da:{"relative-format-in-seconds":"om sekunder","relative-format-in-minutes":"om {minutes} minutter","relative-format-in-hours":"om {hours} timer","relative-format-in-minute":"om 1 minut","relative-format-in-hour":"om 1 time","relative-format-by":"inden {formattedDate}"},de:{"relative-format-in-seconds":"in Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in 1 Minute","relative-format-in-hour":"in 1 Stunde","relative-format-by":"bis {formattedDate}"},en:{"relative-format-in-seconds":"in seconds","relative-format-in-minutes":"in {minutes} minutes","relative-format-in-hours":"in {hours} hours","relative-format-in-minute":"in 1 minute","relative-format-in-hour":"in 1 hour","relative-format-by":"by {formattedDate}"},es:{"relative-format-in-seconds":"en segundos","relative-format-in-minutes":"en {minutes} minutos","relative-format-in-hours":"en {hours} horas","relative-format-in-minute":"en 1 minuto","relative-format-in-hour":"en 1 hora","relative-format-by":"antes del {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"en {hours} heures","relative-format-in-minute":"en 1 minute","relative-format-in-hour":"en 1 heure","relative-format-by":"d'ici au {formattedDate}"},hu:{"relative-format-in-seconds":"másodpercek alatt","relative-format-in-minutes":"{minutes} percen belül","relative-format-in-hours":"{hours} órán belül","relative-format-in-minute":"1 percen belül","relative-format-in-hour":"1 órán belül","relative-format-by":"ekkor: {formattedDate}"},id:{"relative-format-in-seconds":"dalam beberapa detik","relative-format-in-minutes":"dalam {minutes} menit","relative-format-in-hours":"dalam {hours} jam","relative-format-in-minute":"dalam 1 menit","relative-format-in-hour":"dalam 1 jam","relative-format-by":"sebelum {formattedDate}"},it:{"relative-format-in-seconds":"tra qualche secondo","relative-format-in-minutes":"tra {minutes} minuti","relative-format-in-hours":"tra {hours} ore","relative-format-in-minute":"in 1 minuto","relative-format-in-hour":"in 1 ora","relative-format-by":"entro il {formattedDate}"},ja:{"relative-format-in-seconds":"数秒","relative-format-in-minutes":"{minutes}分以内","relative-format-in-hours":"{hours}時間以内","relative-format-in-minute":"1分以内","relative-format-in-hour":"1時間以内","relative-format-by":"{formattedDate}まで"},nb:{"relative-format-in-seconds":"om noen sekunder","relative-format-in-minutes":"om {minutes} minutter","relative-format-in-hours":"om {hours} timer","relative-format-in-minute":"om 1 minutt","relative-format-in-hour":"om 1 time","relative-format-by":"innen {formattedDate}"},nl:{"relative-format-in-seconds":"over enkele seconden","relative-format-in-minutes":"over {minutes} minuten","relative-format-in-hours":"over {hours} uur","relative-format-in-minute":"over 1 minuut","relative-format-in-hour":"over 1 uur","relative-format-by":"voor {formattedDate}"},pl:{"relative-format-in-seconds":"w ciągu kilku sekund","relative-format-in-minutes":"w ciągu {minutes} minut","relative-format-in-hours":"w ciągu {hours} godzin","relative-format-in-minute":"w ciągu 1 minuty","relative-format-in-hour":"w ciągu 1 godziny","relative-format-by":"do {formattedDate}"},pt:{"relative-format-in-seconds":"em segundos","relative-format-in-minutes":"em {minutes} minutos","relative-format-in-hours":"em {hours} horas","relative-format-in-minute":"em 1 minuto","relative-format-in-hour":"em 1 hora","relative-format-by":"até {formattedDate}"},ro:{"relative-format-in-seconds":"în câteva secunde","relative-format-in-minutes":"în {minutes} minute","relative-format-in-hours":"în {hours} ore","relative-format-in-minute":"în 1 minut","relative-format-in-hour":"în 1 oră","relative-format-by":"până pe {formattedDate}"},ru:{"relative-format-in-seconds":"через несколько секунд","relative-format-in-minutes":"через {minutes} мин.","relative-format-in-hours":"через {hours} ч.","relative-format-in-minute":"через минуту","relative-format-in-hour":"через 1 час","relative-format-by":"{formattedDate}"},sv:{"relative-format-in-seconds":"om några sekunder","relative-format-in-minutes":"om {minutes} minuter","relative-format-in-hours":"om {hours} timmar","relative-format-in-minute":"om 1 minut","relative-format-in-hour":"om 1 timme","relative-format-by":"senast {formattedDate}"},th:{"relative-format-in-seconds":"ในไม่กี่วินาที","relative-format-in-minutes":"ใน {minutes} นาที","relative-format-in-hours":"ใน {hours} ชั่วโมง","relative-format-in-minute":"ใน 1 นาที","relative-format-in-hour":"ใน 1 ชั่วโมง","relative-format-by":"ภายใน {formattedDate}"},tr:{"relative-format-in-seconds":"saniyeler içinde","relative-format-in-minutes":"{minutes} dakika içinde","relative-format-in-hours":"{hours} saat içinde","relative-format-in-minute":"1 dakika içinde","relative-format-in-hour":"1 saat içinde","relative-format-by":"{formattedDate} itibarıyla"},uk:{"relative-format-in-seconds":"через кілька секунд","relative-format-in-minutes":"через {minutes} хв","relative-format-in-hours":"через {hours} год","relative-format-in-minute":"через 1 хвилину","relative-format-in-hour":"через 1 годину","relative-format-by":"до {formattedDate}"},"zh-CN":{"relative-format-in-seconds":"数秒内","relative-format-in-minutes":"{minutes} 分钟内","relative-format-in-hours":"{hours} 小时内","relative-format-in-minute":"1 分钟内","relative-format-in-hour":"1 小时内","relative-format-by":"{formattedDate} 前"},"zh-HK":{"relative-format-in-seconds":"數秒內","relative-format-in-minutes":"在{minutes}分鐘內","relative-format-in-hours":"在{hours}小時內","relative-format-in-minute":"在1分鐘內","relative-format-in-hour":"在1小時內","relative-format-by":"在{formattedDate}或之前"}};function M(e,t={},r){let n;return n=O(r,e)?E[r][e]:O("en",e)?E.en[e]:e,n&&t&&Object.keys(t).forEach(e=>{n=n.replace(new RegExp(`{${e}}`,"g"),t[e])}),n||e}function O(e,t){return T(E,e)&&T(E[e],t)}function T(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function S(e,t="en-GB"){if(e<new Date(Date.now()))return"";let r;return r=function(e){return(e=>{const t=new Date(Date.now());return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()})(e)&&function(e,t){return G(e-new Date(Date.now()),C.HOUR)<=12}(e)}(e)?function(e,t){const r=e-new Date(Date.now());if(G(r,C.SECOND)<60)return function(e){return M("relative-format-in-seconds",{},e)}(t);const n=G(r,C.MINUTE);return n<60?R(n,t,C.MINUTE):R(G(r,C.HOUR),t,C.HOUR)}(e,t):function(e,t){return M("relative-format-by",{formattedDate:w(e,t,{month:"short",day:"numeric"})},t)}(e,t),r}function G(e,t){return Math.ceil(e/{[C.HOUR]:36e5,[C.MINUTE]:6e4,[C.SECOND]:1e3}[t])}function R(e,t,r){return 1===e?M("relative-format-in-"+r,{},t):M(`relative-format-in-${r}s`,{[r+"s"]:""+e},t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(C||(C={}));export{f as formatAmount,w as formatDate,l as formatMoney,m as formatNumber,u as formatNumberToSignificantDigits,g as formatPercentage,c as formatRate,S as formatRelativeDate,D as getDisplayRate,b as getRateInAllFormats};
|
|
2
2
|
//# sourceMappingURL=formatting.modern.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.modern.js","sources":["../src/number/feature-detection/intl.ts","../src/number/number.ts","../src/defaults/index.ts","../src/currency/currency.ts","../src/rate/formatRate.ts","../src/rate/formatRateEquation.ts","../src/rate/config.ts","../src/rate/getRateEquation.ts","../src/rate/getRateInAllFormats.ts","../src/rate/getDisplayRate.ts","../src/percentage/percentage.ts","../src/date/support-detection/intl.ts","../src/date/support-detection/selectedLocale.ts","../src/date/fallback-format/fallbackFormat.ts","../src/date/date.ts","../src/date/isToday.ts","../src/date/relative-date/relativeDateFormatter.ts","../src/translations/translator.ts"],"sourcesContent":["let isSupported: boolean | undefined;\n\n/**\n * Checks if Intl.NumberFormat is supported for a specific locale\n * @param {String} locale\n * @returns {Boolean}\n */\nexport function isIntlNumberFormatSupported(locale: string): boolean {\n if (isSupported === undefined) {\n isSupported =\n typeof Intl === 'object' &&\n Intl !== undefined &&\n typeof Intl.NumberFormat === 'function' &&\n Intl.NumberFormat &&\n typeof Intl.NumberFormat.supportedLocalesOf === 'function' &&\n Intl.NumberFormat.supportedLocalesOf &&\n Intl.NumberFormat.supportedLocalesOf(locale).length === 1;\n }\n return isSupported;\n}\n","import {\n DEFAULT_LOCALE,\n PRECISION,\n NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n PrecisionType,\n} from '../defaults';\nimport { isIntlNumberFormatSupported } from './feature-detection';\n\nconst { SIGNIFICANT_DIGITS, FRACTION_DIGITS } = PRECISION;\n\nconst formatters: Record<string, any> = {}; // cache, sample: { 'en-GB': formatter, 'en-GB2': formatter }\n\n/**\n * Returns a formatter for the specified locale and NumberFormatOptions\n * @param {String} locale\n * @param {Intl.NumberFormatOptions} options\n * @returns {Intl.NumberFormat}\n */\nfunction getFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const cacheKey = options ? `${locale}${Object.entries(options)}` : locale;\n if (!formatters[cacheKey]) {\n formatters[cacheKey] = options\n ? new Intl.NumberFormat(locale, options)\n : new Intl.NumberFormat(locale);\n }\n return formatters[cacheKey];\n}\n\n/**\n * Returns the desired options object for\n * `Number.toLocaleString` and `Intl.NumberFormat` methods\n * @param {Number} precision\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n */\nfunction getPrecisionOptions(precision: number, precisionType: PrecisionType) {\n return {\n [`minimum${precisionType}`]: precision,\n [`maximum${precisionType}`]: precision,\n };\n}\n\n/**\n * Returns the locale that was passed in if it works\n * with `toLocaleString` or otherwise falls back to `DEFAULT_LOCALE`\n * @param {String} locale\n */\nfunction getValidLocale(locale: string) {\n try {\n const noUnderscoreLocale = locale.replace(/_/, '-');\n\n Intl.NumberFormat(noUnderscoreLocale);\n return noUnderscoreLocale;\n } catch (e) {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Formats the number as a fallback for when `toLocaleString` method is not supported\n * by the browser. Will use `toFixed` to format `FractionDigits` precisionType and `toPrecision`\n * to format `SignificantDigits` precision type.\n * @param {Number} number\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nfunction formatNumberWithFallback(number: number, precision: number, precisionType: PrecisionType) {\n return precisionType === SIGNIFICANT_DIGITS.TYPE\n ? number.toPrecision(precision)\n : number.toFixed(precision);\n}\n\n/**\n * Formats a number to a significant number of digits with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {Number} significantDigits - this may be a value between 1 and 21, inclusive\n * @param {String} locale\n * @returns {String}\n */\nexport function formatNumberToSignificantDigits(\n number: number,\n locale = DEFAULT_LOCALE,\n significantDigits = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n) {\n return formatNumber(number, locale, significantDigits, SIGNIFICANT_DIGITS.TYPE);\n}\n\n/**\n * Formats a number precisely with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {String} locale\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nexport function formatNumber(\n number: number,\n locale = DEFAULT_LOCALE,\n precision?: number,\n precisionType: PrecisionType = 'FractionDigits',\n): string {\n if (!number && number !== 0) {\n return '';\n }\n\n if (typeof number === 'string' && Number(number)) {\n // eslint-disable-next-line no-param-reassign\n number = Number(number);\n }\n\n const { MIN_PRECISION, MAX_PRECISION } =\n precisionType === SIGNIFICANT_DIGITS.TYPE ? SIGNIFICANT_DIGITS : FRACTION_DIGITS;\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed#Parameters\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat#Parameters\n const isPrecisionValid =\n precision !== undefined &&\n precision !== null &&\n typeof precision === 'number' &&\n precision >= MIN_PRECISION &&\n precision <= MAX_PRECISION;\n\n const validatedLocale = getValidLocale(locale);\n\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return isPrecisionValid\n ? formatNumberWithFallback(number, precision!, precisionType)\n : `${number}`;\n }\n\n const formatter = isPrecisionValid\n ? getFormatter(validatedLocale, getPrecisionOptions(precision!, precisionType))\n : getFormatter(validatedLocale);\n\n return formatter.format(number);\n}\n\nexport function formatNumberWithOptions(\n value: number,\n options: Intl.NumberFormatOptions,\n locale: string,\n fallback: string,\n) {\n const validatedLocale = getValidLocale(locale);\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return fallback;\n }\n\n return getFormatter(validatedLocale, options).format(value);\n}\n","export const DEFAULT_LOCALE = 'en-GB';\nexport const DEFAULT_PRECISION_TYPE = 'FractionDigits';\nexport const NUMBER_OF_RATE_SIGNIFICANT_DIGITS = 6;\nexport const DEFAULT_RATE_MULTIPLIER = 1;\nexport const PRECISION = {\n SIGNIFICANT_DIGITS: {\n TYPE: 'SignificantDigits' as PrecisionType,\n MIN_PRECISION: 1,\n MAX_PRECISION: 21,\n },\n FRACTION_DIGITS: {\n TYPE: 'FractionDigits' as PrecisionType,\n MIN_PRECISION: 0,\n MAX_PRECISION: 20,\n },\n};\nexport type PrecisionType = 'SignificantDigits' | 'FractionDigits';\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumber } from '../number';\n\nconst currencyDecimals = {\n BIF: 0,\n BYR: 0,\n CLP: 0,\n DJF: 0,\n GNF: 0,\n IDR: 0,\n JPY: 0,\n KMF: 0,\n KRW: 0,\n MGA: 0,\n PYG: 0,\n RWF: 0,\n VND: 0,\n VUV: 0,\n XAF: 0,\n XOF: 0,\n XPF: 0,\n // technically HUF does have decimals, but due to the exchange rate banks\n // do not accept decimal amounts\n HUF: 0,\n UGX: 0,\n // local banks do not consistently support the ideal 2-decimal places fractional part\n KES: 0,\n\n BHD: 3,\n JOD: 3,\n KWD: 3,\n OMR: 3,\n TND: 3,\n};\n\nconst DEFAULT_CURRENCY_DECIMALS = 2;\n\nfunction getCurrencyDecimals(currency = '') {\n const upperCaseCurrency = currency.toUpperCase();\n if (Object.prototype.hasOwnProperty.call(currencyDecimals, upperCaseCurrency)) {\n return currencyDecimals[upperCaseCurrency as keyof typeof currencyDecimals];\n }\n return DEFAULT_CURRENCY_DECIMALS;\n}\n\nfunction amountHasNoDecimals(amount: number): boolean {\n return amount % 1 === 0;\n}\n\nfunction getPrecision(amount: number, currencyCode: string, alwaysShowDecimals: boolean): number {\n if (amountHasNoDecimals(amount) && !alwaysShowDecimals) {\n return 0;\n }\n\n return getCurrencyDecimals(currencyCode);\n}\n\nexport function formatAmount(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n): string {\n const availablePrecision = getPrecision(amount, currencyCode, options.alwaysShowDecimals);\n\n return formatNumber(amount, locale, availablePrecision);\n}\n\nexport function formatMoney(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n) {\n return `${formatAmount(amount, currencyCode, locale, options)} ${(\n currencyCode || ''\n ).toUpperCase()}`;\n}\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberWithOptions, formatNumberToSignificantDigits } from '../number';\n\nexport type FormatRateOptions = {\n significantFigures?: number;\n};\n\nfunction formatRate(rate: number, locale: string): string;\n/**\n * @deprecated Do not specify options, always specify a locale.\n */\nfunction formatRate(rate: number, options?: FormatRateOptions, locale?: string): string;\n\nfunction formatRate(\n rate: number,\n optionsOrLocale?: FormatRateOptions | string,\n locale?: string,\n): string {\n if (typeof optionsOrLocale === 'string') {\n return formatRateInternal(rate, optionsOrLocale);\n }\n\n const significantFigures = optionsOrLocale && optionsOrLocale.significantFigures;\n if (significantFigures) {\n return formatNumberToSignificantDigits(rate, locale || DEFAULT_LOCALE, significantFigures);\n }\n\n return formatRateInternal(rate, locale || DEFAULT_LOCALE);\n}\n\nfunction formatRateInternal(rate: number, locale: string) {\n // We lower the number of decimal places if the value is big, to minimun of 2\n const sizeAdjuster =\n // Upper bound 2\n Math.min(\n 2,\n // Low bound 0\n Math.max(\n 0,\n // Number of siginificant leading digits - 1\n Math.floor(Math.log10(rate)) - 1,\n ),\n );\n const fractionDigits = 4 - sizeAdjuster;\n\n return formatNumberWithOptions(\n rate,\n {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n },\n locale,\n rate.toFixed(fractionDigits),\n );\n}\n\nexport default formatRate;\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport { formatAmount } from '../currency';\n\nexport default function(\n {\n lhsValue,\n lhsCurrency,\n rhsValue,\n rhsCurrency,\n }: { lhsValue: number; lhsCurrency: string; rhsValue: number; rhsCurrency: string },\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return `${formatAmount(\n lhsValue,\n lhsCurrency,\n locale,\n )} ${lhsCurrency} = ${formatNumberToSignificantDigits(\n rhsValue,\n locale,\n significantFigures,\n )} ${rhsCurrency}`;\n}\n","export default {\n BRL: {\n hasInversionEnabled: true,\n },\n INR: {\n hasInversionEnabled: true,\n },\n JPY: {\n hasInversionEnabled: true,\n },\n IDR: {\n hasInversionEnabled: true\n },\n HUF: {\n hasInversionEnabled: true,\n },\n RON: {\n hasInversionEnabled: true,\n },\n THB: {\n hasInversionEnabled: true,\n },\n} as Record<string, { hasInversionEnabled?: boolean; multiplierForEquation?: number }>;\n","import config from './config';\nimport { DEFAULT_RATE_MULTIPLIER } from '../defaults';\n\nexport type Reference = 'auto' | 'source' | 'target';\n\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n }: { reference?: Reference; referenceMultiplier?: number } = {},\n) {\n validateParameters();\n\n if (shouldInvertEquation(reference, sourceCurrency)) {\n return {\n // inverted.\n lhsCurrency: targetCurrency,\n lhsValue: getMultiplier(referenceMultiplier, targetCurrency),\n rhsCurrency: sourceCurrency,\n rhsValue: getMultiplier(referenceMultiplier, targetCurrency) / rate,\n };\n }\n return {\n // normal.\n lhsCurrency: sourceCurrency,\n lhsValue: getMultiplier(referenceMultiplier, sourceCurrency),\n rhsCurrency: targetCurrency,\n rhsValue: rate * getMultiplier(referenceMultiplier, sourceCurrency),\n };\n\n function validateParameters(): void {\n if (!rate) throw new Error(`rate parameter is mandatory (got ${rate} instead).`);\n if (!sourceCurrency)\n throw new Error(`sourceCurrency parameter is mandatory (got ${sourceCurrency} instead).`);\n if (!targetCurrency)\n throw new Error(`targetCurrency parameter is mandatory (got ${targetCurrency} instead).`);\n if (referenceMultiplier && typeof referenceMultiplier !== 'number') {\n throw new Error(\n `referenceMultiplier must be a number (got ${typeof referenceMultiplier} ${referenceMultiplier} instead)`,\n );\n }\n // Let shouldInvertEquation() handle `reference`.\n }\n}\n\nfunction shouldInvertEquation(referenceConfig: Reference, sourceCurrency: string): boolean {\n if (referenceConfig === 'source') return false;\n if (referenceConfig === 'target') return true;\n if (['auto', undefined, null].indexOf(referenceConfig) > -1)\n return !!(config[sourceCurrency] || {}).hasInversionEnabled;\n throw new Error(\n `Unrecognized reference config value: ${referenceConfig} (valid values are auto, source, target).`,\n );\n}\n\nfunction getMultiplier(\n referenceMultiplierOverride: number | undefined,\n lhsCurrency: string,\n): number {\n return (\n referenceMultiplierOverride ||\n (config[lhsCurrency] || {}).multiplierForEquation ||\n DEFAULT_RATE_MULTIPLIER\n );\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\n\n/**\n * @deprecated use getDisplayRate\n */\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n }: { reference?: Reference; referenceMultiplier?: number; significantFigures?: number } = {},\n locale = DEFAULT_LOCALE,\n) {\n const response = {\n suggested: {},\n formats: {} as Record<string, any>,\n };\n\n response.formats.decimal = {\n output: formatNumberToSignificantDigits(rate, locale, significantFigures),\n significantFigures,\n };\n\n const equation = getRateEquation(rate, sourceCurrency, targetCurrency, {\n reference,\n referenceMultiplier,\n });\n\n response.formats.equation = {\n output: formatRateEquation(equation, { significantFigures }, locale),\n reference: equation.lhsCurrency === sourceCurrency ? 'source' : 'target',\n referenceMultiplier: equation.lhsValue,\n calculationInDecimal: formatNumberToSignificantDigits(\n equation.rhsValue,\n locale,\n significantFigures,\n ),\n };\n\n if (equation.lhsCurrency === sourceCurrency && equation.lhsValue === 1) {\n response.suggested = {\n format: 'decimal',\n output: response.formats.decimal.output,\n };\n } else {\n response.suggested = {\n format: 'equation',\n output: response.formats.equation.output,\n };\n }\n\n return response;\n}\n","import formatRate from './formatRate';\n\nexport type DisplayRate = {\n /**\n * Numerical rate to 4 decimal places. Only use when there is another indicator on the screen\n * for if the rate is inverted or not, such as a multiply/divide icon.\n */\n decimal: string;\n /**\n * Rate equation such as `1 ABC = 0.5743 DEF`. Use this whenever you need to display a rate\n * without much context.\n */\n equation: string;\n /**\n * If the rates given are given in the opposite direction to now the function was called.\n * For example if source was BRL and target was EUR, an inverted equation of\n * `1 EUR = 5.1233 BRL` may be returned.\n */\n inverted: boolean;\n};\n\n/**\n * Returns rates for displaying to customers.\n */\nexport default function getDisplayRate({\n rate,\n sourceCurrency,\n targetCurrency,\n locale,\n}: {\n rate: number;\n sourceCurrency: string;\n targetCurrency: string;\n locale: string;\n}): DisplayRate {\n const inverted = shouldInvertEquation(sourceCurrency, rate);\n\n const rawValue = inverted ? 1 / rate : rate;\n\n const leftHandSide = `1 ${inverted ? targetCurrency : sourceCurrency}`;\n const rightHandSide = `${formatRate(rawValue, locale)} ${\n inverted ? sourceCurrency : targetCurrency\n }`;\n\n return {\n decimal: formatRate(rawValue, locale),\n inverted,\n equation: `${leftHandSide} = ${rightHandSide}`,\n };\n}\n\nfunction shouldInvertEquation(sourceCurrency: string, rate: number): boolean {\n if (sourceCurrency === 'BRL' && rate <= 10) {\n // Prefer to show BRL inverted unless the rate would be below 0.1\n return true;\n }\n\n // Prefer not to show very low rates\n return rate < 0.1;\n}\n","export const formatPercentage= (percentage: number, locale = 'en-GB'): string =>\n Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(percentage);\n\n\n","import { DEFAULT_LOCALE } from '../../defaults';\n\nlet intlSupported: boolean | undefined; // cache\n\nexport function isIntlSupported(): boolean {\n if (intlSupported === undefined) {\n intlSupported = intlDateTimeFormatReturnsCorrectValue();\n }\n return intlSupported;\n}\n\nfunction intlDateTimeFormatReturnsCorrectValue(): boolean {\n try {\n const date = new Date(2018, 11, 1);\n const dateString = new Intl.DateTimeFormat(DEFAULT_LOCALE).format(date);\n return dateString === '01/12/2018';\n } catch (e) {\n return false;\n }\n}\n","const supportedLocales: Record<string, boolean> = {}; // cache\n\nexport function isSelectedLocaleSupported(locale: string): boolean {\n if (supportedLocales[locale] === undefined) {\n supportedLocales[locale] = checkForLocaleSupport(locale);\n }\n return supportedLocales[locale];\n}\n\nfunction checkForLocaleSupport(locale: string): boolean {\n try {\n return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;\n } catch (e) {\n return false;\n }\n}\n","const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst SHORT_MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nfunction getJoiningCharacter(options: Intl.DateTimeFormatOptions): string {\n return options.month === 'short' ? ' ' : '/';\n}\n\nfunction isMonthFirst(options: Intl.DateTimeFormatOptions) {\n return options.month === 'short';\n}\n\nfunction getFormattedMonth(\n options: Intl.DateTimeFormatOptions,\n isUTC: boolean,\n date: Date,\n): string | number {\n if (options.month === 'short') {\n return SHORT_MONTHS[isUTC ? date.getUTCMonth() : date.getMonth()];\n }\n return (isUTC ? date.getUTCMonth() : date.getMonth()) + 1;\n}\n\n// Sample outputs: 'Sat, 1/12/2018', '1/12/2018', '12/2018', Sat, 1'\nexport function getFallbackFormat(date: Date, options: Intl.DateTimeFormatOptions = {}): string {\n const isUTC = options.timeZone === 'UTC';\n\n const dateParts = [];\n if (options.day) dateParts.push(isUTC ? date.getUTCDate() : date.getDate());\n if (options.month) {\n const monthFormat = getFormattedMonth(options, isUTC, date);\n if (isMonthFirst(options)) {\n dateParts.unshift(monthFormat);\n } else {\n dateParts.push(monthFormat);\n }\n }\n if (options.year) dateParts.push(isUTC ? date.getUTCFullYear() : date.getUTCFullYear());\n\n const joiningCharacter = getJoiningCharacter(options);\n let fallbackDate = dateParts.join(joiningCharacter);\n\n if (options.weekday) {\n const dayName = WEEKDAYS[isUTC ? date.getUTCDay() : date.getDay()];\n fallbackDate = fallbackDate ? `${dayName}, ${fallbackDate}` : dayName;\n }\n return (\n fallbackDate ||\n getFallbackFormat(date, {\n timeZone: options.timeZone,\n day: 'true',\n month: 'true',\n year: 'true',\n })\n );\n}\n","import { isIntlSupported, isSelectedLocaleSupported } from './support-detection';\nimport { getFallbackFormat } from './fallback-format';\nimport { DEFAULT_LOCALE } from '../defaults';\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? new Intl.DateTimeFormat(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n","export default (date: Date): boolean => {\n const today = new Date(Date.now());\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n","import isToday from '../isToday';\nimport { formatDate } from '../date';\nimport { getTranslation } from '../../translations/translator';\nimport { DEFAULT_LOCALE } from '../../defaults';\n\nexport function formatRelativeDate(date: Date, locale = DEFAULT_LOCALE): string {\n if (date < new Date(Date.now())) {\n return '';\n }\n\n let formatted;\n if (shouldFormatRelative(date)) {\n formatted = formatRelative(date, locale);\n } else {\n formatted = formatAbsolute(date, locale);\n }\n return formatted;\n}\n\nfunction shouldFormatRelative(date: Date): boolean {\n return isToday(date) && isWithinHours(date, 12);\n}\n\nfunction isWithinHours(date: Date, boundary: number): boolean {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n return getDifferenceIn(diff, TimeUnit.HOUR) <= boundary;\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n\n if (getDifferenceIn(diff, TimeUnit.SECOND) < 60) {\n return formatSeconds(locale);\n }\n\n const differenceInMinutes = getDifferenceIn(diff, TimeUnit.MINUTE);\n if (differenceInMinutes < 60) {\n return formatTimeUnit(differenceInMinutes, locale, TimeUnit.MINUTE);\n }\n\n return formatTimeUnit(getDifferenceIn(diff, TimeUnit.HOUR), locale, TimeUnit.HOUR);\n}\n\nfunction formatAbsolute(date: Date, locale: string): string {\n const params = {\n formattedDate: formatDate(date, locale, { month: 'short', day: 'numeric' }),\n };\n return getTranslation('relative-format-by', params, locale);\n}\n\nfunction getDifferenceIn(diff: number, timeUnitValue: TimeUnit): number {\n const millisecondsMap = {\n [TimeUnit.HOUR]: 3600000,\n [TimeUnit.MINUTE]: 60000,\n [TimeUnit.SECOND]: 1000,\n };\n return Math.ceil(diff / millisecondsMap[timeUnitValue]);\n}\n\nfunction formatTimeUnit(value: number, locale: string, timeUnit: string): string {\n if (value === 1) {\n return getTranslation(`relative-format-in-${timeUnit}`, {}, locale);\n }\n return getTranslation(\n `relative-format-in-${timeUnit}s`,\n { [`${timeUnit}s`]: `${value}` },\n locale,\n );\n}\n\nfunction formatSeconds(locale: string) {\n return getTranslation('relative-format-in-seconds', {}, locale);\n}\n\nenum TimeUnit {\n SECOND = 'second',\n MINUTE = 'minute',\n HOUR = 'hour',\n}\n","// eslint-disable-next-line import/no-unresolved\nimport translations from './translations.json';\n\nexport function getTranslation(\n translationKey: string,\n params: Record<string, string> = {},\n locale: string,\n): string {\n let translatedMessage: string | undefined;\n if (hasTranslation(locale, translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>)[locale][\n translationKey\n ];\n } else if (hasTranslation('en', translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>).en[translationKey];\n } else {\n translatedMessage = translationKey;\n }\n\n if (translatedMessage && params) {\n Object.keys(params).forEach(key => {\n translatedMessage = (translatedMessage as string).replace(\n new RegExp(`{${key}}`, 'g'),\n params[key],\n );\n });\n }\n\n return translatedMessage || translationKey;\n}\n\nfunction hasTranslation(locale: string, translationKey: string): boolean {\n return (\n hasOwnProperty(translations, locale) &&\n hasOwnProperty((translations as Record<string, Record<string, string>>)[locale], translationKey)\n );\n}\n\nfunction hasOwnProperty(obj: any, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n"],"names":["isSupported","isIntlNumberFormatSupported","locale","undefined","Intl","NumberFormat","supportedLocalesOf","length","SIGNIFICANT_DIGITS","FRACTION_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","formatters","getFormatter","options","cacheKey","Object","entries","getValidLocale","noUnderscoreLocale","replace","e","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","[object Object]","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","IDR","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","formatMoney","formatRate","rate","optionsOrLocale","formatRateInternal","significantFigures","fractionDigits","Math","min","max","floor","log10","value","fallback","formatNumberWithOptions","minimumFractionDigits","maximumFractionDigits","lhsValue","lhsCurrency","rhsValue","rhsCurrency","BRL","hasInversionEnabled","INR","RON","THB","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal","getDisplayRate","inverted","rawValue","leftHandSide","rightHandSide","formatPercentage","percentage","style","intlSupported","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","checkForLocaleSupport","isSelectedLocaleSupported","getSupportedLocale","getFallbackFormat","isUTC","timeZone","dateParts","day","push","getUTCDate","getDate","month","monthFormat","getUTCMonth","getMonth","getFormattedMonth","isMonthFirst","unshift","year","getUTCFullYear","joiningCharacter","getJoiningCharacter","fallbackDate","join","weekday","dayName","getUTCDay","getDay","TimeUnit","getTranslation","translationKey","params","translatedMessage","hasTranslation","translations","en","keys","forEach","key","RegExp","obj","formatRelativeDate","now","formatted","today","getFullYear","isToday","boundary","getDifferenceIn","HOUR","isWithinHours","shouldFormatRelative","diff","SECOND","formatSeconds","differenceInMinutes","MINUTE","formatTimeUnit","formatRelative","formattedDate","formatAbsolute","timeUnitValue","ceil","timeUnit"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formatting.modern.js","sources":["../src/number/feature-detection/intl.ts","../src/number/number.ts","../src/defaults/index.ts","../src/currency/currency.ts","../src/rate/formatRate.ts","../src/rate/formatRateEquation.ts","../src/rate/config.ts","../src/rate/getRateEquation.ts","../src/rate/getRateInAllFormats.ts","../src/rate/getDisplayRate.ts","../src/percentage/percentage.ts","../src/date/support-detection/intl.ts","../src/date/support-detection/selectedLocale.ts","../src/date/fallback-format/fallbackFormat.ts","../src/date/date.ts","../src/date/isToday.ts","../src/date/relative-date/relativeDateFormatter.ts","../src/translations/translator.ts"],"sourcesContent":["let isSupported: boolean | undefined;\n\n/**\n * Checks if Intl.NumberFormat is supported for a specific locale\n * @param {String} locale\n * @returns {Boolean}\n */\nexport function isIntlNumberFormatSupported(locale: string): boolean {\n if (isSupported === undefined) {\n isSupported =\n typeof Intl === 'object' &&\n Intl !== undefined &&\n typeof Intl.NumberFormat === 'function' &&\n Intl.NumberFormat &&\n typeof Intl.NumberFormat.supportedLocalesOf === 'function' &&\n Intl.NumberFormat.supportedLocalesOf &&\n Intl.NumberFormat.supportedLocalesOf(locale).length === 1;\n }\n return isSupported;\n}\n","import {\n DEFAULT_LOCALE,\n PRECISION,\n NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n PrecisionType,\n} from '../defaults';\nimport { isIntlNumberFormatSupported } from './feature-detection';\n\nconst { SIGNIFICANT_DIGITS, FRACTION_DIGITS } = PRECISION;\n\nconst formatters: Record<string, any> = {}; // cache, sample: { 'en-GB': formatter, 'en-GB2': formatter }\n\n/**\n * Returns a formatter for the specified locale and NumberFormatOptions\n * @param {String} locale\n * @param {Intl.NumberFormatOptions} options\n * @returns {Intl.NumberFormat}\n */\nfunction getFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const cacheKey = options ? `${locale}${Object.entries(options)}` : locale;\n if (!formatters[cacheKey]) {\n formatters[cacheKey] = options\n ? new Intl.NumberFormat(locale, options)\n : new Intl.NumberFormat(locale);\n }\n return formatters[cacheKey];\n}\n\n/**\n * Returns the desired options object for\n * `Number.toLocaleString` and `Intl.NumberFormat` methods\n * @param {Number} precision\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n */\nfunction getPrecisionOptions(precision: number, precisionType: PrecisionType) {\n return {\n [`minimum${precisionType}`]: precision,\n [`maximum${precisionType}`]: precision,\n };\n}\n\n/**\n * Returns the locale that was passed in if it works\n * with `toLocaleString` or otherwise falls back to `DEFAULT_LOCALE`\n * @param {String} locale\n */\nfunction getValidLocale(locale: string) {\n try {\n const noUnderscoreLocale = locale.replace(/_/, '-');\n\n Intl.NumberFormat(noUnderscoreLocale);\n return noUnderscoreLocale;\n } catch (e) {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Formats the number as a fallback for when `toLocaleString` method is not supported\n * by the browser. Will use `toFixed` to format `FractionDigits` precisionType and `toPrecision`\n * to format `SignificantDigits` precision type.\n * @param {Number} number\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nfunction formatNumberWithFallback(number: number, precision: number, precisionType: PrecisionType) {\n return precisionType === SIGNIFICANT_DIGITS.TYPE\n ? number.toPrecision(precision)\n : number.toFixed(precision);\n}\n\n/**\n * Formats a number to a significant number of digits with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {Number} significantDigits - this may be a value between 1 and 21, inclusive\n * @param {String} locale\n * @returns {String}\n */\nexport function formatNumberToSignificantDigits(\n number: number,\n locale = DEFAULT_LOCALE,\n significantDigits = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n) {\n return formatNumber(number, locale, significantDigits, SIGNIFICANT_DIGITS.TYPE);\n}\n\n/**\n * Formats a number precisely with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {String} locale\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nexport function formatNumber(\n number: number,\n locale = DEFAULT_LOCALE,\n precision?: number,\n precisionType: PrecisionType = 'FractionDigits',\n): string {\n if (!number && number !== 0) {\n return '';\n }\n\n if (typeof number === 'string' && Number(number)) {\n // eslint-disable-next-line no-param-reassign\n number = Number(number);\n }\n\n const { MIN_PRECISION, MAX_PRECISION } =\n precisionType === SIGNIFICANT_DIGITS.TYPE ? SIGNIFICANT_DIGITS : FRACTION_DIGITS;\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed#Parameters\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat#Parameters\n const isPrecisionValid =\n precision !== undefined &&\n precision !== null &&\n typeof precision === 'number' &&\n precision >= MIN_PRECISION &&\n precision <= MAX_PRECISION;\n\n const validatedLocale = getValidLocale(locale);\n\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return isPrecisionValid\n ? formatNumberWithFallback(number, precision!, precisionType)\n : `${number}`;\n }\n\n const formatter = isPrecisionValid\n ? getFormatter(validatedLocale, getPrecisionOptions(precision!, precisionType))\n : getFormatter(validatedLocale);\n\n return formatter.format(number);\n}\n\nexport function formatNumberWithOptions(\n value: number,\n options: Intl.NumberFormatOptions,\n locale: string,\n fallback: string,\n) {\n const validatedLocale = getValidLocale(locale);\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return fallback;\n }\n\n return getFormatter(validatedLocale, options).format(value);\n}\n","export const DEFAULT_LOCALE = 'en-GB';\nexport const DEFAULT_PRECISION_TYPE = 'FractionDigits';\nexport const NUMBER_OF_RATE_SIGNIFICANT_DIGITS = 6;\nexport const DEFAULT_RATE_MULTIPLIER = 1;\nexport const PRECISION = {\n SIGNIFICANT_DIGITS: {\n TYPE: 'SignificantDigits' as PrecisionType,\n MIN_PRECISION: 1,\n MAX_PRECISION: 21,\n },\n FRACTION_DIGITS: {\n TYPE: 'FractionDigits' as PrecisionType,\n MIN_PRECISION: 0,\n MAX_PRECISION: 20,\n },\n};\nexport type PrecisionType = 'SignificantDigits' | 'FractionDigits';\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumber } from '../number';\n\nconst currencyDecimals = {\n BIF: 0,\n BYR: 0,\n CLP: 0,\n DJF: 0,\n GNF: 0,\n IDR: 0,\n JPY: 0,\n KMF: 0,\n KRW: 0,\n MGA: 0,\n PYG: 0,\n RWF: 0,\n VND: 0,\n VUV: 0,\n XAF: 0,\n XOF: 0,\n XPF: 0,\n // technically HUF does have decimals, but due to the exchange rate banks\n // do not accept decimal amounts\n HUF: 0,\n UGX: 0,\n // local banks do not consistently support the ideal 2-decimal places fractional part\n KES: 0,\n\n BHD: 3,\n JOD: 3,\n KWD: 3,\n OMR: 3,\n TND: 3,\n};\n\nconst DEFAULT_CURRENCY_DECIMALS = 2;\n\nfunction getCurrencyDecimals(currency = '') {\n const upperCaseCurrency = currency.toUpperCase();\n if (Object.prototype.hasOwnProperty.call(currencyDecimals, upperCaseCurrency)) {\n return currencyDecimals[upperCaseCurrency as keyof typeof currencyDecimals];\n }\n return DEFAULT_CURRENCY_DECIMALS;\n}\n\nfunction amountHasNoDecimals(amount: number): boolean {\n return amount % 1 === 0;\n}\n\nfunction getPrecision(amount: number, currencyCode: string, alwaysShowDecimals: boolean): number {\n if (amountHasNoDecimals(amount) && !alwaysShowDecimals) {\n return 0;\n }\n\n return getCurrencyDecimals(currencyCode);\n}\n\nexport function formatAmount(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n): string {\n const availablePrecision = getPrecision(amount, currencyCode, options.alwaysShowDecimals);\n\n return formatNumber(amount, locale, availablePrecision);\n}\n\nexport function formatMoney(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n) {\n return `${formatAmount(amount, currencyCode, locale, options)} ${(\n currencyCode || ''\n ).toUpperCase()}`;\n}\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberWithOptions, formatNumberToSignificantDigits } from '../number';\n\nexport type FormatRateOptions = {\n significantFigures?: number;\n};\n\nfunction formatRate(rate: number, locale: string): string;\n/**\n * @deprecated Do not specify options, always specify a locale.\n */\nfunction formatRate(rate: number, options?: FormatRateOptions, locale?: string): string;\n\nfunction formatRate(\n rate: number,\n optionsOrLocale?: FormatRateOptions | string,\n locale?: string,\n): string {\n if (typeof optionsOrLocale === 'string') {\n return formatRateInternal(rate, optionsOrLocale);\n }\n\n const significantFigures = optionsOrLocale && optionsOrLocale.significantFigures;\n if (significantFigures) {\n return formatNumberToSignificantDigits(rate, locale || DEFAULT_LOCALE, significantFigures);\n }\n\n return formatRateInternal(rate, locale || DEFAULT_LOCALE);\n}\n\nfunction formatRateInternal(rate: number, locale: string) {\n // We lower the number of decimal places if the value is big, to minimun of 2\n const sizeAdjuster =\n // Upper bound 2\n Math.min(\n 2,\n // Low bound 0\n Math.max(\n 0,\n // Number of siginificant leading digits - 1\n Math.floor(Math.log10(rate)) - 1,\n ),\n );\n const fractionDigits = 4 - sizeAdjuster;\n\n return formatNumberWithOptions(\n rate,\n {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n },\n locale,\n rate.toFixed(fractionDigits),\n );\n}\n\nexport default formatRate;\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport { formatAmount } from '../currency';\n\nexport default function(\n {\n lhsValue,\n lhsCurrency,\n rhsValue,\n rhsCurrency,\n }: { lhsValue: number; lhsCurrency: string; rhsValue: number; rhsCurrency: string },\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return `${formatAmount(\n lhsValue,\n lhsCurrency,\n locale,\n )} ${lhsCurrency} = ${formatNumberToSignificantDigits(\n rhsValue,\n locale,\n significantFigures,\n )} ${rhsCurrency}`;\n}\n","export default {\n BRL: {\n hasInversionEnabled: true,\n },\n INR: {\n hasInversionEnabled: true,\n },\n JPY: {\n hasInversionEnabled: true,\n },\n IDR: {\n hasInversionEnabled: true\n },\n HUF: {\n hasInversionEnabled: true,\n },\n RON: {\n hasInversionEnabled: true,\n },\n THB: {\n hasInversionEnabled: true,\n },\n} as Record<string, { hasInversionEnabled?: boolean; multiplierForEquation?: number }>;\n","import config from './config';\nimport { DEFAULT_RATE_MULTIPLIER } from '../defaults';\n\nexport type Reference = 'auto' | 'source' | 'target';\n\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n }: { reference?: Reference; referenceMultiplier?: number } = {},\n) {\n validateParameters();\n\n if (shouldInvertEquation(reference, sourceCurrency)) {\n return {\n // inverted.\n lhsCurrency: targetCurrency,\n lhsValue: getMultiplier(referenceMultiplier, targetCurrency),\n rhsCurrency: sourceCurrency,\n rhsValue: getMultiplier(referenceMultiplier, targetCurrency) / rate,\n };\n }\n return {\n // normal.\n lhsCurrency: sourceCurrency,\n lhsValue: getMultiplier(referenceMultiplier, sourceCurrency),\n rhsCurrency: targetCurrency,\n rhsValue: rate * getMultiplier(referenceMultiplier, sourceCurrency),\n };\n\n function validateParameters(): void {\n if (!rate) throw new Error(`rate parameter is mandatory (got ${rate} instead).`);\n if (!sourceCurrency)\n throw new Error(`sourceCurrency parameter is mandatory (got ${sourceCurrency} instead).`);\n if (!targetCurrency)\n throw new Error(`targetCurrency parameter is mandatory (got ${targetCurrency} instead).`);\n if (referenceMultiplier && typeof referenceMultiplier !== 'number') {\n throw new Error(\n `referenceMultiplier must be a number (got ${typeof referenceMultiplier} ${referenceMultiplier} instead)`,\n );\n }\n // Let shouldInvertEquation() handle `reference`.\n }\n}\n\nfunction shouldInvertEquation(referenceConfig: Reference, sourceCurrency: string): boolean {\n if (referenceConfig === 'source') return false;\n if (referenceConfig === 'target') return true;\n if (['auto', undefined, null].indexOf(referenceConfig) > -1)\n return !!(config[sourceCurrency] || {}).hasInversionEnabled;\n throw new Error(\n `Unrecognized reference config value: ${referenceConfig} (valid values are auto, source, target).`,\n );\n}\n\nfunction getMultiplier(\n referenceMultiplierOverride: number | undefined,\n lhsCurrency: string,\n): number {\n return (\n referenceMultiplierOverride ||\n (config[lhsCurrency] || {}).multiplierForEquation ||\n DEFAULT_RATE_MULTIPLIER\n );\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\n\n/**\n * @deprecated use getDisplayRate\n */\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n }: { reference?: Reference; referenceMultiplier?: number; significantFigures?: number } = {},\n locale = DEFAULT_LOCALE,\n) {\n const response = {\n suggested: {},\n formats: {} as Record<string, any>,\n };\n\n response.formats.decimal = {\n output: formatNumberToSignificantDigits(rate, locale, significantFigures),\n significantFigures,\n };\n\n const equation = getRateEquation(rate, sourceCurrency, targetCurrency, {\n reference,\n referenceMultiplier,\n });\n\n response.formats.equation = {\n output: formatRateEquation(equation, { significantFigures }, locale),\n reference: equation.lhsCurrency === sourceCurrency ? 'source' : 'target',\n referenceMultiplier: equation.lhsValue,\n calculationInDecimal: formatNumberToSignificantDigits(\n equation.rhsValue,\n locale,\n significantFigures,\n ),\n };\n\n if (equation.lhsCurrency === sourceCurrency && equation.lhsValue === 1) {\n response.suggested = {\n format: 'decimal',\n output: response.formats.decimal.output,\n };\n } else {\n response.suggested = {\n format: 'equation',\n output: response.formats.equation.output,\n };\n }\n\n return response;\n}\n","import formatRate from './formatRate';\n\nexport type DisplayRate = {\n /**\n * Numerical rate to 4 decimal places. Only use when there is another indicator on the screen\n * for if the rate is inverted or not, such as a multiply/divide icon.\n */\n decimal: string;\n /**\n * Rate equation such as `1 ABC = 0.5743 DEF`. Use this whenever you need to display a rate\n * without much context.\n */\n equation: string;\n /**\n * If the rates given are given in the opposite direction to now the function was called.\n * For example if source was BRL and target was EUR, an inverted equation of\n * `1 EUR = 5.1233 BRL` may be returned.\n */\n inverted: boolean;\n};\n\n/**\n * Returns rates for displaying to customers.\n */\nexport default function getDisplayRate({\n rate,\n sourceCurrency,\n targetCurrency,\n locale,\n}: {\n rate: number;\n sourceCurrency: string;\n targetCurrency: string;\n locale: string;\n}): DisplayRate {\n const inverted = shouldInvertEquation(sourceCurrency, rate);\n\n const rawValue = inverted ? 1 / rate : rate;\n\n const leftHandSide = `1 ${inverted ? targetCurrency : sourceCurrency}`;\n const rightHandSide = `${formatRate(rawValue, locale)} ${\n inverted ? sourceCurrency : targetCurrency\n }`;\n\n return {\n decimal: formatRate(rawValue, locale),\n inverted,\n equation: `${leftHandSide} = ${rightHandSide}`,\n };\n}\n\nfunction shouldInvertEquation(sourceCurrency: string, rate: number): boolean {\n if (sourceCurrency === 'BRL' && rate <= 10) {\n // Prefer to show BRL inverted unless the rate would be below 0.1\n return true;\n }\n\n // Prefer not to show very low rates\n return rate < 0.1;\n}\n","export const formatPercentage= (percentage: number, locale = 'en-GB'): string =>\n Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(percentage);\n\n\n","import { DEFAULT_LOCALE } from '../../defaults';\n\nlet intlSupported: boolean | undefined; // cache\n\nexport function isIntlSupported(): boolean {\n if (intlSupported === undefined) {\n intlSupported = intlDateTimeFormatReturnsCorrectValue();\n }\n return intlSupported;\n}\n\nfunction intlDateTimeFormatReturnsCorrectValue(): boolean {\n try {\n const date = new Date(2018, 11, 1);\n const dateString = new Intl.DateTimeFormat(DEFAULT_LOCALE).format(date);\n return dateString === '01/12/2018';\n } catch (e) {\n return false;\n }\n}\n","const supportedLocales: Record<string, boolean> = {}; // cache\n\nexport function isSelectedLocaleSupported(locale: string): boolean {\n if (supportedLocales[locale] === undefined) {\n supportedLocales[locale] = checkForLocaleSupport(locale);\n }\n return supportedLocales[locale];\n}\n\nfunction checkForLocaleSupport(locale: string): boolean {\n try {\n return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;\n } catch (e) {\n return false;\n }\n}\n","const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst SHORT_MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nfunction getJoiningCharacter(options: Intl.DateTimeFormatOptions): string {\n return options.month === 'short' ? ' ' : '/';\n}\n\nfunction isMonthFirst(options: Intl.DateTimeFormatOptions) {\n return options.month === 'short';\n}\n\nfunction getFormattedMonth(\n options: Intl.DateTimeFormatOptions,\n isUTC: boolean,\n date: Date,\n): string | number {\n if (options.month === 'short') {\n return SHORT_MONTHS[isUTC ? date.getUTCMonth() : date.getMonth()];\n }\n return (isUTC ? date.getUTCMonth() : date.getMonth()) + 1;\n}\n\n// Sample outputs: 'Sat, 1/12/2018', '1/12/2018', '12/2018', Sat, 1'\nexport function getFallbackFormat(date: Date, options: Intl.DateTimeFormatOptions = {}): string {\n const isUTC = options.timeZone === 'UTC';\n\n const dateParts = [];\n if (options.day) dateParts.push(isUTC ? date.getUTCDate() : date.getDate());\n if (options.month) {\n const monthFormat = getFormattedMonth(options, isUTC, date);\n if (isMonthFirst(options)) {\n dateParts.unshift(monthFormat);\n } else {\n dateParts.push(monthFormat);\n }\n }\n if (options.year) dateParts.push(isUTC ? date.getUTCFullYear() : date.getUTCFullYear());\n\n const joiningCharacter = getJoiningCharacter(options);\n let fallbackDate = dateParts.join(joiningCharacter);\n\n if (options.weekday) {\n const dayName = WEEKDAYS[isUTC ? date.getUTCDay() : date.getDay()];\n fallbackDate = fallbackDate ? `${dayName}, ${fallbackDate}` : dayName;\n }\n return (\n fallbackDate ||\n getFallbackFormat(date, {\n timeZone: options.timeZone,\n day: 'true',\n month: 'true',\n year: 'true',\n })\n );\n}\n","import { isIntlSupported, isSelectedLocaleSupported } from './support-detection';\nimport { getFallbackFormat } from './fallback-format';\nimport { DEFAULT_LOCALE } from '../defaults';\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? new Intl.DateTimeFormat(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n","export default (date: Date): boolean => {\n const today = new Date(Date.now());\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n","import isToday from '../isToday';\nimport { formatDate } from '../date';\nimport { getTranslation } from '../../translations/translator';\nimport { DEFAULT_LOCALE } from '../../defaults';\n\nexport function formatRelativeDate(date: Date, locale = DEFAULT_LOCALE): string {\n if (date < new Date(Date.now())) {\n return '';\n }\n\n let formatted;\n if (shouldFormatRelative(date)) {\n formatted = formatRelative(date, locale);\n } else {\n formatted = formatAbsolute(date, locale);\n }\n return formatted;\n}\n\nfunction shouldFormatRelative(date: Date): boolean {\n return isToday(date) && isWithinHours(date, 12);\n}\n\nfunction isWithinHours(date: Date, boundary: number): boolean {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n return getDifferenceIn(diff, TimeUnit.HOUR) <= boundary;\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n\n if (getDifferenceIn(diff, TimeUnit.SECOND) < 60) {\n return formatSeconds(locale);\n }\n\n const differenceInMinutes = getDifferenceIn(diff, TimeUnit.MINUTE);\n if (differenceInMinutes < 60) {\n return formatTimeUnit(differenceInMinutes, locale, TimeUnit.MINUTE);\n }\n\n return formatTimeUnit(getDifferenceIn(diff, TimeUnit.HOUR), locale, TimeUnit.HOUR);\n}\n\nfunction formatAbsolute(date: Date, locale: string): string {\n const params = {\n formattedDate: formatDate(date, locale, { month: 'short', day: 'numeric' }),\n };\n return getTranslation('relative-format-by', params, locale);\n}\n\nfunction getDifferenceIn(diff: number, timeUnitValue: TimeUnit): number {\n const millisecondsMap = {\n [TimeUnit.HOUR]: 3600000,\n [TimeUnit.MINUTE]: 60000,\n [TimeUnit.SECOND]: 1000,\n };\n return Math.ceil(diff / millisecondsMap[timeUnitValue]);\n}\n\nfunction formatTimeUnit(value: number, locale: string, timeUnit: string): string {\n if (value === 1) {\n return getTranslation(`relative-format-in-${timeUnit}`, {}, locale);\n }\n return getTranslation(\n `relative-format-in-${timeUnit}s`,\n { [`${timeUnit}s`]: `${value}` },\n locale,\n );\n}\n\nfunction formatSeconds(locale: string) {\n return getTranslation('relative-format-in-seconds', {}, locale);\n}\n\nenum TimeUnit {\n SECOND = 'second',\n MINUTE = 'minute',\n HOUR = 'hour',\n}\n","// eslint-disable-next-line import/no-unresolved\nimport translations from './translations.json';\n\nexport function getTranslation(\n translationKey: string,\n params: Record<string, string> = {},\n locale: string,\n): string {\n let translatedMessage: string | undefined;\n if (hasTranslation(locale, translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>)[locale][\n translationKey\n ];\n } else if (hasTranslation('en', translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>).en[translationKey];\n } else {\n translatedMessage = translationKey;\n }\n\n if (translatedMessage && params) {\n Object.keys(params).forEach(key => {\n translatedMessage = (translatedMessage as string).replace(\n new RegExp(`{${key}}`, 'g'),\n params[key],\n );\n });\n }\n\n return translatedMessage || translationKey;\n}\n\nfunction hasTranslation(locale: string, translationKey: string): boolean {\n return (\n hasOwnProperty(translations, locale) &&\n hasOwnProperty((translations as Record<string, Record<string, string>>)[locale], translationKey)\n );\n}\n\nfunction hasOwnProperty(obj: any, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n"],"names":["isSupported","isIntlNumberFormatSupported","locale","undefined","Intl","NumberFormat","supportedLocalesOf","length","SIGNIFICANT_DIGITS","FRACTION_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","formatters","getFormatter","options","cacheKey","Object","entries","getValidLocale","noUnderscoreLocale","replace","e","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","[object Object]","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","IDR","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","formatMoney","formatRate","rate","optionsOrLocale","formatRateInternal","significantFigures","fractionDigits","Math","min","max","floor","log10","value","fallback","formatNumberWithOptions","minimumFractionDigits","maximumFractionDigits","lhsValue","lhsCurrency","rhsValue","rhsCurrency","BRL","hasInversionEnabled","INR","RON","THB","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal","getDisplayRate","inverted","rawValue","leftHandSide","rightHandSide","formatPercentage","percentage","style","intlSupported","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","checkForLocaleSupport","isSelectedLocaleSupported","getSupportedLocale","getFallbackFormat","isUTC","timeZone","dateParts","day","push","getUTCDate","getDate","month","monthFormat","getUTCMonth","getMonth","getFormattedMonth","isMonthFirst","unshift","year","getUTCFullYear","joiningCharacter","getJoiningCharacter","fallbackDate","join","weekday","dayName","getUTCDay","getDay","TimeUnit","getTranslation","translationKey","params","translatedMessage","hasTranslation","translations","en","keys","forEach","key","RegExp","obj","formatRelativeDate","now","formatted","today","getFullYear","isToday","boundary","getDifferenceIn","HOUR","isWithinHours","shouldFormatRelative","diff","SECOND","formatSeconds","differenceInMinutes","MINUTE","formatTimeUnit","formatRelative","formattedDate","formatAbsolute","timeUnitValue","ceil","timeUnit"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e;function t(t){return void 0===e&&(e="object"==typeof Intl&&void 0!==Intl&&"function"==typeof Intl.NumberFormat&&Intl.NumberFormat&&"function"==typeof Intl.NumberFormat.supportedLocalesOf&&Intl.NumberFormat.supportedLocalesOf&&1===Intl.NumberFormat.supportedLocalesOf(t).length),e}var r={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},n={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},i={};function a(e,t){var r=t?""+e+Object.entries(t):e;return i[r]||(i[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),i[r]}function o(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}function u(e,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n=6),m(e,t,n,r.TYPE)}function m(e,i,u,m){if(void 0===i&&(i="en-GB"),void 0===m&&(m="FractionDigits"),!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));var s=m===r.TYPE?r:n,f=null!=u&&"number"==typeof u&&u>=s.MIN_PRECISION&&u<=s.MAX_PRECISION,l=o(i);return t(l)?(f?a(l,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(u,m)):a(l)).format(e):f?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(e,u,m):""+e}var s={BIF:0,BYR:0,CLP:0,DJF:0,GNF:0,IDR:0,JPY:0,KMF:0,KRW:0,MGA:0,PYG:0,RWF:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,HUF:0,UGX:0,KES:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};function f(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),m(e,r,function(e,t,r){return function(e){return e%1==0}(e)&&!r?0:function(e){void 0===e&&(e="");var t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(s,t)?s[t]:2}(t)}(e,t,n.alwaysShowDecimals))}function l(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),f(e,t,r,n)+" "+(t||"").toUpperCase()}function v(e,t,r){if("string"==typeof t)return c(e,t);var n=t&&t.significantFigures;return n?u(e,r||"en-GB",n):c(e,r||"en-GB")}function c(e,r){var n=4-Math.min(2,Math.max(0,Math.floor(Math.log10(e))-1));return function(e,r,n,i){var u=o(n);return t(u)?a(u,r).format(e):i}(e,{minimumFractionDigits:n,maximumFractionDigits:n},r,e.toFixed(n))}function h(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,a=e.rhsCurrency,o=(void 0===t?{}:t).significantFigures,m=void 0===o?6:o;return void 0===r&&(r="en-GB"),f(e.lhsValue,n,r)+" "+n+" = "+u(i,r,m)+" "+a}var d={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0},THB:{hasInversionEnabled:!0}};function y(e,t){return e||(d[t]||{}).multiplierForEquation||1}function g(e,t,r,n,i){var a=void 0===n?{}:n,o=a.reference,m=void 0===o?"auto":o,s=a.referenceMultiplier,f=a.significantFigures,l=void 0===f?6:f;void 0===i&&(i="en-GB");var v={suggested:{},formats:{}};v.formats.decimal={output:u(e,i,l),significantFigures:l};var c=function(e,t,r,n){var i=void 0===n?{}:n,a=i.reference,o=void 0===a?"auto":a,u=i.referenceMultiplier;return function(){if(!e)throw new Error("rate parameter is mandatory (got "+e+" instead).");if(!t)throw new Error("sourceCurrency parameter is mandatory (got "+t+" instead).");if(!r)throw new Error("targetCurrency parameter is mandatory (got "+r+" instead).");if(u&&"number"!=typeof u)throw new Error("referenceMultiplier must be a number (got "+typeof u+" "+u+" instead)")}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(d[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:y(u,r),rhsCurrency:t,rhsValue:y(u,r)/e}:{lhsCurrency:t,lhsValue:y(u,t),rhsCurrency:r,rhsValue:e*y(u,t)}}(e,t,r,{reference:m,referenceMultiplier:s});return v.formats.equation={output:h(c,{significantFigures:l},i),reference:c.lhsCurrency===t?"source":"target",referenceMultiplier:c.lhsValue,calculationInDecimal:u(c.rhsValue,i,l)},v.suggested=c.lhsCurrency===t&&1===c.lhsValue?{format:"decimal",output:v.formats.decimal.output}:{format:"equation",output:v.formats.equation.output},v}function b(e){var t=e.rate,r=e.sourceCurrency,n=e.targetCurrency,i=e.locale,a=function(e,t){return"BRL"===e&&t<=10||t<.1}(r,t),o=a?1/t:t,u="1 "+(a?n:r),m=v(o,i)+" "+(a?r:n);return{decimal:v(o,i),inverted:a,equation:u+" = "+m}}var p,D=function(e,t){return void 0===t&&(t="en-GB"),Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:2}).format(e)},I={},F=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],w=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function E(e,t,r){return void 0===t&&(t="en-GB"),void 0===p&&(p=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),p?new Intl.DateTimeFormat(function(e){return function(e){return void 0===I[e]&&(I[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),I[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r){void 0===r&&(r={});var n="UTC"===r.timeZone,i=[];if(r.day&&i.push(n?t.getUTCDate():t.getDate()),r.month){var a=function(e,t,r){return"short"===e.month?w[t?r.getUTCMonth():r.getMonth()]:(t?r.getUTCMonth():r.getMonth())+1}(r,n,t);!function(e){return"short"===e.month}(r)?i.push(a):i.unshift(a)}r.year&&i.push(t.getUTCFullYear());var o=function(e){return"short"===e.month?" ":"/"}(r),u=i.join(o);if(r.weekday){var m=F[n?t.getUTCDay():t.getDay()];u=u?m+", "+u:m}return u||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var M,N={cs:{"relative-format-in-seconds":"během pár vteřin","relative-format-in-minutes":"v {minutes} minutách","relative-format-in-hours":"v {hours} hodinách","relative-format-in-minute":"během 1 minuty","relative-format-in-hour":"během 1 hodiny","relative-format-by":"do {formattedDate}"},de:{"relative-format-in-seconds":"in Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in 1 Minute","relative-format-in-hour":"in 1 Stunde","relative-format-by":"bis {formattedDate}"},en:{"relative-format-in-seconds":"in seconds","relative-format-in-minutes":"in {minutes} minutes","relative-format-in-hours":"in {hours} hours","relative-format-in-minute":"in 1 minute","relative-format-in-hour":"in 1 hour","relative-format-by":"by {formattedDate}"},es:{"relative-format-in-seconds":"en segundos","relative-format-in-minutes":"en {minutes} minutos","relative-format-in-hours":"en {hours} horas","relative-format-in-minute":"en 1 minuto","relative-format-in-hour":"en 1 hora","relative-format-by":"antes del {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"en {hours} heures","relative-format-in-minute":"en 1 minute","relative-format-in-hour":"en 1 heure","relative-format-by":"d'ici au {formattedDate}"},hu:{"relative-format-in-seconds":"másodpercek alatt","relative-format-in-minutes":"{minutes} percen belül","relative-format-in-hours":"{hours} órán belül","relative-format-in-minute":"1 percen belül","relative-format-in-hour":"1 órán belül","relative-format-by":"ekkor: {formattedDate}"},id:{"relative-format-in-seconds":"dalam beberapa detik","relative-format-in-minutes":"dalam {minutes} menit","relative-format-in-hours":"dalam {hours} jam","relative-format-in-minute":"dalam 1 menit","relative-format-in-hour":"dalam 1 jam","relative-format-by":"sebelum {formattedDate}"},it:{"relative-format-in-seconds":"tra qualche secondo","relative-format-in-minutes":"tra {minutes} minuti","relative-format-in-hours":"tra {hours} ore","relative-format-in-minute":"in 1 minuto","relative-format-in-hour":"in 1 ora","relative-format-by":"entro il {formattedDate}"},ja:{"relative-format-in-seconds":"数秒","relative-format-in-minutes":"{minutes}分以内","relative-format-in-hours":"{hours}時間以内","relative-format-in-minute":"1分以内","relative-format-in-hour":"1時間以内","relative-format-by":"{formattedDate}まで"},pl:{"relative-format-in-seconds":"w ciągu kilku sekund","relative-format-in-minutes":"w ciągu {minutes} minut","relative-format-in-hours":"w ciągu {hours} godzin","relative-format-in-minute":"w ciągu 1 minuty","relative-format-in-hour":"w ciągu 1 godziny","relative-format-by":"do {formattedDate}"},pt:{"relative-format-in-seconds":"em segundos","relative-format-in-minutes":"em {minutes} minutos","relative-format-in-hours":"em {hours} horas","relative-format-in-minute":"em 1 minuto","relative-format-in-hour":"em 1 hora","relative-format-by":"até {formattedDate}"},ro:{"relative-format-in-seconds":"în câteva secunde","relative-format-in-minutes":"în {minutes} minute","relative-format-in-hours":"în {hours} ore","relative-format-in-minute":"în 1 minut","relative-format-in-hour":"în 1 oră","relative-format-by":"până pe {formattedDate}"},ru:{"relative-format-in-seconds":"через несколько секунд","relative-format-in-minutes":"через {minutes} мин.","relative-format-in-hours":"через {hours} ч.","relative-format-in-minute":"через минуту","relative-format-in-hour":"через 1 час","relative-format-by":"{formattedDate}"},th:{"relative-format-in-seconds":"ในไม่กี่วินาที","relative-format-in-minutes":"ใน {minutes} นาที","relative-format-in-hours":"ใน {hours} ชั่วโมง","relative-format-in-minute":"ใน 1 นาที","relative-format-in-hour":"ใน 1 ชั่วโมง","relative-format-by":"ภายใน {formattedDate}"},tr:{"relative-format-in-seconds":"saniyeler içinde","relative-format-in-minutes":"{minutes} dakika içinde","relative-format-in-hours":"{hours} saat içinde","relative-format-in-minute":"1 dakika içinde","relative-format-in-hour":"1 saat içinde","relative-format-by":"{formattedDate} itibarıyla"},uk:{"relative-format-in-seconds":"через кілька секунд","relative-format-in-minutes":"через {minutes} хв","relative-format-in-hours":"через {hours} год","relative-format-in-minute":"через 1 хвилину","relative-format-in-hour":"через 1 годину","relative-format-by":"до {formattedDate}"},"zh-CN":{"relative-format-in-seconds":"数秒内","relative-format-in-minutes":"{minutes} 分钟内","relative-format-in-hours":"{hours} 小时内","relative-format-in-minute":"1 分钟内","relative-format-in-hour":"1 小时内","relative-format-by":"{formattedDate} 前"},"zh-HK":{"relative-format-in-seconds":"數秒內","relative-format-in-minutes":"在{minutes}分鐘內","relative-format-in-hours":"在{hours}小時內","relative-format-in-minute":"在1分鐘內","relative-format-in-hour":"在1小時內","relative-format-by":"在{formattedDate}或之前"}};function C(e,t,r){var n;return void 0===t&&(t={}),(n=O(r,e)?N[r][e]:O("en",e)?N.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function O(e,t){return R(N,e)&&R(N[e],t)}function R(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function T(e,t){return void 0===t&&(t="en-GB"),e<new Date(Date.now())?"":function(e){return function(e){var t=new Date(Date.now());return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}(e)&&function(e,t){return U(e-new Date(Date.now()),M.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(U(r,M.SECOND)<60)return function(e){return C("relative-format-in-seconds",{},e)}(t);var n=U(r,M.MINUTE);return n<60?B(n,t,M.MINUTE):B(U(r,M.HOUR),t,M.HOUR)}(e,t):function(e,t){return C("relative-format-by",{formattedDate:E(e,t,{month:"short",day:"numeric"})},t)}(e,t)}function U(e,t){var r,n=((r={})[M.HOUR]=36e5,r[M.MINUTE]=6e4,r[M.SECOND]=1e3,r);return Math.ceil(e/n[t])}function B(e,t,r){var n;return 1===e?C("relative-format-in-"+r,{},t):C("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(M||(M={}));export{f as formatAmount,E as formatDate,l as formatMoney,m as formatNumber,u as formatNumberToSignificantDigits,D as formatPercentage,v as formatRate,T as formatRelativeDate,b as getDisplayRate,g as getRateInAllFormats};
|
|
1
|
+
var e;function t(t){return void 0===e&&(e="object"==typeof Intl&&void 0!==Intl&&"function"==typeof Intl.NumberFormat&&Intl.NumberFormat&&"function"==typeof Intl.NumberFormat.supportedLocalesOf&&Intl.NumberFormat.supportedLocalesOf&&1===Intl.NumberFormat.supportedLocalesOf(t).length),e}var r={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},n={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},i={};function a(e,t){var r=t?""+e+Object.entries(t):e;return i[r]||(i[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),i[r]}function o(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}function u(e,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n=6),m(e,t,n,r.TYPE)}function m(e,i,u,m){if(void 0===i&&(i="en-GB"),void 0===m&&(m="FractionDigits"),!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));var s=m===r.TYPE?r:n,f=null!=u&&"number"==typeof u&&u>=s.MIN_PRECISION&&u<=s.MAX_PRECISION,l=o(i);return t(l)?(f?a(l,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(u,m)):a(l)).format(e):f?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(e,u,m):""+e}var s={BIF:0,BYR:0,CLP:0,DJF:0,GNF:0,IDR:0,JPY:0,KMF:0,KRW:0,MGA:0,PYG:0,RWF:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,HUF:0,UGX:0,KES:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};function f(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),m(e,r,function(e,t,r){return function(e){return e%1==0}(e)&&!r?0:function(e){void 0===e&&(e="");var t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(s,t)?s[t]:2}(t)}(e,t,n.alwaysShowDecimals))}function l(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),f(e,t,r,n)+" "+(t||"").toUpperCase()}function v(e,t,r){if("string"==typeof t)return c(e,t);var n=t&&t.significantFigures;return n?u(e,r||"en-GB",n):c(e,r||"en-GB")}function c(e,r){var n=4-Math.min(2,Math.max(0,Math.floor(Math.log10(e))-1));return function(e,r,n,i){var u=o(n);return t(u)?a(u,r).format(e):i}(e,{minimumFractionDigits:n,maximumFractionDigits:n},r,e.toFixed(n))}function h(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,a=e.rhsCurrency,o=(void 0===t?{}:t).significantFigures,m=void 0===o?6:o;return void 0===r&&(r="en-GB"),f(e.lhsValue,n,r)+" "+n+" = "+u(i,r,m)+" "+a}var d={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0},THB:{hasInversionEnabled:!0}};function y(e,t){return e||(d[t]||{}).multiplierForEquation||1}function b(e,t,r,n,i){var a=void 0===n?{}:n,o=a.reference,m=void 0===o?"auto":o,s=a.referenceMultiplier,f=a.significantFigures,l=void 0===f?6:f;void 0===i&&(i="en-GB");var v={suggested:{},formats:{}};v.formats.decimal={output:u(e,i,l),significantFigures:l};var c=function(e,t,r,n){var i=void 0===n?{}:n,a=i.reference,o=void 0===a?"auto":a,u=i.referenceMultiplier;return function(){if(!e)throw new Error("rate parameter is mandatory (got "+e+" instead).");if(!t)throw new Error("sourceCurrency parameter is mandatory (got "+t+" instead).");if(!r)throw new Error("targetCurrency parameter is mandatory (got "+r+" instead).");if(u&&"number"!=typeof u)throw new Error("referenceMultiplier must be a number (got "+typeof u+" "+u+" instead)")}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(d[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:y(u,r),rhsCurrency:t,rhsValue:y(u,r)/e}:{lhsCurrency:t,lhsValue:y(u,t),rhsCurrency:r,rhsValue:e*y(u,t)}}(e,t,r,{reference:m,referenceMultiplier:s});return v.formats.equation={output:h(c,{significantFigures:l},i),reference:c.lhsCurrency===t?"source":"target",referenceMultiplier:c.lhsValue,calculationInDecimal:u(c.rhsValue,i,l)},v.suggested=c.lhsCurrency===t&&1===c.lhsValue?{format:"decimal",output:v.formats.decimal.output}:{format:"equation",output:v.formats.equation.output},v}function g(e){var t=e.rate,r=e.sourceCurrency,n=e.targetCurrency,i=e.locale,a=function(e,t){return"BRL"===e&&t<=10||t<.1}(r,t),o=a?1/t:t,u="1 "+(a?n:r),m=v(o,i)+" "+(a?r:n);return{decimal:v(o,i),inverted:a,equation:u+" = "+m}}var D,p=function(e,t){return void 0===t&&(t="en-GB"),Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:2}).format(e)},I={},F=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],w=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function E(e,t,r){return void 0===t&&(t="en-GB"),void 0===D&&(D=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),D?new Intl.DateTimeFormat(function(e){return function(e){return void 0===I[e]&&(I[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),I[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r){void 0===r&&(r={});var n="UTC"===r.timeZone,i=[];if(r.day&&i.push(n?t.getUTCDate():t.getDate()),r.month){var a=function(e,t,r){return"short"===e.month?w[t?r.getUTCMonth():r.getMonth()]:(t?r.getUTCMonth():r.getMonth())+1}(r,n,t);!function(e){return"short"===e.month}(r)?i.push(a):i.unshift(a)}r.year&&i.push(t.getUTCFullYear());var o=function(e){return"short"===e.month?" ":"/"}(r),u=i.join(o);if(r.weekday){var m=F[n?t.getUTCDay():t.getDay()];u=u?m+", "+u:m}return u||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var M,N={cs:{"relative-format-in-seconds":"během pár sekund","relative-format-in-minutes":"během {minutes} min.","relative-format-in-hours":"během {hours} hod.","relative-format-in-minute":"během 1 minuty","relative-format-in-hour":"během 1 hodiny","relative-format-by":"do {formattedDate}"},da:{"relative-format-in-seconds":"om sekunder","relative-format-in-minutes":"om {minutes} minutter","relative-format-in-hours":"om {hours} timer","relative-format-in-minute":"om 1 minut","relative-format-in-hour":"om 1 time","relative-format-by":"inden {formattedDate}"},de:{"relative-format-in-seconds":"in Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in 1 Minute","relative-format-in-hour":"in 1 Stunde","relative-format-by":"bis {formattedDate}"},en:{"relative-format-in-seconds":"in seconds","relative-format-in-minutes":"in {minutes} minutes","relative-format-in-hours":"in {hours} hours","relative-format-in-minute":"in 1 minute","relative-format-in-hour":"in 1 hour","relative-format-by":"by {formattedDate}"},es:{"relative-format-in-seconds":"en segundos","relative-format-in-minutes":"en {minutes} minutos","relative-format-in-hours":"en {hours} horas","relative-format-in-minute":"en 1 minuto","relative-format-in-hour":"en 1 hora","relative-format-by":"antes del {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"en {hours} heures","relative-format-in-minute":"en 1 minute","relative-format-in-hour":"en 1 heure","relative-format-by":"d'ici au {formattedDate}"},hu:{"relative-format-in-seconds":"másodpercek alatt","relative-format-in-minutes":"{minutes} percen belül","relative-format-in-hours":"{hours} órán belül","relative-format-in-minute":"1 percen belül","relative-format-in-hour":"1 órán belül","relative-format-by":"ekkor: {formattedDate}"},id:{"relative-format-in-seconds":"dalam beberapa detik","relative-format-in-minutes":"dalam {minutes} menit","relative-format-in-hours":"dalam {hours} jam","relative-format-in-minute":"dalam 1 menit","relative-format-in-hour":"dalam 1 jam","relative-format-by":"sebelum {formattedDate}"},it:{"relative-format-in-seconds":"tra qualche secondo","relative-format-in-minutes":"tra {minutes} minuti","relative-format-in-hours":"tra {hours} ore","relative-format-in-minute":"in 1 minuto","relative-format-in-hour":"in 1 ora","relative-format-by":"entro il {formattedDate}"},ja:{"relative-format-in-seconds":"数秒","relative-format-in-minutes":"{minutes}分以内","relative-format-in-hours":"{hours}時間以内","relative-format-in-minute":"1分以内","relative-format-in-hour":"1時間以内","relative-format-by":"{formattedDate}まで"},nb:{"relative-format-in-seconds":"om noen sekunder","relative-format-in-minutes":"om {minutes} minutter","relative-format-in-hours":"om {hours} timer","relative-format-in-minute":"om 1 minutt","relative-format-in-hour":"om 1 time","relative-format-by":"innen {formattedDate}"},nl:{"relative-format-in-seconds":"over enkele seconden","relative-format-in-minutes":"over {minutes} minuten","relative-format-in-hours":"over {hours} uur","relative-format-in-minute":"over 1 minuut","relative-format-in-hour":"over 1 uur","relative-format-by":"voor {formattedDate}"},pl:{"relative-format-in-seconds":"w ciągu kilku sekund","relative-format-in-minutes":"w ciągu {minutes} minut","relative-format-in-hours":"w ciągu {hours} godzin","relative-format-in-minute":"w ciągu 1 minuty","relative-format-in-hour":"w ciągu 1 godziny","relative-format-by":"do {formattedDate}"},pt:{"relative-format-in-seconds":"em segundos","relative-format-in-minutes":"em {minutes} minutos","relative-format-in-hours":"em {hours} horas","relative-format-in-minute":"em 1 minuto","relative-format-in-hour":"em 1 hora","relative-format-by":"até {formattedDate}"},ro:{"relative-format-in-seconds":"în câteva secunde","relative-format-in-minutes":"în {minutes} minute","relative-format-in-hours":"în {hours} ore","relative-format-in-minute":"în 1 minut","relative-format-in-hour":"în 1 oră","relative-format-by":"până pe {formattedDate}"},ru:{"relative-format-in-seconds":"через несколько секунд","relative-format-in-minutes":"через {minutes} мин.","relative-format-in-hours":"через {hours} ч.","relative-format-in-minute":"через минуту","relative-format-in-hour":"через 1 час","relative-format-by":"{formattedDate}"},sv:{"relative-format-in-seconds":"om några sekunder","relative-format-in-minutes":"om {minutes} minuter","relative-format-in-hours":"om {hours} timmar","relative-format-in-minute":"om 1 minut","relative-format-in-hour":"om 1 timme","relative-format-by":"senast {formattedDate}"},th:{"relative-format-in-seconds":"ในไม่กี่วินาที","relative-format-in-minutes":"ใน {minutes} นาที","relative-format-in-hours":"ใน {hours} ชั่วโมง","relative-format-in-minute":"ใน 1 นาที","relative-format-in-hour":"ใน 1 ชั่วโมง","relative-format-by":"ภายใน {formattedDate}"},tr:{"relative-format-in-seconds":"saniyeler içinde","relative-format-in-minutes":"{minutes} dakika içinde","relative-format-in-hours":"{hours} saat içinde","relative-format-in-minute":"1 dakika içinde","relative-format-in-hour":"1 saat içinde","relative-format-by":"{formattedDate} itibarıyla"},uk:{"relative-format-in-seconds":"через кілька секунд","relative-format-in-minutes":"через {minutes} хв","relative-format-in-hours":"через {hours} год","relative-format-in-minute":"через 1 хвилину","relative-format-in-hour":"через 1 годину","relative-format-by":"до {formattedDate}"},"zh-CN":{"relative-format-in-seconds":"数秒内","relative-format-in-minutes":"{minutes} 分钟内","relative-format-in-hours":"{hours} 小时内","relative-format-in-minute":"1 分钟内","relative-format-in-hour":"1 小时内","relative-format-by":"{formattedDate} 前"},"zh-HK":{"relative-format-in-seconds":"數秒內","relative-format-in-minutes":"在{minutes}分鐘內","relative-format-in-hours":"在{hours}小時內","relative-format-in-minute":"在1分鐘內","relative-format-in-hour":"在1小時內","relative-format-by":"在{formattedDate}或之前"}};function C(e,t,r){var n;return void 0===t&&(t={}),(n=O(r,e)?N[r][e]:O("en",e)?N.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function O(e,t){return R(N,e)&&R(N[e],t)}function R(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function T(e,t){return void 0===t&&(t="en-GB"),e<new Date(Date.now())?"":function(e){return function(e){var t=new Date(Date.now());return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}(e)&&function(e,t){return U(e-new Date(Date.now()),M.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(U(r,M.SECOND)<60)return function(e){return C("relative-format-in-seconds",{},e)}(t);var n=U(r,M.MINUTE);return n<60?k(n,t,M.MINUTE):k(U(r,M.HOUR),t,M.HOUR)}(e,t):function(e,t){return C("relative-format-by",{formattedDate:E(e,t,{month:"short",day:"numeric"})},t)}(e,t)}function U(e,t){var r,n=((r={})[M.HOUR]=36e5,r[M.MINUTE]=6e4,r[M.SECOND]=1e3,r);return Math.ceil(e/n[t])}function k(e,t,r){var n;return 1===e?C("relative-format-in-"+r,{},t):C("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(M||(M={}));export{f as formatAmount,E as formatDate,l as formatMoney,m as formatNumber,u as formatNumberToSignificantDigits,p as formatPercentage,v as formatRate,T as formatRelativeDate,g as getDisplayRate,b as getRateInAllFormats};
|
|
2
2
|
//# sourceMappingURL=formatting.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.module.js","sources":["../src/number/feature-detection/intl.ts","../src/number/number.ts","../src/defaults/index.ts","../src/currency/currency.ts","../src/rate/formatRate.ts","../src/rate/formatRateEquation.ts","../src/rate/config.ts","../src/rate/getRateEquation.ts","../src/rate/getRateInAllFormats.ts","../src/rate/getDisplayRate.ts","../src/date/support-detection/intl.ts","../src/percentage/percentage.ts","../src/date/support-detection/selectedLocale.ts","../src/date/fallback-format/fallbackFormat.ts","../src/date/date.ts","../src/date/isToday.ts","../src/date/relative-date/relativeDateFormatter.ts","../src/translations/translator.ts"],"sourcesContent":["let isSupported: boolean | undefined;\n\n/**\n * Checks if Intl.NumberFormat is supported for a specific locale\n * @param {String} locale\n * @returns {Boolean}\n */\nexport function isIntlNumberFormatSupported(locale: string): boolean {\n if (isSupported === undefined) {\n isSupported =\n typeof Intl === 'object' &&\n Intl !== undefined &&\n typeof Intl.NumberFormat === 'function' &&\n Intl.NumberFormat &&\n typeof Intl.NumberFormat.supportedLocalesOf === 'function' &&\n Intl.NumberFormat.supportedLocalesOf &&\n Intl.NumberFormat.supportedLocalesOf(locale).length === 1;\n }\n return isSupported;\n}\n","import {\n DEFAULT_LOCALE,\n PRECISION,\n NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n PrecisionType,\n} from '../defaults';\nimport { isIntlNumberFormatSupported } from './feature-detection';\n\nconst { SIGNIFICANT_DIGITS, FRACTION_DIGITS } = PRECISION;\n\nconst formatters: Record<string, any> = {}; // cache, sample: { 'en-GB': formatter, 'en-GB2': formatter }\n\n/**\n * Returns a formatter for the specified locale and NumberFormatOptions\n * @param {String} locale\n * @param {Intl.NumberFormatOptions} options\n * @returns {Intl.NumberFormat}\n */\nfunction getFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const cacheKey = options ? `${locale}${Object.entries(options)}` : locale;\n if (!formatters[cacheKey]) {\n formatters[cacheKey] = options\n ? new Intl.NumberFormat(locale, options)\n : new Intl.NumberFormat(locale);\n }\n return formatters[cacheKey];\n}\n\n/**\n * Returns the desired options object for\n * `Number.toLocaleString` and `Intl.NumberFormat` methods\n * @param {Number} precision\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n */\nfunction getPrecisionOptions(precision: number, precisionType: PrecisionType) {\n return {\n [`minimum${precisionType}`]: precision,\n [`maximum${precisionType}`]: precision,\n };\n}\n\n/**\n * Returns the locale that was passed in if it works\n * with `toLocaleString` or otherwise falls back to `DEFAULT_LOCALE`\n * @param {String} locale\n */\nfunction getValidLocale(locale: string) {\n try {\n const noUnderscoreLocale = locale.replace(/_/, '-');\n\n Intl.NumberFormat(noUnderscoreLocale);\n return noUnderscoreLocale;\n } catch (e) {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Formats the number as a fallback for when `toLocaleString` method is not supported\n * by the browser. Will use `toFixed` to format `FractionDigits` precisionType and `toPrecision`\n * to format `SignificantDigits` precision type.\n * @param {Number} number\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nfunction formatNumberWithFallback(number: number, precision: number, precisionType: PrecisionType) {\n return precisionType === SIGNIFICANT_DIGITS.TYPE\n ? number.toPrecision(precision)\n : number.toFixed(precision);\n}\n\n/**\n * Formats a number to a significant number of digits with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {Number} significantDigits - this may be a value between 1 and 21, inclusive\n * @param {String} locale\n * @returns {String}\n */\nexport function formatNumberToSignificantDigits(\n number: number,\n locale = DEFAULT_LOCALE,\n significantDigits = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n) {\n return formatNumber(number, locale, significantDigits, SIGNIFICANT_DIGITS.TYPE);\n}\n\n/**\n * Formats a number precisely with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {String} locale\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nexport function formatNumber(\n number: number,\n locale = DEFAULT_LOCALE,\n precision?: number,\n precisionType: PrecisionType = 'FractionDigits',\n): string {\n if (!number && number !== 0) {\n return '';\n }\n\n if (typeof number === 'string' && Number(number)) {\n // eslint-disable-next-line no-param-reassign\n number = Number(number);\n }\n\n const { MIN_PRECISION, MAX_PRECISION } =\n precisionType === SIGNIFICANT_DIGITS.TYPE ? SIGNIFICANT_DIGITS : FRACTION_DIGITS;\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed#Parameters\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat#Parameters\n const isPrecisionValid =\n precision !== undefined &&\n precision !== null &&\n typeof precision === 'number' &&\n precision >= MIN_PRECISION &&\n precision <= MAX_PRECISION;\n\n const validatedLocale = getValidLocale(locale);\n\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return isPrecisionValid\n ? formatNumberWithFallback(number, precision!, precisionType)\n : `${number}`;\n }\n\n const formatter = isPrecisionValid\n ? getFormatter(validatedLocale, getPrecisionOptions(precision!, precisionType))\n : getFormatter(validatedLocale);\n\n return formatter.format(number);\n}\n\nexport function formatNumberWithOptions(\n value: number,\n options: Intl.NumberFormatOptions,\n locale: string,\n fallback: string,\n) {\n const validatedLocale = getValidLocale(locale);\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return fallback;\n }\n\n return getFormatter(validatedLocale, options).format(value);\n}\n","export const DEFAULT_LOCALE = 'en-GB';\nexport const DEFAULT_PRECISION_TYPE = 'FractionDigits';\nexport const NUMBER_OF_RATE_SIGNIFICANT_DIGITS = 6;\nexport const DEFAULT_RATE_MULTIPLIER = 1;\nexport const PRECISION = {\n SIGNIFICANT_DIGITS: {\n TYPE: 'SignificantDigits' as PrecisionType,\n MIN_PRECISION: 1,\n MAX_PRECISION: 21,\n },\n FRACTION_DIGITS: {\n TYPE: 'FractionDigits' as PrecisionType,\n MIN_PRECISION: 0,\n MAX_PRECISION: 20,\n },\n};\nexport type PrecisionType = 'SignificantDigits' | 'FractionDigits';\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumber } from '../number';\n\nconst currencyDecimals = {\n BIF: 0,\n BYR: 0,\n CLP: 0,\n DJF: 0,\n GNF: 0,\n IDR: 0,\n JPY: 0,\n KMF: 0,\n KRW: 0,\n MGA: 0,\n PYG: 0,\n RWF: 0,\n VND: 0,\n VUV: 0,\n XAF: 0,\n XOF: 0,\n XPF: 0,\n // technically HUF does have decimals, but due to the exchange rate banks\n // do not accept decimal amounts\n HUF: 0,\n UGX: 0,\n // local banks do not consistently support the ideal 2-decimal places fractional part\n KES: 0,\n\n BHD: 3,\n JOD: 3,\n KWD: 3,\n OMR: 3,\n TND: 3,\n};\n\nconst DEFAULT_CURRENCY_DECIMALS = 2;\n\nfunction getCurrencyDecimals(currency = '') {\n const upperCaseCurrency = currency.toUpperCase();\n if (Object.prototype.hasOwnProperty.call(currencyDecimals, upperCaseCurrency)) {\n return currencyDecimals[upperCaseCurrency as keyof typeof currencyDecimals];\n }\n return DEFAULT_CURRENCY_DECIMALS;\n}\n\nfunction amountHasNoDecimals(amount: number): boolean {\n return amount % 1 === 0;\n}\n\nfunction getPrecision(amount: number, currencyCode: string, alwaysShowDecimals: boolean): number {\n if (amountHasNoDecimals(amount) && !alwaysShowDecimals) {\n return 0;\n }\n\n return getCurrencyDecimals(currencyCode);\n}\n\nexport function formatAmount(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n): string {\n const availablePrecision = getPrecision(amount, currencyCode, options.alwaysShowDecimals);\n\n return formatNumber(amount, locale, availablePrecision);\n}\n\nexport function formatMoney(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n) {\n return `${formatAmount(amount, currencyCode, locale, options)} ${(\n currencyCode || ''\n ).toUpperCase()}`;\n}\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberWithOptions, formatNumberToSignificantDigits } from '../number';\n\nexport type FormatRateOptions = {\n significantFigures?: number;\n};\n\nfunction formatRate(rate: number, locale: string): string;\n/**\n * @deprecated Do not specify options, always specify a locale.\n */\nfunction formatRate(rate: number, options?: FormatRateOptions, locale?: string): string;\n\nfunction formatRate(\n rate: number,\n optionsOrLocale?: FormatRateOptions | string,\n locale?: string,\n): string {\n if (typeof optionsOrLocale === 'string') {\n return formatRateInternal(rate, optionsOrLocale);\n }\n\n const significantFigures = optionsOrLocale && optionsOrLocale.significantFigures;\n if (significantFigures) {\n return formatNumberToSignificantDigits(rate, locale || DEFAULT_LOCALE, significantFigures);\n }\n\n return formatRateInternal(rate, locale || DEFAULT_LOCALE);\n}\n\nfunction formatRateInternal(rate: number, locale: string) {\n // We lower the number of decimal places if the value is big, to minimun of 2\n const sizeAdjuster =\n // Upper bound 2\n Math.min(\n 2,\n // Low bound 0\n Math.max(\n 0,\n // Number of siginificant leading digits - 1\n Math.floor(Math.log10(rate)) - 1,\n ),\n );\n const fractionDigits = 4 - sizeAdjuster;\n\n return formatNumberWithOptions(\n rate,\n {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n },\n locale,\n rate.toFixed(fractionDigits),\n );\n}\n\nexport default formatRate;\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport { formatAmount } from '../currency';\n\nexport default function(\n {\n lhsValue,\n lhsCurrency,\n rhsValue,\n rhsCurrency,\n }: { lhsValue: number; lhsCurrency: string; rhsValue: number; rhsCurrency: string },\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return `${formatAmount(\n lhsValue,\n lhsCurrency,\n locale,\n )} ${lhsCurrency} = ${formatNumberToSignificantDigits(\n rhsValue,\n locale,\n significantFigures,\n )} ${rhsCurrency}`;\n}\n","export default {\n BRL: {\n hasInversionEnabled: true,\n },\n INR: {\n hasInversionEnabled: true,\n },\n JPY: {\n hasInversionEnabled: true,\n },\n IDR: {\n hasInversionEnabled: true\n },\n HUF: {\n hasInversionEnabled: true,\n },\n RON: {\n hasInversionEnabled: true,\n },\n THB: {\n hasInversionEnabled: true,\n },\n} as Record<string, { hasInversionEnabled?: boolean; multiplierForEquation?: number }>;\n","import config from './config';\nimport { DEFAULT_RATE_MULTIPLIER } from '../defaults';\n\nexport type Reference = 'auto' | 'source' | 'target';\n\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n }: { reference?: Reference; referenceMultiplier?: number } = {},\n) {\n validateParameters();\n\n if (shouldInvertEquation(reference, sourceCurrency)) {\n return {\n // inverted.\n lhsCurrency: targetCurrency,\n lhsValue: getMultiplier(referenceMultiplier, targetCurrency),\n rhsCurrency: sourceCurrency,\n rhsValue: getMultiplier(referenceMultiplier, targetCurrency) / rate,\n };\n }\n return {\n // normal.\n lhsCurrency: sourceCurrency,\n lhsValue: getMultiplier(referenceMultiplier, sourceCurrency),\n rhsCurrency: targetCurrency,\n rhsValue: rate * getMultiplier(referenceMultiplier, sourceCurrency),\n };\n\n function validateParameters(): void {\n if (!rate) throw new Error(`rate parameter is mandatory (got ${rate} instead).`);\n if (!sourceCurrency)\n throw new Error(`sourceCurrency parameter is mandatory (got ${sourceCurrency} instead).`);\n if (!targetCurrency)\n throw new Error(`targetCurrency parameter is mandatory (got ${targetCurrency} instead).`);\n if (referenceMultiplier && typeof referenceMultiplier !== 'number') {\n throw new Error(\n `referenceMultiplier must be a number (got ${typeof referenceMultiplier} ${referenceMultiplier} instead)`,\n );\n }\n // Let shouldInvertEquation() handle `reference`.\n }\n}\n\nfunction shouldInvertEquation(referenceConfig: Reference, sourceCurrency: string): boolean {\n if (referenceConfig === 'source') return false;\n if (referenceConfig === 'target') return true;\n if (['auto', undefined, null].indexOf(referenceConfig) > -1)\n return !!(config[sourceCurrency] || {}).hasInversionEnabled;\n throw new Error(\n `Unrecognized reference config value: ${referenceConfig} (valid values are auto, source, target).`,\n );\n}\n\nfunction getMultiplier(\n referenceMultiplierOverride: number | undefined,\n lhsCurrency: string,\n): number {\n return (\n referenceMultiplierOverride ||\n (config[lhsCurrency] || {}).multiplierForEquation ||\n DEFAULT_RATE_MULTIPLIER\n );\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\n\n/**\n * @deprecated use getDisplayRate\n */\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n }: { reference?: Reference; referenceMultiplier?: number; significantFigures?: number } = {},\n locale = DEFAULT_LOCALE,\n) {\n const response = {\n suggested: {},\n formats: {} as Record<string, any>,\n };\n\n response.formats.decimal = {\n output: formatNumberToSignificantDigits(rate, locale, significantFigures),\n significantFigures,\n };\n\n const equation = getRateEquation(rate, sourceCurrency, targetCurrency, {\n reference,\n referenceMultiplier,\n });\n\n response.formats.equation = {\n output: formatRateEquation(equation, { significantFigures }, locale),\n reference: equation.lhsCurrency === sourceCurrency ? 'source' : 'target',\n referenceMultiplier: equation.lhsValue,\n calculationInDecimal: formatNumberToSignificantDigits(\n equation.rhsValue,\n locale,\n significantFigures,\n ),\n };\n\n if (equation.lhsCurrency === sourceCurrency && equation.lhsValue === 1) {\n response.suggested = {\n format: 'decimal',\n output: response.formats.decimal.output,\n };\n } else {\n response.suggested = {\n format: 'equation',\n output: response.formats.equation.output,\n };\n }\n\n return response;\n}\n","import formatRate from './formatRate';\n\nexport type DisplayRate = {\n /**\n * Numerical rate to 4 decimal places. Only use when there is another indicator on the screen\n * for if the rate is inverted or not, such as a multiply/divide icon.\n */\n decimal: string;\n /**\n * Rate equation such as `1 ABC = 0.5743 DEF`. Use this whenever you need to display a rate\n * without much context.\n */\n equation: string;\n /**\n * If the rates given are given in the opposite direction to now the function was called.\n * For example if source was BRL and target was EUR, an inverted equation of\n * `1 EUR = 5.1233 BRL` may be returned.\n */\n inverted: boolean;\n};\n\n/**\n * Returns rates for displaying to customers.\n */\nexport default function getDisplayRate({\n rate,\n sourceCurrency,\n targetCurrency,\n locale,\n}: {\n rate: number;\n sourceCurrency: string;\n targetCurrency: string;\n locale: string;\n}): DisplayRate {\n const inverted = shouldInvertEquation(sourceCurrency, rate);\n\n const rawValue = inverted ? 1 / rate : rate;\n\n const leftHandSide = `1 ${inverted ? targetCurrency : sourceCurrency}`;\n const rightHandSide = `${formatRate(rawValue, locale)} ${\n inverted ? sourceCurrency : targetCurrency\n }`;\n\n return {\n decimal: formatRate(rawValue, locale),\n inverted,\n equation: `${leftHandSide} = ${rightHandSide}`,\n };\n}\n\nfunction shouldInvertEquation(sourceCurrency: string, rate: number): boolean {\n if (sourceCurrency === 'BRL' && rate <= 10) {\n // Prefer to show BRL inverted unless the rate would be below 0.1\n return true;\n }\n\n // Prefer not to show very low rates\n return rate < 0.1;\n}\n","import { DEFAULT_LOCALE } from '../../defaults';\n\nlet intlSupported: boolean | undefined; // cache\n\nexport function isIntlSupported(): boolean {\n if (intlSupported === undefined) {\n intlSupported = intlDateTimeFormatReturnsCorrectValue();\n }\n return intlSupported;\n}\n\nfunction intlDateTimeFormatReturnsCorrectValue(): boolean {\n try {\n const date = new Date(2018, 11, 1);\n const dateString = new Intl.DateTimeFormat(DEFAULT_LOCALE).format(date);\n return dateString === '01/12/2018';\n } catch (e) {\n return false;\n }\n}\n","export const formatPercentage= (percentage: number, locale = 'en-GB'): string =>\n Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(percentage);\n\n\n","const supportedLocales: Record<string, boolean> = {}; // cache\n\nexport function isSelectedLocaleSupported(locale: string): boolean {\n if (supportedLocales[locale] === undefined) {\n supportedLocales[locale] = checkForLocaleSupport(locale);\n }\n return supportedLocales[locale];\n}\n\nfunction checkForLocaleSupport(locale: string): boolean {\n try {\n return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;\n } catch (e) {\n return false;\n }\n}\n","const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst SHORT_MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nfunction getJoiningCharacter(options: Intl.DateTimeFormatOptions): string {\n return options.month === 'short' ? ' ' : '/';\n}\n\nfunction isMonthFirst(options: Intl.DateTimeFormatOptions) {\n return options.month === 'short';\n}\n\nfunction getFormattedMonth(\n options: Intl.DateTimeFormatOptions,\n isUTC: boolean,\n date: Date,\n): string | number {\n if (options.month === 'short') {\n return SHORT_MONTHS[isUTC ? date.getUTCMonth() : date.getMonth()];\n }\n return (isUTC ? date.getUTCMonth() : date.getMonth()) + 1;\n}\n\n// Sample outputs: 'Sat, 1/12/2018', '1/12/2018', '12/2018', Sat, 1'\nexport function getFallbackFormat(date: Date, options: Intl.DateTimeFormatOptions = {}): string {\n const isUTC = options.timeZone === 'UTC';\n\n const dateParts = [];\n if (options.day) dateParts.push(isUTC ? date.getUTCDate() : date.getDate());\n if (options.month) {\n const monthFormat = getFormattedMonth(options, isUTC, date);\n if (isMonthFirst(options)) {\n dateParts.unshift(monthFormat);\n } else {\n dateParts.push(monthFormat);\n }\n }\n if (options.year) dateParts.push(isUTC ? date.getUTCFullYear() : date.getUTCFullYear());\n\n const joiningCharacter = getJoiningCharacter(options);\n let fallbackDate = dateParts.join(joiningCharacter);\n\n if (options.weekday) {\n const dayName = WEEKDAYS[isUTC ? date.getUTCDay() : date.getDay()];\n fallbackDate = fallbackDate ? `${dayName}, ${fallbackDate}` : dayName;\n }\n return (\n fallbackDate ||\n getFallbackFormat(date, {\n timeZone: options.timeZone,\n day: 'true',\n month: 'true',\n year: 'true',\n })\n );\n}\n","import { isIntlSupported, isSelectedLocaleSupported } from './support-detection';\nimport { getFallbackFormat } from './fallback-format';\nimport { DEFAULT_LOCALE } from '../defaults';\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? new Intl.DateTimeFormat(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n","export default (date: Date): boolean => {\n const today = new Date(Date.now());\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n","import isToday from '../isToday';\nimport { formatDate } from '../date';\nimport { getTranslation } from '../../translations/translator';\nimport { DEFAULT_LOCALE } from '../../defaults';\n\nexport function formatRelativeDate(date: Date, locale = DEFAULT_LOCALE): string {\n if (date < new Date(Date.now())) {\n return '';\n }\n\n let formatted;\n if (shouldFormatRelative(date)) {\n formatted = formatRelative(date, locale);\n } else {\n formatted = formatAbsolute(date, locale);\n }\n return formatted;\n}\n\nfunction shouldFormatRelative(date: Date): boolean {\n return isToday(date) && isWithinHours(date, 12);\n}\n\nfunction isWithinHours(date: Date, boundary: number): boolean {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n return getDifferenceIn(diff, TimeUnit.HOUR) <= boundary;\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n\n if (getDifferenceIn(diff, TimeUnit.SECOND) < 60) {\n return formatSeconds(locale);\n }\n\n const differenceInMinutes = getDifferenceIn(diff, TimeUnit.MINUTE);\n if (differenceInMinutes < 60) {\n return formatTimeUnit(differenceInMinutes, locale, TimeUnit.MINUTE);\n }\n\n return formatTimeUnit(getDifferenceIn(diff, TimeUnit.HOUR), locale, TimeUnit.HOUR);\n}\n\nfunction formatAbsolute(date: Date, locale: string): string {\n const params = {\n formattedDate: formatDate(date, locale, { month: 'short', day: 'numeric' }),\n };\n return getTranslation('relative-format-by', params, locale);\n}\n\nfunction getDifferenceIn(diff: number, timeUnitValue: TimeUnit): number {\n const millisecondsMap = {\n [TimeUnit.HOUR]: 3600000,\n [TimeUnit.MINUTE]: 60000,\n [TimeUnit.SECOND]: 1000,\n };\n return Math.ceil(diff / millisecondsMap[timeUnitValue]);\n}\n\nfunction formatTimeUnit(value: number, locale: string, timeUnit: string): string {\n if (value === 1) {\n return getTranslation(`relative-format-in-${timeUnit}`, {}, locale);\n }\n return getTranslation(\n `relative-format-in-${timeUnit}s`,\n { [`${timeUnit}s`]: `${value}` },\n locale,\n );\n}\n\nfunction formatSeconds(locale: string) {\n return getTranslation('relative-format-in-seconds', {}, locale);\n}\n\nenum TimeUnit {\n SECOND = 'second',\n MINUTE = 'minute',\n HOUR = 'hour',\n}\n","// eslint-disable-next-line import/no-unresolved\nimport translations from './translations.json';\n\nexport function getTranslation(\n translationKey: string,\n params: Record<string, string> = {},\n locale: string,\n): string {\n let translatedMessage: string | undefined;\n if (hasTranslation(locale, translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>)[locale][\n translationKey\n ];\n } else if (hasTranslation('en', translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>).en[translationKey];\n } else {\n translatedMessage = translationKey;\n }\n\n if (translatedMessage && params) {\n Object.keys(params).forEach(key => {\n translatedMessage = (translatedMessage as string).replace(\n new RegExp(`{${key}}`, 'g'),\n params[key],\n );\n });\n }\n\n return translatedMessage || translationKey;\n}\n\nfunction hasTranslation(locale: string, translationKey: string): boolean {\n return (\n hasOwnProperty(translations, locale) &&\n hasOwnProperty((translations as Record<string, Record<string, string>>)[locale], translationKey)\n );\n}\n\nfunction hasOwnProperty(obj: any, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n"],"names":["isSupported","isIntlNumberFormatSupported","locale","undefined","Intl","NumberFormat","supportedLocalesOf","length","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","options","cacheKey","Object","entries","getValidLocale","noUnderscoreLocale","replace","e","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","IDR","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","formatMoney","formatRate","rate","optionsOrLocale","formatRateInternal","significantFigures","fractionDigits","Math","min","max","floor","log10","value","fallback","formatNumberWithOptions","minimumFractionDigits","maximumFractionDigits","lhsCurrency","rhsValue","rhsCurrency","lhsValue","BRL","hasInversionEnabled","INR","RON","THB","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal","getDisplayRate","inverted","rawValue","leftHandSide","rightHandSide","intlSupported","formatPercentage","percentage","style","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","checkForLocaleSupport","isSelectedLocaleSupported","getSupportedLocale","getFallbackFormat","isUTC","timeZone","dateParts","day","push","getUTCDate","getDate","month","monthFormat","getUTCMonth","getMonth","getFormattedMonth","isMonthFirst","unshift","year","getUTCFullYear","joiningCharacter","getJoiningCharacter","fallbackDate","join","weekday","dayName","getUTCDay","getDay","TimeUnit","getTranslation","translationKey","params","translatedMessage","hasTranslation","translations","en","keys","forEach","key","RegExp","obj","formatRelativeDate","now","today","getFullYear","isToday","boundary","getDifferenceIn","HOUR","isWithinHours","shouldFormatRelative","diff","SECOND","formatSeconds","differenceInMinutes","MINUTE","formatTimeUnit","formatRelative","formattedDate","formatAbsolute","timeUnitValue","millisecondsMap","ceil","timeUnit"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formatting.module.js","sources":["../src/number/feature-detection/intl.ts","../src/number/number.ts","../src/defaults/index.ts","../src/currency/currency.ts","../src/rate/formatRate.ts","../src/rate/formatRateEquation.ts","../src/rate/config.ts","../src/rate/getRateEquation.ts","../src/rate/getRateInAllFormats.ts","../src/rate/getDisplayRate.ts","../src/date/support-detection/intl.ts","../src/percentage/percentage.ts","../src/date/support-detection/selectedLocale.ts","../src/date/fallback-format/fallbackFormat.ts","../src/date/date.ts","../src/date/isToday.ts","../src/date/relative-date/relativeDateFormatter.ts","../src/translations/translator.ts"],"sourcesContent":["let isSupported: boolean | undefined;\n\n/**\n * Checks if Intl.NumberFormat is supported for a specific locale\n * @param {String} locale\n * @returns {Boolean}\n */\nexport function isIntlNumberFormatSupported(locale: string): boolean {\n if (isSupported === undefined) {\n isSupported =\n typeof Intl === 'object' &&\n Intl !== undefined &&\n typeof Intl.NumberFormat === 'function' &&\n Intl.NumberFormat &&\n typeof Intl.NumberFormat.supportedLocalesOf === 'function' &&\n Intl.NumberFormat.supportedLocalesOf &&\n Intl.NumberFormat.supportedLocalesOf(locale).length === 1;\n }\n return isSupported;\n}\n","import {\n DEFAULT_LOCALE,\n PRECISION,\n NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n PrecisionType,\n} from '../defaults';\nimport { isIntlNumberFormatSupported } from './feature-detection';\n\nconst { SIGNIFICANT_DIGITS, FRACTION_DIGITS } = PRECISION;\n\nconst formatters: Record<string, any> = {}; // cache, sample: { 'en-GB': formatter, 'en-GB2': formatter }\n\n/**\n * Returns a formatter for the specified locale and NumberFormatOptions\n * @param {String} locale\n * @param {Intl.NumberFormatOptions} options\n * @returns {Intl.NumberFormat}\n */\nfunction getFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const cacheKey = options ? `${locale}${Object.entries(options)}` : locale;\n if (!formatters[cacheKey]) {\n formatters[cacheKey] = options\n ? new Intl.NumberFormat(locale, options)\n : new Intl.NumberFormat(locale);\n }\n return formatters[cacheKey];\n}\n\n/**\n * Returns the desired options object for\n * `Number.toLocaleString` and `Intl.NumberFormat` methods\n * @param {Number} precision\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n */\nfunction getPrecisionOptions(precision: number, precisionType: PrecisionType) {\n return {\n [`minimum${precisionType}`]: precision,\n [`maximum${precisionType}`]: precision,\n };\n}\n\n/**\n * Returns the locale that was passed in if it works\n * with `toLocaleString` or otherwise falls back to `DEFAULT_LOCALE`\n * @param {String} locale\n */\nfunction getValidLocale(locale: string) {\n try {\n const noUnderscoreLocale = locale.replace(/_/, '-');\n\n Intl.NumberFormat(noUnderscoreLocale);\n return noUnderscoreLocale;\n } catch (e) {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Formats the number as a fallback for when `toLocaleString` method is not supported\n * by the browser. Will use `toFixed` to format `FractionDigits` precisionType and `toPrecision`\n * to format `SignificantDigits` precision type.\n * @param {Number} number\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nfunction formatNumberWithFallback(number: number, precision: number, precisionType: PrecisionType) {\n return precisionType === SIGNIFICANT_DIGITS.TYPE\n ? number.toPrecision(precision)\n : number.toFixed(precision);\n}\n\n/**\n * Formats a number to a significant number of digits with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {Number} significantDigits - this may be a value between 1 and 21, inclusive\n * @param {String} locale\n * @returns {String}\n */\nexport function formatNumberToSignificantDigits(\n number: number,\n locale = DEFAULT_LOCALE,\n significantDigits = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n) {\n return formatNumber(number, locale, significantDigits, SIGNIFICANT_DIGITS.TYPE);\n}\n\n/**\n * Formats a number precisely with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {String} locale\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nexport function formatNumber(\n number: number,\n locale = DEFAULT_LOCALE,\n precision?: number,\n precisionType: PrecisionType = 'FractionDigits',\n): string {\n if (!number && number !== 0) {\n return '';\n }\n\n if (typeof number === 'string' && Number(number)) {\n // eslint-disable-next-line no-param-reassign\n number = Number(number);\n }\n\n const { MIN_PRECISION, MAX_PRECISION } =\n precisionType === SIGNIFICANT_DIGITS.TYPE ? SIGNIFICANT_DIGITS : FRACTION_DIGITS;\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed#Parameters\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat#Parameters\n const isPrecisionValid =\n precision !== undefined &&\n precision !== null &&\n typeof precision === 'number' &&\n precision >= MIN_PRECISION &&\n precision <= MAX_PRECISION;\n\n const validatedLocale = getValidLocale(locale);\n\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return isPrecisionValid\n ? formatNumberWithFallback(number, precision!, precisionType)\n : `${number}`;\n }\n\n const formatter = isPrecisionValid\n ? getFormatter(validatedLocale, getPrecisionOptions(precision!, precisionType))\n : getFormatter(validatedLocale);\n\n return formatter.format(number);\n}\n\nexport function formatNumberWithOptions(\n value: number,\n options: Intl.NumberFormatOptions,\n locale: string,\n fallback: string,\n) {\n const validatedLocale = getValidLocale(locale);\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return fallback;\n }\n\n return getFormatter(validatedLocale, options).format(value);\n}\n","export const DEFAULT_LOCALE = 'en-GB';\nexport const DEFAULT_PRECISION_TYPE = 'FractionDigits';\nexport const NUMBER_OF_RATE_SIGNIFICANT_DIGITS = 6;\nexport const DEFAULT_RATE_MULTIPLIER = 1;\nexport const PRECISION = {\n SIGNIFICANT_DIGITS: {\n TYPE: 'SignificantDigits' as PrecisionType,\n MIN_PRECISION: 1,\n MAX_PRECISION: 21,\n },\n FRACTION_DIGITS: {\n TYPE: 'FractionDigits' as PrecisionType,\n MIN_PRECISION: 0,\n MAX_PRECISION: 20,\n },\n};\nexport type PrecisionType = 'SignificantDigits' | 'FractionDigits';\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumber } from '../number';\n\nconst currencyDecimals = {\n BIF: 0,\n BYR: 0,\n CLP: 0,\n DJF: 0,\n GNF: 0,\n IDR: 0,\n JPY: 0,\n KMF: 0,\n KRW: 0,\n MGA: 0,\n PYG: 0,\n RWF: 0,\n VND: 0,\n VUV: 0,\n XAF: 0,\n XOF: 0,\n XPF: 0,\n // technically HUF does have decimals, but due to the exchange rate banks\n // do not accept decimal amounts\n HUF: 0,\n UGX: 0,\n // local banks do not consistently support the ideal 2-decimal places fractional part\n KES: 0,\n\n BHD: 3,\n JOD: 3,\n KWD: 3,\n OMR: 3,\n TND: 3,\n};\n\nconst DEFAULT_CURRENCY_DECIMALS = 2;\n\nfunction getCurrencyDecimals(currency = '') {\n const upperCaseCurrency = currency.toUpperCase();\n if (Object.prototype.hasOwnProperty.call(currencyDecimals, upperCaseCurrency)) {\n return currencyDecimals[upperCaseCurrency as keyof typeof currencyDecimals];\n }\n return DEFAULT_CURRENCY_DECIMALS;\n}\n\nfunction amountHasNoDecimals(amount: number): boolean {\n return amount % 1 === 0;\n}\n\nfunction getPrecision(amount: number, currencyCode: string, alwaysShowDecimals: boolean): number {\n if (amountHasNoDecimals(amount) && !alwaysShowDecimals) {\n return 0;\n }\n\n return getCurrencyDecimals(currencyCode);\n}\n\nexport function formatAmount(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n): string {\n const availablePrecision = getPrecision(amount, currencyCode, options.alwaysShowDecimals);\n\n return formatNumber(amount, locale, availablePrecision);\n}\n\nexport function formatMoney(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n) {\n return `${formatAmount(amount, currencyCode, locale, options)} ${(\n currencyCode || ''\n ).toUpperCase()}`;\n}\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberWithOptions, formatNumberToSignificantDigits } from '../number';\n\nexport type FormatRateOptions = {\n significantFigures?: number;\n};\n\nfunction formatRate(rate: number, locale: string): string;\n/**\n * @deprecated Do not specify options, always specify a locale.\n */\nfunction formatRate(rate: number, options?: FormatRateOptions, locale?: string): string;\n\nfunction formatRate(\n rate: number,\n optionsOrLocale?: FormatRateOptions | string,\n locale?: string,\n): string {\n if (typeof optionsOrLocale === 'string') {\n return formatRateInternal(rate, optionsOrLocale);\n }\n\n const significantFigures = optionsOrLocale && optionsOrLocale.significantFigures;\n if (significantFigures) {\n return formatNumberToSignificantDigits(rate, locale || DEFAULT_LOCALE, significantFigures);\n }\n\n return formatRateInternal(rate, locale || DEFAULT_LOCALE);\n}\n\nfunction formatRateInternal(rate: number, locale: string) {\n // We lower the number of decimal places if the value is big, to minimun of 2\n const sizeAdjuster =\n // Upper bound 2\n Math.min(\n 2,\n // Low bound 0\n Math.max(\n 0,\n // Number of siginificant leading digits - 1\n Math.floor(Math.log10(rate)) - 1,\n ),\n );\n const fractionDigits = 4 - sizeAdjuster;\n\n return formatNumberWithOptions(\n rate,\n {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n },\n locale,\n rate.toFixed(fractionDigits),\n );\n}\n\nexport default formatRate;\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport { formatAmount } from '../currency';\n\nexport default function(\n {\n lhsValue,\n lhsCurrency,\n rhsValue,\n rhsCurrency,\n }: { lhsValue: number; lhsCurrency: string; rhsValue: number; rhsCurrency: string },\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return `${formatAmount(\n lhsValue,\n lhsCurrency,\n locale,\n )} ${lhsCurrency} = ${formatNumberToSignificantDigits(\n rhsValue,\n locale,\n significantFigures,\n )} ${rhsCurrency}`;\n}\n","export default {\n BRL: {\n hasInversionEnabled: true,\n },\n INR: {\n hasInversionEnabled: true,\n },\n JPY: {\n hasInversionEnabled: true,\n },\n IDR: {\n hasInversionEnabled: true\n },\n HUF: {\n hasInversionEnabled: true,\n },\n RON: {\n hasInversionEnabled: true,\n },\n THB: {\n hasInversionEnabled: true,\n },\n} as Record<string, { hasInversionEnabled?: boolean; multiplierForEquation?: number }>;\n","import config from './config';\nimport { DEFAULT_RATE_MULTIPLIER } from '../defaults';\n\nexport type Reference = 'auto' | 'source' | 'target';\n\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n }: { reference?: Reference; referenceMultiplier?: number } = {},\n) {\n validateParameters();\n\n if (shouldInvertEquation(reference, sourceCurrency)) {\n return {\n // inverted.\n lhsCurrency: targetCurrency,\n lhsValue: getMultiplier(referenceMultiplier, targetCurrency),\n rhsCurrency: sourceCurrency,\n rhsValue: getMultiplier(referenceMultiplier, targetCurrency) / rate,\n };\n }\n return {\n // normal.\n lhsCurrency: sourceCurrency,\n lhsValue: getMultiplier(referenceMultiplier, sourceCurrency),\n rhsCurrency: targetCurrency,\n rhsValue: rate * getMultiplier(referenceMultiplier, sourceCurrency),\n };\n\n function validateParameters(): void {\n if (!rate) throw new Error(`rate parameter is mandatory (got ${rate} instead).`);\n if (!sourceCurrency)\n throw new Error(`sourceCurrency parameter is mandatory (got ${sourceCurrency} instead).`);\n if (!targetCurrency)\n throw new Error(`targetCurrency parameter is mandatory (got ${targetCurrency} instead).`);\n if (referenceMultiplier && typeof referenceMultiplier !== 'number') {\n throw new Error(\n `referenceMultiplier must be a number (got ${typeof referenceMultiplier} ${referenceMultiplier} instead)`,\n );\n }\n // Let shouldInvertEquation() handle `reference`.\n }\n}\n\nfunction shouldInvertEquation(referenceConfig: Reference, sourceCurrency: string): boolean {\n if (referenceConfig === 'source') return false;\n if (referenceConfig === 'target') return true;\n if (['auto', undefined, null].indexOf(referenceConfig) > -1)\n return !!(config[sourceCurrency] || {}).hasInversionEnabled;\n throw new Error(\n `Unrecognized reference config value: ${referenceConfig} (valid values are auto, source, target).`,\n );\n}\n\nfunction getMultiplier(\n referenceMultiplierOverride: number | undefined,\n lhsCurrency: string,\n): number {\n return (\n referenceMultiplierOverride ||\n (config[lhsCurrency] || {}).multiplierForEquation ||\n DEFAULT_RATE_MULTIPLIER\n );\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\n\n/**\n * @deprecated use getDisplayRate\n */\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n }: { reference?: Reference; referenceMultiplier?: number; significantFigures?: number } = {},\n locale = DEFAULT_LOCALE,\n) {\n const response = {\n suggested: {},\n formats: {} as Record<string, any>,\n };\n\n response.formats.decimal = {\n output: formatNumberToSignificantDigits(rate, locale, significantFigures),\n significantFigures,\n };\n\n const equation = getRateEquation(rate, sourceCurrency, targetCurrency, {\n reference,\n referenceMultiplier,\n });\n\n response.formats.equation = {\n output: formatRateEquation(equation, { significantFigures }, locale),\n reference: equation.lhsCurrency === sourceCurrency ? 'source' : 'target',\n referenceMultiplier: equation.lhsValue,\n calculationInDecimal: formatNumberToSignificantDigits(\n equation.rhsValue,\n locale,\n significantFigures,\n ),\n };\n\n if (equation.lhsCurrency === sourceCurrency && equation.lhsValue === 1) {\n response.suggested = {\n format: 'decimal',\n output: response.formats.decimal.output,\n };\n } else {\n response.suggested = {\n format: 'equation',\n output: response.formats.equation.output,\n };\n }\n\n return response;\n}\n","import formatRate from './formatRate';\n\nexport type DisplayRate = {\n /**\n * Numerical rate to 4 decimal places. Only use when there is another indicator on the screen\n * for if the rate is inverted or not, such as a multiply/divide icon.\n */\n decimal: string;\n /**\n * Rate equation such as `1 ABC = 0.5743 DEF`. Use this whenever you need to display a rate\n * without much context.\n */\n equation: string;\n /**\n * If the rates given are given in the opposite direction to now the function was called.\n * For example if source was BRL and target was EUR, an inverted equation of\n * `1 EUR = 5.1233 BRL` may be returned.\n */\n inverted: boolean;\n};\n\n/**\n * Returns rates for displaying to customers.\n */\nexport default function getDisplayRate({\n rate,\n sourceCurrency,\n targetCurrency,\n locale,\n}: {\n rate: number;\n sourceCurrency: string;\n targetCurrency: string;\n locale: string;\n}): DisplayRate {\n const inverted = shouldInvertEquation(sourceCurrency, rate);\n\n const rawValue = inverted ? 1 / rate : rate;\n\n const leftHandSide = `1 ${inverted ? targetCurrency : sourceCurrency}`;\n const rightHandSide = `${formatRate(rawValue, locale)} ${\n inverted ? sourceCurrency : targetCurrency\n }`;\n\n return {\n decimal: formatRate(rawValue, locale),\n inverted,\n equation: `${leftHandSide} = ${rightHandSide}`,\n };\n}\n\nfunction shouldInvertEquation(sourceCurrency: string, rate: number): boolean {\n if (sourceCurrency === 'BRL' && rate <= 10) {\n // Prefer to show BRL inverted unless the rate would be below 0.1\n return true;\n }\n\n // Prefer not to show very low rates\n return rate < 0.1;\n}\n","import { DEFAULT_LOCALE } from '../../defaults';\n\nlet intlSupported: boolean | undefined; // cache\n\nexport function isIntlSupported(): boolean {\n if (intlSupported === undefined) {\n intlSupported = intlDateTimeFormatReturnsCorrectValue();\n }\n return intlSupported;\n}\n\nfunction intlDateTimeFormatReturnsCorrectValue(): boolean {\n try {\n const date = new Date(2018, 11, 1);\n const dateString = new Intl.DateTimeFormat(DEFAULT_LOCALE).format(date);\n return dateString === '01/12/2018';\n } catch (e) {\n return false;\n }\n}\n","export const formatPercentage= (percentage: number, locale = 'en-GB'): string =>\n Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(percentage);\n\n\n","const supportedLocales: Record<string, boolean> = {}; // cache\n\nexport function isSelectedLocaleSupported(locale: string): boolean {\n if (supportedLocales[locale] === undefined) {\n supportedLocales[locale] = checkForLocaleSupport(locale);\n }\n return supportedLocales[locale];\n}\n\nfunction checkForLocaleSupport(locale: string): boolean {\n try {\n return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;\n } catch (e) {\n return false;\n }\n}\n","const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst SHORT_MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nfunction getJoiningCharacter(options: Intl.DateTimeFormatOptions): string {\n return options.month === 'short' ? ' ' : '/';\n}\n\nfunction isMonthFirst(options: Intl.DateTimeFormatOptions) {\n return options.month === 'short';\n}\n\nfunction getFormattedMonth(\n options: Intl.DateTimeFormatOptions,\n isUTC: boolean,\n date: Date,\n): string | number {\n if (options.month === 'short') {\n return SHORT_MONTHS[isUTC ? date.getUTCMonth() : date.getMonth()];\n }\n return (isUTC ? date.getUTCMonth() : date.getMonth()) + 1;\n}\n\n// Sample outputs: 'Sat, 1/12/2018', '1/12/2018', '12/2018', Sat, 1'\nexport function getFallbackFormat(date: Date, options: Intl.DateTimeFormatOptions = {}): string {\n const isUTC = options.timeZone === 'UTC';\n\n const dateParts = [];\n if (options.day) dateParts.push(isUTC ? date.getUTCDate() : date.getDate());\n if (options.month) {\n const monthFormat = getFormattedMonth(options, isUTC, date);\n if (isMonthFirst(options)) {\n dateParts.unshift(monthFormat);\n } else {\n dateParts.push(monthFormat);\n }\n }\n if (options.year) dateParts.push(isUTC ? date.getUTCFullYear() : date.getUTCFullYear());\n\n const joiningCharacter = getJoiningCharacter(options);\n let fallbackDate = dateParts.join(joiningCharacter);\n\n if (options.weekday) {\n const dayName = WEEKDAYS[isUTC ? date.getUTCDay() : date.getDay()];\n fallbackDate = fallbackDate ? `${dayName}, ${fallbackDate}` : dayName;\n }\n return (\n fallbackDate ||\n getFallbackFormat(date, {\n timeZone: options.timeZone,\n day: 'true',\n month: 'true',\n year: 'true',\n })\n );\n}\n","import { isIntlSupported, isSelectedLocaleSupported } from './support-detection';\nimport { getFallbackFormat } from './fallback-format';\nimport { DEFAULT_LOCALE } from '../defaults';\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? new Intl.DateTimeFormat(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n","export default (date: Date): boolean => {\n const today = new Date(Date.now());\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n","import isToday from '../isToday';\nimport { formatDate } from '../date';\nimport { getTranslation } from '../../translations/translator';\nimport { DEFAULT_LOCALE } from '../../defaults';\n\nexport function formatRelativeDate(date: Date, locale = DEFAULT_LOCALE): string {\n if (date < new Date(Date.now())) {\n return '';\n }\n\n let formatted;\n if (shouldFormatRelative(date)) {\n formatted = formatRelative(date, locale);\n } else {\n formatted = formatAbsolute(date, locale);\n }\n return formatted;\n}\n\nfunction shouldFormatRelative(date: Date): boolean {\n return isToday(date) && isWithinHours(date, 12);\n}\n\nfunction isWithinHours(date: Date, boundary: number): boolean {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n return getDifferenceIn(diff, TimeUnit.HOUR) <= boundary;\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n\n if (getDifferenceIn(diff, TimeUnit.SECOND) < 60) {\n return formatSeconds(locale);\n }\n\n const differenceInMinutes = getDifferenceIn(diff, TimeUnit.MINUTE);\n if (differenceInMinutes < 60) {\n return formatTimeUnit(differenceInMinutes, locale, TimeUnit.MINUTE);\n }\n\n return formatTimeUnit(getDifferenceIn(diff, TimeUnit.HOUR), locale, TimeUnit.HOUR);\n}\n\nfunction formatAbsolute(date: Date, locale: string): string {\n const params = {\n formattedDate: formatDate(date, locale, { month: 'short', day: 'numeric' }),\n };\n return getTranslation('relative-format-by', params, locale);\n}\n\nfunction getDifferenceIn(diff: number, timeUnitValue: TimeUnit): number {\n const millisecondsMap = {\n [TimeUnit.HOUR]: 3600000,\n [TimeUnit.MINUTE]: 60000,\n [TimeUnit.SECOND]: 1000,\n };\n return Math.ceil(diff / millisecondsMap[timeUnitValue]);\n}\n\nfunction formatTimeUnit(value: number, locale: string, timeUnit: string): string {\n if (value === 1) {\n return getTranslation(`relative-format-in-${timeUnit}`, {}, locale);\n }\n return getTranslation(\n `relative-format-in-${timeUnit}s`,\n { [`${timeUnit}s`]: `${value}` },\n locale,\n );\n}\n\nfunction formatSeconds(locale: string) {\n return getTranslation('relative-format-in-seconds', {}, locale);\n}\n\nenum TimeUnit {\n SECOND = 'second',\n MINUTE = 'minute',\n HOUR = 'hour',\n}\n","// eslint-disable-next-line import/no-unresolved\nimport translations from './translations.json';\n\nexport function getTranslation(\n translationKey: string,\n params: Record<string, string> = {},\n locale: string,\n): string {\n let translatedMessage: string | undefined;\n if (hasTranslation(locale, translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>)[locale][\n translationKey\n ];\n } else if (hasTranslation('en', translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>).en[translationKey];\n } else {\n translatedMessage = translationKey;\n }\n\n if (translatedMessage && params) {\n Object.keys(params).forEach(key => {\n translatedMessage = (translatedMessage as string).replace(\n new RegExp(`{${key}}`, 'g'),\n params[key],\n );\n });\n }\n\n return translatedMessage || translationKey;\n}\n\nfunction hasTranslation(locale: string, translationKey: string): boolean {\n return (\n hasOwnProperty(translations, locale) &&\n hasOwnProperty((translations as Record<string, Record<string, string>>)[locale], translationKey)\n );\n}\n\nfunction hasOwnProperty(obj: any, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n"],"names":["isSupported","isIntlNumberFormatSupported","locale","undefined","Intl","NumberFormat","supportedLocalesOf","length","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","options","cacheKey","Object","entries","getValidLocale","noUnderscoreLocale","replace","e","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","IDR","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","formatMoney","formatRate","rate","optionsOrLocale","formatRateInternal","significantFigures","fractionDigits","Math","min","max","floor","log10","value","fallback","formatNumberWithOptions","minimumFractionDigits","maximumFractionDigits","lhsCurrency","rhsValue","rhsCurrency","lhsValue","BRL","hasInversionEnabled","INR","RON","THB","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal","getDisplayRate","inverted","rawValue","leftHandSide","rightHandSide","intlSupported","formatPercentage","percentage","style","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","checkForLocaleSupport","isSelectedLocaleSupported","getSupportedLocale","getFallbackFormat","isUTC","timeZone","dateParts","day","push","getUTCDate","getDate","month","monthFormat","getUTCMonth","getMonth","getFormattedMonth","isMonthFirst","unshift","year","getUTCFullYear","joiningCharacter","getJoiningCharacter","fallbackDate","join","weekday","dayName","getUTCDay","getDay","TimeUnit","getTranslation","translationKey","params","translatedMessage","hasTranslation","translations","en","keys","forEach","key","RegExp","obj","formatRelativeDate","now","today","getFullYear","isToday","boundary","getDifferenceIn","HOUR","isWithinHours","shouldFormatRelative","diff","SECOND","formatSeconds","differenceInMinutes","MINUTE","formatTimeUnit","formatRelative","formattedDate","formatAbsolute","timeUnitValue","millisecondsMap","ceil","timeUnit"],"mappings":"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"}
|
package/dist/formatting.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).formatting={})}(this,function(e){var t;function r(e){return void 0===t&&(t="object"==typeof Intl&&void 0!==Intl&&"function"==typeof Intl.NumberFormat&&Intl.NumberFormat&&"function"==typeof Intl.NumberFormat.supportedLocalesOf&&Intl.NumberFormat.supportedLocalesOf&&1===Intl.NumberFormat.supportedLocalesOf(e).length),t}var n={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},i={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},a={};function o(e,t){var r=t?""+e+Object.entries(t):e;return a[r]||(a[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),a[r]}function u(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}function m(e,t,r){return void 0===t&&(t="en-GB"),void 0===r&&(r=6),f(e,t,r,n.TYPE)}function f(e,t,a,m){if(void 0===t&&(t="en-GB"),void 0===m&&(m="FractionDigits"),!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));var f=m===n.TYPE?n:i,s=null!=a&&"number"==typeof a&&a>=f.MIN_PRECISION&&a<=f.MAX_PRECISION,l=u(t);return r(l)?(s?o(l,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(a,m)):o(l)).format(e):s?function(e,t,r){return r===n.TYPE?e.toPrecision(t):e.toFixed(t)}(e,a,m):""+e}var s={BIF:0,BYR:0,CLP:0,DJF:0,GNF:0,IDR:0,JPY:0,KMF:0,KRW:0,MGA:0,PYG:0,RWF:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,HUF:0,UGX:0,KES:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};function l(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),f(e,r,function(e,t,r){return function(e){return e%1==0}(e)&&!r?0:function(e){void 0===e&&(e="");var t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(s,t)?s[t]:2}(t)}(e,t,n.alwaysShowDecimals))}function v(e,t,r){if("string"==typeof t)return c(e,t);var n=t&&t.significantFigures;return n?m(e,r||"en-GB",n):c(e,r||"en-GB")}function c(e,t){var n=4-Math.min(2,Math.max(0,Math.floor(Math.log10(e))-1));return function(e,t,n,i){var a=u(n);return r(a)?o(a,t).format(e):i}(e,{minimumFractionDigits:n,maximumFractionDigits:n},t,e.toFixed(n))}function d(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,a=e.rhsCurrency,o=(void 0===t?{}:t).significantFigures,u=void 0===o?6:o;return void 0===r&&(r="en-GB"),l(e.lhsValue,n,r)+" "+n+" = "+m(i,r,u)+" "+a}var h,y={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0},THB:{hasInversionEnabled:!0}};function g(e,t){return e||(y[t]||{}).multiplierForEquation||1}var p={},b=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],D=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function I(e,t,r){return void 0===t&&(t="en-GB"),void 0===h&&(h=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),h?new Intl.DateTimeFormat(function(e){return function(e){return void 0===p[e]&&(p[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),p[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r){void 0===r&&(r={});var n="UTC"===r.timeZone,i=[];if(r.day&&i.push(n?t.getUTCDate():t.getDate()),r.month){var a=function(e,t,r){return"short"===e.month?D[t?r.getUTCMonth():r.getMonth()]:(t?r.getUTCMonth():r.getMonth())+1}(r,n,t);!function(e){return"short"===e.month}(r)?i.push(a):i.unshift(a)}r.year&&i.push(t.getUTCFullYear());var o=function(e){return"short"===e.month?" ":"/"}(r),u=i.join(o);if(r.weekday){var m=b[n?t.getUTCDay():t.getDay()];u=u?m+", "+u:m}return u||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var F,w={cs:{"relative-format-in-seconds":"během pár vteřin","relative-format-in-minutes":"v {minutes} minutách","relative-format-in-hours":"v {hours} hodinách","relative-format-in-minute":"během 1 minuty","relative-format-in-hour":"během 1 hodiny","relative-format-by":"do {formattedDate}"},de:{"relative-format-in-seconds":"in Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in 1 Minute","relative-format-in-hour":"in 1 Stunde","relative-format-by":"bis {formattedDate}"},en:{"relative-format-in-seconds":"in seconds","relative-format-in-minutes":"in {minutes} minutes","relative-format-in-hours":"in {hours} hours","relative-format-in-minute":"in 1 minute","relative-format-in-hour":"in 1 hour","relative-format-by":"by {formattedDate}"},es:{"relative-format-in-seconds":"en segundos","relative-format-in-minutes":"en {minutes} minutos","relative-format-in-hours":"en {hours} horas","relative-format-in-minute":"en 1 minuto","relative-format-in-hour":"en 1 hora","relative-format-by":"antes del {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"en {hours} heures","relative-format-in-minute":"en 1 minute","relative-format-in-hour":"en 1 heure","relative-format-by":"d'ici au {formattedDate}"},hu:{"relative-format-in-seconds":"másodpercek alatt","relative-format-in-minutes":"{minutes} percen belül","relative-format-in-hours":"{hours} órán belül","relative-format-in-minute":"1 percen belül","relative-format-in-hour":"1 órán belül","relative-format-by":"ekkor: {formattedDate}"},id:{"relative-format-in-seconds":"dalam beberapa detik","relative-format-in-minutes":"dalam {minutes} menit","relative-format-in-hours":"dalam {hours} jam","relative-format-in-minute":"dalam 1 menit","relative-format-in-hour":"dalam 1 jam","relative-format-by":"sebelum {formattedDate}"},it:{"relative-format-in-seconds":"tra qualche secondo","relative-format-in-minutes":"tra {minutes} minuti","relative-format-in-hours":"tra {hours} ore","relative-format-in-minute":"in 1 minuto","relative-format-in-hour":"in 1 ora","relative-format-by":"entro il {formattedDate}"},ja:{"relative-format-in-seconds":"数秒","relative-format-in-minutes":"{minutes}分以内","relative-format-in-hours":"{hours}時間以内","relative-format-in-minute":"1分以内","relative-format-in-hour":"1時間以内","relative-format-by":"{formattedDate}まで"},pl:{"relative-format-in-seconds":"w ciągu kilku sekund","relative-format-in-minutes":"w ciągu {minutes} minut","relative-format-in-hours":"w ciągu {hours} godzin","relative-format-in-minute":"w ciągu 1 minuty","relative-format-in-hour":"w ciągu 1 godziny","relative-format-by":"do {formattedDate}"},pt:{"relative-format-in-seconds":"em segundos","relative-format-in-minutes":"em {minutes} minutos","relative-format-in-hours":"em {hours} horas","relative-format-in-minute":"em 1 minuto","relative-format-in-hour":"em 1 hora","relative-format-by":"até {formattedDate}"},ro:{"relative-format-in-seconds":"în câteva secunde","relative-format-in-minutes":"în {minutes} minute","relative-format-in-hours":"în {hours} ore","relative-format-in-minute":"în 1 minut","relative-format-in-hour":"în 1 oră","relative-format-by":"până pe {formattedDate}"},ru:{"relative-format-in-seconds":"через несколько секунд","relative-format-in-minutes":"через {minutes} мин.","relative-format-in-hours":"через {hours} ч.","relative-format-in-minute":"через минуту","relative-format-in-hour":"через 1 час","relative-format-by":"{formattedDate}"},th:{"relative-format-in-seconds":"ในไม่กี่วินาที","relative-format-in-minutes":"ใน {minutes} นาที","relative-format-in-hours":"ใน {hours} ชั่วโมง","relative-format-in-minute":"ใน 1 นาที","relative-format-in-hour":"ใน 1 ชั่วโมง","relative-format-by":"ภายใน {formattedDate}"},tr:{"relative-format-in-seconds":"saniyeler içinde","relative-format-in-minutes":"{minutes} dakika içinde","relative-format-in-hours":"{hours} saat içinde","relative-format-in-minute":"1 dakika içinde","relative-format-in-hour":"1 saat içinde","relative-format-by":"{formattedDate} itibarıyla"},uk:{"relative-format-in-seconds":"через кілька секунд","relative-format-in-minutes":"через {minutes} хв","relative-format-in-hours":"через {hours} год","relative-format-in-minute":"через 1 хвилину","relative-format-in-hour":"через 1 годину","relative-format-by":"до {formattedDate}"},"zh-CN":{"relative-format-in-seconds":"数秒内","relative-format-in-minutes":"{minutes} 分钟内","relative-format-in-hours":"{hours} 小时内","relative-format-in-minute":"1 分钟内","relative-format-in-hour":"1 小时内","relative-format-by":"{formattedDate} 前"},"zh-HK":{"relative-format-in-seconds":"數秒內","relative-format-in-minutes":"在{minutes}分鐘內","relative-format-in-hours":"在{hours}小時內","relative-format-in-minute":"在1分鐘內","relative-format-in-hour":"在1小時內","relative-format-by":"在{formattedDate}或之前"}};function N(e,t,r){var n;return void 0===t&&(t={}),(n=E(r,e)?w[r][e]:E("en",e)?w.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function E(e,t){return M(w,e)&&M(w[e],t)}function M(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function C(e,t){var r,n=((r={})[F.HOUR]=36e5,r[F.MINUTE]=6e4,r[F.SECOND]=1e3,r);return Math.ceil(e/n[t])}function O(e,t,r){var n;return 1===e?N("relative-format-in-"+r,{},t):N("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(F||(F={})),e.formatAmount=l,e.formatDate=I,e.formatMoney=function(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),l(e,t,r,n)+" "+(t||"").toUpperCase()},e.formatNumber=f,e.formatNumberToSignificantDigits=m,e.formatPercentage=function(e,t){return void 0===t&&(t="en-GB"),Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:2}).format(e)},e.formatRate=v,e.formatRelativeDate=function(e,t){return void 0===t&&(t="en-GB"),e<new Date(Date.now())?"":function(e){return function(e){var t=new Date(Date.now());return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}(e)&&function(e,t){return C(e-new Date(Date.now()),F.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(C(r,F.SECOND)<60)return function(e){return N("relative-format-in-seconds",{},e)}(t);var n=C(r,F.MINUTE);return n<60?O(n,t,F.MINUTE):O(C(r,F.HOUR),t,F.HOUR)}(e,t):function(e,t){return N("relative-format-by",{formattedDate:I(e,t,{month:"short",day:"numeric"})},t)}(e,t)},e.getDisplayRate=function(e){var t=e.rate,r=e.sourceCurrency,n=e.targetCurrency,i=e.locale,a=function(e,t){return"BRL"===e&&t<=10||t<.1}(r,t),o=a?1/t:t,u="1 "+(a?n:r),m=v(o,i)+" "+(a?r:n);return{decimal:v(o,i),inverted:a,equation:u+" = "+m}},e.getRateInAllFormats=function(e,t,r,n,i){var a=void 0===n?{}:n,o=a.reference,u=void 0===o?"auto":o,f=a.referenceMultiplier,s=a.significantFigures,l=void 0===s?6:s;void 0===i&&(i="en-GB");var v={suggested:{},formats:{}};v.formats.decimal={output:m(e,i,l),significantFigures:l};var c=function(e,t,r,n){var i=void 0===n?{}:n,a=i.reference,o=void 0===a?"auto":a,u=i.referenceMultiplier;return function(){if(!e)throw new Error("rate parameter is mandatory (got "+e+" instead).");if(!t)throw new Error("sourceCurrency parameter is mandatory (got "+t+" instead).");if(!r)throw new Error("targetCurrency parameter is mandatory (got "+r+" instead).");if(u&&"number"!=typeof u)throw new Error("referenceMultiplier must be a number (got "+typeof u+" "+u+" instead)")}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(y[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:g(u,r),rhsCurrency:t,rhsValue:g(u,r)/e}:{lhsCurrency:t,lhsValue:g(u,t),rhsCurrency:r,rhsValue:e*g(u,t)}}(e,t,r,{reference:u,referenceMultiplier:f});return v.formats.equation={output:d(c,{significantFigures:l},i),reference:c.lhsCurrency===t?"source":"target",referenceMultiplier:c.lhsValue,calculationInDecimal:m(c.rhsValue,i,l)},v.suggested=c.lhsCurrency===t&&1===c.lhsValue?{format:"decimal",output:v.formats.decimal.output}:{format:"equation",output:v.formats.equation.output},v}});
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).formatting={})}(this,function(e){var t;function r(e){return void 0===t&&(t="object"==typeof Intl&&void 0!==Intl&&"function"==typeof Intl.NumberFormat&&Intl.NumberFormat&&"function"==typeof Intl.NumberFormat.supportedLocalesOf&&Intl.NumberFormat.supportedLocalesOf&&1===Intl.NumberFormat.supportedLocalesOf(e).length),t}var n={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},i={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},a={};function o(e,t){var r=t?""+e+Object.entries(t):e;return a[r]||(a[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),a[r]}function u(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}function m(e,t,r){return void 0===t&&(t="en-GB"),void 0===r&&(r=6),f(e,t,r,n.TYPE)}function f(e,t,a,m){if(void 0===t&&(t="en-GB"),void 0===m&&(m="FractionDigits"),!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));var f=m===n.TYPE?n:i,s=null!=a&&"number"==typeof a&&a>=f.MIN_PRECISION&&a<=f.MAX_PRECISION,l=u(t);return r(l)?(s?o(l,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(a,m)):o(l)).format(e):s?function(e,t,r){return r===n.TYPE?e.toPrecision(t):e.toFixed(t)}(e,a,m):""+e}var s={BIF:0,BYR:0,CLP:0,DJF:0,GNF:0,IDR:0,JPY:0,KMF:0,KRW:0,MGA:0,PYG:0,RWF:0,VND:0,VUV:0,XAF:0,XOF:0,XPF:0,HUF:0,UGX:0,KES:0,BHD:3,JOD:3,KWD:3,OMR:3,TND:3};function l(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),f(e,r,function(e,t,r){return function(e){return e%1==0}(e)&&!r?0:function(e){void 0===e&&(e="");var t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(s,t)?s[t]:2}(t)}(e,t,n.alwaysShowDecimals))}function v(e,t,r){if("string"==typeof t)return c(e,t);var n=t&&t.significantFigures;return n?m(e,r||"en-GB",n):c(e,r||"en-GB")}function c(e,t){var n=4-Math.min(2,Math.max(0,Math.floor(Math.log10(e))-1));return function(e,t,n,i){var a=u(n);return r(a)?o(a,t).format(e):i}(e,{minimumFractionDigits:n,maximumFractionDigits:n},t,e.toFixed(n))}function d(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,a=e.rhsCurrency,o=(void 0===t?{}:t).significantFigures,u=void 0===o?6:o;return void 0===r&&(r="en-GB"),l(e.lhsValue,n,r)+" "+n+" = "+m(i,r,u)+" "+a}var h,y={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0},THB:{hasInversionEnabled:!0}};function b(e,t){return e||(y[t]||{}).multiplierForEquation||1}var g={},D=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],p=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function I(e,t,r){return void 0===t&&(t="en-GB"),void 0===h&&(h=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),h?new Intl.DateTimeFormat(function(e){return function(e){return void 0===g[e]&&(g[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),g[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r){void 0===r&&(r={});var n="UTC"===r.timeZone,i=[];if(r.day&&i.push(n?t.getUTCDate():t.getDate()),r.month){var a=function(e,t,r){return"short"===e.month?p[t?r.getUTCMonth():r.getMonth()]:(t?r.getUTCMonth():r.getMonth())+1}(r,n,t);!function(e){return"short"===e.month}(r)?i.push(a):i.unshift(a)}r.year&&i.push(t.getUTCFullYear());var o=function(e){return"short"===e.month?" ":"/"}(r),u=i.join(o);if(r.weekday){var m=D[n?t.getUTCDay():t.getDay()];u=u?m+", "+u:m}return u||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var F,w={cs:{"relative-format-in-seconds":"během pár sekund","relative-format-in-minutes":"během {minutes} min.","relative-format-in-hours":"během {hours} hod.","relative-format-in-minute":"během 1 minuty","relative-format-in-hour":"během 1 hodiny","relative-format-by":"do {formattedDate}"},da:{"relative-format-in-seconds":"om sekunder","relative-format-in-minutes":"om {minutes} minutter","relative-format-in-hours":"om {hours} timer","relative-format-in-minute":"om 1 minut","relative-format-in-hour":"om 1 time","relative-format-by":"inden {formattedDate}"},de:{"relative-format-in-seconds":"in Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in 1 Minute","relative-format-in-hour":"in 1 Stunde","relative-format-by":"bis {formattedDate}"},en:{"relative-format-in-seconds":"in seconds","relative-format-in-minutes":"in {minutes} minutes","relative-format-in-hours":"in {hours} hours","relative-format-in-minute":"in 1 minute","relative-format-in-hour":"in 1 hour","relative-format-by":"by {formattedDate}"},es:{"relative-format-in-seconds":"en segundos","relative-format-in-minutes":"en {minutes} minutos","relative-format-in-hours":"en {hours} horas","relative-format-in-minute":"en 1 minuto","relative-format-in-hour":"en 1 hora","relative-format-by":"antes del {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"en {hours} heures","relative-format-in-minute":"en 1 minute","relative-format-in-hour":"en 1 heure","relative-format-by":"d'ici au {formattedDate}"},hu:{"relative-format-in-seconds":"másodpercek alatt","relative-format-in-minutes":"{minutes} percen belül","relative-format-in-hours":"{hours} órán belül","relative-format-in-minute":"1 percen belül","relative-format-in-hour":"1 órán belül","relative-format-by":"ekkor: {formattedDate}"},id:{"relative-format-in-seconds":"dalam beberapa detik","relative-format-in-minutes":"dalam {minutes} menit","relative-format-in-hours":"dalam {hours} jam","relative-format-in-minute":"dalam 1 menit","relative-format-in-hour":"dalam 1 jam","relative-format-by":"sebelum {formattedDate}"},it:{"relative-format-in-seconds":"tra qualche secondo","relative-format-in-minutes":"tra {minutes} minuti","relative-format-in-hours":"tra {hours} ore","relative-format-in-minute":"in 1 minuto","relative-format-in-hour":"in 1 ora","relative-format-by":"entro il {formattedDate}"},ja:{"relative-format-in-seconds":"数秒","relative-format-in-minutes":"{minutes}分以内","relative-format-in-hours":"{hours}時間以内","relative-format-in-minute":"1分以内","relative-format-in-hour":"1時間以内","relative-format-by":"{formattedDate}まで"},nb:{"relative-format-in-seconds":"om noen sekunder","relative-format-in-minutes":"om {minutes} minutter","relative-format-in-hours":"om {hours} timer","relative-format-in-minute":"om 1 minutt","relative-format-in-hour":"om 1 time","relative-format-by":"innen {formattedDate}"},nl:{"relative-format-in-seconds":"over enkele seconden","relative-format-in-minutes":"over {minutes} minuten","relative-format-in-hours":"over {hours} uur","relative-format-in-minute":"over 1 minuut","relative-format-in-hour":"over 1 uur","relative-format-by":"voor {formattedDate}"},pl:{"relative-format-in-seconds":"w ciągu kilku sekund","relative-format-in-minutes":"w ciągu {minutes} minut","relative-format-in-hours":"w ciągu {hours} godzin","relative-format-in-minute":"w ciągu 1 minuty","relative-format-in-hour":"w ciągu 1 godziny","relative-format-by":"do {formattedDate}"},pt:{"relative-format-in-seconds":"em segundos","relative-format-in-minutes":"em {minutes} minutos","relative-format-in-hours":"em {hours} horas","relative-format-in-minute":"em 1 minuto","relative-format-in-hour":"em 1 hora","relative-format-by":"até {formattedDate}"},ro:{"relative-format-in-seconds":"în câteva secunde","relative-format-in-minutes":"în {minutes} minute","relative-format-in-hours":"în {hours} ore","relative-format-in-minute":"în 1 minut","relative-format-in-hour":"în 1 oră","relative-format-by":"până pe {formattedDate}"},ru:{"relative-format-in-seconds":"через несколько секунд","relative-format-in-minutes":"через {minutes} мин.","relative-format-in-hours":"через {hours} ч.","relative-format-in-minute":"через минуту","relative-format-in-hour":"через 1 час","relative-format-by":"{formattedDate}"},sv:{"relative-format-in-seconds":"om några sekunder","relative-format-in-minutes":"om {minutes} minuter","relative-format-in-hours":"om {hours} timmar","relative-format-in-minute":"om 1 minut","relative-format-in-hour":"om 1 timme","relative-format-by":"senast {formattedDate}"},th:{"relative-format-in-seconds":"ในไม่กี่วินาที","relative-format-in-minutes":"ใน {minutes} นาที","relative-format-in-hours":"ใน {hours} ชั่วโมง","relative-format-in-minute":"ใน 1 นาที","relative-format-in-hour":"ใน 1 ชั่วโมง","relative-format-by":"ภายใน {formattedDate}"},tr:{"relative-format-in-seconds":"saniyeler içinde","relative-format-in-minutes":"{minutes} dakika içinde","relative-format-in-hours":"{hours} saat içinde","relative-format-in-minute":"1 dakika içinde","relative-format-in-hour":"1 saat içinde","relative-format-by":"{formattedDate} itibarıyla"},uk:{"relative-format-in-seconds":"через кілька секунд","relative-format-in-minutes":"через {minutes} хв","relative-format-in-hours":"через {hours} год","relative-format-in-minute":"через 1 хвилину","relative-format-in-hour":"через 1 годину","relative-format-by":"до {formattedDate}"},"zh-CN":{"relative-format-in-seconds":"数秒内","relative-format-in-minutes":"{minutes} 分钟内","relative-format-in-hours":"{hours} 小时内","relative-format-in-minute":"1 分钟内","relative-format-in-hour":"1 小时内","relative-format-by":"{formattedDate} 前"},"zh-HK":{"relative-format-in-seconds":"數秒內","relative-format-in-minutes":"在{minutes}分鐘內","relative-format-in-hours":"在{hours}小時內","relative-format-in-minute":"在1分鐘內","relative-format-in-hour":"在1小時內","relative-format-by":"在{formattedDate}或之前"}};function N(e,t,r){var n;return void 0===t&&(t={}),(n=E(r,e)?w[r][e]:E("en",e)?w.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function E(e,t){return M(w,e)&&M(w[e],t)}function M(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function C(e,t){var r,n=((r={})[F.HOUR]=36e5,r[F.MINUTE]=6e4,r[F.SECOND]=1e3,r);return Math.ceil(e/n[t])}function O(e,t,r){var n;return 1===e?N("relative-format-in-"+r,{},t):N("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(F||(F={})),e.formatAmount=l,e.formatDate=I,e.formatMoney=function(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),l(e,t,r,n)+" "+(t||"").toUpperCase()},e.formatNumber=f,e.formatNumberToSignificantDigits=m,e.formatPercentage=function(e,t){return void 0===t&&(t="en-GB"),Intl.NumberFormat(t,{style:"percent",maximumFractionDigits:2}).format(e)},e.formatRate=v,e.formatRelativeDate=function(e,t){return void 0===t&&(t="en-GB"),e<new Date(Date.now())?"":function(e){return function(e){var t=new Date(Date.now());return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}(e)&&function(e,t){return C(e-new Date(Date.now()),F.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(C(r,F.SECOND)<60)return function(e){return N("relative-format-in-seconds",{},e)}(t);var n=C(r,F.MINUTE);return n<60?O(n,t,F.MINUTE):O(C(r,F.HOUR),t,F.HOUR)}(e,t):function(e,t){return N("relative-format-by",{formattedDate:I(e,t,{month:"short",day:"numeric"})},t)}(e,t)},e.getDisplayRate=function(e){var t=e.rate,r=e.sourceCurrency,n=e.targetCurrency,i=e.locale,a=function(e,t){return"BRL"===e&&t<=10||t<.1}(r,t),o=a?1/t:t,u="1 "+(a?n:r),m=v(o,i)+" "+(a?r:n);return{decimal:v(o,i),inverted:a,equation:u+" = "+m}},e.getRateInAllFormats=function(e,t,r,n,i){var a=void 0===n?{}:n,o=a.reference,u=void 0===o?"auto":o,f=a.referenceMultiplier,s=a.significantFigures,l=void 0===s?6:s;void 0===i&&(i="en-GB");var v={suggested:{},formats:{}};v.formats.decimal={output:m(e,i,l),significantFigures:l};var c=function(e,t,r,n){var i=void 0===n?{}:n,a=i.reference,o=void 0===a?"auto":a,u=i.referenceMultiplier;return function(){if(!e)throw new Error("rate parameter is mandatory (got "+e+" instead).");if(!t)throw new Error("sourceCurrency parameter is mandatory (got "+t+" instead).");if(!r)throw new Error("targetCurrency parameter is mandatory (got "+r+" instead).");if(u&&"number"!=typeof u)throw new Error("referenceMultiplier must be a number (got "+typeof u+" "+u+" instead)")}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(y[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:b(u,r),rhsCurrency:t,rhsValue:b(u,r)/e}:{lhsCurrency:t,lhsValue:b(u,t),rhsCurrency:r,rhsValue:e*b(u,t)}}(e,t,r,{reference:u,referenceMultiplier:f});return v.formats.equation={output:d(c,{significantFigures:l},i),reference:c.lhsCurrency===t?"source":"target",referenceMultiplier:c.lhsValue,calculationInDecimal:m(c.rhsValue,i,l)},v.suggested=c.lhsCurrency===t&&1===c.lhsValue?{format:"decimal",output:v.formats.decimal.output}:{format:"equation",output:v.formats.equation.output},v}});
|
|
2
2
|
//# sourceMappingURL=formatting.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.umd.js","sources":["../src/number/feature-detection/intl.ts","../src/number/number.ts","../src/defaults/index.ts","../src/currency/currency.ts","../src/rate/formatRate.ts","../src/rate/formatRateEquation.ts","../src/date/support-detection/intl.ts","../src/rate/config.ts","../src/rate/getRateEquation.ts","../src/date/support-detection/selectedLocale.ts","../src/date/fallback-format/fallbackFormat.ts","../src/date/date.ts","../src/date/relative-date/relativeDateFormatter.ts","../src/translations/translator.ts","../src/percentage/percentage.ts","../src/date/isToday.ts","../src/rate/getDisplayRate.ts","../src/rate/getRateInAllFormats.ts"],"sourcesContent":["let isSupported: boolean | undefined;\n\n/**\n * Checks if Intl.NumberFormat is supported for a specific locale\n * @param {String} locale\n * @returns {Boolean}\n */\nexport function isIntlNumberFormatSupported(locale: string): boolean {\n if (isSupported === undefined) {\n isSupported =\n typeof Intl === 'object' &&\n Intl !== undefined &&\n typeof Intl.NumberFormat === 'function' &&\n Intl.NumberFormat &&\n typeof Intl.NumberFormat.supportedLocalesOf === 'function' &&\n Intl.NumberFormat.supportedLocalesOf &&\n Intl.NumberFormat.supportedLocalesOf(locale).length === 1;\n }\n return isSupported;\n}\n","import {\n DEFAULT_LOCALE,\n PRECISION,\n NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n PrecisionType,\n} from '../defaults';\nimport { isIntlNumberFormatSupported } from './feature-detection';\n\nconst { SIGNIFICANT_DIGITS, FRACTION_DIGITS } = PRECISION;\n\nconst formatters: Record<string, any> = {}; // cache, sample: { 'en-GB': formatter, 'en-GB2': formatter }\n\n/**\n * Returns a formatter for the specified locale and NumberFormatOptions\n * @param {String} locale\n * @param {Intl.NumberFormatOptions} options\n * @returns {Intl.NumberFormat}\n */\nfunction getFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const cacheKey = options ? `${locale}${Object.entries(options)}` : locale;\n if (!formatters[cacheKey]) {\n formatters[cacheKey] = options\n ? new Intl.NumberFormat(locale, options)\n : new Intl.NumberFormat(locale);\n }\n return formatters[cacheKey];\n}\n\n/**\n * Returns the desired options object for\n * `Number.toLocaleString` and `Intl.NumberFormat` methods\n * @param {Number} precision\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n */\nfunction getPrecisionOptions(precision: number, precisionType: PrecisionType) {\n return {\n [`minimum${precisionType}`]: precision,\n [`maximum${precisionType}`]: precision,\n };\n}\n\n/**\n * Returns the locale that was passed in if it works\n * with `toLocaleString` or otherwise falls back to `DEFAULT_LOCALE`\n * @param {String} locale\n */\nfunction getValidLocale(locale: string) {\n try {\n const noUnderscoreLocale = locale.replace(/_/, '-');\n\n Intl.NumberFormat(noUnderscoreLocale);\n return noUnderscoreLocale;\n } catch (e) {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Formats the number as a fallback for when `toLocaleString` method is not supported\n * by the browser. Will use `toFixed` to format `FractionDigits` precisionType and `toPrecision`\n * to format `SignificantDigits` precision type.\n * @param {Number} number\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nfunction formatNumberWithFallback(number: number, precision: number, precisionType: PrecisionType) {\n return precisionType === SIGNIFICANT_DIGITS.TYPE\n ? number.toPrecision(precision)\n : number.toFixed(precision);\n}\n\n/**\n * Formats a number to a significant number of digits with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {Number} significantDigits - this may be a value between 1 and 21, inclusive\n * @param {String} locale\n * @returns {String}\n */\nexport function formatNumberToSignificantDigits(\n number: number,\n locale = DEFAULT_LOCALE,\n significantDigits = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n) {\n return formatNumber(number, locale, significantDigits, SIGNIFICANT_DIGITS.TYPE);\n}\n\n/**\n * Formats a number precisely with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {String} locale\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nexport function formatNumber(\n number: number,\n locale = DEFAULT_LOCALE,\n precision?: number,\n precisionType: PrecisionType = 'FractionDigits',\n): string {\n if (!number && number !== 0) {\n return '';\n }\n\n if (typeof number === 'string' && Number(number)) {\n // eslint-disable-next-line no-param-reassign\n number = Number(number);\n }\n\n const { MIN_PRECISION, MAX_PRECISION } =\n precisionType === SIGNIFICANT_DIGITS.TYPE ? SIGNIFICANT_DIGITS : FRACTION_DIGITS;\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed#Parameters\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat#Parameters\n const isPrecisionValid =\n precision !== undefined &&\n precision !== null &&\n typeof precision === 'number' &&\n precision >= MIN_PRECISION &&\n precision <= MAX_PRECISION;\n\n const validatedLocale = getValidLocale(locale);\n\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return isPrecisionValid\n ? formatNumberWithFallback(number, precision!, precisionType)\n : `${number}`;\n }\n\n const formatter = isPrecisionValid\n ? getFormatter(validatedLocale, getPrecisionOptions(precision!, precisionType))\n : getFormatter(validatedLocale);\n\n return formatter.format(number);\n}\n\nexport function formatNumberWithOptions(\n value: number,\n options: Intl.NumberFormatOptions,\n locale: string,\n fallback: string,\n) {\n const validatedLocale = getValidLocale(locale);\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return fallback;\n }\n\n return getFormatter(validatedLocale, options).format(value);\n}\n","export const DEFAULT_LOCALE = 'en-GB';\nexport const DEFAULT_PRECISION_TYPE = 'FractionDigits';\nexport const NUMBER_OF_RATE_SIGNIFICANT_DIGITS = 6;\nexport const DEFAULT_RATE_MULTIPLIER = 1;\nexport const PRECISION = {\n SIGNIFICANT_DIGITS: {\n TYPE: 'SignificantDigits' as PrecisionType,\n MIN_PRECISION: 1,\n MAX_PRECISION: 21,\n },\n FRACTION_DIGITS: {\n TYPE: 'FractionDigits' as PrecisionType,\n MIN_PRECISION: 0,\n MAX_PRECISION: 20,\n },\n};\nexport type PrecisionType = 'SignificantDigits' | 'FractionDigits';\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumber } from '../number';\n\nconst currencyDecimals = {\n BIF: 0,\n BYR: 0,\n CLP: 0,\n DJF: 0,\n GNF: 0,\n IDR: 0,\n JPY: 0,\n KMF: 0,\n KRW: 0,\n MGA: 0,\n PYG: 0,\n RWF: 0,\n VND: 0,\n VUV: 0,\n XAF: 0,\n XOF: 0,\n XPF: 0,\n // technically HUF does have decimals, but due to the exchange rate banks\n // do not accept decimal amounts\n HUF: 0,\n UGX: 0,\n // local banks do not consistently support the ideal 2-decimal places fractional part\n KES: 0,\n\n BHD: 3,\n JOD: 3,\n KWD: 3,\n OMR: 3,\n TND: 3,\n};\n\nconst DEFAULT_CURRENCY_DECIMALS = 2;\n\nfunction getCurrencyDecimals(currency = '') {\n const upperCaseCurrency = currency.toUpperCase();\n if (Object.prototype.hasOwnProperty.call(currencyDecimals, upperCaseCurrency)) {\n return currencyDecimals[upperCaseCurrency as keyof typeof currencyDecimals];\n }\n return DEFAULT_CURRENCY_DECIMALS;\n}\n\nfunction amountHasNoDecimals(amount: number): boolean {\n return amount % 1 === 0;\n}\n\nfunction getPrecision(amount: number, currencyCode: string, alwaysShowDecimals: boolean): number {\n if (amountHasNoDecimals(amount) && !alwaysShowDecimals) {\n return 0;\n }\n\n return getCurrencyDecimals(currencyCode);\n}\n\nexport function formatAmount(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n): string {\n const availablePrecision = getPrecision(amount, currencyCode, options.alwaysShowDecimals);\n\n return formatNumber(amount, locale, availablePrecision);\n}\n\nexport function formatMoney(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n) {\n return `${formatAmount(amount, currencyCode, locale, options)} ${(\n currencyCode || ''\n ).toUpperCase()}`;\n}\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberWithOptions, formatNumberToSignificantDigits } from '../number';\n\nexport type FormatRateOptions = {\n significantFigures?: number;\n};\n\nfunction formatRate(rate: number, locale: string): string;\n/**\n * @deprecated Do not specify options, always specify a locale.\n */\nfunction formatRate(rate: number, options?: FormatRateOptions, locale?: string): string;\n\nfunction formatRate(\n rate: number,\n optionsOrLocale?: FormatRateOptions | string,\n locale?: string,\n): string {\n if (typeof optionsOrLocale === 'string') {\n return formatRateInternal(rate, optionsOrLocale);\n }\n\n const significantFigures = optionsOrLocale && optionsOrLocale.significantFigures;\n if (significantFigures) {\n return formatNumberToSignificantDigits(rate, locale || DEFAULT_LOCALE, significantFigures);\n }\n\n return formatRateInternal(rate, locale || DEFAULT_LOCALE);\n}\n\nfunction formatRateInternal(rate: number, locale: string) {\n // We lower the number of decimal places if the value is big, to minimun of 2\n const sizeAdjuster =\n // Upper bound 2\n Math.min(\n 2,\n // Low bound 0\n Math.max(\n 0,\n // Number of siginificant leading digits - 1\n Math.floor(Math.log10(rate)) - 1,\n ),\n );\n const fractionDigits = 4 - sizeAdjuster;\n\n return formatNumberWithOptions(\n rate,\n {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n },\n locale,\n rate.toFixed(fractionDigits),\n );\n}\n\nexport default formatRate;\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport { formatAmount } from '../currency';\n\nexport default function(\n {\n lhsValue,\n lhsCurrency,\n rhsValue,\n rhsCurrency,\n }: { lhsValue: number; lhsCurrency: string; rhsValue: number; rhsCurrency: string },\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return `${formatAmount(\n lhsValue,\n lhsCurrency,\n locale,\n )} ${lhsCurrency} = ${formatNumberToSignificantDigits(\n rhsValue,\n locale,\n significantFigures,\n )} ${rhsCurrency}`;\n}\n","import { DEFAULT_LOCALE } from '../../defaults';\n\nlet intlSupported: boolean | undefined; // cache\n\nexport function isIntlSupported(): boolean {\n if (intlSupported === undefined) {\n intlSupported = intlDateTimeFormatReturnsCorrectValue();\n }\n return intlSupported;\n}\n\nfunction intlDateTimeFormatReturnsCorrectValue(): boolean {\n try {\n const date = new Date(2018, 11, 1);\n const dateString = new Intl.DateTimeFormat(DEFAULT_LOCALE).format(date);\n return dateString === '01/12/2018';\n } catch (e) {\n return false;\n }\n}\n","export default {\n BRL: {\n hasInversionEnabled: true,\n },\n INR: {\n hasInversionEnabled: true,\n },\n JPY: {\n hasInversionEnabled: true,\n },\n IDR: {\n hasInversionEnabled: true\n },\n HUF: {\n hasInversionEnabled: true,\n },\n RON: {\n hasInversionEnabled: true,\n },\n THB: {\n hasInversionEnabled: true,\n },\n} as Record<string, { hasInversionEnabled?: boolean; multiplierForEquation?: number }>;\n","import config from './config';\nimport { DEFAULT_RATE_MULTIPLIER } from '../defaults';\n\nexport type Reference = 'auto' | 'source' | 'target';\n\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n }: { reference?: Reference; referenceMultiplier?: number } = {},\n) {\n validateParameters();\n\n if (shouldInvertEquation(reference, sourceCurrency)) {\n return {\n // inverted.\n lhsCurrency: targetCurrency,\n lhsValue: getMultiplier(referenceMultiplier, targetCurrency),\n rhsCurrency: sourceCurrency,\n rhsValue: getMultiplier(referenceMultiplier, targetCurrency) / rate,\n };\n }\n return {\n // normal.\n lhsCurrency: sourceCurrency,\n lhsValue: getMultiplier(referenceMultiplier, sourceCurrency),\n rhsCurrency: targetCurrency,\n rhsValue: rate * getMultiplier(referenceMultiplier, sourceCurrency),\n };\n\n function validateParameters(): void {\n if (!rate) throw new Error(`rate parameter is mandatory (got ${rate} instead).`);\n if (!sourceCurrency)\n throw new Error(`sourceCurrency parameter is mandatory (got ${sourceCurrency} instead).`);\n if (!targetCurrency)\n throw new Error(`targetCurrency parameter is mandatory (got ${targetCurrency} instead).`);\n if (referenceMultiplier && typeof referenceMultiplier !== 'number') {\n throw new Error(\n `referenceMultiplier must be a number (got ${typeof referenceMultiplier} ${referenceMultiplier} instead)`,\n );\n }\n // Let shouldInvertEquation() handle `reference`.\n }\n}\n\nfunction shouldInvertEquation(referenceConfig: Reference, sourceCurrency: string): boolean {\n if (referenceConfig === 'source') return false;\n if (referenceConfig === 'target') return true;\n if (['auto', undefined, null].indexOf(referenceConfig) > -1)\n return !!(config[sourceCurrency] || {}).hasInversionEnabled;\n throw new Error(\n `Unrecognized reference config value: ${referenceConfig} (valid values are auto, source, target).`,\n );\n}\n\nfunction getMultiplier(\n referenceMultiplierOverride: number | undefined,\n lhsCurrency: string,\n): number {\n return (\n referenceMultiplierOverride ||\n (config[lhsCurrency] || {}).multiplierForEquation ||\n DEFAULT_RATE_MULTIPLIER\n );\n}\n","const supportedLocales: Record<string, boolean> = {}; // cache\n\nexport function isSelectedLocaleSupported(locale: string): boolean {\n if (supportedLocales[locale] === undefined) {\n supportedLocales[locale] = checkForLocaleSupport(locale);\n }\n return supportedLocales[locale];\n}\n\nfunction checkForLocaleSupport(locale: string): boolean {\n try {\n return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;\n } catch (e) {\n return false;\n }\n}\n","const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst SHORT_MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nfunction getJoiningCharacter(options: Intl.DateTimeFormatOptions): string {\n return options.month === 'short' ? ' ' : '/';\n}\n\nfunction isMonthFirst(options: Intl.DateTimeFormatOptions) {\n return options.month === 'short';\n}\n\nfunction getFormattedMonth(\n options: Intl.DateTimeFormatOptions,\n isUTC: boolean,\n date: Date,\n): string | number {\n if (options.month === 'short') {\n return SHORT_MONTHS[isUTC ? date.getUTCMonth() : date.getMonth()];\n }\n return (isUTC ? date.getUTCMonth() : date.getMonth()) + 1;\n}\n\n// Sample outputs: 'Sat, 1/12/2018', '1/12/2018', '12/2018', Sat, 1'\nexport function getFallbackFormat(date: Date, options: Intl.DateTimeFormatOptions = {}): string {\n const isUTC = options.timeZone === 'UTC';\n\n const dateParts = [];\n if (options.day) dateParts.push(isUTC ? date.getUTCDate() : date.getDate());\n if (options.month) {\n const monthFormat = getFormattedMonth(options, isUTC, date);\n if (isMonthFirst(options)) {\n dateParts.unshift(monthFormat);\n } else {\n dateParts.push(monthFormat);\n }\n }\n if (options.year) dateParts.push(isUTC ? date.getUTCFullYear() : date.getUTCFullYear());\n\n const joiningCharacter = getJoiningCharacter(options);\n let fallbackDate = dateParts.join(joiningCharacter);\n\n if (options.weekday) {\n const dayName = WEEKDAYS[isUTC ? date.getUTCDay() : date.getDay()];\n fallbackDate = fallbackDate ? `${dayName}, ${fallbackDate}` : dayName;\n }\n return (\n fallbackDate ||\n getFallbackFormat(date, {\n timeZone: options.timeZone,\n day: 'true',\n month: 'true',\n year: 'true',\n })\n );\n}\n","import { isIntlSupported, isSelectedLocaleSupported } from './support-detection';\nimport { getFallbackFormat } from './fallback-format';\nimport { DEFAULT_LOCALE } from '../defaults';\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? new Intl.DateTimeFormat(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n","import isToday from '../isToday';\nimport { formatDate } from '../date';\nimport { getTranslation } from '../../translations/translator';\nimport { DEFAULT_LOCALE } from '../../defaults';\n\nexport function formatRelativeDate(date: Date, locale = DEFAULT_LOCALE): string {\n if (date < new Date(Date.now())) {\n return '';\n }\n\n let formatted;\n if (shouldFormatRelative(date)) {\n formatted = formatRelative(date, locale);\n } else {\n formatted = formatAbsolute(date, locale);\n }\n return formatted;\n}\n\nfunction shouldFormatRelative(date: Date): boolean {\n return isToday(date) && isWithinHours(date, 12);\n}\n\nfunction isWithinHours(date: Date, boundary: number): boolean {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n return getDifferenceIn(diff, TimeUnit.HOUR) <= boundary;\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n\n if (getDifferenceIn(diff, TimeUnit.SECOND) < 60) {\n return formatSeconds(locale);\n }\n\n const differenceInMinutes = getDifferenceIn(diff, TimeUnit.MINUTE);\n if (differenceInMinutes < 60) {\n return formatTimeUnit(differenceInMinutes, locale, TimeUnit.MINUTE);\n }\n\n return formatTimeUnit(getDifferenceIn(diff, TimeUnit.HOUR), locale, TimeUnit.HOUR);\n}\n\nfunction formatAbsolute(date: Date, locale: string): string {\n const params = {\n formattedDate: formatDate(date, locale, { month: 'short', day: 'numeric' }),\n };\n return getTranslation('relative-format-by', params, locale);\n}\n\nfunction getDifferenceIn(diff: number, timeUnitValue: TimeUnit): number {\n const millisecondsMap = {\n [TimeUnit.HOUR]: 3600000,\n [TimeUnit.MINUTE]: 60000,\n [TimeUnit.SECOND]: 1000,\n };\n return Math.ceil(diff / millisecondsMap[timeUnitValue]);\n}\n\nfunction formatTimeUnit(value: number, locale: string, timeUnit: string): string {\n if (value === 1) {\n return getTranslation(`relative-format-in-${timeUnit}`, {}, locale);\n }\n return getTranslation(\n `relative-format-in-${timeUnit}s`,\n { [`${timeUnit}s`]: `${value}` },\n locale,\n );\n}\n\nfunction formatSeconds(locale: string) {\n return getTranslation('relative-format-in-seconds', {}, locale);\n}\n\nenum TimeUnit {\n SECOND = 'second',\n MINUTE = 'minute',\n HOUR = 'hour',\n}\n","// eslint-disable-next-line import/no-unresolved\nimport translations from './translations.json';\n\nexport function getTranslation(\n translationKey: string,\n params: Record<string, string> = {},\n locale: string,\n): string {\n let translatedMessage: string | undefined;\n if (hasTranslation(locale, translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>)[locale][\n translationKey\n ];\n } else if (hasTranslation('en', translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>).en[translationKey];\n } else {\n translatedMessage = translationKey;\n }\n\n if (translatedMessage && params) {\n Object.keys(params).forEach(key => {\n translatedMessage = (translatedMessage as string).replace(\n new RegExp(`{${key}}`, 'g'),\n params[key],\n );\n });\n }\n\n return translatedMessage || translationKey;\n}\n\nfunction hasTranslation(locale: string, translationKey: string): boolean {\n return (\n hasOwnProperty(translations, locale) &&\n hasOwnProperty((translations as Record<string, Record<string, string>>)[locale], translationKey)\n );\n}\n\nfunction hasOwnProperty(obj: any, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n","export const formatPercentage= (percentage: number, locale = 'en-GB'): string =>\n Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(percentage);\n\n\n","export default (date: Date): boolean => {\n const today = new Date(Date.now());\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n","import formatRate from './formatRate';\n\nexport type DisplayRate = {\n /**\n * Numerical rate to 4 decimal places. Only use when there is another indicator on the screen\n * for if the rate is inverted or not, such as a multiply/divide icon.\n */\n decimal: string;\n /**\n * Rate equation such as `1 ABC = 0.5743 DEF`. Use this whenever you need to display a rate\n * without much context.\n */\n equation: string;\n /**\n * If the rates given are given in the opposite direction to now the function was called.\n * For example if source was BRL and target was EUR, an inverted equation of\n * `1 EUR = 5.1233 BRL` may be returned.\n */\n inverted: boolean;\n};\n\n/**\n * Returns rates for displaying to customers.\n */\nexport default function getDisplayRate({\n rate,\n sourceCurrency,\n targetCurrency,\n locale,\n}: {\n rate: number;\n sourceCurrency: string;\n targetCurrency: string;\n locale: string;\n}): DisplayRate {\n const inverted = shouldInvertEquation(sourceCurrency, rate);\n\n const rawValue = inverted ? 1 / rate : rate;\n\n const leftHandSide = `1 ${inverted ? targetCurrency : sourceCurrency}`;\n const rightHandSide = `${formatRate(rawValue, locale)} ${\n inverted ? sourceCurrency : targetCurrency\n }`;\n\n return {\n decimal: formatRate(rawValue, locale),\n inverted,\n equation: `${leftHandSide} = ${rightHandSide}`,\n };\n}\n\nfunction shouldInvertEquation(sourceCurrency: string, rate: number): boolean {\n if (sourceCurrency === 'BRL' && rate <= 10) {\n // Prefer to show BRL inverted unless the rate would be below 0.1\n return true;\n }\n\n // Prefer not to show very low rates\n return rate < 0.1;\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\n\n/**\n * @deprecated use getDisplayRate\n */\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n }: { reference?: Reference; referenceMultiplier?: number; significantFigures?: number } = {},\n locale = DEFAULT_LOCALE,\n) {\n const response = {\n suggested: {},\n formats: {} as Record<string, any>,\n };\n\n response.formats.decimal = {\n output: formatNumberToSignificantDigits(rate, locale, significantFigures),\n significantFigures,\n };\n\n const equation = getRateEquation(rate, sourceCurrency, targetCurrency, {\n reference,\n referenceMultiplier,\n });\n\n response.formats.equation = {\n output: formatRateEquation(equation, { significantFigures }, locale),\n reference: equation.lhsCurrency === sourceCurrency ? 'source' : 'target',\n referenceMultiplier: equation.lhsValue,\n calculationInDecimal: formatNumberToSignificantDigits(\n equation.rhsValue,\n locale,\n significantFigures,\n ),\n };\n\n if (equation.lhsCurrency === sourceCurrency && equation.lhsValue === 1) {\n response.suggested = {\n format: 'decimal',\n output: response.formats.decimal.output,\n };\n } else {\n response.suggested = {\n format: 'equation',\n output: response.formats.equation.output,\n };\n }\n\n return response;\n}\n"],"names":["isSupported","isIntlNumberFormatSupported","locale","undefined","Intl","NumberFormat","supportedLocalesOf","length","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","options","cacheKey","Object","entries","getValidLocale","noUnderscoreLocale","replace","e","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","IDR","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","formatRate","rate","optionsOrLocale","formatRateInternal","significantFigures","fractionDigits","Math","min","max","floor","log10","value","fallback","formatNumberWithOptions","minimumFractionDigits","maximumFractionDigits","lhsCurrency","rhsValue","rhsCurrency","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","RON","THB","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","checkForLocaleSupport","isSelectedLocaleSupported","getSupportedLocale","getFallbackFormat","isUTC","timeZone","dateParts","day","push","getUTCDate","getDate","month","monthFormat","getUTCMonth","getMonth","getFormattedMonth","isMonthFirst","unshift","year","getUTCFullYear","joiningCharacter","getJoiningCharacter","fallbackDate","join","weekday","dayName","getUTCDay","getDay","TimeUnit","getTranslation","translationKey","params","translatedMessage","hasTranslation","translations","en","keys","forEach","key","RegExp","obj","getDifferenceIn","diff","timeUnitValue","millisecondsMap","HOUR","MINUTE","SECOND","ceil","formatTimeUnit","timeUnit","percentage","style","now","today","getFullYear","isToday","boundary","isWithinHours","shouldFormatRelative","formatSeconds","differenceInMinutes","formatRelative","formattedDate","formatAbsolute","sourceCurrency","targetCurrency","inverted","shouldInvertEquation","rawValue","leftHandSide","rightHandSide","decimal","equation","reference","referenceMultiplier","response","suggested","formats","output","Error","validateParameters","referenceConfig","indexOf","getRateEquation","formatRateEquation","calculationInDecimal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formatting.umd.js","sources":["../src/number/feature-detection/intl.ts","../src/number/number.ts","../src/defaults/index.ts","../src/currency/currency.ts","../src/rate/formatRate.ts","../src/rate/formatRateEquation.ts","../src/date/support-detection/intl.ts","../src/rate/config.ts","../src/rate/getRateEquation.ts","../src/date/support-detection/selectedLocale.ts","../src/date/fallback-format/fallbackFormat.ts","../src/date/date.ts","../src/date/relative-date/relativeDateFormatter.ts","../src/translations/translator.ts","../src/percentage/percentage.ts","../src/date/isToday.ts","../src/rate/getDisplayRate.ts","../src/rate/getRateInAllFormats.ts"],"sourcesContent":["let isSupported: boolean | undefined;\n\n/**\n * Checks if Intl.NumberFormat is supported for a specific locale\n * @param {String} locale\n * @returns {Boolean}\n */\nexport function isIntlNumberFormatSupported(locale: string): boolean {\n if (isSupported === undefined) {\n isSupported =\n typeof Intl === 'object' &&\n Intl !== undefined &&\n typeof Intl.NumberFormat === 'function' &&\n Intl.NumberFormat &&\n typeof Intl.NumberFormat.supportedLocalesOf === 'function' &&\n Intl.NumberFormat.supportedLocalesOf &&\n Intl.NumberFormat.supportedLocalesOf(locale).length === 1;\n }\n return isSupported;\n}\n","import {\n DEFAULT_LOCALE,\n PRECISION,\n NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n PrecisionType,\n} from '../defaults';\nimport { isIntlNumberFormatSupported } from './feature-detection';\n\nconst { SIGNIFICANT_DIGITS, FRACTION_DIGITS } = PRECISION;\n\nconst formatters: Record<string, any> = {}; // cache, sample: { 'en-GB': formatter, 'en-GB2': formatter }\n\n/**\n * Returns a formatter for the specified locale and NumberFormatOptions\n * @param {String} locale\n * @param {Intl.NumberFormatOptions} options\n * @returns {Intl.NumberFormat}\n */\nfunction getFormatter(locale: string, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const cacheKey = options ? `${locale}${Object.entries(options)}` : locale;\n if (!formatters[cacheKey]) {\n formatters[cacheKey] = options\n ? new Intl.NumberFormat(locale, options)\n : new Intl.NumberFormat(locale);\n }\n return formatters[cacheKey];\n}\n\n/**\n * Returns the desired options object for\n * `Number.toLocaleString` and `Intl.NumberFormat` methods\n * @param {Number} precision\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n */\nfunction getPrecisionOptions(precision: number, precisionType: PrecisionType) {\n return {\n [`minimum${precisionType}`]: precision,\n [`maximum${precisionType}`]: precision,\n };\n}\n\n/**\n * Returns the locale that was passed in if it works\n * with `toLocaleString` or otherwise falls back to `DEFAULT_LOCALE`\n * @param {String} locale\n */\nfunction getValidLocale(locale: string) {\n try {\n const noUnderscoreLocale = locale.replace(/_/, '-');\n\n Intl.NumberFormat(noUnderscoreLocale);\n return noUnderscoreLocale;\n } catch (e) {\n return DEFAULT_LOCALE;\n }\n}\n\n/**\n * Formats the number as a fallback for when `toLocaleString` method is not supported\n * by the browser. Will use `toFixed` to format `FractionDigits` precisionType and `toPrecision`\n * to format `SignificantDigits` precision type.\n * @param {Number} number\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nfunction formatNumberWithFallback(number: number, precision: number, precisionType: PrecisionType) {\n return precisionType === SIGNIFICANT_DIGITS.TYPE\n ? number.toPrecision(precision)\n : number.toFixed(precision);\n}\n\n/**\n * Formats a number to a significant number of digits with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {Number} significantDigits - this may be a value between 1 and 21, inclusive\n * @param {String} locale\n * @returns {String}\n */\nexport function formatNumberToSignificantDigits(\n number: number,\n locale = DEFAULT_LOCALE,\n significantDigits = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n) {\n return formatNumber(number, locale, significantDigits, SIGNIFICANT_DIGITS.TYPE);\n}\n\n/**\n * Formats a number precisely with valid fallback even if the\n * `toLocaleString` method is not supported by the actual browser\n * @param {Number|String} number\n * @param {String} locale\n * @param {Number} precision - this may be a value between 0 and 20 for `FractionDigits` or 1 and 21 for `SignificantDigits`\n * @param {String} precisionType - `FractionDigits|SignificantDigits`\n * @returns {String}\n */\nexport function formatNumber(\n number: number,\n locale = DEFAULT_LOCALE,\n precision?: number,\n precisionType: PrecisionType = 'FractionDigits',\n): string {\n if (!number && number !== 0) {\n return '';\n }\n\n if (typeof number === 'string' && Number(number)) {\n // eslint-disable-next-line no-param-reassign\n number = Number(number);\n }\n\n const { MIN_PRECISION, MAX_PRECISION } =\n precisionType === SIGNIFICANT_DIGITS.TYPE ? SIGNIFICANT_DIGITS : FRACTION_DIGITS;\n\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed#Parameters\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat#Parameters\n const isPrecisionValid =\n precision !== undefined &&\n precision !== null &&\n typeof precision === 'number' &&\n precision >= MIN_PRECISION &&\n precision <= MAX_PRECISION;\n\n const validatedLocale = getValidLocale(locale);\n\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return isPrecisionValid\n ? formatNumberWithFallback(number, precision!, precisionType)\n : `${number}`;\n }\n\n const formatter = isPrecisionValid\n ? getFormatter(validatedLocale, getPrecisionOptions(precision!, precisionType))\n : getFormatter(validatedLocale);\n\n return formatter.format(number);\n}\n\nexport function formatNumberWithOptions(\n value: number,\n options: Intl.NumberFormatOptions,\n locale: string,\n fallback: string,\n) {\n const validatedLocale = getValidLocale(locale);\n if (!isIntlNumberFormatSupported(validatedLocale)) {\n return fallback;\n }\n\n return getFormatter(validatedLocale, options).format(value);\n}\n","export const DEFAULT_LOCALE = 'en-GB';\nexport const DEFAULT_PRECISION_TYPE = 'FractionDigits';\nexport const NUMBER_OF_RATE_SIGNIFICANT_DIGITS = 6;\nexport const DEFAULT_RATE_MULTIPLIER = 1;\nexport const PRECISION = {\n SIGNIFICANT_DIGITS: {\n TYPE: 'SignificantDigits' as PrecisionType,\n MIN_PRECISION: 1,\n MAX_PRECISION: 21,\n },\n FRACTION_DIGITS: {\n TYPE: 'FractionDigits' as PrecisionType,\n MIN_PRECISION: 0,\n MAX_PRECISION: 20,\n },\n};\nexport type PrecisionType = 'SignificantDigits' | 'FractionDigits';\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumber } from '../number';\n\nconst currencyDecimals = {\n BIF: 0,\n BYR: 0,\n CLP: 0,\n DJF: 0,\n GNF: 0,\n IDR: 0,\n JPY: 0,\n KMF: 0,\n KRW: 0,\n MGA: 0,\n PYG: 0,\n RWF: 0,\n VND: 0,\n VUV: 0,\n XAF: 0,\n XOF: 0,\n XPF: 0,\n // technically HUF does have decimals, but due to the exchange rate banks\n // do not accept decimal amounts\n HUF: 0,\n UGX: 0,\n // local banks do not consistently support the ideal 2-decimal places fractional part\n KES: 0,\n\n BHD: 3,\n JOD: 3,\n KWD: 3,\n OMR: 3,\n TND: 3,\n};\n\nconst DEFAULT_CURRENCY_DECIMALS = 2;\n\nfunction getCurrencyDecimals(currency = '') {\n const upperCaseCurrency = currency.toUpperCase();\n if (Object.prototype.hasOwnProperty.call(currencyDecimals, upperCaseCurrency)) {\n return currencyDecimals[upperCaseCurrency as keyof typeof currencyDecimals];\n }\n return DEFAULT_CURRENCY_DECIMALS;\n}\n\nfunction amountHasNoDecimals(amount: number): boolean {\n return amount % 1 === 0;\n}\n\nfunction getPrecision(amount: number, currencyCode: string, alwaysShowDecimals: boolean): number {\n if (amountHasNoDecimals(amount) && !alwaysShowDecimals) {\n return 0;\n }\n\n return getCurrencyDecimals(currencyCode);\n}\n\nexport function formatAmount(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n): string {\n const availablePrecision = getPrecision(amount, currencyCode, options.alwaysShowDecimals);\n\n return formatNumber(amount, locale, availablePrecision);\n}\n\nexport function formatMoney(\n amount: number,\n currencyCode: string,\n locale = DEFAULT_LOCALE,\n options = { alwaysShowDecimals: false },\n) {\n return `${formatAmount(amount, currencyCode, locale, options)} ${(\n currencyCode || ''\n ).toUpperCase()}`;\n}\n","import { DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberWithOptions, formatNumberToSignificantDigits } from '../number';\n\nexport type FormatRateOptions = {\n significantFigures?: number;\n};\n\nfunction formatRate(rate: number, locale: string): string;\n/**\n * @deprecated Do not specify options, always specify a locale.\n */\nfunction formatRate(rate: number, options?: FormatRateOptions, locale?: string): string;\n\nfunction formatRate(\n rate: number,\n optionsOrLocale?: FormatRateOptions | string,\n locale?: string,\n): string {\n if (typeof optionsOrLocale === 'string') {\n return formatRateInternal(rate, optionsOrLocale);\n }\n\n const significantFigures = optionsOrLocale && optionsOrLocale.significantFigures;\n if (significantFigures) {\n return formatNumberToSignificantDigits(rate, locale || DEFAULT_LOCALE, significantFigures);\n }\n\n return formatRateInternal(rate, locale || DEFAULT_LOCALE);\n}\n\nfunction formatRateInternal(rate: number, locale: string) {\n // We lower the number of decimal places if the value is big, to minimun of 2\n const sizeAdjuster =\n // Upper bound 2\n Math.min(\n 2,\n // Low bound 0\n Math.max(\n 0,\n // Number of siginificant leading digits - 1\n Math.floor(Math.log10(rate)) - 1,\n ),\n );\n const fractionDigits = 4 - sizeAdjuster;\n\n return formatNumberWithOptions(\n rate,\n {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n },\n locale,\n rate.toFixed(fractionDigits),\n );\n}\n\nexport default formatRate;\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport { formatAmount } from '../currency';\n\nexport default function(\n {\n lhsValue,\n lhsCurrency,\n rhsValue,\n rhsCurrency,\n }: { lhsValue: number; lhsCurrency: string; rhsValue: number; rhsCurrency: string },\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return `${formatAmount(\n lhsValue,\n lhsCurrency,\n locale,\n )} ${lhsCurrency} = ${formatNumberToSignificantDigits(\n rhsValue,\n locale,\n significantFigures,\n )} ${rhsCurrency}`;\n}\n","import { DEFAULT_LOCALE } from '../../defaults';\n\nlet intlSupported: boolean | undefined; // cache\n\nexport function isIntlSupported(): boolean {\n if (intlSupported === undefined) {\n intlSupported = intlDateTimeFormatReturnsCorrectValue();\n }\n return intlSupported;\n}\n\nfunction intlDateTimeFormatReturnsCorrectValue(): boolean {\n try {\n const date = new Date(2018, 11, 1);\n const dateString = new Intl.DateTimeFormat(DEFAULT_LOCALE).format(date);\n return dateString === '01/12/2018';\n } catch (e) {\n return false;\n }\n}\n","export default {\n BRL: {\n hasInversionEnabled: true,\n },\n INR: {\n hasInversionEnabled: true,\n },\n JPY: {\n hasInversionEnabled: true,\n },\n IDR: {\n hasInversionEnabled: true\n },\n HUF: {\n hasInversionEnabled: true,\n },\n RON: {\n hasInversionEnabled: true,\n },\n THB: {\n hasInversionEnabled: true,\n },\n} as Record<string, { hasInversionEnabled?: boolean; multiplierForEquation?: number }>;\n","import config from './config';\nimport { DEFAULT_RATE_MULTIPLIER } from '../defaults';\n\nexport type Reference = 'auto' | 'source' | 'target';\n\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n }: { reference?: Reference; referenceMultiplier?: number } = {},\n) {\n validateParameters();\n\n if (shouldInvertEquation(reference, sourceCurrency)) {\n return {\n // inverted.\n lhsCurrency: targetCurrency,\n lhsValue: getMultiplier(referenceMultiplier, targetCurrency),\n rhsCurrency: sourceCurrency,\n rhsValue: getMultiplier(referenceMultiplier, targetCurrency) / rate,\n };\n }\n return {\n // normal.\n lhsCurrency: sourceCurrency,\n lhsValue: getMultiplier(referenceMultiplier, sourceCurrency),\n rhsCurrency: targetCurrency,\n rhsValue: rate * getMultiplier(referenceMultiplier, sourceCurrency),\n };\n\n function validateParameters(): void {\n if (!rate) throw new Error(`rate parameter is mandatory (got ${rate} instead).`);\n if (!sourceCurrency)\n throw new Error(`sourceCurrency parameter is mandatory (got ${sourceCurrency} instead).`);\n if (!targetCurrency)\n throw new Error(`targetCurrency parameter is mandatory (got ${targetCurrency} instead).`);\n if (referenceMultiplier && typeof referenceMultiplier !== 'number') {\n throw new Error(\n `referenceMultiplier must be a number (got ${typeof referenceMultiplier} ${referenceMultiplier} instead)`,\n );\n }\n // Let shouldInvertEquation() handle `reference`.\n }\n}\n\nfunction shouldInvertEquation(referenceConfig: Reference, sourceCurrency: string): boolean {\n if (referenceConfig === 'source') return false;\n if (referenceConfig === 'target') return true;\n if (['auto', undefined, null].indexOf(referenceConfig) > -1)\n return !!(config[sourceCurrency] || {}).hasInversionEnabled;\n throw new Error(\n `Unrecognized reference config value: ${referenceConfig} (valid values are auto, source, target).`,\n );\n}\n\nfunction getMultiplier(\n referenceMultiplierOverride: number | undefined,\n lhsCurrency: string,\n): number {\n return (\n referenceMultiplierOverride ||\n (config[lhsCurrency] || {}).multiplierForEquation ||\n DEFAULT_RATE_MULTIPLIER\n );\n}\n","const supportedLocales: Record<string, boolean> = {}; // cache\n\nexport function isSelectedLocaleSupported(locale: string): boolean {\n if (supportedLocales[locale] === undefined) {\n supportedLocales[locale] = checkForLocaleSupport(locale);\n }\n return supportedLocales[locale];\n}\n\nfunction checkForLocaleSupport(locale: string): boolean {\n try {\n return Intl.DateTimeFormat.supportedLocalesOf([locale]).length > 0;\n } catch (e) {\n return false;\n }\n}\n","const WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst SHORT_MONTHS = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\n\nfunction getJoiningCharacter(options: Intl.DateTimeFormatOptions): string {\n return options.month === 'short' ? ' ' : '/';\n}\n\nfunction isMonthFirst(options: Intl.DateTimeFormatOptions) {\n return options.month === 'short';\n}\n\nfunction getFormattedMonth(\n options: Intl.DateTimeFormatOptions,\n isUTC: boolean,\n date: Date,\n): string | number {\n if (options.month === 'short') {\n return SHORT_MONTHS[isUTC ? date.getUTCMonth() : date.getMonth()];\n }\n return (isUTC ? date.getUTCMonth() : date.getMonth()) + 1;\n}\n\n// Sample outputs: 'Sat, 1/12/2018', '1/12/2018', '12/2018', Sat, 1'\nexport function getFallbackFormat(date: Date, options: Intl.DateTimeFormatOptions = {}): string {\n const isUTC = options.timeZone === 'UTC';\n\n const dateParts = [];\n if (options.day) dateParts.push(isUTC ? date.getUTCDate() : date.getDate());\n if (options.month) {\n const monthFormat = getFormattedMonth(options, isUTC, date);\n if (isMonthFirst(options)) {\n dateParts.unshift(monthFormat);\n } else {\n dateParts.push(monthFormat);\n }\n }\n if (options.year) dateParts.push(isUTC ? date.getUTCFullYear() : date.getUTCFullYear());\n\n const joiningCharacter = getJoiningCharacter(options);\n let fallbackDate = dateParts.join(joiningCharacter);\n\n if (options.weekday) {\n const dayName = WEEKDAYS[isUTC ? date.getUTCDay() : date.getDay()];\n fallbackDate = fallbackDate ? `${dayName}, ${fallbackDate}` : dayName;\n }\n return (\n fallbackDate ||\n getFallbackFormat(date, {\n timeZone: options.timeZone,\n day: 'true',\n month: 'true',\n year: 'true',\n })\n );\n}\n","import { isIntlSupported, isSelectedLocaleSupported } from './support-detection';\nimport { getFallbackFormat } from './fallback-format';\nimport { DEFAULT_LOCALE } from '../defaults';\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? new Intl.DateTimeFormat(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n","import isToday from '../isToday';\nimport { formatDate } from '../date';\nimport { getTranslation } from '../../translations/translator';\nimport { DEFAULT_LOCALE } from '../../defaults';\n\nexport function formatRelativeDate(date: Date, locale = DEFAULT_LOCALE): string {\n if (date < new Date(Date.now())) {\n return '';\n }\n\n let formatted;\n if (shouldFormatRelative(date)) {\n formatted = formatRelative(date, locale);\n } else {\n formatted = formatAbsolute(date, locale);\n }\n return formatted;\n}\n\nfunction shouldFormatRelative(date: Date): boolean {\n return isToday(date) && isWithinHours(date, 12);\n}\n\nfunction isWithinHours(date: Date, boundary: number): boolean {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n return getDifferenceIn(diff, TimeUnit.HOUR) <= boundary;\n}\n\nfunction formatRelative(date: Date, locale: string): string {\n const now = new Date(Date.now());\n //@ts-expect-error date maths\n const diff = date - now;\n\n if (getDifferenceIn(diff, TimeUnit.SECOND) < 60) {\n return formatSeconds(locale);\n }\n\n const differenceInMinutes = getDifferenceIn(diff, TimeUnit.MINUTE);\n if (differenceInMinutes < 60) {\n return formatTimeUnit(differenceInMinutes, locale, TimeUnit.MINUTE);\n }\n\n return formatTimeUnit(getDifferenceIn(diff, TimeUnit.HOUR), locale, TimeUnit.HOUR);\n}\n\nfunction formatAbsolute(date: Date, locale: string): string {\n const params = {\n formattedDate: formatDate(date, locale, { month: 'short', day: 'numeric' }),\n };\n return getTranslation('relative-format-by', params, locale);\n}\n\nfunction getDifferenceIn(diff: number, timeUnitValue: TimeUnit): number {\n const millisecondsMap = {\n [TimeUnit.HOUR]: 3600000,\n [TimeUnit.MINUTE]: 60000,\n [TimeUnit.SECOND]: 1000,\n };\n return Math.ceil(diff / millisecondsMap[timeUnitValue]);\n}\n\nfunction formatTimeUnit(value: number, locale: string, timeUnit: string): string {\n if (value === 1) {\n return getTranslation(`relative-format-in-${timeUnit}`, {}, locale);\n }\n return getTranslation(\n `relative-format-in-${timeUnit}s`,\n { [`${timeUnit}s`]: `${value}` },\n locale,\n );\n}\n\nfunction formatSeconds(locale: string) {\n return getTranslation('relative-format-in-seconds', {}, locale);\n}\n\nenum TimeUnit {\n SECOND = 'second',\n MINUTE = 'minute',\n HOUR = 'hour',\n}\n","// eslint-disable-next-line import/no-unresolved\nimport translations from './translations.json';\n\nexport function getTranslation(\n translationKey: string,\n params: Record<string, string> = {},\n locale: string,\n): string {\n let translatedMessage: string | undefined;\n if (hasTranslation(locale, translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>)[locale][\n translationKey\n ];\n } else if (hasTranslation('en', translationKey)) {\n translatedMessage = (translations as Record<string, Record<string, string>>).en[translationKey];\n } else {\n translatedMessage = translationKey;\n }\n\n if (translatedMessage && params) {\n Object.keys(params).forEach(key => {\n translatedMessage = (translatedMessage as string).replace(\n new RegExp(`{${key}}`, 'g'),\n params[key],\n );\n });\n }\n\n return translatedMessage || translationKey;\n}\n\nfunction hasTranslation(locale: string, translationKey: string): boolean {\n return (\n hasOwnProperty(translations, locale) &&\n hasOwnProperty((translations as Record<string, Record<string, string>>)[locale], translationKey)\n );\n}\n\nfunction hasOwnProperty(obj: any, key: string) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n","export const formatPercentage= (percentage: number, locale = 'en-GB'): string =>\n Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(percentage);\n\n\n","export default (date: Date): boolean => {\n const today = new Date(Date.now());\n return (\n date.getDate() === today.getDate() &&\n date.getMonth() === today.getMonth() &&\n date.getFullYear() === today.getFullYear()\n );\n};\n","import formatRate from './formatRate';\n\nexport type DisplayRate = {\n /**\n * Numerical rate to 4 decimal places. Only use when there is another indicator on the screen\n * for if the rate is inverted or not, such as a multiply/divide icon.\n */\n decimal: string;\n /**\n * Rate equation such as `1 ABC = 0.5743 DEF`. Use this whenever you need to display a rate\n * without much context.\n */\n equation: string;\n /**\n * If the rates given are given in the opposite direction to now the function was called.\n * For example if source was BRL and target was EUR, an inverted equation of\n * `1 EUR = 5.1233 BRL` may be returned.\n */\n inverted: boolean;\n};\n\n/**\n * Returns rates for displaying to customers.\n */\nexport default function getDisplayRate({\n rate,\n sourceCurrency,\n targetCurrency,\n locale,\n}: {\n rate: number;\n sourceCurrency: string;\n targetCurrency: string;\n locale: string;\n}): DisplayRate {\n const inverted = shouldInvertEquation(sourceCurrency, rate);\n\n const rawValue = inverted ? 1 / rate : rate;\n\n const leftHandSide = `1 ${inverted ? targetCurrency : sourceCurrency}`;\n const rightHandSide = `${formatRate(rawValue, locale)} ${\n inverted ? sourceCurrency : targetCurrency\n }`;\n\n return {\n decimal: formatRate(rawValue, locale),\n inverted,\n equation: `${leftHandSide} = ${rightHandSide}`,\n };\n}\n\nfunction shouldInvertEquation(sourceCurrency: string, rate: number): boolean {\n if (sourceCurrency === 'BRL' && rate <= 10) {\n // Prefer to show BRL inverted unless the rate would be below 0.1\n return true;\n }\n\n // Prefer not to show very low rates\n return rate < 0.1;\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\n\n/**\n * @deprecated use getDisplayRate\n */\nexport default function(\n rate: number,\n sourceCurrency: string,\n targetCurrency: string,\n {\n reference = 'auto',\n referenceMultiplier,\n significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS,\n }: { reference?: Reference; referenceMultiplier?: number; significantFigures?: number } = {},\n locale = DEFAULT_LOCALE,\n) {\n const response = {\n suggested: {},\n formats: {} as Record<string, any>,\n };\n\n response.formats.decimal = {\n output: formatNumberToSignificantDigits(rate, locale, significantFigures),\n significantFigures,\n };\n\n const equation = getRateEquation(rate, sourceCurrency, targetCurrency, {\n reference,\n referenceMultiplier,\n });\n\n response.formats.equation = {\n output: formatRateEquation(equation, { significantFigures }, locale),\n reference: equation.lhsCurrency === sourceCurrency ? 'source' : 'target',\n referenceMultiplier: equation.lhsValue,\n calculationInDecimal: formatNumberToSignificantDigits(\n equation.rhsValue,\n locale,\n significantFigures,\n ),\n };\n\n if (equation.lhsCurrency === sourceCurrency && equation.lhsValue === 1) {\n response.suggested = {\n format: 'decimal',\n output: response.formats.decimal.output,\n };\n } else {\n response.suggested = {\n format: 'equation',\n output: response.formats.equation.output,\n };\n }\n\n return response;\n}\n"],"names":["isSupported","isIntlNumberFormatSupported","locale","undefined","Intl","NumberFormat","supportedLocalesOf","length","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","options","cacheKey","Object","entries","getValidLocale","noUnderscoreLocale","replace","e","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","IDR","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","formatRate","rate","optionsOrLocale","formatRateInternal","significantFigures","fractionDigits","Math","min","max","floor","log10","value","fallback","formatNumberWithOptions","minimumFractionDigits","maximumFractionDigits","lhsCurrency","rhsValue","rhsCurrency","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","RON","THB","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","checkForLocaleSupport","isSelectedLocaleSupported","getSupportedLocale","getFallbackFormat","isUTC","timeZone","dateParts","day","push","getUTCDate","getDate","month","monthFormat","getUTCMonth","getMonth","getFormattedMonth","isMonthFirst","unshift","year","getUTCFullYear","joiningCharacter","getJoiningCharacter","fallbackDate","join","weekday","dayName","getUTCDay","getDay","TimeUnit","getTranslation","translationKey","params","translatedMessage","hasTranslation","translations","en","keys","forEach","key","RegExp","obj","getDifferenceIn","diff","timeUnitValue","millisecondsMap","HOUR","MINUTE","SECOND","ceil","formatTimeUnit","timeUnit","percentage","style","now","today","getFullYear","isToday","boundary","isWithinHours","shouldFormatRelative","formatSeconds","differenceInMinutes","formatRelative","formattedDate","formatAbsolute","sourceCurrency","targetCurrency","inverted","shouldInvertEquation","rawValue","leftHandSide","rightHandSide","decimal","equation","reference","referenceMultiplier","response","suggested","formats","output","Error","validateParameters","referenceConfig","indexOf","getRateEquation","formatRateEquation","calculationInDecimal"],"mappings":"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"}
|
package/package.json
CHANGED