n2words 3.0.0 → 4.0.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 (488) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/LICENSE +1 -1
  3. package/README.md +64 -184
  4. package/dist/am-ET.js +2 -0
  5. package/dist/am-ET.umd.js +2 -0
  6. package/dist/am-Latn-ET.js +2 -0
  7. package/dist/am-Latn-ET.umd.js +2 -0
  8. package/dist/ar-SA.js +2 -0
  9. package/dist/ar-SA.umd.js +2 -0
  10. package/dist/az-AZ.js +2 -0
  11. package/dist/az-AZ.umd.js +2 -0
  12. package/dist/bn-BD.js +2 -0
  13. package/dist/bn-BD.umd.js +2 -0
  14. package/dist/cs-CZ.js +2 -0
  15. package/dist/cs-CZ.umd.js +2 -0
  16. package/dist/da-DK.js +2 -0
  17. package/dist/da-DK.umd.js +2 -0
  18. package/dist/de-DE.js +2 -0
  19. package/dist/de-DE.umd.js +2 -0
  20. package/dist/el-GR.js +2 -0
  21. package/dist/el-GR.umd.js +2 -0
  22. package/dist/en-AU.js +2 -0
  23. package/dist/en-AU.umd.js +2 -0
  24. package/dist/en-BD.js +2 -0
  25. package/dist/en-BD.umd.js +2 -0
  26. package/dist/en-CA.js +2 -0
  27. package/dist/en-CA.umd.js +2 -0
  28. package/dist/en-GB.js +2 -0
  29. package/dist/en-GB.umd.js +2 -0
  30. package/dist/en-GH.js +2 -0
  31. package/dist/en-GH.umd.js +2 -0
  32. package/dist/en-IE.js +2 -0
  33. package/dist/en-IE.umd.js +2 -0
  34. package/dist/en-IN.js +2 -0
  35. package/dist/en-IN.umd.js +2 -0
  36. package/dist/en-KE.js +2 -0
  37. package/dist/en-KE.umd.js +2 -0
  38. package/dist/en-MY.js +2 -0
  39. package/dist/en-MY.umd.js +2 -0
  40. package/dist/en-NG.js +2 -0
  41. package/dist/en-NG.umd.js +2 -0
  42. package/dist/en-NZ.js +2 -0
  43. package/dist/en-NZ.umd.js +2 -0
  44. package/dist/en-PH.js +2 -0
  45. package/dist/en-PH.umd.js +2 -0
  46. package/dist/en-PK.js +2 -0
  47. package/dist/en-PK.umd.js +2 -0
  48. package/dist/en-SG.js +2 -0
  49. package/dist/en-SG.umd.js +2 -0
  50. package/dist/en-US.js +2 -0
  51. package/dist/en-US.umd.js +2 -0
  52. package/dist/en-ZA.js +2 -0
  53. package/dist/en-ZA.umd.js +2 -0
  54. package/dist/es-ES.js +2 -0
  55. package/dist/es-ES.umd.js +2 -0
  56. package/dist/es-MX.js +2 -0
  57. package/dist/es-MX.umd.js +2 -0
  58. package/dist/es-US.js +2 -0
  59. package/dist/es-US.umd.js +2 -0
  60. package/dist/fa-IR.js +2 -0
  61. package/dist/fa-IR.umd.js +2 -0
  62. package/dist/fi-FI.js +2 -0
  63. package/dist/fi-FI.umd.js +2 -0
  64. package/dist/fil-PH.js +2 -0
  65. package/dist/fil-PH.umd.js +2 -0
  66. package/dist/fr-BE.js +2 -0
  67. package/dist/fr-BE.umd.js +2 -0
  68. package/dist/fr-FR.js +2 -0
  69. package/dist/fr-FR.umd.js +2 -0
  70. package/dist/gu-IN.js +2 -0
  71. package/dist/gu-IN.umd.js +2 -0
  72. package/dist/ha-NG.js +2 -0
  73. package/dist/ha-NG.umd.js +2 -0
  74. package/dist/hbo-IL.js +2 -0
  75. package/dist/hbo-IL.umd.js +2 -0
  76. package/dist/he-IL.js +2 -0
  77. package/dist/he-IL.umd.js +2 -0
  78. package/dist/hi-IN.js +2 -0
  79. package/dist/hi-IN.umd.js +2 -0
  80. package/dist/hr-HR.js +2 -0
  81. package/dist/hr-HR.umd.js +2 -0
  82. package/dist/hu-HU.js +2 -0
  83. package/dist/hu-HU.umd.js +2 -0
  84. package/dist/id-ID.js +2 -0
  85. package/dist/id-ID.umd.js +2 -0
  86. package/dist/it-IT.js +2 -0
  87. package/dist/it-IT.umd.js +2 -0
  88. package/dist/ja-JP.js +2 -0
  89. package/dist/ja-JP.umd.js +2 -0
  90. package/dist/ka-GE.js +2 -0
  91. package/dist/ka-GE.umd.js +2 -0
  92. package/dist/kn-IN.js +2 -0
  93. package/dist/kn-IN.umd.js +2 -0
  94. package/dist/ko-KR.js +2 -0
  95. package/dist/ko-KR.umd.js +2 -0
  96. package/dist/lt-LT.js +2 -0
  97. package/dist/lt-LT.umd.js +2 -0
  98. package/dist/lv-LV.js +2 -0
  99. package/dist/lv-LV.umd.js +2 -0
  100. package/dist/mr-IN.js +2 -0
  101. package/dist/mr-IN.umd.js +2 -0
  102. package/dist/ms-MY.js +2 -0
  103. package/dist/ms-MY.umd.js +2 -0
  104. package/dist/nb-NO.js +2 -0
  105. package/dist/nb-NO.umd.js +2 -0
  106. package/dist/nl-NL.js +2 -0
  107. package/dist/nl-NL.umd.js +2 -0
  108. package/dist/pa-IN.js +2 -0
  109. package/dist/pa-IN.umd.js +2 -0
  110. package/dist/pl-PL.js +2 -0
  111. package/dist/pl-PL.umd.js +2 -0
  112. package/dist/pt-PT.js +2 -0
  113. package/dist/pt-PT.umd.js +2 -0
  114. package/dist/ro-RO.js +2 -0
  115. package/dist/ro-RO.umd.js +2 -0
  116. package/dist/ru-RU.js +2 -0
  117. package/dist/ru-RU.umd.js +2 -0
  118. package/dist/sr-Cyrl-RS.js +2 -0
  119. package/dist/sr-Cyrl-RS.umd.js +2 -0
  120. package/dist/sr-Latn-RS.js +2 -0
  121. package/dist/sr-Latn-RS.umd.js +2 -0
  122. package/dist/sv-SE.js +2 -0
  123. package/dist/sv-SE.umd.js +2 -0
  124. package/dist/sw-KE.js +2 -0
  125. package/dist/sw-KE.umd.js +2 -0
  126. package/dist/ta-IN.js +2 -0
  127. package/dist/ta-IN.umd.js +2 -0
  128. package/dist/te-IN.js +2 -0
  129. package/dist/te-IN.umd.js +2 -0
  130. package/dist/th-TH.js +2 -0
  131. package/dist/th-TH.umd.js +2 -0
  132. package/dist/tr-TR.js +2 -0
  133. package/dist/tr-TR.umd.js +2 -0
  134. package/dist/uk-UA.js +2 -0
  135. package/dist/uk-UA.umd.js +2 -0
  136. package/dist/ur-PK.js +2 -0
  137. package/dist/ur-PK.umd.js +2 -0
  138. package/dist/vi-VN.js +2 -0
  139. package/dist/vi-VN.umd.js +2 -0
  140. package/dist/yo-NG.js +2 -0
  141. package/dist/yo-NG.umd.js +2 -0
  142. package/dist/zh-Hans-CN.js +2 -0
  143. package/dist/zh-Hans-CN.umd.js +2 -0
  144. package/dist/zh-Hant-TW.js +2 -0
  145. package/dist/zh-Hant-TW.umd.js +2 -0
  146. package/package.json +47 -82
  147. package/src/am-ET.d.ts +40 -0
  148. package/src/am-ET.js +269 -0
  149. package/src/am-Latn-ET.d.ts +35 -0
  150. package/src/am-Latn-ET.js +264 -0
  151. package/src/ar-SA.d.ts +49 -0
  152. package/{lib/languages/ar.js → src/ar-SA.js} +177 -15
  153. package/src/az-AZ.d.ts +37 -0
  154. package/src/az-AZ.js +312 -0
  155. package/src/bn-BD.d.ts +36 -0
  156. package/src/bn-BD.js +270 -0
  157. package/src/cs-CZ.d.ts +49 -0
  158. package/{lib/languages/cs.js → src/cs-CZ.js} +249 -40
  159. package/src/da-DK.d.ts +44 -0
  160. package/{lib/languages/da.js → src/da-DK.js} +136 -23
  161. package/src/de-DE.d.ts +57 -0
  162. package/src/de-DE.js +603 -0
  163. package/src/el-GR.d.ts +40 -0
  164. package/src/el-GR.js +418 -0
  165. package/src/en-AU.d.ts +47 -0
  166. package/src/en-AU.js +423 -0
  167. package/src/en-BD.d.ts +49 -0
  168. package/src/en-BD.js +415 -0
  169. package/src/en-CA.d.ts +63 -0
  170. package/src/en-CA.js +518 -0
  171. package/src/en-GB.d.ts +56 -0
  172. package/src/en-GB.js +469 -0
  173. package/src/en-GH.d.ts +11 -0
  174. package/src/en-GH.js +345 -0
  175. package/src/en-IE.d.ts +56 -0
  176. package/src/en-IE.js +479 -0
  177. package/src/en-IN.d.ts +49 -0
  178. package/src/en-IN.js +415 -0
  179. package/src/en-KE.d.ts +11 -0
  180. package/src/en-KE.js +345 -0
  181. package/src/en-MY.d.ts +11 -0
  182. package/src/en-MY.js +347 -0
  183. package/src/en-NG.d.ts +56 -0
  184. package/src/en-NG.js +479 -0
  185. package/src/en-NZ.d.ts +11 -0
  186. package/src/en-NZ.js +375 -0
  187. package/src/en-PH.d.ts +11 -0
  188. package/src/en-PH.js +345 -0
  189. package/src/en-PK.d.ts +49 -0
  190. package/src/en-PK.js +415 -0
  191. package/src/en-SG.d.ts +11 -0
  192. package/src/en-SG.js +345 -0
  193. package/src/en-US.d.ts +63 -0
  194. package/src/en-US.js +516 -0
  195. package/src/en-ZA.d.ts +56 -0
  196. package/src/en-ZA.js +478 -0
  197. package/src/es-ES.d.ts +65 -0
  198. package/src/es-ES.js +541 -0
  199. package/src/es-MX.d.ts +58 -0
  200. package/{lib/languages/es.js → src/es-MX.js} +237 -47
  201. package/src/es-US.d.ts +58 -0
  202. package/src/es-US.js +446 -0
  203. package/src/fa-IR.d.ts +38 -0
  204. package/src/fa-IR.js +246 -0
  205. package/src/fi-FI.d.ts +46 -0
  206. package/src/fi-FI.js +379 -0
  207. package/src/fil-PH.d.ts +37 -0
  208. package/{lib/languages/fil.js → src/fil-PH.js} +149 -24
  209. package/src/fr-BE.d.ts +49 -0
  210. package/src/fr-BE.js +453 -0
  211. package/src/fr-FR.d.ts +63 -0
  212. package/{lib/languages/fr.js → src/fr-FR.js} +200 -47
  213. package/src/gu-IN.d.ts +35 -0
  214. package/src/gu-IN.js +259 -0
  215. package/src/ha-NG.d.ts +37 -0
  216. package/{lib/languages/ha.js → src/ha-NG.js} +110 -16
  217. package/src/hbo-IL.d.ts +39 -0
  218. package/{lib/languages/hbo.js → src/hbo-IL.js} +217 -43
  219. package/src/he-IL.d.ts +37 -0
  220. package/src/he-IL.js +537 -0
  221. package/src/hi-IN.d.ts +36 -0
  222. package/src/hi-IN.js +280 -0
  223. package/src/hr-HR.d.ts +42 -0
  224. package/src/hr-HR.js +463 -0
  225. package/src/hu-HU.d.ts +38 -0
  226. package/{lib/languages/hu.js → src/hu-HU.js} +164 -6
  227. package/src/id-ID.d.ts +38 -0
  228. package/{lib/languages/id.js → src/id-ID.js} +106 -20
  229. package/src/it-IT.d.ts +59 -0
  230. package/src/it-IT.js +506 -0
  231. package/src/ja-JP.d.ts +49 -0
  232. package/{lib/languages/ja.js → src/ja-JP.js} +119 -32
  233. package/src/ka-GE.d.ts +44 -0
  234. package/src/ka-GE.js +393 -0
  235. package/src/kn-IN.d.ts +35 -0
  236. package/{lib/languages/kn.js → src/kn-IN.js} +156 -34
  237. package/src/ko-KR.d.ts +45 -0
  238. package/{lib/languages/ko.js → src/ko-KR.js} +99 -24
  239. package/src/lt-LT.d.ts +49 -0
  240. package/src/lt-LT.js +543 -0
  241. package/src/lv-LV.d.ts +49 -0
  242. package/src/lv-LV.js +595 -0
  243. package/src/mr-IN.d.ts +36 -0
  244. package/src/mr-IN.js +260 -0
  245. package/src/ms-MY.d.ts +37 -0
  246. package/{lib/languages/ms.js → src/ms-MY.js} +118 -20
  247. package/src/nb-NO.d.ts +44 -0
  248. package/{lib/languages/nb.js → src/nb-NO.js} +165 -33
  249. package/src/nl-NL.d.ts +54 -0
  250. package/{lib/languages/nl.js → src/nl-NL.js} +271 -47
  251. package/src/pa-IN.d.ts +36 -0
  252. package/src/pa-IN.js +268 -0
  253. package/src/pl-PL.d.ts +55 -0
  254. package/src/pl-PL.js +585 -0
  255. package/src/pt-PT.d.ts +45 -0
  256. package/src/pt-PT.js +514 -0
  257. package/src/ro-RO.d.ts +44 -0
  258. package/{lib/languages/ro.js → src/ro-RO.js} +212 -18
  259. package/src/ru-RU.d.ts +50 -0
  260. package/src/ru-RU.js +535 -0
  261. package/src/sr-Cyrl-RS.d.ts +49 -0
  262. package/src/sr-Cyrl-RS.js +503 -0
  263. package/src/sr-Latn-RS.d.ts +49 -0
  264. package/src/sr-Latn-RS.js +503 -0
  265. package/src/sv-SE.d.ts +44 -0
  266. package/{lib/languages/sv.js → src/sv-SE.js} +149 -34
  267. package/src/sw-KE.d.ts +37 -0
  268. package/{lib/languages/sw.js → src/sw-KE.js} +117 -6
  269. package/src/ta-IN.d.ts +35 -0
  270. package/{lib/languages/ta.js → src/ta-IN.js} +163 -47
  271. package/src/te-IN.d.ts +35 -0
  272. package/{lib/languages/te.js → src/te-IN.js} +147 -46
  273. package/src/th-TH.d.ts +38 -0
  274. package/{lib/languages/th.js → src/th-TH.js} +99 -6
  275. package/src/tr-TR.d.ts +48 -0
  276. package/src/tr-TR.js +397 -0
  277. package/src/uk-UA.d.ts +42 -0
  278. package/src/uk-UA.js +463 -0
  279. package/src/ur-PK.d.ts +36 -0
  280. package/src/ur-PK.js +268 -0
  281. package/src/utils/expand-scientific.d.ts +32 -0
  282. package/src/utils/expand-scientific.js +65 -0
  283. package/src/utils/parse-cardinal.d.ts +14 -0
  284. package/{lib/utils/parse-numeric.js → src/utils/parse-cardinal.js} +14 -44
  285. package/src/utils/parse-currency.d.ts +14 -0
  286. package/src/utils/parse-currency.js +91 -0
  287. package/src/utils/parse-ordinal.d.ts +10 -0
  288. package/src/utils/parse-ordinal.js +103 -0
  289. package/src/vi-VN.d.ts +48 -0
  290. package/{lib/languages/vi.js → src/vi-VN.js} +124 -53
  291. package/src/yo-NG.d.ts +37 -0
  292. package/src/yo-NG.js +403 -0
  293. package/src/zh-Hans-CN.d.ts +48 -0
  294. package/{lib/languages/zh-Hans.js → src/zh-Hans-CN.js} +140 -8
  295. package/src/zh-Hant-TW.d.ts +50 -0
  296. package/{lib/languages/zh-Hant.js → src/zh-Hant-TW.js} +139 -8
  297. package/dist/languages/am-Latn.js +0 -3
  298. package/dist/languages/am-Latn.js.map +0 -1
  299. package/dist/languages/am.js +0 -3
  300. package/dist/languages/am.js.map +0 -1
  301. package/dist/languages/ar.js +0 -3
  302. package/dist/languages/ar.js.map +0 -1
  303. package/dist/languages/az.js +0 -3
  304. package/dist/languages/az.js.map +0 -1
  305. package/dist/languages/bn.js +0 -3
  306. package/dist/languages/bn.js.map +0 -1
  307. package/dist/languages/cs.js +0 -3
  308. package/dist/languages/cs.js.map +0 -1
  309. package/dist/languages/da.js +0 -3
  310. package/dist/languages/da.js.map +0 -1
  311. package/dist/languages/de.js +0 -3
  312. package/dist/languages/de.js.map +0 -1
  313. package/dist/languages/el.js +0 -3
  314. package/dist/languages/el.js.map +0 -1
  315. package/dist/languages/en.js +0 -3
  316. package/dist/languages/en.js.map +0 -1
  317. package/dist/languages/es.js +0 -3
  318. package/dist/languages/es.js.map +0 -1
  319. package/dist/languages/fa.js +0 -3
  320. package/dist/languages/fa.js.map +0 -1
  321. package/dist/languages/fi.js +0 -3
  322. package/dist/languages/fi.js.map +0 -1
  323. package/dist/languages/fil.js +0 -3
  324. package/dist/languages/fil.js.map +0 -1
  325. package/dist/languages/fr-BE.js +0 -3
  326. package/dist/languages/fr-BE.js.map +0 -1
  327. package/dist/languages/fr.js +0 -3
  328. package/dist/languages/fr.js.map +0 -1
  329. package/dist/languages/gu.js +0 -3
  330. package/dist/languages/gu.js.map +0 -1
  331. package/dist/languages/ha.js +0 -3
  332. package/dist/languages/ha.js.map +0 -1
  333. package/dist/languages/hbo.js +0 -3
  334. package/dist/languages/hbo.js.map +0 -1
  335. package/dist/languages/he.js +0 -3
  336. package/dist/languages/he.js.map +0 -1
  337. package/dist/languages/hi.js +0 -3
  338. package/dist/languages/hi.js.map +0 -1
  339. package/dist/languages/hr.js +0 -3
  340. package/dist/languages/hr.js.map +0 -1
  341. package/dist/languages/hu.js +0 -3
  342. package/dist/languages/hu.js.map +0 -1
  343. package/dist/languages/id.js +0 -3
  344. package/dist/languages/id.js.map +0 -1
  345. package/dist/languages/it.js +0 -3
  346. package/dist/languages/it.js.map +0 -1
  347. package/dist/languages/ja.js +0 -3
  348. package/dist/languages/ja.js.map +0 -1
  349. package/dist/languages/kn.js +0 -3
  350. package/dist/languages/kn.js.map +0 -1
  351. package/dist/languages/ko.js +0 -3
  352. package/dist/languages/ko.js.map +0 -1
  353. package/dist/languages/lt.js +0 -3
  354. package/dist/languages/lt.js.map +0 -1
  355. package/dist/languages/lv.js +0 -3
  356. package/dist/languages/lv.js.map +0 -1
  357. package/dist/languages/mr.js +0 -3
  358. package/dist/languages/mr.js.map +0 -1
  359. package/dist/languages/ms.js +0 -3
  360. package/dist/languages/ms.js.map +0 -1
  361. package/dist/languages/nb.js +0 -3
  362. package/dist/languages/nb.js.map +0 -1
  363. package/dist/languages/nl.js +0 -3
  364. package/dist/languages/nl.js.map +0 -1
  365. package/dist/languages/pa.js +0 -3
  366. package/dist/languages/pa.js.map +0 -1
  367. package/dist/languages/pl.js +0 -3
  368. package/dist/languages/pl.js.map +0 -1
  369. package/dist/languages/pt.js +0 -3
  370. package/dist/languages/pt.js.map +0 -1
  371. package/dist/languages/ro.js +0 -3
  372. package/dist/languages/ro.js.map +0 -1
  373. package/dist/languages/ru.js +0 -3
  374. package/dist/languages/ru.js.map +0 -1
  375. package/dist/languages/sr-Cyrl.js +0 -3
  376. package/dist/languages/sr-Cyrl.js.map +0 -1
  377. package/dist/languages/sr-Latn.js +0 -3
  378. package/dist/languages/sr-Latn.js.map +0 -1
  379. package/dist/languages/sv.js +0 -3
  380. package/dist/languages/sv.js.map +0 -1
  381. package/dist/languages/sw.js +0 -3
  382. package/dist/languages/sw.js.map +0 -1
  383. package/dist/languages/ta.js +0 -3
  384. package/dist/languages/ta.js.map +0 -1
  385. package/dist/languages/te.js +0 -3
  386. package/dist/languages/te.js.map +0 -1
  387. package/dist/languages/th.js +0 -3
  388. package/dist/languages/th.js.map +0 -1
  389. package/dist/languages/tr.js +0 -3
  390. package/dist/languages/tr.js.map +0 -1
  391. package/dist/languages/uk.js +0 -3
  392. package/dist/languages/uk.js.map +0 -1
  393. package/dist/languages/ur.js +0 -3
  394. package/dist/languages/ur.js.map +0 -1
  395. package/dist/languages/vi.js +0 -3
  396. package/dist/languages/vi.js.map +0 -1
  397. package/dist/languages/zh-Hans.js +0 -3
  398. package/dist/languages/zh-Hans.js.map +0 -1
  399. package/dist/languages/zh-Hant.js +0 -3
  400. package/dist/languages/zh-Hant.js.map +0 -1
  401. package/dist/n2words.js +0 -3
  402. package/dist/n2words.js.map +0 -1
  403. package/lib/languages/am-Latn.d.ts +0 -7
  404. package/lib/languages/am-Latn.js +0 -164
  405. package/lib/languages/am.d.ts +0 -7
  406. package/lib/languages/am.js +0 -164
  407. package/lib/languages/ar.d.ts +0 -17
  408. package/lib/languages/az.d.ts +0 -7
  409. package/lib/languages/az.js +0 -176
  410. package/lib/languages/bn.d.ts +0 -7
  411. package/lib/languages/bn.js +0 -145
  412. package/lib/languages/cs.d.ts +0 -18
  413. package/lib/languages/da.d.ts +0 -14
  414. package/lib/languages/de.d.ts +0 -17
  415. package/lib/languages/de.js +0 -332
  416. package/lib/languages/el.d.ts +0 -14
  417. package/lib/languages/el.js +0 -243
  418. package/lib/languages/en.d.ts +0 -17
  419. package/lib/languages/en.js +0 -256
  420. package/lib/languages/es.d.ts +0 -21
  421. package/lib/languages/fa.d.ts +0 -7
  422. package/lib/languages/fa.js +0 -134
  423. package/lib/languages/fi.d.ts +0 -14
  424. package/lib/languages/fi.js +0 -245
  425. package/lib/languages/fil.d.ts +0 -7
  426. package/lib/languages/fr-BE.d.ts +0 -11
  427. package/lib/languages/fr-BE.js +0 -300
  428. package/lib/languages/fr.d.ts +0 -21
  429. package/lib/languages/gu.d.ts +0 -7
  430. package/lib/languages/gu.js +0 -137
  431. package/lib/languages/ha.d.ts +0 -7
  432. package/lib/languages/hbo.d.ts +0 -13
  433. package/lib/languages/he.d.ts +0 -13
  434. package/lib/languages/he.js +0 -276
  435. package/lib/languages/hi.d.ts +0 -7
  436. package/lib/languages/hi.js +0 -145
  437. package/lib/languages/hr.d.ts +0 -11
  438. package/lib/languages/hr.js +0 -218
  439. package/lib/languages/hu.d.ts +0 -7
  440. package/lib/languages/id.d.ts +0 -7
  441. package/lib/languages/it.d.ts +0 -19
  442. package/lib/languages/it.js +0 -377
  443. package/lib/languages/ja.d.ts +0 -17
  444. package/lib/languages/kn.d.ts +0 -7
  445. package/lib/languages/ko.d.ts +0 -14
  446. package/lib/languages/lt.d.ts +0 -18
  447. package/lib/languages/lt.js +0 -310
  448. package/lib/languages/lv.d.ts +0 -18
  449. package/lib/languages/lv.js +0 -321
  450. package/lib/languages/mr.d.ts +0 -7
  451. package/lib/languages/mr.js +0 -137
  452. package/lib/languages/ms.d.ts +0 -7
  453. package/lib/languages/nb.d.ts +0 -14
  454. package/lib/languages/nl.d.ts +0 -26
  455. package/lib/languages/pa.d.ts +0 -7
  456. package/lib/languages/pa.js +0 -163
  457. package/lib/languages/pl.d.ts +0 -22
  458. package/lib/languages/pl.js +0 -330
  459. package/lib/languages/pt.d.ts +0 -17
  460. package/lib/languages/pt.js +0 -306
  461. package/lib/languages/ro.d.ts +0 -18
  462. package/lib/languages/ru.d.ts +0 -11
  463. package/lib/languages/ru.js +0 -240
  464. package/lib/languages/sr-Cyrl.d.ts +0 -11
  465. package/lib/languages/sr-Cyrl.js +0 -215
  466. package/lib/languages/sr-Latn.d.ts +0 -11
  467. package/lib/languages/sr-Latn.js +0 -215
  468. package/lib/languages/sv.d.ts +0 -14
  469. package/lib/languages/sw.d.ts +0 -7
  470. package/lib/languages/ta.d.ts +0 -7
  471. package/lib/languages/te.d.ts +0 -7
  472. package/lib/languages/th.d.ts +0 -7
  473. package/lib/languages/tr.d.ts +0 -18
  474. package/lib/languages/tr.js +0 -263
  475. package/lib/languages/uk.d.ts +0 -11
  476. package/lib/languages/uk.js +0 -218
  477. package/lib/languages/ur.d.ts +0 -7
  478. package/lib/languages/ur.js +0 -163
  479. package/lib/languages/vi.d.ts +0 -17
  480. package/lib/languages/zh-Hans.d.ts +0 -11
  481. package/lib/languages/zh-Hant.d.ts +0 -11
  482. package/lib/n2words.d.ts +0 -53
  483. package/lib/n2words.js +0 -122
  484. package/lib/utils/parse-numeric.d.ts +0 -17
  485. /package/{lib → src}/utils/is-plain-object.d.ts +0 -0
  486. /package/{lib → src}/utils/is-plain-object.js +0 -0
  487. /package/{lib → src}/utils/validate-options.d.ts +0 -0
  488. /package/{lib → src}/utils/validate-options.js +0 -0
@@ -1,24 +1,26 @@
1
1
  /**
2
- * Spanish language converter - Functional Implementation
2
+ * Spanish (Mexico) language converter
3
3
  *
4
- * A performance-optimized number-to-words converter using precomputed lookup tables.
5
- * Self-contained module with its own input validation, ready for subpath exports.
4
+ * CLDR: es-MX | Spanish as used in Mexico
6
5
  *
7
- * Key optimization: Precompute all segment values (0-999) at module load.
8
- * This eliminates all per-call string manipulation for segment conversion.
6
+ * Uses the European long scale numbering system (per RAE and Academia Mexicana):
7
+ * - 10⁶ = millón
8
+ * - 10⁹ = mil millones (thousand millions)
9
+ * - 10¹² = billón
9
10
  *
10
- * Spanish-specific rules (handled in precomputation):
11
+ * Spanish-specific rules:
11
12
  * - Gender agreement: uno/una, veintiuno/veintiuna, hundreds
12
13
  * - Special twenties: veinte, veintiuno, veintidós, ... veintinueve
13
14
  * - "y" conjunction: treinta y uno (only 30-99 with ones)
14
15
  * - "cien" for exact 100, "ciento/cienta" otherwise
15
16
  * - Irregular hundreds: quinientos, setecientos, novecientos
16
- * - Compound long scale: millón, mil millones, billón, mil billones
17
17
  * - "un" before millón (not "uno"), omit before mil
18
18
  */
19
19
 
20
- import { parseNumericValue } from '../utils/parse-numeric.js'
21
- import { validateOptions } from '../utils/validate-options.js'
20
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
21
+ import { parseCurrencyValue } from './utils/parse-currency.js'
22
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
23
+ import { validateOptions } from './utils/validate-options.js'
22
24
 
23
25
  // ============================================================================
24
26
  // Vocabulary (module-level constants)
@@ -44,12 +46,32 @@ const SCALES = ['millón', 'billón', 'trillón', 'cuatrillón']
44
46
  const SCALES_PLURAL = ['millones', 'billones', 'trillones', 'cuatrillones']
45
47
 
46
48
  const THOUSAND = 'mil'
49
+
47
50
  const ZERO = 'cero'
48
51
  const NEGATIVE = 'menos'
49
52
  const DECIMAL_SEP = 'punto'
50
53
 
54
+ // Ordinal vocabulary (identical to es-ES - ordinals don't vary by region)
55
+ const ORDINAL_ONES_MASC = ['', 'primero', 'segundo', 'tercero', 'cuarto', 'quinto', 'sexto', 'séptimo', 'octavo', 'noveno']
56
+ const ORDINAL_ONES_FEM = ['', 'primera', 'segunda', 'tercera', 'cuarta', 'quinta', 'sexta', 'séptima', 'octava', 'novena']
57
+ const ORDINAL_TENS_MASC = ['', 'décimo', 'vigésimo', 'trigésimo', 'cuadragésimo', 'quincuagésimo', 'sexagésimo', 'septuagésimo', 'octogésimo', 'nonagésimo']
58
+ const ORDINAL_TENS_FEM = ['', 'décima', 'vigésima', 'trigésima', 'cuadragésima', 'quincuagésima', 'sexagésima', 'septuagésima', 'octogésima', 'nonagésima']
59
+ const ORDINAL_HUNDRED_MASC = 'centésimo'
60
+ const ORDINAL_HUNDRED_FEM = 'centésima'
61
+ const ORDINAL_THOUSAND_MASC = 'milésimo'
62
+ const ORDINAL_THOUSAND_FEM = 'milésima'
63
+ const ORDINAL_MILLION_MASC = 'millonésimo'
64
+ const ORDINAL_MILLION_FEM = 'millonésima'
65
+
66
+ // Currency vocabulary (Mexican Peso - MXN)
67
+ const PESO = 'peso'
68
+ const PESOS = 'pesos'
69
+ const CENTAVO = 'centavo'
70
+ const CENTAVOS = 'centavos'
71
+ const CURRENCY_CONNECTOR = 'con'
72
+
51
73
  // ============================================================================
52
- // Precomputed Lookup Tables (built once at module load)
74
+ // Segment Building
53
75
  // ============================================================================
54
76
 
55
77
  /**
@@ -65,8 +87,8 @@ function buildSegment (n, feminine) {
65
87
  if (n === 100) return 'cien'
66
88
 
67
89
  const ones = n % 10
68
- const tens = Math.floor(n / 10) % 10
69
- const hundreds = Math.floor(n / 100)
90
+ const tens = Math.trunc(n / 10) % 10
91
+ const hundreds = Math.trunc(n / 100)
70
92
  const tensOnes = n % 100
71
93
 
72
94
  const parts = []
@@ -104,18 +126,6 @@ function buildSegment (n, feminine) {
104
126
  return parts.join(' ')
105
127
  }
106
128
 
107
- // Precompute all 1000 segment words (0-999) for masculine
108
- const SEGMENTS_MASC = new Array(1000)
109
- for (let i = 0; i < 1000; i++) {
110
- SEGMENTS_MASC[i] = buildSegment(i, false)
111
- }
112
-
113
- // Precompute all 1000 segment words (0-999) for feminine
114
- const SEGMENTS_FEM = new Array(1000)
115
- for (let i = 0; i < 1000; i++) {
116
- SEGMENTS_FEM[i] = buildSegment(i, true)
117
- }
118
-
119
129
  // ============================================================================
120
130
  // Helper Functions
121
131
  // ============================================================================
@@ -160,11 +170,9 @@ function getScaleWord (scaleIndex, segment) {
160
170
  function integerToWords (n, feminine) {
161
171
  if (n === 0n) return ZERO
162
172
 
163
- const segments = feminine ? SEGMENTS_FEM : SEGMENTS_MASC
164
-
165
- // Fast path: numbers < 1000 (direct lookup)
173
+ // Fast path: numbers < 1000
166
174
  if (n < 1000n) {
167
- return segments[Number(n)]
175
+ return buildSegment(Number(n), feminine)
168
176
  }
169
177
 
170
178
  // Fast path: numbers < 1,000,000 (thousands)
@@ -178,7 +186,7 @@ function integerToWords (n, feminine) {
178
186
  result = THOUSAND
179
187
  } else {
180
188
  // Use masculine for thousands segment, but check for "uno" → omit before mil
181
- const thousandsWord = SEGMENTS_MASC[thousands]
189
+ const thousandsWord = buildSegment(thousands, false)
182
190
  // "uno mil" → "mil" (handled in joinSegments equivalent)
183
191
  if (thousandsWord === 'uno' || thousandsWord === 'una') {
184
192
  result = THOUSAND
@@ -188,7 +196,7 @@ function integerToWords (n, feminine) {
188
196
  }
189
197
 
190
198
  if (remainder > 0) {
191
- result += ' ' + segments[remainder]
199
+ result += ' ' + buildSegment(remainder, feminine)
192
200
  }
193
201
 
194
202
  return result
@@ -216,8 +224,6 @@ function buildLargeNumberWords (n, feminine) {
216
224
  temp = temp / 1000n
217
225
  }
218
226
 
219
- const segments = feminine ? SEGMENTS_FEM : SEGMENTS_MASC
220
-
221
227
  // Build result string directly
222
228
  let result = ''
223
229
 
@@ -231,13 +237,13 @@ function buildLargeNumberWords (n, feminine) {
231
237
 
232
238
  if (i === 0) {
233
239
  // Units segment
234
- result += segments[Number(segment)]
240
+ result += buildSegment(Number(segment), feminine)
235
241
  } else if (i === 1) {
236
242
  // Thousands: omit "uno" before mil
237
243
  if (segment === 1n) {
238
244
  result += THOUSAND
239
245
  } else {
240
- result += SEGMENTS_MASC[Number(segment)] + ' ' + scaleWord
246
+ result += buildSegment(Number(segment), false) + ' ' + scaleWord
241
247
  }
242
248
  } else if (i % 2 === 1) {
243
249
  // Odd scale indices (3, 5, 7): "mil millones", "mil billones", etc.
@@ -245,7 +251,7 @@ function buildLargeNumberWords (n, feminine) {
245
251
  if (segment === 1n) {
246
252
  result += scaleWord
247
253
  } else {
248
- result += SEGMENTS_MASC[Number(segment)] + ' ' + scaleWord
254
+ result += buildSegment(Number(segment), false) + ' ' + scaleWord
249
255
  }
250
256
  } else {
251
257
  // Even scale indices (2, 4, 6): millón, billón, trillón
@@ -254,7 +260,7 @@ function buildLargeNumberWords (n, feminine) {
254
260
  result += 'un ' + scaleWord
255
261
  } else {
256
262
  // Use masculine for scale segment
257
- result += SEGMENTS_MASC[Number(segment)] + ' ' + scaleWord
263
+ result += buildSegment(Number(segment), false) + ' ' + scaleWord
258
264
  }
259
265
  }
260
266
  }
@@ -291,10 +297,7 @@ function decimalPartToWords (decimalPart, feminine) {
291
297
  }
292
298
 
293
299
  /**
294
- * Converts a numeric value to Spanish words.
295
- *
296
- * This is the main public API. It accepts any valid numeric input
297
- * (number, string, or bigint) and handles parsing internally.
300
+ * Converts a numeric value to Spanish words (long scale).
298
301
  *
299
302
  * @param {number | string | bigint} value - The numeric value to convert
300
303
  * @param {Object} [options] - Optional configuration
@@ -304,14 +307,17 @@ function decimalPartToWords (decimalPart, feminine) {
304
307
  * @throws {Error} If value is not a valid number format
305
308
  *
306
309
  * @example
307
- * toWords(21) // 'veintiuno'
308
- * toWords(21, {gender: 'feminine'}) // 'veintiuna'
309
- * toWords(1000000) // 'un millón'
310
+ * toCardinal(21) // 'veintiuno'
311
+ * toCardinal(21, {gender: 'feminine'}) // 'veintiuna'
312
+ * toCardinal(1000000000) // 'mil millones'
310
313
  */
311
- function toWords (value, options) {
314
+ function toCardinal (value, options) {
312
315
  options = validateOptions(options)
313
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
314
- const feminine = options.gender === 'feminine'
316
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
317
+
318
+ // Apply option defaults
319
+ const { gender = 'masculine' } = options
320
+ const feminine = gender === 'feminine'
315
321
 
316
322
  let result = ''
317
323
 
@@ -328,8 +334,192 @@ function toWords (value, options) {
328
334
  return result
329
335
  }
330
336
 
337
+ // ============================================================================
338
+ // ORDINAL: toOrdinal(value, options?)
339
+ // ============================================================================
340
+
341
+ /**
342
+ * Builds ordinal word for a 0-999 segment.
343
+ *
344
+ * @param {number} n - Segment value 0-999
345
+ * @param {boolean} feminine - Use feminine forms
346
+ * @returns {string} Spanish ordinal word
347
+ */
348
+ function buildOrdinalSegment (n, feminine) {
349
+ if (n === 0) return ''
350
+
351
+ const ones = n % 10
352
+ const tens = Math.trunc(n / 10) % 10
353
+ const hundreds = Math.trunc(n / 100)
354
+
355
+ const onesArr = feminine ? ORDINAL_ONES_FEM : ORDINAL_ONES_MASC
356
+ const tensArr = feminine ? ORDINAL_TENS_FEM : ORDINAL_TENS_MASC
357
+ const hundredWord = feminine ? ORDINAL_HUNDRED_FEM : ORDINAL_HUNDRED_MASC
358
+
359
+ const parts = []
360
+
361
+ // Hundreds
362
+ if (hundreds > 0) {
363
+ if (hundreds === 1) {
364
+ parts.push(hundredWord)
365
+ } else {
366
+ const prefixes = ['', '', 'du', 'tri', 'cuadri', 'quin', 'sex', 'septi', 'octi', 'noni']
367
+ parts.push(prefixes[hundreds] + hundredWord)
368
+ }
369
+ }
370
+
371
+ // Tens
372
+ if (tens > 0) {
373
+ parts.push(tensArr[tens])
374
+ }
375
+
376
+ // Ones
377
+ if (ones > 0) {
378
+ parts.push(onesArr[ones])
379
+ }
380
+
381
+ return parts.join(' ')
382
+ }
383
+
384
+ /**
385
+ * Converts a positive integer to Spanish ordinal words.
386
+ *
387
+ * @param {bigint} n - Positive integer to convert
388
+ * @param {boolean} feminine - Use feminine forms
389
+ * @returns {string} Spanish ordinal words
390
+ */
391
+ function integerToOrdinal (n, feminine) {
392
+ const thousandWord = feminine ? ORDINAL_THOUSAND_FEM : ORDINAL_THOUSAND_MASC
393
+ const millionWord = feminine ? ORDINAL_MILLION_FEM : ORDINAL_MILLION_MASC
394
+
395
+ // Fast path: numbers < 1000
396
+ if (n < 1000n) {
397
+ return buildOrdinalSegment(Number(n), feminine)
398
+ }
399
+
400
+ // Numbers 1000-999999
401
+ if (n < 1_000_000n) {
402
+ const thousands = Number(n / 1000n)
403
+ const remainder = Number(n % 1000n)
404
+
405
+ let result = ''
406
+
407
+ if (thousands === 1) {
408
+ result = thousandWord
409
+ } else {
410
+ result = buildOrdinalSegment(thousands, feminine) + ' ' + thousandWord
411
+ }
412
+
413
+ if (remainder > 0) {
414
+ result += ' ' + buildOrdinalSegment(remainder, feminine)
415
+ }
416
+
417
+ return result
418
+ }
419
+
420
+ // Numbers >= 1,000,000
421
+ const millions = Number(n / 1_000_000n)
422
+ const remainder = n % 1_000_000n
423
+
424
+ let result = ''
425
+
426
+ if (millions === 1) {
427
+ result = millionWord
428
+ } else {
429
+ result = buildOrdinalSegment(millions, feminine) + ' ' + millionWord
430
+ }
431
+
432
+ if (remainder > 0n) {
433
+ result += ' ' + integerToOrdinal(remainder, feminine)
434
+ }
435
+
436
+ return result
437
+ }
438
+
439
+ /**
440
+ * Converts a numeric value to Spanish ordinal words.
441
+ *
442
+ * @param {number | string | bigint} value - The positive integer to convert
443
+ * @param {Object} [options] - Optional configuration
444
+ * @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
445
+ * @returns {string} The number in Spanish ordinal words
446
+ * @throws {TypeError} If value is not a valid numeric type
447
+ * @throws {Error} If value is not a positive integer
448
+ *
449
+ * @example
450
+ * toOrdinal(1) // 'primero'
451
+ * toOrdinal(1, { gender: 'feminine' }) // 'primera'
452
+ * toOrdinal(21) // 'vigésimo primero'
453
+ */
454
+ function toOrdinal (value, options) {
455
+ options = validateOptions(options)
456
+ const integerPart = parseOrdinalValue(value)
457
+
458
+ const { gender = 'masculine' } = options
459
+ const feminine = gender === 'feminine'
460
+
461
+ return integerToOrdinal(integerPart, feminine)
462
+ }
463
+
464
+ // ============================================================================
465
+ // CURRENCY: toCurrency(value, options?)
466
+ // ============================================================================
467
+
468
+ /**
469
+ * Converts a numeric value to Mexican Peso currency words.
470
+ *
471
+ * Mexican currency uses masculine gender for pesos (el peso)
472
+ * and masculine for centavos (el centavo).
473
+ *
474
+ * @param {number | string | bigint} value - The currency amount to convert
475
+ * @param {Object} [options] - Optional configuration
476
+ * @param {boolean} [options.and=true] - Use "con" between pesos and centavos
477
+ * @returns {string} The amount in Mexican currency words
478
+ * @throws {TypeError} If value is not a valid numeric type
479
+ * @throws {Error} If value is not a valid number format
480
+ *
481
+ * @example
482
+ * toCurrency(42.50) // 'cuarenta y dos pesos con cincuenta centavos'
483
+ * toCurrency(1) // 'un peso'
484
+ * toCurrency(0.99) // 'noventa y nueve centavos'
485
+ * toCurrency(42.50, { and: false }) // 'cuarenta y dos pesos cincuenta centavos'
486
+ */
487
+ function toCurrency (value, options) {
488
+ options = validateOptions(options)
489
+ const { isNegative, dollars: pesos, cents: centavos } = parseCurrencyValue(value)
490
+ const { and: useAnd = true } = options
491
+
492
+ let result = ''
493
+ if (isNegative) result = NEGATIVE + ' '
494
+
495
+ // Pesos part (show if non-zero, or if no centavos)
496
+ if (pesos > 0n || centavos === 0n) {
497
+ // Use masculine for pesos, but "un peso" not "uno peso"
498
+ if (pesos === 1n) {
499
+ result += 'un ' + PESO
500
+ } else {
501
+ result += integerToWords(pesos, false) + ' ' + PESOS
502
+ }
503
+ }
504
+
505
+ // Centavos part
506
+ if (centavos > 0n) {
507
+ if (pesos > 0n) {
508
+ result += useAnd ? ' ' + CURRENCY_CONNECTOR + ' ' : ' '
509
+ }
510
+ // Use masculine for centavos, but "un centavo" not "uno centavo"
511
+ if (centavos === 1n) {
512
+ result += 'un ' + CENTAVO
513
+ } else {
514
+ result += integerToWords(centavos, false) + ' ' + CENTAVOS
515
+ }
516
+ }
517
+
518
+ return result
519
+ }
520
+
331
521
  // ============================================================================
332
522
  // Public API
333
523
  // ============================================================================
334
524
 
335
- export { toWords }
525
+ export { toCardinal, toOrdinal, toCurrency }
package/src/es-US.d.ts ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Converts a numeric value to Spanish words (US short scale).
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @param {Object} [options] - Optional configuration
6
+ * @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
7
+ * @returns {string} The number in Spanish words
8
+ * @throws {TypeError} If value is not a valid numeric type
9
+ * @throws {Error} If value is not a valid number format
10
+ *
11
+ * @example
12
+ * toCardinal(21) // 'veintiuno'
13
+ * toCardinal(21, {gender: 'feminine'}) // 'veintiuna'
14
+ * toCardinal(1000000000) // 'un billón'
15
+ */
16
+ export function toCardinal(value: number | string | bigint, options?: {
17
+ gender?: "masculine" | "feminine" | undefined;
18
+ }): string;
19
+ /**
20
+ * Converts a numeric value to Spanish ordinal words.
21
+ *
22
+ * @param {number | string | bigint} value - The positive integer to convert
23
+ * @param {Object} [options] - Optional configuration
24
+ * @param {('masculine'|'feminine')} [options.gender='masculine'] - Grammatical gender
25
+ * @returns {string} The number in Spanish ordinal words
26
+ * @throws {TypeError} If value is not a valid numeric type
27
+ * @throws {Error} If value is not a positive integer
28
+ *
29
+ * @example
30
+ * toOrdinal(1) // 'primero'
31
+ * toOrdinal(1, { gender: 'feminine' }) // 'primera'
32
+ * toOrdinal(21) // 'vigésimo primero'
33
+ */
34
+ export function toOrdinal(value: number | string | bigint, options?: {
35
+ gender?: "masculine" | "feminine" | undefined;
36
+ }): string;
37
+ /**
38
+ * Converts a numeric value to US Dollar currency words in Spanish.
39
+ *
40
+ * US Dollar uses masculine gender for dólares (el dólar)
41
+ * and masculine for centavos (el centavo).
42
+ *
43
+ * @param {number | string | bigint} value - The currency amount to convert
44
+ * @param {Object} [options] - Optional configuration
45
+ * @param {boolean} [options.and=true] - Use "con" between dollars and cents
46
+ * @returns {string} The amount in Spanish US Dollar currency words
47
+ * @throws {TypeError} If value is not a valid numeric type
48
+ * @throws {Error} If value is not a valid number format
49
+ *
50
+ * @example
51
+ * toCurrency(42.50) // 'cuarenta y dos dólares con cincuenta centavos'
52
+ * toCurrency(1) // 'un dólar'
53
+ * toCurrency(0.99) // 'noventa y nueve centavos'
54
+ * toCurrency(42.50, { and: false }) // 'cuarenta y dos dólares cincuenta centavos'
55
+ */
56
+ export function toCurrency(value: number | string | bigint, options?: {
57
+ and?: boolean | undefined;
58
+ }): string;