@transferwise/formatting 2.7.0 → 2.8.0
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/CHANGELOG.md +0 -158
package/dist/formatting.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e,t={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},r={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},n={};function i(e,t){var r=t?""+e+Object.entries(t):e;return n[r]||(n[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),n[r]}function a(e,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n=6),o(e,r,n,t.TYPE)}function o(n,a,o,u){if(void 0===a&&(a="en-GB"),void 0===u&&(u="FractionDigits"),!n&&0!==n)return"";"string"==typeof n&&Number(n)&&(n=Number(n));var m=u===t.TYPE?t:r,s=null!=o&&"number"==typeof o&&o>=m.MIN_PRECISION&&o<=m.MAX_PRECISION,f=function(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}(a);return function(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}(f)?(s?i(f,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(o,u)):i(f)).format(n):s?function(e,r,n){return n===t.TYPE?e.toPrecision(r):e.toFixed(r)}(n,o,u):""+n}var u={BIF:0,BYR:0,CLP:0,DJF:0,GNF: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 m(e,t,r,n){void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1});var i=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(u,t)?u[t]:2}(t)}(e,t,n.alwaysShowDecimals),a=e<0,m=o(Math.abs(e),r,i);return a?"- "+m:m}function s(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,o=e.rhsCurrency,u=(void 0===t?{}:t).significantFigures,s=void 0===u?6:u;return void 0===r&&(r="en-GB"),m(e.lhsValue,n,r)+" "+n+" = "+a(i,r,s)+" "+o}var f,l={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0}};function v(e,t){return e||(l[t]||{}).multiplierForEquation||1}var c={},d=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],p={};function y(e,t,r){return void 0===t&&(t="en-GB"),void 0===f&&(f=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),f?function(e,t){return p[e]||(p[e]=new Map),p[e].has(t)||p[e].set(t,new Intl.DateTimeFormat(e,t)),p[e].get(t)}(function(e){return function(e){return void 0===c[e]&&(c[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),c[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?h[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 g,b={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":"binnen Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in einer Minute","relative-format-in-hour":"in einer 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":"el {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"dans {hours} heures","relative-format-in-minute":"dans 1 minute","relative-format-in-hour":"dans 1 heure","relative-format-by":"d'ici le {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":"eddig: {formattedDate}"},id:{"relative-format-in-seconds":"dalam 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 {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}"},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:{"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 D(e,t,r){var n;return void 0===t&&(t={}),(n=I(r,e)?b[r][e]:I("en",e)?b.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function I(e,t){return w(b,e)&&w(b[e],t)}function w(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function F(e,t){var r,n=((r={})[g.HOUR]=36e5,r[g.MINUTE]=6e4,r[g.SECOND]=1e3,r);return Math.ceil(e/n[t])}function E(e,t,r){var n;return 1===e?D("relative-format-in-"+r,{},t):D("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(g||(g={})),exports.formatAmount=m,exports.formatDate=y,exports.formatMoney=function(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),m(e,t,r,n)+" "+(t||"").toUpperCase()},exports.formatNumber=o,exports.formatNumberToSignificantDigits=a,exports.formatPercentage=function(e){return parseFloat((100*e).toFixed(2))+"%"},exports.formatRate=function(e,t,r){var n=(void 0===t?{}:t).significantFigures;return void 0===r&&(r="en-GB"),a(e,r,void 0===n?6:n)},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 F(e-new Date(Date.now()),g.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(F(r,g.SECOND)<60)return function(e){return D("relative-format-in-seconds",{},e)}(t);var n=F(r,g.MINUTE);return n<60?E(n,t,g.MINUTE):E(F(r,g.HOUR),t,g.HOUR)}(e,t):function(e,t){return D("relative-format-by",{formattedDate:y(e,t,{month:"short",day:"numeric"})},t)}(e,t)},exports.getRateInAllFormats=function(e,t,r,n,i){var o=void 0===n?{}:n,u=o.reference,m=void 0===u?"auto":u,f=o.referenceMultiplier,c=o.significantFigures,d=void 0===c?6:c;void 0===i&&(i="en-GB");var h={suggested:{},formats:{}};h.formats.decimal={output:a(e,i,d),significantFigures:d};var p=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!!(l[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:v(u,r),rhsCurrency:t,rhsValue:v(u,r)/e}:{lhsCurrency:t,lhsValue:v(u,t),rhsCurrency:r,rhsValue:e*v(u,t)}}(e,t,r,{reference:m,referenceMultiplier:f});return h.formats.equation={output:s(p,{significantFigures:d},i),reference:p.lhsCurrency===t?"source":"target",referenceMultiplier:p.lhsValue,calculationInDecimal:a(p.rhsValue,i,d)},h.suggested=p.lhsCurrency===t&&1===p.lhsValue?{format:"decimal",output:h.formats.decimal.output}:{format:"equation",output:h.formats.equation.output},h};
|
|
1
|
+
var e,r={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},t={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},n={};function o(e,r){var t=r?""+e+Object.entries(r):e;return n[t]||(n[t]=r?new Intl.NumberFormat(e,r):new Intl.NumberFormat(e)),n[t]}function a(e,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n=6),u(e,t,n,r.TYPE)}function u(n,a,u,i){if(void 0===a&&(a="en-GB"),void 0===i&&(i="FractionDigits"),!n&&0!==n)return"";"string"==typeof n&&Number(n)&&(n=Number(n));var c=i===r.TYPE?r:t,s=null!=u&&"number"==typeof u&&u>=c.MIN_PRECISION&&u<=c.MAX_PRECISION,f=function(e){try{var r=e.replace(/_/,"-");return Intl.NumberFormat(r),r}catch(e){return"en-GB"}}(a);return function(r){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(r).length),e}(f)?(s?o(f,function(e,r){var t;return(t={})["minimum"+r]=e,t["maximum"+r]=e,t}(u,i)):o(f)).format(n):s?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(n,u,i):""+n}var i={BIF:0,BYR:0,CLP:0,DJF:0,GNF: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 c(e,r,t,n){void 0===t&&(t="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1});var o=function(e,r,t){return function(e){return e%1==0}(e)&&!t?0:function(e){void 0===e&&(e="");var r=e.toUpperCase();return Object.prototype.hasOwnProperty.call(i,r)?i[r]:2}(r)}(e,r,n.alwaysShowDecimals),a=e<0,c=u(Math.abs(e),t,o);return a?"- "+c:c}function s(e,r,t){var n=e.lhsCurrency,o=e.rhsValue,u=e.rhsCurrency,i=(void 0===r?{}:r).significantFigures,s=void 0===i?6:i;return void 0===t&&(t="en-GB"),c(e.lhsValue,n,t)+" "+n+" = "+a(o,t,s)+" "+u}var f,l={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0}};function m(e,r){return e||(l[r]||{}).multiplierForEquation||1}var v={},d=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function p(e,r,t){return void 0===r&&(r="en-GB"),void 0===f&&(f=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),f?new Intl.DateTimeFormat(function(e){return function(e){return void 0===v[e]&&(v[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),v[e]}(e)?e:"en-GB"}(r),t).format(e):function e(r,t){void 0===t&&(t={});var n="UTC"===t.timeZone,o=[];if(t.day&&o.push(n?r.getUTCDate():r.getDate()),t.month){var a=function(e,r,t){return"short"===e.month?h[r?t.getUTCMonth():t.getMonth()]:(r?t.getUTCMonth():t.getMonth())+1}(t,n,r);!function(e){return"short"===e.month}(t)?o.push(a):o.unshift(a)}t.year&&o.push(r.getUTCFullYear());var u=function(e){return"short"===e.month?" ":"/"}(t),i=o.join(u);if(t.weekday){var c=d[n?r.getUTCDay():r.getDay()];i=i?c+", "+i:c}return i||e(r,{timeZone:t.timeZone,day:"true",month:"true",year:"true"})}(e,t)}var g,I={};function y(e,r,t){var n;return void 0===r&&(r={}),(n=D(t,e)?I[t][e]:D("en",e)?I.en[e]:e)&&r&&Object.keys(r).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),r[e])}),n||e}function D(e,r){return F(I,e)&&F(I[e],r)}function F(e,r){return Object.prototype.hasOwnProperty.call(e,r)}function E(e,r){var t,n=((t={})[g.HOUR]=36e5,t[g.MINUTE]=6e4,t[g.SECOND]=1e3,t);return Math.ceil(e/n[r])}function N(e,r,t){var n;return 1===e?y("relative-format-in-"+t,{},r):y("relative-format-in-"+t+"s",((n={})[t+"s"]=""+e,n),r)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(g||(g={})),exports.formatAmount=c,exports.formatDate=p,exports.formatMoney=function(e,r,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),c(e,r,t,n)+" "+(r||"").toUpperCase()},exports.formatNumber=u,exports.formatNumberToSignificantDigits=a,exports.formatPercentage=function(e){return parseFloat((100*e).toFixed(2))+"%"},exports.formatRate=function(e,r,t){var n=(void 0===r?{}:r).significantFigures;return void 0===t&&(t="en-GB"),a(e,t,void 0===n?6:n)},exports.formatRelativeDate=function(e,r){return void 0===r&&(r="en-GB"),e<new Date(Date.now())?"":function(e){return function(e){var r=new Date(Date.now());return e.getDate()===r.getDate()&&e.getMonth()===r.getMonth()&&e.getFullYear()===r.getFullYear()}(e)&&function(e,r){return E(e-new Date(Date.now()),g.HOUR)<=12}(e)}(e)?function(e,r){var t=e-new Date(Date.now());if(E(t,g.SECOND)<60)return function(e){return y("relative-format-in-seconds",{},e)}(r);var n=E(t,g.MINUTE);return n<60?N(n,r,g.MINUTE):N(E(t,g.HOUR),r,g.HOUR)}(e,r):function(e,r){return y("relative-format-by",{formattedDate:p(e,r,{month:"short",day:"numeric"})},r)}(e,r)},exports.getRateInAllFormats=function(e,r,t,n,o){var u=void 0===n?{}:n,i=u.reference,c=void 0===i?"auto":i,f=u.referenceMultiplier,v=u.significantFigures,d=void 0===v?6:v;void 0===o&&(o="en-GB");var h={suggested:{},formats:{}};h.formats.decimal={output:a(e,o,d),significantFigures:d};var p=function(e,r,t,n){var o=void 0===n?{}:n,a=o.reference,u=void 0===a?"auto":a,i=o.referenceMultiplier;return function(){if(!e)throw new Error("rate parameter is mandatory (got "+e+" instead).");if(!r)throw new Error("sourceCurrency parameter is mandatory (got "+r+" instead).");if(!t)throw new Error("targetCurrency parameter is mandatory (got "+t+" instead).");if(i&&"number"!=typeof i)throw new Error("referenceMultiplier must be a number (got "+typeof i+" "+i+" instead)")}(),function(e,r){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(l[r]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(u,r)?{lhsCurrency:t,lhsValue:m(i,t),rhsCurrency:r,rhsValue:m(i,t)/e}:{lhsCurrency:r,lhsValue:m(i,r),rhsCurrency:t,rhsValue:e*m(i,r)}}(e,r,t,{reference:c,referenceMultiplier:f});return h.formats.equation={output:s(p,{significantFigures:d},o),reference:p.lhsCurrency===r?"source":"target",referenceMultiplier:p.lhsValue,calculationInDecimal:a(p.rhsValue,o,d)},h.suggested=p.lhsCurrency===r&&1===p.lhsValue?{format:"decimal",output:h.formats.decimal.output}:{format:"equation",output:h.formats.equation.output},h};
|
|
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/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/formatRate.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","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 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 const isNegative = amount < 0;\n const absoluteAmount = Math.abs(amount);\n\n const formattedAbsoluteAmount = formatNumber(absoluteAmount, locale, availablePrecision);\n\n return isNegative ? `- ${formattedAbsoluteAmount}` : formattedAbsoluteAmount;\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 { 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} 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\nconst formatters: Record<string, Map<any, any>> = {}; // cache, sample: { 'en-GB': Map {{options} => {formatter}} }\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? getFormatter(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n\nfunction getFormatter(locale: string, options?: Intl.DateTimeFormatOptions) {\n if (!formatters[locale]) {\n formatters[locale] = new Map();\n }\n if (!formatters[locale].has(options)) {\n formatters[locale].set(options, new Intl.DateTimeFormat(locale, options));\n }\n return formatters[locale].get(options);\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 function formatPercentage(value: number) {\n return `${parseFloat((value * 100).toFixed(2))}%`;\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\n\nexport default function(\n rate: number,\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return formatNumberToSignificantDigits(rate, locale, significantFigures);\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\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","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","locale","options","cacheKey","Object","entries","Intl","NumberFormat","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","noUnderscoreLocale","replace","e","getValidLocale","undefined","supportedLocalesOf","length","isIntlNumberFormatSupported","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","availablePrecision","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","isNegative","formattedAbsoluteAmount","Math","abs","lhsCurrency","rhsValue","rhsCurrency","significantFigures","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","IDR","RON","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","Map","has","set","get","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","value","timeUnit","parseFloat","rate","now","today","getFullYear","isToday","boundary","isWithinHours","shouldFormatRelative","formatSeconds","differenceInMinutes","formatRelative","formattedDate","formatAbsolute","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","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/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/formatRate.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","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 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 const isNegative = amount < 0;\n const absoluteAmount = Math.abs(amount);\n\n const formattedAbsoluteAmount = formatNumber(absoluteAmount, locale, availablePrecision);\n\n return isNegative ? `- ${formattedAbsoluteAmount}` : formattedAbsoluteAmount;\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 { 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} 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 function formatPercentage(value: number) {\n return `${parseFloat((value * 100).toFixed(2))}%`;\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\n\nexport default function(\n rate: number,\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return formatNumberToSignificantDigits(rate, locale, significantFigures);\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\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","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","locale","options","cacheKey","Object","entries","Intl","NumberFormat","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","noUnderscoreLocale","replace","e","getValidLocale","undefined","supportedLocalesOf","length","isIntlNumberFormatSupported","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","availablePrecision","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","isNegative","formattedAbsoluteAmount","Math","abs","lhsCurrency","rhsValue","rhsCurrency","significantFigures","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","IDR","RON","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","value","timeUnit","parseFloat","rate","now","today","getFullYear","isToday","boundary","isWithinHours","shouldFormatRelative","formatSeconds","differenceInMinutes","formatRelative","formattedDate","formatAbsolute","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e;const{SIGNIFICANT_DIGITS:t,FRACTION_DIGITS:r}={SIGNIFICANT_DIGITS:{TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},FRACTION_DIGITS:{TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20}},n={};function i(e,t){const r=t?`${e}${Object.entries(t)}`:e;return n[r]||(n[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),n[r]}function a(e,r="en-GB",n=6){return o(e,r,n,t.TYPE)}function o(n,a="en-GB",o,u="FractionDigits"){if(!n&&0!==n)return"";"string"==typeof n&&Number(n)&&(n=Number(n));const{MIN_PRECISION:m,MAX_PRECISION:s}=u===t.TYPE?t:r,l=null!=o&&"number"==typeof o&&o>=m&&o<=s,f=function(e){try{const t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}(a);return function(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}(f)?(l?i(f,function(e,t){return{["minimum"+t]:e,["maximum"+t]:e}}(o,u)):i(f)).format(n):l?function(e,r,n){return n===t.TYPE?e.toPrecision(r):e.toFixed(r)}(n,o,u):""+n}const u={BIF:0,BYR:0,CLP:0,DJF:0,GNF: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 m(e,t,r="en-GB",n={alwaysShowDecimals:!1}){const i=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(u,t)?u[t]:2}(t)}(e,t,n.alwaysShowDecimals),a=e<0,m=o(Math.abs(e),r,i);return a?"- "+m:m}function s(e,t,r="en-GB",n={alwaysShowDecimals:!1}){return`${m(e,t,r,n)} ${(t||"").toUpperCase()}`}function l(e,{significantFigures:t=6}={},r="en-GB"){return a(e,r,t)}function f({lhsValue:e,lhsCurrency:t,rhsValue:r,rhsCurrency:n},{significantFigures:i=6}={},o="en-GB"){return`${m(e,t,o)} ${t} = ${a(r,o,i)} ${n}`}var c={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0}};function h(e,t){return e||(c[t]||{}).multiplierForEquation||1}function v(e,t,r,{reference:n="auto",referenceMultiplier:i,significantFigures:o=6}={},u="en-GB"){const m={suggested:{},formats:{}};m.formats.decimal={output:a(e,u,o),significantFigures:o};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!!(c[t]||{}).hasInversionEnabled;throw new Error(`Unrecognized reference config value: ${e} (valid values are auto, source, target).`)}(n,t)?{lhsCurrency:r,lhsValue:h(i,r),rhsCurrency:t,rhsValue:h(i,r)/e}:{lhsCurrency:t,lhsValue:h(i,t),rhsCurrency:r,rhsValue:e*h(i,t)}}(e,t,r,{reference:n,referenceMultiplier:i});return m.formats.equation={output:f(s,{significantFigures:o},u),reference:s.lhsCurrency===t?"source":"target",referenceMultiplier:s.lhsValue,calculationInDecimal:a(s.rhsValue,u,o)},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(e){return parseFloat((100*e).toFixed(2))+"%"}let y;const g={},p=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],I=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],b={};function D(e,t="en-GB",r){return void 0===y&&(y=function(){try{const e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),y?function(e,t){return b[e]||(b[e]=new Map),b[e].has(t)||b[e].set(t,new Intl.DateTimeFormat(e,t)),b[e].get(t)}(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={}){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?I[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=p[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 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":"binnen Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in einer Minute","relative-format-in-hour":"in einer 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":"el {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"dans {hours} heures","relative-format-in-minute":"dans 1 minute","relative-format-in-hour":"dans 1 heure","relative-format-by":"d'ici le {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":"eddig: {formattedDate}"},id:{"relative-format-in-seconds":"dalam 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 {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}"},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:{"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){let n;return n=E(r,e)?w[r][e]:E("en",e)?w.en[e]:e,n&&t&&Object.keys(t).forEach(e=>{n=n.replace(new RegExp(`{${e}}`,"g"),t[e])}),n||e}function E(e,t){return C(w,e)&&C(w[e],t)}function C(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function M(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 O(e-new Date(Date.now()),F.HOUR)<=12}(e)}(e)?function(e,t){const r=e-new Date(Date.now());if(O(r,F.SECOND)<60)return function(e){return N("relative-format-in-seconds",{},e)}(t);const n=O(r,F.MINUTE);return n<60?T(n,t,F.MINUTE):T(O(r,F.HOUR),t,F.HOUR)}(e,t):function(e,t){return N("relative-format-by",{formattedDate:D(e,t,{month:"short",day:"numeric"})},t)}(e,t),r}function O(e,t){return Math.ceil(e/{[F.HOUR]:36e5,[F.MINUTE]:6e4,[F.SECOND]:1e3}[t])}function T(e,t,r){return 1===e?N("relative-format-in-"+r,{},t):N(`relative-format-in-${r}s`,{[r+"s"]:""+e},t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(F||(F={}));export{m as formatAmount,D as formatDate,s as formatMoney,o as formatNumber,a as formatNumberToSignificantDigits,d as formatPercentage,l as formatRate,M as formatRelativeDate,v as getRateInAllFormats};
|
|
1
|
+
let e;const{SIGNIFICANT_DIGITS:t,FRACTION_DIGITS:n}={SIGNIFICANT_DIGITS:{TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},FRACTION_DIGITS:{TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20}},r={};function o(e,t){const n=t?`${e}${Object.entries(t)}`:e;return r[n]||(r[n]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),r[n]}function u(e,n="en-GB",r=6){return a(e,n,r,t.TYPE)}function a(r,u="en-GB",a,i="FractionDigits"){if(!r&&0!==r)return"";"string"==typeof r&&Number(r)&&(r=Number(r));const{MIN_PRECISION:c,MAX_PRECISION:s}=i===t.TYPE?t:n,f=null!=a&&"number"==typeof a&&a>=c&&a<=s,l=function(e){try{const t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}(u);return function(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}(l)?(f?o(l,function(e,t){return{["minimum"+t]:e,["maximum"+t]:e}}(a,i)):o(l)).format(r):f?function(e,n,r){return r===t.TYPE?e.toPrecision(n):e.toFixed(n)}(r,a,i):""+r}const i={BIF:0,BYR:0,CLP:0,DJF:0,GNF: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 c(e,t,n="en-GB",r={alwaysShowDecimals:!1}){const o=function(e,t,n){return function(e){return e%1==0}(e)&&!n?0:function(e=""){const t=e.toUpperCase();return Object.prototype.hasOwnProperty.call(i,t)?i[t]:2}(t)}(e,t,r.alwaysShowDecimals),u=e<0,c=a(Math.abs(e),n,o);return u?"- "+c:c}function s(e,t,n="en-GB",r={alwaysShowDecimals:!1}){return`${c(e,t,n,r)} ${(t||"").toUpperCase()}`}function f(e,{significantFigures:t=6}={},n="en-GB"){return u(e,n,t)}function l({lhsValue:e,lhsCurrency:t,rhsValue:n,rhsCurrency:r},{significantFigures:o=6}={},a="en-GB"){return`${c(e,t,a)} ${t} = ${u(n,a,o)} ${r}`}var m={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0}};function h(e,t){return e||(m[t]||{}).multiplierForEquation||1}function I(e,t,n,{reference:r="auto",referenceMultiplier:o,significantFigures:a=6}={},i="en-GB"){const c={suggested:{},formats:{}};c.formats.decimal={output:u(e,i,a),significantFigures:a};const s=function(e,t,n,{reference:r="auto",referenceMultiplier:o}={}){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(!n)throw new Error(`targetCurrency parameter is mandatory (got ${n} instead).`);if(o&&"number"!=typeof o)throw new Error(`referenceMultiplier must be a number (got ${typeof o} ${o} instead)`)}(),function(e,t){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(m[t]||{}).hasInversionEnabled;throw new Error(`Unrecognized reference config value: ${e} (valid values are auto, source, target).`)}(r,t)?{lhsCurrency:n,lhsValue:h(o,n),rhsCurrency:t,rhsValue:h(o,n)/e}:{lhsCurrency:t,lhsValue:h(o,t),rhsCurrency:n,rhsValue:e*h(o,t)}}(e,t,n,{reference:r,referenceMultiplier:o});return c.formats.equation={output:l(s,{significantFigures:a},i),reference:s.lhsCurrency===t?"source":"target",referenceMultiplier:s.lhsValue,calculationInDecimal:u(s.rhsValue,i,a)},c.suggested=s.lhsCurrency===t&&1===s.lhsValue?{format:"decimal",output:c.formats.decimal.output}:{format:"equation",output:c.formats.equation.output},c}function p(e){return parseFloat((100*e).toFixed(2))+"%"}let g;const d={},y=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],D=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function F(e,t="en-GB",n){return void 0===g&&(g=function(){try{const e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),g?new Intl.DateTimeFormat(function(e){return function(e){return void 0===d[e]&&(d[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),d[e]}(e)?e:"en-GB"}(t),n).format(e):function e(t,n={}){const r="UTC"===n.timeZone,o=[];if(n.day&&o.push(r?t.getUTCDate():t.getDate()),n.month){const e=function(e,t,n){return"short"===e.month?D[t?n.getUTCMonth():n.getMonth()]:(t?n.getUTCMonth():n.getMonth())+1}(n,r,t);!function(e){return"short"===e.month}(n)?o.push(e):o.unshift(e)}n.year&&o.push(t.getUTCFullYear());const u=function(e){return"short"===e.month?" ":"/"}(n);let a=o.join(u);if(n.weekday){const e=y[r?t.getUTCDay():t.getDay()];a=a?`${e}, ${a}`:e}return a||e(t,{timeZone:n.timeZone,day:"true",month:"true",year:"true"})}(e,n)}var N,E={};function w(e,t={},n){let r;return r=C(n,e)?E[n][e]:C("en",e)?E.en[e]:e,r&&t&&Object.keys(t).forEach(e=>{r=r.replace(new RegExp(`{${e}}`,"g"),t[e])}),r||e}function C(e,t){return O(E,e)&&O(E[e],t)}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function b(e,t="en-GB"){if(e<new Date(Date.now()))return"";let n;return n=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 M(e-new Date(Date.now()),N.HOUR)<=12}(e)}(e)?function(e,t){const n=e-new Date(Date.now());if(M(n,N.SECOND)<60)return function(e){return w("relative-format-in-seconds",{},e)}(t);const r=M(n,N.MINUTE);return r<60?T(r,t,N.MINUTE):T(M(n,N.HOUR),t,N.HOUR)}(e,t):function(e,t){return w("relative-format-by",{formattedDate:F(e,t,{month:"short",day:"numeric"})},t)}(e,t),n}function M(e,t){return Math.ceil(e/{[N.HOUR]:36e5,[N.MINUTE]:6e4,[N.SECOND]:1e3}[t])}function T(e,t,n){return 1===e?w("relative-format-in-"+n,{},t):w(`relative-format-in-${n}s`,{[n+"s"]:""+e},t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(N||(N={}));export{c as formatAmount,F as formatDate,s as formatMoney,a as formatNumber,u as formatNumberToSignificantDigits,p as formatPercentage,f as formatRate,b as formatRelativeDate,I 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/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","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 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 const isNegative = amount < 0;\n const absoluteAmount = Math.abs(amount);\n\n const formattedAbsoluteAmount = formatNumber(absoluteAmount, locale, availablePrecision);\n\n return isNegative ? `- ${formattedAbsoluteAmount}` : formattedAbsoluteAmount;\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 { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\n\nexport default function(\n rate: number,\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return formatNumberToSignificantDigits(rate, locale, significantFigures);\n}\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} 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\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","export function formatPercentage(value: number) {\n return `${parseFloat((value * 100).toFixed(2))}%`;\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\nconst formatters: Record<string, Map<any, any>> = {}; // cache, sample: { 'en-GB': Map {{options} => {formatter}} }\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? getFormatter(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n\nfunction getFormatter(locale: string, options?: Intl.DateTimeFormatOptions) {\n if (!formatters[locale]) {\n formatters[locale] = new Map();\n }\n if (!formatters[locale].has(options)) {\n formatters[locale].set(options, new Intl.DateTimeFormat(locale, options));\n }\n return formatters[locale].get(options);\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","SIGNIFICANT_DIGITS","FRACTION_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","formatters","getFormatter","locale","options","cacheKey","Object","entries","Intl","NumberFormat","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","noUnderscoreLocale","replace","e","getValidLocale","undefined","supportedLocalesOf","length","isIntlNumberFormatSupported","[object Object]","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","availablePrecision","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","isNegative","formattedAbsoluteAmount","Math","abs","formatMoney","rate","significantFigures","lhsValue","lhsCurrency","rhsValue","rhsCurrency","BRL","hasInversionEnabled","INR","IDR","RON","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal","formatPercentage","value","parseFloat","intlSupported","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","Map","has","set","get","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/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","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 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 const isNegative = amount < 0;\n const absoluteAmount = Math.abs(amount);\n\n const formattedAbsoluteAmount = formatNumber(absoluteAmount, locale, availablePrecision);\n\n return isNegative ? `- ${formattedAbsoluteAmount}` : formattedAbsoluteAmount;\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 { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\n\nexport default function(\n rate: number,\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return formatNumberToSignificantDigits(rate, locale, significantFigures);\n}\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} 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\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","export function formatPercentage(value: number) {\n return `${parseFloat((value * 100).toFixed(2))}%`;\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","SIGNIFICANT_DIGITS","FRACTION_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","formatters","getFormatter","locale","options","cacheKey","Object","entries","Intl","NumberFormat","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","noUnderscoreLocale","replace","e","getValidLocale","undefined","supportedLocalesOf","length","isIntlNumberFormatSupported","[object Object]","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","availablePrecision","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","isNegative","formattedAbsoluteAmount","Math","abs","formatMoney","rate","significantFigures","lhsValue","lhsCurrency","rhsValue","rhsCurrency","BRL","hasInversionEnabled","INR","IDR","RON","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal","formatPercentage","value","parseFloat","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,t={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},r={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},n={};function i(e,t){var r=t?""+e+Object.entries(t):e;return n[r]||(n[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),n[r]}function a(e,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n=6),o(e,r,n,t.TYPE)}function o(n,a,o,u){if(void 0===a&&(a="en-GB"),void 0===u&&(u="FractionDigits"),!n&&0!==n)return"";"string"==typeof n&&Number(n)&&(n=Number(n));var m=u===t.TYPE?t:r,s=null!=o&&"number"==typeof o&&o>=m.MIN_PRECISION&&o<=m.MAX_PRECISION,f=function(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}(a);return function(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}(f)?(s?i(f,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(o,u)):i(f)).format(n):s?function(e,r,n){return n===t.TYPE?e.toPrecision(r):e.toFixed(r)}(n,o,u):""+n}var u={BIF:0,BYR:0,CLP:0,DJF:0,GNF: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 m(e,t,r,n){void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1});var i=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(u,t)?u[t]:2}(t)}(e,t,n.alwaysShowDecimals),a=e<0,m=o(Math.abs(e),r,i);return a?"- "+m:m}function s(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),m(e,t,r,n)+" "+(t||"").toUpperCase()}function f(e,t,r){var n=(void 0===t?{}:t).significantFigures;return void 0===r&&(r="en-GB"),a(e,r,void 0===n?6:n)}function l(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,o=e.rhsCurrency,u=(void 0===t?{}:t).significantFigures,s=void 0===u?6:u;return void 0===r&&(r="en-GB"),m(e.lhsValue,n,r)+" "+n+" = "+a(i,r,s)+" "+o}var v,c={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0}};function d(e,t){return e||(c[t]||{}).multiplierForEquation||1}function h(e,t,r,n,i){var o=void 0===n?{}:n,u=o.reference,m=void 0===u?"auto":u,s=o.referenceMultiplier,f=o.significantFigures,v=void 0===f?6:f;void 0===i&&(i="en-GB");var h={suggested:{},formats:{}};h.formats.decimal={output:a(e,i,v),significantFigures:v};var y=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!!(c[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:d(u,r),rhsCurrency:t,rhsValue:d(u,r)/e}:{lhsCurrency:t,lhsValue:d(u,t),rhsCurrency:r,rhsValue:e*d(u,t)}}(e,t,r,{reference:m,referenceMultiplier:s});return h.formats.equation={output:l(y,{significantFigures:v},i),reference:y.lhsCurrency===t?"source":"target",referenceMultiplier:y.lhsValue,calculationInDecimal:a(y.rhsValue,i,v)},h.suggested=y.lhsCurrency===t&&1===y.lhsValue?{format:"decimal",output:h.formats.decimal.output}:{format:"equation",output:h.formats.equation.output},h}function y(e){return parseFloat((100*e).toFixed(2))+"%"}var g={},p=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],b=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],D={};function I(e,t,r){return void 0===t&&(t="en-GB"),void 0===v&&(v=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),v?function(e,t){return D[e]||(D[e]=new Map),D[e].has(t)||D[e].set(t,new Intl.DateTimeFormat(e,t)),D[e].get(t)}(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?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=p[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 w,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":"binnen Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in einer Minute","relative-format-in-hour":"in einer 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":"el {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"dans {hours} heures","relative-format-in-minute":"dans 1 minute","relative-format-in-hour":"dans 1 heure","relative-format-by":"d'ici le {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":"eddig: {formattedDate}"},id:{"relative-format-in-seconds":"dalam 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 {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}"},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:{"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 E(e,t,r){var n;return void 0===t&&(t={}),(n=M(r,e)?F[r][e]:M("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 M(e,t){return N(F,e)&&N(F[e],t)}function N(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function O(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()),w.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(C(r,w.SECOND)<60)return function(e){return E("relative-format-in-seconds",{},e)}(t);var n=C(r,w.MINUTE);return n<60?U(n,t,w.MINUTE):U(C(r,w.HOUR),t,w.HOUR)}(e,t):function(e,t){return E("relative-format-by",{formattedDate:I(e,t,{month:"short",day:"numeric"})},t)}(e,t)}function C(e,t){var r,n=((r={})[w.HOUR]=36e5,r[w.MINUTE]=6e4,r[w.SECOND]=1e3,r);return Math.ceil(e/n[t])}function U(e,t,r){var n;return 1===e?E("relative-format-in-"+r,{},t):E("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(w||(w={}));export{m as formatAmount,I as formatDate,s as formatMoney,o as formatNumber,a as formatNumberToSignificantDigits,y as formatPercentage,f as formatRate,O as formatRelativeDate,h as getRateInAllFormats};
|
|
1
|
+
var e,r={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},t={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},n={};function o(e,r){var t=r?""+e+Object.entries(r):e;return n[t]||(n[t]=r?new Intl.NumberFormat(e,r):new Intl.NumberFormat(e)),n[t]}function a(e,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n=6),u(e,t,n,r.TYPE)}function u(n,a,u,i){if(void 0===a&&(a="en-GB"),void 0===i&&(i="FractionDigits"),!n&&0!==n)return"";"string"==typeof n&&Number(n)&&(n=Number(n));var c=i===r.TYPE?r:t,s=null!=u&&"number"==typeof u&&u>=c.MIN_PRECISION&&u<=c.MAX_PRECISION,f=function(e){try{var r=e.replace(/_/,"-");return Intl.NumberFormat(r),r}catch(e){return"en-GB"}}(a);return function(r){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(r).length),e}(f)?(s?o(f,function(e,r){var t;return(t={})["minimum"+r]=e,t["maximum"+r]=e,t}(u,i)):o(f)).format(n):s?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(n,u,i):""+n}var i={BIF:0,BYR:0,CLP:0,DJF:0,GNF: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 c(e,r,t,n){void 0===t&&(t="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1});var o=function(e,r,t){return function(e){return e%1==0}(e)&&!t?0:function(e){void 0===e&&(e="");var r=e.toUpperCase();return Object.prototype.hasOwnProperty.call(i,r)?i[r]:2}(r)}(e,r,n.alwaysShowDecimals),a=e<0,c=u(Math.abs(e),t,o);return a?"- "+c:c}function s(e,r,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),c(e,r,t,n)+" "+(r||"").toUpperCase()}function f(e,r,t){var n=(void 0===r?{}:r).significantFigures;return void 0===t&&(t="en-GB"),a(e,t,void 0===n?6:n)}function l(e,r,t){var n=e.lhsCurrency,o=e.rhsValue,u=e.rhsCurrency,i=(void 0===r?{}:r).significantFigures,s=void 0===i?6:i;return void 0===t&&(t="en-GB"),c(e.lhsValue,n,t)+" "+n+" = "+a(o,t,s)+" "+u}var m,v={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0}};function d(e,r){return e||(v[r]||{}).multiplierForEquation||1}function h(e,r,t,n,o){var u=void 0===n?{}:n,i=u.reference,c=void 0===i?"auto":i,s=u.referenceMultiplier,f=u.significantFigures,m=void 0===f?6:f;void 0===o&&(o="en-GB");var h={suggested:{},formats:{}};h.formats.decimal={output:a(e,o,m),significantFigures:m};var p=function(e,r,t,n){var o=void 0===n?{}:n,a=o.reference,u=void 0===a?"auto":a,i=o.referenceMultiplier;return function(){if(!e)throw new Error("rate parameter is mandatory (got "+e+" instead).");if(!r)throw new Error("sourceCurrency parameter is mandatory (got "+r+" instead).");if(!t)throw new Error("targetCurrency parameter is mandatory (got "+t+" instead).");if(i&&"number"!=typeof i)throw new Error("referenceMultiplier must be a number (got "+typeof i+" "+i+" instead)")}(),function(e,r){if("source"===e)return!1;if("target"===e)return!0;if(["auto",void 0,null].indexOf(e)>-1)return!!(v[r]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(u,r)?{lhsCurrency:t,lhsValue:d(i,t),rhsCurrency:r,rhsValue:d(i,t)/e}:{lhsCurrency:r,lhsValue:d(i,r),rhsCurrency:t,rhsValue:e*d(i,r)}}(e,r,t,{reference:c,referenceMultiplier:s});return h.formats.equation={output:l(p,{significantFigures:m},o),reference:p.lhsCurrency===r?"source":"target",referenceMultiplier:p.lhsValue,calculationInDecimal:a(p.rhsValue,o,m)},h.suggested=p.lhsCurrency===r&&1===p.lhsValue?{format:"decimal",output:h.formats.decimal.output}:{format:"equation",output:h.formats.equation.output},h}function p(e){return parseFloat((100*e).toFixed(2))+"%"}var g={},I=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],y=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function D(e,r,t){return void 0===r&&(r="en-GB"),void 0===m&&(m=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),m?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"}(r),t).format(e):function e(r,t){void 0===t&&(t={});var n="UTC"===t.timeZone,o=[];if(t.day&&o.push(n?r.getUTCDate():r.getDate()),t.month){var a=function(e,r,t){return"short"===e.month?y[r?t.getUTCMonth():t.getMonth()]:(r?t.getUTCMonth():t.getMonth())+1}(t,n,r);!function(e){return"short"===e.month}(t)?o.push(a):o.unshift(a)}t.year&&o.push(r.getUTCFullYear());var u=function(e){return"short"===e.month?" ":"/"}(t),i=o.join(u);if(t.weekday){var c=I[n?r.getUTCDay():r.getDay()];i=i?c+", "+i:c}return i||e(r,{timeZone:t.timeZone,day:"true",month:"true",year:"true"})}(e,t)}var F,E={};function w(e,r,t){var n;return void 0===r&&(r={}),(n=N(t,e)?E[t][e]:N("en",e)?E.en[e]:e)&&r&&Object.keys(r).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),r[e])}),n||e}function N(e,r){return O(E,e)&&O(E[e],r)}function O(e,r){return Object.prototype.hasOwnProperty.call(e,r)}function b(e,r){return void 0===r&&(r="en-GB"),e<new Date(Date.now())?"":function(e){return function(e){var r=new Date(Date.now());return e.getDate()===r.getDate()&&e.getMonth()===r.getMonth()&&e.getFullYear()===r.getFullYear()}(e)&&function(e,r){return M(e-new Date(Date.now()),F.HOUR)<=12}(e)}(e)?function(e,r){var t=e-new Date(Date.now());if(M(t,F.SECOND)<60)return function(e){return w("relative-format-in-seconds",{},e)}(r);var n=M(t,F.MINUTE);return n<60?C(n,r,F.MINUTE):C(M(t,F.HOUR),r,F.HOUR)}(e,r):function(e,r){return w("relative-format-by",{formattedDate:D(e,r,{month:"short",day:"numeric"})},r)}(e,r)}function M(e,r){var t,n=((t={})[F.HOUR]=36e5,t[F.MINUTE]=6e4,t[F.SECOND]=1e3,t);return Math.ceil(e/n[r])}function C(e,r,t){var n;return 1===e?w("relative-format-in-"+t,{},r):w("relative-format-in-"+t+"s",((n={})[t+"s"]=""+e,n),r)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(F||(F={}));export{c as formatAmount,D as formatDate,s as formatMoney,u as formatNumber,a as formatNumberToSignificantDigits,p as formatPercentage,f as formatRate,b as formatRelativeDate,h 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/date/support-detection/intl.ts","../src/rate/getRateEquation.ts","../src/rate/getRateInAllFormats.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","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 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 const isNegative = amount < 0;\n const absoluteAmount = Math.abs(amount);\n\n const formattedAbsoluteAmount = formatNumber(absoluteAmount, locale, availablePrecision);\n\n return isNegative ? `- ${formattedAbsoluteAmount}` : formattedAbsoluteAmount;\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 { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\n\nexport default function(\n rate: number,\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return formatNumberToSignificantDigits(rate, locale, significantFigures);\n}\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} 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","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\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","export function formatPercentage(value: number) {\n return `${parseFloat((value * 100).toFixed(2))}%`;\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\nconst formatters: Record<string, Map<any, any>> = {}; // cache, sample: { 'en-GB': Map {{options} => {formatter}} }\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? getFormatter(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n\nfunction getFormatter(locale: string, options?: Intl.DateTimeFormatOptions) {\n if (!formatters[locale]) {\n formatters[locale] = new Map();\n }\n if (!formatters[locale].has(options)) {\n formatters[locale].set(options, new Intl.DateTimeFormat(locale, options));\n }\n return formatters[locale].get(options);\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","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","locale","options","cacheKey","Object","entries","Intl","NumberFormat","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","noUnderscoreLocale","replace","e","getValidLocale","undefined","supportedLocalesOf","length","isIntlNumberFormatSupported","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","availablePrecision","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","isNegative","formattedAbsoluteAmount","Math","abs","formatMoney","rate","significantFigures","lhsCurrency","rhsValue","rhsCurrency","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","IDR","RON","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal","formatPercentage","value","parseFloat","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","Map","has","set","get","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/date/support-detection/intl.ts","../src/rate/getRateEquation.ts","../src/rate/getRateInAllFormats.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","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 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 const isNegative = amount < 0;\n const absoluteAmount = Math.abs(amount);\n\n const formattedAbsoluteAmount = formatNumber(absoluteAmount, locale, availablePrecision);\n\n return isNegative ? `- ${formattedAbsoluteAmount}` : formattedAbsoluteAmount;\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 { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\n\nexport default function(\n rate: number,\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return formatNumberToSignificantDigits(rate, locale, significantFigures);\n}\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} 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","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\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","export function formatPercentage(value: number) {\n return `${parseFloat((value * 100).toFixed(2))}%`;\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","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","locale","options","cacheKey","Object","entries","Intl","NumberFormat","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","noUnderscoreLocale","replace","e","getValidLocale","undefined","supportedLocalesOf","length","isIntlNumberFormatSupported","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","availablePrecision","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","isNegative","formattedAbsoluteAmount","Math","abs","formatMoney","rate","significantFigures","lhsCurrency","rhsValue","rhsCurrency","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","IDR","RON","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal","formatPercentage","value","parseFloat","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,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,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n=6),u(e,t,n,r.TYPE)}function u(e,i,o,u){if(void 0===i&&(i="en-GB"),void 0===u&&(u="FractionDigits"),!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));var m=u===r.TYPE?r:n,s=null!=o&&"number"==typeof o&&o>=m.MIN_PRECISION&&o<=m.MAX_PRECISION,f=function(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}(i);return function(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}(f)?(s?a(f,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(o,u)):a(f)).format(e):s?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(e,o,u):""+e}var m={BIF:0,BYR:0,CLP:0,DJF:0,GNF: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 s(e,t,r,n){void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1});var i=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(m,t)?m[t]:2}(t)}(e,t,n.alwaysShowDecimals),a=e<0,o=u(Math.abs(e),r,i);return a?"- "+o:o}function f(e,t,r){var n=e.lhsCurrency,i=e.rhsValue,a=e.rhsCurrency,u=(void 0===t?{}:t).significantFigures,m=void 0===u?6:u;return void 0===r&&(r="en-GB"),s(e.lhsValue,n,r)+" "+n+" = "+o(i,r,m)+" "+a}var l,v={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0}};function c(e,t){return e||(v[t]||{}).multiplierForEquation||1}var d={},h=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],y=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g={};function p(e,t,r){return void 0===t&&(t="en-GB"),void 0===l&&(l=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),l?function(e,t){return g[e]||(g[e]=new Map),g[e].has(t)||g[e].set(t,new Intl.DateTimeFormat(e,t)),g[e].get(t)}(function(e){return function(e){return void 0===d[e]&&(d[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),d[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?y[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=h[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 b,D={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":"binnen Sekunden","relative-format-in-minutes":"in {minutes} Minuten","relative-format-in-hours":"in {hours} Stunden","relative-format-in-minute":"in einer Minute","relative-format-in-hour":"in einer 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":"el {formattedDate}"},fr:{"relative-format-in-seconds":"en quelques secondes","relative-format-in-minutes":"dans {minutes} minutes","relative-format-in-hours":"dans {hours} heures","relative-format-in-minute":"dans 1 minute","relative-format-in-hour":"dans 1 heure","relative-format-by":"d'ici le {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":"eddig: {formattedDate}"},id:{"relative-format-in-seconds":"dalam 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 {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}"},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:{"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 I(e,t,r){var n;return void 0===t&&(t={}),(n=w(r,e)?D[r][e]:w("en",e)?D.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function w(e,t){return F(D,e)&&F(D[e],t)}function F(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function E(e,t){var r,n=((r={})[b.HOUR]=36e5,r[b.MINUTE]=6e4,r[b.SECOND]=1e3,r);return Math.ceil(e/n[t])}function N(e,t,r){var n;return 1===e?I("relative-format-in-"+r,{},t):I("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(b||(b={})),e.formatAmount=s,e.formatDate=p,e.formatMoney=function(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),s(e,t,r,n)+" "+(t||"").toUpperCase()},e.formatNumber=u,e.formatNumberToSignificantDigits=o,e.formatPercentage=function(e){return parseFloat((100*e).toFixed(2))+"%"},e.formatRate=function(e,t,r){var n=(void 0===t?{}:t).significantFigures;return void 0===r&&(r="en-GB"),o(e,r,void 0===n?6:n)},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 E(e-new Date(Date.now()),b.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(E(r,b.SECOND)<60)return function(e){return I("relative-format-in-seconds",{},e)}(t);var n=E(r,b.MINUTE);return n<60?N(n,t,b.MINUTE):N(E(r,b.HOUR),t,b.HOUR)}(e,t):function(e,t){return I("relative-format-by",{formattedDate:p(e,t,{month:"short",day:"numeric"})},t)}(e,t)},e.getRateInAllFormats=function(e,t,r,n,i){var a=void 0===n?{}:n,u=a.reference,m=void 0===u?"auto":u,s=a.referenceMultiplier,l=a.significantFigures,d=void 0===l?6:l;void 0===i&&(i="en-GB");var h={suggested:{},formats:{}};h.formats.decimal={output:o(e,i,d),significantFigures:d};var y=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!!(v[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(o,t)?{lhsCurrency:r,lhsValue:c(u,r),rhsCurrency:t,rhsValue:c(u,r)/e}:{lhsCurrency:t,lhsValue:c(u,t),rhsCurrency:r,rhsValue:e*c(u,t)}}(e,t,r,{reference:m,referenceMultiplier:s});return h.formats.equation={output:f(y,{significantFigures:d},i),reference:y.lhsCurrency===t?"source":"target",referenceMultiplier:y.lhsValue,calculationInDecimal:o(y.rhsValue,i,d)},h.suggested=y.lhsCurrency===t&&1===y.lhsValue?{format:"decimal",output:h.formats.decimal.output}:{format:"equation",output:h.formats.equation.output},h}});
|
|
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,r={TYPE:"SignificantDigits",MIN_PRECISION:1,MAX_PRECISION:21},n={TYPE:"FractionDigits",MIN_PRECISION:0,MAX_PRECISION:20},o={};function a(e,t){var r=t?""+e+Object.entries(t):e;return o[r]||(o[r]=t?new Intl.NumberFormat(e,t):new Intl.NumberFormat(e)),o[r]}function i(e,t,n){return void 0===t&&(t="en-GB"),void 0===n&&(n=6),u(e,t,n,r.TYPE)}function u(e,o,i,u){if(void 0===o&&(o="en-GB"),void 0===u&&(u="FractionDigits"),!e&&0!==e)return"";"string"==typeof e&&Number(e)&&(e=Number(e));var f=u===r.TYPE?r:n,c=null!=i&&"number"==typeof i&&i>=f.MIN_PRECISION&&i<=f.MAX_PRECISION,s=function(e){try{var t=e.replace(/_/,"-");return Intl.NumberFormat(t),t}catch(e){return"en-GB"}}(o);return function(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}(s)?(c?a(s,function(e,t){var r;return(r={})["minimum"+t]=e,r["maximum"+t]=e,r}(i,u)):a(s)).format(e):c?function(e,t,n){return n===r.TYPE?e.toPrecision(t):e.toFixed(t)}(e,i,u):""+e}var f={BIF:0,BYR:0,CLP:0,DJF:0,GNF: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 c(e,t,r,n){void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1});var o=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(f,t)?f[t]:2}(t)}(e,t,n.alwaysShowDecimals),a=e<0,i=u(Math.abs(e),r,o);return a?"- "+i:i}function s(e,t,r){var n=e.lhsCurrency,o=e.rhsValue,a=e.rhsCurrency,u=(void 0===t?{}:t).significantFigures,f=void 0===u?6:u;return void 0===r&&(r="en-GB"),c(e.lhsValue,n,r)+" "+n+" = "+i(o,r,f)+" "+a}var l,m={BRL:{hasInversionEnabled:!0},INR:{hasInversionEnabled:!0},JPY:{hasInversionEnabled:!0},IDR:{hasInversionEnabled:!0},HUF:{hasInversionEnabled:!0},RON:{hasInversionEnabled:!0}};function v(e,t){return e||(m[t]||{}).multiplierForEquation||1}var d={},h=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],p=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function g(e,t,r){return void 0===t&&(t="en-GB"),void 0===l&&(l=function(){try{var e=new Date(2018,11,1);return"01/12/2018"===new Intl.DateTimeFormat("en-GB").format(e)}catch(e){return!1}}()),l?new Intl.DateTimeFormat(function(e){return function(e){return void 0===d[e]&&(d[e]=function(e){try{return Intl.DateTimeFormat.supportedLocalesOf([e]).length>0}catch(e){return!1}}(e)),d[e]}(e)?e:"en-GB"}(t),r).format(e):function e(t,r){void 0===r&&(r={});var n="UTC"===r.timeZone,o=[];if(r.day&&o.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)?o.push(a):o.unshift(a)}r.year&&o.push(t.getUTCFullYear());var i=function(e){return"short"===e.month?" ":"/"}(r),u=o.join(i);if(r.weekday){var f=h[n?t.getUTCDay():t.getDay()];u=u?f+", "+u:f}return u||e(t,{timeZone:r.timeZone,day:"true",month:"true",year:"true"})}(e,r)}var y,I={};function D(e,t,r){var n;return void 0===t&&(t={}),(n=F(r,e)?I[r][e]:F("en",e)?I.en[e]:e)&&t&&Object.keys(t).forEach(function(e){n=n.replace(new RegExp("{"+e+"}","g"),t[e])}),n||e}function F(e,t){return E(I,e)&&E(I[e],t)}function E(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function N(e,t){var r,n=((r={})[y.HOUR]=36e5,r[y.MINUTE]=6e4,r[y.SECOND]=1e3,r);return Math.ceil(e/n[t])}function w(e,t,r){var n;return 1===e?D("relative-format-in-"+r,{},t):D("relative-format-in-"+r+"s",((n={})[r+"s"]=""+e,n),t)}!function(e){e.SECOND="second",e.MINUTE="minute",e.HOUR="hour"}(y||(y={})),e.formatAmount=c,e.formatDate=g,e.formatMoney=function(e,t,r,n){return void 0===r&&(r="en-GB"),void 0===n&&(n={alwaysShowDecimals:!1}),c(e,t,r,n)+" "+(t||"").toUpperCase()},e.formatNumber=u,e.formatNumberToSignificantDigits=i,e.formatPercentage=function(e){return parseFloat((100*e).toFixed(2))+"%"},e.formatRate=function(e,t,r){var n=(void 0===t?{}:t).significantFigures;return void 0===r&&(r="en-GB"),i(e,r,void 0===n?6:n)},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 N(e-new Date(Date.now()),y.HOUR)<=12}(e)}(e)?function(e,t){var r=e-new Date(Date.now());if(N(r,y.SECOND)<60)return function(e){return D("relative-format-in-seconds",{},e)}(t);var n=N(r,y.MINUTE);return n<60?w(n,t,y.MINUTE):w(N(r,y.HOUR),t,y.HOUR)}(e,t):function(e,t){return D("relative-format-by",{formattedDate:g(e,t,{month:"short",day:"numeric"})},t)}(e,t)},e.getRateInAllFormats=function(e,t,r,n,o){var a=void 0===n?{}:n,u=a.reference,f=void 0===u?"auto":u,c=a.referenceMultiplier,l=a.significantFigures,d=void 0===l?6:l;void 0===o&&(o="en-GB");var h={suggested:{},formats:{}};h.formats.decimal={output:i(e,o,d),significantFigures:d};var p=function(e,t,r,n){var o=void 0===n?{}:n,a=o.reference,i=void 0===a?"auto":a,u=o.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!!(m[t]||{}).hasInversionEnabled;throw new Error("Unrecognized reference config value: "+e+" (valid values are auto, source, target).")}(i,t)?{lhsCurrency:r,lhsValue:v(u,r),rhsCurrency:t,rhsValue:v(u,r)/e}:{lhsCurrency:t,lhsValue:v(u,t),rhsCurrency:r,rhsValue:e*v(u,t)}}(e,t,r,{reference:f,referenceMultiplier:c});return h.formats.equation={output:s(p,{significantFigures:d},o),reference:p.lhsCurrency===t?"source":"target",referenceMultiplier:p.lhsValue,calculationInDecimal:i(p.rhsValue,o,d)},h.suggested=p.lhsCurrency===t&&1===p.lhsValue?{format:"decimal",output:h.formats.decimal.output}:{format:"equation",output:h.formats.equation.output},h}});
|
|
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/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/rate/formatRate.ts","../src/date/isToday.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","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 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 const isNegative = amount < 0;\n const absoluteAmount = Math.abs(amount);\n\n const formattedAbsoluteAmount = formatNumber(absoluteAmount, locale, availablePrecision);\n\n return isNegative ? `- ${formattedAbsoluteAmount}` : formattedAbsoluteAmount;\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 { 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} 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\nconst formatters: Record<string, Map<any, any>> = {}; // cache, sample: { 'en-GB': Map {{options} => {formatter}} }\n\nexport function formatDate(\n date: Date,\n locale = DEFAULT_LOCALE,\n options?: Intl.DateTimeFormatOptions,\n): string {\n return isIntlSupported()\n ? getFormatter(getSupportedLocale(locale), options).format(date)\n : getFallbackFormat(date, options);\n}\n\nfunction getSupportedLocale(locale: string) {\n return isSelectedLocaleSupported(locale) ? locale : DEFAULT_LOCALE;\n}\n\nfunction getFormatter(locale: string, options?: Intl.DateTimeFormatOptions) {\n if (!formatters[locale]) {\n formatters[locale] = new Map();\n }\n if (!formatters[locale].has(options)) {\n formatters[locale].set(options, new Intl.DateTimeFormat(locale, options));\n }\n return formatters[locale].get(options);\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 function formatPercentage(value: number) {\n return `${parseFloat((value * 100).toFixed(2))}%`;\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\n\nexport default function(\n rate: number,\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return formatNumberToSignificantDigits(rate, locale, significantFigures);\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 { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\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","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","locale","options","cacheKey","Object","entries","Intl","NumberFormat","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","noUnderscoreLocale","replace","e","getValidLocale","undefined","supportedLocalesOf","length","isIntlNumberFormatSupported","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","availablePrecision","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","isNegative","formattedAbsoluteAmount","Math","abs","lhsCurrency","rhsValue","rhsCurrency","significantFigures","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","IDR","RON","getMultiplier","referenceMultiplierOverride","config","multiplierForEquation","supportedLocales","WEEKDAYS","SHORT_MONTHS","formatDate","date","Date","DateTimeFormat","intlDateTimeFormatReturnsCorrectValue","Map","has","set","get","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","value","timeUnit","parseFloat","rate","now","today","getFullYear","isToday","boundary","isWithinHours","shouldFormatRelative","formatSeconds","differenceInMinutes","formatRelative","formattedDate","formatAbsolute","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal"],"mappings":"8LAAIA,ECQIC,ECHc,CAClBC,KAAM,oBACNC,cAAe,EACfC,cAAe,IDASC,ECET,CACfH,KAAM,iBACNC,cAAe,EACfC,cAAe,IDHbE,EAAkC,GAQxC,SAASC,EAAaC,EAAgBC,GACpC,IAAMC,EAAWD,KAAaD,EAASG,OAAOC,QAAQH,GAAaD,EAMnE,OALKF,EAAWI,KACdJ,EAAWI,GAAYD,EACnB,IAAII,KAAKC,aAAaN,EAAQC,GAC9B,IAAII,KAAKC,aAAaN,IAErBF,EAAWI,GAuDpB,SAAgBK,EACdC,EACAR,EACAS,GAEA,gBAHAT,IAAAA,EClF4B,kBDmF5BS,IAAAA,ECjF+C,GDmFxCC,EAAaF,EAAQR,EAAQS,EAAmBhB,EAAmBC,eAY5DgB,EACdF,EACAR,EACAW,EACAC,GAEA,YAJAZ,IAAAA,ECnG4B,kBDqG5BY,IAAAA,EAA+B,mBAE1BJ,GAAqB,IAAXA,EACb,MAAO,GAGa,iBAAXA,GAAuBK,OAAOL,KAEvCA,EAASK,OAAOL,UAIhBI,IAAkBnB,EAAmBC,KAAOD,EAAqBI,EAI7DiB,EACJH,MAAAA,GAEqB,iBAAdA,GACPA,KATMhB,eAUNgB,KAVqBf,cAYjBmB,EA9ER,SAAwBf,GACtB,IACE,IAAMgB,EAAqBhB,EAAOiB,QAAQ,IAAK,KAG/C,OADAZ,KAAKC,aAAaU,GACXA,EACP,MAAOE,GACP,MCrD0B,SD4HJC,CAAenB,GAEvC,ODvHF,SAA4CA,GAW1C,YAVoBoB,IAAhB5B,IACFA,EACkB,iBAATa,WACEe,IAATf,MAC6B,mBAAtBA,KAAKC,cACZD,KAAKC,cAC2C,mBAAzCD,KAAKC,aAAae,oBACzBhB,KAAKC,aAAae,oBACsC,IAAxDhB,KAAKC,aAAae,mBAAmBrB,GAAQsB,QAE1C9B,EC4GF+B,CAA4BR,IAMfD,EACdf,EAAagB,EAnGnB,SAA6BJ,EAAmBC,SAC9C,uBACaA,GAAkBD,cAClBC,GAAkBD,IAgGGa,CAAoBb,EAAYC,IAC9Db,EAAagB,IAEAU,OAAOjB,GATfM,EA7DX,SAAkCN,EAAgBG,EAAmBC,GACnE,OAAOA,IAAkBnB,EAAmBC,KACxCc,EAAOkB,YAAYf,GACnBH,EAAOmB,QAAQhB,GA2DbiB,CAAyBpB,EAAQG,EAAYC,MAC1CJ,EE9HX,IAAMqB,EAAmB,CACvBC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EAGLC,IAAK,EACLC,IAAK,EAELC,IAAK,EAELC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,GAyBP,SAAgBC,EACdC,EACAC,EACAxD,EACAC,YADAD,IAAAA,ED3D4B,kBC4D5BC,IAAAA,EAAU,CAAEwD,oBAAoB,IAEhC,IAAMC,EAdR,SAAsBH,EAAgBC,EAAsBC,GAC1D,OALF,SAA6BF,GAC3B,OAAOA,EAAS,GAAM,EAIlBI,CAAoBJ,KAAYE,IAbtC,SAA6BG,YAAAA,IAAAA,EAAW,IACtC,IAAMC,EAAoBD,EAASE,cACnC,OAAI3D,OAAO4D,UAAUC,eAAeC,KAAKpC,EAAkBgC,GAClDhC,EAAiBgC,GALM,EAmBzBK,CAAoBV,GASAW,CAAaZ,EAAQC,EAAcvD,EAAQwD,oBAChEW,EAAab,EAAS,EAGtBc,EAA0B3D,EAFT4D,KAAKC,IAAIhB,GAE6BvD,EAAQ0D,GAErE,OAAOU,OAAkBC,EAA4BA,iBCxDrDrE,OALEwE,IAAAA,YACAC,IAAAA,SACAC,IAAAA,0BAE2D,MAA3DC,mBAAAA,aFT6C,IEY/C,gBAFA3E,IAAAA,EFZ4B,SEclBsD,IARRsB,SAUAJ,EACAxE,OACGwE,QAAiBjE,EACpBkE,EACAzE,EACA2E,OACGD,MCpBHG,ICFW,CACbC,IAAK,CACHC,qBAAqB,GAEvBC,IAAK,CACHD,qBAAqB,GAEvB5C,IAAK,CACH4C,qBAAqB,GAEvBE,IAAK,CACHF,qBAAqB,GAEvBjC,IAAK,CACHiC,qBAAqB,GAEvBG,IAAK,CACHH,qBAAqB,ICyCzB,SAASI,EACPC,EACAZ,GAEA,OACEY,IACCC,EAAOb,IAAgB,IAAIc,uBL7DO,EMHvC,IAAMC,EAA4C,GCA5CC,EAAW,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACtDC,EAAe,CACnB,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OCTI3F,EAA4C,YAElC4F,EACdC,EACA3F,EACAC,GAEA,gBAHAD,IAAAA,ERR4B,cGKNoB,IAAlByD,IACFA,EAKJ,WACE,IACE,IAAMc,EAAO,IAAIC,KAAK,KAAM,GAAI,GAEhC,MAAsB,eADH,IAAIvF,KAAKwF,eHdF,SGciCpE,OAAOkE,GAElE,MAAOzE,GACP,UAXgB4E,IAEXjB,EKYT,SAAsB7E,EAAgBC,GAOpC,OANKH,EAAWE,KACdF,EAAWE,GAAU,IAAI+F,KAEtBjG,EAAWE,GAAQgG,IAAI/F,IAC1BH,EAAWE,GAAQiG,IAAIhG,EAAS,IAAII,KAAKwF,eAAe7F,EAAQC,IAE3DH,EAAWE,GAAQkG,IAAIjG,GAf1BF,CAIN,SAA4BC,GAC1B,OFfF,SAA0CA,GAIxC,YAHiCoB,IAA7BmE,EAAiBvF,KACnBuF,EAAiBvF,GAKrB,SAA+BA,GAC7B,IACE,OAAOK,KAAKwF,eAAexE,mBAAmB,CAACrB,IAASsB,OAAS,EACjE,MAAOJ,GACP,UAT2BiF,CAAsBnG,IAE5CuF,EAAiBvF,GEWjBoG,CAA0BpG,GAAUA,ERjBf,QQYXqG,CAAmBrG,GAASC,GAASwB,OAAOkE,YDwB/CW,EAAkBX,EAAY1F,YAAAA,IAAAA,EAAsC,IAClF,IAAMsG,EAA6B,QAArBtG,EAAQuG,SAEhBC,EAAY,GAElB,GADIxG,EAAQyG,KAAKD,EAAUE,KAAKJ,EAAQZ,EAAKiB,aAAejB,EAAKkB,WAC7D5G,EAAQ6G,MAAO,CACjB,IAAMC,EAlBV,SACE9G,EACAsG,EACAZ,GAEA,MAAsB,UAAlB1F,EAAQ6G,MACHrB,EAAac,EAAQZ,EAAKqB,cAAgBrB,EAAKsB,aAEhDV,EAAQZ,EAAKqB,cAAgBrB,EAAKsB,YAAc,EAUlCC,CAAkBjH,EAASsG,EAAOZ,IAtB1D,SAAsB1F,GACpB,MAAyB,UAAlBA,EAAQ6G,MAsBTK,CAAalH,GAGfwG,EAAUE,KAAKI,GAFfN,EAAUW,QAAQL,GAKlB9G,EAAQoH,MAAMZ,EAAUE,KAAahB,EAAK2B,kBAE9C,IAAMC,EAnCR,SAA6BtH,GAC3B,MAAyB,UAAlBA,EAAQ6G,MAAoB,IAAM,IAkChBU,CAAoBvH,GACzCwH,EAAehB,EAAUiB,KAAKH,GAElC,GAAItH,EAAQ0H,QAAS,CACnB,IAAMC,EAAUpC,EAASe,EAAQZ,EAAKkC,YAAclC,EAAKmC,UACzDL,EAAeA,EAAkBG,OAAYH,EAAiBG,EAEhE,OACEH,GACAnB,EAAkBX,EAAM,CACtBa,SAAUvG,EAAQuG,SAClBE,IAAK,OACLI,MAAO,OACPO,KAAM,SCnDNf,CAAkBX,EAAM1F,OCiEzB8H,s1IC3EWC,EACdC,EACAC,EACAlI,GAEA,IAAImI,EAoBJ,gBAvBAD,IAAAA,EAAiC,KAK/BC,EADEC,EAAepI,EAAQiI,GACJI,EAAwDrI,GAC3EiI,GAEOG,EAAe,KAAMH,GACTI,EAAwDC,GAAGL,GAE5DA,IAGGC,GACvB/H,OAAOoI,KAAKL,GAAQM,QAAQ,SAAAC,GAC1BN,EAAqBA,EAA6BlH,QAChD,IAAIyH,WAAWD,MAAQ,KACvBP,EAAOO,MAKNN,GAAqBF,EAG9B,SAASG,EAAepI,EAAgBiI,GACtC,OACEjE,EAAeqE,EAAcrI,IAC7BgE,EAAgBqE,EAAwDrI,GAASiI,GAIrF,SAASjE,EAAe2E,EAAUF,GAChC,OAAOtI,OAAO4D,UAAUC,eAAeC,KAAK0E,EAAKF,GDenD,SAASG,EAAgBC,EAAcC,SAC/BC,UACHhB,EAASiB,MAAO,OAChBjB,EAASkB,QAAS,MAClBlB,EAASmB,QAAS,OAErB,OAAO5E,KAAK6E,KAAKN,EAAOE,EAAgBD,IAG1C,SAASM,EAAeC,EAAerJ,EAAgBsJ,SACrD,OAAc,IAAVD,EACKrB,wBAAqCsB,EAAY,GAAItJ,GAEvDgI,wBACiBsB,cAChBA,UAAiBD,KACvBrJ,IAQJ,SAAK+H,GACHA,kBACAA,kBACAA,cAHF,CAAKA,IAAAA,qDRPL,SACExE,EACAC,EACAxD,EACAC,GAEA,gBAHAD,IAAAA,ED1E4B,kBC2E5BC,IAAAA,EAAU,CAAEwD,oBAAoB,IAEtBH,EAAaC,EAAQC,EAAcxD,EAAQC,QACnDuD,GAAgB,IAChBM,gGU/E6BuF,GAC/B,OAAUE,YAAoB,IAARF,GAAa1H,QAAQ,+BCG3C6H,IAEAxJ,qBAD6D,MAA3D2E,mBAGF,gBAFA3E,IAAAA,EZN4B,SYQrBO,EAAgCiJ,EAAMxJ,aZNE,oCSGd2F,EAAY3F,GAC7C,gBAD6CA,IAAAA,ETLjB,SSMxB2F,EAAO,IAAIC,KAAKA,KAAK6D,OAChB,GAYX,SAA8B9D,GAC5B,gBIpBcA,GACd,IAAM+D,EAAQ,IAAI9D,KAAKA,KAAK6D,OAC5B,OACE9D,EAAKkB,YAAc6C,EAAM7C,WACzBlB,EAAKsB,aAAeyC,EAAMzC,YAC1BtB,EAAKgE,gBAAkBD,EAAMC,cJexBC,CAAQjE,IAGjB,SAAuBA,EAAYkE,GAIjC,OAAOjB,EADMjD,EAFD,IAAIC,KAAKA,KAAK6D,OAGG1B,EAASiB,OAPM,GAApBc,CAAcnE,GATlCoE,CAAqBpE,GAmB3B,SAAwBA,EAAY3F,GAClC,IAEM6I,EAAOlD,EAFD,IAAIC,KAAKA,KAAK6D,OAI1B,GAAIb,EAAgBC,EAAMd,EAASmB,QAAU,GAC3C,OAsCJ,SAAuBlJ,GACrB,OAAOgI,EAAe,6BAA8B,GAAIhI,GAvC/CgK,CAAchK,GAGvB,IAAMiK,EAAsBrB,EAAgBC,EAAMd,EAASkB,QAC3D,OAAIgB,EAAsB,GACjBb,EAAea,EAAqBjK,EAAQ+H,EAASkB,QAGvDG,EAAeR,EAAgBC,EAAMd,EAASiB,MAAOhJ,EAAQ+H,EAASiB,MAhC/DkB,CAAevE,EAAM3F,GAmCrC,SAAwB2F,EAAY3F,GAIlC,OAAOgI,EAAe,qBAHP,CACbmC,cAAezE,EAAWC,EAAM3F,EAAQ,CAAE8G,MAAO,QAASJ,IAAK,aAEb1G,GArCtCoK,CAAezE,EAAM3F,mCKRnCwJ,EACAa,EACAC,IAMAtK,oBAD0F,SAHxFuK,UAAAA,aAAY,SACZC,IAAAA,wBACA7F,mBAAAA,adV6C,acY/C3E,IAAAA,Edd4B,ScgB5B,IAAMyK,EAAW,CACfC,UAAW,GACXC,QAAS,IAGXF,EAASE,QAAQC,QAAU,CACzBC,OAAQtK,EAAgCiJ,EAAMxJ,EAAQ2E,GACtDA,mBAAAA,GAGF,IAAMmG,WTpBNtB,EACAa,EACAC,sBAI6D,SAF3DC,UAAAA,aAAY,SACZC,IAAAA,oBAKF,OAiBA,WACE,IAAKhB,EAAM,UAAUuB,0CAA0CvB,gBAC/D,IAAKa,EACH,UAAUU,oDAAoDV,gBAChE,IAAKC,EACH,UAAUS,oDAAoDT,gBAChE,GAAIE,GAAsD,iBAAxBA,EAChC,UAAUO,0DAC4CP,MAAuBA,eA3BjFQ,GAkCF,SAA8BC,EAA4BZ,GACxD,GAAwB,WAApBY,EAA8B,SAClC,GAAwB,WAApBA,EAA8B,SAClC,GAAI,CAAC,YAAQ7J,EAAW,MAAM8J,QAAQD,IAAoB,EACxD,SAAU5F,EAAOgF,IAAmB,IAAItF,oBAC1C,UAAUgG,8CACgCE,+CAtCtCE,CAAqBZ,EAAWF,GAC3B,CAEL7F,YAAa8F,EACb1F,SAAUO,EAAcqF,EAAqBF,GAC7C5F,YAAa2F,EACb5F,SAAUU,EAAcqF,EAAqBF,GAAkBd,GAG5D,CAELhF,YAAa6F,EACbzF,SAAUO,EAAcqF,EAAqBH,GAC7C3F,YAAa4F,EACb7F,SAAU+E,EAAOrE,EAAcqF,EAAqBH,ISJrCe,CAAgB5B,EAAMa,EAAgBC,EAAgB,CACrEC,UAAAA,EACAC,oBAAAA,IA0BF,OAvBAC,EAASE,QAAQG,SAAW,CAC1BD,OAAQQ,EAAmBP,EAAU,CAAEnG,mBAAAA,GAAsB3E,GAC7DuK,UAAWO,EAAStG,cAAgB6F,EAAiB,SAAW,SAChEG,oBAAqBM,EAASlG,SAC9B0G,qBAAsB/K,EACpBuK,EAASrG,SACTzE,EACA2E,IAKF8F,EAASC,UADPI,EAAStG,cAAgB6F,GAAwC,IAAtBS,EAASlG,SACjC,CACnBnD,OAAQ,UACRoJ,OAAQJ,EAASE,QAAQC,QAAQC,QAGd,CACnBpJ,OAAQ,WACRoJ,OAAQJ,EAASE,QAAQG,SAASD,QAI/BJ"}
|
|
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/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/rate/formatRate.ts","../src/date/isToday.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","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 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 const isNegative = amount < 0;\n const absoluteAmount = Math.abs(amount);\n\n const formattedAbsoluteAmount = formatNumber(absoluteAmount, locale, availablePrecision);\n\n return isNegative ? `- ${formattedAbsoluteAmount}` : formattedAbsoluteAmount;\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 { 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} 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 function formatPercentage(value: number) {\n return `${parseFloat((value * 100).toFixed(2))}%`;\n}\n","import { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\n\nexport default function(\n rate: number,\n { significantFigures = NUMBER_OF_RATE_SIGNIFICANT_DIGITS } = {},\n locale = DEFAULT_LOCALE,\n) {\n return formatNumberToSignificantDigits(rate, locale, significantFigures);\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 { NUMBER_OF_RATE_SIGNIFICANT_DIGITS, DEFAULT_LOCALE } from '../defaults';\nimport { formatNumberToSignificantDigits } from '../number';\nimport formatRateEquation from './formatRateEquation';\nimport getRateEquation, { Reference } from './getRateEquation';\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","SIGNIFICANT_DIGITS","TYPE","MIN_PRECISION","MAX_PRECISION","FRACTION_DIGITS","formatters","getFormatter","locale","options","cacheKey","Object","entries","Intl","NumberFormat","formatNumberToSignificantDigits","number","significantDigits","formatNumber","precision","precisionType","Number","isPrecisionValid","validatedLocale","noUnderscoreLocale","replace","e","getValidLocale","undefined","supportedLocalesOf","length","isIntlNumberFormatSupported","getPrecisionOptions","format","toPrecision","toFixed","formatNumberWithFallback","currencyDecimals","BIF","BYR","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","VND","VUV","XAF","XOF","XPF","HUF","UGX","KES","BHD","JOD","KWD","OMR","TND","formatAmount","amount","currencyCode","alwaysShowDecimals","availablePrecision","amountHasNoDecimals","currency","upperCaseCurrency","toUpperCase","prototype","hasOwnProperty","call","getCurrencyDecimals","getPrecision","isNegative","formattedAbsoluteAmount","Math","abs","lhsCurrency","rhsValue","rhsCurrency","significantFigures","lhsValue","intlSupported","BRL","hasInversionEnabled","INR","IDR","RON","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","value","timeUnit","parseFloat","rate","now","today","getFullYear","isToday","boundary","isWithinHours","shouldFormatRelative","formatSeconds","differenceInMinutes","formatRelative","formattedDate","formatAbsolute","sourceCurrency","targetCurrency","reference","referenceMultiplier","response","suggested","formats","decimal","output","equation","Error","validateParameters","referenceConfig","indexOf","shouldInvertEquation","getRateEquation","formatRateEquation","calculationInDecimal"],"mappings":"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"}
|
package/package.json
CHANGED
package/CHANGELOG.md
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
# v2.7.0
|
|
2
|
-
## Add Ukrainian translations
|
|
3
|
-
|
|
4
|
-
# v2.6.0
|
|
5
|
-
## Inverting Rate Format for IDR
|
|
6
|
-
|
|
7
|
-
# v2.5.0
|
|
8
|
-
## Add TypeScript declarations
|
|
9
|
-
|
|
10
|
-
# v2.4.3
|
|
11
|
-
## Adds UGX and KES as currencies with no fractional parts
|
|
12
|
-
|
|
13
|
-
# v2.4.2
|
|
14
|
-
## Bump for new translations
|
|
15
|
-
|
|
16
|
-
# v2.4.1
|
|
17
|
-
## Bump Webpack version and fix major dependency vulnerabilities
|
|
18
|
-
|
|
19
|
-
# v2.4.0
|
|
20
|
-
## Inverting Rate Format for HUF and RON
|
|
21
|
-
|
|
22
|
-
# v2.3.2
|
|
23
|
-
## Bump for new translations
|
|
24
|
-
|
|
25
|
-
# v2.3.1
|
|
26
|
-
## Bump for new translations
|
|
27
|
-
|
|
28
|
-
# v2.3.0
|
|
29
|
-
## Add and expose formatRelativeDate() function
|
|
30
|
-
|
|
31
|
-
# v2.2.1
|
|
32
|
-
## Translation setup
|
|
33
|
-
Setup crowdin for translations.
|
|
34
|
-
|
|
35
|
-
# v2.2.0
|
|
36
|
-
## Make formatRate() function localizable
|
|
37
|
-
|
|
38
|
-
# v2.1.0
|
|
39
|
-
## Add formatNumberToSignificantDigits to localize rate in getRateEquation
|
|
40
|
-
|
|
41
|
-
# v2.0.1
|
|
42
|
-
## Rewrite getRateEquation to avoid a minification bug breaking getRateInAllFormats
|
|
43
|
-
|
|
44
|
-
# v2.0.0
|
|
45
|
-
## Change rate formatter API for easier usage
|
|
46
|
-
|
|
47
|
-
### How to migrate from v1 to v2
|
|
48
|
-
|
|
49
|
-
Do you use `getRateInAllFormats(...)` (introduced in v1.6.0)?
|
|
50
|
-
|
|
51
|
-
- **No** -> Nothing to do, upgrading is safe and will not break anything.
|
|
52
|
-
- **Yes** -> `getRateInAllFormats(...)`'s response has some renamed properties, check https://github.com/transferwise/formatting/pull/22#issue-283516357.
|
|
53
|
-
|
|
54
|
-
# v1.6.0
|
|
55
|
-
## Add ability to format rate for weaker currencies in inverted form.
|
|
56
|
-
|
|
57
|
-
# v1.5.0
|
|
58
|
-
## Add ability to format currencies with alwaysShowDecimals option
|
|
59
|
-
|
|
60
|
-
# v1.4.3
|
|
61
|
-
## Checking number formatting locales for validity
|
|
62
|
-
|
|
63
|
-
# v1.4.2
|
|
64
|
-
## Fix zero value formatting
|
|
65
|
-
|
|
66
|
-
# v1.4.1
|
|
67
|
-
## Fix typo in README.md and in CHANGELOG.md
|
|
68
|
-
|
|
69
|
-
# v1.4.0
|
|
70
|
-
## Formatting numbers
|
|
71
|
-
|
|
72
|
-
```javascript
|
|
73
|
-
import { formatNumber } from '@transferwise/formatting';
|
|
74
|
-
|
|
75
|
-
const number = 123456;
|
|
76
|
-
|
|
77
|
-
console.log(formatNumber(number, 'en-GB' /* Optional, defaults to en-GB */));
|
|
78
|
-
// --> '123,456'
|
|
79
|
-
console.log(formatNumber(number, 'es-ES', 0 /* Optional precision, defaults to 0 */));
|
|
80
|
-
// --> '123.456'
|
|
81
|
-
console.log(formatNumber(number, 'hu-HU'));
|
|
82
|
-
// --> '123 456'
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
# v1.3.2
|
|
86
|
-
## Date formatting performance improvements
|
|
87
|
-
|
|
88
|
-
# v1.3.1
|
|
89
|
-
## Date default timezone not UTC
|
|
90
|
-
|
|
91
|
-
# v1.3.0
|
|
92
|
-
## Formatting dates
|
|
93
|
-
|
|
94
|
-
```javascript
|
|
95
|
-
import { formatDate } from '@transferwise/formatting';
|
|
96
|
-
|
|
97
|
-
const date = new Date(Date.UTC(2018, 11, 1));
|
|
98
|
-
|
|
99
|
-
console.log(formatDate(date, 'en-GB' /* Optional, defaults to en-GB */));
|
|
100
|
-
// --> '01/12/2018'
|
|
101
|
-
console.log(formatDate(date, 'en-GB', { weekday: 'short' }));
|
|
102
|
-
// --> 'Sat'
|
|
103
|
-
console.log(formatDate(date, 'en-GB', { month: 'long', year: 'numeric' }));
|
|
104
|
-
// --> 'December 2018'
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
# v1.2.1
|
|
108
|
-
## Fix floating numbers percentage
|
|
109
|
-
|
|
110
|
-
# v1.2.0
|
|
111
|
-
## Formatting percentages
|
|
112
|
-
|
|
113
|
-
```javascript
|
|
114
|
-
import { formatPercentage } from '@transferwise/formatting';
|
|
115
|
-
|
|
116
|
-
console.log(formatPercentage(0.23456789));
|
|
117
|
-
// --> '23.46%'
|
|
118
|
-
console.log(formatPercentage(0.2340));
|
|
119
|
-
// --> '23.4%'
|
|
120
|
-
console.log(formatPercentage(0.2300));
|
|
121
|
-
// --> '23%'
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
# v1.1.0
|
|
125
|
-
## Formatting rates
|
|
126
|
-
|
|
127
|
-
```javascript
|
|
128
|
-
import { formatRate } from '@transferwise/formatting';
|
|
129
|
-
|
|
130
|
-
console.log(formatRate(1.23456789));
|
|
131
|
-
// --> '1.23457'
|
|
132
|
-
console.log(formatRate(1.23));
|
|
133
|
-
// --> '1.23000'
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
# v1.0.2
|
|
137
|
-
## Formatting amounts with no decimals without decimals
|
|
138
|
-
|
|
139
|
-
Before:
|
|
140
|
-
```js
|
|
141
|
-
formatAmount(1234, 'gbp') // 1,234.00
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
After:
|
|
145
|
-
```js
|
|
146
|
-
formatAmount(1234, 'gbp') // 1,234
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
# v1.0.1
|
|
150
|
-
## Number formatting and SSR fixes
|
|
151
|
-
|
|
152
|
-
Negative numbers now have a space between the minus and the number. In addition, SSR is now supported.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
# v1.0.0
|
|
156
|
-
## Number formatting
|
|
157
|
-
|
|
158
|
-
Initial release with number formatting.
|