@formatjs/intl-pluralrules 6.0.4 → 6.0.6

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.
Files changed (2) hide show
  1. package/package.json +5 -5
  2. package/polyfill.iife.js +158 -21
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@formatjs/intl-pluralrules",
3
3
  "description": "Polyfill for Intl.PluralRules",
4
- "version": "6.0.4",
4
+ "version": "6.0.6",
5
5
  "license": "MIT",
6
6
  "author": "Long Ho <holevietlong@gmail.com>",
7
7
  "type": "module",
@@ -16,12 +16,12 @@
16
16
  "dependencies": {
17
17
  "decimal.js": "^10.4.3",
18
18
  "tslib": "^2.8.0",
19
- "@formatjs/intl-localematcher": "0.7.2",
20
- "@formatjs/ecma402-abstract": "3.0.3"
19
+ "@formatjs/ecma402-abstract": "3.0.5",
20
+ "@formatjs/intl-localematcher": "0.7.3"
21
21
  },
22
22
  "devDependencies": {
23
- "@formatjs/intl-locale": "5.0.4",
24
- "@formatjs/intl-getcanonicallocales": "3.0.3"
23
+ "@formatjs/intl-locale": "5.0.6",
24
+ "@formatjs/intl-getcanonicallocales": "3.0.4"
25
25
  },
26
26
  "bugs": "https://github.com/formatjs/formatjs/issues",
27
27
  "gitHead": "a7842673d8ad205171ad7c8cb8bb2f318b427c0c",
package/polyfill.iife.js CHANGED
@@ -2808,6 +2808,11 @@
2808
2808
  return r2;
2809
2809
  }
2810
2810
 
2811
+ // node_modules/.aspect_rules_js/@formatjs+ecma402-abstract@0.0.0/node_modules/@formatjs/ecma402-abstract/NumberFormat/decimal-cache.js
2812
+ var getPowerOf10 = memoize(function(exponent) {
2813
+ return Decimal.pow(10, exponent);
2814
+ });
2815
+
2811
2816
  // node_modules/.aspect_rules_js/@formatjs+ecma402-abstract@0.0.0/node_modules/@formatjs/ecma402-abstract/NumberFormat/ComputeExponentForMagnitude.js
2812
2817
  Decimal.set({
2813
2818
  toExpPos: 100
@@ -2848,10 +2853,10 @@
2848
2853
  toExpPos: 100
2849
2854
  });
2850
2855
  function ToRawFixedFn(n, f) {
2851
- return n.times(Decimal.pow(10, -f));
2856
+ return n.times(getPowerOf10(-f));
2852
2857
  }
2853
2858
  function findN1R1(x, f, roundingIncrement) {
2854
- var nx = x.times(Decimal.pow(10, f)).floor();
2859
+ var nx = x.times(getPowerOf10(f)).floor();
2855
2860
  var n1 = nx.div(roundingIncrement).floor().times(roundingIncrement);
2856
2861
  var r1 = ToRawFixedFn(n1, f);
2857
2862
  return {
@@ -2860,7 +2865,7 @@
2860
2865
  };
2861
2866
  }
2862
2867
  function findN2R2(x, f, roundingIncrement) {
2863
- var nx = x.times(Decimal.pow(10, f)).ceil();
2868
+ var nx = x.times(getPowerOf10(f)).ceil();
2864
2869
  var n2 = nx.div(roundingIncrement).ceil().times(roundingIncrement);
2865
2870
  var r2 = ToRawFixedFn(n2, f);
2866
2871
  return {
@@ -2920,14 +2925,34 @@
2920
2925
 
2921
2926
  // node_modules/.aspect_rules_js/@formatjs+ecma402-abstract@0.0.0/node_modules/@formatjs/ecma402-abstract/NumberFormat/ToRawPrecision.js
2922
2927
  function findN1E1R1(x, p) {
2923
- var maxN1 = Decimal.pow(10, p);
2924
- var minN1 = Decimal.pow(10, p - 1);
2928
+ var maxN1 = getPowerOf10(p);
2929
+ var minN1 = getPowerOf10(p - 1);
2930
+ var log10x = x.log(10);
2931
+ var e1 = log10x.floor();
2932
+ var divisor = getPowerOf10(e1.minus(p).plus(1));
2933
+ var n1 = x.div(divisor).floor();
2934
+ var r1 = n1.times(divisor);
2935
+ if (n1.greaterThanOrEqualTo(maxN1)) {
2936
+ e1 = e1.plus(1);
2937
+ var newDivisor = getPowerOf10(e1.minus(p).plus(1));
2938
+ n1 = x.div(newDivisor).floor();
2939
+ r1 = n1.times(newDivisor);
2940
+ } else if (n1.lessThan(minN1)) {
2941
+ e1 = e1.minus(1);
2942
+ var newDivisor = getPowerOf10(e1.minus(p).plus(1));
2943
+ n1 = x.div(newDivisor).floor();
2944
+ r1 = n1.times(newDivisor);
2945
+ }
2946
+ if (r1.lessThanOrEqualTo(x) && n1.lessThan(maxN1) && n1.greaterThanOrEqualTo(minN1)) {
2947
+ return { n1, e1, r1 };
2948
+ }
2925
2949
  var maxE1 = x.div(minN1).log(10).plus(p).minus(1).ceil();
2926
2950
  var currentE1 = maxE1;
2927
2951
  while (true) {
2928
- var currentN1 = x.div(Decimal.pow(10, currentE1.minus(p).plus(1))).floor();
2952
+ var currentDivisor = getPowerOf10(currentE1.minus(p).plus(1));
2953
+ var currentN1 = x.div(currentDivisor).floor();
2929
2954
  if (currentN1.lessThan(maxN1) && currentN1.greaterThanOrEqualTo(minN1)) {
2930
- var currentR1 = currentN1.times(Decimal.pow(10, currentE1.minus(p).plus(1)));
2955
+ var currentR1 = currentN1.times(currentDivisor);
2931
2956
  if (currentR1.lessThanOrEqualTo(x)) {
2932
2957
  return {
2933
2958
  n1: currentN1,
@@ -2940,14 +2965,34 @@
2940
2965
  }
2941
2966
  }
2942
2967
  function findN2E2R2(x, p) {
2943
- var maxN2 = Decimal.pow(10, p);
2944
- var minN2 = Decimal.pow(10, p - 1);
2968
+ var maxN2 = getPowerOf10(p);
2969
+ var minN2 = getPowerOf10(p - 1);
2970
+ var log10x = x.log(10);
2971
+ var e2 = log10x.floor();
2972
+ var divisor = getPowerOf10(e2.minus(p).plus(1));
2973
+ var n2 = x.div(divisor).ceil();
2974
+ var r2 = n2.times(divisor);
2975
+ if (n2.greaterThanOrEqualTo(maxN2)) {
2976
+ e2 = e2.plus(1);
2977
+ var newDivisor = getPowerOf10(e2.minus(p).plus(1));
2978
+ n2 = x.div(newDivisor).ceil();
2979
+ r2 = n2.times(newDivisor);
2980
+ } else if (n2.lessThan(minN2)) {
2981
+ e2 = e2.minus(1);
2982
+ var newDivisor = getPowerOf10(e2.minus(p).plus(1));
2983
+ n2 = x.div(newDivisor).ceil();
2984
+ r2 = n2.times(newDivisor);
2985
+ }
2986
+ if (r2.greaterThanOrEqualTo(x) && n2.lessThan(maxN2) && n2.greaterThanOrEqualTo(minN2)) {
2987
+ return { n2, e2, r2 };
2988
+ }
2945
2989
  var minE2 = x.div(maxN2).log(10).plus(p).minus(1).floor();
2946
2990
  var currentE2 = minE2;
2947
2991
  while (true) {
2948
- var currentN2 = x.div(Decimal.pow(10, currentE2.minus(p).plus(1))).ceil();
2992
+ var currentDivisor = getPowerOf10(currentE2.minus(p).plus(1));
2993
+ var currentN2 = x.div(currentDivisor).ceil();
2949
2994
  if (currentN2.lessThan(maxN2) && currentN2.greaterThanOrEqualTo(minN2)) {
2950
- var currentR2 = currentN2.times(Decimal.pow(10, currentE2.minus(p).plus(1)));
2995
+ var currentR2 = currentN2.times(currentDivisor);
2951
2996
  if (currentR2.greaterThanOrEqualTo(x)) {
2952
2997
  return {
2953
2998
  n2: currentN2,
@@ -7136,7 +7181,7 @@
7136
7181
  }
7137
7182
  throw new Error("No matching distance found");
7138
7183
  }
7139
- function findMatchingDistance(desired, supported) {
7184
+ function findMatchingDistanceImpl(desired, supported) {
7140
7185
  var desiredLocale = new Intl.Locale(desired).maximize();
7141
7186
  var supportedLocale = new Intl.Locale(supported).maximize();
7142
7187
  var desiredLSR = {
@@ -7178,7 +7223,26 @@
7178
7223
  }
7179
7224
  return matchingDistance;
7180
7225
  }
7226
+ var findMatchingDistance = memoize(findMatchingDistanceImpl, {
7227
+ serializer: function(args) {
7228
+ return "".concat(args[0], "|").concat(args[1]);
7229
+ }
7230
+ });
7231
+ function getFallbackCandidates(locale) {
7232
+ var candidates = [];
7233
+ var current = locale;
7234
+ while (current) {
7235
+ candidates.push(current);
7236
+ var lastDash = current.lastIndexOf("-");
7237
+ if (lastDash === -1)
7238
+ break;
7239
+ current = current.substring(0, lastDash);
7240
+ }
7241
+ return candidates;
7242
+ }
7243
+ var canonicalizedSupportedCache = /* @__PURE__ */ new WeakMap();
7181
7244
  function findBestMatch(requestedLocales, supportedLocales2, threshold) {
7245
+ var _a;
7182
7246
  if (threshold === void 0) {
7183
7247
  threshold = DEFAULT_MATCHING_THRESHOLD;
7184
7248
  }
@@ -7187,17 +7251,84 @@
7187
7251
  matchedDesiredLocale: "",
7188
7252
  distances: {}
7189
7253
  };
7190
- requestedLocales.forEach(function(desired, i) {
7191
- if (!result.distances[desired]) {
7192
- result.distances[desired] = {};
7193
- }
7194
- supportedLocales2.forEach(function(supported) {
7195
- var distance = findMatchingDistance(desired, supported) + 0 + i * 40;
7196
- result.distances[desired][supported] = distance;
7254
+ var canonicalizedSupportedLocales = canonicalizedSupportedCache.get(supportedLocales2);
7255
+ if (!canonicalizedSupportedLocales) {
7256
+ canonicalizedSupportedLocales = supportedLocales2.map(function(locale) {
7257
+ try {
7258
+ var canonical = Intl.getCanonicalLocales([locale]);
7259
+ return canonical[0] || locale;
7260
+ } catch (_a2) {
7261
+ return locale;
7262
+ }
7263
+ });
7264
+ canonicalizedSupportedCache.set(supportedLocales2, canonicalizedSupportedLocales);
7265
+ }
7266
+ var supportedSet = new Set(canonicalizedSupportedLocales);
7267
+ for (var i = 0; i < requestedLocales.length; i++) {
7268
+ var desired = requestedLocales[i];
7269
+ if (supportedSet.has(desired)) {
7270
+ var distance = 0 + i * 40;
7271
+ result.distances[desired] = (_a = {}, _a[desired] = distance, _a);
7197
7272
  if (distance < lowestDistance) {
7198
7273
  lowestDistance = distance;
7199
7274
  result.matchedDesiredLocale = desired;
7200
- result.matchedSupportedLocale = supported;
7275
+ result.matchedSupportedLocale = desired;
7276
+ }
7277
+ if (i === 0) {
7278
+ return result;
7279
+ }
7280
+ }
7281
+ }
7282
+ for (var i = 0; i < requestedLocales.length; i++) {
7283
+ var desired = requestedLocales[i];
7284
+ try {
7285
+ var maximized = new Intl.Locale(desired).maximize().toString();
7286
+ if (maximized !== desired) {
7287
+ var maximizedCandidates = getFallbackCandidates(maximized);
7288
+ for (var j = 0; j < maximizedCandidates.length; j++) {
7289
+ var candidate = maximizedCandidates[j];
7290
+ if (candidate === desired)
7291
+ continue;
7292
+ if (supportedSet.has(candidate)) {
7293
+ var distance = void 0;
7294
+ try {
7295
+ var candidateMaximized = new Intl.Locale(candidate).maximize().toString();
7296
+ distance = candidateMaximized === maximized ? 0 + i * 40 : j * 10 + i * 40;
7297
+ } catch (_b) {
7298
+ distance = j * 10 + i * 40;
7299
+ }
7300
+ if (!result.distances[desired]) {
7301
+ result.distances[desired] = {};
7302
+ }
7303
+ result.distances[desired][candidate] = distance;
7304
+ if (distance < lowestDistance) {
7305
+ lowestDistance = distance;
7306
+ result.matchedDesiredLocale = desired;
7307
+ result.matchedSupportedLocale = candidate;
7308
+ }
7309
+ break;
7310
+ }
7311
+ }
7312
+ }
7313
+ } catch (_c) {
7314
+ }
7315
+ }
7316
+ if (result.matchedSupportedLocale && lowestDistance === 0) {
7317
+ return result;
7318
+ }
7319
+ requestedLocales.forEach(function(desired2, i2) {
7320
+ if (!result.distances[desired2]) {
7321
+ result.distances[desired2] = {};
7322
+ }
7323
+ canonicalizedSupportedLocales.forEach(function(canonicalLocale, supportedIndex) {
7324
+ var originalSupported = supportedLocales2[supportedIndex];
7325
+ var distance2 = findMatchingDistance(desired2, canonicalLocale);
7326
+ var finalDistance = distance2 + 0 + i2 * 40;
7327
+ result.distances[desired2][originalSupported] = finalDistance;
7328
+ if (finalDistance < lowestDistance) {
7329
+ lowestDistance = finalDistance;
7330
+ result.matchedDesiredLocale = desired2;
7331
+ result.matchedSupportedLocale = originalSupported;
7201
7332
  }
7202
7333
  });
7203
7334
  });
@@ -7278,10 +7409,16 @@
7278
7409
  }
7279
7410
 
7280
7411
  // node_modules/.aspect_rules_js/@formatjs+intl-localematcher@0.0.0/node_modules/@formatjs/intl-localematcher/abstract/BestAvailableLocale.js
7412
+ var availableLocalesSetCache = /* @__PURE__ */ new WeakMap();
7281
7413
  function BestAvailableLocale(availableLocales, locale) {
7414
+ var availableSet = availableLocalesSetCache.get(availableLocales);
7415
+ if (!availableSet) {
7416
+ availableSet = new Set(availableLocales);
7417
+ availableLocalesSetCache.set(availableLocales, availableSet);
7418
+ }
7282
7419
  var candidate = locale;
7283
7420
  while (true) {
7284
- if (availableLocales.indexOf(candidate) > -1) {
7421
+ if (availableSet.has(candidate)) {
7285
7422
  return candidate;
7286
7423
  }
7287
7424
  var pos = candidate.lastIndexOf("-");