@fgv/ts-bcp47 0.9.6 → 2.0.1-alpha.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.
Files changed (555) hide show
  1. package/.cache/build.lint/_eslint-R7SFxnrl.json +481 -0
  2. package/dist/ts-bcp47.d.ts +2554 -0
  3. package/dist/tsdoc-metadata.json +11 -0
  4. package/lib/data/bcp/overrides.json +20 -0
  5. package/lib/data/iana/language-subtags.json +57439 -0
  6. package/{data → lib/data}/iana/language-tag-extensions.json +2 -6
  7. package/lib/data/unsd/m49.json +3723 -0
  8. package/lib/index.d.ts +6 -0
  9. package/lib/index.d.ts.map +1 -0
  10. package/lib/index.js +57 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/packlets/bcp47/bcp47Subtags/converters.d.ts.map +1 -0
  13. package/{bcp47 → lib/packlets/bcp47}/bcp47Subtags/converters.js +2 -1
  14. package/lib/packlets/bcp47/bcp47Subtags/converters.js.map +1 -0
  15. package/lib/packlets/bcp47/bcp47Subtags/index.d.ts.map +1 -0
  16. package/{bcp47 → lib/packlets/bcp47}/bcp47Subtags/index.js +1 -1
  17. package/lib/packlets/bcp47/bcp47Subtags/index.js.map +1 -0
  18. package/{bcp47 → lib/packlets/bcp47}/bcp47Subtags/model.d.ts +3 -1
  19. package/lib/packlets/bcp47/bcp47Subtags/model.d.ts.map +1 -0
  20. package/lib/packlets/bcp47/bcp47Subtags/model.js +24 -0
  21. package/lib/packlets/bcp47/bcp47Subtags/model.js.map +1 -0
  22. package/{bcp47 → lib/packlets/bcp47}/bcp47Subtags/validate.d.ts +2 -2
  23. package/lib/packlets/bcp47/bcp47Subtags/validate.d.ts.map +1 -0
  24. package/lib/packlets/bcp47/bcp47Subtags/validate.js +74 -0
  25. package/lib/packlets/bcp47/bcp47Subtags/validate.js.map +1 -0
  26. package/{bcp47 → lib/packlets/bcp47}/common.d.ts +4 -4
  27. package/lib/packlets/bcp47/common.d.ts.map +1 -0
  28. package/lib/packlets/bcp47/common.js +59 -0
  29. package/lib/packlets/bcp47/common.js.map +1 -0
  30. package/{bcp47 → lib/packlets/bcp47}/helpers.d.ts +8 -8
  31. package/lib/packlets/bcp47/helpers.d.ts.map +1 -0
  32. package/lib/packlets/bcp47/helpers.js +103 -0
  33. package/lib/packlets/bcp47/helpers.js.map +1 -0
  34. package/lib/packlets/bcp47/index.d.ts +10 -0
  35. package/lib/packlets/bcp47/index.d.ts.map +1 -0
  36. package/lib/packlets/bcp47/index.js +68 -0
  37. package/lib/packlets/bcp47/index.js.map +1 -0
  38. package/{bcp47 → lib/packlets/bcp47}/languageRegistryData.d.ts +26 -27
  39. package/lib/packlets/bcp47/languageRegistryData.d.ts.map +1 -0
  40. package/lib/packlets/bcp47/languageRegistryData.js +206 -0
  41. package/lib/packlets/bcp47/languageRegistryData.js.map +1 -0
  42. package/{bcp47 → lib/packlets/bcp47}/languageTag.d.ts +12 -13
  43. package/lib/packlets/bcp47/languageTag.d.ts.map +1 -0
  44. package/lib/packlets/bcp47/languageTag.js +390 -0
  45. package/lib/packlets/bcp47/languageTag.js.map +1 -0
  46. package/{bcp47 → lib/packlets/bcp47}/languageTagParser.d.ts +13 -14
  47. package/lib/packlets/bcp47/languageTagParser.d.ts.map +1 -0
  48. package/lib/packlets/bcp47/languageTagParser.js +303 -0
  49. package/lib/packlets/bcp47/languageTagParser.js.map +1 -0
  50. package/{bcp47 → lib/packlets/bcp47}/match/chooser.d.ts +8 -8
  51. package/lib/packlets/bcp47/match/chooser.d.ts.map +1 -0
  52. package/lib/packlets/bcp47/match/chooser.js +92 -0
  53. package/lib/packlets/bcp47/match/chooser.js.map +1 -0
  54. package/lib/packlets/bcp47/match/common.d.ts.map +1 -0
  55. package/lib/packlets/bcp47/match/common.js +52 -0
  56. package/lib/packlets/bcp47/match/common.js.map +1 -0
  57. package/lib/packlets/bcp47/match/index.d.ts +4 -0
  58. package/lib/packlets/bcp47/match/index.d.ts.map +1 -0
  59. package/lib/packlets/bcp47/match/index.js +45 -0
  60. package/lib/packlets/bcp47/match/index.js.map +1 -0
  61. package/lib/packlets/bcp47/match/similarity.d.ts.map +1 -0
  62. package/lib/packlets/bcp47/match/similarity.js +230 -0
  63. package/lib/packlets/bcp47/match/similarity.js.map +1 -0
  64. package/lib/packlets/bcp47/normalization/baseNormalizer.d.ts +35 -0
  65. package/lib/packlets/bcp47/normalization/baseNormalizer.d.ts.map +1 -0
  66. package/lib/packlets/bcp47/normalization/baseNormalizer.js +116 -0
  67. package/lib/packlets/bcp47/normalization/baseNormalizer.js.map +1 -0
  68. package/lib/packlets/bcp47/normalization/canonicalNormalizer.d.ts +22 -0
  69. package/lib/packlets/bcp47/normalization/canonicalNormalizer.d.ts.map +1 -0
  70. package/lib/packlets/bcp47/normalization/canonicalNormalizer.js +113 -0
  71. package/lib/packlets/bcp47/normalization/canonicalNormalizer.js.map +1 -0
  72. package/{bcp47 → lib/packlets/bcp47}/normalization/common.d.ts +1 -1
  73. package/lib/packlets/bcp47/normalization/common.d.ts.map +1 -0
  74. package/lib/packlets/bcp47/normalization/common.js +82 -0
  75. package/lib/packlets/bcp47/normalization/common.js.map +1 -0
  76. package/lib/packlets/bcp47/normalization/index.d.ts.map +1 -0
  77. package/{bcp47 → lib/packlets/bcp47}/normalization/index.js +1 -1
  78. package/lib/packlets/bcp47/normalization/index.js.map +1 -0
  79. package/{bcp47 → lib/packlets/bcp47}/normalization/normalizeTag.d.ts +6 -6
  80. package/lib/packlets/bcp47/normalization/normalizeTag.d.ts.map +1 -0
  81. package/lib/packlets/bcp47/normalization/normalizeTag.js +105 -0
  82. package/lib/packlets/bcp47/normalization/normalizeTag.js.map +1 -0
  83. package/lib/packlets/bcp47/normalization/preferredTagNormalizer.d.ts +27 -0
  84. package/lib/packlets/bcp47/normalization/preferredTagNormalizer.d.ts.map +1 -0
  85. package/lib/packlets/bcp47/normalization/preferredTagNormalizer.js +204 -0
  86. package/lib/packlets/bcp47/normalization/preferredTagNormalizer.js.map +1 -0
  87. package/lib/packlets/bcp47/overrides/converters.d.ts +19 -0
  88. package/lib/packlets/bcp47/overrides/converters.d.ts.map +1 -0
  89. package/lib/packlets/bcp47/overrides/converters.js +76 -0
  90. package/lib/packlets/bcp47/overrides/converters.js.map +1 -0
  91. package/lib/packlets/bcp47/overrides/defaultRegistries.d.ts.map +1 -0
  92. package/lib/packlets/bcp47/overrides/defaultRegistries.js +42 -0
  93. package/lib/packlets/bcp47/overrides/defaultRegistries.js.map +1 -0
  94. package/lib/packlets/bcp47/overrides/index.d.ts.map +1 -0
  95. package/lib/packlets/bcp47/overrides/index.js +30 -0
  96. package/lib/packlets/bcp47/overrides/index.js.map +1 -0
  97. package/lib/packlets/bcp47/overrides/model.d.ts +11 -0
  98. package/lib/packlets/bcp47/overrides/model.d.ts.map +1 -0
  99. package/lib/packlets/bcp47/overrides/model.js +24 -0
  100. package/lib/packlets/bcp47/overrides/model.js.map +1 -0
  101. package/{bcp47 → lib/packlets/bcp47}/overrides/overridesRegistry.d.ts +8 -8
  102. package/lib/packlets/bcp47/overrides/overridesRegistry.d.ts.map +1 -0
  103. package/lib/packlets/bcp47/overrides/overridesRegistry.js +113 -0
  104. package/lib/packlets/bcp47/overrides/overridesRegistry.js.map +1 -0
  105. package/lib/packlets/bcp47/validation/baseValidator.d.ts +35 -0
  106. package/lib/packlets/bcp47/validation/baseValidator.d.ts.map +1 -0
  107. package/lib/packlets/bcp47/validation/baseValidator.js +113 -0
  108. package/lib/packlets/bcp47/validation/baseValidator.js.map +1 -0
  109. package/{bcp47 → lib/packlets/bcp47}/validation/common.d.ts +1 -1
  110. package/lib/packlets/bcp47/validation/common.d.ts.map +1 -0
  111. package/lib/packlets/bcp47/validation/common.js +84 -0
  112. package/lib/packlets/bcp47/validation/common.js.map +1 -0
  113. package/lib/packlets/bcp47/validation/index.d.ts.map +1 -0
  114. package/{bcp47 → lib/packlets/bcp47}/validation/index.js +1 -1
  115. package/lib/packlets/bcp47/validation/index.js.map +1 -0
  116. package/lib/packlets/bcp47/validation/isCanonical.d.ts +22 -0
  117. package/lib/packlets/bcp47/validation/isCanonical.d.ts.map +1 -0
  118. package/lib/packlets/bcp47/validation/isCanonical.js +106 -0
  119. package/lib/packlets/bcp47/validation/isCanonical.js.map +1 -0
  120. package/{bcp47 → lib/packlets/bcp47}/validation/isInPreferredForm.d.ts +4 -4
  121. package/lib/packlets/bcp47/validation/isInPreferredForm.d.ts.map +1 -0
  122. package/lib/packlets/bcp47/validation/isInPreferredForm.js +73 -0
  123. package/lib/packlets/bcp47/validation/isInPreferredForm.js.map +1 -0
  124. package/lib/packlets/bcp47/validation/isStrictlyValid.d.ts +18 -0
  125. package/lib/packlets/bcp47/validation/isStrictlyValid.d.ts.map +1 -0
  126. package/lib/packlets/bcp47/validation/isStrictlyValid.js +98 -0
  127. package/lib/packlets/bcp47/validation/isStrictlyValid.js.map +1 -0
  128. package/lib/packlets/bcp47/validation/isValid.d.ts +24 -0
  129. package/lib/packlets/bcp47/validation/isValid.d.ts.map +1 -0
  130. package/lib/packlets/bcp47/validation/isValid.js +119 -0
  131. package/lib/packlets/bcp47/validation/isValid.js.map +1 -0
  132. package/lib/packlets/bcp47/validation/isWellFormed.d.ts +22 -0
  133. package/lib/packlets/bcp47/validation/isWellFormed.d.ts.map +1 -0
  134. package/lib/packlets/bcp47/validation/isWellFormed.js +102 -0
  135. package/lib/packlets/bcp47/validation/isWellFormed.js.map +1 -0
  136. package/{bcp47 → lib/packlets/bcp47}/validation/validateTag.d.ts +9 -9
  137. package/lib/packlets/bcp47/validation/validateTag.d.ts.map +1 -0
  138. package/lib/packlets/bcp47/validation/validateTag.js +159 -0
  139. package/lib/packlets/bcp47/validation/validateTag.js.map +1 -0
  140. package/{iana → lib/packlets/iana}/common/converters.d.ts +2 -2
  141. package/lib/packlets/iana/common/converters.d.ts.map +1 -0
  142. package/lib/packlets/iana/common/converters.js +85 -0
  143. package/lib/packlets/iana/common/converters.js.map +1 -0
  144. package/{iana → lib/packlets/iana}/common/model.d.ts +1 -1
  145. package/lib/packlets/iana/common/model.d.ts.map +1 -0
  146. package/lib/packlets/iana/common/model.js +24 -0
  147. package/lib/packlets/iana/common/model.js.map +1 -0
  148. package/lib/packlets/iana/common/registeredItems.d.ts.map +1 -0
  149. package/lib/packlets/iana/common/registeredItems.js +124 -0
  150. package/lib/packlets/iana/common/registeredItems.js.map +1 -0
  151. package/lib/packlets/iana/common/utils.d.ts.map +1 -0
  152. package/lib/packlets/iana/common/utils.js +34 -0
  153. package/lib/packlets/iana/common/utils.js.map +1 -0
  154. package/{iana → lib/packlets/iana}/common/validate.d.ts +1 -1
  155. package/lib/packlets/iana/common/validate.d.ts.map +1 -0
  156. package/lib/packlets/iana/common/validate.js +62 -0
  157. package/lib/packlets/iana/common/validate.js.map +1 -0
  158. package/lib/packlets/iana/converters.d.ts.map +1 -0
  159. package/{iana → lib/packlets/iana}/converters.js +1 -1
  160. package/lib/packlets/iana/converters.js.map +1 -0
  161. package/lib/packlets/iana/defaultRegistries.d.ts.map +1 -0
  162. package/lib/packlets/iana/defaultRegistries.js +42 -0
  163. package/lib/packlets/iana/defaultRegistries.js.map +1 -0
  164. package/{iana → lib/packlets/iana}/index.d.ts +4 -2
  165. package/lib/packlets/iana/index.d.ts.map +1 -0
  166. package/{iana/jar/language-subtags/tags → lib/packlets/iana}/index.js +18 -6
  167. package/lib/packlets/iana/index.js.map +1 -0
  168. package/lib/packlets/iana/jar/converters.d.ts.map +1 -0
  169. package/{iana → lib/packlets/iana}/jar/converters.js +1 -1
  170. package/lib/packlets/iana/jar/converters.js.map +1 -0
  171. package/lib/packlets/iana/jar/index.d.ts +5 -0
  172. package/lib/packlets/iana/jar/index.d.ts.map +1 -0
  173. package/{unsd/csv → lib/packlets/iana/jar}/index.js +4 -2
  174. package/lib/packlets/iana/jar/index.js.map +1 -0
  175. package/{iana → lib/packlets/iana}/jar/jarConverters.d.ts +5 -5
  176. package/lib/packlets/iana/jar/jarConverters.d.ts.map +1 -0
  177. package/lib/packlets/iana/jar/jarConverters.js +86 -0
  178. package/lib/packlets/iana/jar/jarConverters.js.map +1 -0
  179. package/{iana → lib/packlets/iana}/jar/jarModel.d.ts +1 -1
  180. package/lib/packlets/iana/jar/jarModel.d.ts.map +1 -0
  181. package/lib/packlets/iana/jar/jarModel.js +24 -0
  182. package/lib/packlets/iana/jar/jarModel.js.map +1 -0
  183. package/lib/packlets/iana/jar/language-subtags/converters.d.ts.map +1 -0
  184. package/{iana → lib/packlets/iana}/jar/language-subtags/converters.js +1 -1
  185. package/lib/packlets/iana/jar/language-subtags/converters.js.map +1 -0
  186. package/lib/packlets/iana/jar/language-subtags/index.d.ts +5 -0
  187. package/lib/packlets/iana/jar/language-subtags/index.d.ts.map +1 -0
  188. package/{iana/jar/language-subtags/registry → lib/packlets/iana/jar/language-subtags}/index.js +29 -28
  189. package/lib/packlets/iana/jar/language-subtags/index.js.map +1 -0
  190. package/lib/packlets/iana/jar/language-subtags/model.d.ts.map +1 -0
  191. package/{iana → lib/packlets/iana}/jar/language-subtags/model.js +1 -1
  192. package/lib/packlets/iana/jar/language-subtags/model.js.map +1 -0
  193. package/lib/packlets/iana/jar/language-subtags/registry/converters.d.ts.map +1 -0
  194. package/lib/packlets/iana/jar/language-subtags/registry/converters.js +59 -0
  195. package/lib/packlets/iana/jar/language-subtags/registry/converters.js.map +1 -0
  196. package/lib/packlets/iana/jar/language-subtags/registry/index.d.ts.map +1 -0
  197. package/{iana/jar/language-subtags → lib/packlets/iana/jar/language-subtags/registry}/index.js +23 -22
  198. package/lib/packlets/iana/jar/language-subtags/registry/index.js.map +1 -0
  199. package/{iana → lib/packlets/iana}/jar/language-subtags/registry/model.d.ts +12 -12
  200. package/lib/packlets/iana/jar/language-subtags/registry/model.d.ts.map +1 -0
  201. package/lib/packlets/iana/jar/language-subtags/registry/model.js +46 -0
  202. package/lib/packlets/iana/jar/language-subtags/registry/model.js.map +1 -0
  203. package/lib/packlets/iana/jar/language-subtags/tags/converters.d.ts +55 -0
  204. package/lib/packlets/iana/jar/language-subtags/tags/converters.d.ts.map +1 -0
  205. package/lib/packlets/iana/jar/language-subtags/tags/converters.js +129 -0
  206. package/lib/packlets/iana/jar/language-subtags/tags/converters.js.map +1 -0
  207. package/lib/packlets/iana/jar/language-subtags/tags/index.d.ts +6 -0
  208. package/lib/packlets/iana/jar/language-subtags/tags/index.d.ts.map +1 -0
  209. package/lib/packlets/iana/jar/language-subtags/tags/index.js +58 -0
  210. package/lib/packlets/iana/jar/language-subtags/tags/index.js.map +1 -0
  211. package/lib/packlets/iana/jar/language-subtags/tags/model.d.ts.map +1 -0
  212. package/lib/packlets/iana/jar/language-subtags/tags/model.js +24 -0
  213. package/lib/packlets/iana/jar/language-subtags/tags/model.js.map +1 -0
  214. package/lib/packlets/iana/jar/language-subtags/tags/tagValidation.d.ts.map +1 -0
  215. package/lib/packlets/iana/jar/language-subtags/tags/tagValidation.js +70 -0
  216. package/lib/packlets/iana/jar/language-subtags/tags/tagValidation.js.map +1 -0
  217. package/lib/packlets/iana/jar/language-subtags/tags/validate.d.ts.map +1 -0
  218. package/lib/packlets/iana/jar/language-subtags/tags/validate.js +88 -0
  219. package/lib/packlets/iana/jar/language-subtags/tags/validate.js.map +1 -0
  220. package/lib/packlets/iana/jar/model.d.ts.map +1 -0
  221. package/{iana → lib/packlets/iana}/jar/model.js +1 -1
  222. package/lib/packlets/iana/jar/model.js.map +1 -0
  223. package/lib/packlets/iana/language-subtags/common.d.ts.map +1 -0
  224. package/lib/packlets/iana/language-subtags/common.js +24 -0
  225. package/lib/packlets/iana/language-subtags/common.js.map +1 -0
  226. package/lib/packlets/iana/language-subtags/converters.d.ts +52 -0
  227. package/lib/packlets/iana/language-subtags/converters.d.ts.map +1 -0
  228. package/lib/packlets/iana/language-subtags/converters.js +209 -0
  229. package/lib/packlets/iana/language-subtags/converters.js.map +1 -0
  230. package/{iana → lib/packlets/iana}/language-subtags/index.d.ts +4 -3
  231. package/lib/packlets/iana/language-subtags/index.d.ts.map +1 -0
  232. package/{iana → lib/packlets/iana}/language-subtags/index.js +10 -8
  233. package/lib/packlets/iana/language-subtags/index.js.map +1 -0
  234. package/{iana → lib/packlets/iana}/language-subtags/jarConverters.d.ts +8 -8
  235. package/lib/packlets/iana/language-subtags/jarConverters.d.ts.map +1 -0
  236. package/lib/packlets/iana/language-subtags/jarConverters.js +237 -0
  237. package/lib/packlets/iana/language-subtags/jarConverters.js.map +1 -0
  238. package/{iana → lib/packlets/iana}/language-subtags/model.d.ts +15 -15
  239. package/lib/packlets/iana/language-subtags/model.d.ts.map +1 -0
  240. package/lib/packlets/iana/language-subtags/model.js +24 -0
  241. package/lib/packlets/iana/language-subtags/model.js.map +1 -0
  242. package/{iana → lib/packlets/iana}/language-subtags/scope.d.ts +12 -12
  243. package/lib/packlets/iana/language-subtags/scope.d.ts.map +1 -0
  244. package/lib/packlets/iana/language-subtags/scope.js +179 -0
  245. package/lib/packlets/iana/language-subtags/scope.js.map +1 -0
  246. package/{iana → lib/packlets/iana}/language-subtags/subtagRegistry.d.ts +1 -1
  247. package/lib/packlets/iana/language-subtags/subtagRegistry.d.ts.map +1 -0
  248. package/lib/packlets/iana/language-subtags/subtagRegistry.js +150 -0
  249. package/lib/packlets/iana/language-subtags/subtagRegistry.js.map +1 -0
  250. package/lib/packlets/iana/language-subtags/validate.d.ts.map +1 -0
  251. package/{iana → lib/packlets/iana}/language-subtags/validate.js +1 -1
  252. package/lib/packlets/iana/language-subtags/validate.js.map +1 -0
  253. package/lib/packlets/iana/language-tag-extensions/converters.d.ts +22 -0
  254. package/lib/packlets/iana/language-tag-extensions/converters.d.ts.map +1 -0
  255. package/lib/packlets/iana/language-tag-extensions/converters.js +86 -0
  256. package/lib/packlets/iana/language-tag-extensions/converters.js.map +1 -0
  257. package/{iana → lib/packlets/iana}/language-tag-extensions/extensionsRegistry.d.ts +2 -2
  258. package/lib/packlets/iana/language-tag-extensions/extensionsRegistry.d.ts.map +1 -0
  259. package/lib/packlets/iana/language-tag-extensions/extensionsRegistry.js +105 -0
  260. package/lib/packlets/iana/language-tag-extensions/extensionsRegistry.js.map +1 -0
  261. package/{iana → lib/packlets/iana}/language-tag-extensions/extensionsScope.d.ts +3 -3
  262. package/lib/packlets/iana/language-tag-extensions/extensionsScope.d.ts.map +1 -0
  263. package/lib/packlets/iana/language-tag-extensions/extensionsScope.js +77 -0
  264. package/lib/packlets/iana/language-tag-extensions/extensionsScope.js.map +1 -0
  265. package/{iana → lib/packlets/iana}/language-tag-extensions/index.d.ts +3 -2
  266. package/lib/packlets/iana/language-tag-extensions/index.d.ts.map +1 -0
  267. package/{iana → lib/packlets/iana}/language-tag-extensions/index.js +6 -4
  268. package/lib/packlets/iana/language-tag-extensions/index.js.map +1 -0
  269. package/{iana → lib/packlets/iana}/language-tag-extensions/jarConverters.d.ts +2 -3
  270. package/lib/packlets/iana/language-tag-extensions/jarConverters.d.ts.map +1 -0
  271. package/lib/packlets/iana/language-tag-extensions/jarConverters.js +79 -0
  272. package/lib/packlets/iana/language-tag-extensions/jarConverters.js.map +1 -0
  273. package/{iana → lib/packlets/iana}/language-tag-extensions/model.d.ts +5 -6
  274. package/lib/packlets/iana/language-tag-extensions/model.d.ts.map +1 -0
  275. package/lib/packlets/iana/language-tag-extensions/model.js +25 -0
  276. package/lib/packlets/iana/language-tag-extensions/model.js.map +1 -0
  277. package/{iana → lib/packlets/iana}/language-tag-extensions/validate.d.ts +2 -2
  278. package/lib/packlets/iana/language-tag-extensions/validate.d.ts.map +1 -0
  279. package/lib/packlets/iana/language-tag-extensions/validate.js +36 -0
  280. package/lib/packlets/iana/language-tag-extensions/validate.js.map +1 -0
  281. package/lib/packlets/iana/languageRegistries.d.ts.map +1 -0
  282. package/lib/packlets/iana/languageRegistries.js +56 -0
  283. package/lib/packlets/iana/languageRegistries.js.map +1 -0
  284. package/lib/packlets/iana/model.d.ts.map +1 -0
  285. package/{iana → lib/packlets/iana}/model.js +1 -1
  286. package/lib/packlets/iana/model.js.map +1 -0
  287. package/lib/packlets/iana/validate.d.ts.map +1 -0
  288. package/{iana → lib/packlets/iana}/validate.js +1 -1
  289. package/lib/packlets/iana/validate.js.map +1 -0
  290. package/lib/packlets/unsd/areas.d.ts +29 -0
  291. package/lib/packlets/unsd/areas.d.ts.map +1 -0
  292. package/lib/packlets/unsd/areas.js +96 -0
  293. package/lib/packlets/unsd/areas.js.map +1 -0
  294. package/lib/packlets/unsd/common.d.ts +49 -0
  295. package/lib/packlets/unsd/common.d.ts.map +1 -0
  296. package/lib/packlets/unsd/common.js +24 -0
  297. package/lib/packlets/unsd/common.js.map +1 -0
  298. package/{unsd → lib/packlets/unsd}/csv/converters.d.ts +7 -4
  299. package/lib/packlets/unsd/csv/converters.d.ts.map +1 -0
  300. package/lib/packlets/unsd/csv/converters.js +78 -0
  301. package/lib/packlets/unsd/csv/converters.js.map +1 -0
  302. package/lib/packlets/unsd/csv/index.d.ts.map +1 -0
  303. package/{iana/jar → lib/packlets/unsd/csv}/index.js +1 -1
  304. package/lib/packlets/unsd/csv/index.js.map +1 -0
  305. package/lib/packlets/unsd/csv/model.d.ts +22 -0
  306. package/lib/packlets/unsd/csv/model.d.ts.map +1 -0
  307. package/lib/packlets/unsd/csv/model.js +24 -0
  308. package/lib/packlets/unsd/csv/model.js.map +1 -0
  309. package/lib/packlets/unsd/defaultRegistries.d.ts.map +1 -0
  310. package/lib/packlets/unsd/defaultRegistries.js +42 -0
  311. package/lib/packlets/unsd/defaultRegistries.js.map +1 -0
  312. package/{unsd → lib/packlets/unsd}/index.d.ts +2 -0
  313. package/lib/packlets/unsd/index.d.ts.map +1 -0
  314. package/lib/packlets/unsd/index.js +58 -0
  315. package/lib/packlets/unsd/index.js.map +1 -0
  316. package/{unsd → lib/packlets/unsd}/regionCodes.d.ts +7 -7
  317. package/lib/packlets/unsd/regionCodes.d.ts.map +1 -0
  318. package/lib/packlets/unsd/regionCodes.js +122 -0
  319. package/lib/packlets/unsd/regionCodes.js.map +1 -0
  320. package/lib/packlets/unsd/regions.d.ts +21 -0
  321. package/lib/packlets/unsd/regions.d.ts.map +1 -0
  322. package/lib/packlets/unsd/regions.js +77 -0
  323. package/lib/packlets/unsd/regions.js.map +1 -0
  324. package/lib/packlets/utils/index.d.ts.map +1 -0
  325. package/{utils → lib/packlets/utils}/index.js +1 -1
  326. package/lib/packlets/utils/index.js.map +1 -0
  327. package/lib/packlets/utils/jsonHelpers.d.ts.map +1 -0
  328. package/lib/packlets/utils/jsonHelpers.js +29 -0
  329. package/lib/packlets/utils/jsonHelpers.js.map +1 -0
  330. package/lib/packlets/utils/public.d.ts +2 -0
  331. package/lib/packlets/utils/public.d.ts.map +1 -0
  332. package/lib/packlets/utils/public.js +28 -0
  333. package/lib/packlets/utils/public.js.map +1 -0
  334. package/{utils → lib/packlets/utils}/validationHelpers.d.ts +9 -10
  335. package/lib/packlets/utils/validationHelpers.d.ts.map +1 -0
  336. package/lib/packlets/utils/validationHelpers.js +120 -0
  337. package/lib/packlets/utils/validationHelpers.js.map +1 -0
  338. package/package.json +73 -67
  339. package/bcp47/bcp47Subtags/converters.d.ts.map +0 -1
  340. package/bcp47/bcp47Subtags/index.d.ts.map +0 -1
  341. package/bcp47/bcp47Subtags/model.d.ts.map +0 -1
  342. package/bcp47/bcp47Subtags/model.js +0 -24
  343. package/bcp47/bcp47Subtags/validate.d.ts.map +0 -1
  344. package/bcp47/bcp47Subtags/validate.js +0 -74
  345. package/bcp47/common.d.ts.map +0 -1
  346. package/bcp47/common.js +0 -59
  347. package/bcp47/helpers.d.ts.map +0 -1
  348. package/bcp47/helpers.js +0 -103
  349. package/bcp47/index.d.ts +0 -7
  350. package/bcp47/index.d.ts.map +0 -1
  351. package/bcp47/index.js +0 -27
  352. package/bcp47/languageRegistryData.d.ts.map +0 -1
  353. package/bcp47/languageRegistryData.js +0 -209
  354. package/bcp47/languageTag.d.ts.map +0 -1
  355. package/bcp47/languageTag.js +0 -390
  356. package/bcp47/languageTagParser.d.ts.map +0 -1
  357. package/bcp47/languageTagParser.js +0 -302
  358. package/bcp47/match/chooser.d.ts.map +0 -1
  359. package/bcp47/match/chooser.js +0 -92
  360. package/bcp47/match/common.d.ts.map +0 -1
  361. package/bcp47/match/common.js +0 -51
  362. package/bcp47/match/index.d.ts +0 -4
  363. package/bcp47/match/index.d.ts.map +0 -1
  364. package/bcp47/match/index.js +0 -45
  365. package/bcp47/match/similarity.d.ts.map +0 -1
  366. package/bcp47/match/similarity.js +0 -230
  367. package/bcp47/normalization/baseNormalizer.d.ts +0 -36
  368. package/bcp47/normalization/baseNormalizer.d.ts.map +0 -1
  369. package/bcp47/normalization/baseNormalizer.js +0 -114
  370. package/bcp47/normalization/canonicalNormalizer.d.ts +0 -22
  371. package/bcp47/normalization/canonicalNormalizer.d.ts.map +0 -1
  372. package/bcp47/normalization/canonicalNormalizer.js +0 -113
  373. package/bcp47/normalization/common.d.ts.map +0 -1
  374. package/bcp47/normalization/common.js +0 -82
  375. package/bcp47/normalization/index.d.ts.map +0 -1
  376. package/bcp47/normalization/normalizeTag.d.ts.map +0 -1
  377. package/bcp47/normalization/normalizeTag.js +0 -105
  378. package/bcp47/normalization/preferredTagNormalizer.d.ts +0 -27
  379. package/bcp47/normalization/preferredTagNormalizer.d.ts.map +0 -1
  380. package/bcp47/normalization/preferredTagNormalizer.js +0 -209
  381. package/bcp47/overrides/converters.d.ts +0 -19
  382. package/bcp47/overrides/converters.d.ts.map +0 -1
  383. package/bcp47/overrides/converters.js +0 -75
  384. package/bcp47/overrides/defaultRegistries.d.ts.map +0 -1
  385. package/bcp47/overrides/defaultRegistries.js +0 -42
  386. package/bcp47/overrides/index.d.ts.map +0 -1
  387. package/bcp47/overrides/index.js +0 -30
  388. package/bcp47/overrides/model.d.ts +0 -11
  389. package/bcp47/overrides/model.d.ts.map +0 -1
  390. package/bcp47/overrides/model.js +0 -24
  391. package/bcp47/overrides/overridesRegistry.d.ts.map +0 -1
  392. package/bcp47/overrides/overridesRegistry.js +0 -112
  393. package/bcp47/validation/baseValidator.d.ts +0 -35
  394. package/bcp47/validation/baseValidator.d.ts.map +0 -1
  395. package/bcp47/validation/baseValidator.js +0 -111
  396. package/bcp47/validation/common.d.ts.map +0 -1
  397. package/bcp47/validation/common.js +0 -84
  398. package/bcp47/validation/index.d.ts.map +0 -1
  399. package/bcp47/validation/isCanonical.d.ts +0 -22
  400. package/bcp47/validation/isCanonical.d.ts.map +0 -1
  401. package/bcp47/validation/isCanonical.js +0 -104
  402. package/bcp47/validation/isInPreferredForm.d.ts.map +0 -1
  403. package/bcp47/validation/isInPreferredForm.js +0 -73
  404. package/bcp47/validation/isStrictlyValid.d.ts +0 -18
  405. package/bcp47/validation/isStrictlyValid.d.ts.map +0 -1
  406. package/bcp47/validation/isStrictlyValid.js +0 -98
  407. package/bcp47/validation/isValid.d.ts +0 -24
  408. package/bcp47/validation/isValid.d.ts.map +0 -1
  409. package/bcp47/validation/isValid.js +0 -115
  410. package/bcp47/validation/isWellFormed.d.ts +0 -22
  411. package/bcp47/validation/isWellFormed.d.ts.map +0 -1
  412. package/bcp47/validation/isWellFormed.js +0 -98
  413. package/bcp47/validation/validateTag.d.ts.map +0 -1
  414. package/bcp47/validation/validateTag.js +0 -159
  415. package/data/bcp/overrides.json +0 -21
  416. package/data/iana/language-subtags.json +0 -77295
  417. package/data/unsd/m49.json +0 -251
  418. package/iana/common/converters.d.ts.map +0 -1
  419. package/iana/common/converters.js +0 -84
  420. package/iana/common/model.d.ts.map +0 -1
  421. package/iana/common/model.js +0 -24
  422. package/iana/common/registeredItems.d.ts.map +0 -1
  423. package/iana/common/registeredItems.js +0 -124
  424. package/iana/common/utils.d.ts.map +0 -1
  425. package/iana/common/utils.js +0 -34
  426. package/iana/common/validate.d.ts.map +0 -1
  427. package/iana/common/validate.js +0 -61
  428. package/iana/converters.d.ts.map +0 -1
  429. package/iana/defaultRegistries.d.ts.map +0 -1
  430. package/iana/defaultRegistries.js +0 -42
  431. package/iana/index.d.ts.map +0 -1
  432. package/iana/index.js +0 -64
  433. package/iana/jar/converters.d.ts.map +0 -1
  434. package/iana/jar/index.d.ts.map +0 -1
  435. package/iana/jar/jarConverters.d.ts.map +0 -1
  436. package/iana/jar/jarConverters.js +0 -85
  437. package/iana/jar/jarModel.d.ts.map +0 -1
  438. package/iana/jar/jarModel.js +0 -24
  439. package/iana/jar/language-subtags/converters.d.ts.map +0 -1
  440. package/iana/jar/language-subtags/index.d.ts.map +0 -1
  441. package/iana/jar/language-subtags/model.d.ts.map +0 -1
  442. package/iana/jar/language-subtags/registry/converters.d.ts.map +0 -1
  443. package/iana/jar/language-subtags/registry/converters.js +0 -58
  444. package/iana/jar/language-subtags/registry/index.d.ts +0 -4
  445. package/iana/jar/language-subtags/registry/index.d.ts.map +0 -1
  446. package/iana/jar/language-subtags/registry/model.d.ts.map +0 -1
  447. package/iana/jar/language-subtags/registry/model.js +0 -41
  448. package/iana/jar/language-subtags/tags/converters.d.ts +0 -55
  449. package/iana/jar/language-subtags/tags/converters.d.ts.map +0 -1
  450. package/iana/jar/language-subtags/tags/converters.js +0 -128
  451. package/iana/jar/language-subtags/tags/index.d.ts +0 -5
  452. package/iana/jar/language-subtags/tags/index.d.ts.map +0 -1
  453. package/iana/jar/language-subtags/tags/model.d.ts.map +0 -1
  454. package/iana/jar/language-subtags/tags/model.js +0 -24
  455. package/iana/jar/language-subtags/tags/tagValidation.d.ts.map +0 -1
  456. package/iana/jar/language-subtags/tags/tagValidation.js +0 -70
  457. package/iana/jar/language-subtags/tags/validate.d.ts.map +0 -1
  458. package/iana/jar/language-subtags/tags/validate.js +0 -87
  459. package/iana/jar/model.d.ts.map +0 -1
  460. package/iana/language-subtags/common.d.ts.map +0 -1
  461. package/iana/language-subtags/common.js +0 -24
  462. package/iana/language-subtags/converters.d.ts +0 -52
  463. package/iana/language-subtags/converters.d.ts.map +0 -1
  464. package/iana/language-subtags/converters.js +0 -200
  465. package/iana/language-subtags/index.d.ts.map +0 -1
  466. package/iana/language-subtags/jarConverters.d.ts.map +0 -1
  467. package/iana/language-subtags/jarConverters.js +0 -213
  468. package/iana/language-subtags/model.d.ts.map +0 -1
  469. package/iana/language-subtags/model.js +0 -24
  470. package/iana/language-subtags/scope.d.ts.map +0 -1
  471. package/iana/language-subtags/scope.js +0 -179
  472. package/iana/language-subtags/subtagRegistry.d.ts.map +0 -1
  473. package/iana/language-subtags/subtagRegistry.js +0 -149
  474. package/iana/language-subtags/validate.d.ts.map +0 -1
  475. package/iana/language-tag-extensions/converters.d.ts +0 -23
  476. package/iana/language-tag-extensions/converters.d.ts.map +0 -1
  477. package/iana/language-tag-extensions/converters.js +0 -87
  478. package/iana/language-tag-extensions/extensionsRegistry.d.ts.map +0 -1
  479. package/iana/language-tag-extensions/extensionsRegistry.js +0 -104
  480. package/iana/language-tag-extensions/extensionsScope.d.ts.map +0 -1
  481. package/iana/language-tag-extensions/extensionsScope.js +0 -77
  482. package/iana/language-tag-extensions/index.d.ts.map +0 -1
  483. package/iana/language-tag-extensions/jarConverters.d.ts.map +0 -1
  484. package/iana/language-tag-extensions/jarConverters.js +0 -102
  485. package/iana/language-tag-extensions/model.d.ts.map +0 -1
  486. package/iana/language-tag-extensions/model.js +0 -24
  487. package/iana/language-tag-extensions/validate.d.ts.map +0 -1
  488. package/iana/language-tag-extensions/validate.js +0 -36
  489. package/iana/languageRegistries.d.ts.map +0 -1
  490. package/iana/languageRegistries.js +0 -56
  491. package/iana/model.d.ts.map +0 -1
  492. package/iana/validate.d.ts.map +0 -1
  493. package/index.d.ts +0 -6
  494. package/index.d.ts.map +0 -1
  495. package/index.js +0 -56
  496. package/unsd/areas.d.ts +0 -29
  497. package/unsd/areas.d.ts.map +0 -1
  498. package/unsd/areas.js +0 -96
  499. package/unsd/common.d.ts +0 -49
  500. package/unsd/common.d.ts.map +0 -1
  501. package/unsd/common.js +0 -24
  502. package/unsd/csv/converters.d.ts.map +0 -1
  503. package/unsd/csv/converters.js +0 -70
  504. package/unsd/csv/index.d.ts +0 -4
  505. package/unsd/csv/index.d.ts.map +0 -1
  506. package/unsd/csv/model.d.ts +0 -22
  507. package/unsd/csv/model.d.ts.map +0 -1
  508. package/unsd/csv/model.js +0 -24
  509. package/unsd/defaultRegistries.d.ts.map +0 -1
  510. package/unsd/defaultRegistries.js +0 -42
  511. package/unsd/index.d.ts.map +0 -1
  512. package/unsd/index.js +0 -44
  513. package/unsd/regionCodes.d.ts.map +0 -1
  514. package/unsd/regionCodes.js +0 -121
  515. package/unsd/regions.d.ts +0 -21
  516. package/unsd/regions.d.ts.map +0 -1
  517. package/unsd/regions.js +0 -77
  518. package/utils/index.d.ts.map +0 -1
  519. package/utils/jsonHelpers.d.ts.map +0 -1
  520. package/utils/jsonHelpers.js +0 -29
  521. package/utils/public.d.ts +0 -2
  522. package/utils/public.d.ts.map +0 -1
  523. package/utils/public.js +0 -28
  524. package/utils/validationHelpers.d.ts.map +0 -1
  525. package/utils/validationHelpers.js +0 -120
  526. /package/{bcp47 → lib/packlets/bcp47}/bcp47Subtags/converters.d.ts +0 -0
  527. /package/{bcp47 → lib/packlets/bcp47}/bcp47Subtags/index.d.ts +0 -0
  528. /package/{bcp47 → lib/packlets/bcp47}/match/common.d.ts +0 -0
  529. /package/{bcp47 → lib/packlets/bcp47}/match/similarity.d.ts +0 -0
  530. /package/{bcp47 → lib/packlets/bcp47}/normalization/index.d.ts +0 -0
  531. /package/{bcp47 → lib/packlets/bcp47}/overrides/defaultRegistries.d.ts +0 -0
  532. /package/{bcp47 → lib/packlets/bcp47}/overrides/index.d.ts +0 -0
  533. /package/{bcp47 → lib/packlets/bcp47}/validation/index.d.ts +0 -0
  534. /package/{iana → lib/packlets/iana}/common/registeredItems.d.ts +0 -0
  535. /package/{iana → lib/packlets/iana}/common/utils.d.ts +0 -0
  536. /package/{iana → lib/packlets/iana}/converters.d.ts +0 -0
  537. /package/{iana → lib/packlets/iana}/defaultRegistries.d.ts +0 -0
  538. /package/{iana → lib/packlets/iana}/jar/converters.d.ts +0 -0
  539. /package/{iana → lib/packlets/iana}/jar/language-subtags/converters.d.ts +0 -0
  540. /package/{iana → lib/packlets/iana}/jar/language-subtags/model.d.ts +0 -0
  541. /package/{iana → lib/packlets/iana}/jar/language-subtags/registry/converters.d.ts +0 -0
  542. /package/{iana/jar/language-subtags → lib/packlets/iana/jar/language-subtags/registry}/index.d.ts +0 -0
  543. /package/{iana → lib/packlets/iana}/jar/language-subtags/tags/model.d.ts +0 -0
  544. /package/{iana → lib/packlets/iana}/jar/language-subtags/tags/tagValidation.d.ts +0 -0
  545. /package/{iana → lib/packlets/iana}/jar/language-subtags/tags/validate.d.ts +0 -0
  546. /package/{iana → lib/packlets/iana}/jar/model.d.ts +0 -0
  547. /package/{iana → lib/packlets/iana}/language-subtags/common.d.ts +0 -0
  548. /package/{iana → lib/packlets/iana}/language-subtags/validate.d.ts +0 -0
  549. /package/{iana → lib/packlets/iana}/languageRegistries.d.ts +0 -0
  550. /package/{iana → lib/packlets/iana}/model.d.ts +0 -0
  551. /package/{iana → lib/packlets/iana}/validate.d.ts +0 -0
  552. /package/{iana/jar → lib/packlets/unsd/csv}/index.d.ts +0 -0
  553. /package/{unsd → lib/packlets/unsd}/defaultRegistries.d.ts +0 -0
  554. /package/{utils → lib/packlets/utils}/index.d.ts +0 -0
  555. /package/{utils → lib/packlets/utils}/jsonHelpers.d.ts +0 -0
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2022 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
30
+ }) : (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ o[k2] = m[k];
33
+ }));
34
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }) : function(o, v) {
37
+ o["default"] = v;
38
+ });
39
+ var __importStar = (this && this.__importStar) || function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.LanguageSimilarityMatcher = void 0;
48
+ const Iana = __importStar(require("../../iana"));
49
+ const Unsd = __importStar(require("../../unsd"));
50
+ const overrides_1 = require("../overrides");
51
+ const common_1 = require("../common");
52
+ const common_2 = require("./common");
53
+ /**
54
+ * Helper to compare two language tags to determine how closely related they are,
55
+ * applying normalization and language semantics as appropriate.
56
+ * @public
57
+ */
58
+ class LanguageSimilarityMatcher {
59
+ constructor(iana) {
60
+ /* c8 ignore next */
61
+ this.iana = iana !== null && iana !== void 0 ? iana : Iana.DefaultRegistries.languageRegistries;
62
+ this.unsd = Unsd.DefaultRegistries.regionCodes;
63
+ this.overrides = overrides_1.DefaultRegistries.overridesRegistry;
64
+ }
65
+ matchLanguageTags(t1, t2) {
66
+ // no primary tag is either all private or grandfathered, which must match
67
+ // exactly.
68
+ if (!t1.subtags.primaryLanguage || !t2.subtags.primaryLanguage) {
69
+ return t1.toString().toLowerCase() === t2.toString().toLowerCase()
70
+ ? common_2.tagSimilarity.exact
71
+ : common_2.tagSimilarity.none;
72
+ }
73
+ let quality = this.matchPrimaryLanguage(t1, t2);
74
+ quality = quality > common_2.tagSimilarity.none ? Math.min(this.matchExtlang(t1, t2), quality) : quality;
75
+ quality = quality > common_2.tagSimilarity.none ? Math.min(this.matchScript(t1, t2), quality) : quality;
76
+ quality = quality > common_2.tagSimilarity.none ? Math.min(this.matchRegion(t1, t2), quality) : quality;
77
+ quality = quality > common_2.tagSimilarity.none ? Math.min(this.matchVariants(t1, t2), quality) : quality;
78
+ quality = quality > common_2.tagSimilarity.none ? Math.min(this.matchExtensions(t1, t2), quality) : quality;
79
+ quality = quality > common_2.tagSimilarity.none ? Math.min(this.matchPrivateUseTags(t1, t2), quality) : quality;
80
+ return quality;
81
+ }
82
+ matchPrimaryLanguage(lt1, lt2) {
83
+ var _a, _b;
84
+ /* c8 ignore next 2 */
85
+ const l1 = (_a = lt1.subtags.primaryLanguage) === null || _a === void 0 ? void 0 : _a.toLowerCase();
86
+ const l2 = (_b = lt2.subtags.primaryLanguage) === null || _b === void 0 ? void 0 : _b.toLowerCase();
87
+ if (l1 === l2) {
88
+ return common_2.tagSimilarity.exact;
89
+ }
90
+ if (lt1.isUndetermined || lt2.isUndetermined) {
91
+ return common_2.tagSimilarity.undetermined;
92
+ }
93
+ return common_2.tagSimilarity.none;
94
+ }
95
+ matchExtlang(lt1, lt2) {
96
+ var _a, _b;
97
+ if (((_a = lt1.subtags.extlangs) === null || _a === void 0 ? void 0 : _a.length) !== ((_b = lt2.subtags.extlangs) === null || _b === void 0 ? void 0 : _b.length)) {
98
+ return common_2.tagSimilarity.none;
99
+ }
100
+ if (lt1.subtags.extlangs) {
101
+ for (let i = 0; i < lt1.subtags.extlangs.length; i++) {
102
+ if (lt1.subtags.extlangs[i].toLowerCase() !== lt2.subtags.extlangs[i].toLowerCase()) {
103
+ return common_2.tagSimilarity.none;
104
+ }
105
+ }
106
+ }
107
+ return common_2.tagSimilarity.exact;
108
+ }
109
+ matchScript(lt1, lt2) {
110
+ var _a, _b;
111
+ const s1 = (_a = lt1.effectiveScript) === null || _a === void 0 ? void 0 : _a.toLowerCase();
112
+ const s2 = (_b = lt2.effectiveScript) === null || _b === void 0 ? void 0 : _b.toLowerCase();
113
+ if (s1 === s2) {
114
+ return common_2.tagSimilarity.exact;
115
+ }
116
+ if (lt1.isUndetermined || lt2.isUndetermined) {
117
+ return common_2.tagSimilarity.undetermined;
118
+ }
119
+ return common_2.tagSimilarity.none;
120
+ }
121
+ matchRegion(lt1, lt2) {
122
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
123
+ const r1 = (_a = lt1.subtags.region) === null || _a === void 0 ? void 0 : _a.toUpperCase();
124
+ const r2 = (_b = lt2.subtags.region) === null || _b === void 0 ? void 0 : _b.toUpperCase();
125
+ if (r1 === r2) {
126
+ return common_2.tagSimilarity.exact;
127
+ }
128
+ // region 001 is equivalent to neutral (no region)
129
+ if (r1 === common_1.GlobalRegion || r2 === common_1.GlobalRegion) {
130
+ // if one tag is 001 and the other in neutral, exact match
131
+ // otherwise, one tag is 001 so neutral region match
132
+ return !r1 || !r2 ? common_2.tagSimilarity.exact : common_2.tagSimilarity.neutralRegion;
133
+ }
134
+ if (!r1 || !r2) {
135
+ return common_2.tagSimilarity.neutralRegion;
136
+ }
137
+ // macro-region match
138
+ const r1IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r1);
139
+ const r2IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r2);
140
+ if (r1IsMacroRegion || r2IsMacroRegion) {
141
+ let contained;
142
+ let container;
143
+ if (r1IsMacroRegion) {
144
+ container = this.unsd.regions.tryGetRegion(r1);
145
+ contained =
146
+ (_c = this.unsd.areas.tryGetAlpha2Area(r2)) !== null && _c !== void 0 ? _c : this.unsd.tryGetRegionOrArea(r2);
147
+ }
148
+ else {
149
+ container = this.unsd.regions.tryGetRegion(r2);
150
+ contained = this.unsd.areas.tryGetAlpha2Area(r1);
151
+ }
152
+ if (container && contained) {
153
+ if (this.unsd.getIsContained(container, contained)) {
154
+ return common_2.tagSimilarity.macroRegion;
155
+ }
156
+ // if they're both regions, also check to see if the second region contains the
157
+ // first
158
+ if (contained.tier !== 'area' && this.unsd.getIsContained(contained, container)) {
159
+ return common_2.tagSimilarity.macroRegion;
160
+ }
161
+ }
162
+ }
163
+ /* c8 ignore next 6 */
164
+ const o1 = this.overrides.overrides.get((_d = lt1.subtags.primaryLanguage) === null || _d === void 0 ? void 0 : _d.toLowerCase());
165
+ const o2 = this.overrides.overrides.get((_e = lt2.subtags.primaryLanguage) === null || _e === void 0 ? void 0 : _e.toLowerCase());
166
+ // orthographic affinity
167
+ if (o1 && o2) {
168
+ /* c8 ignore next 2 */
169
+ const a1 = (_g = (_f = o1.affinity) === null || _f === void 0 ? void 0 : _f.get(r1)) !== null && _g !== void 0 ? _g : o1.defaultAffinity;
170
+ const a2 = (_j = (_h = o2.affinity) === null || _h === void 0 ? void 0 : _h.get(r2)) !== null && _j !== void 0 ? _j : o2.defaultAffinity;
171
+ if (a1 && a2 && a1 === a2) {
172
+ if (r1 === a1.toUpperCase() || r2 === a2.toUpperCase()) {
173
+ return common_2.tagSimilarity.preferredAffinity;
174
+ }
175
+ return common_2.tagSimilarity.affinity;
176
+ }
177
+ }
178
+ // preferred region
179
+ if ((o1 === null || o1 === void 0 ? void 0 : o1.preferredRegion) === r1 || (o2 === null || o2 === void 0 ? void 0 : o2.preferredRegion) === r2) {
180
+ return common_2.tagSimilarity.preferredRegion;
181
+ }
182
+ return common_2.tagSimilarity.sibling;
183
+ }
184
+ matchVariants(lt1, lt2) {
185
+ var _a, _b;
186
+ if (((_a = lt1.subtags.variants) === null || _a === void 0 ? void 0 : _a.length) !== ((_b = lt2.subtags.variants) === null || _b === void 0 ? void 0 : _b.length)) {
187
+ return common_2.tagSimilarity.region;
188
+ }
189
+ if (lt1.subtags.variants) {
190
+ for (let i = 0; i < lt1.subtags.variants.length; i++) {
191
+ if (lt1.subtags.variants[i].toLowerCase() !== lt2.subtags.variants[i].toLowerCase()) {
192
+ return common_2.tagSimilarity.region;
193
+ }
194
+ }
195
+ }
196
+ return common_2.tagSimilarity.exact;
197
+ }
198
+ matchExtensions(lt1, lt2) {
199
+ var _a, _b;
200
+ if (((_a = lt1.subtags.extensions) === null || _a === void 0 ? void 0 : _a.length) !== ((_b = lt2.subtags.extensions) === null || _b === void 0 ? void 0 : _b.length)) {
201
+ return common_2.tagSimilarity.variant;
202
+ }
203
+ if (lt1.subtags.extensions) {
204
+ for (let i = 0; i < lt1.subtags.extensions.length; i++) {
205
+ if (lt1.subtags.extensions[i].singleton.toLowerCase() !==
206
+ lt2.subtags.extensions[i].singleton.toLowerCase() ||
207
+ lt1.subtags.extensions[i].value.toLowerCase() !== lt2.subtags.extensions[i].value.toLowerCase()) {
208
+ return common_2.tagSimilarity.variant;
209
+ }
210
+ }
211
+ }
212
+ return common_2.tagSimilarity.exact;
213
+ }
214
+ matchPrivateUseTags(lt1, lt2) {
215
+ var _a, _b;
216
+ if (((_a = lt1.subtags.privateUse) === null || _a === void 0 ? void 0 : _a.length) !== ((_b = lt2.subtags.privateUse) === null || _b === void 0 ? void 0 : _b.length)) {
217
+ return common_2.tagSimilarity.variant;
218
+ }
219
+ if (lt1.subtags.privateUse) {
220
+ for (let i = 0; i < lt1.subtags.privateUse.length; i++) {
221
+ if (lt1.subtags.privateUse[i].toLowerCase() !== lt2.subtags.privateUse[i].toLowerCase()) {
222
+ return common_2.tagSimilarity.variant;
223
+ }
224
+ }
225
+ }
226
+ return common_2.tagSimilarity.exact;
227
+ }
228
+ }
229
+ exports.LanguageSimilarityMatcher = LanguageSimilarityMatcher;
230
+ //# sourceMappingURL=similarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/match/similarity.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Unsd from '../../unsd';\n\nimport { DefaultRegistries, OverridesRegistry } from '../overrides';\n\nimport { GlobalRegion } from '../common';\nimport { LanguageTag } from '../languageTag';\nimport { tagSimilarity } from './common';\n\n/**\n * Helper to compare two language tags to determine how closely related they are,\n * applying normalization and language semantics as appropriate.\n * @public\n */\nexport class LanguageSimilarityMatcher {\n public iana: Iana.LanguageRegistries;\n public unsd: Unsd.RegionCodes;\n public overrides: OverridesRegistry;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next */\n this.iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n this.unsd = Unsd.DefaultRegistries.regionCodes;\n this.overrides = DefaultRegistries.overridesRegistry;\n }\n\n public matchLanguageTags(t1: LanguageTag, t2: LanguageTag): number {\n // no primary tag is either all private or grandfathered, which must match\n // exactly.\n if (!t1.subtags.primaryLanguage || !t2.subtags.primaryLanguage) {\n return t1.toString().toLowerCase() === t2.toString().toLowerCase()\n ? tagSimilarity.exact\n : tagSimilarity.none;\n }\n\n let quality = this.matchPrimaryLanguage(t1, t2);\n quality = quality > tagSimilarity.none ? Math.min(this.matchExtlang(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchScript(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchRegion(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchVariants(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchExtensions(t1, t2), quality) : quality;\n quality = quality > tagSimilarity.none ? Math.min(this.matchPrivateUseTags(t1, t2), quality) : quality;\n\n return quality;\n }\n\n public matchPrimaryLanguage(lt1: LanguageTag, lt2: LanguageTag): number {\n /* c8 ignore next 2 */\n const l1 = lt1.subtags.primaryLanguage?.toLowerCase();\n const l2 = lt2.subtags.primaryLanguage?.toLowerCase();\n\n if (l1 === l2) {\n return tagSimilarity.exact;\n }\n\n if (lt1.isUndetermined || lt2.isUndetermined) {\n return tagSimilarity.undetermined;\n }\n\n return tagSimilarity.none;\n }\n\n public matchExtlang(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.extlangs?.length !== lt2.subtags.extlangs?.length) {\n return tagSimilarity.none;\n }\n\n if (lt1.subtags.extlangs) {\n for (let i = 0; i < lt1.subtags.extlangs.length; i++) {\n if (lt1.subtags.extlangs[i].toLowerCase() !== lt2.subtags.extlangs![i].toLowerCase()) {\n return tagSimilarity.none;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchScript(lt1: LanguageTag, lt2: LanguageTag): number {\n const s1 = lt1.effectiveScript?.toLowerCase();\n const s2 = lt2.effectiveScript?.toLowerCase();\n\n if (s1 === s2) {\n return tagSimilarity.exact;\n }\n\n if (lt1.isUndetermined || lt2.isUndetermined) {\n return tagSimilarity.undetermined;\n }\n\n return tagSimilarity.none;\n }\n\n public matchRegion(lt1: LanguageTag, lt2: LanguageTag): number {\n const r1 = lt1.subtags.region?.toUpperCase() as Iana.LanguageSubtags.RegionSubtag;\n const r2 = lt2.subtags.region?.toUpperCase() as Iana.LanguageSubtags.RegionSubtag;\n\n if (r1 === r2) {\n return tagSimilarity.exact;\n }\n\n // region 001 is equivalent to neutral (no region)\n if (r1 === GlobalRegion || r2 === GlobalRegion) {\n // if one tag is 001 and the other in neutral, exact match\n // otherwise, one tag is 001 so neutral region match\n return !r1 || !r2 ? tagSimilarity.exact : tagSimilarity.neutralRegion;\n }\n\n if (!r1 || !r2) {\n return tagSimilarity.neutralRegion;\n }\n\n // macro-region match\n const r1IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r1);\n const r2IsMacroRegion = Iana.Validate.unM49RegionCode.isWellFormed(r2);\n if (r1IsMacroRegion || r2IsMacroRegion) {\n let contained: Unsd.ICountryOrArea | Unsd.Region | undefined;\n let container: Unsd.Region | undefined;\n if (r1IsMacroRegion) {\n container = this.unsd.regions.tryGetRegion(r1 as unknown as Iana.Model.UnM49RegionCode);\n contained =\n this.unsd.areas.tryGetAlpha2Area(r2 as unknown as Iana.Model.IsoAlpha2RegionCode) ??\n this.unsd.tryGetRegionOrArea(r2 as unknown as Iana.Model.UnM49RegionCode);\n } else {\n container = this.unsd.regions.tryGetRegion(r2 as unknown as Iana.Model.UnM49RegionCode);\n contained = this.unsd.areas.tryGetAlpha2Area(r1 as unknown as Iana.Model.IsoAlpha2RegionCode);\n }\n if (container && contained) {\n if (this.unsd.getIsContained(container, contained)) {\n return tagSimilarity.macroRegion;\n }\n\n // if they're both regions, also check to see if the second region contains the\n // first\n if (contained.tier !== 'area' && this.unsd.getIsContained(contained, container)) {\n return tagSimilarity.macroRegion;\n }\n }\n }\n\n /* c8 ignore next 6 */\n const o1 = this.overrides.overrides.get(\n lt1.subtags.primaryLanguage?.toLowerCase() as Iana.LanguageSubtags.LanguageSubtag\n );\n const o2 = this.overrides.overrides.get(\n lt2.subtags.primaryLanguage?.toLowerCase() as Iana.LanguageSubtags.LanguageSubtag\n );\n\n // orthographic affinity\n if (o1 && o2) {\n /* c8 ignore next 2 */\n const a1 = o1.affinity?.get(r1) ?? o1.defaultAffinity;\n const a2 = o2.affinity?.get(r2) ?? o2.defaultAffinity;\n if (a1 && a2 && a1 === a2) {\n if (r1 === a1.toUpperCase() || r2 === a2.toUpperCase()) {\n return tagSimilarity.preferredAffinity;\n }\n return tagSimilarity.affinity;\n }\n }\n\n // preferred region\n if (o1?.preferredRegion === r1 || o2?.preferredRegion === r2) {\n return tagSimilarity.preferredRegion;\n }\n\n return tagSimilarity.sibling;\n }\n\n public matchVariants(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.variants?.length !== lt2.subtags.variants?.length) {\n return tagSimilarity.region;\n }\n\n if (lt1.subtags.variants) {\n for (let i = 0; i < lt1.subtags.variants.length; i++) {\n if (lt1.subtags.variants[i].toLowerCase() !== lt2.subtags.variants![i].toLowerCase()) {\n return tagSimilarity.region;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchExtensions(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.extensions?.length !== lt2.subtags.extensions?.length) {\n return tagSimilarity.variant;\n }\n\n if (lt1.subtags.extensions) {\n for (let i = 0; i < lt1.subtags.extensions.length; i++) {\n if (\n lt1.subtags.extensions[i].singleton.toLowerCase() !==\n lt2.subtags.extensions![i].singleton.toLowerCase() ||\n lt1.subtags.extensions[i].value.toLowerCase() !== lt2.subtags.extensions![i].value.toLowerCase()\n ) {\n return tagSimilarity.variant;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n\n public matchPrivateUseTags(lt1: LanguageTag, lt2: LanguageTag): number {\n if (lt1.subtags.privateUse?.length !== lt2.subtags.privateUse?.length) {\n return tagSimilarity.variant;\n }\n\n if (lt1.subtags.privateUse) {\n for (let i = 0; i < lt1.subtags.privateUse.length; i++) {\n if (lt1.subtags.privateUse[i].toLowerCase() !== lt2.subtags.privateUse![i].toLowerCase()) {\n return tagSimilarity.variant;\n }\n }\n }\n\n return tagSimilarity.exact;\n }\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import * as Iana from '../../iana';
2
+ import { Result } from '@fgv/ts-utils';
3
+ import { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';
4
+ import { IExtensionSubtagValue, ISubtags } from '../common';
5
+ import { TagNormalization } from './common';
6
+ /**
7
+ * @public
8
+ */
9
+ export interface ITagNormalizer {
10
+ readonly normalization: TagNormalization;
11
+ processSubtags(subtags: ISubtags): Result<ISubtags>;
12
+ }
13
+ /**
14
+ * @public
15
+ */
16
+ export declare abstract class TagNormalizerBase {
17
+ protected readonly _iana: Iana.LanguageRegistries;
18
+ abstract readonly normalization: TagNormalization;
19
+ constructor(iana?: Iana.LanguageRegistries);
20
+ processSubtags(subtags: ISubtags): Result<ISubtags>;
21
+ protected _basicPostValidation(subtags: ISubtags): Result<ISubtags>;
22
+ protected _postValidate(subtags: ISubtags): Result<ISubtags>;
23
+ protected _processExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined>;
24
+ protected _verifyUnique<T, TK extends string>(description: string, items: T[] | undefined, getKey: (item: T) => TK): Result<T[] | undefined>;
25
+ protected abstract _processLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined>;
26
+ protected abstract _processExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined>;
27
+ protected abstract _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined>;
28
+ protected abstract _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined>;
29
+ protected abstract _processVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined>;
30
+ protected abstract _processExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton>;
31
+ protected abstract _processExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag>;
32
+ protected abstract _processPrivateUseTags(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined>;
33
+ protected abstract _processGrandfatheredTags(subtags: ISubtags): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined>;
34
+ }
35
+ //# sourceMappingURL=baseNormalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseNormalizer.d.ts","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/baseNormalizer.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,MAAM,EAAyD,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAmB,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAC;IAEzC,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;CACrD;AAED;;GAEG;AACH,8BAAsB,iBAAiB;IACrC,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC;IAElD,kBAAyB,aAAa,EAAE,gBAAgB,CAAC;gBAEtC,IAAI,CAAC,EAAE,IAAI,CAAC,kBAAkB;IAK1C,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAkB1D,SAAS,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAiBnE,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAI5D,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,qBAAqB,EAAE,GAAG,SAAS,CAAC;IAc5F,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,SAAS,MAAM,EAC1C,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,EAAE,GAAG,SAAS,EACtB,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GACtB,MAAM,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC;IAkB1B,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CACjC,OAAO,EAAE,QAAQ,GAChB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,GAAG,SAAS,CAAC;IAC1D,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CACjC,OAAO,EAAE,QAAQ,GAChB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC;IAC3D,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC;IAC3G,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC;IAC3G,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CACjC,OAAO,EAAE,QAAQ,GAChB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC;IAC3D,SAAS,CAAC,QAAQ,CAAC,0BAA0B,CAAC,SAAS,EAAE,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACxG,SAAS,CAAC,QAAQ,CAAC,4BAA4B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;IAChG,SAAS,CAAC,QAAQ,CAAC,sBAAsB,CACvC,OAAO,EAAE,QAAQ,GAChB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,GAAG,SAAS,CAAC;IACnE,SAAS,CAAC,QAAQ,CAAC,yBAAyB,CAC1C,OAAO,EAAE,QAAQ,GAChB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,GAAG,SAAS,CAAC;CAC7D"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2022 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
30
+ }) : (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ o[k2] = m[k];
33
+ }));
34
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }) : function(o, v) {
37
+ o["default"] = v;
38
+ });
39
+ var __importStar = (this && this.__importStar) || function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.TagNormalizerBase = void 0;
48
+ const Iana = __importStar(require("../../iana"));
49
+ const ts_utils_1 = require("@fgv/ts-utils");
50
+ const common_1 = require("../common");
51
+ /**
52
+ * @public
53
+ */
54
+ class TagNormalizerBase {
55
+ constructor(iana) {
56
+ /* c8 ignore next - dependency injection primarily for test */
57
+ this._iana = iana !== null && iana !== void 0 ? iana : Iana.DefaultRegistries.languageRegistries;
58
+ }
59
+ processSubtags(subtags) {
60
+ return (0, ts_utils_1.populateObject)({
61
+ primaryLanguage: () => this._processLanguage(subtags),
62
+ extlangs: () => this._processExtlangs(subtags),
63
+ script: () => this._processScript(subtags),
64
+ region: () => this._processRegion(subtags),
65
+ variants: () => this._processVariants(subtags),
66
+ extensions: () => this._processExtensions(subtags),
67
+ privateUse: () => this._processPrivateUseTags(subtags),
68
+ grandfathered: () => this._processGrandfatheredTags(subtags)
69
+ }, { suppressUndefined: true }).onSuccess((processed) => {
70
+ return this._postValidate(processed);
71
+ });
72
+ }
73
+ _basicPostValidation(subtags) {
74
+ /* c8 ignore next 7 - any validation whatsoever catches these so should never happen in practice */
75
+ if (subtags.primaryLanguage === undefined &&
76
+ subtags.grandfathered === undefined &&
77
+ subtags.privateUse === undefined) {
78
+ return (0, ts_utils_1.fail)(`${(0, common_1.subtagsToString)(subtags)}: missing primary language subtag.`);
79
+ }
80
+ /* c8 ignore next 3 - any validation whatsoever catches these so should never happen in practice */
81
+ if (subtags.extlangs && subtags.extlangs.length > 3) {
82
+ return (0, ts_utils_1.fail)(`${(0, common_1.subtagsToString)(subtags)}: too many extlang subtags`);
83
+ }
84
+ return (0, ts_utils_1.succeed)(subtags);
85
+ }
86
+ _postValidate(subtags) {
87
+ return this._basicPostValidation(subtags);
88
+ }
89
+ _processExtensions(subtags) {
90
+ if (subtags.extensions) {
91
+ return (0, ts_utils_1.mapResults)(subtags.extensions.map((ex) => {
92
+ return (0, ts_utils_1.populateObject)({
93
+ singleton: () => this._processExtensionSingleton(ex.singleton),
94
+ value: () => this._processExtensionSubtagValue(ex.value)
95
+ });
96
+ }));
97
+ }
98
+ return (0, ts_utils_1.succeed)(subtags.extensions);
99
+ }
100
+ _verifyUnique(description, items, getKey) {
101
+ if (items) {
102
+ const present = new Set();
103
+ return (0, ts_utils_1.allSucceed)(items.map((i) => {
104
+ const key = getKey(i);
105
+ if (present.has(key)) {
106
+ return (0, ts_utils_1.fail)(`${key}: duplicate ${description}`);
107
+ }
108
+ present.add(key);
109
+ return (0, ts_utils_1.succeed)(key);
110
+ }), items);
111
+ }
112
+ return (0, ts_utils_1.succeed)(items);
113
+ }
114
+ }
115
+ exports.TagNormalizerBase = TagNormalizerBase;
116
+ //# sourceMappingURL=baseNormalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/baseNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\n\nimport { Result, allSucceed, fail, mapResults, populateObject, succeed } from '@fgv/ts-utils';\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\nimport { IExtensionSubtagValue, ISubtags, subtagsToString } from '../common';\nimport { TagNormalization } from './common';\n\n/**\n * @public\n */\nexport interface ITagNormalizer {\n readonly normalization: TagNormalization;\n\n processSubtags(subtags: ISubtags): Result<ISubtags>;\n}\n\n/**\n * @public\n */\nexport abstract class TagNormalizerBase {\n protected readonly _iana: Iana.LanguageRegistries;\n\n public abstract readonly normalization: TagNormalization;\n\n public constructor(iana?: Iana.LanguageRegistries) {\n /* c8 ignore next - dependency injection primarily for test */\n this._iana = iana ?? Iana.DefaultRegistries.languageRegistries;\n }\n\n public processSubtags(subtags: ISubtags): Result<ISubtags> {\n return populateObject<ISubtags>(\n {\n primaryLanguage: () => this._processLanguage(subtags),\n extlangs: () => this._processExtlangs(subtags),\n script: () => this._processScript(subtags),\n region: () => this._processRegion(subtags),\n variants: () => this._processVariants(subtags),\n extensions: () => this._processExtensions(subtags),\n privateUse: () => this._processPrivateUseTags(subtags),\n grandfathered: () => this._processGrandfatheredTags(subtags)\n },\n { suppressUndefined: true }\n ).onSuccess((processed) => {\n return this._postValidate(processed);\n });\n }\n\n protected _basicPostValidation(subtags: ISubtags): Result<ISubtags> {\n /* c8 ignore next 7 - any validation whatsoever catches these so should never happen in practice */\n if (\n subtags.primaryLanguage === undefined &&\n subtags.grandfathered === undefined &&\n subtags.privateUse === undefined\n ) {\n return fail(`${subtagsToString(subtags)}: missing primary language subtag.`);\n }\n\n /* c8 ignore next 3 - any validation whatsoever catches these so should never happen in practice */\n if (subtags.extlangs && subtags.extlangs.length > 3) {\n return fail(`${subtagsToString(subtags)}: too many extlang subtags`);\n }\n return succeed(subtags);\n }\n\n protected _postValidate(subtags: ISubtags): Result<ISubtags> {\n return this._basicPostValidation(subtags);\n }\n\n protected _processExtensions(subtags: ISubtags): Result<IExtensionSubtagValue[] | undefined> {\n if (subtags.extensions) {\n return mapResults(\n subtags.extensions.map((ex) => {\n return populateObject<IExtensionSubtagValue>({\n singleton: () => this._processExtensionSingleton(ex.singleton),\n value: () => this._processExtensionSubtagValue(ex.value)\n });\n })\n );\n }\n return succeed(subtags.extensions);\n }\n\n protected _verifyUnique<T, TK extends string>(\n description: string,\n items: T[] | undefined,\n getKey: (item: T) => TK\n ): Result<T[] | undefined> {\n if (items) {\n const present = new Set<TK>();\n return allSucceed(\n items.map((i) => {\n const key = getKey(i);\n if (present.has(key)) {\n return fail(`${key}: duplicate ${description}`);\n }\n present.add(key);\n return succeed(key);\n }),\n items\n );\n }\n return succeed(items);\n }\n\n protected abstract _processLanguage(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.LanguageSubtag | undefined>;\n protected abstract _processExtlangs(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined>;\n protected abstract _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined>;\n protected abstract _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined>;\n protected abstract _processVariants(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined>;\n protected abstract _processExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton>;\n protected abstract _processExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag>;\n protected abstract _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined>;\n protected abstract _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined>;\n}\n"]}
@@ -0,0 +1,22 @@
1
+ import * as Iana from '../../iana';
2
+ import { Result } from '@fgv/ts-utils';
3
+ import { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';
4
+ import { ISubtags } from '../common';
5
+ import { TagNormalizerBase } from './baseNormalizer';
6
+ import { TagNormalization } from './common';
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare class CanonicalNormalizer extends TagNormalizerBase {
11
+ readonly normalization: TagNormalization;
12
+ protected _processLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined>;
13
+ protected _processExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined>;
14
+ protected _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined>;
15
+ protected _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined>;
16
+ protected _processVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined>;
17
+ protected _processExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton>;
18
+ protected _processExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag>;
19
+ protected _processPrivateUseTags(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined>;
20
+ protected _processGrandfatheredTags(subtags: ISubtags): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined>;
21
+ }
22
+ //# sourceMappingURL=canonicalNormalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalNormalizer.d.ts","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/canonicalNormalizer.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,IAAI,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,MAAM,EAAuB,MAAM,eAAe,CAAC;AAE5D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB;IACxD,SAAgB,aAAa,EAAE,gBAAgB,CAAe;IAE9D,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,GAAG,SAAS,CAAC;IAOtG,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC;IAOvG,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC;IAOlG,SAAS,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC;IAOlG,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC;IAOvG,SAAS,CAAC,0BAA0B,CAAC,SAAS,EAAE,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAI/F,SAAS,CAAC,4BAA4B,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;IAIvF,SAAS,CAAC,sBAAsB,CAC9B,OAAO,EAAE,QAAQ,GAChB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,GAAG,SAAS,CAAC;IAUnE,SAAS,CAAC,yBAAyB,CACjC,OAAO,EAAE,QAAQ,GAChB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,GAAG,SAAS,CAAC;CAM7D"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2022 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ var desc = Object.getOwnPropertyDescriptor(m, k);
26
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
27
+ desc = { enumerable: true, get: function() { return m[k]; } };
28
+ }
29
+ Object.defineProperty(o, k2, desc);
30
+ }) : (function(o, m, k, k2) {
31
+ if (k2 === undefined) k2 = k;
32
+ o[k2] = m[k];
33
+ }));
34
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
35
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
36
+ }) : function(o, v) {
37
+ o["default"] = v;
38
+ });
39
+ var __importStar = (this && this.__importStar) || function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.CanonicalNormalizer = void 0;
48
+ const Iana = __importStar(require("../../iana"));
49
+ const Bcp47Subtags = __importStar(require("../bcp47Subtags"));
50
+ const ts_utils_1 = require("@fgv/ts-utils");
51
+ const baseNormalizer_1 = require("./baseNormalizer");
52
+ /**
53
+ * @internal
54
+ */
55
+ class CanonicalNormalizer extends baseNormalizer_1.TagNormalizerBase {
56
+ constructor() {
57
+ super(...arguments);
58
+ this.normalization = 'canonical';
59
+ }
60
+ _processLanguage(subtags) {
61
+ if (subtags.primaryLanguage) {
62
+ return this._iana.subtags.languages.toCanonical(subtags.primaryLanguage);
63
+ }
64
+ return (0, ts_utils_1.succeed)(subtags.primaryLanguage);
65
+ }
66
+ _processExtlangs(subtags) {
67
+ if (subtags.extlangs) {
68
+ return (0, ts_utils_1.mapResults)(subtags.extlangs.map((e) => this._iana.subtags.extlangs.toCanonical(e)));
69
+ }
70
+ return (0, ts_utils_1.succeed)(undefined);
71
+ }
72
+ _processScript(subtags) {
73
+ if (subtags.script) {
74
+ return this._iana.subtags.scripts.toCanonical(subtags.script);
75
+ }
76
+ return (0, ts_utils_1.succeed)(undefined);
77
+ }
78
+ _processRegion(subtags) {
79
+ if (subtags.region) {
80
+ return this._iana.subtags.regions.toCanonical(subtags.region);
81
+ }
82
+ return (0, ts_utils_1.succeed)(undefined);
83
+ }
84
+ _processVariants(subtags) {
85
+ if (subtags.variants) {
86
+ return (0, ts_utils_1.mapResults)(subtags.variants.map((v) => this._iana.subtags.variants.toCanonical(v)));
87
+ }
88
+ return (0, ts_utils_1.succeed)(undefined);
89
+ }
90
+ _processExtensionSingleton(singleton) {
91
+ return this._iana.extensions.extensions.toCanonical(singleton);
92
+ }
93
+ _processExtensionSubtagValue(value) {
94
+ return Bcp47Subtags.Validate.extensionSubtag.toCanonical(value);
95
+ }
96
+ _processPrivateUseTags(subtags) {
97
+ if (subtags.privateUse) {
98
+ const merged = subtags.privateUse.join('-');
99
+ return Iana.LanguageSubtags.Validate.extendedLanguageRange.toCanonical(merged).onSuccess((canon) => {
100
+ return (0, ts_utils_1.succeed)(canon.split('-'));
101
+ });
102
+ }
103
+ return (0, ts_utils_1.succeed)(subtags.privateUse);
104
+ }
105
+ _processGrandfatheredTags(subtags) {
106
+ if (subtags.grandfathered) {
107
+ return this._iana.subtags.grandfathered.toCanonical(subtags.grandfathered);
108
+ }
109
+ return (0, ts_utils_1.succeed)(undefined);
110
+ }
111
+ }
112
+ exports.CanonicalNormalizer = CanonicalNormalizer;
113
+ //# sourceMappingURL=canonicalNormalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalNormalizer.js","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/canonicalNormalizer.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2022 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport * as Iana from '../../iana';\nimport * as Bcp47Subtags from '../bcp47Subtags';\n\nimport { Result, mapResults, succeed } from '@fgv/ts-utils';\n\nimport { ExtensionSingleton, ExtensionSubtag } from '../bcp47Subtags/model';\nimport { ISubtags } from '../common';\nimport { TagNormalizerBase } from './baseNormalizer';\nimport { TagNormalization } from './common';\n\n/**\n * @internal\n */\nexport class CanonicalNormalizer extends TagNormalizerBase {\n public readonly normalization: TagNormalization = 'canonical';\n\n protected _processLanguage(subtags: ISubtags): Result<Iana.LanguageSubtags.LanguageSubtag | undefined> {\n if (subtags.primaryLanguage) {\n return this._iana.subtags.languages.toCanonical(subtags.primaryLanguage);\n }\n return succeed(subtags.primaryLanguage);\n }\n\n protected _processExtlangs(subtags: ISubtags): Result<Iana.LanguageSubtags.ExtLangSubtag[] | undefined> {\n if (subtags.extlangs) {\n return mapResults(subtags.extlangs.map((e) => this._iana.subtags.extlangs.toCanonical(e)));\n }\n return succeed(undefined);\n }\n\n protected _processScript(subtags: ISubtags): Result<Iana.LanguageSubtags.ScriptSubtag | undefined> {\n if (subtags.script) {\n return this._iana.subtags.scripts.toCanonical(subtags.script);\n }\n return succeed(undefined);\n }\n\n protected _processRegion(subtags: ISubtags): Result<Iana.LanguageSubtags.RegionSubtag | undefined> {\n if (subtags.region) {\n return this._iana.subtags.regions.toCanonical(subtags.region);\n }\n return succeed(undefined);\n }\n\n protected _processVariants(subtags: ISubtags): Result<Iana.LanguageSubtags.VariantSubtag[] | undefined> {\n if (subtags.variants) {\n return mapResults(subtags.variants.map((v) => this._iana.subtags.variants.toCanonical(v)));\n }\n return succeed(undefined);\n }\n\n protected _processExtensionSingleton(singleton: ExtensionSingleton): Result<ExtensionSingleton> {\n return this._iana.extensions.extensions.toCanonical(singleton);\n }\n\n protected _processExtensionSubtagValue(value: ExtensionSubtag): Result<ExtensionSubtag> {\n return Bcp47Subtags.Validate.extensionSubtag.toCanonical(value);\n }\n\n protected _processPrivateUseTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.ExtendedLanguageRange[] | undefined> {\n if (subtags.privateUse) {\n const merged = subtags.privateUse.join('-');\n return Iana.LanguageSubtags.Validate.extendedLanguageRange.toCanonical(merged).onSuccess((canon) => {\n return succeed(canon.split('-') as Iana.LanguageSubtags.ExtendedLanguageRange[]);\n });\n }\n return succeed(subtags.privateUse);\n }\n\n protected _processGrandfatheredTags(\n subtags: ISubtags\n ): Result<Iana.LanguageSubtags.GrandfatheredTag | undefined> {\n if (subtags.grandfathered) {\n return this._iana.subtags.grandfathered.toCanonical(subtags.grandfathered);\n }\n return succeed(undefined);\n }\n}\n"]}
@@ -7,7 +7,7 @@ export type TagNormalization = 'unknown' | 'none' | 'canonical' | 'preferred';
7
7
  * Determines which of two normalization ranks is most normalized.
8
8
  * @param n1 - The first {@link TagNormalization} to be compared.
9
9
  * @param n2 - The second {@link TagNormalization} to me compared.
10
- * @returns `1' if `n1` is more normalized, `-1` if `n2` is more
10
+ * @returns `1` if `n1` is more normalized, `-1` if `n2` is more
11
11
  * normalized, or `0` if they are identical.
12
12
  * @public
13
13
  */
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/packlets/bcp47/normalization/common.ts"],"names":[],"mappings":"AAsBA;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;AA8B9E;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAO3F;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,gBAAgB,GAAG,gBAAgB,CAG3F"}