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
package/src/pt-PT.js ADDED
@@ -0,0 +1,514 @@
1
+ /**
2
+ * Portuguese (Portugal) language converter
3
+ *
4
+ * CLDR: pt-PT | European Portuguese as used in Portugal
5
+ *
6
+ * Portuguese-specific rules:
7
+ * - "e" conjunction everywhere: vinte e um, cento e um, mil e um
8
+ * - "cem" for exact 100, "cento" for 100+ remainder
9
+ * - Irregular hundreds: duzentos, trezentos, quatrocentos, etc.
10
+ * - Long scale: milhão (10^6), mil milhões (10^9), bilião (10^12)
11
+ * - Omit "um" before "mil"
12
+ */
13
+
14
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
15
+ import { parseCurrencyValue } from './utils/parse-currency.js'
16
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
17
+ import { validateOptions } from './utils/validate-options.js'
18
+
19
+ // ============================================================================
20
+ // Vocabulary (module-level constants)
21
+ // ============================================================================
22
+
23
+ const ONES = ['', 'um', 'dois', 'três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove']
24
+ const TEENS = ['dez', 'onze', 'doze', 'treze', 'catorze', 'quinze', 'dezasseis', 'dezassete', 'dezoito', 'dezanove']
25
+ const TENS = ['', '', 'vinte', 'trinta', 'quarenta', 'cinquenta', 'sessenta', 'setenta', 'oitenta', 'noventa']
26
+
27
+ // Irregular hundreds
28
+ const HUNDREDS = ['', 'cento', 'duzentos', 'trezentos', 'quatrocentos', 'quinhentos', 'seiscentos', 'setecentos', 'oitocentos', 'novecentos']
29
+
30
+ const THOUSAND = 'mil'
31
+ const ZERO = 'zero'
32
+ const NEGATIVE = 'menos'
33
+ const DECIMAL_SEP = 'vírgula'
34
+
35
+ // Ordinal vocabulary
36
+ const ORDINAL_ONES = ['', 'primeiro', 'segundo', 'terceiro', 'quarto', 'quinto', 'sexto', 'sétimo', 'oitavo', 'nono']
37
+ const ORDINAL_TEENS = ['décimo', 'décimo primeiro', 'décimo segundo', 'décimo terceiro', 'décimo quarto', 'décimo quinto', 'décimo sexto', 'décimo sétimo', 'décimo oitavo', 'décimo nono']
38
+ const ORDINAL_TENS = ['', '', 'vigésimo', 'trigésimo', 'quadragésimo', 'quinquagésimo', 'sexagésimo', 'septuagésimo', 'octogésimo', 'nonagésimo']
39
+ const ORDINAL_HUNDREDS = ['', 'centésimo', 'ducentésimo', 'tricentésimo', 'quadringentésimo', 'quingentésimo', 'sexcentésimo', 'septingentésimo', 'octingentésimo', 'nongentésimo']
40
+
41
+ // Currency vocabulary (Euro)
42
+ const EURO = 'euro'
43
+ const EUROS = 'euros'
44
+ const CENTIMO = 'cêntimo'
45
+ const CENTIMOS = 'cêntimos'
46
+
47
+ // ============================================================================
48
+ // Segment Building
49
+ // ============================================================================
50
+
51
+ /**
52
+ * Builds segment word for 0-999 with Portuguese "e" rules.
53
+ * Returns the word and whether it's an exact hundred (for "cem" handling).
54
+ */
55
+ function buildSegment (n) {
56
+ if (n === 0) return { word: '', isExactHundred: false }
57
+
58
+ // Special case: exact 100 is "cem"
59
+ if (n === 100) return { word: 'cem', isExactHundred: true }
60
+
61
+ const ones = n % 10
62
+ const tens = Math.trunc(n / 10) % 10
63
+ const hundreds = Math.trunc(n / 100)
64
+
65
+ const parts = []
66
+
67
+ // Hundreds
68
+ if (hundreds > 0) {
69
+ parts.push(HUNDREDS[hundreds])
70
+ }
71
+
72
+ // Tens and ones
73
+ if (tens === 1) {
74
+ // Teens (10-19)
75
+ parts.push(TEENS[ones])
76
+ } else if (tens >= 2) {
77
+ if (ones > 0) {
78
+ // Tens + ones with "e": "vinte e um"
79
+ parts.push(TENS[tens] + ' e ' + ONES[ones])
80
+ } else {
81
+ parts.push(TENS[tens])
82
+ }
83
+ } else if (ones > 0) {
84
+ parts.push(ONES[ones])
85
+ }
86
+
87
+ // Join hundreds with "e": "cento e um", "duzentos e trinta e um"
88
+ const word = parts.join(' e ')
89
+
90
+ return { word, isExactHundred: hundreds > 0 && tens === 0 && ones === 0, startsWithHundreds: n >= 100 }
91
+ }
92
+
93
+ // ============================================================================
94
+ // Scale Word Lookup
95
+ // ============================================================================
96
+
97
+ // Precompute scale words for singular and plural forms
98
+ // Index 1 = thousands, 2 = millions, 3 = billions (mil milhões), etc.
99
+ const SCALE_WORDS_SINGULAR = [
100
+ '', // 0 unused
101
+ THOUSAND, // 1: mil
102
+ 'milhão', // 2: 10^6
103
+ 'mil milhões', // 3: 10^9 (compound)
104
+ 'bilião', // 4: 10^12
105
+ 'mil biliões', // 5: 10^15 (compound)
106
+ 'trilião', // 6: 10^18
107
+ 'mil triliões', // 7: 10^21 (compound)
108
+ 'quatrilião' // 8: 10^24
109
+ ]
110
+
111
+ const SCALE_WORDS_PLURAL = [
112
+ '', // 0 unused
113
+ THOUSAND, // 1: mil (same)
114
+ 'milhões', // 2: 10^6
115
+ 'mil milhões', // 3: 10^9 (compound, same)
116
+ 'biliões', // 4: 10^12
117
+ 'mil biliões', // 5: 10^15 (compound, same)
118
+ 'triliões', // 6: 10^18
119
+ 'mil triliões', // 7: 10^21 (compound, same)
120
+ 'quatriliões' // 8: 10^24
121
+ ]
122
+
123
+ // ============================================================================
124
+ // Conversion Functions
125
+ // ============================================================================
126
+
127
+ /**
128
+ * Converts a non-negative integer to Portuguese words.
129
+ *
130
+ * @param {bigint} n - Non-negative integer to convert
131
+ * @returns {string} Portuguese words
132
+ */
133
+ function integerToWords (n) {
134
+ if (n === 0n) return ZERO
135
+
136
+ // Fast path: numbers < 1000
137
+ if (n < 1000n) {
138
+ return buildSegment(Number(n)).word
139
+ }
140
+
141
+ // Fast path: numbers < 1,000,000 (thousands)
142
+ if (n < 1_000_000n) {
143
+ const thousands = Number(n / 1000n)
144
+ const remainder = Number(n % 1000n)
145
+
146
+ let result
147
+ if (thousands === 1) {
148
+ // "mil" not "um mil"
149
+ result = THOUSAND
150
+ } else {
151
+ result = buildSegment(thousands).word + ' ' + THOUSAND
152
+ }
153
+
154
+ if (remainder > 0) {
155
+ const remainderResult = buildSegment(remainder)
156
+ // Insert "e" before remainder if it doesn't start with hundreds (< 100)
157
+ if (!remainderResult.startsWithHundreds) {
158
+ result += ' e ' + remainderResult.word
159
+ } else {
160
+ result += ' ' + remainderResult.word
161
+ }
162
+ }
163
+
164
+ return result
165
+ }
166
+
167
+ // For numbers >= 1,000,000, use scale decomposition
168
+ return buildLargeNumberWords(n)
169
+ }
170
+
171
+ /**
172
+ * Builds words for numbers >= 1,000,000.
173
+ * Uses BigInt division for faster segment extraction.
174
+ *
175
+ * @param {bigint} n - Number >= 1,000,000
176
+ * @returns {string} Portuguese words
177
+ */
178
+ function buildLargeNumberWords (n) {
179
+ // Extract segments using BigInt division
180
+ // Segments stored least-significant first (index 0 = ones, 1 = thousands, etc.)
181
+ const segments = []
182
+ let temp = n
183
+ while (temp > 0n) {
184
+ segments.push(Number(temp % 1000n))
185
+ temp = temp / 1000n
186
+ }
187
+
188
+ // Find the first non-zero segment index (lowest scale with value)
189
+ let firstNonZeroIdx = 0
190
+ for (let i = 0; i < segments.length; i++) {
191
+ if (segments[i] !== 0) {
192
+ firstNonZeroIdx = i
193
+ break
194
+ }
195
+ }
196
+
197
+ // Build result string directly
198
+ let result = ''
199
+ let prevWasScale = false
200
+
201
+ for (let i = segments.length - 1; i >= 0; i--) {
202
+ const segment = segments[i]
203
+ if (segment === 0) continue
204
+
205
+ const segmentResult = buildSegment(segment)
206
+ const isLastSegment = (i === firstNonZeroIdx)
207
+
208
+ // Add "e" before final segment if previous was scale and this doesn't start with hundreds
209
+ if (result && isLastSegment && prevWasScale && !segmentResult.startsWithHundreds) {
210
+ result += ' e'
211
+ }
212
+
213
+ if (result) result += ' '
214
+
215
+ if (i === 0) {
216
+ // Units segment
217
+ result += segmentResult.word
218
+ prevWasScale = false
219
+ } else if (i === 1) {
220
+ // Thousands
221
+ if (segment === 1) {
222
+ result += THOUSAND
223
+ } else {
224
+ result += segmentResult.word + ' ' + THOUSAND
225
+ }
226
+ prevWasScale = true
227
+ } else {
228
+ // Million and above - use scale arrays
229
+ const scaleWord = segment === 1 ? SCALE_WORDS_SINGULAR[i] : SCALE_WORDS_PLURAL[i]
230
+ if (segment === 1) {
231
+ result += 'um ' + scaleWord
232
+ } else {
233
+ result += segmentResult.word + ' ' + scaleWord
234
+ }
235
+ prevWasScale = true
236
+ }
237
+ }
238
+
239
+ return result
240
+ }
241
+
242
+ /**
243
+ * Converts decimal digits to Portuguese words.
244
+ *
245
+ * @param {string} decimalPart - Decimal digits (without the point)
246
+ * @returns {string} Portuguese words for decimal part
247
+ */
248
+ function decimalPartToWords (decimalPart) {
249
+ let result = ''
250
+
251
+ // Handle leading zeros
252
+ let i = 0
253
+ while (i < decimalPart.length && decimalPart[i] === '0') {
254
+ if (result) result += ' '
255
+ result += ZERO
256
+ i++
257
+ }
258
+
259
+ // Convert remainder as a single number
260
+ const remainder = decimalPart.slice(i)
261
+ if (remainder) {
262
+ if (result) result += ' '
263
+ result += integerToWords(BigInt(remainder))
264
+ }
265
+
266
+ return result
267
+ }
268
+
269
+ /**
270
+ * Converts a numeric value to Portuguese words.
271
+ *
272
+ * This is the main public API. It accepts any valid numeric input
273
+ * (number, string, or bigint) and handles parsing internally.
274
+ *
275
+ * @param {number | string | bigint} value - The numeric value to convert
276
+ * @returns {string} The number in Portuguese words
277
+ * @throws {TypeError} If value is not a valid numeric type
278
+ * @throws {Error} If value is not a valid number format
279
+ *
280
+ * @example
281
+ * toCardinal(21) // 'vinte e um'
282
+ * toCardinal(100) // 'cem'
283
+ * toCardinal(1000000) // 'um milhão'
284
+ */
285
+ function toCardinal (value) {
286
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
287
+
288
+ let result = ''
289
+
290
+ if (isNegative) {
291
+ result = NEGATIVE + ' '
292
+ }
293
+
294
+ result += integerToWords(integerPart)
295
+
296
+ if (decimalPart) {
297
+ result += ' ' + DECIMAL_SEP + ' ' + decimalPartToWords(decimalPart)
298
+ }
299
+
300
+ return result
301
+ }
302
+
303
+ // ============================================================================
304
+ // Ordinal Functions
305
+ // ============================================================================
306
+
307
+ /**
308
+ * Builds ordinal words for 0-999.
309
+ *
310
+ * @param {number} n - Number 0-999
311
+ * @returns {string} Portuguese ordinal words
312
+ */
313
+ function buildOrdinalSegment (n) {
314
+ if (n === 0) return ''
315
+
316
+ const ones = n % 10
317
+ const tens = Math.trunc(n / 10) % 10
318
+ const hundreds = Math.trunc(n / 100)
319
+
320
+ const parts = []
321
+
322
+ // Hundreds ordinal
323
+ if (hundreds > 0) {
324
+ parts.push(ORDINAL_HUNDREDS[hundreds])
325
+ }
326
+
327
+ // Tens and ones
328
+ if (tens === 1) {
329
+ // 10-19: use teens array (décimo, décimo primeiro, etc.)
330
+ parts.push(ORDINAL_TEENS[ones])
331
+ } else if (tens >= 2) {
332
+ parts.push(ORDINAL_TENS[tens])
333
+ if (ones > 0) {
334
+ parts.push(ORDINAL_ONES[ones])
335
+ }
336
+ } else if (ones > 0) {
337
+ parts.push(ORDINAL_ONES[ones])
338
+ }
339
+
340
+ return parts.join(' ')
341
+ }
342
+
343
+ /**
344
+ * Builds ordinal words for large numbers.
345
+ *
346
+ * @param {bigint} n - Non-negative integer
347
+ * @returns {string} Portuguese ordinal words
348
+ */
349
+ function buildLargeOrdinal (n) {
350
+ // Extract segments
351
+ const segments = []
352
+ let temp = n
353
+ while (temp > 0n) {
354
+ segments.push(Number(temp % 1000n))
355
+ temp = temp / 1000n
356
+ }
357
+
358
+ // Find the lowest non-zero segment (index 0 = units, lowest scale)
359
+ let lowestNonZeroIdx = 0
360
+ for (let i = 0; i < segments.length; i++) {
361
+ if (segments[i] !== 0) {
362
+ lowestNonZeroIdx = i
363
+ break
364
+ }
365
+ }
366
+
367
+ // Scale ordinal words (singular forms)
368
+ const SCALE_ORDINAL = ['', 'milésimo', 'milionésimo', 'mil milionésimo', 'bilionésimo', 'mil bilionésimo', 'trilionésimo']
369
+
370
+ let result = ''
371
+
372
+ for (let i = segments.length - 1; i >= 0; i--) {
373
+ const segment = segments[i]
374
+ if (segment === 0) continue
375
+
376
+ if (result) result += ' '
377
+
378
+ if (i === lowestNonZeroIdx) {
379
+ // Last non-zero segment gets ordinal form
380
+ if (i === 0) {
381
+ // Units: just ordinal
382
+ result += buildOrdinalSegment(segment)
383
+ } else if (segment === 1 && i > 0) {
384
+ // Exact scale: "milésimo", "milionésimo", etc.
385
+ result += SCALE_ORDINAL[i]
386
+ } else {
387
+ // Segment + scale ordinal
388
+ result += buildOrdinalSegment(segment) + ' ' + SCALE_ORDINAL[i]
389
+ }
390
+ } else {
391
+ // Higher segments use cardinal form
392
+ if (i === 0) {
393
+ result += buildSegment(segment).word
394
+ } else if (i === 1) {
395
+ if (segment === 1) {
396
+ result += THOUSAND
397
+ } else {
398
+ result += buildSegment(segment).word + ' ' + THOUSAND
399
+ }
400
+ } else {
401
+ const scaleWord = segment === 1 ? SCALE_WORDS_SINGULAR[i] : SCALE_WORDS_PLURAL[i]
402
+ if (segment === 1) {
403
+ result += 'um ' + scaleWord
404
+ } else {
405
+ result += buildSegment(segment).word + ' ' + scaleWord
406
+ }
407
+ }
408
+ }
409
+ }
410
+
411
+ return result
412
+ }
413
+
414
+ /**
415
+ * Converts a number to Portuguese ordinal words.
416
+ *
417
+ * @param {number | string | bigint} value - The number to convert
418
+ * @returns {string} Portuguese ordinal words
419
+ *
420
+ * @example
421
+ * toOrdinal(1) // 'primeiro'
422
+ * toOrdinal(21) // 'vigésimo primeiro'
423
+ * toOrdinal(100) // 'centésimo'
424
+ */
425
+ function toOrdinal (value) {
426
+ const n = parseOrdinalValue(value)
427
+
428
+ // Fast path: 1-9
429
+ if (n < 10n) {
430
+ return ORDINAL_ONES[Number(n)]
431
+ }
432
+
433
+ // Fast path: 10-19
434
+ if (n < 20n) {
435
+ return ORDINAL_TEENS[Number(n) - 10]
436
+ }
437
+
438
+ // Fast path: 20-99
439
+ if (n < 100n) {
440
+ const ones = Number(n % 10n)
441
+ const tens = Number(n / 10n)
442
+ if (ones === 0) {
443
+ return ORDINAL_TENS[tens]
444
+ }
445
+ return ORDINAL_TENS[tens] + ' ' + ORDINAL_ONES[ones]
446
+ }
447
+
448
+ // Fast path: 100-999
449
+ if (n < 1000n) {
450
+ return buildOrdinalSegment(Number(n))
451
+ }
452
+
453
+ // Large numbers
454
+ return buildLargeOrdinal(n)
455
+ }
456
+
457
+ // ============================================================================
458
+ // Currency Functions
459
+ // ============================================================================
460
+
461
+ /**
462
+ * Converts a number to Portuguese currency words (Euro).
463
+ *
464
+ * @param {number | string | bigint} value - The amount to convert
465
+ * @param {Object} [options]
466
+ * @param {boolean} [options.and=true] - Include "e" between euros and cents
467
+ * @returns {string} Portuguese currency words
468
+ *
469
+ * @example
470
+ * toCurrency(42.50) // 'quarenta e dois euros e cinquenta cêntimos'
471
+ * toCurrency(1) // 'um euro'
472
+ * toCurrency(0.01) // 'um cêntimo'
473
+ */
474
+ function toCurrency (value, options) {
475
+ options = validateOptions(options)
476
+ const { isNegative, dollars: euros, cents } = parseCurrencyValue(value)
477
+ const { and = true } = options
478
+
479
+ let result = ''
480
+
481
+ if (isNegative) {
482
+ result = NEGATIVE + ' '
483
+ }
484
+
485
+ const hasEuros = euros > 0n
486
+ const hasCents = cents > 0n
487
+
488
+ if (!hasEuros && !hasCents) {
489
+ return ZERO + ' ' + EUROS
490
+ }
491
+
492
+ if (hasEuros) {
493
+ const euroWords = integerToWords(euros)
494
+ const euroUnit = euros === 1n ? EURO : EUROS
495
+ result += euroWords + ' ' + euroUnit
496
+ }
497
+
498
+ if (hasCents) {
499
+ if (hasEuros) {
500
+ result += and ? ' e ' : ' '
501
+ }
502
+ const centWords = integerToWords(cents)
503
+ const centUnit = cents === 1n ? CENTIMO : CENTIMOS
504
+ result += centWords + ' ' + centUnit
505
+ }
506
+
507
+ return result
508
+ }
509
+
510
+ // ============================================================================
511
+ // Public API
512
+ // ============================================================================
513
+
514
+ export { toCardinal, toOrdinal, toCurrency }
package/src/ro-RO.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Converts a numeric value to Romanian words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @param {Object} [options] - Conversion options
6
+ * @param {string} [options.gender='masculine'] - Gender for numbers
7
+ * @returns {string} The number in Romanian 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) // 'douăzeci și unu'
13
+ * toCardinal(1, { gender: 'feminine' }) // 'una'
14
+ * toCardinal(1000) // 'o mie'
15
+ */
16
+ export function toCardinal(value: number | string | bigint, options?: {
17
+ gender?: string | undefined;
18
+ }): string;
19
+ /**
20
+ * Converts a numeric value to Romanian ordinal words.
21
+ *
22
+ * @param {number | string | bigint} value - The numeric value to convert
23
+ * @returns {string} The ordinal in Romanian words
24
+ * @throws {TypeError} If value is not a valid numeric type
25
+ * @throws {Error} If value is not a positive integer
26
+ *
27
+ * @example
28
+ * toOrdinal(1) // 'primul'
29
+ * toOrdinal(21) // 'douăzeci și primul'
30
+ */
31
+ export function toOrdinal(value: number | string | bigint): string;
32
+ /**
33
+ * Converts a numeric value to Romanian Leu currency words.
34
+ *
35
+ * @param {number | string | bigint} value - The numeric value to convert
36
+ * @returns {string} The currency in Romanian words
37
+ * @throws {TypeError} If value is not a valid numeric type
38
+ * @throws {Error} If value is not a valid number format
39
+ *
40
+ * @example
41
+ * toCurrency(1) // 'un leu'
42
+ * toCurrency(2.50) // 'doi lei cincizeci de bani'
43
+ */
44
+ export function toCurrency(value: number | string | bigint): string;