n2words 3.1.0 → 5.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 (486) hide show
  1. package/CHANGELOG.md +51 -40
  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-BR.js +2 -0
  113. package/dist/pt-BR.umd.js +2 -0
  114. package/dist/pt-PT.js +2 -0
  115. package/dist/pt-PT.umd.js +2 -0
  116. package/dist/ro-RO.js +2 -0
  117. package/dist/ro-RO.umd.js +2 -0
  118. package/dist/ru-RU.js +2 -0
  119. package/dist/ru-RU.umd.js +2 -0
  120. package/dist/sr-Cyrl-RS.js +2 -0
  121. package/dist/sr-Cyrl-RS.umd.js +2 -0
  122. package/dist/sr-Latn-RS.js +2 -0
  123. package/dist/sr-Latn-RS.umd.js +2 -0
  124. package/dist/sv-SE.js +2 -0
  125. package/dist/sv-SE.umd.js +2 -0
  126. package/dist/sw-KE.js +2 -0
  127. package/dist/sw-KE.umd.js +2 -0
  128. package/dist/ta-IN.js +2 -0
  129. package/dist/ta-IN.umd.js +2 -0
  130. package/dist/te-IN.js +2 -0
  131. package/dist/te-IN.umd.js +2 -0
  132. package/dist/th-TH.js +2 -0
  133. package/dist/th-TH.umd.js +2 -0
  134. package/dist/tr-TR.js +2 -0
  135. package/dist/tr-TR.umd.js +2 -0
  136. package/dist/uk-UA.js +2 -0
  137. package/dist/uk-UA.umd.js +2 -0
  138. package/dist/ur-PK.js +2 -0
  139. package/dist/ur-PK.umd.js +2 -0
  140. package/dist/vi-VN.js +2 -0
  141. package/dist/vi-VN.umd.js +2 -0
  142. package/dist/yo-NG.js +2 -0
  143. package/dist/yo-NG.umd.js +2 -0
  144. package/dist/zh-Hans-CN.js +2 -0
  145. package/dist/zh-Hans-CN.umd.js +2 -0
  146. package/dist/zh-Hant-TW.js +2 -0
  147. package/dist/zh-Hant-TW.umd.js +2 -0
  148. package/package.json +61 -88
  149. package/src/am-ET.d.ts +40 -0
  150. package/src/am-ET.js +269 -0
  151. package/src/am-Latn-ET.d.ts +35 -0
  152. package/src/am-Latn-ET.js +264 -0
  153. package/src/ar-SA.d.ts +49 -0
  154. package/{lib/languages/ar.js → src/ar-SA.js} +177 -15
  155. package/src/az-AZ.d.ts +37 -0
  156. package/src/az-AZ.js +312 -0
  157. package/src/bn-BD.d.ts +36 -0
  158. package/{lib/languages/bn.js → src/bn-BD.js} +110 -6
  159. package/src/cs-CZ.d.ts +49 -0
  160. package/{lib/languages/cs.js → src/cs-CZ.js} +240 -14
  161. package/src/da-DK.d.ts +44 -0
  162. package/{lib/languages/da.js → src/da-DK.js} +131 -11
  163. package/src/de-DE.d.ts +57 -0
  164. package/src/de-DE.js +603 -0
  165. package/src/el-GR.d.ts +40 -0
  166. package/src/el-GR.js +418 -0
  167. package/src/en-AU.d.ts +47 -0
  168. package/src/en-AU.js +423 -0
  169. package/src/en-BD.d.ts +49 -0
  170. package/src/en-BD.js +415 -0
  171. package/src/en-CA.d.ts +63 -0
  172. package/src/en-CA.js +518 -0
  173. package/src/en-GB.d.ts +56 -0
  174. package/src/en-GB.js +469 -0
  175. package/src/en-GH.d.ts +11 -0
  176. package/src/en-GH.js +345 -0
  177. package/src/en-IE.d.ts +56 -0
  178. package/src/en-IE.js +479 -0
  179. package/src/en-IN.d.ts +49 -0
  180. package/src/en-IN.js +415 -0
  181. package/src/en-KE.d.ts +11 -0
  182. package/src/en-KE.js +345 -0
  183. package/src/en-MY.d.ts +11 -0
  184. package/src/en-MY.js +347 -0
  185. package/src/en-NG.d.ts +56 -0
  186. package/src/en-NG.js +479 -0
  187. package/src/en-NZ.d.ts +11 -0
  188. package/{lib/languages/en.js → src/en-NZ.js} +164 -31
  189. package/src/en-PH.d.ts +11 -0
  190. package/src/en-PH.js +345 -0
  191. package/src/en-PK.d.ts +49 -0
  192. package/src/en-PK.js +415 -0
  193. package/src/en-SG.d.ts +11 -0
  194. package/src/en-SG.js +345 -0
  195. package/src/en-US.d.ts +63 -0
  196. package/src/en-US.js +516 -0
  197. package/src/en-ZA.d.ts +56 -0
  198. package/src/en-ZA.js +478 -0
  199. package/src/es-ES.d.ts +65 -0
  200. package/src/es-ES.js +541 -0
  201. package/src/es-MX.d.ts +58 -0
  202. package/{lib/languages/es.js → src/es-MX.js} +228 -18
  203. package/src/es-US.d.ts +58 -0
  204. package/src/es-US.js +446 -0
  205. package/src/fa-IR.d.ts +38 -0
  206. package/src/fa-IR.js +246 -0
  207. package/src/fi-FI.d.ts +46 -0
  208. package/{lib/languages/fi.js → src/fi-FI.js} +152 -11
  209. package/src/fil-PH.d.ts +37 -0
  210. package/{lib/languages/fil.js → src/fil-PH.js} +144 -8
  211. package/src/fr-BE.d.ts +49 -0
  212. package/{lib/languages → src}/fr-BE.js +175 -13
  213. package/src/fr-FR.d.ts +63 -0
  214. package/{lib/languages/fr.js → src/fr-FR.js} +182 -16
  215. package/src/gu-IN.d.ts +35 -0
  216. package/{lib/languages/gu.js → src/gu-IN.js} +115 -6
  217. package/src/ha-NG.d.ts +37 -0
  218. package/{lib/languages/ha.js → src/ha-NG.js} +107 -8
  219. package/src/hbo-IL.d.ts +39 -0
  220. package/{lib/languages/hbo.js → src/hbo-IL.js} +211 -19
  221. package/src/he-IL.d.ts +37 -0
  222. package/src/he-IL.js +537 -0
  223. package/src/hi-IN.d.ts +36 -0
  224. package/{lib/languages/hi.js → src/hi-IN.js} +116 -6
  225. package/src/hr-HR.d.ts +42 -0
  226. package/src/hr-HR.js +463 -0
  227. package/src/hu-HU.d.ts +38 -0
  228. package/{lib/languages/hu.js → src/hu-HU.js} +164 -6
  229. package/src/id-ID.d.ts +38 -0
  230. package/{lib/languages/id.js → src/id-ID.js} +99 -8
  231. package/src/it-IT.d.ts +59 -0
  232. package/{lib/languages/it.js → src/it-IT.js} +179 -15
  233. package/src/ja-JP.d.ts +49 -0
  234. package/{lib/languages/ja.js → src/ja-JP.js} +111 -12
  235. package/src/ka-GE.d.ts +44 -0
  236. package/{lib/languages/ka.js → src/ka-GE.js} +113 -11
  237. package/src/kn-IN.d.ts +35 -0
  238. package/{lib/languages/kn.js → src/kn-IN.js} +115 -6
  239. package/src/ko-KR.d.ts +45 -0
  240. package/{lib/languages/ko.js → src/ko-KR.js} +94 -12
  241. package/src/lt-LT.d.ts +49 -0
  242. package/src/lt-LT.js +543 -0
  243. package/src/lv-LV.d.ts +49 -0
  244. package/src/lv-LV.js +595 -0
  245. package/src/mr-IN.d.ts +36 -0
  246. package/{lib/languages/mr.js → src/mr-IN.js} +116 -6
  247. package/src/ms-MY.d.ts +37 -0
  248. package/{lib/languages/ms.js → src/ms-MY.js} +111 -8
  249. package/src/nb-NO.d.ts +44 -0
  250. package/{lib/languages/nb.js → src/nb-NO.js} +153 -11
  251. package/src/nl-NL.d.ts +54 -0
  252. package/{lib/languages/nl.js → src/nl-NL.js} +260 -18
  253. package/src/pa-IN.d.ts +36 -0
  254. package/{lib/languages/pa.js → src/pa-IN.js} +116 -6
  255. package/src/pl-PL.d.ts +55 -0
  256. package/src/pl-PL.js +585 -0
  257. package/src/pt-BR.d.ts +31 -0
  258. package/src/pt-BR.js +534 -0
  259. package/src/pt-PT.d.ts +45 -0
  260. package/{lib/languages/pt.js → src/pt-PT.js} +234 -12
  261. package/src/ro-RO.d.ts +44 -0
  262. package/{lib/languages/ro.js → src/ro-RO.js} +212 -18
  263. package/src/ru-RU.d.ts +50 -0
  264. package/src/ru-RU.js +535 -0
  265. package/src/sr-Cyrl-RS.d.ts +49 -0
  266. package/src/sr-Cyrl-RS.js +503 -0
  267. package/src/sr-Latn-RS.d.ts +49 -0
  268. package/src/sr-Latn-RS.js +503 -0
  269. package/src/sv-SE.d.ts +44 -0
  270. package/{lib/languages/sv.js → src/sv-SE.js} +136 -11
  271. package/src/sw-KE.d.ts +37 -0
  272. package/{lib/languages/sw.js → src/sw-KE.js} +117 -6
  273. package/src/ta-IN.d.ts +35 -0
  274. package/{lib/languages/ta.js → src/ta-IN.js} +109 -6
  275. package/src/te-IN.d.ts +35 -0
  276. package/{lib/languages/te.js → src/te-IN.js} +115 -6
  277. package/src/th-TH.d.ts +38 -0
  278. package/{lib/languages/th.js → src/th-TH.js} +99 -6
  279. package/src/tr-TR.d.ts +48 -0
  280. package/{lib/languages/tr.js → src/tr-TR.js} +168 -23
  281. package/src/uk-UA.d.ts +42 -0
  282. package/src/uk-UA.js +463 -0
  283. package/src/ur-PK.d.ts +36 -0
  284. package/{lib/languages/ur.js → src/ur-PK.js} +116 -6
  285. package/src/utils/expand-scientific.d.ts +32 -0
  286. package/src/utils/expand-scientific.js +65 -0
  287. package/src/utils/parse-cardinal.d.ts +14 -0
  288. package/{lib/utils/parse-numeric.js → src/utils/parse-cardinal.js} +14 -44
  289. package/src/utils/parse-currency.d.ts +14 -0
  290. package/src/utils/parse-currency.js +91 -0
  291. package/src/utils/parse-ordinal.d.ts +10 -0
  292. package/src/utils/parse-ordinal.js +103 -0
  293. package/src/vi-VN.d.ts +48 -0
  294. package/{lib/languages/vi.js → src/vi-VN.js} +102 -11
  295. package/src/yo-NG.d.ts +37 -0
  296. package/{lib/languages/yo.js → src/yo-NG.js} +109 -9
  297. package/src/zh-Hans-CN.d.ts +48 -0
  298. package/{lib/languages/zh-Hans.js → src/zh-Hans-CN.js} +140 -8
  299. package/src/zh-Hant-TW.d.ts +50 -0
  300. package/{lib/languages/zh-Hant.js → src/zh-Hant-TW.js} +139 -8
  301. package/dist/languages/am-Latn.js +0 -3
  302. package/dist/languages/am-Latn.js.map +0 -1
  303. package/dist/languages/am.js +0 -3
  304. package/dist/languages/am.js.map +0 -1
  305. package/dist/languages/ar.js +0 -3
  306. package/dist/languages/ar.js.map +0 -1
  307. package/dist/languages/az.js +0 -3
  308. package/dist/languages/az.js.map +0 -1
  309. package/dist/languages/bn.js +0 -3
  310. package/dist/languages/bn.js.map +0 -1
  311. package/dist/languages/cs.js +0 -3
  312. package/dist/languages/cs.js.map +0 -1
  313. package/dist/languages/da.js +0 -3
  314. package/dist/languages/da.js.map +0 -1
  315. package/dist/languages/de.js +0 -3
  316. package/dist/languages/de.js.map +0 -1
  317. package/dist/languages/el.js +0 -3
  318. package/dist/languages/el.js.map +0 -1
  319. package/dist/languages/en.js +0 -3
  320. package/dist/languages/en.js.map +0 -1
  321. package/dist/languages/es.js +0 -3
  322. package/dist/languages/es.js.map +0 -1
  323. package/dist/languages/fa.js +0 -3
  324. package/dist/languages/fa.js.map +0 -1
  325. package/dist/languages/fi.js +0 -3
  326. package/dist/languages/fi.js.map +0 -1
  327. package/dist/languages/fil.js +0 -3
  328. package/dist/languages/fil.js.map +0 -1
  329. package/dist/languages/fr-BE.js +0 -3
  330. package/dist/languages/fr-BE.js.map +0 -1
  331. package/dist/languages/fr.js +0 -3
  332. package/dist/languages/fr.js.map +0 -1
  333. package/dist/languages/gu.js +0 -3
  334. package/dist/languages/gu.js.map +0 -1
  335. package/dist/languages/ha.js +0 -3
  336. package/dist/languages/ha.js.map +0 -1
  337. package/dist/languages/hbo.js +0 -3
  338. package/dist/languages/hbo.js.map +0 -1
  339. package/dist/languages/he.js +0 -3
  340. package/dist/languages/he.js.map +0 -1
  341. package/dist/languages/hi.js +0 -3
  342. package/dist/languages/hi.js.map +0 -1
  343. package/dist/languages/hr.js +0 -3
  344. package/dist/languages/hr.js.map +0 -1
  345. package/dist/languages/hu.js +0 -3
  346. package/dist/languages/hu.js.map +0 -1
  347. package/dist/languages/id.js +0 -3
  348. package/dist/languages/id.js.map +0 -1
  349. package/dist/languages/it.js +0 -3
  350. package/dist/languages/it.js.map +0 -1
  351. package/dist/languages/ja.js +0 -3
  352. package/dist/languages/ja.js.map +0 -1
  353. package/dist/languages/ka.js +0 -3
  354. package/dist/languages/ka.js.map +0 -1
  355. package/dist/languages/kn.js +0 -3
  356. package/dist/languages/kn.js.map +0 -1
  357. package/dist/languages/ko.js +0 -3
  358. package/dist/languages/ko.js.map +0 -1
  359. package/dist/languages/lt.js +0 -3
  360. package/dist/languages/lt.js.map +0 -1
  361. package/dist/languages/lv.js +0 -3
  362. package/dist/languages/lv.js.map +0 -1
  363. package/dist/languages/mr.js +0 -3
  364. package/dist/languages/mr.js.map +0 -1
  365. package/dist/languages/ms.js +0 -3
  366. package/dist/languages/ms.js.map +0 -1
  367. package/dist/languages/nb.js +0 -3
  368. package/dist/languages/nb.js.map +0 -1
  369. package/dist/languages/nl.js +0 -3
  370. package/dist/languages/nl.js.map +0 -1
  371. package/dist/languages/pa.js +0 -3
  372. package/dist/languages/pa.js.map +0 -1
  373. package/dist/languages/pl.js +0 -3
  374. package/dist/languages/pl.js.map +0 -1
  375. package/dist/languages/pt.js +0 -3
  376. package/dist/languages/pt.js.map +0 -1
  377. package/dist/languages/ro.js +0 -3
  378. package/dist/languages/ro.js.map +0 -1
  379. package/dist/languages/ru.js +0 -3
  380. package/dist/languages/ru.js.map +0 -1
  381. package/dist/languages/sr-Cyrl.js +0 -3
  382. package/dist/languages/sr-Cyrl.js.map +0 -1
  383. package/dist/languages/sr-Latn.js +0 -3
  384. package/dist/languages/sr-Latn.js.map +0 -1
  385. package/dist/languages/sv.js +0 -3
  386. package/dist/languages/sv.js.map +0 -1
  387. package/dist/languages/sw.js +0 -3
  388. package/dist/languages/sw.js.map +0 -1
  389. package/dist/languages/ta.js +0 -3
  390. package/dist/languages/ta.js.map +0 -1
  391. package/dist/languages/te.js +0 -3
  392. package/dist/languages/te.js.map +0 -1
  393. package/dist/languages/th.js +0 -3
  394. package/dist/languages/th.js.map +0 -1
  395. package/dist/languages/tr.js +0 -3
  396. package/dist/languages/tr.js.map +0 -1
  397. package/dist/languages/uk.js +0 -3
  398. package/dist/languages/uk.js.map +0 -1
  399. package/dist/languages/ur.js +0 -3
  400. package/dist/languages/ur.js.map +0 -1
  401. package/dist/languages/vi.js +0 -3
  402. package/dist/languages/vi.js.map +0 -1
  403. package/dist/languages/yo.js +0 -3
  404. package/dist/languages/yo.js.map +0 -1
  405. package/dist/languages/zh-Hans.js +0 -3
  406. package/dist/languages/zh-Hans.js.map +0 -1
  407. package/dist/languages/zh-Hant.js +0 -3
  408. package/dist/languages/zh-Hant.js.map +0 -1
  409. package/dist/n2words.js +0 -3
  410. package/dist/n2words.js.map +0 -1
  411. package/lib/languages/am-Latn.d.ts +0 -7
  412. package/lib/languages/am-Latn.js +0 -159
  413. package/lib/languages/am.d.ts +0 -7
  414. package/lib/languages/am.js +0 -159
  415. package/lib/languages/ar.d.ts +0 -17
  416. package/lib/languages/az.d.ts +0 -7
  417. package/lib/languages/az.js +0 -171
  418. package/lib/languages/bn.d.ts +0 -7
  419. package/lib/languages/cs.d.ts +0 -18
  420. package/lib/languages/da.d.ts +0 -14
  421. package/lib/languages/de.d.ts +0 -17
  422. package/lib/languages/de.js +0 -320
  423. package/lib/languages/el.d.ts +0 -14
  424. package/lib/languages/el.js +0 -236
  425. package/lib/languages/en.d.ts +0 -17
  426. package/lib/languages/es.d.ts +0 -21
  427. package/lib/languages/fa.d.ts +0 -7
  428. package/lib/languages/fa.js +0 -134
  429. package/lib/languages/fi.d.ts +0 -14
  430. package/lib/languages/fil.d.ts +0 -7
  431. package/lib/languages/fr-BE.d.ts +0 -11
  432. package/lib/languages/fr.d.ts +0 -21
  433. package/lib/languages/gu.d.ts +0 -7
  434. package/lib/languages/ha.d.ts +0 -7
  435. package/lib/languages/hbo.d.ts +0 -13
  436. package/lib/languages/he.d.ts +0 -13
  437. package/lib/languages/he.js +0 -265
  438. package/lib/languages/hi.d.ts +0 -7
  439. package/lib/languages/hr.d.ts +0 -11
  440. package/lib/languages/hr.js +0 -224
  441. package/lib/languages/hu.d.ts +0 -7
  442. package/lib/languages/id.d.ts +0 -7
  443. package/lib/languages/it.d.ts +0 -19
  444. package/lib/languages/ja.d.ts +0 -17
  445. package/lib/languages/ka.d.ts +0 -17
  446. package/lib/languages/kn.d.ts +0 -7
  447. package/lib/languages/ko.d.ts +0 -14
  448. package/lib/languages/lt.d.ts +0 -18
  449. package/lib/languages/lt.js +0 -301
  450. package/lib/languages/lv.d.ts +0 -18
  451. package/lib/languages/lv.js +0 -312
  452. package/lib/languages/mr.d.ts +0 -7
  453. package/lib/languages/ms.d.ts +0 -7
  454. package/lib/languages/nb.d.ts +0 -14
  455. package/lib/languages/nl.d.ts +0 -26
  456. package/lib/languages/pa.d.ts +0 -7
  457. package/lib/languages/pl.d.ts +0 -22
  458. package/lib/languages/pl.js +0 -317
  459. package/lib/languages/pt.d.ts +0 -17
  460. package/lib/languages/ro.d.ts +0 -18
  461. package/lib/languages/ru.d.ts +0 -11
  462. package/lib/languages/ru.js +0 -245
  463. package/lib/languages/sr-Cyrl.d.ts +0 -11
  464. package/lib/languages/sr-Cyrl.js +0 -221
  465. package/lib/languages/sr-Latn.d.ts +0 -11
  466. package/lib/languages/sr-Latn.js +0 -221
  467. package/lib/languages/sv.d.ts +0 -14
  468. package/lib/languages/sw.d.ts +0 -7
  469. package/lib/languages/ta.d.ts +0 -7
  470. package/lib/languages/te.d.ts +0 -7
  471. package/lib/languages/th.d.ts +0 -7
  472. package/lib/languages/tr.d.ts +0 -18
  473. package/lib/languages/uk.d.ts +0 -11
  474. package/lib/languages/uk.js +0 -224
  475. package/lib/languages/ur.d.ts +0 -7
  476. package/lib/languages/vi.d.ts +0 -17
  477. package/lib/languages/yo.d.ts +0 -7
  478. package/lib/languages/zh-Hans.d.ts +0 -11
  479. package/lib/languages/zh-Hant.d.ts +0 -11
  480. package/lib/n2words.d.ts +0 -55
  481. package/lib/n2words.js +0 -126
  482. package/lib/utils/parse-numeric.d.ts +0 -17
  483. /package/{lib → src}/utils/is-plain-object.d.ts +0 -0
  484. /package/{lib → src}/utils/is-plain-object.js +0 -0
  485. /package/{lib → src}/utils/validate-options.d.ts +0 -0
  486. /package/{lib → src}/utils/validate-options.js +0 -0
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Telugu language converter - Functional Implementation
2
+ * Telugu (India) language converter
3
3
  *
4
- * Self-contained module with its own input validation, ready for subpath exports.
4
+ * CLDR: te-IN | Telugu as used in India
5
5
  *
6
6
  * Key features:
7
7
  * - Indian numbering system (వెయ్యి, లక్ష, కోటి)
@@ -11,7 +11,9 @@
11
11
  * - Per-digit decimal reading
12
12
  */
13
13
 
14
- import { parseNumericValue } from '../utils/parse-numeric.js'
14
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
15
+ import { parseCurrencyValue } from './utils/parse-currency.js'
16
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
15
17
 
16
18
  // ============================================================================
17
19
  // Vocabulary
@@ -21,6 +23,28 @@ const ZERO = 'సున్నా'
21
23
  const NEGATIVE = 'మైనస్'
22
24
  const DECIMAL_SEP = 'పాయింట్'
23
25
 
26
+ // ============================================================================
27
+ // Ordinal Vocabulary
28
+ // ============================================================================
29
+
30
+ // Ordinal suffix (adds to cardinal for numbers >= 7)
31
+ const ORDINAL_SUFFIX = 'వ'
32
+
33
+ // Special ordinals for first few numbers
34
+ const ORDINAL_SPECIAL = ['', 'మొదటి', 'రెండవ', 'మూడవ', 'నాలుగవ', 'ఐదవ', 'ఆరవ']
35
+
36
+ // ============================================================================
37
+ // Currency Vocabulary (Indian Rupee)
38
+ // ============================================================================
39
+
40
+ // Rupee (singular/plural same in Telugu)
41
+ const RUPEE = 'రూపాయి'
42
+ const RUPEES = 'రూపాయలు'
43
+
44
+ // Paisa (singular/plural same in Telugu)
45
+ const PAISA = 'పైసా'
46
+ const PAISE = 'పైసలు'
47
+
24
48
  const BELOW_HUNDRED = [
25
49
  'సున్నా', 'ఒకటి', 'రెండు', 'మూడు', 'నాలుగు', 'ఐదు', 'ఆరు', 'ఏడు', 'ఎనిమిది', 'తొమ్మిది',
26
50
  'పది', 'పదకొండు', 'పన్నెండు', 'పదమూడు', 'పద్నాలుగు', 'పదిహేను', 'పదహారు', 'పదిహేడు', 'పద్దెనిమిది', 'పంతొమ్మిది',
@@ -131,8 +155,8 @@ function decimalPartToWords (decimalPart) {
131
155
  * @param {number | string | bigint} value - The numeric value to convert
132
156
  * @returns {string} The number in Telugu words
133
157
  */
134
- function toWords (value) {
135
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
158
+ function toCardinal (value) {
159
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
136
160
 
137
161
  let result = ''
138
162
 
@@ -149,8 +173,93 @@ function toWords (value) {
149
173
  return result
150
174
  }
151
175
 
176
+ // ============================================================================
177
+ // ORDINAL: toOrdinal(value)
178
+ // ============================================================================
179
+
180
+ /**
181
+ * Converts a positive integer to Telugu ordinal words.
182
+ *
183
+ * Telugu ordinals: First 6 are irregular, then add -వ suffix.
184
+ *
185
+ * @param {bigint} n - Positive integer to convert
186
+ * @returns {string} Telugu ordinal words
187
+ */
188
+ function integerToOrdinal (n) {
189
+ // Special ordinals for 1-6
190
+ if (n >= 1n && n <= 6n) {
191
+ return ORDINAL_SPECIAL[Number(n)]
192
+ }
193
+
194
+ // For 7 and above, add suffix to cardinal
195
+ const cardinal = integerToWords(n)
196
+ return cardinal + ORDINAL_SUFFIX
197
+ }
198
+
199
+ /**
200
+ * Converts a numeric value to Telugu ordinal words.
201
+ *
202
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
203
+ * @returns {string} The number as ordinal words
204
+ * @throws {TypeError} If value is not a valid numeric type
205
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
206
+ *
207
+ * @example
208
+ * toOrdinal(1) // 'మొదటి'
209
+ * toOrdinal(2) // 'రెండవ'
210
+ * toOrdinal(10) // 'పదివ'
211
+ */
212
+ function toOrdinal (value) {
213
+ const integerPart = parseOrdinalValue(value)
214
+ return integerToOrdinal(integerPart)
215
+ }
216
+
217
+ // ============================================================================
218
+ // CURRENCY: toCurrency(value, options?)
219
+ // ============================================================================
220
+
221
+ /**
222
+ * Converts a numeric value to Telugu currency words (Indian Rupee).
223
+ *
224
+ * @param {number | string | bigint} value - The currency amount to convert
225
+ * @returns {string} The amount in Telugu currency words
226
+ * @throws {TypeError} If value is not a valid numeric type
227
+ * @throws {Error} If value is not a valid number format
228
+ *
229
+ * @example
230
+ * toCurrency(42.50) // 'నలభై రెండు రూపాయలు యాభై పైసలు'
231
+ * toCurrency(1) // 'ఒకటి రూపాయి'
232
+ * toCurrency(0.01) // 'ఒకటి పైసా'
233
+ */
234
+ function toCurrency (value) {
235
+ const { isNegative, dollars: rupees, cents: paise } = parseCurrencyValue(value)
236
+
237
+ // Build result
238
+ let result = ''
239
+ if (isNegative) result = NEGATIVE + ' '
240
+
241
+ // Rupees part - show if non-zero, or if no paise
242
+ if (rupees > 0n || paise === 0n) {
243
+ result += integerToWords(rupees)
244
+ // Singular for 1 rupee, plural otherwise
245
+ result += ' ' + (rupees === 1n ? RUPEE : RUPEES)
246
+ }
247
+
248
+ // Paise part
249
+ if (paise > 0n) {
250
+ if (rupees > 0n) {
251
+ result += ' '
252
+ }
253
+ result += integerToWords(paise)
254
+ // Singular for 1 paisa, plural otherwise
255
+ result += ' ' + (paise === 1n ? PAISA : PAISE)
256
+ }
257
+
258
+ return result
259
+ }
260
+
152
261
  // ============================================================================
153
262
  // Exports
154
263
  // ============================================================================
155
264
 
156
- export { toWords }
265
+ export { toCardinal, toOrdinal, toCurrency }
package/src/th-TH.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Converts a numeric value to Thai words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @returns {string} The number in Thai words
6
+ */
7
+ export function toCardinal(value: number | string | bigint): string;
8
+ /**
9
+ * Converts a numeric value to Thai ordinal words.
10
+ *
11
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
12
+ * @returns {string} The number as ordinal words
13
+ * @throws {TypeError} If value is not a valid numeric type
14
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
15
+ *
16
+ * @example
17
+ * toOrdinal(1) // 'ที่หนึ่ง'
18
+ * toOrdinal(2) // 'ที่สอง'
19
+ * toOrdinal(10) // 'ที่สิบ'
20
+ */
21
+ export function toOrdinal(value: number | string | bigint): string;
22
+ /**
23
+ * Converts a numeric value to Thai currency words (Baht).
24
+ *
25
+ * Thai Baht uses satang as subunit (100 satang = 1 baht).
26
+ * When whole amounts, adds "ถ้วน" (exactly) suffix.
27
+ *
28
+ * @param {number | string | bigint} value - The currency amount to convert
29
+ * @returns {string} The amount in Thai currency words
30
+ * @throws {TypeError} If value is not a valid numeric type
31
+ * @throws {Error} If value is not a valid number format
32
+ *
33
+ * @example
34
+ * toCurrency(42) // 'สี่สิบสองบาทถ้วน'
35
+ * toCurrency(1.50) // 'หนึ่งบาทห้าสิบสตางค์'
36
+ * toCurrency(-5) // 'ลบห้าบาทถ้วน'
37
+ */
38
+ export function toCurrency(value: number | string | bigint): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Thai language converter - Functional Implementation
2
+ * Thai (Thailand) language converter
3
3
  *
4
- * Self-contained converter with precomputed lookup tables.
4
+ * CLDR: th-TH | Thai as used in Thailand
5
5
  *
6
6
  * Key features:
7
7
  * - No word separators (continuous Thai script)
@@ -11,7 +11,9 @@
11
11
  * - Per-digit decimal reading
12
12
  */
13
13
 
14
- import { parseNumericValue } from '../utils/parse-numeric.js'
14
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
15
+ import { parseCurrencyValue } from './utils/parse-currency.js'
16
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
15
17
 
16
18
  // ============================================================================
17
19
  // Vocabulary
@@ -23,6 +25,20 @@ const ZERO = 'ศูนย์'
23
25
  const NEGATIVE = 'ลบ'
24
26
  const DECIMAL_SEP = 'จุด'
25
27
 
28
+ // ============================================================================
29
+ // Ordinal Vocabulary
30
+ // ============================================================================
31
+
32
+ const ORDINAL_PREFIX = 'ที่'
33
+
34
+ // ============================================================================
35
+ // Currency Vocabulary (Thai Baht)
36
+ // ============================================================================
37
+
38
+ const BAHT = 'บาท'
39
+ const SATANG = 'สตางค์'
40
+ const BAHT_ONLY = 'ถ้วน' // "exactly" suffix when no satang
41
+
26
42
  // ============================================================================
27
43
  // Conversion Functions
28
44
  // ============================================================================
@@ -136,8 +152,8 @@ function decimalPartToWords (decimalPart) {
136
152
  * @param {number | string | bigint} value - The numeric value to convert
137
153
  * @returns {string} The number in Thai words
138
154
  */
139
- function toWords (value) {
140
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
155
+ function toCardinal (value) {
156
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
141
157
 
142
158
  let result = ''
143
159
 
@@ -154,8 +170,85 @@ function toWords (value) {
154
170
  return result
155
171
  }
156
172
 
173
+ // ============================================================================
174
+ // ORDINAL: toOrdinal(value)
175
+ // ============================================================================
176
+
177
+ /**
178
+ * Converts a non-negative integer to Thai ordinal words.
179
+ *
180
+ * Thai ordinals use "ที่" prefix + cardinal number.
181
+ *
182
+ * @param {bigint} n - Positive integer to convert
183
+ * @returns {string} Thai ordinal words
184
+ */
185
+ function integerToOrdinal (n) {
186
+ return ORDINAL_PREFIX + integerToWords(n)
187
+ }
188
+
189
+ /**
190
+ * Converts a numeric value to Thai ordinal words.
191
+ *
192
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
193
+ * @returns {string} The number as ordinal words
194
+ * @throws {TypeError} If value is not a valid numeric type
195
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
196
+ *
197
+ * @example
198
+ * toOrdinal(1) // 'ที่หนึ่ง'
199
+ * toOrdinal(2) // 'ที่สอง'
200
+ * toOrdinal(10) // 'ที่สิบ'
201
+ */
202
+ function toOrdinal (value) {
203
+ const integerPart = parseOrdinalValue(value)
204
+ return integerToOrdinal(integerPart)
205
+ }
206
+
207
+ // ============================================================================
208
+ // CURRENCY: toCurrency(value)
209
+ // ============================================================================
210
+
211
+ /**
212
+ * Converts a numeric value to Thai currency words (Baht).
213
+ *
214
+ * Thai Baht uses satang as subunit (100 satang = 1 baht).
215
+ * When whole amounts, adds "ถ้วน" (exactly) suffix.
216
+ *
217
+ * @param {number | string | bigint} value - The currency amount to convert
218
+ * @returns {string} The amount in Thai currency words
219
+ * @throws {TypeError} If value is not a valid numeric type
220
+ * @throws {Error} If value is not a valid number format
221
+ *
222
+ * @example
223
+ * toCurrency(42) // 'สี่สิบสองบาทถ้วน'
224
+ * toCurrency(1.50) // 'หนึ่งบาทห้าสิบสตางค์'
225
+ * toCurrency(-5) // 'ลบห้าบาทถ้วน'
226
+ */
227
+ function toCurrency (value) {
228
+ const { isNegative, dollars: baht, cents: satang } = parseCurrencyValue(value)
229
+
230
+ let result = ''
231
+ if (isNegative) {
232
+ result = NEGATIVE
233
+ }
234
+
235
+ // Baht part - always show
236
+ result += integerToWords(baht)
237
+ result += BAHT
238
+
239
+ // Satang part or "exactly" suffix
240
+ if (satang > 0n) {
241
+ result += integerToWords(satang)
242
+ result += SATANG
243
+ } else {
244
+ result += BAHT_ONLY
245
+ }
246
+
247
+ return result
248
+ }
249
+
157
250
  // ============================================================================
158
251
  // Exports
159
252
  // ============================================================================
160
253
 
161
- export { toWords }
254
+ export { toCardinal, toOrdinal, toCurrency }
package/src/tr-TR.d.ts ADDED
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Converts a numeric value to Turkish words.
3
+ *
4
+ * @param {number | string | bigint} value - The numeric value to convert
5
+ * @param {Object} [options] - Conversion options
6
+ * @param {boolean} [options.dropSpaces=false] - Remove spaces for compound form
7
+ * @returns {string} The number in Turkish 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) // 'yirmi bir'
13
+ * toCardinal(21, { dropSpaces: true }) // 'yirmibir'
14
+ * toCardinal(1000) // 'bin'
15
+ */
16
+ export function toCardinal(value: number | string | bigint, options?: {
17
+ dropSpaces?: boolean | undefined;
18
+ }): string;
19
+ /**
20
+ * Converts a numeric value to Turkish ordinal words.
21
+ *
22
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
23
+ * @returns {string} The number as ordinal words
24
+ * @throws {TypeError} If value is not a valid numeric type
25
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
26
+ *
27
+ * @example
28
+ * toOrdinal(1) // 'birinci'
29
+ * toOrdinal(2) // 'ikinci'
30
+ * toOrdinal(21) // 'yirmibirinci'
31
+ */
32
+ export function toOrdinal(value: number | string | bigint): string;
33
+ /**
34
+ * Converts a numeric value to Turkish currency words (Turkish Lira).
35
+ *
36
+ * Uses lira and kuruş (100 kuruş = 1 lira).
37
+ *
38
+ * @param {number | string | bigint} value - The currency amount to convert
39
+ * @returns {string} The amount in Turkish currency words
40
+ * @throws {TypeError} If value is not a valid numeric type
41
+ * @throws {Error} If value is not a valid number format
42
+ *
43
+ * @example
44
+ * toCurrency(42) // 'kırk iki lira'
45
+ * toCurrency(1.50) // 'bir lira elli kuruş'
46
+ * toCurrency(-5) // 'eksi beş lira'
47
+ */
48
+ export function toCurrency(value: number | string | bigint): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Turkish language converter - Functional Implementation
2
+ * Turkish (Turkey) language converter
3
3
  *
4
- * Self-contained module with its own input validation, ready for subpath exports.
4
+ * CLDR: tr-TR | Turkish as used in Turkey
5
5
  *
6
6
  * Key features:
7
7
  * - Omits 'bir' (one) before hundreds and thousands
@@ -9,8 +9,10 @@
9
9
  * - Short scale naming
10
10
  */
11
11
 
12
- import { parseNumericValue } from '../utils/parse-numeric.js'
13
- import { validateOptions } from '../utils/validate-options.js'
12
+ import { parseCardinalValue } from './utils/parse-cardinal.js'
13
+ import { parseCurrencyValue } from './utils/parse-currency.js'
14
+ import { parseOrdinalValue } from './utils/parse-ordinal.js'
15
+ import { validateOptions } from './utils/validate-options.js'
14
16
 
15
17
  // ============================================================================
16
18
  // Vocabulary (module-level constants)
@@ -31,6 +33,32 @@ const DECIMAL_SEP = 'virgül'
31
33
  // Short scale
32
34
  const SCALES = ['milyon', 'milyar', 'trilyon', 'katrilyon', 'kentilyon']
33
35
 
36
+ // ============================================================================
37
+ // Ordinal Vocabulary
38
+ // ============================================================================
39
+
40
+ // Turkish ordinals use -(i/ı/u/ü)nci/ncı/ncu/ncü suffix with vowel harmony
41
+ // Special forms for 1-10
42
+ const ORDINAL_SPECIAL = {
43
+ 1: 'birinci',
44
+ 2: 'ikinci',
45
+ 3: 'üçüncü',
46
+ 4: 'dördüncü',
47
+ 5: 'beşinci',
48
+ 6: 'altıncı',
49
+ 7: 'yedinci',
50
+ 8: 'sekizinci',
51
+ 9: 'dokuzuncu',
52
+ 10: 'onuncu'
53
+ }
54
+
55
+ // ============================================================================
56
+ // Currency Vocabulary (Turkish Lira)
57
+ // ============================================================================
58
+
59
+ const LIRA = 'lira' // same singular and plural
60
+ const KURUS = 'kuruş' // subunit (100 kuruş = 1 lira)
61
+
34
62
  // ============================================================================
35
63
  // Segment Building
36
64
  // ============================================================================
@@ -43,8 +71,8 @@ function buildSegment (n, separator = ' ') {
43
71
  if (n === 0) return ''
44
72
 
45
73
  const ones = n % 10
46
- const tens = Math.floor(n / 10) % 10
47
- const hundreds = Math.floor(n / 100)
74
+ const tens = Math.trunc(n / 10) % 10
75
+ const hundreds = Math.trunc(n / 100)
48
76
 
49
77
  const parts = []
50
78
 
@@ -86,10 +114,10 @@ function buildSegment (n, separator = ' ') {
86
114
  * @param {Object} options - Conversion options
87
115
  * @returns {string} Turkish words
88
116
  */
89
- function integerToWords (n, options = {}) {
117
+ function integerToWords (n, dropSpaces) {
90
118
  if (n === 0n) return ZERO
91
119
 
92
- const sep = options.dropSpaces ? '' : ' '
120
+ const sep = dropSpaces ? '' : ' '
93
121
 
94
122
  // Fast path: numbers < 1000
95
123
  if (n < 1000n) {
@@ -117,7 +145,7 @@ function integerToWords (n, options = {}) {
117
145
  }
118
146
 
119
147
  // For numbers >= 1,000,000, use scale decomposition
120
- return buildLargeNumberWords(n, options)
148
+ return buildLargeNumberWords(n, dropSpaces)
121
149
  }
122
150
 
123
151
  /**
@@ -127,8 +155,8 @@ function integerToWords (n, options = {}) {
127
155
  * @param {Object} options - Conversion options
128
156
  * @returns {string} Turkish words
129
157
  */
130
- function buildLargeNumberWords (n, options) {
131
- const sep = options.dropSpaces ? '' : ' '
158
+ function buildLargeNumberWords (n, dropSpaces) {
159
+ const sep = dropSpaces ? '' : ' '
132
160
 
133
161
  const numStr = n.toString()
134
162
  const len = numStr.length
@@ -188,8 +216,8 @@ function buildLargeNumberWords (n, options) {
188
216
  * @param {Object} options - Conversion options
189
217
  * @returns {string} Turkish words for decimal part
190
218
  */
191
- function decimalPartToWords (decimalPart, options) {
192
- const sep = options.dropSpaces ? '' : ' '
219
+ function decimalPartToWords (decimalPart, dropSpaces) {
220
+ const sep = dropSpaces ? '' : ' '
193
221
  let result = ''
194
222
 
195
223
  // Handle leading zeros
@@ -204,7 +232,7 @@ function decimalPartToWords (decimalPart, options) {
204
232
  const remainder = decimalPart.slice(i)
205
233
  if (remainder) {
206
234
  if (result) result += sep
207
- result += integerToWords(BigInt(remainder), options)
235
+ result += integerToWords(BigInt(remainder), dropSpaces)
208
236
  }
209
237
 
210
238
  return result
@@ -221,25 +249,142 @@ function decimalPartToWords (decimalPart, options) {
221
249
  * @throws {Error} If value is not a valid number format
222
250
  *
223
251
  * @example
224
- * toWords(21) // 'yirmi bir'
225
- * toWords(21, { dropSpaces: true }) // 'yirmibir'
226
- * toWords(1000) // 'bin'
252
+ * toCardinal(21) // 'yirmi bir'
253
+ * toCardinal(21, { dropSpaces: true }) // 'yirmibir'
254
+ * toCardinal(1000) // 'bin'
227
255
  */
228
- function toWords (value, options) {
256
+ function toCardinal (value, options) {
229
257
  options = validateOptions(options)
230
- const { isNegative, integerPart, decimalPart } = parseNumericValue(value)
258
+ const { isNegative, integerPart, decimalPart } = parseCardinalValue(value)
259
+
260
+ // Apply option defaults
261
+ const { dropSpaces = false } = options
231
262
 
232
- const sep = options.dropSpaces ? '' : ' '
263
+ const sep = dropSpaces ? '' : ' '
233
264
  let result = ''
234
265
 
235
266
  if (isNegative) {
236
267
  result = NEGATIVE + sep
237
268
  }
238
269
 
239
- result += integerToWords(integerPart, options)
270
+ result += integerToWords(integerPart, dropSpaces)
240
271
 
241
272
  if (decimalPart) {
242
- result += sep + DECIMAL_SEP + sep + decimalPartToWords(decimalPart, options)
273
+ result += sep + DECIMAL_SEP + sep + decimalPartToWords(decimalPart, dropSpaces)
274
+ }
275
+
276
+ return result
277
+ }
278
+
279
+ // ============================================================================
280
+ // ORDINAL: toOrdinal(value)
281
+ // ============================================================================
282
+
283
+ /**
284
+ * Determines the ordinal suffix based on Turkish vowel harmony.
285
+ * @param {string} word - The cardinal word
286
+ * @returns {string} The appropriate suffix
287
+ */
288
+ function getOrdinalSuffix (word) {
289
+ // Turkish vowel harmony: back vowels (a,ı,o,u) vs front vowels (e,i,ö,ü)
290
+ // Find last vowel to determine suffix
291
+ const backVowels = 'aıou'
292
+ const frontVowels = 'eiöü'
293
+
294
+ // Scan from end for last vowel
295
+ for (let i = word.length - 1; i >= 0; i--) {
296
+ const char = word[i]
297
+ if (backVowels.includes(char)) {
298
+ // Back vowels: -ıncı (after ı,a) or -uncu (after o,u)
299
+ if ('ou'.includes(char)) return 'uncu'
300
+ return 'ıncı'
301
+ }
302
+ if (frontVowels.includes(char)) {
303
+ // Front vowels: -inci (after e,i) or -üncü (after ö,ü)
304
+ if ('öü'.includes(char)) return 'üncü'
305
+ return 'inci'
306
+ }
307
+ }
308
+ return 'inci' // default
309
+ }
310
+
311
+ /**
312
+ * Converts a non-negative integer to Turkish ordinal words.
313
+ *
314
+ * Turkish ordinals: birinci (1st), ikinci (2nd), üçüncü (3rd), etc.
315
+ * Uses vowel harmony for suffix selection.
316
+ *
317
+ * @param {bigint} n - Positive integer to convert
318
+ * @returns {string} Turkish ordinal words
319
+ */
320
+ function integerToOrdinal (n) {
321
+ // Special forms for 1-10
322
+ if (n >= 1n && n <= 10n) {
323
+ return ORDINAL_SPECIAL[Number(n)]
324
+ }
325
+
326
+ // For numbers > 10, add appropriate suffix to cardinal (dropSpaces=true)
327
+ const cardinal = integerToWords(n, true)
328
+ const suffix = getOrdinalSuffix(cardinal)
329
+ return cardinal + suffix
330
+ }
331
+
332
+ /**
333
+ * Converts a numeric value to Turkish ordinal words.
334
+ *
335
+ * @param {number | string | bigint} value - The numeric value to convert (positive integer)
336
+ * @returns {string} The number as ordinal words
337
+ * @throws {TypeError} If value is not a valid numeric type
338
+ * @throws {RangeError} If value is negative, zero, or has a decimal part
339
+ *
340
+ * @example
341
+ * toOrdinal(1) // 'birinci'
342
+ * toOrdinal(2) // 'ikinci'
343
+ * toOrdinal(21) // 'yirmibirinci'
344
+ */
345
+ function toOrdinal (value) {
346
+ const integerPart = parseOrdinalValue(value)
347
+ return integerToOrdinal(integerPart)
348
+ }
349
+
350
+ // ============================================================================
351
+ // CURRENCY: toCurrency(value)
352
+ // ============================================================================
353
+
354
+ /**
355
+ * Converts a numeric value to Turkish currency words (Turkish Lira).
356
+ *
357
+ * Uses lira and kuruş (100 kuruş = 1 lira).
358
+ *
359
+ * @param {number | string | bigint} value - The currency amount to convert
360
+ * @returns {string} The amount in Turkish currency words
361
+ * @throws {TypeError} If value is not a valid numeric type
362
+ * @throws {Error} If value is not a valid number format
363
+ *
364
+ * @example
365
+ * toCurrency(42) // 'kırk iki lira'
366
+ * toCurrency(1.50) // 'bir lira elli kuruş'
367
+ * toCurrency(-5) // 'eksi beş lira'
368
+ */
369
+ function toCurrency (value) {
370
+ const { isNegative, dollars: lira, cents: kurus } = parseCurrencyValue(value)
371
+
372
+ let result = ''
373
+ if (isNegative) {
374
+ result = NEGATIVE + ' '
375
+ }
376
+
377
+ // Lira part
378
+ if (lira > 0n || kurus === 0n) {
379
+ result += integerToWords(lira, false) + ' ' + LIRA
380
+ }
381
+
382
+ // Kuruş part
383
+ if (kurus > 0n) {
384
+ if (lira > 0n) {
385
+ result += ' '
386
+ }
387
+ result += integerToWords(kurus, false) + ' ' + KURUS
243
388
  }
244
389
 
245
390
  return result
@@ -249,4 +394,4 @@ function toWords (value, options) {
249
394
  // Public API
250
395
  // ============================================================================
251
396
 
252
- export { toWords }
397
+ export { toCardinal, toOrdinal, toCurrency }