apexify.js 5.1.1 → 5.2.1

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 (236) hide show
  1. package/CHANGELOG.md +240 -0
  2. package/README.md +244 -1101
  3. package/dist/cjs/Canvas/ApexPainter.d.ts +183 -204
  4. package/dist/cjs/Canvas/ApexPainter.d.ts.map +1 -1
  5. package/dist/cjs/Canvas/ApexPainter.js +524 -1282
  6. package/dist/cjs/Canvas/ApexPainter.js.map +1 -1
  7. package/dist/cjs/Canvas/extended/CanvasCreator.d.ts +33 -0
  8. package/dist/cjs/Canvas/extended/CanvasCreator.d.ts.map +1 -0
  9. package/dist/cjs/Canvas/extended/CanvasCreator.js +223 -0
  10. package/dist/cjs/Canvas/extended/CanvasCreator.js.map +1 -0
  11. package/dist/cjs/Canvas/extended/ChartCreator.d.ts +26 -0
  12. package/dist/cjs/Canvas/extended/ChartCreator.d.ts.map +1 -0
  13. package/dist/cjs/Canvas/extended/ChartCreator.js +50 -0
  14. package/dist/cjs/Canvas/extended/ChartCreator.js.map +1 -0
  15. package/dist/cjs/Canvas/extended/GIFCreator.d.ts +43 -0
  16. package/dist/cjs/Canvas/extended/GIFCreator.d.ts.map +1 -0
  17. package/dist/cjs/Canvas/extended/GIFCreator.js +157 -0
  18. package/dist/cjs/Canvas/extended/GIFCreator.js.map +1 -0
  19. package/dist/cjs/Canvas/extended/ImageCreator.d.ts +83 -0
  20. package/dist/cjs/Canvas/extended/ImageCreator.d.ts.map +1 -0
  21. package/dist/cjs/Canvas/extended/ImageCreator.js +479 -0
  22. package/dist/cjs/Canvas/extended/ImageCreator.js.map +1 -0
  23. package/dist/cjs/Canvas/extended/TextCreator.d.ts +35 -0
  24. package/dist/cjs/Canvas/extended/TextCreator.d.ts.map +1 -0
  25. package/dist/cjs/Canvas/extended/TextCreator.js +98 -0
  26. package/dist/cjs/Canvas/extended/TextCreator.js.map +1 -0
  27. package/dist/cjs/Canvas/extended/VideoCreator.d.ts +370 -0
  28. package/dist/cjs/Canvas/extended/VideoCreator.d.ts.map +1 -0
  29. package/dist/cjs/Canvas/extended/VideoCreator.js +478 -0
  30. package/dist/cjs/Canvas/extended/VideoCreator.js.map +1 -0
  31. package/dist/cjs/Canvas/utils/Background/bg.d.ts +1 -1
  32. package/dist/cjs/Canvas/utils/Background/bg.d.ts.map +1 -1
  33. package/dist/cjs/Canvas/utils/Background/bg.js +43 -7
  34. package/dist/cjs/Canvas/utils/Background/bg.js.map +1 -1
  35. package/dist/cjs/Canvas/utils/Charts/barchart.d.ts +230 -0
  36. package/dist/cjs/Canvas/utils/Charts/barchart.d.ts.map +1 -0
  37. package/dist/cjs/Canvas/utils/Charts/barchart.js +1891 -0
  38. package/dist/cjs/Canvas/utils/Charts/barchart.js.map +1 -0
  39. package/dist/cjs/Canvas/utils/Charts/comparisonchart.d.ts +103 -0
  40. package/dist/cjs/Canvas/utils/Charts/comparisonchart.d.ts.map +1 -0
  41. package/dist/cjs/Canvas/utils/Charts/comparisonchart.js +368 -0
  42. package/dist/cjs/Canvas/utils/Charts/comparisonchart.js.map +1 -0
  43. package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.d.ts +181 -0
  44. package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.d.ts.map +1 -0
  45. package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.js +1389 -0
  46. package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.js.map +1 -0
  47. package/dist/cjs/Canvas/utils/Charts/index.d.ts +45 -0
  48. package/dist/cjs/Canvas/utils/Charts/index.d.ts.map +1 -0
  49. package/dist/cjs/Canvas/utils/Charts/index.js +17 -0
  50. package/dist/cjs/Canvas/utils/Charts/index.js.map +1 -0
  51. package/dist/cjs/Canvas/utils/Charts/linechart.d.ts +216 -0
  52. package/dist/cjs/Canvas/utils/Charts/linechart.d.ts.map +1 -0
  53. package/dist/cjs/Canvas/utils/Charts/linechart.js +1761 -0
  54. package/dist/cjs/Canvas/utils/Charts/linechart.js.map +1 -0
  55. package/dist/cjs/Canvas/utils/Charts/piechart.d.ts +167 -0
  56. package/dist/cjs/Canvas/utils/Charts/piechart.d.ts.map +1 -0
  57. package/dist/cjs/Canvas/utils/Charts/piechart.js +794 -0
  58. package/dist/cjs/Canvas/utils/Charts/piechart.js.map +1 -0
  59. package/dist/cjs/Canvas/utils/General/batchOperations.d.ts.map +1 -1
  60. package/dist/cjs/Canvas/utils/General/batchOperations.js +3 -4
  61. package/dist/cjs/Canvas/utils/General/batchOperations.js.map +1 -1
  62. package/dist/cjs/Canvas/utils/General/general functions.d.ts.map +1 -1
  63. package/dist/cjs/Canvas/utils/General/general functions.js +62 -33
  64. package/dist/cjs/Canvas/utils/General/general functions.js.map +1 -1
  65. package/dist/cjs/Canvas/utils/General/imageStitching.d.ts.map +1 -1
  66. package/dist/cjs/Canvas/utils/General/imageStitching.js +3 -6
  67. package/dist/cjs/Canvas/utils/General/imageStitching.js.map +1 -1
  68. package/dist/cjs/Canvas/utils/Image/imageMasking.d.ts.map +1 -1
  69. package/dist/cjs/Canvas/utils/Image/imageMasking.js +5 -12
  70. package/dist/cjs/Canvas/utils/Image/imageMasking.js.map +1 -1
  71. package/dist/cjs/Canvas/utils/Image/imageProperties.d.ts +4 -4
  72. package/dist/cjs/Canvas/utils/Image/imageProperties.d.ts.map +1 -1
  73. package/dist/cjs/Canvas/utils/Image/imageProperties.js +44 -9
  74. package/dist/cjs/Canvas/utils/Image/imageProperties.js.map +1 -1
  75. package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.d.ts +5 -0
  76. package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.d.ts.map +1 -1
  77. package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.js +48 -5
  78. package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.js.map +1 -1
  79. package/dist/cjs/Canvas/utils/Texts/textProperties.d.ts +1 -1
  80. package/dist/cjs/Canvas/utils/Texts/textProperties.d.ts.map +1 -1
  81. package/dist/cjs/Canvas/utils/Texts/textProperties.js +48 -5
  82. package/dist/cjs/Canvas/utils/Texts/textProperties.js.map +1 -1
  83. package/dist/cjs/Canvas/utils/Video/videoHelpers.d.ts +489 -0
  84. package/dist/cjs/Canvas/utils/Video/videoHelpers.d.ts.map +1 -0
  85. package/dist/cjs/Canvas/utils/Video/videoHelpers.js +1835 -0
  86. package/dist/cjs/Canvas/utils/Video/videoHelpers.js.map +1 -0
  87. package/dist/cjs/Canvas/utils/errorUtils.d.ts +15 -0
  88. package/dist/cjs/Canvas/utils/errorUtils.d.ts.map +1 -0
  89. package/dist/cjs/Canvas/utils/errorUtils.js +26 -0
  90. package/dist/cjs/Canvas/utils/errorUtils.js.map +1 -0
  91. package/dist/cjs/Canvas/utils/types.d.ts +17 -178
  92. package/dist/cjs/Canvas/utils/types.d.ts.map +1 -1
  93. package/dist/cjs/Canvas/utils/types.js.map +1 -1
  94. package/dist/cjs/Canvas/utils/utils.d.ts +4 -3
  95. package/dist/cjs/Canvas/utils/utils.d.ts.map +1 -1
  96. package/dist/cjs/Canvas/utils/utils.js +40 -6
  97. package/dist/cjs/Canvas/utils/utils.js.map +1 -1
  98. package/dist/cjs/index.d.ts +1 -8
  99. package/dist/cjs/index.d.ts.map +1 -1
  100. package/dist/cjs/index.js +14 -45
  101. package/dist/cjs/index.js.map +1 -1
  102. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  103. package/dist/esm/Canvas/ApexPainter.d.ts +183 -204
  104. package/dist/esm/Canvas/ApexPainter.d.ts.map +1 -1
  105. package/dist/esm/Canvas/ApexPainter.js +524 -1282
  106. package/dist/esm/Canvas/ApexPainter.js.map +1 -1
  107. package/dist/esm/Canvas/extended/CanvasCreator.d.ts +33 -0
  108. package/dist/esm/Canvas/extended/CanvasCreator.d.ts.map +1 -0
  109. package/dist/esm/Canvas/extended/CanvasCreator.js +223 -0
  110. package/dist/esm/Canvas/extended/CanvasCreator.js.map +1 -0
  111. package/dist/esm/Canvas/extended/ChartCreator.d.ts +26 -0
  112. package/dist/esm/Canvas/extended/ChartCreator.d.ts.map +1 -0
  113. package/dist/esm/Canvas/extended/ChartCreator.js +50 -0
  114. package/dist/esm/Canvas/extended/ChartCreator.js.map +1 -0
  115. package/dist/esm/Canvas/extended/GIFCreator.d.ts +43 -0
  116. package/dist/esm/Canvas/extended/GIFCreator.d.ts.map +1 -0
  117. package/dist/esm/Canvas/extended/GIFCreator.js +157 -0
  118. package/dist/esm/Canvas/extended/GIFCreator.js.map +1 -0
  119. package/dist/esm/Canvas/extended/ImageCreator.d.ts +83 -0
  120. package/dist/esm/Canvas/extended/ImageCreator.d.ts.map +1 -0
  121. package/dist/esm/Canvas/extended/ImageCreator.js +479 -0
  122. package/dist/esm/Canvas/extended/ImageCreator.js.map +1 -0
  123. package/dist/esm/Canvas/extended/TextCreator.d.ts +35 -0
  124. package/dist/esm/Canvas/extended/TextCreator.d.ts.map +1 -0
  125. package/dist/esm/Canvas/extended/TextCreator.js +98 -0
  126. package/dist/esm/Canvas/extended/TextCreator.js.map +1 -0
  127. package/dist/esm/Canvas/extended/VideoCreator.d.ts +370 -0
  128. package/dist/esm/Canvas/extended/VideoCreator.d.ts.map +1 -0
  129. package/dist/esm/Canvas/extended/VideoCreator.js +478 -0
  130. package/dist/esm/Canvas/extended/VideoCreator.js.map +1 -0
  131. package/dist/esm/Canvas/utils/Background/bg.d.ts +1 -1
  132. package/dist/esm/Canvas/utils/Background/bg.d.ts.map +1 -1
  133. package/dist/esm/Canvas/utils/Background/bg.js +43 -7
  134. package/dist/esm/Canvas/utils/Background/bg.js.map +1 -1
  135. package/dist/esm/Canvas/utils/Charts/barchart.d.ts +230 -0
  136. package/dist/esm/Canvas/utils/Charts/barchart.d.ts.map +1 -0
  137. package/dist/esm/Canvas/utils/Charts/barchart.js +1891 -0
  138. package/dist/esm/Canvas/utils/Charts/barchart.js.map +1 -0
  139. package/dist/esm/Canvas/utils/Charts/comparisonchart.d.ts +103 -0
  140. package/dist/esm/Canvas/utils/Charts/comparisonchart.d.ts.map +1 -0
  141. package/dist/esm/Canvas/utils/Charts/comparisonchart.js +368 -0
  142. package/dist/esm/Canvas/utils/Charts/comparisonchart.js.map +1 -0
  143. package/dist/esm/Canvas/utils/Charts/horizontalbarchart.d.ts +181 -0
  144. package/dist/esm/Canvas/utils/Charts/horizontalbarchart.d.ts.map +1 -0
  145. package/dist/esm/Canvas/utils/Charts/horizontalbarchart.js +1389 -0
  146. package/dist/esm/Canvas/utils/Charts/horizontalbarchart.js.map +1 -0
  147. package/dist/esm/Canvas/utils/Charts/index.d.ts +45 -0
  148. package/dist/esm/Canvas/utils/Charts/index.d.ts.map +1 -0
  149. package/dist/esm/Canvas/utils/Charts/index.js +17 -0
  150. package/dist/esm/Canvas/utils/Charts/index.js.map +1 -0
  151. package/dist/esm/Canvas/utils/Charts/linechart.d.ts +216 -0
  152. package/dist/esm/Canvas/utils/Charts/linechart.d.ts.map +1 -0
  153. package/dist/esm/Canvas/utils/Charts/linechart.js +1761 -0
  154. package/dist/esm/Canvas/utils/Charts/linechart.js.map +1 -0
  155. package/dist/esm/Canvas/utils/Charts/piechart.d.ts +167 -0
  156. package/dist/esm/Canvas/utils/Charts/piechart.d.ts.map +1 -0
  157. package/dist/esm/Canvas/utils/Charts/piechart.js +794 -0
  158. package/dist/esm/Canvas/utils/Charts/piechart.js.map +1 -0
  159. package/dist/esm/Canvas/utils/General/batchOperations.d.ts.map +1 -1
  160. package/dist/esm/Canvas/utils/General/batchOperations.js +3 -4
  161. package/dist/esm/Canvas/utils/General/batchOperations.js.map +1 -1
  162. package/dist/esm/Canvas/utils/General/general functions.d.ts.map +1 -1
  163. package/dist/esm/Canvas/utils/General/general functions.js +62 -33
  164. package/dist/esm/Canvas/utils/General/general functions.js.map +1 -1
  165. package/dist/esm/Canvas/utils/General/imageStitching.d.ts.map +1 -1
  166. package/dist/esm/Canvas/utils/General/imageStitching.js +3 -6
  167. package/dist/esm/Canvas/utils/General/imageStitching.js.map +1 -1
  168. package/dist/esm/Canvas/utils/Image/imageMasking.d.ts.map +1 -1
  169. package/dist/esm/Canvas/utils/Image/imageMasking.js +5 -12
  170. package/dist/esm/Canvas/utils/Image/imageMasking.js.map +1 -1
  171. package/dist/esm/Canvas/utils/Image/imageProperties.d.ts +4 -4
  172. package/dist/esm/Canvas/utils/Image/imageProperties.d.ts.map +1 -1
  173. package/dist/esm/Canvas/utils/Image/imageProperties.js +44 -9
  174. package/dist/esm/Canvas/utils/Image/imageProperties.js.map +1 -1
  175. package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.d.ts +5 -0
  176. package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.d.ts.map +1 -1
  177. package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.js +48 -5
  178. package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.js.map +1 -1
  179. package/dist/esm/Canvas/utils/Texts/textProperties.d.ts +1 -1
  180. package/dist/esm/Canvas/utils/Texts/textProperties.d.ts.map +1 -1
  181. package/dist/esm/Canvas/utils/Texts/textProperties.js +48 -5
  182. package/dist/esm/Canvas/utils/Texts/textProperties.js.map +1 -1
  183. package/dist/esm/Canvas/utils/Video/videoHelpers.d.ts +489 -0
  184. package/dist/esm/Canvas/utils/Video/videoHelpers.d.ts.map +1 -0
  185. package/dist/esm/Canvas/utils/Video/videoHelpers.js +1835 -0
  186. package/dist/esm/Canvas/utils/Video/videoHelpers.js.map +1 -0
  187. package/dist/esm/Canvas/utils/errorUtils.d.ts +15 -0
  188. package/dist/esm/Canvas/utils/errorUtils.d.ts.map +1 -0
  189. package/dist/esm/Canvas/utils/errorUtils.js +26 -0
  190. package/dist/esm/Canvas/utils/errorUtils.js.map +1 -0
  191. package/dist/esm/Canvas/utils/types.d.ts +17 -178
  192. package/dist/esm/Canvas/utils/types.d.ts.map +1 -1
  193. package/dist/esm/Canvas/utils/types.js.map +1 -1
  194. package/dist/esm/Canvas/utils/utils.d.ts +4 -3
  195. package/dist/esm/Canvas/utils/utils.d.ts.map +1 -1
  196. package/dist/esm/Canvas/utils/utils.js +40 -6
  197. package/dist/esm/Canvas/utils/utils.js.map +1 -1
  198. package/dist/esm/index.d.ts +1 -8
  199. package/dist/esm/index.d.ts.map +1 -1
  200. package/dist/esm/index.js +14 -45
  201. package/dist/esm/index.js.map +1 -1
  202. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  203. package/package.json +235 -198
  204. package/dist/cjs/Canvas/utils/Charts/charts.d.ts +0 -13
  205. package/dist/cjs/Canvas/utils/Charts/charts.d.ts.map +0 -1
  206. package/dist/cjs/Canvas/utils/Charts/charts.js +0 -466
  207. package/dist/cjs/Canvas/utils/Charts/charts.js.map +0 -1
  208. package/dist/esm/Canvas/utils/Charts/charts.d.ts +0 -13
  209. package/dist/esm/Canvas/utils/Charts/charts.d.ts.map +0 -1
  210. package/dist/esm/Canvas/utils/Charts/charts.js +0 -466
  211. package/dist/esm/Canvas/utils/Charts/charts.js.map +0 -1
  212. package/lib/Canvas/ApexPainter.ts +0 -5414
  213. package/lib/Canvas/utils/Background/bg.ts +0 -285
  214. package/lib/Canvas/utils/Charts/charts.ts +0 -548
  215. package/lib/Canvas/utils/Custom/advancedLines.ts +0 -387
  216. package/lib/Canvas/utils/Custom/customLines.ts +0 -206
  217. package/lib/Canvas/utils/General/batchOperations.ts +0 -103
  218. package/lib/Canvas/utils/General/conversion.ts +0 -34
  219. package/lib/Canvas/utils/General/general functions.ts +0 -726
  220. package/lib/Canvas/utils/General/imageCompression.ts +0 -316
  221. package/lib/Canvas/utils/General/imageStitching.ts +0 -252
  222. package/lib/Canvas/utils/Image/imageEffects.ts +0 -175
  223. package/lib/Canvas/utils/Image/imageFilters.ts +0 -356
  224. package/lib/Canvas/utils/Image/imageMasking.ts +0 -335
  225. package/lib/Canvas/utils/Image/imageProperties.ts +0 -587
  226. package/lib/Canvas/utils/Image/professionalImageFilters.ts +0 -391
  227. package/lib/Canvas/utils/Image/simpleProfessionalFilters.ts +0 -229
  228. package/lib/Canvas/utils/Patterns/enhancedPatternRenderer.ts +0 -455
  229. package/lib/Canvas/utils/Shapes/shapes.ts +0 -528
  230. package/lib/Canvas/utils/Texts/enhancedTextRenderer.ts +0 -716
  231. package/lib/Canvas/utils/Texts/textPathRenderer.ts +0 -320
  232. package/lib/Canvas/utils/Texts/textProperties.ts +0 -231
  233. package/lib/Canvas/utils/types.ts +0 -983
  234. package/lib/Canvas/utils/utils.ts +0 -135
  235. package/lib/index.ts +0 -81
  236. package/lib/utils.ts +0 -5
@@ -1,548 +0,0 @@
1
- import { createCanvas, loadImage } from '@napi-rs/canvas';
2
- import { barChart_1, bgConfig, DataItem, KeyBoxConfig, PieDataConfig, PieChartData, LineChartConfig } from "../types";
3
- import path from 'path';
4
-
5
- // Line chart DataPoint interface (different from bar chart DataPoint)
6
- interface LineDataPoint {
7
- label: string;
8
- y: number;
9
- }
10
-
11
-
12
- ////////////////////////////////////////BAR CHARTS////////////////////////////////////////
13
-
14
- export async function verticalBarChart(data: barChart_1) {
15
- try {
16
- const { chartData, xLabels, yLabels, data: { xAxis, yAxis, keys, xTitle, yTitle, labelStyle } } = data;
17
-
18
- if (!xLabels || !yLabels || !xAxis || !yAxis) {
19
- throw new Error('Required data is missing.');
20
- }
21
-
22
- xAxis.forEach(bar => {
23
- if (bar.position.startsXLabel < Math.min(...xLabels) || bar.position.endsXLabel > Math.max(...xLabels)) {
24
- throw new Error(`X-axis value range for bar '${bar.label}' is invalid.`);
25
- }
26
- if (bar.value < Math.min(...yAxis) || bar.value > Math.max(...yAxis)) {
27
- throw new Error(`Y-axis value for bar '${bar.label}' is out of range.`);
28
- }
29
- });
30
-
31
- const canvasWidth = chartData?.width || 800;
32
- const canvasHeight = chartData?.height || 600;
33
- let img: any;
34
-
35
- if ((chartData?.widthPerc || 0.8) > 1 || (chartData?.widthPerc || 0.8) < 0) throw new Error(`widthPerc: Cannor be bigger than 1 or smaller than 0`)
36
- if ((chartData?.heightPerc || 0.8) > 1 || (chartData?.heightPerc || 0.8) < 0) throw new Error(`widthPerc: Cannor be bigger than 1 or smaller than 0`)
37
- const chartWidth = canvasWidth * (chartData?.widthPerc || 0.8);
38
- const chartHeight = canvasHeight * (chartData?.heightPerc || 0.8);
39
-
40
- if (chartData?.bg?.image) {
41
- try {
42
- let img;
43
- if (chartData.bg.image.startsWith('http')) {
44
- const response = await fetch(chartData.bg.image);
45
- if (!response.ok) {
46
- throw new Error("Failed to fetch image.");
47
- }
48
- const buffer = await response.arrayBuffer();
49
- img = await loadImage(Buffer.from(buffer));
50
- } else {
51
- const imagePath = path.join(process.cwd(), chartData.bg.image);
52
- img = await loadImage(imagePath);
53
- }
54
- } catch (error) {
55
- console.error('Error loading image:', error);
56
- }
57
- }
58
-
59
- const canvas = createCanvas(canvasWidth, canvasHeight);
60
- const ctx = canvas.getContext('2d') as SKRSContext2D;
61
- if (!ctx) throw new Error("Unable to get 2D context");
62
-
63
- if (chartData?.bg?.image) {
64
- ctx.drawImage(img, 0, 0, 800, 600);
65
- } else {
66
- ctx.fillStyle = chartData?.bg?.bgColor || 'white';
67
- ctx.fillRect(0, 0, canvasWidth, canvasHeight);
68
- }
69
-
70
-
71
- ctx.fillStyle = `${chartData?.title?.color || 'black'}`;
72
- ctx.font = `bold ${chartData?.title?.size || 12}px Arial`;
73
- ctx.fillText(chartData?.title?.title || 'Sample Chart', (canvasWidth - ctx.measureText(chartData?.title?.title || 'Sample Chart').width) / 2, 30);
74
-
75
- if (keys && Object.keys(keys).length > 0) {
76
- const keysTopMargin = 70;
77
- const keysLeftMargin = chartWidth + 60;
78
- const keyWidth = 20;
79
- const keyHeight = 20;
80
- const keySpacing = 10;
81
-
82
- let keyIndex = 0;
83
- for (const color in keys) {
84
- const keyX = keysLeftMargin;
85
- const keyY = keysTopMargin + keyIndex * (keyHeight + keySpacing);
86
- const keyColor = color || 'blue';
87
- const keyLabel = keys[color].length > 15 ? keys[color].substring(0, 15) + '...' : keys[color];
88
-
89
- ctx.fillStyle = keyColor;
90
- ctx.fillRect(keyX, keyY, keyWidth, keyHeight);
91
-
92
- ctx.fillStyle = `${keyColor || 'black'}`;
93
- ctx.font = '12px Arial';
94
- ctx.fillText(keyLabel, keyX + keyWidth + 5, keyY + keyHeight - 3);
95
-
96
- keyIndex++;
97
- }
98
- }
99
-
100
- const chartTopMargin = 50;
101
- const chartLeftMargin = 50;
102
-
103
- ctx.strokeStyle = chartData?.grid?.color || 'gray';
104
- ctx.lineWidth = 1;
105
- ctx.beginPath();
106
- ctx.moveTo(chartLeftMargin, chartTopMargin);
107
- ctx.lineTo(chartLeftMargin, chartTopMargin + chartHeight);
108
- ctx.lineTo(chartLeftMargin + chartWidth, chartTopMargin + chartHeight);
109
- ctx.stroke();
110
-
111
- if (chartData?.grid?.enable) {
112
- drawGridLines(ctx, chartLeftMargin, chartTopMargin, chartWidth, chartHeight, xLabels, yLabels, chartData.grid);
113
- }
114
-
115
- ctx.fillStyle = `${chartData?.labels?.color || 'black'}`;
116
- ctx.font = `bold ${chartData?.labels?.fontSize || 16}px Arial`;
117
- xLabels.forEach((label, index) => {
118
- const x = chartLeftMargin + index * (chartWidth / (xLabels.length - 1));
119
- const y = chartTopMargin + chartHeight + 20;
120
- ctx.fillText(String(label), x - ctx.measureText(String(label)).width / 2, y);
121
- });
122
-
123
- ctx.textAlign = 'right';
124
- yLabels.forEach((label, index) => {
125
- const x = chartLeftMargin - 5;
126
- const y = chartTopMargin + chartHeight - index * (chartHeight / (yLabels.length - 1));
127
- ctx.fillText(String(label), x, y + 5);
128
- });
129
-
130
-
131
- ctx.fillStyle = `${chartData?.axis?.color|| 'black'}`;
132
- ctx.font = `bold ${chartData?.axis?.size || 12}px Arial`;
133
- ctx.fillText(xTitle || 'X Axis', 30 + canvasWidth / 2, canvasHeight - 15);
134
-
135
- ctx.save();
136
- ctx.translate(10, canvasHeight / 2);
137
- ctx.rotate(-Math.PI / 2);
138
- ctx.textAlign = 'center';
139
- ctx.fillText(yTitle || 'Y Axis', 0, 10);
140
- ctx.restore();
141
-
142
- xAxis.forEach((bar, index) => {
143
- const startX = chartLeftMargin + ((bar.position?.startsXLabel - Math.min(...xLabels)) / (Math.max(...xLabels) - Math.min(...xLabels))) * chartWidth;
144
- const endX = chartLeftMargin + ((bar.position?.endsXLabel - Math.min(...xLabels)) / (Math.max(...xLabels) - Math.min(...xLabels))) * chartWidth;
145
- const barWidth = endX - startX;
146
- const barHeight = (bar.value / Math.max(...yAxis)) * chartHeight;
147
- const y = chartTopMargin + chartHeight - barHeight;
148
-
149
- ctx.fillStyle = bar.barColor || 'blue';
150
- ctx.fillRect(startX, y, barWidth, barHeight);
151
- ctx.strokeStyle = bar?.stroke?.color || 'black';
152
- ctx.lineWidth = bar?.stroke?.width || 1;
153
- ctx.strokeRect(startX, y, barWidth, barHeight);
154
-
155
- ctx.fillStyle = `${labelStyle?.color || 'black'}`;
156
- ctx.textAlign = 'center';
157
- ctx.font = `bold ${labelStyle?.size || 16}px Arial`;
158
- const labelX = startX + barWidth / 2;
159
- const labelY = y - 5;
160
- ctx.fillText(bar.label, labelX, labelY);
161
- });
162
-
163
- const buffer = canvas.toBuffer('image/png');
164
- return buffer
165
- } catch (error) {
166
- console.error('An error occurred while drawing the bar chart:', error);
167
- }
168
- }
169
-
170
- import { SKRSContext2D } from '@napi-rs/canvas';
171
-
172
- function drawGridLines(ctx: SKRSContext2D, leftMargin: number, topMargin: number, width: number, height: number, xLabels: number[], yLabels: number[], grid: { color?: string; width?: number }) {
173
- ctx.strokeStyle = grid.color || 'gray';
174
- ctx.lineWidth = grid.width || 2;
175
-
176
- xLabels.forEach((label: any, index: any) => {
177
- const x = leftMargin + index * (width / (xLabels.length - 1));
178
- ctx.beginPath();
179
- ctx.moveTo(x, topMargin);
180
- ctx.lineTo(x, topMargin + height);
181
- ctx.stroke();
182
- });
183
-
184
- yLabels.forEach((label: any, index: any) => {
185
- const y = topMargin + index * (height / (yLabels.length - 1));
186
- ctx.beginPath();
187
- ctx.moveTo(leftMargin, y);
188
- ctx.lineTo(leftMargin + width, y);
189
- ctx.stroke();
190
- });
191
- }
192
-
193
-
194
- ////////////////////////////////////////PIE CHARTS////////////////////////////////////////
195
-
196
-
197
- function drawPieChart(ctx: SKRSContext2D, data: DataItem[], canvasConfig: bgConfig, pieDataConfig: PieDataConfig): void {
198
- const width = canvasConfig?.width ?? 1200;
199
- const height = canvasConfig?.height ?? 400;
200
- const centerX = width / 2 + (pieDataConfig?.x || 0);
201
- const centerY = height / 2 + (pieDataConfig?.y || 0);
202
- const radius = pieDataConfig?.radius || Math.min(width, height) * 0.35;
203
- let startAngle = 0;
204
- const totalValue = data.reduce((acc, { value }) => acc + value, 0);
205
-
206
- for (const { label, color, value } of data) {
207
- const sliceAngle = (value / totalValue) * (Math.PI * 2);
208
- const midAngle = startAngle + sliceAngle / 2;
209
- const labelDistance = pieDataConfig?.boxes?.labelDistance || 50;
210
- const labelX = centerX + Math.cos(midAngle) * (radius + labelDistance);
211
- const labelY = centerY + Math.sin(midAngle) * (radius + labelDistance);
212
-
213
- ctx.strokeStyle = pieDataConfig?.boxes?.strokeColor || 'black';
214
- ctx.beginPath();
215
- ctx.moveTo(centerX, centerY);
216
- ctx.lineTo(labelX, labelY);
217
- ctx.stroke();
218
-
219
- const boxWidth = pieDataConfig?.boxes?.width || 100;
220
- const boxHeight = pieDataConfig?.boxes?.height || 40;
221
- const boxX = labelX - boxWidth / 2;
222
- const boxY = labelY - boxHeight / 2;
223
- ctx.fillStyle = pieDataConfig?.boxes?.boxColor || 'black';
224
- ctx.beginPath();
225
- ctx.rect(boxX, boxY, boxWidth, boxHeight);
226
- ctx.fill();
227
- ctx.stroke();
228
-
229
- // Draw the label text
230
- ctx.fillStyle = pieDataConfig?.boxes?.labelColor || 'black';
231
- ctx.font = `bold ${pieDataConfig?.boxes?.fontSize || 14}px Arial`;
232
- ctx.textAlign = 'center';
233
- ctx.textBaseline = 'middle';
234
- ctx.fillText(label, labelX, labelY);
235
-
236
- startAngle += sliceAngle;
237
- }
238
-
239
- startAngle = 0;
240
- for (const { color, value } of data) {
241
- const sliceAngle = (value / totalValue) * (Math.PI * 2);
242
- ctx.fillStyle = color || 'black';
243
- ctx.beginPath();
244
- ctx.moveTo(centerX, centerY);
245
- ctx.arc(centerX, centerY, radius, startAngle, startAngle + sliceAngle);
246
- ctx.closePath();
247
- ctx.fill();
248
- startAngle += sliceAngle;
249
- }
250
-
251
- const strokeConfig = pieDataConfig.stroke || { color: 'transparent', size: 0 };
252
- const { color: strokeColor, size: strokeWidth } = strokeConfig;
253
- ctx.strokeStyle = strokeColor || 'transparent';
254
- ctx.lineWidth = strokeWidth || 0;
255
- ctx.beginPath();
256
- ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);
257
- ctx.stroke();
258
-
259
- if (pieDataConfig.title) {
260
- const { text, color, fontSize, x = 0, y = 0 } = pieDataConfig.title;
261
- ctx.fillStyle = color || 'black';
262
- ctx.font = `${fontSize || 20}px Arial`;
263
- ctx.textAlign = 'center';
264
- ctx.fillText(text || '', centerX + x, centerY + y);
265
- }
266
- }
267
-
268
- function drawKeys(ctx: SKRSContext2D, data: DataItem[], pieConfig: { keyBox: KeyBoxConfig; canvas: bgConfig }): void {
269
- const { bgcolor, width, height, radius, x, y, content } = pieConfig.keyBox || {};
270
- const keyX = x || 0;
271
- const keyY = y || 0;
272
- ctx.fillStyle = bgcolor || 'white';
273
- ctx.beginPath();
274
- ctx.moveTo(keyX + (radius || 0), keyY);
275
- ctx.lineTo(keyX + (width || 0) - (radius || 0), keyY);
276
- ctx.arcTo(keyX + (width || 0), keyY, keyX + (width || 0), keyY + (radius || 0), radius || 0);
277
- ctx.lineTo(keyX + (width || 0), keyY + (height || 0) - (radius || 0));
278
- ctx.arcTo(keyX + (width || 0), keyY + (height || 0), keyX + (width || 0) - (radius || 0), keyY + (height || 0), radius || 0);
279
- ctx.lineTo(keyX + (radius || 0), keyY + (height || 0));
280
- ctx.arcTo(keyX, keyY + (height || 0), keyX, keyY + (height || 0) - (radius || 0), radius || 0);
281
- ctx.lineTo(keyX, keyY + (radius || 0));
282
- ctx.arcTo(keyX, keyY, keyX + (radius || 0), keyY, radius || 0);
283
- ctx.closePath();
284
- ctx.fill();
285
-
286
- ctx.fillStyle = 'black';
287
- ctx.font = `bold ${content?.keyTitle?.fontSize || 14}px Arial`;
288
-
289
- const textWidth = ctx.measureText('Keys').width;
290
- const textX = ((content?.keyTitle?.x || 0) + 20 + keyX + ((width || 0) - textWidth) / 2) || 0;
291
- const textY = (keyY + 30 + (content?.keyTitle?.y || 0)) || 0;
292
-
293
- ctx.fillText('Keys', textX, textY);
294
-
295
- let fontSize = content?.keys?.fontSize || Math.min(16, Math.floor((width || 0) / 20));
296
- ctx.font = `${fontSize}px Arial`;
297
-
298
- data.forEach(({ label, color, key }, index) => {
299
- ctx.fillStyle = color || 'black';
300
- ctx.fillRect(keyX + 20, keyY + 60 + index * (fontSize + 10), 20, 20);
301
- ctx.fillStyle = 'black';
302
- ctx.fillText(`${key || ''}: ${label || ''}`, (keyX + 95 + (content?.keys?.x || 0)), (content?.keys?.y || 0) + keyY + 70 + index * (fontSize + 10));
303
- });
304
- }
305
-
306
- export async function pieChart(pieChartData: PieChartData): Promise<Buffer> {
307
- const { data = [], pieConfig = {} } = pieChartData;
308
- const { canvas = {}, keyBox = {}, pieData = {} } = pieConfig;
309
-
310
- const { width: canvasWidth = 1200, height: canvasHeight = 400, bgcolor: canvasBgcolor = 'gray' } = canvas || {};
311
-
312
- const { width: keyBoxWidth = 200, height: keyBoxHeight = 300, radius: keyBoxRadius = 20, bgcolor: keyBoxBgcolor = '#ffffff', x: keyBoxX = 0, y: keyBoxY = 0, content: keyBoxContent } = keyBox || {};
313
-
314
- const chartCanvas = createCanvas(canvasWidth, canvasHeight);
315
- const ctx = chartCanvas.getContext('2d');
316
-
317
- ctx.fillStyle = canvasBgcolor;
318
- ctx.fillRect(0, 0, canvasWidth, canvasHeight);
319
-
320
- const pieConfigData: PieDataConfig = pieConfig.pieData ?? {};
321
-
322
- drawPieChart(ctx, data, canvas, pieConfigData);
323
-
324
- drawKeys(ctx, data, { keyBox: { bgcolor: keyBoxBgcolor, width: keyBoxWidth, height: keyBoxHeight, radius: keyBoxRadius, x: keyBoxX, y: keyBoxY, content: keyBoxContent }, canvas });
325
-
326
- return chartCanvas.toBuffer('image/png');
327
- }
328
-
329
- ////////////////////////////////////////LINE CHARTS////////////////////////////////////////
330
-
331
-
332
- export async function lineChart(data: { data: LineDataPoint[][], lineConfig: LineChartConfig }): Promise<Buffer> {
333
- if (!data || !data.data || !Array.isArray(data.data) || data.data.length === 0 || !data.lineConfig) {
334
- throw new Error('Invalid data object or missing data properties');
335
- }
336
-
337
- const lineConfig = data.lineConfig;
338
- if (!lineConfig.yLabels || !Array.isArray(lineConfig.yLabels) || lineConfig.yLabels.length === 0) {
339
- throw new Error('Missing or invalid yLabels property in line configuration');
340
- }
341
-
342
- if (!lineConfig.fillArea || !Array.isArray(lineConfig.fillArea) || lineConfig.fillArea.length !== data.data.length) {
343
- throw new Error('Missing or invalid fillArea property in line configuration');
344
- }
345
-
346
- if (!lineConfig.lineColor || !Array.isArray(lineConfig.lineColor) || lineConfig.lineColor.length !== data.data.length) {
347
- throw new Error('Missing or invalid lineColor property in line configuration');
348
- }
349
-
350
- if (!lineConfig.plot || typeof lineConfig.plot !== 'object') {
351
- throw new Error('Missing or invalid plot property in line configuration');
352
- }
353
-
354
- if (!lineConfig.lineTension || !Array.isArray(lineConfig.lineTension) || lineConfig.lineTension.length !== data.data.length) {
355
- throw new Error('Missing or invalid lineTension property in line configuration');
356
- }
357
-
358
- if (!lineConfig.grid || typeof lineConfig.grid !== 'object') {
359
- throw new Error('Missing or invalid grid property in line configuration');
360
- }
361
-
362
- const canvasWidth = Math.max(data.lineConfig?.canvas?.width || 800, (data.data[0]?.length - 1) * 80 + 100);
363
- const canvasHeight = Math.max(data.lineConfig?.canvas?.height || 600, (lineConfig.yLabels.length - 1) * 60 + 100);
364
-
365
- let img: any;
366
- if (data.lineConfig?.canvas?.image) {
367
- try {
368
- if (data.lineConfig.canvas.image.startsWith('http')) {
369
- const response = await fetch(data.lineConfig.canvas.image);
370
- if (!response.ok) {
371
- throw new Error("Failed to fetch image.");
372
- }
373
- const buffer = await response.arrayBuffer();
374
- img = await loadImage(Buffer.from(buffer));
375
- } else {
376
- const imagePath = path.join(process.cwd(), data.lineConfig.canvas.image);
377
- img = await loadImage(imagePath);
378
- }
379
- } catch (error) {
380
- console.error('Error loading image:', error);
381
- }
382
- }
383
-
384
- const canvas = createCanvas(canvasWidth, canvasHeight);
385
- const ctx = canvas.getContext('2d');
386
-
387
- const xAxisLabels = data.data[0].map(point => point.label);
388
- const yAxisLabel = data.lineConfig?.yaxisLabel?.label || 'Y Axis';
389
- ctx.font = `${data.lineConfig?.yaxisLabel?.fontSize || 16} Arial`;
390
-
391
- if (data.lineConfig?.canvas?.image) {
392
- ctx.drawImage(img, 0, 0, canvasWidth, canvasHeight);
393
- } else {
394
- ctx.fillStyle = data.lineConfig?.canvas?.bgColor || '#f0f0f0';
395
- ctx.fillRect(0, 0, canvasWidth, canvasHeight);
396
- }
397
-
398
- if (data.lineConfig?.grid) {
399
- const grid = data.lineConfig.grid;
400
- ctx.strokeStyle = grid.color || '#ccc';
401
- ctx.lineWidth = grid.width || 1;
402
-
403
- if (grid.type === 'vertical' || grid.type === 'both') {
404
- for (let i = 1; i < xAxisLabels.length; i++) {
405
- const x = i * (canvasWidth - 100) / (xAxisLabels.length - 1) + 50;
406
- ctx.beginPath();
407
- ctx.moveTo(x, 50);
408
- ctx.lineTo(x, canvasHeight - 50);
409
- ctx.stroke();
410
- }
411
- }
412
-
413
- if (grid.type === 'horizontal' || grid.type === 'both') {
414
- for (let i = 1; i < lineConfig.yLabels.length; i++) {
415
- const y = i * (canvasHeight - 100) / (lineConfig.yLabels.length - 1) + 50;
416
- ctx.beginPath();
417
- ctx.moveTo(50, y);
418
- ctx.lineTo(canvasWidth - 50, y);
419
- ctx.stroke();
420
- }
421
- }
422
- }
423
-
424
- ctx.save();
425
- ctx.translate(20, canvasHeight / 2);
426
- ctx.rotate(-Math.PI / 2);
427
- ctx.fillStyle = data.lineConfig?.yaxisLabel?.color || 'black';
428
- ctx.fillText(yAxisLabel, data.lineConfig?.yaxisLabel?.y || 0, data.lineConfig?.yaxisLabel?.x || 0);
429
- ctx.restore();
430
-
431
- let maxY = 0;
432
- data.data.forEach(line => {
433
- const maxLineY = Math.max(...line.map(point => point.y));
434
- if (maxLineY > maxY) maxY = maxLineY;
435
- });
436
-
437
- const segmentWidth = (canvasWidth - 100) / (xAxisLabels.length - 1);
438
-
439
- ctx.beginPath();
440
- ctx.moveTo(50, 50);
441
- ctx.lineTo(50, canvasHeight - 50);
442
- ctx.lineTo(canvasWidth - 50, canvasHeight - 50);
443
- ctx.stroke();
444
-
445
- data.data.forEach((line, index) => {
446
- ctx.beginPath();
447
- ctx.strokeStyle = lineConfig?.lineColor[index] || 'blue';
448
- ctx.lineWidth = 2;
449
-
450
- const tension = (lineConfig && lineConfig.lineTension && lineConfig.lineTension[index]) || 0.1;
451
-
452
- line.forEach((point, index) => {
453
- const x = index * segmentWidth + 50;
454
- const y = canvasHeight - (point.y / maxY) * (canvasHeight - 100) - 50;
455
- if (index === 0) {
456
- ctx.moveTo(x, y);
457
- } else {
458
- const prevX = (index - 1) * segmentWidth + 50;
459
- const prevY = canvasHeight - (line[index - 1].y / maxY) * (canvasHeight - 100) - 50;
460
- const cpX1 = prevX + (x - prevX) * tension;
461
- const cpY1 = prevY;
462
- const cpX2 = x - (x - prevX) * tension;
463
- const cpY2 = y;
464
- ctx.bezierCurveTo(cpX1, cpY1, cpX2, cpY2, x, y);
465
- }
466
- });
467
-
468
- ctx.stroke();
469
-
470
- if (lineConfig.fillArea[index]) {
471
- const lastPoint = line[line.length - 1];
472
- const lastX = (line.length - 1) * segmentWidth + 50;
473
- const lastY = canvasHeight - (lastPoint.y / maxY) * (canvasHeight - 100) - 50;
474
-
475
- ctx.lineTo(lastX, canvasHeight - 50);
476
- ctx.lineTo(50, canvasHeight - 50);
477
- ctx.closePath();
478
- ctx.fillStyle = lineConfig.fillArea[index].color || 'rgba(0, 0, 255, 0.1)';
479
- ctx.fill();
480
- }
481
-
482
- if (data.lineConfig?.plot && data.lineConfig?.plot?.enable) {
483
- const plotConfig = data.lineConfig?.plot;
484
- ctx.fillStyle = plotConfig.color ? plotConfig.color[index] || 'red' : 'red';
485
- line.forEach((point, index) => {
486
- const x = index * segmentWidth + 50;
487
- const y = canvasHeight - (point.y / maxY) * (canvasHeight - 100) - 50;
488
- ctx.beginPath();
489
- ctx.arc(x, y, plotConfig.size || 4, 0, 2 * Math.PI);
490
- ctx.fill();
491
- });
492
- }
493
- });
494
-
495
-
496
- ctx.fillStyle = data.lineConfig?.canvas?.fontColor || 'black';
497
- ctx.font = `${data.lineConfig?.canvas?.fontSize || 16}px Arial`;
498
- ctx.textAlign = 'center';
499
- ctx.textBaseline = 'top';
500
- xAxisLabels.forEach((label, index) => {
501
- const x = index * segmentWidth + 50;
502
- const y = canvasHeight - 30;
503
- ctx.fillText(label, x, y);
504
- });
505
-
506
- ctx.textAlign = 'right';
507
- ctx.textBaseline = 'middle';
508
- lineConfig.yLabels.forEach((label, index) => {
509
- const y = canvasHeight - index * (canvasHeight - 100) / (lineConfig.yLabels.length - 1) - 50;
510
- ctx.fillText(label, 40, y);
511
- });
512
-
513
-
514
- if (lineConfig.keys && typeof lineConfig.keys === 'object') {
515
- const keyRadius = lineConfig.keysConfig?.radius || 10;
516
- const keyPadding = lineConfig.keysConfig?.keyPadding || 30;
517
- const textPadding = lineConfig.keysConfig?.textPadding || 60;
518
- const lineLength = 2 * keyRadius + 9 + (lineConfig.keysConfig?.textPadding || 0);
519
- const lineWidth = lineConfig.keysConfig?.lineWidth || 3;
520
- let totalKeyWidth = 0;
521
- for (const color in lineConfig.keys) {
522
- const keyText = lineConfig.keys[color];
523
- totalKeyWidth += ctx.measureText(keyText).width + keyPadding + (2 * keyRadius) + textPadding;
524
- }
525
- let startX = (canvasWidth - totalKeyWidth) / 2;
526
- for (const color in lineConfig.keys) {
527
- const keyText = lineConfig.keys[color];
528
- ctx.beginPath();
529
- ctx.arc(startX + keyRadius, 20 + keyRadius, keyRadius, 0, 2 * Math.PI);
530
- ctx.fillStyle = color;
531
- ctx.fill();
532
- ctx.closePath();
533
- ctx.beginPath();
534
- ctx.moveTo(startX + keyRadius - lineLength / 2, 20 + keyRadius);
535
- ctx.lineTo(startX + keyRadius + lineLength / 2, 20 + keyRadius);
536
- ctx.strokeStyle = color;
537
- ctx.lineWidth = lineWidth;
538
- ctx.stroke();
539
- ctx.closePath();
540
- ctx.fillStyle = lineConfig.keysConfig?.fontColor || 'black';
541
- ctx.fillText(keyText, startX + (2 * keyRadius) + keyPadding + textPadding, 20 + keyRadius);
542
- startX += ctx.measureText(keyText).width + keyPadding + (2 * keyRadius) + textPadding + keyPadding;
543
- }
544
- }
545
-
546
-
547
- return canvas.toBuffer('image/png');
548
- }