n2words 1.24.0 → 2.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 (349) hide show
  1. package/README.md +285 -156
  2. package/dist/ArabicConverter.js +3 -0
  3. package/dist/ArabicConverter.js.map +1 -0
  4. package/dist/AzerbaijaniConverter.js +3 -0
  5. package/dist/AzerbaijaniConverter.js.map +1 -0
  6. package/dist/BanglaConverter.js +3 -0
  7. package/dist/BanglaConverter.js.map +1 -0
  8. package/dist/BiblicalHebrewConverter.js +3 -0
  9. package/dist/BiblicalHebrewConverter.js.map +1 -0
  10. package/dist/CroatianConverter.js +3 -0
  11. package/dist/CroatianConverter.js.map +1 -0
  12. package/dist/CzechConverter.js +3 -0
  13. package/dist/CzechConverter.js.map +1 -0
  14. package/dist/DanishConverter.js +3 -0
  15. package/dist/DanishConverter.js.map +1 -0
  16. package/dist/DutchConverter.js +3 -0
  17. package/dist/DutchConverter.js.map +1 -0
  18. package/dist/EnglishConverter.js +3 -0
  19. package/dist/EnglishConverter.js.map +1 -0
  20. package/dist/FilipinoConverter.js +3 -0
  21. package/dist/FilipinoConverter.js.map +1 -0
  22. package/dist/FrenchBelgiumConverter.js +3 -0
  23. package/dist/FrenchBelgiumConverter.js.map +1 -0
  24. package/dist/FrenchConverter.js +3 -0
  25. package/dist/FrenchConverter.js.map +1 -0
  26. package/dist/GermanConverter.js +3 -0
  27. package/dist/GermanConverter.js.map +1 -0
  28. package/dist/GreekConverter.js +3 -0
  29. package/dist/GreekConverter.js.map +1 -0
  30. package/dist/GujaratiConverter.js +3 -0
  31. package/dist/GujaratiConverter.js.map +1 -0
  32. package/dist/HebrewConverter.js +3 -0
  33. package/dist/HebrewConverter.js.map +1 -0
  34. package/dist/HindiConverter.js +3 -0
  35. package/dist/HindiConverter.js.map +1 -0
  36. package/dist/HungarianConverter.js +3 -0
  37. package/dist/HungarianConverter.js.map +1 -0
  38. package/dist/IndonesianConverter.js +3 -0
  39. package/dist/IndonesianConverter.js.map +1 -0
  40. package/dist/ItalianConverter.js +3 -0
  41. package/dist/ItalianConverter.js.map +1 -0
  42. package/dist/JapaneseConverter.js +3 -0
  43. package/dist/JapaneseConverter.js.map +1 -0
  44. package/dist/KannadaConverter.js +3 -0
  45. package/dist/KannadaConverter.js.map +1 -0
  46. package/dist/KoreanConverter.js +3 -0
  47. package/dist/KoreanConverter.js.map +1 -0
  48. package/dist/LatvianConverter.js +3 -0
  49. package/dist/LatvianConverter.js.map +1 -0
  50. package/dist/LithuanianConverter.js +3 -0
  51. package/dist/LithuanianConverter.js.map +1 -0
  52. package/dist/MalayConverter.js +3 -0
  53. package/dist/MalayConverter.js.map +1 -0
  54. package/dist/MarathiConverter.js +3 -0
  55. package/dist/MarathiConverter.js.map +1 -0
  56. package/dist/NorwegianBokmalConverter.js +3 -0
  57. package/dist/NorwegianBokmalConverter.js.map +1 -0
  58. package/dist/PersianConverter.js +3 -0
  59. package/dist/PersianConverter.js.map +1 -0
  60. package/dist/PolishConverter.js +3 -0
  61. package/dist/PolishConverter.js.map +1 -0
  62. package/dist/PortugueseConverter.js +3 -0
  63. package/dist/PortugueseConverter.js.map +1 -0
  64. package/dist/PunjabiConverter.js +3 -0
  65. package/dist/PunjabiConverter.js.map +1 -0
  66. package/dist/RomanianConverter.js +3 -0
  67. package/dist/RomanianConverter.js.map +1 -0
  68. package/dist/RussianConverter.js +3 -0
  69. package/dist/RussianConverter.js.map +1 -0
  70. package/dist/SerbianCyrillicConverter.js +3 -0
  71. package/dist/SerbianCyrillicConverter.js.map +1 -0
  72. package/dist/SerbianLatinConverter.js +3 -0
  73. package/dist/SerbianLatinConverter.js.map +1 -0
  74. package/dist/SimplifiedChineseConverter.js +3 -0
  75. package/dist/SimplifiedChineseConverter.js.map +1 -0
  76. package/dist/SpanishConverter.js +3 -0
  77. package/dist/SpanishConverter.js.map +1 -0
  78. package/dist/SwahiliConverter.js +3 -0
  79. package/dist/SwahiliConverter.js.map +1 -0
  80. package/dist/SwedishConverter.js +3 -0
  81. package/dist/SwedishConverter.js.map +1 -0
  82. package/dist/TamilConverter.js +3 -0
  83. package/dist/TamilConverter.js.map +1 -0
  84. package/dist/TeluguConverter.js +3 -0
  85. package/dist/TeluguConverter.js.map +1 -0
  86. package/dist/ThaiConverter.js +3 -0
  87. package/dist/ThaiConverter.js.map +1 -0
  88. package/dist/TraditionalChineseConverter.js +3 -0
  89. package/dist/TraditionalChineseConverter.js.map +1 -0
  90. package/dist/TurkishConverter.js +3 -0
  91. package/dist/TurkishConverter.js.map +1 -0
  92. package/dist/UkrainianConverter.js +3 -0
  93. package/dist/UkrainianConverter.js.map +1 -0
  94. package/dist/UrduConverter.js +3 -0
  95. package/dist/UrduConverter.js.map +1 -0
  96. package/dist/VietnameseConverter.js +3 -0
  97. package/dist/VietnameseConverter.js.map +1 -0
  98. package/dist/n2words.js +3 -2
  99. package/dist/n2words.js.map +1 -1
  100. package/lib/classes/abstract-language.d.ts +178 -0
  101. package/lib/classes/abstract-language.js +192 -185
  102. package/lib/classes/greedy-scale-language.d.ts +109 -0
  103. package/lib/classes/greedy-scale-language.js +96 -90
  104. package/lib/classes/slavic-language.d.ts +148 -0
  105. package/lib/classes/slavic-language.js +136 -106
  106. package/lib/classes/south-asian-language.d.ts +70 -0
  107. package/lib/classes/south-asian-language.js +58 -65
  108. package/lib/classes/turkic-language.d.ts +26 -0
  109. package/lib/classes/turkic-language.js +22 -26
  110. package/lib/languages/ar.d.ts +30 -0
  111. package/lib/languages/ar.js +49 -133
  112. package/lib/languages/az.d.ts +12 -0
  113. package/lib/languages/az.js +7 -23
  114. package/lib/languages/bn.d.ts +11 -0
  115. package/lib/languages/bn.js +12 -7
  116. package/lib/languages/cs.d.ts +88 -0
  117. package/lib/languages/cs.js +44 -113
  118. package/lib/languages/da.d.ts +15 -0
  119. package/lib/languages/da.js +40 -87
  120. package/lib/languages/de.d.ts +14 -0
  121. package/lib/languages/de.js +34 -68
  122. package/lib/languages/el.d.ts +14 -0
  123. package/lib/languages/el.js +22 -48
  124. package/lib/languages/en.d.ts +16 -0
  125. package/lib/languages/en.js +22 -59
  126. package/lib/languages/es.d.ts +15 -0
  127. package/lib/languages/es.js +49 -81
  128. package/lib/languages/fa.d.ts +47 -0
  129. package/lib/languages/fa.js +90 -73
  130. package/lib/languages/fil.d.ts +16 -0
  131. package/lib/languages/fil.js +35 -76
  132. package/lib/languages/fr-BE.d.ts +11 -0
  133. package/lib/languages/fr-BE.js +15 -51
  134. package/lib/languages/fr.d.ts +15 -0
  135. package/lib/languages/fr.js +33 -72
  136. package/lib/languages/gu.d.ts +11 -0
  137. package/lib/languages/gu.js +10 -34
  138. package/lib/languages/hbo.d.ts +113 -0
  139. package/lib/languages/hbo.js +251 -0
  140. package/lib/languages/he.d.ts +80 -0
  141. package/lib/languages/he.js +41 -164
  142. package/lib/languages/hi.d.ts +11 -0
  143. package/lib/languages/hi.js +12 -7
  144. package/lib/languages/hr.d.ts +80 -0
  145. package/lib/languages/hr.js +51 -95
  146. package/lib/languages/hu.d.ts +22 -0
  147. package/lib/languages/hu.js +35 -53
  148. package/lib/languages/id.d.ts +37 -0
  149. package/lib/languages/id.js +29 -44
  150. package/lib/languages/it.d.ts +37 -0
  151. package/lib/languages/it.js +36 -52
  152. package/lib/languages/ja.d.ts +17 -0
  153. package/lib/languages/ja.js +22 -75
  154. package/lib/languages/kn.d.ts +11 -0
  155. package/lib/languages/kn.js +10 -39
  156. package/lib/languages/ko.d.ts +14 -0
  157. package/lib/languages/ko.js +17 -45
  158. package/lib/languages/lt.d.ts +70 -0
  159. package/lib/languages/lt.js +28 -63
  160. package/lib/languages/lv.d.ts +70 -0
  161. package/lib/languages/lv.js +35 -58
  162. package/lib/languages/mr.d.ts +11 -0
  163. package/lib/languages/mr.js +10 -34
  164. package/lib/languages/ms.d.ts +31 -0
  165. package/lib/languages/ms.js +24 -20
  166. package/lib/languages/nb.d.ts +12 -0
  167. package/lib/languages/nb.js +36 -56
  168. package/lib/languages/nl.d.ts +16 -0
  169. package/lib/languages/nl.js +58 -109
  170. package/lib/languages/pa.d.ts +11 -0
  171. package/lib/languages/{pa-Guru.js → pa.js} +12 -7
  172. package/lib/languages/pl.d.ts +80 -0
  173. package/lib/languages/pl.js +26 -105
  174. package/lib/languages/pt.d.ts +29 -0
  175. package/lib/languages/pt.js +29 -64
  176. package/lib/languages/ro.d.ts +158 -0
  177. package/lib/languages/ro.js +60 -167
  178. package/lib/languages/ru.d.ts +85 -0
  179. package/lib/languages/ru.js +17 -37
  180. package/lib/languages/sr-Cyrl.d.ts +80 -0
  181. package/lib/languages/sr-Cyrl.js +113 -0
  182. package/lib/languages/sr-Latn.d.ts +80 -0
  183. package/lib/languages/sr-Latn.js +54 -98
  184. package/lib/languages/sv.d.ts +14 -0
  185. package/lib/languages/sv.js +26 -63
  186. package/lib/languages/sw.d.ts +39 -0
  187. package/lib/languages/sw.js +26 -21
  188. package/lib/languages/ta.d.ts +20 -0
  189. package/lib/languages/ta.js +26 -26
  190. package/lib/languages/te.d.ts +22 -0
  191. package/lib/languages/te.js +28 -38
  192. package/lib/languages/th.d.ts +17 -0
  193. package/lib/languages/th.js +25 -31
  194. package/lib/languages/tr.d.ts +12 -0
  195. package/lib/languages/tr.js +11 -38
  196. package/lib/languages/uk.d.ts +85 -0
  197. package/lib/languages/uk.js +18 -44
  198. package/lib/languages/ur.d.ts +11 -0
  199. package/lib/languages/ur.js +12 -7
  200. package/lib/languages/vi.d.ts +72 -0
  201. package/lib/languages/vi.js +25 -71
  202. package/lib/languages/zh-Hans.d.ts +21 -0
  203. package/lib/languages/zh-Hans.js +33 -87
  204. package/lib/languages/zh-Hant.d.ts +21 -0
  205. package/lib/languages/zh-Hant.js +111 -0
  206. package/lib/n2words.d.ts +209 -0
  207. package/lib/n2words.js +474 -191
  208. package/package.json +106 -67
  209. package/dist/languages/ar.js +0 -2
  210. package/dist/languages/ar.js.map +0 -1
  211. package/dist/languages/az.js +0 -2
  212. package/dist/languages/az.js.map +0 -1
  213. package/dist/languages/bn.js +0 -2
  214. package/dist/languages/bn.js.map +0 -1
  215. package/dist/languages/cs.js +0 -2
  216. package/dist/languages/cs.js.map +0 -1
  217. package/dist/languages/da.js +0 -2
  218. package/dist/languages/da.js.map +0 -1
  219. package/dist/languages/de.js +0 -2
  220. package/dist/languages/de.js.map +0 -1
  221. package/dist/languages/el.js +0 -2
  222. package/dist/languages/el.js.map +0 -1
  223. package/dist/languages/en.js +0 -2
  224. package/dist/languages/en.js.map +0 -1
  225. package/dist/languages/es.js +0 -2
  226. package/dist/languages/es.js.map +0 -1
  227. package/dist/languages/fa.js +0 -2
  228. package/dist/languages/fa.js.map +0 -1
  229. package/dist/languages/fil.js +0 -2
  230. package/dist/languages/fil.js.map +0 -1
  231. package/dist/languages/fr-BE.js +0 -2
  232. package/dist/languages/fr-BE.js.map +0 -1
  233. package/dist/languages/fr.js +0 -2
  234. package/dist/languages/fr.js.map +0 -1
  235. package/dist/languages/gu.js +0 -2
  236. package/dist/languages/gu.js.map +0 -1
  237. package/dist/languages/he.js +0 -2
  238. package/dist/languages/he.js.map +0 -1
  239. package/dist/languages/hi.js +0 -2
  240. package/dist/languages/hi.js.map +0 -1
  241. package/dist/languages/hr.js +0 -2
  242. package/dist/languages/hr.js.map +0 -1
  243. package/dist/languages/hu.js +0 -2
  244. package/dist/languages/hu.js.map +0 -1
  245. package/dist/languages/id.js +0 -2
  246. package/dist/languages/id.js.map +0 -1
  247. package/dist/languages/it.js +0 -2
  248. package/dist/languages/it.js.map +0 -1
  249. package/dist/languages/ja.js +0 -2
  250. package/dist/languages/ja.js.map +0 -1
  251. package/dist/languages/kn.js +0 -2
  252. package/dist/languages/kn.js.map +0 -1
  253. package/dist/languages/ko.js +0 -2
  254. package/dist/languages/ko.js.map +0 -1
  255. package/dist/languages/lt.js +0 -2
  256. package/dist/languages/lt.js.map +0 -1
  257. package/dist/languages/lv.js +0 -2
  258. package/dist/languages/lv.js.map +0 -1
  259. package/dist/languages/mr.js +0 -2
  260. package/dist/languages/mr.js.map +0 -1
  261. package/dist/languages/ms.js +0 -2
  262. package/dist/languages/ms.js.map +0 -1
  263. package/dist/languages/nb.js +0 -2
  264. package/dist/languages/nb.js.map +0 -1
  265. package/dist/languages/nl.js +0 -2
  266. package/dist/languages/nl.js.map +0 -1
  267. package/dist/languages/pa-Guru.js +0 -2
  268. package/dist/languages/pa-Guru.js.map +0 -1
  269. package/dist/languages/pl.js +0 -2
  270. package/dist/languages/pl.js.map +0 -1
  271. package/dist/languages/pt.js +0 -2
  272. package/dist/languages/pt.js.map +0 -1
  273. package/dist/languages/ro.js +0 -2
  274. package/dist/languages/ro.js.map +0 -1
  275. package/dist/languages/ru.js +0 -2
  276. package/dist/languages/ru.js.map +0 -1
  277. package/dist/languages/sr-Latn.js +0 -2
  278. package/dist/languages/sr-Latn.js.map +0 -1
  279. package/dist/languages/sv.js +0 -2
  280. package/dist/languages/sv.js.map +0 -1
  281. package/dist/languages/sw.js +0 -2
  282. package/dist/languages/sw.js.map +0 -1
  283. package/dist/languages/ta.js +0 -2
  284. package/dist/languages/ta.js.map +0 -1
  285. package/dist/languages/te.js +0 -2
  286. package/dist/languages/te.js.map +0 -1
  287. package/dist/languages/th.js +0 -2
  288. package/dist/languages/th.js.map +0 -1
  289. package/dist/languages/tr.js +0 -2
  290. package/dist/languages/tr.js.map +0 -1
  291. package/dist/languages/uk.js +0 -2
  292. package/dist/languages/uk.js.map +0 -1
  293. package/dist/languages/ur.js +0 -2
  294. package/dist/languages/ur.js.map +0 -1
  295. package/dist/languages/vi.js +0 -2
  296. package/dist/languages/vi.js.map +0 -1
  297. package/dist/languages/zh-Hans.js +0 -2
  298. package/dist/languages/zh-Hans.js.map +0 -1
  299. package/typings/classes/abstract-language.d.ts +0 -144
  300. package/typings/classes/greedy-scale-language.d.ts +0 -148
  301. package/typings/classes/slavic-language.d.ts +0 -145
  302. package/typings/classes/south-asian-language.d.ts +0 -101
  303. package/typings/classes/turkic-language.d.ts +0 -42
  304. package/typings/languages/ar.d.ts +0 -93
  305. package/typings/languages/az.d.ts +0 -25
  306. package/typings/languages/bn.d.ts +0 -1
  307. package/typings/languages/cs.d.ts +0 -120
  308. package/typings/languages/da.d.ts +0 -53
  309. package/typings/languages/de.d.ts +0 -26
  310. package/typings/languages/el.d.ts +0 -11
  311. package/typings/languages/en.d.ts +0 -30
  312. package/typings/languages/es.d.ts +0 -43
  313. package/typings/languages/fa.d.ts +0 -81
  314. package/typings/languages/fil.d.ts +0 -12
  315. package/typings/languages/fr-BE.d.ts +0 -41
  316. package/typings/languages/fr.d.ts +0 -43
  317. package/typings/languages/gu.d.ts +0 -12
  318. package/typings/languages/he.d.ts +0 -197
  319. package/typings/languages/hi.d.ts +0 -1
  320. package/typings/languages/hr.d.ts +0 -110
  321. package/typings/languages/hu.d.ts +0 -37
  322. package/typings/languages/id.d.ts +0 -69
  323. package/typings/languages/it.d.ts +0 -51
  324. package/typings/languages/ja.d.ts +0 -58
  325. package/typings/languages/kn.d.ts +0 -11
  326. package/typings/languages/ko.d.ts +0 -25
  327. package/typings/languages/lt.d.ts +0 -110
  328. package/typings/languages/lv.d.ts +0 -99
  329. package/typings/languages/mr.d.ts +0 -12
  330. package/typings/languages/ms.d.ts +0 -37
  331. package/typings/languages/nb.d.ts +0 -27
  332. package/typings/languages/nl.d.ts +0 -65
  333. package/typings/languages/pa-Guru.d.ts +0 -1
  334. package/typings/languages/pl.d.ts +0 -116
  335. package/typings/languages/pt.d.ts +0 -39
  336. package/typings/languages/ro.d.ts +0 -229
  337. package/typings/languages/ru.d.ts +0 -108
  338. package/typings/languages/sr-Latn.d.ts +0 -98
  339. package/typings/languages/sv.d.ts +0 -30
  340. package/typings/languages/sw.d.ts +0 -1
  341. package/typings/languages/ta.d.ts +0 -1
  342. package/typings/languages/te.d.ts +0 -1
  343. package/typings/languages/th.d.ts +0 -1
  344. package/typings/languages/tr.d.ts +0 -46
  345. package/typings/languages/uk.d.ts +0 -117
  346. package/typings/languages/ur.d.ts +0 -1
  347. package/typings/languages/vi.d.ts +0 -116
  348. package/typings/languages/zh-Hans.d.ts +0 -57
  349. package/typings/n2words.d.ts +0 -177
package/README.md CHANGED
@@ -1,223 +1,352 @@
1
1
  # n2words
2
2
 
3
- [![CI](https://github.com/forzagreen/n2words/actions/workflows/test.yml/badge.svg)](https://github.com/forzagreen/n2words/actions/workflows/test.yml)
4
- [![Coverage Status](https://coveralls.io/repos/github/forzagreen/n2words/badge.svg)](https://coveralls.io/github/forzagreen/n2words)
5
- [![npm](https://img.shields.io/npm/v/n2words.svg)](https://npmjs.com/package/n2words)
6
- [![npm](https://img.shields.io/npm/dw/n2words)](https://npmjs.com/package/n2words)
7
- [![jsDelivr](https://data.jsdelivr.com/v1/package/npm/n2words/badge)](https://www.jsdelivr.com/package/npm/n2words)
8
-
9
- **n2words** converts numerical numbers into written ones. Supports **45 languages** with **zero dependencies**.
10
-
11
- - 🌍 **45 languages** - Comprehensive international language support
12
- - 📦 **Zero dependencies** - Lightweight and fast
13
- - 🚀 **Performance optimized** - Highly tuned for speed
14
- - 📱 **Universal** - Works in browsers, Node.js, and TypeScript
15
- - 🧩 **Modular** - Import only the languages you need, keeping your bundle size minimal
16
- - 🔒 **Type-safe** - Full TypeScript support with language code literals and language-specific options
3
+ [![CI](https://github.com/forzagreen/n2words/actions/workflows/ci.yml/badge.svg)](https://github.com/forzagreen/n2words/actions/workflows/ci.yml)
4
+ [![Coverage](https://img.shields.io/coveralls/github/forzagreen/n2words)](https://coveralls.io/github/forzagreen/n2words)
5
+ [![npm version](https://img.shields.io/npm/v/n2words)](https://npmjs.com/package/n2words)
6
+ [![npm provenance](https://img.shields.io/badge/npm-provenance-blue)](https://www.npmjs.com/package/n2words)
7
+ [![Bundle size](https://img.shields.io/bundlephobia/minzip/n2words)](https://bundlephobia.com/package/n2words)
8
+ [![npm downloads](https://img.shields.io/npm/dw/n2words)](https://npmjs.com/package/n2words)
9
+ [![jsDelivr](https://img.shields.io/jsdelivr/npm/hm/n2words)](https://www.jsdelivr.com/package/npm/n2words)
10
+
11
+ **Convert numbers to words in 48 languages with zero dependencies.**
12
+
13
+ ## Why n2words?
14
+
15
+ - **Maximum Language Coverage** 48 languages including European, Asian, Middle Eastern, and regional variants
16
+ - **Zero Dependencies** Pure JavaScript with no external runtime dependencies
17
+ - **Universal Compatibility** — Works in Node.js, browsers (via CDN), and all modern bundlers
18
+ - **Type-Safe** — Full TypeScript support with generated `.d.ts` declarations
19
+ - **Production Ready** — Comprehensive test coverage (unit, integration, browser, type checking)
20
+ - **BigInt Support** — Handle arbitrarily large numbers without precision loss
21
+ - **Flexible Input** — Accepts `number`, `bigint`, or `string` inputs
22
+ - **Tree-Shakable** — Import only the languages you need (~2-5 KB gzipped per language)
23
+ - **Browser Tested** — Verified in Chromium, Firefox, and WebKit via automated tests
24
+
25
+ ## Contents
26
+
27
+ - [Quick Start](#quick-start)
28
+ - [Usage](#usage) — ESM, CommonJS, Browser (UMD)
29
+ - [Type Safety](#type-safety) — TypeScript support
30
+ - [Supported Languages](#supported-languages-48) — 48 languages with options
31
+ - [Browser Compatibility](#browser-compatibility) — Chrome 67+, Firefox 68+, Safari 14+, Edge 79+
32
+ - [Performance & Bundle Size](#performance--bundle-size) — Tree-shaking and benchmarks
33
+ - [Examples](#examples) — Basic, gender agreement, language-specific features
34
+ - [Documentation](#documentation) — Guides and API reference
35
+ - [Contributing](#contributing) — How to contribute
36
+ - [License](#license)
17
37
 
18
38
  ## Quick Start
19
39
 
20
- ```js
21
- import n2words from 'n2words';
22
-
23
- n2words(123); // 'one hundred and twenty-three'
24
- n2words(-1.5); // 'minus one point five'
25
- n2words(123, { lang: 'zh-Hans' }); // '壹佰贰拾叁'
26
- n2words(123, { lang: 'hi' }); // 'एक सौ तेईस'
27
- n2words(123, { lang: 'es' }); // 'ciento veintitrés'
28
- n2words(123, { lang: 'ar' }); // 'مائة وثلاثة وعشرون'
29
- n2words(10000n, { lang: 'zh-Hans' }); // '壹万' (BigInt support!)
30
- ```
31
-
32
- ## Installation
33
-
34
- ```sh
40
+ ```bash
35
41
  npm install n2words
36
42
  ```
37
43
 
38
- ## Usage
39
-
40
- ### Node.js / ESM
41
-
42
44
  ```js
43
- import n2words from 'n2words';
45
+ import { EnglishConverter, SpanishConverter, ArabicConverter } from 'n2words'
44
46
 
45
- console.log(n2words(42)); // 'forty-two'
46
- console.log(n2words(3.14)); // 'three point one four'
47
+ EnglishConverter(123) // 'one hundred and twenty-three'
48
+ SpanishConverter(123) // 'ciento veintitrés'
49
+ ArabicConverter(1, { gender: 'feminine' }) // 'واحدة' (with options)
47
50
  ```
48
51
 
49
- ### TypeScript
50
-
51
- **Full type safety with language-specific options:**
52
-
53
- ```ts
54
- import n2words, { type N2WordsOptions, type LanguageCode } from 'n2words';
55
-
56
- // Language code autocomplete (45+ languages)
57
- const lang: LanguageCode = 'zh-Hans'; // Full IntelliSense support
52
+ ## Usage
58
53
 
59
- // Type-safe language-specific options
60
- const result1 = n2words(123, { lang: 'zh-Hans', formal: true }); // Chinese financial numerals
61
- const result2 = n2words(42, { lang: 'ar', feminine: true }); // Arabic feminine forms
62
- const result3 = n2words(91, { lang: 'fr', withHyphenSeparator: true }); // French with hyphens
54
+ **ESM (Node.js, modern bundlers):**
63
55
 
64
- // Comprehensive type safety
65
- const options: N2WordsOptions = {
66
- lang: 'es',
67
- genderStem: 'a' // TypeScript validates this option for Spanish
68
- };
56
+ ```js
57
+ import { EnglishConverter } from 'n2words'
69
58
  ```
70
59
 
71
- See [TYPESCRIPT_GUIDE.md](guides/TYPESCRIPT_GUIDE.md) for comprehensive TypeScript documentation.
60
+ **CommonJS (Node.js):**
72
61
 
73
- ### CommonJS
62
+ n2words is an ES module. For CommonJS environments, use dynamic import with Promises:
74
63
 
75
64
  ```js
76
- import('n2words').then(({ default: n2words }) => {
77
- console.log(n2words(100)); // 'one hundred'
78
- });
65
+ // Promise-based
66
+ import('n2words').then(({ EnglishConverter }) => {
67
+ console.log(EnglishConverter(42)) // 'forty-two'
68
+ })
69
+
70
+ // Or use async function
71
+ async function convertNumber(num) {
72
+ const { EnglishConverter } = await import('n2words')
73
+ return EnglishConverter(num)
74
+ }
79
75
  ```
80
76
 
81
- ### Browser (UMD)
77
+ **Browser (UMD via CDN):**
82
78
 
83
79
  ```html
80
+ <!-- All languages (~23KB gzipped) -->
84
81
  <script src="https://cdn.jsdelivr.net/npm/n2words/dist/n2words.js"></script>
85
82
  <script>
86
- console.log(n2words(100)); // 'one hundred'
83
+ n2words.EnglishConverter(42) // 'forty-two'
87
84
  </script>
88
- ```
89
85
 
90
- Or import specific languages:
91
-
92
- ```html
93
- <script src="https://cdn.jsdelivr.net/npm/n2words/dist/languages/fr.js"></script>
86
+ <!-- Individual languages (~2KB gzipped each) - load only what you need -->
87
+ <script src="https://cdn.jsdelivr.net/npm/n2words/dist/EnglishConverter.js"></script>
88
+ <script src="https://cdn.jsdelivr.net/npm/n2words/dist/SpanishConverter.js"></script>
94
89
  <script>
95
- console.log(n2words(100, { lang: 'fr' })); // 'cent'
90
+ n2words.EnglishConverter(42) // 'forty-two'
91
+ n2words.SpanishConverter(123) // 'ciento veintitrés'
96
92
  </script>
97
93
  ```
98
94
 
99
- ## Supported Languages
100
-
101
- | Code | Language | Code | Language |
102
- | --------- | -------------------- | --------- | ---------------- |
103
- | `ar` | Arabic | `az` | Azerbaijani |
104
- | `bn` | Bengali | `cs` | Czech |
105
- | `de` | German | `da` | Danish |
106
- | `el` | Greek | `en` | English |
107
- | `es` | Spanish | `fa` | Farsi/Persian |
108
- | `fr` | French | `fr-BE` | French (Belgium) |
109
- | `gu` | Gujarati | `he` | Hebrew |
110
- | `hi` | Hindi | `hr` | Croatian |
111
- | `hu` | Hungarian | `id` | Indonesian |
112
- | `it` | Italian | `ja` | Japanese |
113
- | `kn` | Kannada | `ko` | Korean |
114
- | `lt` | Lithuanian | `lv` | Latvian |
115
- | `mr` | Marathi | `ms` | Malay |
116
- | `nl` | Dutch | `nb` | Norwegian |
117
- | `pa-Guru` | Punjabi (Gurmukhi) | `pl` | Polish |
118
- | `pt` | Portuguese | `ro` | Romanian |
119
- | `ru` | Russian | `sr-Latn` | Serbian (Latin) |
120
- | `sv` | Swedish | `sw` | Swahili |
121
- | `ta` | Tamil | `te` | Telugu |
122
- | `th` | Thai | `fil` | Filipino/Tagalog |
123
- | `tr` | Turkish | `uk` | Ukrainian |
124
- | `ur` | Urdu | `vi` | Vietnamese |
125
- | `zh-Hans` | Chinese (Simplified) | `gu` | Gujarati |
126
-
127
- ## Performance
128
-
129
- Performance benchmarks (ops/sec) on latest hardware:
130
-
131
- | Language | Performance |
132
- | --------------- | ------------- |
133
- | Arabic (ar) | ~180k ops/sec |
134
- | Indonesian (id) | ~160k ops/sec |
135
- | Vietnamese (vi) | ~165k ops/sec |
136
- | Persian (fa) | ~125k ops/sec |
137
- | Hebrew (he) | ~115k ops/sec |
138
-
139
- All languages are highly optimized. Run `npm run bench:perf` to benchmark on your system.
95
+ ## Type Safety
140
96
 
141
- ## Examples
97
+ Full TypeScript support via JSDoc annotations and generated type definitions - works in both JavaScript and TypeScript projects with IntelliSense and type checking:
142
98
 
143
- ### Basic Usage
99
+ ```typescript
100
+ import { EnglishConverter, ArabicConverter, SimplifiedChineseConverter } from 'n2words'
101
+ import type { NumericValue, ArabicOptions } from 'n2words'
144
102
 
145
- ```js
146
- n2words(0); // 'zero'
147
- n2words(1); // 'one'
148
- n2words(10); // 'ten'
149
- n2words(100); // 'one hundred'
150
- n2words(1000); // 'one thousand'
151
- n2words(1000000); // 'one million'
103
+ // All converters accept: number | bigint | string
104
+ EnglishConverter(42) // ✓ number → 'forty-two'
105
+ EnglishConverter('123') // ✓ string → 'one hundred and twenty-three'
106
+ EnglishConverter(100n) // ✓ BigInt → 'one hundred'
107
+
108
+ // Language-specific options with type checking
109
+ ArabicConverter(1, { gender: 'feminine' }) // 'واحدة' (feminine form)
110
+ ArabicConverter(1, { invalid: true }) // ✗ TypeScript error: invalid property
111
+
112
+ SimplifiedChineseConverter(123, { formal: false }) // ✓ '一百二十三' (common style)
113
+ SimplifiedChineseConverter(123, { formal: 'yes' }) // ✗ TypeScript error: wrong type
152
114
  ```
153
115
 
154
- ### Decimal Numbers
116
+ **Type Definitions:**
117
+
118
+ n2words includes TypeScript declaration files (`.d.ts`) generated from JSDoc annotations:
119
+
120
+ - **Source**: JSDoc annotations in JavaScript source files
121
+ - **Generated**: TypeScript declarations built via `tsc` during package preparation
122
+ - **Included**: Published to npm with the package (no separate `@types` package needed)
123
+ - **Validated**: Comprehensive type tests ensure correctness
124
+
125
+ **Exported Types:**
126
+
127
+ - `NumericValue` - Accepted input types: `number | bigint | string`
128
+ - Language-specific option types (e.g., `ArabicOptions`, `SimplifiedChineseOptions`, `DutchOptions`, etc.)
129
+
130
+ ## Supported Languages (48)
131
+
132
+ Language codes follow [IETF BCP 47](https://tools.ietf.org/html/bcp47) standards.
133
+
134
+ | Code | Language | Options | Code | Language | Options |
135
+ | --------- | ------------------- | ------- | --------- | ------------------- | ------- |
136
+ | `ar` | Arabic | ✓ | `az` | Azerbaijani | |
137
+ | `bn` | Bengali | | `cs` | Czech | ✓ |
138
+ | `da` | Danish | ✓ | `de` | German | |
139
+ | `el` | Greek | | `en` | English | |
140
+ | `es` | Spanish | ✓ | `fa` | Persian | |
141
+ | `fil` | Filipino | | `fr` | French | ✓ |
142
+ | `fr-BE` | Belgian French | ✓ | `gu` | Gujarati | |
143
+ | `hbo` | Biblical Hebrew | ✓ | `he` | Modern Hebrew | ✓ |
144
+ | `hi` | Hindi | | `hr` | Croatian | ✓ |
145
+ | `hu` | Hungarian | | `id` | Indonesian | |
146
+ | `it` | Italian | | `ja` | Japanese | |
147
+ | `kn` | Kannada | | `ko` | Korean | |
148
+ | `lt` | Lithuanian | ✓ | `lv` | Latvian | ✓ |
149
+ | `mr` | Marathi | | `ms` | Malay | |
150
+ | `nb` | Norwegian Bokmål | | `nl` | Dutch | ✓ |
151
+ | `pa` | Punjabi | | `pl` | Polish | ✓ |
152
+ | `pt` | Portuguese | | `ro` | Romanian | ✓ |
153
+ | `ru` | Russian | ✓ | `sr-Cyrl` | Serbian Cyrillic | ✓ |
154
+ | `sr-Latn` | Serbian Latin | ✓ | `sv` | Swedish | |
155
+ | `sw` | Swahili | | `ta` | Tamil | |
156
+ | `te` | Telugu | | `th` | Thai | |
157
+ | `tr` | Turkish | ✓ | `uk` | Ukrainian | ✓ |
158
+ | `ur` | Urdu | | `vi` | Vietnamese | |
159
+ | `zh-Hans` | Chinese Simplified | ✓ | `zh-Hant` | Chinese Traditional | ✓ |
160
+
161
+ ### Language Options
162
+
163
+ 21 languages support additional options. Common options include:
164
+
165
+ **`gender`** (`'masculine'` | `'feminine'`) - 13 languages
166
+ Arabic, Biblical Hebrew, Croatian, Czech, Latvian, Lithuanian, Polish, Romanian, Russian, Serbian (both scripts), Spanish, Ukrainian
167
+
168
+ **`formal`** (`boolean`) - 2 languages
169
+ Simplified Chinese, Traditional Chinese - Toggle between formal/financial and common numerals
170
+
171
+ **Other options:**
172
+
173
+ - Dutch: `includeOptionalAnd`, `accentOne`, `noHundredPairing`
174
+ - French/French Belgium: `withHyphenSeparator`
175
+ - Hebrew (Modern & Biblical): `andWord`
176
+ - Turkish: `dropSpaces`
177
+ - Danish: `ordFlag` (ordinal numbers)
178
+ - Arabic: `negativeWord` (custom negative word)
179
+
180
+ [See complete options reference →](docs/ARCHITECTURE.md#language-specific-options)
181
+
182
+ ## Browser Compatibility
183
+
184
+ **Minimum Requirements** (due to BigInt):
185
+
186
+ - **Node.js**: 20 or above
187
+ - **Browsers**: Chrome 67+, Firefox 68+, Safari 14+, Edge 79+ (desktop + mobile)
188
+ - **Global Coverage**: ~86% of all users worldwide
189
+
190
+ **Note**: BigInt is a hard requirement and cannot be polyfilled. Older browsers are not supported.
191
+
192
+ **Build options:**
193
+
194
+ - **Browser CDN**: Use `dist/n2words.js` (pre-built UMD, tested in real browsers)
195
+ - **Node.js/Bundlers**: Use `lib/` source (ES modules, tree-shakable)
196
+
197
+ [See detailed compatibility guide →](COMPATIBILITY.md)
198
+
199
+ ## Performance & Bundle Size
200
+
201
+ ### Bundle Size Comparison
202
+
203
+ | Import Strategy | Bundle Size (Minified) | Gzipped | Languages Included |
204
+ | ---------------------------- | ---------------------- | -------- | ------------------ |
205
+ | All languages (UMD) | ~92 KB | ~23 KB | All 48 |
206
+ | Single language (UMD) | ~4-6 KB | ~2 KB | 1 |
207
+ | Tree-shaken (ESM, 1 lang) | ~4-5 KB | ~2 KB | 1 |
208
+ | Tree-shaken (ESM, 3 langs) | ~12-15 KB | ~4-5 KB | 3 |
209
+ | Tree-shaken (ESM, 10 langs) | ~40-50 KB | ~12-15 KB| 10 |
210
+
211
+ ### Performance Characteristics
212
+
213
+ - **Fast**: Sub-millisecond conversion for most numbers
214
+ - **Efficient**: Zero dependencies, minimal memory footprint
215
+ - **BigInt support**: Handles arbitrarily large numbers without precision loss
216
+ - **Memory-efficient**: ~2 KB overhead per language when tree-shaken
217
+
218
+ **Tree-shaking example:**
155
219
 
156
220
  ```js
157
- n2words(3.14); // 'three point one four'
158
- n2words(10.5); // 'ten point five'
159
- n2words(0.007); // 'zero point zero zero seven'
221
+ // Import only what you need - bundler only includes used languages
222
+ import { EnglishConverter, SpanishConverter } from 'n2words'
223
+ // Final bundle: ~4-5 KB gzipped (only English + Spanish + core)
224
+ ```
160
225
 
161
- // Some languages read decimals digit-by-digit
162
- n2words(3.14, { lang: 'ja' }); // '三点一四' (Japanese: san-ten-ichi-yon)
163
- n2words(2.05, { lang: 'th' }); // 'สามจุดหนึ่งสี่' (Thai: each digit spoken)
226
+ **Run benchmarks:**
227
+
228
+ ```bash
229
+ npm run bench:perf # Performance benchmarks (ops/sec)
230
+ npm run bench:memory # Memory usage benchmarks
164
231
  ```
165
232
 
166
- ### Negative Numbers
233
+ ## Examples
234
+
235
+ ### Basic Conversions
167
236
 
168
237
  ```js
169
- n2words(-42); // 'minus forty-two'
170
- n2words(-3.14); // 'minus three point one four'
238
+ import { EnglishConverter } from 'n2words'
239
+
240
+ // Basic numbers
241
+ EnglishConverter(0) // 'zero'
242
+ EnglishConverter(42) // 'forty-two'
243
+ EnglishConverter(1000000) // 'one million'
244
+
245
+ // Decimals & negatives
246
+ EnglishConverter(3.14) // 'three point one four'
247
+ EnglishConverter(-42) // 'minus forty-two'
248
+
249
+ // Large numbers & BigInt
250
+ EnglishConverter(1234567890) // 'one billion two hundred and thirty-four million five hundred and sixty-seven thousand eight hundred and ninety'
251
+ EnglishConverter(123456789012345n) // Works with arbitrarily large integers
171
252
  ```
172
253
 
173
- ### Large Numbers
254
+ ### Gender Agreement
174
255
 
175
256
  ```js
176
- n2words(1000000000); // 'one billion'
177
- n2words(1234567890); // 'one billion two hundred and thirty-four million five hundred and sixty-seven thousand eight hundred and ninety'
257
+ import { SpanishConverter, ArabicConverter, RussianConverter } from 'n2words'
258
+
259
+ // Spanish: masculine vs feminine
260
+ SpanishConverter(1) // 'uno' (masculine, default)
261
+ SpanishConverter(1, { gender: 'feminine' }) // 'una'
262
+ SpanishConverter(21) // 'veintiuno' (masculine)
263
+ SpanishConverter(21, { gender: 'feminine' }) // 'veintiuna'
264
+
265
+ // Arabic: rich gender system
266
+ ArabicConverter(1) // 'واحد' (masculine, default)
267
+ ArabicConverter(1, { gender: 'feminine' }) // 'واحدة'
268
+
269
+ // Russian: gender for numerals
270
+ RussianConverter(1) // 'один' (masculine, default)
271
+ RussianConverter(1, { gender: 'feminine' }) // 'одна'
178
272
  ```
179
273
 
180
- ### BigInt Support
274
+ ### Language-Specific Features
181
275
 
182
276
  ```js
183
- n2words(123456789012345n); // Works with arbitrarily large integers
277
+ import {
278
+ SimplifiedChineseConverter,
279
+ TraditionalChineseConverter,
280
+ JapaneseConverter,
281
+ DutchConverter,
282
+ FrenchConverter
283
+ } from 'n2words'
284
+
285
+ // Chinese: formal (financial) vs common numerals
286
+ SimplifiedChineseConverter(123) // '壹佰贰拾叁' (formal, default)
287
+ SimplifiedChineseConverter(123, { formal: false }) // '一百二十三' (common)
288
+
289
+ TraditionalChineseConverter(456) // '肆佰伍拾陸' (formal, default)
290
+ TraditionalChineseConverter(456, { formal: false }) // '四百五十六' (common)
291
+
292
+ // Japanese: digit-by-digit decimals
293
+ JapaneseConverter(3.14) // '三点一四'
294
+
295
+ // Dutch: flexible formatting
296
+ DutchConverter(123) // 'honderddrieëntwintig' (default compound)
297
+ DutchConverter(101, { includeOptionalAnd: true }) // 'honderdeneen' (with optional "en")
298
+ DutchConverter(1) // 'één' (accented, default)
299
+ DutchConverter(1, { accentOne: false }) // 'een' (unaccented)
300
+
301
+ // French: selective hyphens vs all hyphens
302
+ FrenchConverter(123) // 'cent vingt-trois' (default)
303
+ FrenchConverter(123, { withHyphenSeparator: true }) // 'cent-vingt-trois' (all hyphens)
184
304
  ```
185
305
 
186
- ## Documentation
306
+ ### Input Flexibility
187
307
 
188
- - [TYPESCRIPT_GUIDE.md](./guides/TYPESCRIPT_GUIDE.md) - **Comprehensive TypeScript guide** with enhanced type safety
189
- - [LANGUAGE_OPTIONS.md](./guides/LANGUAGE_OPTIONS.md) - Language-specific options and examples
190
- - [LANGUAGE_GUIDE.md](./guides/LANGUAGE_GUIDE.md) - Comprehensive guide for adding new languages
191
- - [BIGINT-GUIDE.md](./guides/BIGINT-GUIDE.md) - BigInt usage guide for language developers
192
- - [CONTRIBUTING.md](./CONTRIBUTING.md) - Contribution guidelines
193
- - [Wiki](https://github.com/forzagreen/n2words/wiki) - Detailed examples and guides
308
+ ```js
309
+ import { EnglishConverter } from 'n2words'
194
310
 
195
- ## Contributing
311
+ // Multiple input types
312
+ EnglishConverter(42) // number → 'forty-two'
313
+ EnglishConverter('42') // string → 'forty-two'
314
+ EnglishConverter(42n) // BigInt → 'forty-two'
196
315
 
197
- This library is actively maintained and welcomes contributions!
316
+ // Decimal strings
317
+ EnglishConverter('3.14') // 'three point one four'
318
+ EnglishConverter('.5') // 'zero point five'
198
319
 
199
- - 🐛 **Bug reports** - Help us fix issues
200
- - **Feature requests** - Suggest improvements
201
- - 🌐 **New languages** - Add support for more languages (use `npm run lang:add` to get started!)
202
- - 📝 **Documentation** - Improve guides and examples
320
+ // Negative strings
321
+ EnglishConverter('-42') // 'minus forty-two'
203
322
 
204
- ### Adding a New Language
323
+ // Large BigInts (no precision loss)
324
+ EnglishConverter(999999999999999999999999n) // Accurate conversion
325
+ ```
326
+
327
+ ## Documentation
205
328
 
206
- We provide automated tools to streamline language implementation:
329
+ - **[Compatibility Guide](COMPATIBILITY.md)** - Browser and Node.js compatibility
330
+ - **[Contributing Guide](CONTRIBUTING.md)** - How to contribute and add languages
331
+ - **[Architecture Guide](docs/ARCHITECTURE.md)** - Implementation patterns and options reference
332
+ - **[Code of Conduct](CODE_OF_CONDUCT.md)** - Community standards
207
333
 
208
- ```bash
209
- # Generate boilerplate for a new language
210
- npm run lang:add
334
+ ## Contributing
211
335
 
212
- # Validate your implementation
213
- npm run lang:validate <language-code>
336
+ We welcome contributions! Add a new language or improve existing ones:
214
337
 
215
- # Validate all languages
216
- npm run lang:validate
338
+ ```bash
339
+ npm run lang:add <code> # Scaffold a new language (BCP 47 code)
340
+ npm run lang:validate -- <code> # Validate implementation
341
+ npm test # Run full test suite
217
342
  ```
218
343
 
219
- See [CONTRIBUTING.md](./CONTRIBUTING.md) and [LANGUAGE_GUIDE.md](./guides/LANGUAGE_GUIDE.md) for detailed guidance.
344
+ Also welcome: bug reports, feature requests, documentation improvements, and language enhancements.
345
+
346
+ Please read our [Code of Conduct](CODE_OF_CONDUCT.md) before contributing.
347
+
348
+ **[See full contributing guide →](CONTRIBUTING.md)**
220
349
 
221
350
  ## License
222
351
 
223
- [MIT](./LICENSE) © 2025
352
+ [MIT](./LICENSE) © Wael TELLAT, Tyler Vigario & contributors
@@ -0,0 +1,3 @@
1
+ /*! n2words/ArabicConverter v2.0.0 | MIT License | github.com/forzagreen/n2words */
2
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).n2words=e.n2words||{})}(this,function(e){"use strict";class t{#e={};negativeWord="";decimalSeparatorWord="";zeroWord="";wordSeparator=" ";usePerDigitDecimals=!1;get options(){return this.#e}toWords(e,t,r){const s=[];return e&&s.push(this.negativeWord),s.push(this.integerToWords(t)),r&&(s.push(this.decimalSeparatorWord),s.push(...this.decimalDigitsToWords(r))),s.join(this.wordSeparator)}integerToWords(e){throw new Error("integerToWords() must be implemented by subclass")}setOptions(e={},t={}){this.#e={...e,...t}}decimalIntegerToWords(e){return this.integerToWords(e)}decimalDigitsToWords(e){const t=[];let r=0;for(;r<e.length&&"0"===e[r];)t.push(this.zeroWord),r++;const s=e.slice(r);if(!s)return t;if(this.usePerDigitDecimals)for(const e of s)t.push(this.decimalIntegerToWords(BigInt(e)));else t.push(this.decimalIntegerToWords(BigInt(s)));return t}}function r(e){const[t,r]=e.toLowerCase().split("e"),s=parseInt(r,10),n=t.indexOf("."),i=-1===n?t:t.slice(0,n)+t.slice(n+1),o=(-1===n?t.length:n)+s;return o>=i.length?i+"0".repeat(o-i.length):o<=0?"0."+"0".repeat(-o)+i:i.slice(0,o)+"."+i.slice(o)}const s=(n=class extends t{negativeWord="ناقص";decimalSeparatorWord="فاصلة";zeroWord="صفر";tensWords=["عشرون","ثلاثون","أربعون","خمسون","ستون","سبعون","ثمانون","تسعون"];hundredsWords=["","مائة","مئتان","ثلاثمائة","أربعمائة","خمسمائة","ستمائة","سبعمائة","ثمانمائة","تسعمائة"];scaleWords=["مائة","ألف","مليون","مليار","تريليون","كوادريليون","كوينتليون","سكستيليون"];scaleAppendedWords=["","ألفاً","مليوناً","ملياراً","تريليوناً","كوادريليوناً","كوينتليوناً","سكستيليوناً"];scalePluralWords=["","آلاف","ملايين","مليارات","تريليونات","كوادريليونات","كوينتليونات","سكستيليونات"];dualWords=["مئتان","ألفان","مليونان","ملياران","تريليونان","كوادريليونان","كوينتليونان","سكستيليونان"];dualAppendedWords=["مئتا","ألفا","مليونا","مليارا","تريليونا","كوادريليونا","كوينتليونا","سكستيليونا"];ones={masculine:["واحد","اثنان","ثلاثة","أربعة","خمسة","ستة","سبعة","ثمانية","تسعة","عشرة","أحد عشر","اثنا عشر","ثلاثة عشر","أربعة عشر","خمسة عشر","ستة عشر","سبعة عشر","ثمانية عشر","تسعة عشر"],feminine:["واحدة","اثنتان","ثلاث","أربع","خمس","ست","سبع","ثمان","تسع","عشر","إحدى عشرة","اثنتا عشرة","ثلاث عشرة","أربع عشرة","خمس عشرة","ست عشرة","سبع عشرة","ثماني عشرة","تسع عشرة"]};constructor(e={}){super(),this.setOptions({gender:"masculine"},e),void 0!==e.negativeWord&&(this.negativeWord=e.negativeWord)}get selectedOnes(){return this.ones["feminine"===this.options.gender?"feminine":"masculine"]}segmentToWords(e,t,r){const s=e%100,n=e/100,i=Math.trunc(n);let o="";if(i>0)if(0===s&&2===i)o=this.dualWords[0];else{const e=this.hundredsWords[i];e&&(o=e,0!==s&&(o+=" و"))}if(s>0)if(s<20)if(2===s&&0===i&&t>0){const s=Number(r),n=Math.trunc(Math.log10(s));o=n%3==0&&r===BigInt(2*Math.pow(10,n))?2===e?this.dualWords[t]:this.dualAppendedWords[t]:this.dualWords[t]}else o+=1===s&&t>0?this.scaleWords[t]:this.selectedOnes[s-1];else{const e=s%10,t=Math.trunc(s/10)-2;e>0&&(o+=this.selectedOnes[e-1],o+=" و"),o+=this.tensWords[t]}return o}integerToWords(e){if(0n===e)return this.zeroWord;let t=e,r=0,s="";for(;t>0n;){const n=Number(t%1000n);if(t/=1000n,n>0){const t=this.segmentToWords(n,r,e);t&&(r>0&&(s&&(s=" و"+s),n>2)&&(s=1==n%100?this.scaleWords[r]+" "+s:n>=3&&n<=10?this.scalePluralWords[r]+" "+s:(s?this.scaleAppendedWords[r]:this.scaleWords[r])+" "+s),s=t+" "+s)}r++}return s.replace(/\s+/g," ").trim()}},function(e,t){if(void 0!==t&&!function(e){if(null===e||"object"!=typeof e)return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}(t))throw new TypeError("options must be a plain object if provided");const{isNegative:s,integerPart:i,decimalPart:o}=function(e){const t=typeof e;if("bigint"===t)return e<0n?{isNegative:!0,integerPart:-e}:{isNegative:!1,integerPart:e};if("number"!==t&&"string"!==t)throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${t}`);const s="number"===t?function(e){if(!Number.isFinite(e))throw new Error("Number must be finite (NaN and Infinity are not supported)");const t=e.toString();return t.includes("e")||t.includes("E")?r(t):t}(e):function(e){const t=e.trim();if(0===t.length)throw new Error(`Invalid number format: "${e}"`);if(Number.isNaN(Number(t)))throw new Error(`Invalid number format: "${e}"`);return t.includes("e")||t.includes("E")?r(t):t}(e);return function(e){const t="-"===e[0];t&&(e=e.slice(1));const r=e.indexOf(".");if(-1===r)return{isNegative:t,integerPart:BigInt(e)};const s=e.slice(0,r)||"0",n=e.slice(r+1);return{isNegative:t,integerPart:BigInt(s),decimalPart:n}}(s)}(e);return new n(t).toWords(s,i,o)});var n;e.ArabicConverter=s});
3
+ //# sourceMappingURL=ArabicConverter.js.map