@moxon/api 6.0.0-pre

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 (246) hide show
  1. package/.prettierignore +5 -0
  2. package/LICENSE +28 -0
  3. package/README.md +277 -0
  4. package/dist/app.d.ts +2 -0
  5. package/dist/app.js +55 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/config/env.d.ts +22 -0
  8. package/dist/config/env.js +36 -0
  9. package/dist/config/env.js.map +1 -0
  10. package/dist/config/plans.d.ts +26 -0
  11. package/dist/config/plans.js +44 -0
  12. package/dist/config/plans.js.map +1 -0
  13. package/dist/config/versions.d.ts +18 -0
  14. package/dist/config/versions.js +248 -0
  15. package/dist/config/versions.js.map +1 -0
  16. package/dist/constants.d.ts +48 -0
  17. package/dist/constants.js +75 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/middleware/cors.d.ts +2 -0
  20. package/dist/middleware/cors.js +31 -0
  21. package/dist/middleware/cors.js.map +1 -0
  22. package/dist/middleware/error.d.ts +4 -0
  23. package/dist/middleware/error.js +8 -0
  24. package/dist/middleware/error.js.map +1 -0
  25. package/dist/middleware/json.d.ts +2 -0
  26. package/dist/middleware/json.js +8 -0
  27. package/dist/middleware/json.js.map +1 -0
  28. package/dist/middleware/logger.d.ts +26 -0
  29. package/dist/middleware/logger.js +65 -0
  30. package/dist/middleware/logger.js.map +1 -0
  31. package/dist/middleware/ratelimit.d.ts +2 -0
  32. package/dist/middleware/ratelimit.js +83 -0
  33. package/dist/middleware/ratelimit.js.map +1 -0
  34. package/dist/middleware/version.d.ts +3 -0
  35. package/dist/middleware/version.js +30 -0
  36. package/dist/middleware/version.js.map +1 -0
  37. package/dist/modules/v4/address.d.ts +20 -0
  38. package/dist/modules/v4/address.js +381 -0
  39. package/dist/modules/v4/address.js.map +1 -0
  40. package/dist/modules/v4/agent.d.ts +30 -0
  41. package/dist/modules/v4/agent.js +92 -0
  42. package/dist/modules/v4/agent.js.map +1 -0
  43. package/dist/modules/v4/algorithms.d.ts +90 -0
  44. package/dist/modules/v4/algorithms.js +279 -0
  45. package/dist/modules/v4/algorithms.js.map +1 -0
  46. package/dist/modules/v4/avatar.d.ts +23 -0
  47. package/dist/modules/v4/avatar.js +136 -0
  48. package/dist/modules/v4/avatar.js.map +1 -0
  49. package/dist/modules/v4/barcode.d.ts +27 -0
  50. package/dist/modules/v4/barcode.js +440 -0
  51. package/dist/modules/v4/barcode.js.map +1 -0
  52. package/dist/modules/v4/captcha.d.ts +22 -0
  53. package/dist/modules/v4/captcha.js +79 -0
  54. package/dist/modules/v4/captcha.js.map +1 -0
  55. package/dist/modules/v4/chat.d.ts +21 -0
  56. package/dist/modules/v4/chat.js +100 -0
  57. package/dist/modules/v4/chat.js.map +1 -0
  58. package/dist/modules/v4/color.d.ts +16 -0
  59. package/dist/modules/v4/color.js +59 -0
  60. package/dist/modules/v4/color.js.map +1 -0
  61. package/dist/modules/v4/convert.d.ts +15 -0
  62. package/dist/modules/v4/convert.js +116 -0
  63. package/dist/modules/v4/convert.js.map +1 -0
  64. package/dist/modules/v4/credit.d.ts +22 -0
  65. package/dist/modules/v4/credit.js +104 -0
  66. package/dist/modules/v4/credit.js.map +1 -0
  67. package/dist/modules/v4/cron.d.ts +17 -0
  68. package/dist/modules/v4/cron.js +202 -0
  69. package/dist/modules/v4/cron.js.map +1 -0
  70. package/dist/modules/v4/dice.d.ts +16 -0
  71. package/dist/modules/v4/dice.js +37 -0
  72. package/dist/modules/v4/dice.js.map +1 -0
  73. package/dist/modules/v4/domain.d.ts +6 -0
  74. package/dist/modules/v4/domain.js +83 -0
  75. package/dist/modules/v4/domain.js.map +1 -0
  76. package/dist/modules/v4/encode.d.ts +81 -0
  77. package/dist/modules/v4/encode.js +236 -0
  78. package/dist/modules/v4/encode.js.map +1 -0
  79. package/dist/modules/v4/geo.d.ts +30 -0
  80. package/dist/modules/v4/geo.js +51 -0
  81. package/dist/modules/v4/geo.js.map +1 -0
  82. package/dist/modules/v4/hash.d.ts +15 -0
  83. package/dist/modules/v4/hash.js +25 -0
  84. package/dist/modules/v4/hash.js.map +1 -0
  85. package/dist/modules/v4/hyperplanning.d.ts +19 -0
  86. package/dist/modules/v4/hyperplanning.js +80 -0
  87. package/dist/modules/v4/hyperplanning.js.map +1 -0
  88. package/dist/modules/v4/ip.d.ts +19 -0
  89. package/dist/modules/v4/ip.js +132 -0
  90. package/dist/modules/v4/ip.js.map +1 -0
  91. package/dist/modules/v4/levenshtein.d.ts +13 -0
  92. package/dist/modules/v4/levenshtein.js +37 -0
  93. package/dist/modules/v4/levenshtein.js.map +1 -0
  94. package/dist/modules/v4/palette.d.ts +19 -0
  95. package/dist/modules/v4/palette.js +56 -0
  96. package/dist/modules/v4/palette.js.map +1 -0
  97. package/dist/modules/v4/password.d.ts +25 -0
  98. package/dist/modules/v4/password.js +343 -0
  99. package/dist/modules/v4/password.js.map +1 -0
  100. package/dist/modules/v4/personal.d.ts +6 -0
  101. package/dist/modules/v4/personal.js +121 -0
  102. package/dist/modules/v4/personal.js.map +1 -0
  103. package/dist/modules/v4/placeholder.d.ts +30 -0
  104. package/dist/modules/v4/placeholder.js +160 -0
  105. package/dist/modules/v4/placeholder.js.map +1 -0
  106. package/dist/modules/v4/qrcode.d.ts +25 -0
  107. package/dist/modules/v4/qrcode.js +92 -0
  108. package/dist/modules/v4/qrcode.js.map +1 -0
  109. package/dist/modules/v4/regex.d.ts +23 -0
  110. package/dist/modules/v4/regex.js +48 -0
  111. package/dist/modules/v4/regex.js.map +1 -0
  112. package/dist/modules/v4/statistics.d.ts +20 -0
  113. package/dist/modules/v4/statistics.js +48 -0
  114. package/dist/modules/v4/statistics.js.map +1 -0
  115. package/dist/modules/v4/text.d.ts +43 -0
  116. package/dist/modules/v4/text.js +323 -0
  117. package/dist/modules/v4/text.js.map +1 -0
  118. package/dist/modules/v4/tic_tac_toe.d.ts +19 -0
  119. package/dist/modules/v4/tic_tac_toe.js +214 -0
  120. package/dist/modules/v4/tic_tac_toe.js.map +1 -0
  121. package/dist/modules/v4/time.d.ts +15 -0
  122. package/dist/modules/v4/time.js +124 -0
  123. package/dist/modules/v4/time.js.map +1 -0
  124. package/dist/modules/v4/token.d.ts +9 -0
  125. package/dist/modules/v4/token.js +45 -0
  126. package/dist/modules/v4/token.js.map +1 -0
  127. package/dist/modules/v4/username.d.ts +6 -0
  128. package/dist/modules/v4/username.js +92 -0
  129. package/dist/modules/v4/username.js.map +1 -0
  130. package/dist/modules/v4/validate.d.ts +34 -0
  131. package/dist/modules/v4/validate.js +75 -0
  132. package/dist/modules/v4/validate.js.map +1 -0
  133. package/dist/modules/v4.d.ts +32 -0
  134. package/dist/modules/v4.js +33 -0
  135. package/dist/modules/v4.js.map +1 -0
  136. package/dist/modules/v5/address.d.ts +5 -0
  137. package/dist/modules/v5/address.js +20 -0
  138. package/dist/modules/v5/address.js.map +1 -0
  139. package/dist/modules/v5/algorithms.d.ts +9 -0
  140. package/dist/modules/v5/algorithms.js +39 -0
  141. package/dist/modules/v5/algorithms.js.map +1 -0
  142. package/dist/modules/v5/asymmetric.d.ts +26 -0
  143. package/dist/modules/v5/asymmetric.js +74 -0
  144. package/dist/modules/v5/asymmetric.js.map +1 -0
  145. package/dist/modules/v5/barcode.d.ts +27 -0
  146. package/dist/modules/v5/barcode.js +424 -0
  147. package/dist/modules/v5/barcode.js.map +1 -0
  148. package/dist/modules/v5/base.d.ts +16 -0
  149. package/dist/modules/v5/base.js +41 -0
  150. package/dist/modules/v5/base.js.map +1 -0
  151. package/dist/modules/v5/captcha.d.ts +27 -0
  152. package/dist/modules/v5/captcha.js +136 -0
  153. package/dist/modules/v5/captcha.js.map +1 -0
  154. package/dist/modules/v5/case.d.ts +10 -0
  155. package/dist/modules/v5/case.js +57 -0
  156. package/dist/modules/v5/case.js.map +1 -0
  157. package/dist/modules/v5/chart.d.ts +53 -0
  158. package/dist/modules/v5/chart.js +385 -0
  159. package/dist/modules/v5/chart.js.map +1 -0
  160. package/dist/modules/v5/chat.d.ts +21 -0
  161. package/dist/modules/v5/chat.js +107 -0
  162. package/dist/modules/v5/chat.js.map +1 -0
  163. package/dist/modules/v5/csv.d.ts +29 -0
  164. package/dist/modules/v5/csv.js +143 -0
  165. package/dist/modules/v5/csv.js.map +1 -0
  166. package/dist/modules/v5/diff.d.ts +20 -0
  167. package/dist/modules/v5/diff.js +81 -0
  168. package/dist/modules/v5/diff.js.map +1 -0
  169. package/dist/modules/v5/evaluate.d.ts +14 -0
  170. package/dist/modules/v5/evaluate.js +284 -0
  171. package/dist/modules/v5/evaluate.js.map +1 -0
  172. package/dist/modules/v5/jwt.d.ts +11 -0
  173. package/dist/modules/v5/jwt.js +42 -0
  174. package/dist/modules/v5/jwt.js.map +1 -0
  175. package/dist/modules/v5/matrix.d.ts +77 -0
  176. package/dist/modules/v5/matrix.js +239 -0
  177. package/dist/modules/v5/matrix.js.map +1 -0
  178. package/dist/modules/v5/otp.d.ts +30 -0
  179. package/dist/modules/v5/otp.js +117 -0
  180. package/dist/modules/v5/otp.js.map +1 -0
  181. package/dist/modules/v5/pow.d.ts +29 -0
  182. package/dist/modules/v5/pow.js +49 -0
  183. package/dist/modules/v5/pow.js.map +1 -0
  184. package/dist/modules/v5/read.d.ts +20 -0
  185. package/dist/modules/v5/read.js +59 -0
  186. package/dist/modules/v5/read.js.map +1 -0
  187. package/dist/modules/v5/semver.d.ts +33 -0
  188. package/dist/modules/v5/semver.js +99 -0
  189. package/dist/modules/v5/semver.js.map +1 -0
  190. package/dist/modules/v5/symmetric.d.ts +15 -0
  191. package/dist/modules/v5/symmetric.js +88 -0
  192. package/dist/modules/v5/symmetric.js.map +1 -0
  193. package/dist/modules/v5/text.d.ts +5 -0
  194. package/dist/modules/v5/text.js +12 -0
  195. package/dist/modules/v5/text.js.map +1 -0
  196. package/dist/modules/v5/tic_tac_toe.d.ts +19 -0
  197. package/dist/modules/v5/tic_tac_toe.js +226 -0
  198. package/dist/modules/v5/tic_tac_toe.js.map +1 -0
  199. package/dist/modules/v5/url.d.ts +18 -0
  200. package/dist/modules/v5/url.js +51 -0
  201. package/dist/modules/v5/url.js.map +1 -0
  202. package/dist/modules/v5/uuid.d.ts +25 -0
  203. package/dist/modules/v5/uuid.js +40 -0
  204. package/dist/modules/v5/uuid.js.map +1 -0
  205. package/dist/modules/v5.d.ts +24 -0
  206. package/dist/modules/v5.js +25 -0
  207. package/dist/modules/v5.js.map +1 -0
  208. package/dist/modules/v6.d.ts +1 -0
  209. package/dist/modules/v6.js +2 -0
  210. package/dist/modules/v6.js.map +1 -0
  211. package/dist/routes/delete.d.ts +2 -0
  212. package/dist/routes/delete.js +73 -0
  213. package/dist/routes/delete.js.map +1 -0
  214. package/dist/routes/get.d.ts +2 -0
  215. package/dist/routes/get.js +857 -0
  216. package/dist/routes/get.js.map +1 -0
  217. package/dist/routes/index.d.ts +2 -0
  218. package/dist/routes/index.js +95 -0
  219. package/dist/routes/index.js.map +1 -0
  220. package/dist/routes/patch.d.ts +2 -0
  221. package/dist/routes/patch.js +45 -0
  222. package/dist/routes/patch.js.map +1 -0
  223. package/dist/routes/post.d.ts +2 -0
  224. package/dist/routes/post.js +604 -0
  225. package/dist/routes/post.js.map +1 -0
  226. package/dist/storage/index.d.ts +5 -0
  227. package/dist/storage/index.js +14 -0
  228. package/dist/storage/index.js.map +1 -0
  229. package/dist/types/storage.d.ts +52 -0
  230. package/dist/types/storage.js +2 -0
  231. package/dist/types/storage.js.map +1 -0
  232. package/dist/utils/challenge.d.ts +40 -0
  233. package/dist/utils/challenge.js +75 -0
  234. package/dist/utils/challenge.js.map +1 -0
  235. package/dist/utils/colors.d.ts +44 -0
  236. package/dist/utils/colors.js +93 -0
  237. package/dist/utils/colors.js.map +1 -0
  238. package/dist/utils/helpers.d.ts +55 -0
  239. package/dist/utils/helpers.js +82 -0
  240. package/dist/utils/helpers.js.map +1 -0
  241. package/dist/utils/response.d.ts +9 -0
  242. package/dist/utils/response.js +24 -0
  243. package/dist/utils/response.js.map +1 -0
  244. package/package.json +90 -0
  245. package/robots.txt +74 -0
  246. package/src/favicon.ico +0 -0
@@ -0,0 +1,323 @@
1
+ import { MAX_STRING_LENGTH } from '../../constants.js';
2
+ const LOREM_WORDS = [
3
+ 'lorem',
4
+ 'ipsum',
5
+ 'dolor',
6
+ 'sit',
7
+ 'amet',
8
+ 'consectetur',
9
+ 'adipiscing',
10
+ 'elit',
11
+ 'sed',
12
+ 'do',
13
+ 'eiusmod',
14
+ 'tempor',
15
+ 'incididunt',
16
+ 'ut',
17
+ 'labore',
18
+ 'et',
19
+ 'dolore',
20
+ 'magna',
21
+ 'aliqua',
22
+ 'enim',
23
+ 'ad',
24
+ 'minim',
25
+ 'veniam',
26
+ 'quis',
27
+ 'nostrud',
28
+ 'exercitation',
29
+ 'ullamco',
30
+ 'laboris',
31
+ 'nisi',
32
+ 'aliquip',
33
+ 'ex',
34
+ 'ea',
35
+ 'commodo',
36
+ 'consequat',
37
+ 'duis',
38
+ 'aute',
39
+ 'irure',
40
+ 'in',
41
+ 'reprehenderit',
42
+ 'voluptate',
43
+ 'velit',
44
+ 'esse',
45
+ 'cillum',
46
+ 'eu',
47
+ 'fugiat',
48
+ 'nulla',
49
+ 'pariatur',
50
+ 'excepteur',
51
+ 'sint',
52
+ 'occaecat',
53
+ 'cupidatat',
54
+ 'non',
55
+ 'proident',
56
+ 'sunt',
57
+ 'culpa',
58
+ 'qui',
59
+ 'officia',
60
+ 'deserunt',
61
+ 'mollit',
62
+ 'anim',
63
+ 'id',
64
+ 'est',
65
+ 'laborum',
66
+ ];
67
+ const FR_UNITS = [
68
+ 'zéro',
69
+ 'un',
70
+ 'deux',
71
+ 'trois',
72
+ 'quatre',
73
+ 'cinq',
74
+ 'six',
75
+ 'sept',
76
+ 'huit',
77
+ 'neuf',
78
+ 'dix',
79
+ 'onze',
80
+ 'douze',
81
+ 'treize',
82
+ 'quatorze',
83
+ 'quinze',
84
+ 'seize',
85
+ 'dix-sept',
86
+ 'dix-huit',
87
+ 'dix-neuf',
88
+ ];
89
+ const FR_TENS = [
90
+ '',
91
+ '',
92
+ 'vingt',
93
+ 'trente',
94
+ 'quarante',
95
+ 'cinquante',
96
+ 'soixante',
97
+ 'soixante',
98
+ 'quatre-vingt',
99
+ 'quatre-vingt',
100
+ ];
101
+ const EN_UNITS = [
102
+ 'zero',
103
+ 'one',
104
+ 'two',
105
+ 'three',
106
+ 'four',
107
+ 'five',
108
+ 'six',
109
+ 'seven',
110
+ 'eight',
111
+ 'nine',
112
+ 'ten',
113
+ 'eleven',
114
+ 'twelve',
115
+ 'thirteen',
116
+ 'fourteen',
117
+ 'fifteen',
118
+ 'sixteen',
119
+ 'seventeen',
120
+ 'eighteen',
121
+ 'nineteen',
122
+ ];
123
+ const EN_TENS = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
124
+ function checkText(value) {
125
+ if (!value)
126
+ throw new Error('A value is required');
127
+ if (typeof value !== 'string')
128
+ throw new Error('Value must be a string');
129
+ if (value.length > MAX_STRING_LENGTH)
130
+ throw new Error(`Value must be less than ${MAX_STRING_LENGTH} characters long`);
131
+ }
132
+ /**
133
+ * Analyzes a text string and returns character, word, sentence, and reading time statistics.
134
+ *
135
+ * @param value - The text to analyze
136
+ * @returns Object containing character counts, word/sentence/paragraph counts, reading time, and most frequent character
137
+ * @throws Error if value is missing, not a string, or too long
138
+ */
139
+ export function stats(value) {
140
+ checkText(value);
141
+ const characters = value.length;
142
+ const charactersNoSpaces = value.replace(/\s/g, '').length;
143
+ const words = value.trim().split(/\s+/).filter(Boolean).length;
144
+ const sentences = value.split(/[.!?]+/).filter((s) => s.trim().length > 0).length;
145
+ const paragraphs = value.split(/\n\s*\n/).filter((p) => p.trim().length > 0).length || 1;
146
+ const minutes = words / 200;
147
+ const readingTime = minutes < 1 ? `${Math.ceil(minutes * 60)}s` : `${Math.round(minutes)}min`;
148
+ const counts = new Map();
149
+ for (const c of value.replace(/\s/g, '').toLowerCase())
150
+ counts.set(c, (counts.get(c) ?? 0) + 1);
151
+ let mostFrequentChar = '';
152
+ let maxCount = 0;
153
+ for (const [char, count] of counts) {
154
+ if (count > maxCount) {
155
+ mostFrequentChar = char;
156
+ maxCount = count;
157
+ }
158
+ }
159
+ return { characters, charactersNoSpaces, words, sentences, paragraphs, readingTime, mostFrequentChar };
160
+ }
161
+ /**
162
+ * Converts a string to a URL-friendly slug.
163
+ *
164
+ * @param value - The string to slugify
165
+ * @returns Lowercase hyphenated slug with diacritics and special characters removed
166
+ * @throws Error if value is missing, not a string, or too long
167
+ */
168
+ export function slug(value) {
169
+ checkText(value);
170
+ return value
171
+ .normalize('NFD')
172
+ .replace(/[\u0300-\u036f]/g, '')
173
+ .toLowerCase()
174
+ .replace(/[^a-z0-9\s-]/g, '')
175
+ .trim()
176
+ .replace(/[\s-]+/g, '-');
177
+ }
178
+ /**
179
+ * Generates Lorem Ipsum placeholder text.
180
+ *
181
+ * @param type - Content type: "words", "sentences", or "paragraphs"
182
+ * @param count - Number of words, sentences, or paragraphs to generate
183
+ * @returns Generated Lorem Ipsum text
184
+ * @throws Error if count is out of range or type is not one of the accepted values
185
+ */
186
+ export function lorem(type, count) {
187
+ const n = Number(count) || 5;
188
+ if (n < 1 || n > 500)
189
+ throw new Error('Count must be between 1 and 500');
190
+ const randomWord = () => LOREM_WORDS[Math.floor(Math.random() * LOREM_WORDS.length)];
191
+ const randomSentence = () => {
192
+ const length = 5 + Math.floor(Math.random() * 10);
193
+ const words = Array.from({ length }, randomWord);
194
+ words[0] = words[0].charAt(0).toUpperCase() + words[0].slice(1);
195
+ return words.join(' ') + '.';
196
+ };
197
+ const randomParagraph = () => {
198
+ const length = 3 + Math.floor(Math.random() * 5);
199
+ return Array.from({ length }, randomSentence).join(' ');
200
+ };
201
+ switch (type) {
202
+ case 'words':
203
+ return Array.from({ length: n }, randomWord).join(' ');
204
+ case 'sentences':
205
+ return Array.from({ length: n }, randomSentence).join(' ');
206
+ case 'paragraphs':
207
+ return Array.from({ length: n }, randomParagraph).join('\n\n');
208
+ default:
209
+ throw new Error('Type must be one of: words, sentences, paragraphs');
210
+ }
211
+ }
212
+ function frBelowHundred(n) {
213
+ if (n < 20)
214
+ return FR_UNITS[n];
215
+ const t = Math.floor(n / 10);
216
+ const u = n % 10;
217
+ if (t === 7 || t === 9) {
218
+ const base = FR_TENS[t];
219
+ const sub = 10 + u;
220
+ return base + (base.endsWith('-') ? '' : '-') + FR_UNITS[sub];
221
+ }
222
+ if (t === 8 && u === 0)
223
+ return 'quatre-vingts';
224
+ if (u === 0)
225
+ return FR_TENS[t];
226
+ if (u === 1 && t < 8)
227
+ return FR_TENS[t] + ' et un';
228
+ return FR_TENS[t] + '-' + FR_UNITS[u];
229
+ }
230
+ function frBelowThousand(n) {
231
+ if (n < 100)
232
+ return frBelowHundred(n);
233
+ const h = Math.floor(n / 100);
234
+ const r = n % 100;
235
+ let result = '';
236
+ if (h === 1)
237
+ result = 'cent';
238
+ else
239
+ result = FR_UNITS[h] + ' cent' + (r === 0 ? 's' : '');
240
+ if (r > 0)
241
+ result += ' ' + frBelowHundred(r);
242
+ return result;
243
+ }
244
+ function numberToFrench(n) {
245
+ if (n === 0)
246
+ return 'zéro';
247
+ if (n < 0)
248
+ return 'moins ' + numberToFrench(-n);
249
+ if (n < 1000)
250
+ return frBelowThousand(n);
251
+ if (n < 1_000_000) {
252
+ const t = Math.floor(n / 1000);
253
+ const r = n % 1000;
254
+ const thousands = t === 1 ? 'mille' : frBelowThousand(t) + ' mille';
255
+ return r === 0 ? thousands : thousands + ' ' + frBelowThousand(r);
256
+ }
257
+ if (n < 1_000_000_000) {
258
+ const m = Math.floor(n / 1_000_000);
259
+ const r = n % 1_000_000;
260
+ const millions = m === 1 ? 'un million' : frBelowThousand(m) + ' millions';
261
+ return r === 0 ? millions : millions + ' ' + numberToFrench(r);
262
+ }
263
+ throw new Error('Number must be less than 1 billion');
264
+ }
265
+ function enBelowHundred(n) {
266
+ if (n < 20)
267
+ return EN_UNITS[n];
268
+ const t = Math.floor(n / 10);
269
+ const u = n % 10;
270
+ return u === 0 ? EN_TENS[t] : EN_TENS[t] + '-' + EN_UNITS[u];
271
+ }
272
+ function enBelowThousand(n) {
273
+ if (n < 100)
274
+ return enBelowHundred(n);
275
+ const h = Math.floor(n / 100);
276
+ const r = n % 100;
277
+ return r === 0 ? EN_UNITS[h] + ' hundred' : EN_UNITS[h] + ' hundred ' + enBelowHundred(r);
278
+ }
279
+ function numberToEnglish(n) {
280
+ if (n === 0)
281
+ return 'zero';
282
+ if (n < 0)
283
+ return 'minus ' + numberToEnglish(-n);
284
+ if (n < 1000)
285
+ return enBelowThousand(n);
286
+ if (n < 1_000_000) {
287
+ const t = Math.floor(n / 1000);
288
+ const r = n % 1000;
289
+ return r === 0 ? enBelowThousand(t) + ' thousand' : enBelowThousand(t) + ' thousand ' + enBelowThousand(r);
290
+ }
291
+ if (n < 1_000_000_000) {
292
+ const m = Math.floor(n / 1_000_000);
293
+ const r = n % 1_000_000;
294
+ return r === 0 ? enBelowThousand(m) + ' million' : enBelowThousand(m) + ' million ' + numberToEnglish(r);
295
+ }
296
+ throw new Error('Number must be less than 1 billion');
297
+ }
298
+ /**
299
+ * Converts an integer to its written-out word form in French or English.
300
+ *
301
+ * @param value - The integer to convert (must be less than 1 billion)
302
+ * @param lang - Language: "fr" for French or "en" for English
303
+ * @returns The number written out in words
304
+ * @throws Error if value is not an integer, exceeds the maximum, or lang is not supported
305
+ */
306
+ export function number(value, lang) {
307
+ const n = Number(value);
308
+ if (isNaN(n))
309
+ throw new Error('Value must be a number');
310
+ if (!Number.isInteger(n))
311
+ throw new Error('Value must be an integer');
312
+ if (Math.abs(n) >= 1_000_000_000)
313
+ throw new Error('Number must be less than 1 billion');
314
+ switch (lang) {
315
+ case 'fr':
316
+ return numberToFrench(n);
317
+ case 'en':
318
+ return numberToEnglish(n);
319
+ default:
320
+ throw new Error('Lang must be one of: fr, en');
321
+ }
322
+ }
323
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../src/modules/v4/text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,GAAG;IAChB,OAAO;IACP,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,aAAa;IACb,YAAY;IACZ,MAAM;IACN,KAAK;IACL,IAAI;IACJ,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,IAAI;IACJ,QAAQ;IACR,IAAI;IACJ,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,MAAM;IACN,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,MAAM;IACN,SAAS;IACT,cAAc;IACd,SAAS;IACT,SAAS;IACT,MAAM;IACN,SAAS;IACT,IAAI;IACJ,IAAI;IACJ,SAAS;IACT,WAAW;IACX,MAAM;IACN,MAAM;IACN,OAAO;IACP,IAAI;IACJ,eAAe;IACf,WAAW;IACX,OAAO;IACP,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,QAAQ;IACR,OAAO;IACP,UAAU;IACV,WAAW;IACX,MAAM;IACN,UAAU;IACV,WAAW;IACX,KAAK;IACL,UAAU;IACV,MAAM;IACN,OAAO;IACP,KAAK;IACL,SAAS;IACT,UAAU;IACV,QAAQ;IACR,MAAM;IACN,IAAI;IACJ,KAAK;IACL,SAAS;CACZ,CAAC;AAEF,MAAM,QAAQ,GAAG;IACb,MAAM;IACN,IAAI;IACJ,MAAM;IACN,OAAO;IACP,QAAQ;IACR,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,OAAO;IACP,UAAU;IACV,UAAU;IACV,UAAU;CACb,CAAC;AACF,MAAM,OAAO,GAAG;IACZ,EAAE;IACF,EAAE;IACF,OAAO;IACP,QAAQ;IACR,UAAU;IACV,WAAW;IACX,UAAU;IACV,UAAU;IACV,cAAc;IACd,cAAc;CACjB,CAAC;AAEF,MAAM,QAAQ,GAAG;IACb,MAAM;IACN,KAAK;IACL,KAAK;IACL,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,OAAO;IACP,MAAM;IACN,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,UAAU;IACV,SAAS;IACT,SAAS;IACT,WAAW;IACX,UAAU;IACV,UAAU;CACb,CAAC;AACF,MAAM,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAEvG,SAAS,SAAS,CAAC,KAAa;IAC5B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,MAAM,GAAG,iBAAiB;QAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,iBAAiB,kBAAkB,CAAC,CAAC;AACxF,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAC,KAAa;IAC/B,SAAS,CAAC,KAAK,CAAC,CAAC;IAEjB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;IAChC,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAClF,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IAEzF,MAAM,OAAO,GAAG,KAAK,GAAG,GAAG,CAAC;IAC5B,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IAE9F,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;QAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChG,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;YACnB,gBAAgB,GAAG,IAAI,CAAC;YACxB,QAAQ,GAAG,KAAK,CAAC;QACrB,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;AAC3G,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAAC,KAAa;IAC9B,SAAS,CAAC,KAAK,CAAC,CAAC;IACjB,OAAO,KAAK;SACP,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,IAAI,EAAE;SACN,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,KAAa;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAEzE,MAAM,UAAU,GAAG,GAAW,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAE,CAAC;IAC9F,MAAM,cAAc,GAAG,GAAW,EAAE;QAChC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;QACjD,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACjC,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,GAAW,EAAE;QACjC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,CAAC,CAAC;IAEF,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,OAAO;YACR,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,KAAK,WAAW;YACZ,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,KAAK,YAAY;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnE;YACI,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC7E,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC7B,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAE,CAAC;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACjB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QACnB,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,eAAe,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;IACnD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,CAAS;IAC9B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAClB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC;;QACxB,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC7B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACnB,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QACpE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QACxB,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC7B,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAE,CAAC;IAChC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;IACjB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,CAAS;IAC9B,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,eAAe,CAAC,CAAS;IAC9B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,IAAY;IAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACtE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAExF,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,IAAI;YACL,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC;QAC7B,KAAK,IAAI;YACL,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC;QAC9B;YACI,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACvD,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { TicTacToeStorage } from '../../types/storage.js';
2
+ interface TicTacToeParams {
3
+ username?: string;
4
+ move?: string;
5
+ session?: string;
6
+ game?: string;
7
+ private?: boolean;
8
+ storage: TicTacToeStorage;
9
+ }
10
+ /**
11
+ * Handles Tic-Tac-Toe game actions including playing a move, fetching game state, listing games, and forfeiting.
12
+ *
13
+ * @param action - The action to perform: "play", "fetch", "list", or "forfeit"
14
+ * @param params - Game parameters including username, move, session, game ID, and shared storage
15
+ * @returns Game state or action result depending on the action
16
+ * @throws Error if a required parameter is missing, the action is invalid, or a rate limit is exceeded
17
+ */
18
+ export default function tic_tac_toe(action: string, params: TicTacToeParams): Record<string, unknown>;
19
+ export {};
@@ -0,0 +1,214 @@
1
+ import { randomBytes } from 'crypto';
2
+ import { GAME_CLEANUP_TTL, RATE_LIMIT_MAX, RATE_LIMIT_WINDOW, SESSION_TTL } from '../../constants.js';
3
+ /**
4
+ * Handles Tic-Tac-Toe game actions including playing a move, fetching game state, listing games, and forfeiting.
5
+ *
6
+ * @param action - The action to perform: "play", "fetch", "list", or "forfeit"
7
+ * @param params - Game parameters including username, move, session, game ID, and shared storage
8
+ * @returns Game state or action result depending on the action
9
+ * @throws Error if a required parameter is missing, the action is invalid, or a rate limit is exceeded
10
+ */
11
+ export default function tic_tac_toe(action, params) {
12
+ const storage = params.storage;
13
+ storage.games ??= {};
14
+ storage.sessions ??= {};
15
+ storage.rateLimits ??= {};
16
+ const { games, sessions, rateLimits } = storage;
17
+ if (action === 'list')
18
+ return listGames(games);
19
+ if (!params.username)
20
+ throw new Error('Please provide a username');
21
+ const u = params.username.toLowerCase();
22
+ const now = Date.now();
23
+ rateLimits[u] = (rateLimits[u] ?? []).filter((ts) => now - ts < RATE_LIMIT_WINDOW);
24
+ if (rateLimits[u].length > RATE_LIMIT_MAX) {
25
+ const remainingTime = Math.ceil((rateLimits[u][0] + RATE_LIMIT_WINDOW - now) / 1000);
26
+ throw new Error(`Rate limit exceeded. Try again in ${remainingTime} seconds.`);
27
+ }
28
+ rateLimits[u].push(now);
29
+ if (action === 'play') {
30
+ return playMove(params, games, sessions, u, now);
31
+ }
32
+ else if (action === 'fetch') {
33
+ return fetchGame(params, games, u);
34
+ }
35
+ else if (action === 'forfeit') {
36
+ return forfeitGame(params, games, sessions);
37
+ }
38
+ else {
39
+ throw new Error('Invalid action. Use "play", "fetch", "list", or "forfeit"');
40
+ }
41
+ }
42
+ function forfeitGame(params, games, sessions) {
43
+ const { game, session } = params;
44
+ if (!game)
45
+ throw new Error('Please provide a valid game ID');
46
+ if (!session)
47
+ throw new Error('Please provide a valid session ID');
48
+ if (!games[game])
49
+ throw new Error('Game not found');
50
+ const u = params.username.toLowerCase();
51
+ if (sessions[u] && sessions[u].user !== session) {
52
+ throw new Error('Session ID mismatch');
53
+ }
54
+ const players = games[game].players;
55
+ if (!players.includes(u))
56
+ throw new Error('You are not a player in this game');
57
+ const winner = players.find((p) => p !== u) ?? null;
58
+ delete games[game];
59
+ delete sessions[u];
60
+ return {
61
+ message: `${params.username} forfeited the game.${winner ? ` ${winner} wins.` : ''}`,
62
+ winner,
63
+ loser: params.username,
64
+ };
65
+ }
66
+ function playMove(params, games, sessions, u, now) {
67
+ const { move, session, game } = params;
68
+ const validMoves = ['1-1', '1-2', '1-3', '2-1', '2-2', '2-3', '3-1', '3-2', '3-3'];
69
+ if (!move)
70
+ throw new Error('Please provide a valid move');
71
+ if (!session)
72
+ throw new Error('Please provide a valid session ID');
73
+ if (!game)
74
+ throw new Error('Please provide a valid game ID');
75
+ if (!validMoves.includes(move))
76
+ throw new Error('Invalid move. Please provide a valid move (e.g., 1-1, 2-2, 3-3).');
77
+ if (sessions[u] && sessions[u].user !== session) {
78
+ throw new Error('Session ID mismatch');
79
+ }
80
+ games[game] = games[game] ?? {
81
+ moves: [],
82
+ players: [],
83
+ private: params.private || false,
84
+ creation: Date.now(),
85
+ };
86
+ const moves = games[game].moves;
87
+ const players = [...new Set(moves.map((play) => play.username))];
88
+ if (players.length >= 2 && !players.includes(params.username)) {
89
+ throw new Error('Game is full, you can only watch.');
90
+ }
91
+ if (moves.length > 0 && moves[moves.length - 1].username === params.username) {
92
+ throw new Error('Please wait for the other player to make a move.');
93
+ }
94
+ if (moves.some((play) => play.move === move)) {
95
+ throw new Error('Move already made. Please choose a different move.');
96
+ }
97
+ const play = { username: params.username, move, session };
98
+ moves.push(play);
99
+ const result = checkGame(moves);
100
+ if (result.winner || result.tie) {
101
+ setTimeout(() => delete games[game], GAME_CLEANUP_TTL).unref();
102
+ return {
103
+ message: `Move sent successfully. ${result.winner ? result.winner + ' wins. ' + result.loser + ' loses.' : "It's a tie."}`,
104
+ ...result,
105
+ };
106
+ }
107
+ setTimeout(() => delete games[game], SESSION_TTL).unref();
108
+ sessions[u] = sessions[u] ?? { user: session, last: now };
109
+ sessions[u].last = now;
110
+ setTimeout(() => {
111
+ if (sessions[u] && now - sessions[u].last >= SESSION_TTL)
112
+ delete sessions[u];
113
+ }, SESSION_TTL).unref();
114
+ return { message: 'Move sent successfully' };
115
+ }
116
+ function fetchGame(params, games, u) {
117
+ const id = params.game || generateGameId();
118
+ if (!games[id]) {
119
+ games[id] = {
120
+ moves: [],
121
+ players: [],
122
+ private: params.private || false,
123
+ creation: Date.now(),
124
+ };
125
+ }
126
+ if (!games[id].players.includes(u)) {
127
+ games[id].players.push(u);
128
+ }
129
+ const moves = games[id].moves;
130
+ const players = games[id].players;
131
+ const privateGame = games[id].private;
132
+ const lastPlayer = moves.length ? moves[moves.length - 1].username : null;
133
+ const turn = players.find((p) => p !== lastPlayer) || players[0];
134
+ const status = players.length >= 2 ? 'ready' : 'waiting';
135
+ const result = moves.length ? checkGame(moves) : {};
136
+ return {
137
+ id,
138
+ moves,
139
+ players,
140
+ turn,
141
+ status,
142
+ private: privateGame,
143
+ ...result,
144
+ };
145
+ }
146
+ function listGames(games) {
147
+ const publicGames = [];
148
+ const now = Date.now();
149
+ for (const [gameId, game] of Object.entries(games)) {
150
+ if (!game.private) {
151
+ const result = game.moves.length ? checkGame(game.moves) : {};
152
+ const isFinished = result.winner || result.tie;
153
+ if (!isFinished) {
154
+ const lastPlayer = game.moves.length ? game.moves[game.moves.length - 1].username : null;
155
+ const turn = game.players.find((p) => p !== lastPlayer) || game.players[0];
156
+ const status = game.players.length >= 2 ? 'ready' : 'waiting';
157
+ publicGames.push({
158
+ id: gameId,
159
+ players: game.players,
160
+ playersCount: game.players.length,
161
+ moves: game.moves.length,
162
+ turn,
163
+ status,
164
+ creation: game.creation || now,
165
+ });
166
+ }
167
+ }
168
+ }
169
+ publicGames.sort((a, b) => b.creation - a.creation);
170
+ return {
171
+ message: 'Public games available',
172
+ count: publicGames.length,
173
+ games: publicGames,
174
+ };
175
+ }
176
+ function generateGameId() {
177
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
178
+ return Array.from(randomBytes(5))
179
+ .map((b) => chars[b % chars.length])
180
+ .join('');
181
+ }
182
+ function checkGame(moves) {
183
+ const board = Array(3)
184
+ .fill(null)
185
+ .map(() => Array(3).fill(null));
186
+ const playerSymbols = {};
187
+ const playersOrder = [];
188
+ moves.forEach(({ username, move }) => {
189
+ if (!playerSymbols[username]) {
190
+ playersOrder.push(username);
191
+ playerSymbols[username] = playersOrder.length === 1 ? 'X' : 'O';
192
+ }
193
+ const [row, col] = move.split('-').map(Number);
194
+ board[row - 1][col - 1] = playerSymbols[username];
195
+ });
196
+ const checkWinner = (symbol) => {
197
+ for (let i = 0; i < 3; i++) {
198
+ if (board[i][0] === symbol && board[i][1] === symbol && board[i][2] === symbol)
199
+ return true;
200
+ if (board[0][i] === symbol && board[1][i] === symbol && board[2][i] === symbol)
201
+ return true;
202
+ }
203
+ if (board[0][0] === symbol && board[1][1] === symbol && board[2][2] === symbol)
204
+ return true;
205
+ if (board[0][2] === symbol && board[1][1] === symbol && board[2][0] === symbol)
206
+ return true;
207
+ return false;
208
+ };
209
+ const winner = Object.keys(playerSymbols).find((player) => checkWinner(playerSymbols[player])) ?? null;
210
+ const isTie = !winner && moves.length === 9;
211
+ const loser = winner && playersOrder.length === 2 ? (playersOrder.find((player) => player !== winner) ?? null) : null;
212
+ return { winner, loser, tie: isTie };
213
+ }
214
+ //# sourceMappingURL=tic_tac_toe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tic_tac_toe.js","sourceRoot":"","sources":["../../../src/modules/v4/tic_tac_toe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare const VALID_TIMEZONES: readonly ["UTC", "America/New_York", "Europe/Paris", "Asia/Tokyo", "Australia/Sydney"];
2
+ /**
3
+ * Returns the current or a random date/time in various formats and timezones,
4
+ * or computes a countdown/elapsed time to/from a target date.
5
+ *
6
+ * @param type - "live" for the current time, "random" for a random date, or "countdown" for a time diff
7
+ * @param start - Optional start date for random mode (YYYY-MM-DD)
8
+ * @param end - Optional end date for random mode (YYYY-MM-DD)
9
+ * @param format - Optional specific format to return (e.g. "iso", "timestamp", "year")
10
+ * @param timezone - Optional timezone (e.g. "UTC", "Europe/Paris")
11
+ * @param target - Required for countdown mode: target date in ISO 8601 or YYYY-MM-DD format
12
+ * @returns Object containing all time formats, a single format, or a countdown result
13
+ * @throws Error if type, format, timezone, or target is invalid
14
+ */
15
+ export default function time(type?: string, start?: string, end?: string, format?: string, timezone?: string, target?: string): Record<string, unknown>;