@20syldev/api 4.8.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/README.md +93 -55
  2. package/dist/config/versions.js +16 -0
  3. package/dist/config/versions.js.map +1 -1
  4. package/dist/constants.js +5 -0
  5. package/dist/constants.js.map +1 -1
  6. package/dist/modules/v5/chart.js +379 -0
  7. package/dist/modules/v5/chart.js.map +1 -0
  8. package/dist/modules/v5/evaluate.js +281 -0
  9. package/dist/modules/v5/evaluate.js.map +1 -0
  10. package/dist/modules/v5/matrix.js +238 -0
  11. package/dist/modules/v5/matrix.js.map +1 -0
  12. package/dist/modules/v5.js +5 -0
  13. package/dist/modules/v5.js.map +1 -0
  14. package/dist/routes/get.js +191 -162
  15. package/dist/routes/get.js.map +1 -1
  16. package/dist/routes/post.js +69 -0
  17. package/dist/routes/post.js.map +1 -1
  18. package/package.json +4 -2
  19. package/recap.md +98 -0
  20. package/.github/FUNDING.yml +0 -1
  21. package/.prettierrc +0 -7
  22. package/eslint.config.js +0 -24
  23. package/robots.txt +0 -74
  24. package/src/app.ts +0 -53
  25. package/src/config/env.ts +0 -87
  26. package/src/config/plans.ts +0 -61
  27. package/src/config/versions.ts +0 -121
  28. package/src/constants.ts +0 -61
  29. package/src/favicon.ico +0 -0
  30. package/src/middleware/cors.ts +0 -23
  31. package/src/middleware/error.ts +0 -16
  32. package/src/middleware/json.ts +0 -9
  33. package/src/middleware/logger.ts +0 -32
  34. package/src/middleware/ratelimit.ts +0 -89
  35. package/src/middleware/version.ts +0 -40
  36. package/src/modules/v3/algorithms.js +0 -218
  37. package/src/modules/v3/captcha.js +0 -60
  38. package/src/modules/v3/chat.js +0 -111
  39. package/src/modules/v3/color.js +0 -60
  40. package/src/modules/v3/convert.js +0 -39
  41. package/src/modules/v3/domain.js +0 -86
  42. package/src/modules/v3/hash.js +0 -16
  43. package/src/modules/v3/hyperplanning.js +0 -56
  44. package/src/modules/v3/levenshtein.js +0 -46
  45. package/src/modules/v3/personal.js +0 -139
  46. package/src/modules/v3/qrcode.js +0 -20
  47. package/src/modules/v3/tic_tac_toe.js +0 -242
  48. package/src/modules/v3/time.js +0 -98
  49. package/src/modules/v3/token.js +0 -54
  50. package/src/modules/v3/username.js +0 -94
  51. package/src/modules/v3/utils.js +0 -77
  52. package/src/modules/v3.js +0 -15
  53. package/src/modules/v4/address.ts +0 -412
  54. package/src/modules/v4/agent.ts +0 -104
  55. package/src/modules/v4/algorithms.ts +0 -276
  56. package/src/modules/v4/captcha.ts +0 -114
  57. package/src/modules/v4/chat.ts +0 -130
  58. package/src/modules/v4/color.ts +0 -75
  59. package/src/modules/v4/convert.ts +0 -127
  60. package/src/modules/v4/cron.ts +0 -221
  61. package/src/modules/v4/dice.ts +0 -46
  62. package/src/modules/v4/domain.ts +0 -86
  63. package/src/modules/v4/encode.ts +0 -241
  64. package/src/modules/v4/geo.ts +0 -64
  65. package/src/modules/v4/hash.ts +0 -32
  66. package/src/modules/v4/hyperplanning.ts +0 -93
  67. package/src/modules/v4/ip.ts +0 -134
  68. package/src/modules/v4/levenshtein.ts +0 -46
  69. package/src/modules/v4/palette.ts +0 -71
  70. package/src/modules/v4/password.ts +0 -379
  71. package/src/modules/v4/personal.ts +0 -140
  72. package/src/modules/v4/placeholder.ts +0 -197
  73. package/src/modules/v4/qrcode.ts +0 -121
  74. package/src/modules/v4/regex.ts +0 -67
  75. package/src/modules/v4/statistics.ts +0 -62
  76. package/src/modules/v4/text.ts +0 -330
  77. package/src/modules/v4/tic_tac_toe.ts +0 -264
  78. package/src/modules/v4/time.ts +0 -149
  79. package/src/modules/v4/token.ts +0 -53
  80. package/src/modules/v4/username.ts +0 -94
  81. package/src/modules/v4/validate.ts +0 -76
  82. package/src/modules/v4.ts +0 -29
  83. package/src/routes/delete.ts +0 -72
  84. package/src/routes/get.ts +0 -856
  85. package/src/routes/index.ts +0 -59
  86. package/src/routes/patch.ts +0 -45
  87. package/src/routes/post.ts +0 -209
  88. package/src/storage/index.ts +0 -16
  89. package/src/types/express.d.ts +0 -17
  90. package/src/types/storage.ts +0 -48
  91. package/src/utils/colors.ts +0 -91
  92. package/src/utils/helpers.ts +0 -90
  93. package/src/utils/response.ts +0 -28
  94. package/tests/integration/api.test.ts +0 -772
  95. package/tests/tsconfig.json +0 -3
  96. package/tests/unit/address.test.ts +0 -84
  97. package/tests/unit/agent.test.ts +0 -113
  98. package/tests/unit/algorithms.test.ts +0 -121
  99. package/tests/unit/captcha.test.ts +0 -62
  100. package/tests/unit/chat.test.ts +0 -54
  101. package/tests/unit/color.test.ts +0 -54
  102. package/tests/unit/convert.test.ts +0 -68
  103. package/tests/unit/cron.test.ts +0 -110
  104. package/tests/unit/dice.test.ts +0 -58
  105. package/tests/unit/domain.test.ts +0 -48
  106. package/tests/unit/encode.test.ts +0 -109
  107. package/tests/unit/geo.test.ts +0 -46
  108. package/tests/unit/hash.test.ts +0 -45
  109. package/tests/unit/hyperplanning.test.ts +0 -97
  110. package/tests/unit/ip.test.ts +0 -140
  111. package/tests/unit/levenshtein.test.ts +0 -35
  112. package/tests/unit/palette.test.ts +0 -54
  113. package/tests/unit/password.test.ts +0 -86
  114. package/tests/unit/personal.test.ts +0 -66
  115. package/tests/unit/placeholder.test.ts +0 -58
  116. package/tests/unit/qrcode.test.ts +0 -83
  117. package/tests/unit/regex.test.ts +0 -95
  118. package/tests/unit/statistics.test.ts +0 -58
  119. package/tests/unit/text.test.ts +0 -108
  120. package/tests/unit/tic_tac_toe.test.ts +0 -56
  121. package/tests/unit/time.test.ts +0 -115
  122. package/tests/unit/token.test.ts +0 -62
  123. package/tests/unit/username.test.ts +0 -35
  124. package/tests/unit/validate.test.ts +0 -72
  125. package/tsconfig.json +0 -17
  126. package/tsconfig.test.json +0 -9
@@ -0,0 +1,379 @@
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(`'${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("'data' is required");
51
+ const d = data;
52
+ if (!Array.isArray(d['labels']) || d['labels'].length === 0)
53
+ throw new Error("'data.labels' must be a non-empty array");
54
+ if (!Array.isArray(d['datasets']) || d['datasets'].length === 0)
55
+ throw new Error("'data.datasets' must be a non-empty array");
56
+ if (d['labels'].length > MAX_CHART_LABELS)
57
+ throw new Error(`Cannot exceed ${MAX_CHART_LABELS} labels`);
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' length must match 'labels' length");
64
+ }
65
+ for (const v of dataset['values']) {
66
+ if (typeof v !== 'number' || !isFinite(v))
67
+ throw new Error('Dataset values must be finite numbers');
68
+ }
69
+ }
70
+ return {
71
+ labels: d['labels'].map(String),
72
+ datasets: d['datasets'].map((ds) => ({
73
+ label: String(ds['label'] ?? ''),
74
+ values: ds['values'],
75
+ })),
76
+ };
77
+ }
78
+ function validatePieDonut(data) {
79
+ if (!data || typeof data !== 'object')
80
+ throw new Error("'data' is required");
81
+ const d = data;
82
+ if (!Array.isArray(d['labels']) || d['labels'].length === 0)
83
+ throw new Error("'data.labels' must be a non-empty array");
84
+ if (!Array.isArray(d['values']) || d['values'].length === 0)
85
+ throw new Error("'data.values' must be a non-empty array");
86
+ if (d['labels'].length !== d['values'].length)
87
+ throw new Error("'data.labels' and 'data.values' must have the same length");
88
+ if (d['labels'].length > MAX_CHART_LABELS)
89
+ throw new Error(`Cannot exceed ${MAX_CHART_LABELS} labels`);
90
+ for (const v of d['values']) {
91
+ if (typeof v !== 'number' || !isFinite(v) || v < 0)
92
+ throw new Error('Pie/donut values must be non-negative finite numbers');
93
+ }
94
+ const total = d['values'].reduce((s, v) => s + v, 0);
95
+ if (total <= 0)
96
+ throw new Error('At least one pie/donut value must be positive');
97
+ return {
98
+ labels: d['labels'].map(String),
99
+ values: d['values'],
100
+ };
101
+ }
102
+ function yScale(values) {
103
+ const dataMax = Math.max(...values, 0);
104
+ const dataMin = Math.min(...values, 0);
105
+ const range = dataMax - dataMin || 1;
106
+ const rawStep = range / 5;
107
+ const magnitude = Math.pow(10, Math.floor(Math.log10(rawStep)));
108
+ const step = Math.ceil(rawStep / magnitude) * magnitude;
109
+ const min = Math.floor(dataMin / step) * step;
110
+ const max = Math.ceil(dataMax / step) * step;
111
+ const gridCount = Math.round((max - min) / step);
112
+ return { min, max, gridCount };
113
+ }
114
+ function toY(value, min, max, chartH) {
115
+ return chartH - ((value - min) / (max - min)) * chartH;
116
+ }
117
+ function parseOptions(options) {
118
+ const displayW = parseDisplaySize(options.width, 'width');
119
+ const displayH = parseDisplaySize(options.height, 'height');
120
+ return {
121
+ renderW: displayW ?? DEFAULT_W,
122
+ renderH: displayH ?? DEFAULT_H,
123
+ displayW,
124
+ displayH,
125
+ bg: normalizeColor(typeof options.bg === 'string' ? options.bg : undefined, '#ffffff'),
126
+ title: typeof options.title === 'string' && options.title ? options.title : '',
127
+ showLegend: options.legend !== false,
128
+ mode: options.mode === 'data' ? 'data' : 'svg',
129
+ };
130
+ }
131
+ // ─── Bar chart ───
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
+ // ─── Line chart ───
205
+ /**
206
+ * Renders a line chart as SVG or returns its raw data.
207
+ *
208
+ * @param data - Chart data with labels and one or more datasets (each with a name and values array)
209
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
210
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
211
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
212
+ */
213
+ export function line(data, options) {
214
+ const d = validateBarLine(data);
215
+ const { renderW, renderH, displayW, displayH, bg, title, showLegend, mode } = parseOptions(options);
216
+ const colors = getColors(options.colors, d.datasets.length);
217
+ const allValues = d.datasets.flatMap((ds) => ds.values);
218
+ const { min, max, gridCount } = yScale(allValues);
219
+ if (mode === 'data') {
220
+ return {
221
+ contentType: 'application/json',
222
+ body: {
223
+ type: 'line',
224
+ labels: d.labels,
225
+ datasets: d.datasets,
226
+ scale: { min, max, gridCount },
227
+ },
228
+ };
229
+ }
230
+ const marginTop = MARGIN.top + (title ? TITLE_HEIGHT : 0);
231
+ const legendH = showLegend && d.datasets.some((ds) => ds.label) ? LEGEND_ROW_H + 10 : 0;
232
+ const chartW = renderW - MARGIN.left - MARGIN.right;
233
+ const chartH = renderH - marginTop - MARGIN.bottom - legendH;
234
+ const xStep = chartW / Math.max(d.labels.length - 1, 1);
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 = MARGIN.left + i * (d.labels.length > 1 ? xStep : chartW / 2);
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 = MARGIN.left + i * (d.labels.length > 1 ? xStep : chartW / 2);
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 = MARGIN.left + i * (d.labels.length > 1 ? xStep : chartW / 2);
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
+ // ─── Pie / Donut ───
283
+ function pieArc(cx, cy, r, startAngle, endAngle, innerR = 0) {
284
+ const start = { x: cx + r * Math.cos(startAngle), y: cy + r * Math.sin(startAngle) };
285
+ const end = { x: cx + r * Math.cos(endAngle), y: cy + r * Math.sin(endAngle) };
286
+ const largeArc = endAngle - startAngle > Math.PI ? 1 : 0;
287
+ if (innerR === 0) {
288
+ return [
289
+ `M ${cx.toFixed(2)} ${cy.toFixed(2)}`,
290
+ `L ${start.x.toFixed(2)} ${start.y.toFixed(2)}`,
291
+ `A ${r} ${r} 0 ${largeArc} 1 ${end.x.toFixed(2)} ${end.y.toFixed(2)}`,
292
+ 'Z',
293
+ ].join(' ');
294
+ }
295
+ const innerStart = { x: cx + innerR * Math.cos(endAngle), y: cy + innerR * Math.sin(endAngle) };
296
+ const innerEnd = { x: cx + innerR * Math.cos(startAngle), y: cy + innerR * Math.sin(startAngle) };
297
+ return [
298
+ `M ${start.x.toFixed(2)} ${start.y.toFixed(2)}`,
299
+ `A ${r} ${r} 0 ${largeArc} 1 ${end.x.toFixed(2)} ${end.y.toFixed(2)}`,
300
+ `L ${innerStart.x.toFixed(2)} ${innerStart.y.toFixed(2)}`,
301
+ `A ${innerR} ${innerR} 0 ${largeArc} 0 ${innerEnd.x.toFixed(2)} ${innerEnd.y.toFixed(2)}`,
302
+ 'Z',
303
+ ].join(' ');
304
+ }
305
+ function renderPieDonut(type, data, options, isDonut) {
306
+ const d = validatePieDonut(data);
307
+ const { renderW, renderH, displayW, displayH, bg, title, showLegend, mode } = parseOptions(options);
308
+ const colors = getColors(options.colors, d.labels.length);
309
+ const total = d.values.reduce((s, v) => s + v, 0);
310
+ if (mode === 'data') {
311
+ return {
312
+ contentType: 'application/json',
313
+ body: {
314
+ type,
315
+ total,
316
+ slices: d.labels.map((label, i) => ({
317
+ label,
318
+ value: d.values[i],
319
+ percentage: Number(((d.values[i] / total) * 100).toFixed(2)),
320
+ })),
321
+ },
322
+ };
323
+ }
324
+ const titleOffset = title ? TITLE_HEIGHT : 0;
325
+ const legendH = showLegend ? d.labels.length * LEGEND_ROW_H + 10 : 0;
326
+ const chartAreaH = renderH - titleOffset - MARGIN.top - legendH - (showLegend ? 10 : 0);
327
+ const cx = renderW / 2;
328
+ const cy = titleOffset + MARGIN.top + chartAreaH / 2;
329
+ const r = Math.max(10, Math.min(cx - MARGIN.left, chartAreaH / 2 - 10));
330
+ const innerR = isDonut ? r * 0.55 : 0;
331
+ let svg = svgOpen(bg, renderW, renderH, displayW, displayH);
332
+ if (title)
333
+ 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`;
334
+ let startAngle = -Math.PI / 2;
335
+ d.values.forEach((val, i) => {
336
+ if (val === 0)
337
+ return;
338
+ const sweep = (val / total) * 2 * Math.PI;
339
+ const endAngle = startAngle + sweep;
340
+ const path = pieArc(cx, cy, r, startAngle, endAngle, innerR);
341
+ svg += ` <path d="${path}" fill="${colors[i]}" stroke="${bg}" stroke-width="1.5"/>\n`;
342
+ startAngle = endAngle;
343
+ });
344
+ // Legend
345
+ if (showLegend) {
346
+ const legendStartY = titleOffset + MARGIN.top + chartAreaH + 10;
347
+ d.labels.forEach((label, i) => {
348
+ const pct = ((d.values[i] / total) * 100).toFixed(1);
349
+ const y = legendStartY + i * LEGEND_ROW_H;
350
+ svg += ` <rect x="${MARGIN.left}" y="${y - 10}" width="12" height="12" fill="${colors[i]}"/>\n`;
351
+ svg += ` <text x="${MARGIN.left + 18}" y="${y}" font-family="sans-serif" font-size="11" fill="#666">${escapeXml(label)} (${pct}%)</text>\n`;
352
+ });
353
+ }
354
+ svg += '</svg>';
355
+ return { contentType: 'image/svg+xml', body: svg };
356
+ }
357
+ /**
358
+ * Renders a pie chart as SVG or returns its raw data.
359
+ *
360
+ * @param data - Chart data with labels and a single dataset (each with a name and values array)
361
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
362
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
363
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
364
+ */
365
+ export function pie(data, options) {
366
+ return renderPieDonut('pie', data, options, false);
367
+ }
368
+ /**
369
+ * Renders a donut chart as SVG or returns its raw data.
370
+ *
371
+ * @param data - Chart data with labels and a single dataset (each with a name and values array)
372
+ * @param options - Chart options: title, width, height, colors, bg, legend (default true), mode ("svg" or "data")
373
+ * @returns ChartOutput with contentType image/svg+xml (SVG string) or application/json (raw data) depending on mode
374
+ * @throws Error if data is missing, malformed, or exceeds the maximum number of labels or datasets
375
+ */
376
+ export function donut(data, options) {
377
+ return renderPieDonut('donut', data, options, true);
378
+ }
379
+ //# 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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"}