@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,27 @@
1
+ import type { ChallengeStorage } from '../../types/storage.js';
2
+ import type { ChallengeVerification } from '../../utils/challenge.js';
3
+ import type { CaptchaOptions } from '../v4/captcha.js';
4
+ export interface CaptchaChallenge {
5
+ contentType: string;
6
+ body: Buffer;
7
+ token: string;
8
+ }
9
+ /**
10
+ * Generates a hardened captcha whose answer is bound to a signed token instead
11
+ * of being returned in clear. The answer lives only inside the HMAC, so the
12
+ * caller holds a token it cannot read the solution from.
13
+ *
14
+ * @param options - Captcha configuration options
15
+ * @returns PNG buffer, content type, and the token to verify the answer against
16
+ * @throws Error if any option is out of the accepted range
17
+ */
18
+ export default function captchaChallenge(options: CaptchaOptions): CaptchaChallenge;
19
+ /**
20
+ * Verifies a captcha answer against its token, then consumes the token.
21
+ *
22
+ * @param token - Token issued alongside the challenge image
23
+ * @param answer - Answer read by the user, compared case-insensitively
24
+ * @param storage - Store of already consumed nonces
25
+ * @returns Verification result, with a reason when it fails
26
+ */
27
+ export declare function verifyCaptcha(token: string, answer: string, storage: ChallengeStorage): ChallengeVerification;
@@ -0,0 +1,136 @@
1
+ import { createCanvas } from 'canvas';
2
+ import { signToken, verifyToken } from '../../utils/challenge.js';
3
+ import { normalizeColor } from '../../utils/colors.js';
4
+ const NOISE_LEVELS = new Set(['low', 'medium', 'high']);
5
+ const NOISE_CONFIG = { low: { lines: 8, dots: 80 }, medium: { lines: 25, dots: 300 }, high: { lines: 50, dots: 600 } };
6
+ const CHARSET = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789';
7
+ const FONTS = ['sans-serif', 'serif', 'monospace', 'cursive'];
8
+ const STYLES = ['', 'bold ', 'italic ', 'bold italic '];
9
+ function generateText(length) {
10
+ let result = '';
11
+ for (let i = 0; i < length; i++) {
12
+ result += CHARSET[Math.floor(Math.random() * CHARSET.length)];
13
+ }
14
+ return result;
15
+ }
16
+ function clamp(value, name, def, min, max) {
17
+ if (value === undefined)
18
+ return def;
19
+ if (isNaN(value))
20
+ throw new Error(`${name} must be a number`);
21
+ if (value < min || value > max)
22
+ throw new Error(`${name} must be between ${min} and ${max}`);
23
+ return Math.floor(value);
24
+ }
25
+ const muted = () => `rgb(${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)})`;
26
+ /**
27
+ * Renders a CAPTCHA hardened against OCR: glyphs overlap so they cannot be
28
+ * segmented, ride a sine baseline with per-character shear, mix font families,
29
+ * and are crossed by occlusion strokes drawn in the same colours as the text so
30
+ * no colour filter can separate them. Reserved for challenge mode, where the
31
+ * answer never leaves the server; the generator mode keeps the milder rendering.
32
+ *
33
+ * @param options - Captcha configuration options
34
+ * @returns Object containing the PNG buffer, content type, and the challenge text
35
+ * @throws Error if any option is out of the accepted range
36
+ */
37
+ function hardened(options) {
38
+ const text = options.text || generateText(clamp(options.length, 'length', 6, 1, 20));
39
+ const height = clamp(options.height, 'height', 120, 50, 400);
40
+ const width = clamp(options.width, 'width', text.length * 60, 100, 800);
41
+ const noise = options.noise ?? 'medium';
42
+ if (!NOISE_LEVELS.has(noise))
43
+ throw new Error('Noise must be one of: low, medium, high');
44
+ const { lines, dots } = NOISE_CONFIG[noise];
45
+ const bg = normalizeColor(options.bg, '#ffffff');
46
+ const baseColor = options.color ? normalizeColor(options.color, '#000000') : undefined;
47
+ const canvas = createCanvas(width, height);
48
+ const ctx = canvas.getContext('2d');
49
+ ctx.fillStyle = bg;
50
+ ctx.fillRect(0, 0, width, height);
51
+ for (let i = 0; i < lines; i++) {
52
+ ctx.strokeStyle = `rgba(${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${0.3 + Math.random() * 0.4})`;
53
+ ctx.beginPath();
54
+ ctx.moveTo(Math.random() * width, Math.random() * height);
55
+ ctx.bezierCurveTo(Math.random() * width, Math.random() * height, Math.random() * width, Math.random() * height, Math.random() * width, Math.random() * height);
56
+ ctx.lineWidth = 1 + Math.random() * 2;
57
+ ctx.stroke();
58
+ }
59
+ const baseFontSize = Math.floor(height * 0.5);
60
+ const charWidth = width / (text.length * 0.68 + 0.6);
61
+ for (let i = 0; i < Math.floor(text.length * 1.5); i++) {
62
+ const size = Math.floor(baseFontSize * (0.4 + Math.random() * 0.3));
63
+ ctx.font = `${size}px ${FONTS[Math.floor(Math.random() * FONTS.length)]}`;
64
+ ctx.fillStyle = `rgba(${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${0.15 + Math.random() * 0.15})`;
65
+ ctx.fillText(CHARSET[Math.floor(Math.random() * CHARSET.length)], Math.random() * width, Math.random() * height);
66
+ }
67
+ const phase = Math.random() * Math.PI * 2;
68
+ const freq = 0.6 + Math.random() * 0.8;
69
+ const colors = [];
70
+ let x = charWidth * 0.25;
71
+ for (let i = 0; i < text.length; i++) {
72
+ const size = Math.floor(baseFontSize * (0.8 + Math.random() * 0.4));
73
+ const y = height / 2 + Math.sin(phase + i * freq) * height * 0.12;
74
+ const color = baseColor ?? muted();
75
+ colors.push(color);
76
+ ctx.font = `${STYLES[Math.floor(Math.random() * STYLES.length)]}${size}px ${FONTS[Math.floor(Math.random() * FONTS.length)]}`;
77
+ ctx.save();
78
+ ctx.translate(x + charWidth / 2, y);
79
+ ctx.rotate((Math.random() - 0.5) * 1.2);
80
+ ctx.transform(1, (Math.random() - 0.5) * 0.4, (Math.random() - 0.5) * 0.6, 1, 0, 0);
81
+ if (i % 3 === 1) {
82
+ ctx.strokeStyle = color;
83
+ ctx.lineWidth = Math.max(1, size * 0.04);
84
+ ctx.strokeText(text[i], -charWidth / 2, 0);
85
+ }
86
+ else {
87
+ ctx.fillStyle = color;
88
+ ctx.fillText(text[i], -charWidth / 2, 0);
89
+ }
90
+ ctx.restore();
91
+ x += charWidth * (0.55 + Math.random() * 0.15);
92
+ }
93
+ for (let i = 0; i < 2 + Math.floor(Math.random() * 3); i++) {
94
+ ctx.strokeStyle = colors[Math.floor(Math.random() * colors.length)];
95
+ ctx.lineWidth = Math.max(1, baseFontSize * 0.05);
96
+ ctx.beginPath();
97
+ const band = () => height * 0.3 + Math.random() * height * 0.4;
98
+ ctx.moveTo(0, band());
99
+ ctx.bezierCurveTo(width * 0.3, band(), width * 0.6, band(), width, band());
100
+ ctx.stroke();
101
+ }
102
+ for (let i = 0; i < dots; i++) {
103
+ ctx.fillStyle =
104
+ Math.random() < 0.5
105
+ ? colors[Math.floor(Math.random() * colors.length)]
106
+ : `rgba(${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${Math.floor(Math.random() * 180)}, ${0.4 + Math.random() * 0.5})`;
107
+ const dotSize = 1 + Math.random() * 2;
108
+ ctx.fillRect(Math.floor(Math.random() * width), Math.floor(Math.random() * height), dotSize, dotSize);
109
+ }
110
+ return { contentType: 'image/png', body: canvas.toBuffer('image/png'), text };
111
+ }
112
+ /**
113
+ * Generates a hardened captcha whose answer is bound to a signed token instead
114
+ * of being returned in clear. The answer lives only inside the HMAC, so the
115
+ * caller holds a token it cannot read the solution from.
116
+ *
117
+ * @param options - Captcha configuration options
118
+ * @returns PNG buffer, content type, and the token to verify the answer against
119
+ * @throws Error if any option is out of the accepted range
120
+ */
121
+ export default function captchaChallenge(options) {
122
+ const { contentType, body, text } = hardened(options);
123
+ return { contentType, body, token: signToken('img', text.toLowerCase()) };
124
+ }
125
+ /**
126
+ * Verifies a captcha answer against its token, then consumes the token.
127
+ *
128
+ * @param token - Token issued alongside the challenge image
129
+ * @param answer - Answer read by the user, compared case-insensitively
130
+ * @param storage - Store of already consumed nonces
131
+ * @returns Verification result, with a reason when it fails
132
+ */
133
+ export function verifyCaptcha(token, answer, storage) {
134
+ return verifyToken(token, answer.trim().toLowerCase(), storage);
135
+ }
136
+ //# sourceMappingURL=captcha.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../../src/modules/v5/captcha.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface CaseResult {
2
+ text: string;
3
+ to: string;
4
+ result: string;
5
+ }
6
+ /**
7
+ * Converts text to the specified case format.
8
+ * Supports: camel, pascal, snake, kebab, constant, title, sentence, upper, lower.
9
+ */
10
+ export default function caseConvert(text: string, to?: string): CaseResult;
@@ -0,0 +1,57 @@
1
+ import { MAX_STRING_LENGTH } from '../../constants.js';
2
+ const VALID_TARGETS = ['camel', 'pascal', 'snake', 'kebab', 'constant', 'title', 'sentence', 'upper', 'lower'];
3
+ const capitalize = (w) => w.charAt(0).toUpperCase() + w.slice(1);
4
+ const tokenize = (text) => text
5
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
6
+ .replace(/[_\-.]+/g, ' ')
7
+ .trim()
8
+ .split(/\s+/)
9
+ .filter(Boolean)
10
+ .map((w) => w.toLowerCase());
11
+ /**
12
+ * Converts text to the specified case format.
13
+ * Supports: camel, pascal, snake, kebab, constant, title, sentence, upper, lower.
14
+ */
15
+ export default function caseConvert(text, to = 'camel') {
16
+ if (!text)
17
+ throw new Error('Please provide a text (?text={text})');
18
+ if (text.length > MAX_STRING_LENGTH)
19
+ throw new Error(`Text cannot exceed ${MAX_STRING_LENGTH} characters`);
20
+ if (!VALID_TARGETS.includes(to))
21
+ throw new Error(`Invalid target case. Valid values: ${VALID_TARGETS.join(', ')}`);
22
+ const words = tokenize(text);
23
+ if (words.length === 0)
24
+ throw new Error('Text must contain at least one alphanumeric character');
25
+ let result;
26
+ switch (to) {
27
+ case 'camel':
28
+ result = words[0] + words.slice(1).map(capitalize).join('');
29
+ break;
30
+ case 'pascal':
31
+ result = words.map(capitalize).join('');
32
+ break;
33
+ case 'snake':
34
+ result = words.join('_');
35
+ break;
36
+ case 'kebab':
37
+ result = words.join('-');
38
+ break;
39
+ case 'constant':
40
+ result = words.join('_').toUpperCase();
41
+ break;
42
+ case 'title':
43
+ result = words.map(capitalize).join(' ');
44
+ break;
45
+ case 'sentence':
46
+ result = capitalize(words[0]) + (words.length > 1 ? ' ' + words.slice(1).join(' ') : '');
47
+ break;
48
+ case 'upper':
49
+ result = text.toUpperCase();
50
+ break;
51
+ case 'lower':
52
+ result = text.toLowerCase();
53
+ break;
54
+ }
55
+ return { text, to, result: result };
56
+ }
57
+ //# sourceMappingURL=case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"case.js","sourceRoot":"","sources":["../../../src/modules/v5/case.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export type ChartOutput = {
2
+ contentType: 'image/svg+xml';
3
+ body: string;
4
+ } | {
5
+ contentType: 'application/json';
6
+ body: Record<string, unknown>;
7
+ };
8
+ interface ChartOptions {
9
+ title?: unknown;
10
+ width?: unknown;
11
+ height?: unknown;
12
+ colors?: unknown;
13
+ bg?: unknown;
14
+ legend?: unknown;
15
+ mode?: unknown;
16
+ }
17
+ /**
18
+ * Renders a bar chart as SVG or returns its raw data.
19
+ *
20
+ * @param data - Chart data with labels and one or more datasets (each with a name and values array)
21
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
22
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
23
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
24
+ */
25
+ export declare function bar(data: unknown, options: ChartOptions): ChartOutput;
26
+ /**
27
+ * Renders a line chart as SVG or returns its raw data.
28
+ *
29
+ * @param data - Chart data with labels and one or more datasets (each with a name and values array)
30
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
31
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
32
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
33
+ */
34
+ export declare function line(data: unknown, options: ChartOptions): ChartOutput;
35
+ /**
36
+ * Renders a pie chart as SVG or returns its raw data.
37
+ *
38
+ * @param data - Chart data with labels and a single dataset (each with a name and values array)
39
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
40
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
41
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
42
+ */
43
+ export declare function pie(data: unknown, options: ChartOptions): ChartOutput;
44
+ /**
45
+ * Renders a donut chart as SVG or returns its raw data.
46
+ *
47
+ * @param data - Chart data with labels and a single dataset (each with a name and values array)
48
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
49
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
50
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
51
+ */
52
+ export declare function donut(data: unknown, options: ChartOptions): ChartOutput;
53
+ export {};