@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,385 @@
1
+ import { MAX_CHART_DATASETS, MAX_CHART_LABELS } from '../../constants.js';
2
+ import { normalizeColor } from '../../utils/colors.js';
3
+ const DEFAULT_COLORS = [
4
+ '#4e79a7',
5
+ '#f28e2b',
6
+ '#e15759',
7
+ '#76b7b2',
8
+ '#59a14f',
9
+ '#edc948',
10
+ '#b07aa1',
11
+ '#ff9da7',
12
+ '#9c755f',
13
+ '#bab0ac',
14
+ ];
15
+ const DEFAULT_W = 600;
16
+ const DEFAULT_H = 400;
17
+ const MARGIN = { top: 30, right: 40, bottom: 40, left: 50 };
18
+ const TITLE_HEIGHT = 30;
19
+ const LEGEND_ROW_H = 18;
20
+ function escapeXml(str) {
21
+ return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
22
+ }
23
+ function parseDisplaySize(v, name) {
24
+ if (v === undefined || v === null)
25
+ return null;
26
+ const n = Number(v);
27
+ if (!isFinite(n) || n <= 0)
28
+ throw new Error(`Field '${name}' must be a positive number`);
29
+ return Math.floor(n);
30
+ }
31
+ function getColors(colors, n) {
32
+ const result = [];
33
+ if (Array.isArray(colors)) {
34
+ for (const c of colors) {
35
+ result.push(normalizeColor(String(c), DEFAULT_COLORS[result.length % DEFAULT_COLORS.length]));
36
+ }
37
+ }
38
+ while (result.length < n) {
39
+ result.push(DEFAULT_COLORS[result.length % DEFAULT_COLORS.length]);
40
+ }
41
+ return result;
42
+ }
43
+ function svgOpen(bg, renderW, renderH, displayW, displayH) {
44
+ const wAttr = displayW !== null ? ` width="${displayW}"` : '';
45
+ const hAttr = displayH !== null ? ` height="${displayH}"` : '';
46
+ return `<svg xmlns="http://www.w3.org/2000/svg"${wAttr}${hAttr} viewBox="0 0 ${renderW} ${renderH}">\n <rect width="${renderW}" height="${renderH}" fill="${bg}"/>\n`;
47
+ }
48
+ function validateBarLine(data) {
49
+ if (!data || typeof data !== 'object')
50
+ throw new Error("Field 'data' is required");
51
+ const d = data;
52
+ if (!Array.isArray(d['labels']) || d['labels'].length === 0)
53
+ throw new Error("Field 'data.labels' must be a non-empty array");
54
+ if (d['labels'].length > MAX_CHART_LABELS)
55
+ throw new Error(`Cannot exceed ${MAX_CHART_LABELS} labels`);
56
+ if (!Array.isArray(d['datasets']) || d['datasets'].length === 0)
57
+ throw new Error("Field 'data.datasets' must be a non-empty array");
58
+ if (d['datasets'].length > MAX_CHART_DATASETS)
59
+ throw new Error(`Cannot exceed ${MAX_CHART_DATASETS} datasets`);
60
+ for (const ds of d['datasets']) {
61
+ const dataset = ds;
62
+ if (!Array.isArray(dataset['values']) || dataset['values'].length !== d['labels'].length)
63
+ throw new Error("Each dataset's 'values' must have the same length as 'labels'");
64
+ for (const v of dataset['values']) {
65
+ if (typeof v !== 'number' || !isFinite(v))
66
+ throw new Error('Dataset values must be finite numbers');
67
+ }
68
+ }
69
+ return {
70
+ labels: d['labels'].map(String),
71
+ datasets: d['datasets'].map((ds) => ({
72
+ label: String(ds['label'] ?? ''),
73
+ values: ds['values'],
74
+ })),
75
+ };
76
+ }
77
+ function validatePieDonut(data) {
78
+ if (!data || typeof data !== 'object')
79
+ throw new Error("Field 'data' is required");
80
+ const d = data;
81
+ if (!Array.isArray(d['labels']) || d['labels'].length === 0)
82
+ throw new Error("Field 'data.labels' must be a non-empty array");
83
+ if (!Array.isArray(d['values']) || d['values'].length === 0)
84
+ throw new Error("Field 'data.values' must be a non-empty array");
85
+ if (d['labels'].length !== d['values'].length)
86
+ throw new Error("Fields 'data.labels' and 'data.values' must have the same length");
87
+ if (d['labels'].length > MAX_CHART_LABELS)
88
+ throw new Error(`Cannot exceed ${MAX_CHART_LABELS} labels`);
89
+ for (const v of d['values']) {
90
+ if (typeof v !== 'number' || !isFinite(v) || v < 0)
91
+ throw new Error('Pie/donut values must be non-negative finite numbers');
92
+ }
93
+ const total = d['values'].reduce((s, v) => s + v, 0);
94
+ if (total <= 0)
95
+ throw new Error('At least one pie/donut value must be positive');
96
+ return {
97
+ labels: d['labels'].map(String),
98
+ values: d['values'],
99
+ };
100
+ }
101
+ function yScale(values) {
102
+ let dataMax = Math.max(...values, 0);
103
+ const dataMin = Math.min(...values, 0);
104
+ if (dataMax === dataMin)
105
+ dataMax = dataMin + 1;
106
+ const range = dataMax - dataMin;
107
+ const rawStep = range / 5;
108
+ const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));
109
+ const step = Math.ceil(rawStep / magnitude) * magnitude;
110
+ const min = Math.floor(dataMin / step) * step;
111
+ const max = Math.ceil(dataMax / step) * step;
112
+ const gridCount = Math.max(1, Math.round((max - min) / step));
113
+ return { min, max, gridCount };
114
+ }
115
+ function toY(value, min, max, chartH) {
116
+ return chartH - ((value - min) / (max - min)) * chartH;
117
+ }
118
+ function parseOptions(options) {
119
+ const displayW = parseDisplaySize(options.width, 'width');
120
+ const displayH = parseDisplaySize(options.height, 'height');
121
+ return {
122
+ renderW: displayW ?? DEFAULT_W,
123
+ renderH: displayH ?? DEFAULT_H,
124
+ displayW,
125
+ displayH,
126
+ bg: normalizeColor(typeof options.bg === 'string' ? options.bg : undefined, '#ffffff'),
127
+ title: typeof options.title === 'string' && options.title ? options.title : '',
128
+ showLegend: options.legend !== false,
129
+ mode: options.mode === 'data' ? 'data' : 'svg',
130
+ };
131
+ }
132
+ /**
133
+ * Renders a bar chart as SVG or returns its raw data.
134
+ *
135
+ * @param data - Chart data with labels and one or more datasets (each with a name and values array)
136
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
137
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
138
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
139
+ */
140
+ export function bar(data, options) {
141
+ const d = validateBarLine(data);
142
+ const { renderW, renderH, displayW, displayH, bg, title, showLegend, mode } = parseOptions(options);
143
+ const colors = getColors(options.colors, d.datasets.length);
144
+ const allValues = d.datasets.flatMap((ds) => ds.values);
145
+ const { min, max, gridCount } = yScale(allValues);
146
+ if (mode === 'data') {
147
+ return {
148
+ contentType: 'application/json',
149
+ body: {
150
+ type: 'bar',
151
+ labels: d.labels,
152
+ datasets: d.datasets,
153
+ scale: { min, max, gridCount },
154
+ },
155
+ };
156
+ }
157
+ const marginTop = MARGIN.top + (title ? TITLE_HEIGHT : 0);
158
+ const legendH = showLegend && d.datasets.some((ds) => ds.label) ? LEGEND_ROW_H + 10 : 0;
159
+ const chartW = renderW - MARGIN.left - MARGIN.right;
160
+ const chartH = renderH - marginTop - MARGIN.bottom - legendH;
161
+ const groupW = chartW / d.labels.length;
162
+ const barW = (groupW * 0.8) / d.datasets.length;
163
+ const groupPad = groupW * 0.1;
164
+ let svg = svgOpen(bg, renderW, renderH, displayW, displayH);
165
+ if (title)
166
+ svg += ` <text x="${renderW / 2}" y="${MARGIN.top}" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#333">${escapeXml(title)}</text>\n`;
167
+ // Grid lines + Y labels
168
+ for (let i = 0; i <= gridCount; i++) {
169
+ const val = min + i * ((max - min) / gridCount);
170
+ const y = marginTop + toY(val, min, max, chartH);
171
+ svg += ` <line x1="${MARGIN.left}" y1="${y.toFixed(1)}" x2="${MARGIN.left + chartW}" y2="${y.toFixed(1)}" stroke="#e0e0e0" stroke-width="1"/>\n`;
172
+ svg += ` <text x="${MARGIN.left - 6}" y="${(y + 4).toFixed(1)}" text-anchor="end" font-family="sans-serif" font-size="11" fill="#666">${Number(val.toFixed(4))}</text>\n`;
173
+ }
174
+ // Bars
175
+ d.datasets.forEach((ds, di) => {
176
+ ds.values.forEach((val, li) => {
177
+ const x = MARGIN.left + groupPad + li * groupW + di * barW;
178
+ const bH = Math.abs(toY(val, min, max, chartH) - toY(0, min, max, chartH));
179
+ const y = marginTop + Math.min(toY(val, min, max, chartH), toY(0, min, max, chartH));
180
+ svg += ` <rect x="${x.toFixed(1)}" y="${y.toFixed(1)}" width="${barW.toFixed(1)}" height="${bH.toFixed(1)}" fill="${colors[di]}"/>\n`;
181
+ });
182
+ });
183
+ // X axis labels
184
+ d.labels.forEach((label, i) => {
185
+ const x = MARGIN.left + groupPad + i * groupW + (groupW * 0.8) / 2;
186
+ svg += ` <text x="${x.toFixed(1)}" y="${(marginTop + chartH + 20).toFixed(1)}" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#666">${escapeXml(label)}</text>\n`;
187
+ });
188
+ // Axes
189
+ svg += ` <line x1="${MARGIN.left}" y1="${marginTop}" x2="${MARGIN.left}" y2="${marginTop + chartH}" stroke="#999" stroke-width="1"/>\n`;
190
+ svg += ` <line x1="${MARGIN.left}" y1="${marginTop + chartH}" x2="${MARGIN.left + chartW}" y2="${marginTop + chartH}" stroke="#999" stroke-width="1"/>\n`;
191
+ // Legend
192
+ if (showLegend && d.datasets.some((ds) => ds.label)) {
193
+ const legendY = marginTop + chartH + 38;
194
+ let lx = MARGIN.left;
195
+ d.datasets.forEach((ds, di) => {
196
+ svg += ` <rect x="${lx}" y="${legendY - 10}" width="12" height="12" fill="${colors[di]}"/>\n`;
197
+ svg += ` <text x="${lx + 16}" y="${legendY}" font-family="sans-serif" font-size="11" fill="#666">${escapeXml(ds.label)}</text>\n`;
198
+ lx += 16 + ds.label.length * 7 + 12;
199
+ });
200
+ }
201
+ svg += '</svg>';
202
+ return { contentType: 'image/svg+xml', body: svg };
203
+ }
204
+ /**
205
+ * Renders a line chart as SVG or returns its raw data.
206
+ *
207
+ * @param data - Chart data with labels and one or more datasets (each with a name and values array)
208
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
209
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
210
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
211
+ */
212
+ export function line(data, options) {
213
+ const d = validateBarLine(data);
214
+ const { renderW, renderH, displayW, displayH, bg, title, showLegend, mode } = parseOptions(options);
215
+ const colors = getColors(options.colors, d.datasets.length);
216
+ const allValues = d.datasets.flatMap((ds) => ds.values);
217
+ const { min, max, gridCount } = yScale(allValues);
218
+ if (mode === 'data') {
219
+ return {
220
+ contentType: 'application/json',
221
+ body: {
222
+ type: 'line',
223
+ labels: d.labels,
224
+ datasets: d.datasets,
225
+ scale: { min, max, gridCount },
226
+ },
227
+ };
228
+ }
229
+ const marginTop = MARGIN.top + (title ? TITLE_HEIGHT : 0);
230
+ const legendH = showLegend && d.datasets.some((ds) => ds.label) ? LEGEND_ROW_H + 10 : 0;
231
+ const chartW = renderW - MARGIN.left - MARGIN.right;
232
+ const chartH = renderH - marginTop - MARGIN.bottom - legendH;
233
+ const xStep = chartW / Math.max(d.labels.length - 1, 1);
234
+ const xPos = (i) => MARGIN.left + (d.labels.length > 1 ? i * xStep : chartW / 2);
235
+ let svg = svgOpen(bg, renderW, renderH, displayW, displayH);
236
+ if (title)
237
+ svg += ` <text x="${renderW / 2}" y="${MARGIN.top}" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#333">${escapeXml(title)}</text>\n`;
238
+ // Grid lines + Y labels
239
+ for (let i = 0; i <= gridCount; i++) {
240
+ const val = min + i * ((max - min) / gridCount);
241
+ const y = marginTop + toY(val, min, max, chartH);
242
+ svg += ` <line x1="${MARGIN.left}" y1="${y.toFixed(1)}" x2="${MARGIN.left + chartW}" y2="${y.toFixed(1)}" stroke="#e0e0e0" stroke-width="1"/>\n`;
243
+ svg += ` <text x="${MARGIN.left - 6}" y="${(y + 4).toFixed(1)}" text-anchor="end" font-family="sans-serif" font-size="11" fill="#666">${Number(val.toFixed(4))}</text>\n`;
244
+ }
245
+ // Axes (drawn before data so points appear on top)
246
+ svg += ` <line x1="${MARGIN.left}" y1="${marginTop}" x2="${MARGIN.left}" y2="${marginTop + chartH}" stroke="#999" stroke-width="1"/>\n`;
247
+ svg += ` <line x1="${MARGIN.left}" y1="${marginTop + chartH}" x2="${MARGIN.left + chartW}" y2="${marginTop + chartH}" stroke="#999" stroke-width="1"/>\n`;
248
+ // Lines + points
249
+ d.datasets.forEach((ds, di) => {
250
+ const points = ds.values
251
+ .map((val, i) => {
252
+ const x = xPos(i);
253
+ const y = marginTop + toY(val, min, max, chartH);
254
+ return `${x.toFixed(1)},${y.toFixed(1)}`;
255
+ })
256
+ .join(' ');
257
+ svg += ` <polyline points="${points}" fill="none" stroke="${colors[di]}" stroke-width="2" stroke-linejoin="round"/>\n`;
258
+ ds.values.forEach((val, i) => {
259
+ const x = xPos(i);
260
+ const y = marginTop + toY(val, min, max, chartH);
261
+ svg += ` <circle cx="${x.toFixed(1)}" cy="${y.toFixed(1)}" r="3" fill="${colors[di]}"/>\n`;
262
+ });
263
+ });
264
+ // X axis labels
265
+ d.labels.forEach((label, i) => {
266
+ const x = xPos(i);
267
+ svg += ` <text x="${x.toFixed(1)}" y="${(marginTop + chartH + 20).toFixed(1)}" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#666">${escapeXml(label)}</text>\n`;
268
+ });
269
+ // Legend
270
+ if (showLegend && d.datasets.some((ds) => ds.label)) {
271
+ const legendY = marginTop + chartH + 38;
272
+ let lx = MARGIN.left;
273
+ d.datasets.forEach((ds, di) => {
274
+ svg += ` <rect x="${lx}" y="${legendY - 10}" width="12" height="12" fill="${colors[di]}"/>\n`;
275
+ svg += ` <text x="${lx + 16}" y="${legendY}" font-family="sans-serif" font-size="11" fill="#666">${escapeXml(ds.label)}</text>\n`;
276
+ lx += 16 + ds.label.length * 7 + 12;
277
+ });
278
+ }
279
+ svg += '</svg>';
280
+ return { contentType: 'image/svg+xml', body: svg };
281
+ }
282
+ function pieArc(cx, cy, r, startAngle, endAngle, innerR = 0) {
283
+ const start = { x: cx + r * Math.cos(startAngle), y: cy + r * Math.sin(startAngle) };
284
+ const end = { x: cx + r * Math.cos(endAngle), y: cy + r * Math.sin(endAngle) };
285
+ const largeArc = endAngle - startAngle > Math.PI ? 1 : 0;
286
+ if (innerR === 0) {
287
+ return [
288
+ `M ${cx.toFixed(2)} ${cy.toFixed(2)}`,
289
+ `L ${start.x.toFixed(2)} ${start.y.toFixed(2)}`,
290
+ `A ${r} ${r} 0 ${largeArc} 1 ${end.x.toFixed(2)} ${end.y.toFixed(2)}`,
291
+ 'Z',
292
+ ].join(' ');
293
+ }
294
+ const innerStart = { x: cx + innerR * Math.cos(endAngle), y: cy + innerR * Math.sin(endAngle) };
295
+ const innerEnd = { x: cx + innerR * Math.cos(startAngle), y: cy + innerR * Math.sin(startAngle) };
296
+ return [
297
+ `M ${start.x.toFixed(2)} ${start.y.toFixed(2)}`,
298
+ `A ${r} ${r} 0 ${largeArc} 1 ${end.x.toFixed(2)} ${end.y.toFixed(2)}`,
299
+ `L ${innerStart.x.toFixed(2)} ${innerStart.y.toFixed(2)}`,
300
+ `A ${innerR} ${innerR} 0 ${largeArc} 0 ${innerEnd.x.toFixed(2)} ${innerEnd.y.toFixed(2)}`,
301
+ 'Z',
302
+ ].join(' ');
303
+ }
304
+ function renderPieDonut(type, data, options, isDonut) {
305
+ const d = validatePieDonut(data);
306
+ const { renderW, renderH, displayW, displayH, bg, title, showLegend, mode } = parseOptions(options);
307
+ const colors = getColors(options.colors, d.labels.length);
308
+ const total = d.values.reduce((s, v) => s + v, 0);
309
+ if (mode === 'data') {
310
+ return {
311
+ contentType: 'application/json',
312
+ body: {
313
+ type,
314
+ total,
315
+ slices: d.labels.map((label, i) => ({
316
+ label,
317
+ value: d.values[i],
318
+ percentage: Number(((d.values[i] / total) * 100).toFixed(2)),
319
+ })),
320
+ },
321
+ };
322
+ }
323
+ const titleOffset = title ? TITLE_HEIGHT : 0;
324
+ const legendH = showLegend ? d.labels.length * LEGEND_ROW_H + 10 : 0;
325
+ const chartAreaH = renderH - titleOffset - MARGIN.top - legendH - (showLegend ? 10 : 0);
326
+ const cx = renderW / 2;
327
+ const cy = titleOffset + MARGIN.top + chartAreaH / 2;
328
+ const r = Math.max(10, Math.min(cx - MARGIN.left, chartAreaH / 2 - 10));
329
+ const innerR = isDonut ? r * 0.55 : 0;
330
+ let svg = svgOpen(bg, renderW, renderH, displayW, displayH);
331
+ if (title)
332
+ svg += ` <text x="${renderW / 2}" y="${MARGIN.top + titleOffset - 10}" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#333">${escapeXml(title)}</text>\n`;
333
+ let startAngle = -Math.PI / 2;
334
+ d.values.forEach((val, i) => {
335
+ if (val === 0)
336
+ return;
337
+ const sweep = (val / total) * 2 * Math.PI;
338
+ if (sweep >= 2 * Math.PI - 1e-9) {
339
+ svg += ` <circle cx="${cx.toFixed(2)}" cy="${cy.toFixed(2)}" r="${r}" fill="${colors[i]}" stroke="${bg}" stroke-width="1.5"/>\n`;
340
+ if (innerR > 0)
341
+ svg += ` <circle cx="${cx.toFixed(2)}" cy="${cy.toFixed(2)}" r="${innerR}" fill="${bg}"/>\n`;
342
+ startAngle += sweep;
343
+ return;
344
+ }
345
+ const endAngle = startAngle + sweep;
346
+ const path = pieArc(cx, cy, r, startAngle, endAngle, innerR);
347
+ svg += ` <path d="${path}" fill="${colors[i]}" stroke="${bg}" stroke-width="1.5"/>\n`;
348
+ startAngle = endAngle;
349
+ });
350
+ // Legend
351
+ if (showLegend) {
352
+ const legendStartY = titleOffset + MARGIN.top + chartAreaH + 10;
353
+ d.labels.forEach((label, i) => {
354
+ const pct = ((d.values[i] / total) * 100).toFixed(1);
355
+ const y = legendStartY + i * LEGEND_ROW_H;
356
+ svg += ` <rect x="${MARGIN.left}" y="${y - 10}" width="12" height="12" fill="${colors[i]}"/>\n`;
357
+ svg += ` <text x="${MARGIN.left + 18}" y="${y}" font-family="sans-serif" font-size="11" fill="#666">${escapeXml(label)} (${pct}%)</text>\n`;
358
+ });
359
+ }
360
+ svg += '</svg>';
361
+ return { contentType: 'image/svg+xml', body: svg };
362
+ }
363
+ /**
364
+ * Renders a pie chart as SVG or returns its raw data.
365
+ *
366
+ * @param data - Chart data with labels and a single dataset (each with a name and values array)
367
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
368
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
369
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
370
+ */
371
+ export function pie(data, options) {
372
+ return renderPieDonut('pie', data, options, false);
373
+ }
374
+ /**
375
+ * Renders a donut chart as SVG or returns its raw data.
376
+ *
377
+ * @param data - Chart data with labels and a single dataset (each with a name and values array)
378
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
379
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
380
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
381
+ */
382
+ export function donut(data, options) {
383
+ return renderPieDonut('donut', data, options, true);
384
+ }
385
+ //# sourceMappingURL=chart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.js","sourceRoot":"","sources":["../../../src/modules/v5/chart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ChatMessage, ChatStorage } from '../../types/storage.js';
2
+ interface ChatParams {
3
+ username: string;
4
+ message?: string;
5
+ timestamp?: string;
6
+ session?: string;
7
+ token?: string;
8
+ storage: ChatStorage;
9
+ }
10
+ /**
11
+ * Handles real-time chat actions including sending, fetching, and clearing messages.
12
+ *
13
+ * @param action - The action to perform: "message", "private", "fetch", or "clear"
14
+ * @param params - Chat parameters including username, message, session, and shared storage
15
+ * @returns The result of the action — a message list, a sent confirmation, or a status message
16
+ * @throws Error if a required parameter is missing or the action is invalid
17
+ */
18
+ export default function chat(action: string, params: ChatParams): ChatMessage[] | ChatMessage | {
19
+ message: string;
20
+ };
21
+ export {};
@@ -0,0 +1,107 @@
1
+ import { SESSION_TTL } from '../../constants.js';
2
+ import { checkRateLimit } from '../../utils/helpers.js';
3
+ /**
4
+ * Handles real-time chat actions including sending, fetching, and clearing messages.
5
+ *
6
+ * @param action - The action to perform: "message", "private", "fetch", or "clear"
7
+ * @param params - Chat parameters including username, message, session, and shared storage
8
+ * @returns The result of the action — a message list, a sent confirmation, or a status message
9
+ * @throws Error if a required parameter is missing or the action is invalid
10
+ */
11
+ export default function chat(action, params) {
12
+ const storage = params.storage;
13
+ storage.messages ??= [];
14
+ storage.privateChats ??= {};
15
+ storage.sessions ??= {};
16
+ storage.rateLimits ??= {};
17
+ const { messages, privateChats, sessions, rateLimits } = storage;
18
+ if (!params.username)
19
+ throw new Error('Please provide a username');
20
+ const u = params.username.toLowerCase();
21
+ const now = Date.now();
22
+ checkRateLimit(rateLimits, u, now);
23
+ if (action === 'message') {
24
+ return sendMessage(params, messages, privateChats, sessions, u, now);
25
+ }
26
+ else if (action === 'private') {
27
+ return getPrivateChat(params, privateChats);
28
+ }
29
+ else if (action === 'fetch') {
30
+ return fetchMessages(messages);
31
+ }
32
+ else if (action === 'clear') {
33
+ return clearPrivateChat(params, privateChats, sessions, u);
34
+ }
35
+ else {
36
+ throw new Error('Invalid action. Use "message", "private", "fetch", or "clear"');
37
+ }
38
+ }
39
+ function sendMessage(params, messages, privateChats, sessions, u, now) {
40
+ const { message, session, token } = params;
41
+ if (!message)
42
+ throw new Error('Please provide a message');
43
+ if (!session)
44
+ throw new Error('Please provide a valid session ID');
45
+ if (sessions[u] && sessions[u].user !== session) {
46
+ throw new Error('Session ID mismatch');
47
+ }
48
+ const msg = {
49
+ username: params.username,
50
+ message,
51
+ timestamp: params.timestamp || new Date().toISOString(),
52
+ };
53
+ if (token) {
54
+ privateChats[token] = privateChats[token] || [];
55
+ privateChats[token].push(msg);
56
+ setTimeout(() => {
57
+ const thread = privateChats[token];
58
+ if (!thread)
59
+ return;
60
+ const idx = thread.indexOf(msg);
61
+ if (idx !== -1)
62
+ thread.splice(idx, 1);
63
+ if (thread.length === 0)
64
+ delete privateChats[token];
65
+ }, SESSION_TTL).unref();
66
+ }
67
+ else {
68
+ messages.push(msg);
69
+ setTimeout(() => messages.splice(messages.indexOf(msg), 1), SESSION_TTL).unref();
70
+ }
71
+ sessions[u] = sessions[u] || { user: session, last: now };
72
+ sessions[u].last = now;
73
+ setTimeout(() => {
74
+ if (sessions[u] && Date.now() - sessions[u].last >= SESSION_TTL)
75
+ delete sessions[u];
76
+ }, SESSION_TTL).unref();
77
+ return { message: 'Message sent successfully' };
78
+ }
79
+ function getPrivateChat(params, privateChats) {
80
+ const { token } = params;
81
+ if (!token)
82
+ throw new Error('Please provide a valid token');
83
+ if (privateChats[token])
84
+ return privateChats[token];
85
+ throw new Error('Invalid or expired token.');
86
+ }
87
+ function fetchMessages(messages) {
88
+ if (messages.length > 0)
89
+ return messages;
90
+ throw new Error('No messages stored.');
91
+ }
92
+ function clearPrivateChat(params, privateChats, sessions, u) {
93
+ const { token, session } = params;
94
+ if (!token)
95
+ throw new Error('Please provide a valid token');
96
+ if (!session)
97
+ throw new Error('Please provide a valid session ID');
98
+ if (sessions[u] && sessions[u].user !== session) {
99
+ throw new Error('Session ID mismatch');
100
+ }
101
+ if (!privateChats[token])
102
+ throw new Error('Invalid or expired token.');
103
+ delete privateChats[token];
104
+ delete sessions[u];
105
+ return { message: 'Private chat cleared successfully' };
106
+ }
107
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/modules/v5/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface CsvParseResult {
2
+ action: 'parse';
3
+ rows: Record<string, string>[];
4
+ count: number;
5
+ }
6
+ export interface CsvFormatResult {
7
+ action: 'format';
8
+ csv: string;
9
+ count: number;
10
+ }
11
+ export type CsvResult = CsvParseResult | CsvFormatResult;
12
+ /**
13
+ * Converts between CSV and JSON.
14
+ * - `parse`: CSV string → array of objects
15
+ * - `format`: array of objects → CSV string
16
+ *
17
+ * @param action - "parse" or "format"
18
+ * @param data - Input payload: `csv` string for parse, `json` array of objects for format
19
+ * @param options - `delimiter` (single character, default ",") and `headers` (parse only: use the first row as keys, default true)
20
+ * @returns Parse result with the rows and their count, or format result with the CSV string and the row count
21
+ * @throws Error if the action is invalid, the delimiter is not a single character, the input data is missing, or a size limit is exceeded
22
+ */
23
+ export default function csv(action: string, data: {
24
+ csv?: string;
25
+ json?: Record<string, unknown>[];
26
+ }, options?: {
27
+ delimiter?: string;
28
+ headers?: boolean;
29
+ }): CsvResult;