apexify.js 4.5.54 → 4.5.56

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 (247) hide show
  1. package/dist/cjs/ai/ApexAI.d.ts +1 -164
  2. package/dist/cjs/ai/ApexAI.d.ts.map +1 -1
  3. package/dist/cjs/ai/ApexAI.js +190 -373
  4. package/dist/cjs/ai/ApexAI.js.map +1 -1
  5. package/dist/cjs/ai/ApexModules.d.ts +1 -1
  6. package/dist/cjs/ai/ApexModules.d.ts.map +1 -1
  7. package/dist/cjs/ai/ApexModules.js +6 -18
  8. package/dist/cjs/ai/ApexModules.js.map +1 -1
  9. package/dist/cjs/ai/functions/draw.d.ts.map +1 -1
  10. package/dist/cjs/ai/functions/draw.js +6 -6
  11. package/dist/cjs/ai/functions/draw.js.map +1 -1
  12. package/dist/cjs/ai/modals-chat/electronHub/imageModels.d.ts +1 -1
  13. package/dist/cjs/ai/modals-chat/electronHub/imageModels.d.ts.map +1 -1
  14. package/dist/cjs/ai/modals-chat/electronHub/imageModels.js +1 -4
  15. package/dist/cjs/ai/modals-chat/electronHub/imageModels.js.map +1 -1
  16. package/dist/cjs/ai/utils.d.ts +1 -4
  17. package/dist/cjs/ai/utils.d.ts.map +1 -1
  18. package/dist/cjs/ai/utils.js +1 -7
  19. package/dist/cjs/ai/utils.js.map +1 -1
  20. package/dist/cjs/canvas/ApexPainter.d.ts +17 -14
  21. package/dist/cjs/canvas/ApexPainter.d.ts.map +1 -1
  22. package/dist/cjs/canvas/ApexPainter.js +29 -11
  23. package/dist/cjs/canvas/ApexPainter.js.map +1 -1
  24. package/dist/cjs/canvas/utils/Background/bg.d.ts +24 -0
  25. package/dist/cjs/canvas/utils/Background/bg.d.ts.map +1 -0
  26. package/dist/{esm/canvas/utils → cjs/canvas/utils/Background}/bg.js +27 -52
  27. package/dist/cjs/canvas/utils/Background/bg.js.map +1 -0
  28. package/dist/cjs/canvas/utils/Background/circular.d.ts +3 -0
  29. package/dist/cjs/canvas/utils/Background/circular.d.ts.map +1 -0
  30. package/dist/{esm/canvas/utils → cjs/canvas/utils/Background}/circular.js +0 -8
  31. package/dist/cjs/canvas/utils/{circular.js.map → Background/circular.js.map} +1 -1
  32. package/dist/cjs/canvas/utils/Background/radius.d.ts +18 -0
  33. package/dist/cjs/canvas/utils/Background/radius.d.ts.map +1 -0
  34. package/dist/cjs/canvas/utils/Background/radius.js +115 -0
  35. package/dist/cjs/canvas/utils/Background/radius.js.map +1 -0
  36. package/dist/cjs/canvas/utils/{charts.d.ts → Charts/charts.d.ts} +1 -1
  37. package/dist/cjs/canvas/utils/Charts/charts.d.ts.map +1 -0
  38. package/dist/cjs/canvas/utils/Charts/charts.js.map +1 -0
  39. package/dist/cjs/canvas/utils/Custom/customLines.d.ts +3 -0
  40. package/dist/cjs/canvas/utils/Custom/customLines.d.ts.map +1 -0
  41. package/dist/cjs/canvas/utils/Custom/customLines.js.map +1 -0
  42. package/dist/cjs/canvas/utils/General/conversion.d.ts.map +1 -0
  43. package/dist/cjs/canvas/utils/General/conversion.js.map +1 -0
  44. package/dist/cjs/canvas/utils/{general functions.d.ts → General/general functions.d.ts } +18 -4
  45. package/dist/cjs/canvas/utils/General/general functions.d.ts.map +1 -0
  46. package/dist/{esm/canvas/utils → cjs/canvas/utils/General}/general functions.js +89 -58
  47. package/dist/cjs/canvas/utils/General/general functions.js.map +1 -0
  48. package/dist/cjs/canvas/utils/Image/imageProperties.d.ts +81 -0
  49. package/dist/cjs/canvas/utils/Image/imageProperties.d.ts.map +1 -0
  50. package/dist/{esm/canvas/utils → cjs/canvas/utils/Image}/imageProperties.js +224 -45
  51. package/dist/cjs/canvas/utils/Image/imageProperties.js.map +1 -0
  52. package/dist/{esm/canvas/utils → cjs/canvas/utils/Texts}/textProperties.d.ts +1 -1
  53. package/dist/cjs/canvas/utils/Texts/textProperties.d.ts.map +1 -0
  54. package/dist/cjs/canvas/utils/Texts/textProperties.js.map +1 -0
  55. package/dist/cjs/canvas/utils/types.d.ts +41 -1
  56. package/dist/cjs/canvas/utils/types.d.ts.map +1 -1
  57. package/dist/cjs/canvas/utils/types.js.map +1 -1
  58. package/dist/cjs/canvas/utils/utils.d.ts +11 -11
  59. package/dist/cjs/canvas/utils/utils.d.ts.map +1 -1
  60. package/dist/cjs/canvas/utils/utils.js +11 -10
  61. package/dist/cjs/canvas/utils/utils.js.map +1 -1
  62. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  63. package/dist/esm/ai/ApexAI.d.ts +1 -164
  64. package/dist/esm/ai/ApexAI.d.ts.map +1 -1
  65. package/dist/esm/ai/ApexAI.js +190 -373
  66. package/dist/esm/ai/ApexAI.js.map +1 -1
  67. package/dist/esm/ai/ApexModules.d.ts +1 -1
  68. package/dist/esm/ai/ApexModules.d.ts.map +1 -1
  69. package/dist/esm/ai/ApexModules.js +6 -18
  70. package/dist/esm/ai/ApexModules.js.map +1 -1
  71. package/dist/esm/ai/functions/draw.d.ts.map +1 -1
  72. package/dist/esm/ai/functions/draw.js +6 -6
  73. package/dist/esm/ai/functions/draw.js.map +1 -1
  74. package/dist/esm/ai/modals-chat/electronHub/imageModels.d.ts +1 -1
  75. package/dist/esm/ai/modals-chat/electronHub/imageModels.d.ts.map +1 -1
  76. package/dist/esm/ai/modals-chat/electronHub/imageModels.js +1 -4
  77. package/dist/esm/ai/modals-chat/electronHub/imageModels.js.map +1 -1
  78. package/dist/esm/ai/utils.d.ts +1 -4
  79. package/dist/esm/ai/utils.d.ts.map +1 -1
  80. package/dist/esm/ai/utils.js +1 -7
  81. package/dist/esm/ai/utils.js.map +1 -1
  82. package/dist/esm/canvas/ApexPainter.d.ts +17 -14
  83. package/dist/esm/canvas/ApexPainter.d.ts.map +1 -1
  84. package/dist/esm/canvas/ApexPainter.js +29 -11
  85. package/dist/esm/canvas/ApexPainter.js.map +1 -1
  86. package/dist/esm/canvas/utils/Background/bg.d.ts +24 -0
  87. package/dist/esm/canvas/utils/Background/bg.d.ts.map +1 -0
  88. package/dist/{cjs/canvas/utils → esm/canvas/utils/Background}/bg.js +27 -52
  89. package/dist/esm/canvas/utils/Background/bg.js.map +1 -0
  90. package/dist/esm/canvas/utils/Background/circular.d.ts +3 -0
  91. package/dist/esm/canvas/utils/Background/circular.d.ts.map +1 -0
  92. package/dist/{cjs/canvas/utils → esm/canvas/utils/Background}/circular.js +0 -8
  93. package/dist/esm/canvas/utils/{circular.js.map → Background/circular.js.map} +1 -1
  94. package/dist/esm/canvas/utils/Background/radius.d.ts +18 -0
  95. package/dist/esm/canvas/utils/Background/radius.d.ts.map +1 -0
  96. package/dist/esm/canvas/utils/Background/radius.js +115 -0
  97. package/dist/esm/canvas/utils/Background/radius.js.map +1 -0
  98. package/dist/esm/canvas/utils/{charts.d.ts → Charts/charts.d.ts} +1 -1
  99. package/dist/esm/canvas/utils/Charts/charts.d.ts.map +1 -0
  100. package/dist/esm/canvas/utils/Charts/charts.js.map +1 -0
  101. package/dist/esm/canvas/utils/Custom/customLines.d.ts +3 -0
  102. package/dist/esm/canvas/utils/Custom/customLines.d.ts.map +1 -0
  103. package/dist/esm/canvas/utils/Custom/customLines.js.map +1 -0
  104. package/dist/esm/canvas/utils/General/conversion.d.ts.map +1 -0
  105. package/dist/esm/canvas/utils/General/conversion.js.map +1 -0
  106. package/dist/esm/canvas/utils/{general functions.d.ts → General/general functions.d.ts } +18 -4
  107. package/dist/esm/canvas/utils/General/general functions.d.ts.map +1 -0
  108. package/dist/{cjs/canvas/utils → esm/canvas/utils/General}/general functions.js +89 -58
  109. package/dist/esm/canvas/utils/General/general functions.js.map +1 -0
  110. package/dist/esm/canvas/utils/Image/imageProperties.d.ts +81 -0
  111. package/dist/esm/canvas/utils/Image/imageProperties.d.ts.map +1 -0
  112. package/dist/{cjs/canvas/utils → esm/canvas/utils/Image}/imageProperties.js +224 -45
  113. package/dist/esm/canvas/utils/Image/imageProperties.js.map +1 -0
  114. package/dist/{cjs/canvas/utils → esm/canvas/utils/Texts}/textProperties.d.ts +1 -1
  115. package/dist/esm/canvas/utils/Texts/textProperties.d.ts.map +1 -0
  116. package/dist/esm/canvas/utils/Texts/textProperties.js.map +1 -0
  117. package/dist/esm/canvas/utils/types.d.ts +41 -1
  118. package/dist/esm/canvas/utils/types.d.ts.map +1 -1
  119. package/dist/esm/canvas/utils/types.js.map +1 -1
  120. package/dist/esm/canvas/utils/utils.d.ts +11 -11
  121. package/dist/esm/canvas/utils/utils.d.ts.map +1 -1
  122. package/dist/esm/canvas/utils/utils.js +11 -10
  123. package/dist/esm/canvas/utils/utils.js.map +1 -1
  124. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  125. package/lib/ai/ApexAI.ts +195 -697
  126. package/lib/ai/ApexModules.ts +7 -17
  127. package/lib/ai/functions/draw.ts +6 -8
  128. package/lib/ai/modals-chat/electronHub/imageModels.ts +2 -5
  129. package/lib/ai/utils.ts +0 -6
  130. package/lib/canvas/ApexPainter.ts +73 -38
  131. package/lib/canvas/utils/Background/bg.ts +97 -0
  132. package/lib/canvas/utils/Background/circular.ts +17 -0
  133. package/lib/canvas/utils/Background/radius.ts +113 -0
  134. package/lib/canvas/utils/{charts.ts → Charts/charts.ts} +1 -1
  135. package/lib/canvas/utils/{customLines.ts → Custom/customLines.ts} +1 -1
  136. package/lib/canvas/utils/{conversion.ts → General/conversion.ts} +1 -1
  137. package/lib/canvas/utils/{general functions.ts → General/general functions.ts } +143 -121
  138. package/lib/canvas/utils/Image/imageProperties.ts +631 -0
  139. package/lib/canvas/utils/{textProperties.ts → Texts/textProperties.ts} +1 -1
  140. package/lib/canvas/utils/types.ts +45 -2
  141. package/lib/canvas/utils/utils.ts +14 -11
  142. package/package.json +1 -4
  143. package/dist/cjs/ai/functions/generateVoiceResponse.d.ts +0 -10
  144. package/dist/cjs/ai/functions/generateVoiceResponse.d.ts.map +0 -1
  145. package/dist/cjs/ai/functions/generateVoiceResponse.js +0 -161
  146. package/dist/cjs/ai/functions/generateVoiceResponse.js.map +0 -1
  147. package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.d.ts +0 -13
  148. package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.d.ts.map +0 -1
  149. package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.js +0 -185
  150. package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.js.map +0 -1
  151. package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.d.ts +0 -13
  152. package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.d.ts.map +0 -1
  153. package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.js +0 -185
  154. package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.js.map +0 -1
  155. package/dist/cjs/ai/modals-chat/gemini/config.d.ts +0 -5
  156. package/dist/cjs/ai/modals-chat/gemini/config.d.ts.map +0 -1
  157. package/dist/cjs/ai/modals-chat/gemini/config.js +0 -13
  158. package/dist/cjs/ai/modals-chat/gemini/config.js.map +0 -1
  159. package/dist/cjs/ai/modals-chat/gemini/geminiFast.d.ts +0 -15
  160. package/dist/cjs/ai/modals-chat/gemini/geminiFast.d.ts.map +0 -1
  161. package/dist/cjs/ai/modals-chat/gemini/geminiFast.js +0 -146
  162. package/dist/cjs/ai/modals-chat/gemini/geminiFast.js.map +0 -1
  163. package/dist/cjs/canvas/utils/bg.d.ts +0 -23
  164. package/dist/cjs/canvas/utils/bg.d.ts.map +0 -1
  165. package/dist/cjs/canvas/utils/bg.js.map +0 -1
  166. package/dist/cjs/canvas/utils/charts.d.ts.map +0 -1
  167. package/dist/cjs/canvas/utils/charts.js.map +0 -1
  168. package/dist/cjs/canvas/utils/circular.d.ts +0 -10
  169. package/dist/cjs/canvas/utils/circular.d.ts.map +0 -1
  170. package/dist/cjs/canvas/utils/conversion.d.ts.map +0 -1
  171. package/dist/cjs/canvas/utils/conversion.js.map +0 -1
  172. package/dist/cjs/canvas/utils/customLines.d.ts +0 -3
  173. package/dist/cjs/canvas/utils/customLines.d.ts.map +0 -1
  174. package/dist/cjs/canvas/utils/customLines.js.map +0 -1
  175. package/dist/cjs/canvas/utils/general functions.d.ts.map +0 -1
  176. package/dist/cjs/canvas/utils/general functions.js.map +0 -1
  177. package/dist/cjs/canvas/utils/imageProperties.d.ts +0 -62
  178. package/dist/cjs/canvas/utils/imageProperties.d.ts.map +0 -1
  179. package/dist/cjs/canvas/utils/imageProperties.js.map +0 -1
  180. package/dist/cjs/canvas/utils/radius.d.ts +0 -10
  181. package/dist/cjs/canvas/utils/radius.d.ts.map +0 -1
  182. package/dist/cjs/canvas/utils/radius.js +0 -30
  183. package/dist/cjs/canvas/utils/radius.js.map +0 -1
  184. package/dist/cjs/canvas/utils/textProperties.d.ts.map +0 -1
  185. package/dist/cjs/canvas/utils/textProperties.js.map +0 -1
  186. package/dist/esm/ai/functions/generateVoiceResponse.d.ts +0 -10
  187. package/dist/esm/ai/functions/generateVoiceResponse.d.ts.map +0 -1
  188. package/dist/esm/ai/functions/generateVoiceResponse.js +0 -161
  189. package/dist/esm/ai/functions/generateVoiceResponse.js.map +0 -1
  190. package/dist/esm/ai/modals-chat/gemini/Gemini-flash.d.ts +0 -13
  191. package/dist/esm/ai/modals-chat/gemini/Gemini-flash.d.ts.map +0 -1
  192. package/dist/esm/ai/modals-chat/gemini/Gemini-flash.js +0 -185
  193. package/dist/esm/ai/modals-chat/gemini/Gemini-flash.js.map +0 -1
  194. package/dist/esm/ai/modals-chat/gemini/Gemini-pro.d.ts +0 -13
  195. package/dist/esm/ai/modals-chat/gemini/Gemini-pro.d.ts.map +0 -1
  196. package/dist/esm/ai/modals-chat/gemini/Gemini-pro.js +0 -185
  197. package/dist/esm/ai/modals-chat/gemini/Gemini-pro.js.map +0 -1
  198. package/dist/esm/ai/modals-chat/gemini/config.d.ts +0 -5
  199. package/dist/esm/ai/modals-chat/gemini/config.d.ts.map +0 -1
  200. package/dist/esm/ai/modals-chat/gemini/config.js +0 -13
  201. package/dist/esm/ai/modals-chat/gemini/config.js.map +0 -1
  202. package/dist/esm/ai/modals-chat/gemini/geminiFast.d.ts +0 -15
  203. package/dist/esm/ai/modals-chat/gemini/geminiFast.d.ts.map +0 -1
  204. package/dist/esm/ai/modals-chat/gemini/geminiFast.js +0 -146
  205. package/dist/esm/ai/modals-chat/gemini/geminiFast.js.map +0 -1
  206. package/dist/esm/canvas/utils/bg.d.ts +0 -23
  207. package/dist/esm/canvas/utils/bg.d.ts.map +0 -1
  208. package/dist/esm/canvas/utils/bg.js.map +0 -1
  209. package/dist/esm/canvas/utils/charts.d.ts.map +0 -1
  210. package/dist/esm/canvas/utils/charts.js.map +0 -1
  211. package/dist/esm/canvas/utils/circular.d.ts +0 -10
  212. package/dist/esm/canvas/utils/circular.d.ts.map +0 -1
  213. package/dist/esm/canvas/utils/conversion.d.ts.map +0 -1
  214. package/dist/esm/canvas/utils/conversion.js.map +0 -1
  215. package/dist/esm/canvas/utils/customLines.d.ts +0 -3
  216. package/dist/esm/canvas/utils/customLines.d.ts.map +0 -1
  217. package/dist/esm/canvas/utils/customLines.js.map +0 -1
  218. package/dist/esm/canvas/utils/general functions.d.ts.map +0 -1
  219. package/dist/esm/canvas/utils/general functions.js.map +0 -1
  220. package/dist/esm/canvas/utils/imageProperties.d.ts +0 -62
  221. package/dist/esm/canvas/utils/imageProperties.d.ts.map +0 -1
  222. package/dist/esm/canvas/utils/imageProperties.js.map +0 -1
  223. package/dist/esm/canvas/utils/radius.d.ts +0 -10
  224. package/dist/esm/canvas/utils/radius.d.ts.map +0 -1
  225. package/dist/esm/canvas/utils/radius.js +0 -30
  226. package/dist/esm/canvas/utils/radius.js.map +0 -1
  227. package/dist/esm/canvas/utils/textProperties.d.ts.map +0 -1
  228. package/dist/esm/canvas/utils/textProperties.js.map +0 -1
  229. package/lib/ai/functions/generateVoiceResponse.ts +0 -186
  230. package/lib/ai/modals-chat/gemini/Gemini-flash.ts +0 -200
  231. package/lib/ai/modals-chat/gemini/Gemini-pro.ts +0 -203
  232. package/lib/ai/modals-chat/gemini/config.ts +0 -11
  233. package/lib/ai/modals-chat/gemini/geminiFast.ts +0 -169
  234. package/lib/canvas/utils/bg.ts +0 -120
  235. package/lib/canvas/utils/circular.ts +0 -17
  236. package/lib/canvas/utils/imageProperties.ts +0 -418
  237. package/lib/canvas/utils/radius.ts +0 -26
  238. /package/dist/cjs/canvas/utils/{charts.js → Charts/charts.js} +0 -0
  239. /package/dist/cjs/canvas/utils/{customLines.js → Custom/customLines.js} +0 -0
  240. /package/dist/cjs/canvas/utils/{conversion.d.ts → General/conversion.d.ts} +0 -0
  241. /package/dist/cjs/canvas/utils/{conversion.js → General/conversion.js} +0 -0
  242. /package/dist/cjs/canvas/utils/{textProperties.js → Texts/textProperties.js} +0 -0
  243. /package/dist/esm/canvas/utils/{charts.js → Charts/charts.js} +0 -0
  244. /package/dist/esm/canvas/utils/{customLines.js → Custom/customLines.js} +0 -0
  245. /package/dist/esm/canvas/utils/{conversion.d.ts → General/conversion.d.ts} +0 -0
  246. /package/dist/esm/canvas/utils/{conversion.js → General/conversion.js} +0 -0
  247. /package/dist/esm/canvas/utils/{textProperties.js → Texts/textProperties.js} +0 -0
@@ -1,11 +1,9 @@
1
1
  import { Hercai } from 'hercai';
2
- import translate from "@iamtraction/google-translate";
3
2
  import { validateModels } from "./functions/validOptions";
4
3
  import { whisper } from './modals-chat/groq/whisper';
5
4
  import { connect } from 'verse.db';
6
5
  import { otherChatModels } from './modals-chat/others/otherModels';
7
6
  import { chatGroq } from './modals-chat/groq/chatgroq';
8
- import { geminiFast } from './modals-chat/gemini/geminiFast';
9
7
  import { groqAnalyzer } from './utils';
10
8
  import { electronImagine } from './modals-chat/electronHub/imageModels';
11
9
  import { electronChat } from './modals-chat/electronHub/chatmodels';
@@ -30,7 +28,7 @@ export interface ApexImagineOptions {
30
28
  image_style?: any;
31
29
  width?: number;
32
30
  height?: number;
33
- format?: "jpeg" | "png" | "webp";
31
+ format?: "jpeg" | "png";
34
32
  quality?: number;
35
33
  steps?: number;
36
34
  seed?: number;
@@ -48,10 +46,7 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
48
46
  const imageType = await validateModels();
49
47
  const { Api_Key = 'eaebff6e-c7b2-477c-8edd-9aa91becf1e3', nsfw = false, deepCheck = false, nsfwWords = [], count = 2, negative_prompt = "", sampler = "DPM++ 2M Karras", height = 1024, width = 1024, cfg_scale = 9, steps = 20, seed = -1, image_style = "cinematic" } = options ?? {};
50
48
 
51
- const translatedText = await translate(prompt, {
52
- from: "auto",
53
- to: "en"
54
- });
49
+ const translatedText = await electronChat({ modelName: 'gpt-4o', prompt: `Translate The text below into english:\n\n${prompt}` }) as string;
55
50
 
56
51
  if (count > 4 || count <= 0) throw new Error("Inavlid usage. Count can't be less than 0 or more than 4.");
57
52
  if ((width || height) <= 0) throw new Error("Inavlid usage. Image width/height can't be less than 0 or more than 1024.");
@@ -60,7 +55,7 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
60
55
  if (imageType.validHercaiModels.includes(model)) {
61
56
  if (model === 'prodia-v2') {
62
57
  imageURL = (await hercai.betaDrawImage({
63
- prompt: translatedText.text,
58
+ prompt: translatedText,
64
59
  negative_prompt: negative_prompt,
65
60
  sampler: "DPM-Solver",
66
61
  image_style: image_style,
@@ -72,12 +67,12 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
72
67
  } else {
73
68
  imageURL = (await hercai.drawImage({
74
69
  model: model as hercmodals,
75
- prompt: translatedText.text,
70
+ prompt: translatedText,
76
71
  negative_prompt: negative_prompt
77
72
  })).url;
78
73
  }
79
74
  } else if (imageType.validElectronModels.includes(model)) {
80
- const gen = await electronImagine({ ApiKey: Api_Key as string, prompt: translatedText.text, modelName: model, resizeOptions: { height, width, format: options?.format, quality: options?.quality } });
75
+ const gen = await electronImagine({ ApiKey: Api_Key as string, prompt: translatedText, modelName: model, resizeOptions: { height, width, format: options?.format, quality: options?.quality } });
81
76
  if (gen === null) throw new Error('this model reached rate limit. Provide your own api key from: "https://discord.gg/94qUZWhwFE"');
82
77
  imageURL = gen as string
83
78
  } else {
@@ -582,9 +577,9 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
582
577
  }
583
578
 
584
579
  if (deepCheck === true) {
585
- shouldExclude = shouldExclude || NSFWWORDS.some(word => translatedText.text.includes(word));
580
+ shouldExclude = shouldExclude || NSFWWORDS.some(word => translatedText.includes(word));
586
581
  shouldExclude = shouldExclude || NSFWWORDS.some(word => prompt.includes(word));
587
- shouldExclude = shouldExclude || nsfwWords.some(word => translatedText.text.includes(word));
582
+ shouldExclude = shouldExclude || nsfwWords.some(word => translatedText.includes(word));
588
583
  shouldExclude = shouldExclude || nsfwWords.some(word => prompt.includes(word));
589
584
  }
590
585
 
@@ -600,11 +595,6 @@ async function ApexImagine(model: string, prompt: string, options?: ApexImagineO
600
595
  async function ApexChat(model: string, prompt: string, { userId, memory, limit, instruction, Api_key }: { userId?: string, memory?: boolean, limit?: number, instruction?: string, Api_key?: string }): Promise<string> {
601
596
  try {
602
597
 
603
- if (model === 'gemini-flash' || model === 'gemini-pro') {
604
- const geminiResponse = await geminiFast({ Api_key, modal: model, user: userId, memory, instruction, limit, prompt })
605
- return geminiResponse
606
- }
607
-
608
598
  let enhancedPrompt: string = prompt;
609
599
  let historyChat: string = `- This is Previous chat history between you (System) and the user (User)\n`;
610
600
  let commandString: string = ''
@@ -1,4 +1,3 @@
1
- import translate from "@iamtraction/google-translate";
2
1
  import {
3
2
  ButtonBuilder,
4
3
  StringSelectMenuBuilder,
@@ -52,9 +51,7 @@ async function aiImagine(
52
51
 
53
52
  await message.channel?.sendTyping();
54
53
 
55
- const translatedText = await retry(() =>
56
- translate(textToDraw, { from: "auto", to: "en" })
57
- );
54
+ const translatedText = await electronChat({ modelName: 'gpt-4o', prompt: `Translate The text below into english:\n\n${prompt}` }) as string;
58
55
 
59
56
  const nsfwWords: string[] = nsfwKeyWords || [
60
57
  "2g1c",
@@ -539,7 +536,7 @@ async function aiImagine(
539
536
  "ass",
540
537
  ];
541
538
  if (deepCheck) {
542
- if (translatedText.text && nsfwWords.some(word => translatedText.text.includes(word))) {
539
+ if (translatedText && nsfwWords.some(word => translatedText.includes(word))) {
543
540
  return message.reply("Warning ⚠️. Your prompt contains **`NSFW/Illegal/Prohibited`** words. Please refrain from doing this.");
544
541
  }
545
542
 
@@ -553,11 +550,11 @@ async function aiImagine(
553
550
 
554
551
  try {
555
552
  if (imageModal === 'prodia-v2') {
556
- response = await retry(() => hercai.betaDrawImage({ prompt: translatedText.text, ...enhancer }));
553
+ response = await retry(() => hercai.betaDrawImage({ prompt: translatedText, ...enhancer }));
557
554
  } else if (imageType.validHercaiModels.includes(imageModal)) {
558
- response = await retry(() => hercai.drawImage({ model: imageModal, prompt: translatedText.text }));
555
+ response = await retry(() => hercai.drawImage({ model: imageModal, prompt: translatedText }));
559
556
  } else if (imageType.validElectronModels.includes(imageModal)) {
560
- response = await electronImagine({ ApiKey: imageAPIS?.electronHubKey as any, prompt: translatedText.text, modelName: imageModal, resizeOptions: { width: enhancer.width , height: enhancer.height, format: enhancer.format, quality: enhancer.quality } });
557
+ response = await electronImagine({ ApiKey: imageAPIS?.electronHubKey as any, prompt: translatedText, modelName: imageModal, resizeOptions: { width: enhancer.width , height: enhancer.height, format: enhancer.format, quality: enhancer.quality } });
561
558
  } else {
562
559
  throw new Error("Invalid modal name.");
563
560
  }
@@ -629,6 +626,7 @@ export { aiImagine };
629
626
 
630
627
 
631
628
  import { createCanvas, loadImage } from "@napi-rs/canvas";
629
+ import { electronChat } from "../modals-chat/electronHub/chatmodels";
632
630
 
633
631
  export async function resizeAndSharpen(imageBuffer: Buffer) {
634
632
  const originalImage = await loadImage(imageBuffer);
@@ -15,7 +15,7 @@ export async function electronImagine({
15
15
  resizeOptions?: {
16
16
  width?: number;
17
17
  height?: number;
18
- format?: "jpeg" | "png" | "webp";
18
+ format?: "jpeg" | "png" ;
19
19
  quality?: number;
20
20
  };
21
21
  }): Promise<string | undefined> {
@@ -84,11 +84,8 @@ export async function electronImagine({
84
84
  case "png":
85
85
  imageProcessor = imageProcessor.png({ quality });
86
86
  break;
87
- case "webp":
88
- imageProcessor = imageProcessor.webp({ quality });
89
- break;
90
87
  default:
91
- break;
88
+ throw Error('We dont support this format only png and jpeg');
92
89
  }
93
90
  }
94
91
 
package/lib/ai/utils.ts CHANGED
@@ -1,21 +1,17 @@
1
1
  import { imageReader } from "./functions/imageReader";
2
2
  import { chunkString } from "./functions/chunkString";
3
3
  import { toDraw } from "./functions/shouldDrawImage";
4
- import { aiVoice } from "./functions/generateVoiceResponse";
5
4
  import { aiImagine } from "./functions/draw";
6
5
  import { readFile } from "./functions/readFiles";
7
6
  import { ApexChat, ApexImagine, ApexListener, ApexVideo, ApexText2Speech } from "./ApexModules";
8
7
  import { typeWriter } from "./functions/typeWriter" ;
9
8
  import { groqAnalyzer } from "./modals-chat/groq/imageAnalyzer";
10
- import { geminiFlash } from "./modals-chat/gemini/Gemini-flash";
11
- import { geminiPro } from "./modals-chat/gemini/Gemini-pro";
12
9
 
13
10
 
14
11
  export {
15
12
  chunkString,
16
13
  imageReader,
17
14
  toDraw,
18
- aiVoice,
19
15
  aiImagine,
20
16
  readFile,
21
17
  ApexChat,
@@ -23,8 +19,6 @@ export {
23
19
  ApexListener,
24
20
  typeWriter,
25
21
  groqAnalyzer,
26
- geminiFlash,
27
- geminiPro,
28
22
  ApexVideo,
29
23
  ApexText2Speech
30
24
  };
@@ -1,4 +1,4 @@
1
- import { createCanvas, loadImage, GlobalFonts, Image, Canvas } from "@napi-rs/canvas";
1
+ import { createCanvas, loadImage, GlobalFonts, Image, SKRSContext2D } from "@napi-rs/canvas";
2
2
  import GIFEncoder from "gifencoder";
3
3
  import ffmpeg from 'fluent-ffmpeg';
4
4
  import { PassThrough} from "stream";
@@ -9,7 +9,9 @@ import { OutputFormat, CanvasConfig, TextObject, ImageProperties, GIFOptions, GI
9
9
  drawBackgroundGradient, drawBackgroundColor, customBackground, circularBorder, radiusBorder, customLines, applyRotation, applyStroke,
10
10
  applyShadow, imageRadius, drawShape, drawText, converter, resizingImg, applyColorFilters, imgEffects,verticalBarChart, pieChart,
11
11
  lineChart, cropInner, cropOuter, bgRemoval, detectColors, removeColor, dataURL, base64, arrayBuffer, blob, url, GradientConfig, Frame,
12
- PatternOptions, ExtractFramesOptions
12
+ PatternOptions, ExtractFramesOptions,
13
+ applyZoom,
14
+ ResizeOptions
13
15
  } from "./utils/utils";
14
16
 
15
17
  interface CanvasResults {
@@ -24,42 +26,75 @@ export class ApexPainter {
24
26
  this.format = { type: type || 'buffer' };
25
27
  }
26
28
 
29
+ /**
30
+ * Creates a canvas with the given configuration.
31
+ * Applies rotation, shadow, border effects, background, and stroke.
32
+ *
33
+ * @param canvas - The configuration options for the canvas.
34
+ * @returns A promise that resolves to an object containing the image buffer and the canvas config.
35
+ * @throws If the 2D context cannot be retrieved.
36
+ */
27
37
  async createCanvas(canvas: CanvasConfig): Promise<CanvasResults> {
28
- let canvasWidth: number = canvas.width || 500;
29
- let canvasHeight: number = canvas.height || 500;
30
- let borderRadius: number | string = canvas.borderRadius || 0;
31
-
32
- const canvasInstance = createCanvas(canvasWidth, canvasHeight);
33
- const ctx: any = canvasInstance.getContext('2d');
34
-
38
+ const {
39
+ width = 500,
40
+ height = 500,
41
+ x = 0,
42
+ y = 0,
43
+ rotation = 0,
44
+ borderRadius = 0,
45
+ customBg,
46
+ gradientBg,
47
+ stroke,
48
+ shadow,
49
+ borderPosition = 'all',
50
+ opacity = 1,
51
+ zoom
52
+ } = canvas;
53
+
54
+ const canvasInstance = createCanvas(width, height);
55
+ const ctx = canvasInstance.getContext('2d') as SKRSContext2D | null;
35
56
  if (!ctx) {
36
- throw new Error('Unable to get 2D rendering context from canvas');
57
+ throw new Error('Unable to get 2D rendering context from canvas');
37
58
  }
59
+
60
+ // Set the global opacity for all drawing operations.
61
+ ctx.globalAlpha = opacity;
38
62
 
39
- applyRotation(ctx, canvas.rotation || 0, canvas.x || 0, canvas.y || 0, canvasWidth, canvasHeight);
40
-
41
- applyShadow(ctx, canvas.shadow, canvas.x || 0, canvas.y || 0, canvasWidth, canvasHeight);
42
-
63
+ // Apply rotation and shadow.
64
+ applyRotation(ctx, rotation, x, y, width, height);
65
+ applyShadow(ctx, shadow, x, y, width, height);
66
+
67
+ // --- Draw Background With Clipping ---
68
+ // Save state before applying the clip.
69
+ ctx.save();
43
70
  if (typeof borderRadius === 'string') {
44
- circularBorder(ctx, canvasWidth, canvasHeight);
71
+ circularBorder(ctx, width, height);
45
72
  } else if (typeof borderRadius === 'number') {
46
- radiusBorder(ctx, canvas.x || 0, canvas.y || 0, canvasWidth, canvasHeight, borderRadius);
73
+ radiusBorder(ctx, x, y, width, height, borderRadius, borderPosition);
47
74
  }
48
75
 
49
- if (canvas.customBg) {
50
- await customBackground(ctx, canvas);
51
- } else if (canvas.gradientBg) {
52
- await drawBackgroundGradient(ctx, canvas);
53
- } else {
54
- await drawBackgroundColor(ctx, canvas);
55
- }
76
+ // Option 1: translate context to (x, y) before drawing the background.
77
+ ctx.translate(x, y);
56
78
 
57
- applyStroke(ctx, canvas.stroke, canvas.x || 0, canvas.y || 0, canvasWidth, canvasHeight);
79
+ applyZoom(ctx, zoom);
58
80
 
59
- return { buffer: canvasInstance.toBuffer('image/png'), canvas }
81
+ if (customBg) {
82
+ await customBackground(ctx, canvas);
83
+ } else if (gradientBg) {
84
+ await drawBackgroundGradient(ctx, canvas);
85
+ } else {
86
+ await drawBackgroundColor(ctx, canvas);
87
+ }
88
+ // Restore state to remove the clipping region so that stroke is not clipped.
89
+ ctx.restore();
90
+
91
+ // --- Draw Stroke (Outline) ---
92
+ applyStroke(ctx, stroke, x, y, width, height);
93
+
94
+ return { buffer: canvasInstance.toBuffer('image/png'), canvas };
60
95
  }
61
96
 
62
- async createImage(images: ImageProperties[], canvasBuffer: CanvasResults | Buffer): Promise<Buffer> {
97
+ async createImage(images: ImageProperties[], canvasBuffer: CanvasResults | Buffer): Promise<Buffer> {
63
98
 
64
99
  if (!Array.isArray(images)) {
65
100
  images = [images];
@@ -301,7 +336,7 @@ async createGIF(gifFrames: { background: string; duration: number }[], options:
301
336
  }
302
337
  }
303
338
 
304
- async resize(resizeOptions: { imagePath: string | Buffer; size: { width: number; height: number } }) {
339
+ async resize(resizeOptions: ResizeOptions) {
305
340
  return resizingImg(resizeOptions)
306
341
  }
307
342
 
@@ -433,7 +468,7 @@ async createGIF(gifFrames: { background: string; duration: number }[], options:
433
468
  }
434
469
  }
435
470
 
436
- private async drawImage(ctx: any, image: ImageProperties): Promise<void> {
471
+ private async drawImage(ctx: SKRSContext2D, image: ImageProperties): Promise<void> {
437
472
  const { source, x, y, width, height, rotation, borderRadius, stroke, shadow, isFilled, color, gradient, borderPosition, opacity } = image;
438
473
 
439
474
  if (!source || typeof x !== 'number' || typeof y !== 'number' || typeof width !== 'number' || typeof height !== 'number') {
@@ -562,7 +597,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
562
597
 
563
598
  const img = await loadImage(buffer);
564
599
  const canvas = createCanvas(img.width, img.height);
565
- const ctx: any = canvas.getContext('2d');
600
+ const ctx: SKRSContext2D = canvas.getContext('2d');
566
601
  ctx.drawImage(img, 0, 0);
567
602
 
568
603
  const x = options.x || 0;
@@ -618,7 +653,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
618
653
  * @param y The y offset of the area.
619
654
  */
620
655
  async fillWithGradient(
621
- ctx: any,
656
+ ctx: SKRSContext2D,
622
657
  width: number,
623
658
  height: number,
624
659
  gradient: GradientConfig,
@@ -663,7 +698,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
663
698
  * @param y The y offset of the area.
664
699
  */
665
700
  async drawDotsPattern(
666
- ctx: any,
701
+ ctx: SKRSContext2D,
667
702
  width: number,
668
703
  height: number,
669
704
  options: PatternOptions,
@@ -695,7 +730,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
695
730
  * @param y The y offset of the area.
696
731
  */
697
732
  async drawStripesPattern(
698
- ctx: any,
733
+ ctx: SKRSContext2D,
699
734
  width: number,
700
735
  height: number,
701
736
  options: PatternOptions,
@@ -731,7 +766,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
731
766
  * @param y The y offset of the area.
732
767
  */
733
768
  async drawGridPattern(
734
- ctx: any,
769
+ ctx: SKRSContext2D,
735
770
  width: number,
736
771
  height: number,
737
772
  options: PatternOptions,
@@ -769,7 +804,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
769
804
  * @param y The y offset of the area.
770
805
  */
771
806
  async drawCheckerboardPattern(
772
- ctx: any,
807
+ ctx: SKRSContext2D,
773
808
  width: number,
774
809
  height: number,
775
810
  options: PatternOptions,
@@ -798,7 +833,7 @@ async setPatternBackground(buffer:Buffer, options: PatternOptions) {
798
833
  * @param y The y offset of the area.
799
834
  */
800
835
  async drawCustomPattern(
801
- ctx: any,
836
+ ctx: SKRSContext2D,
802
837
  width: number,
803
838
  height: number,
804
839
  options: PatternOptions,
@@ -857,7 +892,7 @@ async animate(
857
892
  const width = frame.width || defaultWidth;
858
893
  const height = frame.height || defaultHeight;
859
894
  const canvas = createCanvas(width, height);
860
- const ctx: any = canvas.getContext('2d');
895
+ const ctx: SKRSContext2D = canvas.getContext('2d');
861
896
 
862
897
  if (!isNode) {
863
898
  canvas.width = width;
@@ -923,7 +958,7 @@ async animate(
923
958
  }
924
959
 
925
960
  if (frame.onDrawCustom) {
926
- frame.onDrawCustom(ctx, canvas);
961
+ frame.onDrawCustom(ctx as unknown as CanvasRenderingContext2D, canvas);
927
962
  }
928
963
 
929
964
  if (frame.transformations) {
@@ -937,7 +972,7 @@ async animate(
937
972
 
938
973
  const frameDuration = frame.duration || defaultDuration;
939
974
  encoder.setDelay(frameDuration);
940
- encoder.addFrame(ctx);
975
+ encoder.addFrame(ctx as unknown as CanvasRenderingContext2D);
941
976
  }
942
977
 
943
978
  if (options?.onFrame) options.onFrame(i);
@@ -0,0 +1,97 @@
1
+ import { loadImage, SKRSContext2D } from "@napi-rs/canvas";
2
+ import { CanvasConfig } from '../types';
3
+ import path from 'path';
4
+
5
+
6
+ /**
7
+ * Draws a gradient background on the canvas.
8
+ * No zoom logic is applied.
9
+ * @param ctx The canvas rendering context.
10
+ * @param canvas The canvas configuration object.
11
+ */
12
+ export async function drawBackgroundGradient(ctx: SKRSContext2D, canvas: CanvasConfig): Promise<void> {
13
+ if (canvas.gradientBg) {
14
+ const {
15
+ type,
16
+ startX = 0,
17
+ startY = 0,
18
+ endX = canvas.width || 500,
19
+ endY = canvas.height || 500,
20
+ startRadius = 0,
21
+ endRadius = 0,
22
+ colors
23
+ } = canvas.gradientBg;
24
+
25
+ if (!colors || colors.length === 0) {
26
+ throw new Error('You need to provide colors for the gradient.');
27
+ }
28
+
29
+ let gradient;
30
+ if (type === 'linear' || type === undefined) {
31
+ gradient = ctx.createLinearGradient(startX, startY, endX, endY);
32
+ } else if (type === 'radial') {
33
+ gradient = ctx.createRadialGradient(startX, startY, startRadius, endX, endY, endRadius);
34
+ } else {
35
+ throw new Error('Unsupported gradient type.');
36
+ }
37
+
38
+ for (const { stop, color } of colors) {
39
+ gradient.addColorStop(stop as number, color as string);
40
+ }
41
+
42
+ const canvasWidth = canvas.width || 500;
43
+ const canvasHeight = canvas.height || 500;
44
+ ctx.fillStyle = gradient;
45
+ ctx.fillRect(0, 0, canvasWidth, canvasHeight);
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Draws a solid background color on the canvas.
51
+ * No zoom logic is applied.
52
+ * @param ctx The canvas rendering context.
53
+ * @param canvas The canvas configuration object.
54
+ */
55
+ export async function drawBackgroundColor(ctx: SKRSContext2D, canvas: CanvasConfig): Promise<void> {
56
+ const canvasWidth = canvas.width || 500;
57
+ const canvasHeight = canvas.height || 500;
58
+
59
+ // Fill the entire area starting at (0,0) (assuming translation is handled elsewhere)
60
+ if (canvas.colorBg !== 'transparent') {
61
+ ctx.fillStyle = canvas.colorBg as string;
62
+ ctx.fillRect(0, 0, canvasWidth, canvasHeight);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Draws a custom background image on the canvas.
68
+ * No zoom logic is applied.
69
+ * @param ctx The canvas rendering context.
70
+ * @param canvas The canvas configuration object.
71
+ */
72
+ export async function customBackground(ctx: SKRSContext2D, canvas: CanvasConfig): Promise<void> {
73
+ if (canvas.customBg) {
74
+ try {
75
+ let imageBuffer: string;
76
+
77
+ if (canvas.customBg.startsWith('http')) {
78
+ imageBuffer = canvas.customBg;
79
+ } else {
80
+ imageBuffer = path.join(process.cwd(), canvas.customBg);
81
+ }
82
+
83
+ const image = await loadImage(imageBuffer);
84
+
85
+ // Use canvas dimensions without additional x/y translation,
86
+ // because createCanvas already translated the context.
87
+ const canvasWidth = canvas.width || image.width;
88
+ const canvasHeight = canvas.height || image.height;
89
+
90
+ // Draw the image so that it fills the canvas area relative to (0,0)
91
+ ctx.drawImage(image, 0, 0, canvasWidth, canvasHeight);
92
+
93
+ } catch (error: any) {
94
+ console.error('Error loading custom background image:', error.message);
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,17 @@
1
+ import { SKRSContext2D } from "@napi-rs/canvas";
2
+
3
+ export function circularBorder(
4
+ ctx: SKRSContext2D,
5
+ width: number,
6
+ height: number,
7
+ radius: number = 0
8
+ ): void {
9
+ const minDimension = Math.min(width, height);
10
+ const clipRadius = minDimension / 2 + radius;
11
+ ctx.save();
12
+ ctx.beginPath();
13
+ ctx.arc(width / 2, height / 2, clipRadius, 0, Math.PI * 2);
14
+ ctx.closePath();
15
+ ctx.clip();
16
+ }
17
+
@@ -0,0 +1,113 @@
1
+ import { SKRSContext2D } from "@napi-rs/canvas";
2
+
3
+ /**
4
+ * Applies a radius border (clipping path) to the canvas context with support for selective corner rounding.
5
+ *
6
+ * @param ctx The canvas rendering context.
7
+ * @param x The x-coordinate of the rectangle.
8
+ * @param y The y-coordinate of the rectangle.
9
+ * @param width The width of the rectangle.
10
+ * @param height The height of the rectangle.
11
+ * @param radius The radius for rounding the corners.
12
+ * @param borderPosition Which corners to round. Valid values include:
13
+ * - "all" (default)
14
+ * - "top", "bottom", "left", "right"
15
+ * - "top-left", "top-right", "bottom-left", "bottom-right"
16
+ * - A comma-separated list, e.g. "top, left, bottom" (for three sides) or "top-left, bottom-right"
17
+ */
18
+ export function radiusBorder(
19
+ ctx: SKRSContext2D,
20
+ x: number = 0,
21
+ y: number = 0,
22
+ width: number,
23
+ height: number,
24
+ radius: number = 0,
25
+ borderPosition: string = 'all'
26
+ ): void {
27
+ // Limit the radius to at most half the smallest dimension.
28
+ const minDimension = Math.min(width, height);
29
+ const maxRadius = minDimension / 2;
30
+ const clipRadius = Math.min(radius, maxRadius);
31
+
32
+ // Determine which corners should be rounded.
33
+ let roundTopLeft = false;
34
+ let roundTopRight = false;
35
+ let roundBottomRight = false;
36
+ let roundBottomLeft = false;
37
+
38
+ const bp = borderPosition.trim().toLowerCase();
39
+
40
+ // Simple keyword cases.
41
+ if (bp === 'all') {
42
+ roundTopLeft = roundTopRight = roundBottomRight = roundBottomLeft = true;
43
+ } else if (bp === 'top') {
44
+ roundTopLeft = roundTopRight = true;
45
+ } else if (bp === 'bottom') {
46
+ roundBottomLeft = roundBottomRight = true;
47
+ } else if (bp === 'left') {
48
+ roundTopLeft = roundBottomLeft = true;
49
+ } else if (bp === 'right') {
50
+ roundTopRight = roundBottomRight = true;
51
+ } else if (bp === 'top-left') {
52
+ roundTopLeft = true;
53
+ } else if (bp === 'top-right') {
54
+ roundTopRight = true;
55
+ } else if (bp === 'bottom-left') {
56
+ roundBottomLeft = true;
57
+ } else if (bp === 'bottom-right') {
58
+ roundBottomRight = true;
59
+ } else {
60
+ // For comma-separated lists.
61
+ const positions = bp.split(',').map(s => s.trim());
62
+ roundTopLeft =
63
+ positions.includes('top-left') || (positions.includes('top') && positions.includes('left'));
64
+ roundTopRight =
65
+ positions.includes('top-right') || (positions.includes('top') && positions.includes('right'));
66
+ roundBottomRight =
67
+ positions.includes('bottom-right') || (positions.includes('bottom') && positions.includes('right'));
68
+ roundBottomLeft =
69
+ positions.includes('bottom-left') || (positions.includes('bottom') && positions.includes('left'));
70
+ }
71
+
72
+ // Determine the effective radius for each corner.
73
+ const tl = roundTopLeft ? clipRadius : 0;
74
+ const tr = roundTopRight ? clipRadius : 0;
75
+ const br = roundBottomRight ? clipRadius : 0;
76
+ const bl = roundBottomLeft ? clipRadius : 0;
77
+
78
+ ctx.save();
79
+ ctx.beginPath();
80
+ // Start at top-left.
81
+ ctx.moveTo(x + tl, y);
82
+ // Top edge: move to top-right.
83
+ ctx.lineTo(x + width - tr, y);
84
+ if (tr > 0) {
85
+ ctx.quadraticCurveTo(x + width, y, x + width, y + tr);
86
+ } else {
87
+ ctx.lineTo(x + width, y);
88
+ }
89
+ // Right edge: move to bottom-right.
90
+ ctx.lineTo(x + width, y + height - br);
91
+ if (br > 0) {
92
+ ctx.quadraticCurveTo(x + width, y + height, x + width - br, y + height);
93
+ } else {
94
+ ctx.lineTo(x + width, y + height);
95
+ }
96
+ // Bottom edge: move to bottom-left.
97
+ ctx.lineTo(x + bl, y + height);
98
+ if (bl > 0) {
99
+ ctx.quadraticCurveTo(x, y + height, x, y + height - bl);
100
+ } else {
101
+ ctx.lineTo(x, y + height);
102
+ }
103
+ // Left edge: move back to top-left.
104
+ ctx.lineTo(x, y + tl);
105
+ if (tl > 0) {
106
+ ctx.quadraticCurveTo(x, y, x + tl, y);
107
+ } else {
108
+ ctx.lineTo(x, y);
109
+ }
110
+ ctx.closePath();
111
+ ctx.clip();
112
+ // Note: We do not call ctx.restore() here because we want the clipping region to remain.
113
+ }
@@ -1,5 +1,5 @@
1
1
  import { createCanvas, loadImage } from '@napi-rs/canvas';
2
- import { barChart_1, bgConfig, DataItem, KeyBoxConfig, PieDataConfig, PieChartData, LineChartConfig, DataPoint } from "./types";
2
+ import { barChart_1, bgConfig, DataItem, KeyBoxConfig, PieDataConfig, PieChartData, LineChartConfig, DataPoint } from "../types";
3
3
  import path from 'path';
4
4
 
5
5
 
@@ -1,4 +1,4 @@
1
- import { CustomOptions } from "./types";
1
+ import { CustomOptions } from "../types";
2
2
 
3
3
  export function customLines(ctx: any, options: CustomOptions[]) {
4
4
  let previousEndCoordinates = null;
@@ -8,7 +8,7 @@ import { ImgurClient } from "imgur";
8
8
  accessToken: "ad06eacb7c7228d8f482d2db20f490d649f58e52",
9
9
  refreshToken: "57fd64eeca315fcd25584fbbde91950bf17a7f5e"
10
10
  });
11
-
11
+
12
12
  const response = await client.upload({
13
13
  image: base64(buffer),
14
14
  type: 'base64',