oxygen-cli 1.25.0 → 1.27.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 (269) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/core/OxygenCore.js +266 -37
  3. package/build/core/OxygenEvents.js +11 -1
  4. package/build/core/OxygenModule.js +14 -1
  5. package/build/core/OxygenService.js +12 -1
  6. package/build/core/OxygenSubModule.js +10 -1
  7. package/build/core/WebDriverModule.js +30 -1
  8. package/build/core/utils.js +17 -1
  9. package/build/errors/HookError.js +7 -1
  10. package/build/errors/ModuleError.js +7 -1
  11. package/build/errors/ModuleUnavailableError.js +3 -1
  12. package/build/errors/OxygenError.js +33 -1
  13. package/build/errors/ScriptNotFound.js +7 -1
  14. package/build/errors/helper.js +77 -45
  15. package/build/index.js +18 -6
  16. package/build/lib/cli-util.js +90 -28
  17. package/build/lib/cli.js +23 -1
  18. package/build/lib/debugger.js +144 -1
  19. package/build/lib/img-merge.js +15 -1
  20. package/build/lib/launcher.js +28 -1
  21. package/build/lib/moduleRequire.js +4 -1
  22. package/build/lib/param-manager.js +28 -1
  23. package/build/lib/param-reader-csv.js +15 -1
  24. package/build/lib/param-reader-excel.js +14 -1
  25. package/build/lib/param-reader-json.js +10 -1
  26. package/build/lib/text-to-image.js +183 -0
  27. package/build/lib/util.js +58 -3
  28. package/build/model/case-result.js +4 -2
  29. package/build/model/failure.js +2 -1
  30. package/build/model/status.js +2 -1
  31. package/build/model/step-result.js +2 -1
  32. package/build/model/suite-result.js +2 -1
  33. package/build/model/test-result.js +2 -1
  34. package/build/model/testcase.js +2 -1
  35. package/build/model/testsuite.js +2 -1
  36. package/build/ox_modules/index.js +33 -13
  37. package/build/ox_modules/module-assert.js +24 -8
  38. package/build/ox_modules/module-date.js +8 -3
  39. package/build/ox_modules/module-db.js +28 -7
  40. package/build/ox_modules/module-email.js +36 -10
  41. package/build/ox_modules/module-eyes.js +46 -5
  42. package/build/ox_modules/module-http.js +102 -41
  43. package/build/ox_modules/module-log.js +22 -5
  44. package/build/ox_modules/module-mailinator.js +32 -10
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
  48. package/build/ox_modules/module-mob/commands/assertText.js +3 -1
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
  50. package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
  51. package/build/ox_modules/module-mob/commands/back.js +2 -1
  52. package/build/ox_modules/module-mob/commands/clear.js +4 -1
  53. package/build/ox_modules/module-mob/commands/click.js +4 -3
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
  55. package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
  57. package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
  61. package/build/ox_modules/module-mob/commands/execute.js +2 -1
  62. package/build/ox_modules/module-mob/commands/findElement.js +3 -1
  63. package/build/ox_modules/module-mob/commands/findElements.js +4 -1
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
  71. package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
  72. package/build/ox_modules/module-mob/commands/getSource.js +2 -1
  73. package/build/ox_modules/module-mob/commands/getText.js +4 -1
  74. package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
  75. package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
  76. package/build/ox_modules/module-mob/commands/getValue.js +9 -5
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
  79. package/build/ox_modules/module-mob/commands/index.js +94 -19
  80. package/build/ox_modules/module-mob/commands/installApp.js +2 -1
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
  83. package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
  84. package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
  85. package/build/ox_modules/module-mob/commands/isExist.js +3 -1
  86. package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
  87. package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
  89. package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
  91. package/build/ox_modules/module-mob/commands/open.js +3 -1
  92. package/build/ox_modules/module-mob/commands/pause.js +2 -1
  93. package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
  94. package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
  97. package/build/ox_modules/module-mob/commands/select.js +4 -1
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
  101. package/build/ox_modules/module-mob/commands/setContext.js +2 -1
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
  105. package/build/ox_modules/module-mob/commands/shake.js +2 -1
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
  108. package/build/ox_modules/module-mob/commands/swipe.js +2 -1
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
  112. package/build/ox_modules/module-mob/commands/tap.js +2 -1
  113. package/build/ox_modules/module-mob/commands/type.js +7 -3
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
  118. package/build/ox_modules/module-mob.js +141 -72
  119. package/build/ox_modules/module-pdf.js +62 -23
  120. package/build/ox_modules/module-proxy.js +68 -8
  121. package/build/ox_modules/module-serial.js +32 -7
  122. package/build/ox_modules/module-shell.js +27 -8
  123. package/build/ox_modules/module-soap.js +47 -14
  124. package/build/ox_modules/module-twilio.js +53 -10
  125. package/build/ox_modules/module-utils.js +51 -16
  126. package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
  128. package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
  129. package/build/ox_modules/module-web/commands/assertExist.js +2 -1
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
  132. package/build/ox_modules/module-web/commands/assertText.js +3 -1
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
  135. package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
  136. package/build/ox_modules/module-web/commands/assertValue.js +3 -1
  137. package/build/ox_modules/module-web/commands/back.js +2 -1
  138. package/build/ox_modules/module-web/commands/clear.js +5 -1
  139. package/build/ox_modules/module-web/commands/click.js +13 -4
  140. package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
  141. package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
  144. package/build/ox_modules/module-web/commands/deselect.js +2 -1
  145. package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
  147. package/build/ox_modules/module-web/commands/execute.js +2 -1
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
  149. package/build/ox_modules/module-web/commands/findElement.js +3 -1
  150. package/build/ox_modules/module-web/commands/findElements.js +4 -1
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
  152. package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
  153. package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
  155. package/build/ox_modules/module-web/commands/getCookies.js +2 -1
  156. package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
  157. package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
  158. package/build/ox_modules/module-web/commands/getHTML.js +2 -1
  159. package/build/ox_modules/module-web/commands/getSource.js +2 -1
  160. package/build/ox_modules/module-web/commands/getText.js +4 -1
  161. package/build/ox_modules/module-web/commands/getTitle.js +2 -1
  162. package/build/ox_modules/module-web/commands/getUrl.js +2 -1
  163. package/build/ox_modules/module-web/commands/getValue.js +5 -1
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
  167. package/build/ox_modules/module-web/commands/index.js +100 -19
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
  169. package/build/ox_modules/module-web/commands/isChecked.js +2 -1
  170. package/build/ox_modules/module-web/commands/isExist.js +3 -1
  171. package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
  172. package/build/ox_modules/module-web/commands/isSelected.js +2 -1
  173. package/build/ox_modules/module-web/commands/isVisible.js +3 -1
  174. package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
  177. package/build/ox_modules/module-web/commands/newWindow.js +2 -1
  178. package/build/ox_modules/module-web/commands/open.js +4 -1
  179. package/build/ox_modules/module-web/commands/pause.js +2 -1
  180. package/build/ox_modules/module-web/commands/point.js +2 -1
  181. package/build/ox_modules/module-web/commands/pointJS.js +8 -2
  182. package/build/ox_modules/module-web/commands/refresh.js +2 -1
  183. package/build/ox_modules/module-web/commands/rightClick.js +8 -3
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
  186. package/build/ox_modules/module-web/commands/select.js +5 -1
  187. package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
  188. package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
  189. package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
  194. package/build/ox_modules/module-web/commands/type.js +5 -1
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
  196. package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -1
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
  205. package/build/ox_modules/module-web.js +181 -82
  206. package/build/ox_modules/module-win/commands/assertText.js +3 -1
  207. package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
  208. package/build/ox_modules/module-win/commands/assertValue.js +15 -9
  209. package/build/ox_modules/module-win/commands/back.js +2 -1
  210. package/build/ox_modules/module-win/commands/clear.js +4 -1
  211. package/build/ox_modules/module-win/commands/click.js +2 -1
  212. package/build/ox_modules/module-win/commands/clickLong.js +2 -1
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
  214. package/build/ox_modules/module-win/commands/findElement.js +3 -1
  215. package/build/ox_modules/module-win/commands/findElements.js +4 -1
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
  218. package/build/ox_modules/module-win/commands/getLocation.js +2 -1
  219. package/build/ox_modules/module-win/commands/getSource.js +2 -1
  220. package/build/ox_modules/module-win/commands/getText.js +4 -1
  221. package/build/ox_modules/module-win/commands/getValue.js +9 -5
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
  223. package/build/ox_modules/module-win/commands/index.js +43 -5
  224. package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
  225. package/build/ox_modules/module-win/commands/isChecked.js +2 -1
  226. package/build/ox_modules/module-win/commands/isClickable.js +2 -1
  227. package/build/ox_modules/module-win/commands/isExist.js +3 -1
  228. package/build/ox_modules/module-win/commands/isSelected.js +2 -1
  229. package/build/ox_modules/module-win/commands/isVisible.js +3 -1
  230. package/build/ox_modules/module-win/commands/open.js +2 -1
  231. package/build/ox_modules/module-win/commands/pause.js +2 -1
  232. package/build/ox_modules/module-win/commands/rightClick.js +2 -1
  233. package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
  234. package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
  235. package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
  237. package/build/ox_modules/module-win/commands/tap.js +2 -1
  238. package/build/ox_modules/module-win/commands/type.js +4 -1
  239. package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
  242. package/build/ox_modules/module-win.js +87 -48
  243. package/build/ox_modules/utils.js +76 -22
  244. package/build/ox_reporters/reporter-excel.js +58 -1
  245. package/build/ox_reporters/reporter-html.js +28 -1
  246. package/build/ox_reporters/reporter-json.js +14 -1
  247. package/build/ox_reporters/reporter-junit.js +24 -1
  248. package/build/ox_reporters/reporter-pdf.js +19 -1
  249. package/build/ox_reporters/reporter-xml.js +17 -1
  250. package/build/ox_services/service-devtools/submodule-network.js +91 -4
  251. package/build/ox_services/service-devtools.js +23 -1
  252. package/build/reporter/FileReporterBase.js +44 -5
  253. package/build/reporter/ReportAggregator.js +65 -1
  254. package/build/reporter/ReporterBase.js +6 -1
  255. package/build/runners/WorkerProcess.js +99 -1
  256. package/build/runners/cucumber/CucumberEventListener.js +29 -4
  257. package/build/runners/cucumber/CucumberReporter.js +56 -1
  258. package/build/runners/cucumber/CucumberWorker.js +66 -1
  259. package/build/runners/cucumber/index.js +30 -1
  260. package/build/runners/cucumber/worker.js +18 -1
  261. package/build/runners/index.js +6 -1
  262. package/build/runners/oxygen/OxygenWorker.js +60 -3
  263. package/build/runners/oxygen/index.js +178 -17
  264. package/build/runners/oxygen/worker.js +25 -2
  265. package/package.json +8 -8
  266. package/.babelrc +0 -28
  267. package/.eslintrc.json +0 -25
  268. package/.husky/pre-commit +0 -4
  269. package/CONTRIBUTE.md +0 -1
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+
3
+ require("source-map-support/register");
4
+
5
+ const {
6
+ createCanvas,
7
+ registerFont
8
+ } = require('canvas');
9
+
10
+ const defaults = {
11
+ bgColor: '#fff',
12
+ customHeight: 0,
13
+ bubbleTail: {
14
+ width: 0,
15
+ height: 0
16
+ },
17
+ fontFamily: 'Arial',
18
+ fontPath: '',
19
+ fontSize: 18,
20
+ fontWeight: 'normal',
21
+ lineHeight: 28,
22
+ margin: 10,
23
+ maxWidth: 400,
24
+ textAlign: 'left',
25
+ textColor: '#000',
26
+ verticalAlign: 'top'
27
+ };
28
+
29
+ const createTextData = (text, config, canvas) => {
30
+ const {
31
+ bgColor,
32
+ fontFamily,
33
+ fontPath,
34
+ fontSize,
35
+ fontWeight,
36
+ lineHeight,
37
+ maxWidth,
38
+ textAlign,
39
+ textColor
40
+ } = config;
41
+
42
+ if (fontPath) {
43
+ registerFont(fontPath, {
44
+ family: fontFamily
45
+ });
46
+ }
47
+
48
+ const textCanvas = canvas || createCanvas(maxWidth, 100);
49
+ const textContext = textCanvas.getContext('2d');
50
+ let textX = 0;
51
+ let textY = 0;
52
+
53
+ if (['center'].includes(textAlign.toLowerCase())) {
54
+ textX = maxWidth / 2;
55
+ }
56
+
57
+ if (['right', 'end'].includes(textAlign.toLowerCase())) {
58
+ textX = maxWidth;
59
+ }
60
+
61
+ textContext.textAlign = textAlign;
62
+ textContext.fillStyle = bgColor;
63
+ textContext.fillRect(0, 0, textCanvas.width, textCanvas.height);
64
+ textContext.fillStyle = textColor;
65
+ textContext.font = `${fontWeight} ${fontSize}px ${fontFamily}`;
66
+ textContext.textBaseline = 'top';
67
+ const words = text.split(' ');
68
+ let wordCount = words.length;
69
+ let line = '';
70
+ const addNewLines = [];
71
+
72
+ for (let n = 0; n < wordCount; n += 1) {
73
+ let word = words[n];
74
+
75
+ if (/\n/.test(words[n])) {
76
+ const parts = words[n].split('\n');
77
+ word = parts.shift() || '';
78
+ addNewLines.push(n + 1);
79
+ words.splice(n + 1, 0, parts.join('\n'));
80
+ wordCount += 1;
81
+ }
82
+
83
+ const testLine = `${line} ${word}`.replace(/^ +/, '').replace(/ +$/, '');
84
+ const testLineWidth = textContext.measureText(testLine).width;
85
+
86
+ if (addNewLines.indexOf(n) > -1 || testLineWidth > maxWidth && n > 0) {
87
+ textContext.fillText(line, textX, textY);
88
+ line = word;
89
+ textY += lineHeight;
90
+ } else {
91
+ line = testLine;
92
+ }
93
+ }
94
+
95
+ textContext.fillText(line, textX, textY);
96
+ const height = textY + Math.max(lineHeight, fontSize);
97
+ return {
98
+ textHeight: height,
99
+ textData: textContext.getImageData(0, 0, maxWidth, height)
100
+ };
101
+ };
102
+
103
+ const createImageCanvas = (content, conf) => {
104
+ const {
105
+ textHeight
106
+ } = createTextData(content, {
107
+ maxWidth: conf.maxWidth - conf.margin * 2,
108
+ fontSize: conf.fontSize,
109
+ lineHeight: conf.lineHeight,
110
+ bgColor: conf.bgColor,
111
+ textColor: conf.textColor,
112
+ fontFamily: conf.fontFamily,
113
+ fontPath: conf.fontPath,
114
+ fontWeight: conf.fontWeight,
115
+ textAlign: conf.textAlign
116
+ });
117
+ const textHeightWithMargins = textHeight + conf.margin * 2;
118
+
119
+ if (conf.customHeight && conf.customHeight < textHeightWithMargins) {
120
+ console.warn('Text is longer than customHeight, clipping will occur.');
121
+ }
122
+
123
+ const height = conf.customHeight || textHeightWithMargins;
124
+ const canvas = createCanvas(conf.maxWidth, height + conf.bubbleTail.height);
125
+ const {
126
+ textData
127
+ } = createTextData(content, {
128
+ maxWidth: conf.maxWidth - conf.margin * 2,
129
+ fontSize: conf.fontSize,
130
+ lineHeight: conf.lineHeight,
131
+ bgColor: conf.bgColor,
132
+ textColor: conf.textColor,
133
+ fontFamily: conf.fontFamily,
134
+ fontPath: conf.fontPath,
135
+ fontWeight: conf.fontWeight,
136
+ textAlign: conf.textAlign
137
+ }, canvas);
138
+ const ctx = canvas.getContext('2d');
139
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
140
+ ctx.globalAlpha = 1;
141
+ ctx.fillStyle = conf.bgColor;
142
+ ctx.fillRect(0, 0, canvas.width, height);
143
+
144
+ if (conf.bubbleTail.width && conf.bubbleTail.height) {
145
+ ctx.beginPath();
146
+ ctx.moveTo(canvas.width / 2 - conf.bubbleTail.width / 2, height);
147
+ ctx.lineTo(canvas.width / 2, canvas.height);
148
+ ctx.lineTo(canvas.width / 2 + conf.bubbleTail.width / 2, height);
149
+ ctx.closePath();
150
+ ctx.fillStyle = conf.bgColor;
151
+ ctx.fill();
152
+ }
153
+
154
+ const textX = conf.margin;
155
+ let textY = conf.margin;
156
+
157
+ if (conf.customHeight && conf.verticalAlign === 'center') {
158
+ textY = (conf.customHeight - textData.height) / 2 + Math.max(0, (conf.lineHeight - conf.fontSize) / 2);
159
+ }
160
+
161
+ ctx.putImageData(textData, textX, textY);
162
+ return canvas;
163
+ };
164
+
165
+ const generate = async (content, config) => {
166
+ const conf = { ...defaults,
167
+ ...config
168
+ };
169
+ const canvas = createImageCanvas(content, conf);
170
+ return canvas.toDataURL();
171
+ };
172
+
173
+ const generateSync = (content, config) => {
174
+ const conf = { ...defaults,
175
+ ...config
176
+ };
177
+ const canvas = createImageCanvas(content, conf);
178
+ return canvas.toDataURL();
179
+ };
180
+
181
+ exports.generate = generate;
182
+ exports.generateSync = generateSync;
183
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdGV4dC10by1pbWFnZS5qcyJdLCJuYW1lcyI6WyJjcmVhdGVDYW52YXMiLCJyZWdpc3RlckZvbnQiLCJyZXF1aXJlIiwiZGVmYXVsdHMiLCJiZ0NvbG9yIiwiY3VzdG9tSGVpZ2h0IiwiYnViYmxlVGFpbCIsIndpZHRoIiwiaGVpZ2h0IiwiZm9udEZhbWlseSIsImZvbnRQYXRoIiwiZm9udFNpemUiLCJmb250V2VpZ2h0IiwibGluZUhlaWdodCIsIm1hcmdpbiIsIm1heFdpZHRoIiwidGV4dEFsaWduIiwidGV4dENvbG9yIiwidmVydGljYWxBbGlnbiIsImNyZWF0ZVRleHREYXRhIiwidGV4dCIsImNvbmZpZyIsImNhbnZhcyIsImZhbWlseSIsInRleHRDYW52YXMiLCJ0ZXh0Q29udGV4dCIsImdldENvbnRleHQiLCJ0ZXh0WCIsInRleHRZIiwiaW5jbHVkZXMiLCJ0b0xvd2VyQ2FzZSIsImZpbGxTdHlsZSIsImZpbGxSZWN0IiwiZm9udCIsInRleHRCYXNlbGluZSIsIndvcmRzIiwic3BsaXQiLCJ3b3JkQ291bnQiLCJsZW5ndGgiLCJsaW5lIiwiYWRkTmV3TGluZXMiLCJuIiwid29yZCIsInRlc3QiLCJwYXJ0cyIsInNoaWZ0IiwicHVzaCIsInNwbGljZSIsImpvaW4iLCJ0ZXN0TGluZSIsInJlcGxhY2UiLCJ0ZXN0TGluZVdpZHRoIiwibWVhc3VyZVRleHQiLCJpbmRleE9mIiwiZmlsbFRleHQiLCJNYXRoIiwibWF4IiwidGV4dEhlaWdodCIsInRleHREYXRhIiwiZ2V0SW1hZ2VEYXRhIiwiY3JlYXRlSW1hZ2VDYW52YXMiLCJjb250ZW50IiwiY29uZiIsInRleHRIZWlnaHRXaXRoTWFyZ2lucyIsImNvbnNvbGUiLCJ3YXJuIiwiY3R4IiwiY2xlYXJSZWN0IiwiZ2xvYmFsQWxwaGEiLCJiZWdpblBhdGgiLCJtb3ZlVG8iLCJsaW5lVG8iLCJjbG9zZVBhdGgiLCJmaWxsIiwicHV0SW1hZ2VEYXRhIiwiZ2VuZXJhdGUiLCJ0b0Rh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O0FBTUFFLE9BQU8sQ0FBQ0gsUUFBUixHQUFtQkEsUUFBbkI7QUFDQUcsT0FBTyxDQUFDRCxZQUFSLEdBQXVCQSxZQUF2QiIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHsgY3JlYXRlQ2FudmFzLCByZWdpc3RlckZvbnQgfSA9IHJlcXVpcmUoJ2NhbnZhcycpO1xyXG5cclxuLy8gdGhpcyBpcyB0ZXh0LXRvLWltYWdlIHY1LjIgcGFja2FnZSBpbmNsdWRlZCBkaXJlY3RseSBpbiBveHlnZW4gZm9yIGVhc2llciBjb250cm9sIG92ZXIgY2FudmFzIGFuZCBuYW4gdmVyc2lvbnNcclxuXHJcbmNvbnN0IGRlZmF1bHRzID0ge1xyXG4gICAgYmdDb2xvcjogJyNmZmYnLFxyXG4gICAgY3VzdG9tSGVpZ2h0OiAwLFxyXG4gICAgYnViYmxlVGFpbDogeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sXHJcbiAgICBmb250RmFtaWx5OiAnQXJpYWwnLFxyXG4gICAgZm9udFBhdGg6ICcnLFxyXG4gICAgZm9udFNpemU6IDE4LFxyXG4gICAgZm9udFdlaWdodDogJ25vcm1hbCcsXHJcbiAgICBsaW5lSGVpZ2h0OiAyOCxcclxuICAgIG1hcmdpbjogMTAsXHJcbiAgICBtYXhXaWR0aDogNDAwLFxyXG4gICAgdGV4dEFsaWduOiAnbGVmdCcsXHJcbiAgICB0ZXh0Q29sb3I6ICcjMDAwJyxcclxuICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnLFxyXG59O1xyXG5cclxuY29uc3QgY3JlYXRlVGV4dERhdGEgPSAodGV4dCwgY29uZmlnLCBjYW52YXMpID0+IHtcclxuICAgIGNvbnN0IHsgYmdDb2xvciwgZm9udEZhbWlseSwgZm9udFBhdGgsIGZvbnRTaXplLCBmb250V2VpZ2h0LCBsaW5lSGVpZ2h0LCBtYXhXaWR0aCwgdGV4dEFsaWduLCB0ZXh0Q29sb3IsIH0gPSBjb25maWc7XHJcbiAgICBpZiAoZm9udFBhdGgpIHtcclxuICAgICAgICByZWdpc3RlckZvbnQoZm9udFBhdGgsIHsgZmFtaWx5OiBmb250RmFtaWx5IH0pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGV4dENhbnZhcyA9IGNhbnZhcyB8fCBjcmVhdGVDYW52YXMobWF4V2lkdGgsIDEwMCk7XHJcbiAgICBjb25zdCB0ZXh0Q29udGV4dCA9IHRleHRDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIGxldCB0ZXh0WCA9IDA7XHJcbiAgICBsZXQgdGV4dFkgPSAwO1xyXG4gICAgaWYgKFsnY2VudGVyJ10uaW5jbHVkZXModGV4dEFsaWduLnRvTG93ZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgdGV4dFggPSBtYXhXaWR0aCAvIDI7XHJcbiAgICB9XHJcbiAgICBpZiAoWydyaWdodCcsICdlbmQnXS5pbmNsdWRlcyh0ZXh0QWxpZ24udG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICB0ZXh0WCA9IG1heFdpZHRoO1xyXG4gICAgfVxyXG4gICAgdGV4dENvbnRleHQudGV4dEFsaWduID0gdGV4dEFsaWduO1xyXG4gICAgdGV4dENvbnRleHQuZmlsbFN0eWxlID0gYmdDb2xvcjtcclxuICAgIHRleHRDb250ZXh0LmZpbGxSZWN0KDAsIDAsIHRleHRDYW52YXMud2lkdGgsIHRleHRDYW52YXMuaGVpZ2h0KTtcclxuICAgIHRleHRDb250ZXh0LmZpbGxTdHlsZSA9IHRleHRDb2xvcjtcclxuICAgIHRleHRDb250ZXh0LmZvbnQgPSBgJHtmb250V2VpZ2h0fSAke2ZvbnRTaXplfXB4ICR7Zm9udEZhbWlseX1gO1xyXG4gICAgdGV4dENvbnRleHQudGV4dEJhc2VsaW5lID0gJ3RvcCc7XHJcbiAgICBjb25zdCB3b3JkcyA9IHRleHQuc3BsaXQoJyAnKTtcclxuICAgIGxldCB3b3JkQ291bnQgPSB3b3Jkcy5sZW5ndGg7XHJcbiAgICBsZXQgbGluZSA9ICcnO1xyXG4gICAgY29uc3QgYWRkTmV3TGluZXMgPSBbXTtcclxuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgd29yZENvdW50OyBuICs9IDEpIHtcclxuICAgICAgICBsZXQgd29yZCA9IHdvcmRzW25dO1xyXG4gICAgICAgIGlmICgvXFxuLy50ZXN0KHdvcmRzW25dKSkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHdvcmRzW25dLnNwbGl0KCdcXG4nKTtcclxuICAgICAgICAgICAgd29yZCA9IHBhcnRzLnNoaWZ0KCkgfHwgJyc7XHJcbiAgICAgICAgICAgIGFkZE5ld0xpbmVzLnB1c2gobiArIDEpO1xyXG4gICAgICAgICAgICB3b3Jkcy5zcGxpY2UobiArIDEsIDAsIHBhcnRzLmpvaW4oJ1xcbicpKTtcclxuICAgICAgICAgICAgd29yZENvdW50ICs9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRlc3RMaW5lID0gYCR7bGluZX0gJHt3b3JkfWAucmVwbGFjZSgvXiArLywgJycpLnJlcGxhY2UoLyArJC8sICcnKTtcclxuICAgICAgICBjb25zdCB0ZXN0TGluZVdpZHRoID0gdGV4dENvbnRleHQubWVhc3VyZVRleHQodGVzdExpbmUpLndpZHRoO1xyXG4gICAgICAgIGlmIChhZGROZXdMaW5lcy5pbmRleE9mKG4pID4gLTEgfHwgKHRlc3RMaW5lV2lkdGggPiBtYXhXaWR0aCAmJiBuID4gMCkpIHtcclxuICAgICAgICAgICAgdGV4dENvbnRleHQuZmlsbFRleHQobGluZSwgdGV4dFgsIHRleHRZKTtcclxuICAgICAgICAgICAgbGluZSA9IHdvcmQ7XHJcbiAgICAgICAgICAgIHRleHRZICs9IGxpbmVIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsaW5lID0gdGVzdExpbmU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGV4dENvbnRleHQuZmlsbFRleHQobGluZSwgdGV4dFgsIHRleHRZKTtcclxuICAgIGNvbnN0IGhlaWdodCA9IHRleHRZICsgTWF0aC5tYXgobGluZUhlaWdodCwgZm9udFNpemUpO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB0ZXh0SGVpZ2h0OiBoZWlnaHQsXHJcbiAgICAgICAgdGV4dERhdGE6IHRleHRDb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCBtYXhXaWR0aCwgaGVpZ2h0KSxcclxuICAgIH07XHJcbn07XHJcblxyXG5jb25zdCBjcmVhdGVJbWFnZUNhbnZhcyA9IChjb250ZW50LCBjb25mKSA9PiB7XHJcbiAgICBjb25zdCB7IHRleHRIZWlnaHQgfSA9IGNyZWF0ZVRleHREYXRhKGNvbnRlbnQsIHtcclxuICAgICAgICBtYXhXaWR0aDogY29uZi5tYXhXaWR0aCAtIGNvbmYubWFyZ2luICogMixcclxuICAgICAgICBmb250U2l6ZTogY29uZi5mb250U2l6ZSxcclxuICAgICAgICBsaW5lSGVpZ2h0OiBjb25mLmxpbmVIZWlnaHQsXHJcbiAgICAgICAgYmdDb2xvcjogY29uZi5iZ0NvbG9yLFxyXG4gICAgICAgIHRleHRDb2xvcjogY29uZi50ZXh0Q29sb3IsXHJcbiAgICAgICAgZm9udEZhbWlseTogY29uZi5mb250RmFtaWx5LFxyXG4gICAgICAgIGZvbnRQYXRoOiBjb25mLmZvbnRQYXRoLFxyXG4gICAgICAgIGZvbnRXZWlnaHQ6IGNvbmYuZm9udFdlaWdodCxcclxuICAgICAgICB0ZXh0QWxpZ246IGNvbmYudGV4dEFsaWduLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCB0ZXh0SGVpZ2h0V2l0aE1hcmdpbnMgPSB0ZXh0SGVpZ2h0ICsgY29uZi5tYXJnaW4gKiAyO1xyXG4gICAgaWYgKGNvbmYuY3VzdG9tSGVpZ2h0ICYmIGNvbmYuY3VzdG9tSGVpZ2h0IDwgdGV4dEhlaWdodFdpdGhNYXJnaW5zKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdUZXh0IGlzIGxvbmdlciB0aGFuIGN1c3RvbUhlaWdodCwgY2xpcHBpbmcgd2lsbCBvY2N1ci4nKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGhlaWdodCA9IGNvbmYuY3VzdG9tSGVpZ2h0IHx8IHRleHRIZWlnaHRXaXRoTWFyZ2lucztcclxuICAgIGNvbnN0IGNhbnZhcyA9IGNyZWF0ZUNhbnZhcyhjb25mLm1heFdpZHRoLCBoZWlnaHQgKyBjb25mLmJ1YmJsZVRhaWwuaGVpZ2h0KTtcclxuICAgIGNvbnN0IHsgdGV4dERhdGEgfSA9IGNyZWF0ZVRleHREYXRhKGNvbnRlbnQsIHtcclxuICAgICAgICBtYXhXaWR0aDogY29uZi5tYXhXaWR0aCAtIGNvbmYubWFyZ2luICogMixcclxuICAgICAgICBmb250U2l6ZTogY29uZi5mb250U2l6ZSxcclxuICAgICAgICBsaW5lSGVpZ2h0OiBjb25mLmxpbmVIZWlnaHQsXHJcbiAgICAgICAgYmdDb2xvcjogY29uZi5iZ0NvbG9yLFxyXG4gICAgICAgIHRleHRDb2xvcjogY29uZi50ZXh0Q29sb3IsXHJcbiAgICAgICAgZm9udEZhbWlseTogY29uZi5mb250RmFtaWx5LFxyXG4gICAgICAgIGZvbnRQYXRoOiBjb25mLmZvbnRQYXRoLFxyXG4gICAgICAgIGZvbnRXZWlnaHQ6IGNvbmYuZm9udFdlaWdodCxcclxuICAgICAgICB0ZXh0QWxpZ246IGNvbmYudGV4dEFsaWduLFxyXG4gICAgfSwgY2FudmFzKTtcclxuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpO1xyXG4gICAgY3R4Lmdsb2JhbEFscGhhID0gMTtcclxuICAgIGN0eC5maWxsU3R5bGUgPSBjb25mLmJnQ29sb3I7XHJcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBoZWlnaHQpO1xyXG4gICAgaWYgKGNvbmYuYnViYmxlVGFpbC53aWR0aCAmJiBjb25mLmJ1YmJsZVRhaWwuaGVpZ2h0KSB7XHJcbiAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xyXG4gICAgICAgIGN0eC5tb3ZlVG8oY2FudmFzLndpZHRoIC8gMiAtIGNvbmYuYnViYmxlVGFpbC53aWR0aCAvIDIsIGhlaWdodCk7XHJcbiAgICAgICAgY3R4LmxpbmVUbyhjYW52YXMud2lkdGggLyAyLCBjYW52YXMuaGVpZ2h0KTtcclxuICAgICAgICBjdHgubGluZVRvKGNhbnZhcy53aWR0aCAvIDIgKyBjb25mLmJ1YmJsZVRhaWwud2lkdGggLyAyLCBoZWlnaHQpO1xyXG4gICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcclxuICAgICAgICBjdHguZmlsbFN0eWxlID0gY29uZi5iZ0NvbG9yO1xyXG4gICAgICAgIGN0eC5maWxsKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0ZXh0WCA9IGNvbmYubWFyZ2luO1xyXG4gICAgbGV0IHRleHRZID0gY29uZi5tYXJnaW47XHJcbiAgICBpZiAoY29uZi5jdXN0b21IZWlnaHQgJiYgY29uZi52ZXJ0aWNhbEFsaWduID09PSAnY2VudGVyJykge1xyXG4gICAgICAgIHRleHRZID1cclxuICAgICAgICAgICAgKGNvbmYuY3VzdG9tSGVpZ2h0IC0gdGV4dERhdGEuaGVpZ2h0KSAvIDIgK1xyXG4gICAgICAgICAgICAgICAgTWF0aC5tYXgoMCwgKGNvbmYubGluZUhlaWdodCAtIGNvbmYuZm9udFNpemUpIC8gMik7XHJcbiAgICB9XHJcbiAgICBjdHgucHV0SW1hZ2VEYXRhKHRleHREYXRhLCB0ZXh0WCwgdGV4dFkpO1xyXG4gICAgcmV0dXJuIGNhbnZhcztcclxufTtcclxuXHJcbmNvbnN0IGdlbmVyYXRlID0gYXN5bmMgKGNvbnRlbnQsIGNvbmZpZykgPT4ge1xyXG4gICAgY29uc3QgY29uZiA9IHsgLi4uZGVmYXVsdHMsIC4uLmNvbmZpZyB9O1xyXG4gICAgY29uc3QgY2FudmFzID0gY3JlYXRlSW1hZ2VDYW52YXMoY29udGVudCwgY29uZik7XHJcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpO1xyXG59O1xyXG5cclxuY29uc3QgZ2VuZXJhdGVTeW5jID0gKGNvbnRlbnQsIGNvbmZpZykgPT4ge1xyXG4gICAgY29uc3QgY29uZiA9IHsgLi4uZGVmYXVsdHMsIC4uLmNvbmZpZyB9O1xyXG4gICAgY29uc3QgY2FudmFzID0gY3JlYXRlSW1hZ2VDYW52YXMoY29udGVudCwgY29uZik7XHJcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgpO1xyXG59O1xyXG5cclxuZXhwb3J0cy5nZW5lcmF0ZSA9IGdlbmVyYXRlO1xyXG5leHBvcnRzLmdlbmVyYXRlU3luYyA9IGdlbmVyYXRlU3luYzsiXX0=