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.
- package/CHANGELOG.md +14 -0
- package/build/core/OxygenCore.js +266 -37
- package/build/core/OxygenEvents.js +11 -1
- package/build/core/OxygenModule.js +14 -1
- package/build/core/OxygenService.js +12 -1
- package/build/core/OxygenSubModule.js +10 -1
- package/build/core/WebDriverModule.js +30 -1
- package/build/core/utils.js +17 -1
- package/build/errors/HookError.js +7 -1
- package/build/errors/ModuleError.js +7 -1
- package/build/errors/ModuleUnavailableError.js +3 -1
- package/build/errors/OxygenError.js +33 -1
- package/build/errors/ScriptNotFound.js +7 -1
- package/build/errors/helper.js +77 -45
- package/build/index.js +18 -6
- package/build/lib/cli-util.js +90 -28
- package/build/lib/cli.js +23 -1
- package/build/lib/debugger.js +144 -1
- package/build/lib/img-merge.js +15 -1
- package/build/lib/launcher.js +28 -1
- package/build/lib/moduleRequire.js +4 -1
- package/build/lib/param-manager.js +28 -1
- package/build/lib/param-reader-csv.js +15 -1
- package/build/lib/param-reader-excel.js +14 -1
- package/build/lib/param-reader-json.js +10 -1
- package/build/lib/text-to-image.js +183 -0
- package/build/lib/util.js +58 -3
- package/build/model/case-result.js +4 -2
- package/build/model/failure.js +2 -1
- package/build/model/status.js +2 -1
- package/build/model/step-result.js +2 -1
- package/build/model/suite-result.js +2 -1
- package/build/model/test-result.js +2 -1
- package/build/model/testcase.js +2 -1
- package/build/model/testsuite.js +2 -1
- package/build/ox_modules/index.js +33 -13
- package/build/ox_modules/module-assert.js +24 -8
- package/build/ox_modules/module-date.js +8 -3
- package/build/ox_modules/module-db.js +28 -7
- package/build/ox_modules/module-email.js +36 -10
- package/build/ox_modules/module-eyes.js +46 -5
- package/build/ox_modules/module-http.js +102 -41
- package/build/ox_modules/module-log.js +22 -5
- package/build/ox_modules/module-mailinator.js +32 -10
- package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
- package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
- package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
- package/build/ox_modules/module-mob/commands/assertText.js +3 -1
- package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
- package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
- package/build/ox_modules/module-mob/commands/back.js +2 -1
- package/build/ox_modules/module-mob/commands/clear.js +4 -1
- package/build/ox_modules/module-mob/commands/click.js +4 -3
- package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
- package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
- package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
- package/build/ox_modules/module-mob/commands/debug.js +2 -2
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
- package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
- package/build/ox_modules/module-mob/commands/execute.js +2 -1
- package/build/ox_modules/module-mob/commands/findElement.js +3 -1
- package/build/ox_modules/module-mob/commands/findElements.js +4 -1
- package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
- package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
- package/build/ox_modules/module-mob/commands/getSource.js +2 -1
- package/build/ox_modules/module-mob/commands/getText.js +4 -1
- package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
- package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
- package/build/ox_modules/module-mob/commands/getValue.js +9 -5
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
- package/build/ox_modules/module-mob/commands/index.js +94 -19
- package/build/ox_modules/module-mob/commands/installApp.js +2 -1
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
- package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
- package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
- package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
- package/build/ox_modules/module-mob/commands/isExist.js +3 -1
- package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
- package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
- package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
- package/build/ox_modules/module-mob/commands/open.js +3 -1
- package/build/ox_modules/module-mob/commands/pause.js +2 -1
- package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
- package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
- package/build/ox_modules/module-mob/commands/select.js +4 -1
- package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
- package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
- package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
- package/build/ox_modules/module-mob/commands/setContext.js +2 -1
- package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
- package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
- package/build/ox_modules/module-mob/commands/shake.js +2 -1
- package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
- package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
- package/build/ox_modules/module-mob/commands/swipe.js +2 -1
- package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
- package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
- package/build/ox_modules/module-mob/commands/tap.js +2 -1
- package/build/ox_modules/module-mob/commands/type.js +7 -3
- package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
- package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
- package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-mob.js +141 -72
- package/build/ox_modules/module-pdf.js +62 -23
- package/build/ox_modules/module-proxy.js +68 -8
- package/build/ox_modules/module-serial.js +32 -7
- package/build/ox_modules/module-shell.js +27 -8
- package/build/ox_modules/module-soap.js +47 -14
- package/build/ox_modules/module-twilio.js +53 -10
- package/build/ox_modules/module-utils.js +51 -16
- package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
- package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
- package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
- package/build/ox_modules/module-web/commands/assertExist.js +2 -1
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
- package/build/ox_modules/module-web/commands/assertText.js +3 -1
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
- package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
- package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
- package/build/ox_modules/module-web/commands/assertValue.js +3 -1
- package/build/ox_modules/module-web/commands/back.js +2 -1
- package/build/ox_modules/module-web/commands/clear.js +5 -1
- package/build/ox_modules/module-web/commands/click.js +13 -4
- package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
- package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/debug.js +2 -2
- package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
- package/build/ox_modules/module-web/commands/deselect.js +2 -1
- package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
- package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
- package/build/ox_modules/module-web/commands/execute.js +2 -1
- package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
- package/build/ox_modules/module-web/commands/findElement.js +3 -1
- package/build/ox_modules/module-web/commands/findElements.js +4 -1
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
- package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
- package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
- package/build/ox_modules/module-web/commands/getCookies.js +2 -1
- package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
- package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
- package/build/ox_modules/module-web/commands/getHTML.js +2 -1
- package/build/ox_modules/module-web/commands/getSource.js +2 -1
- package/build/ox_modules/module-web/commands/getText.js +4 -1
- package/build/ox_modules/module-web/commands/getTitle.js +2 -1
- package/build/ox_modules/module-web/commands/getUrl.js +2 -1
- package/build/ox_modules/module-web/commands/getValue.js +5 -1
- package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
- package/build/ox_modules/module-web/commands/index.js +100 -19
- package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
- package/build/ox_modules/module-web/commands/isChecked.js +2 -1
- package/build/ox_modules/module-web/commands/isExist.js +3 -1
- package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
- package/build/ox_modules/module-web/commands/isSelected.js +2 -1
- package/build/ox_modules/module-web/commands/isVisible.js +3 -1
- package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
- package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/newWindow.js +2 -1
- package/build/ox_modules/module-web/commands/open.js +4 -1
- package/build/ox_modules/module-web/commands/pause.js +2 -1
- package/build/ox_modules/module-web/commands/point.js +2 -1
- package/build/ox_modules/module-web/commands/pointJS.js +8 -2
- package/build/ox_modules/module-web/commands/refresh.js +2 -1
- package/build/ox_modules/module-web/commands/rightClick.js +8 -3
- package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
- package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
- package/build/ox_modules/module-web/commands/select.js +5 -1
- package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
- package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
- package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
- package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
- package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
- package/build/ox_modules/module-web/commands/type.js +5 -1
- package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
- package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
- package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
- package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
- package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
- package/build/ox_modules/module-web/commands/waitForText.js +3 -1
- package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
- package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
- package/build/ox_modules/module-web.js +181 -82
- package/build/ox_modules/module-win/commands/assertText.js +3 -1
- package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
- package/build/ox_modules/module-win/commands/assertValue.js +15 -9
- package/build/ox_modules/module-win/commands/back.js +2 -1
- package/build/ox_modules/module-win/commands/clear.js +4 -1
- package/build/ox_modules/module-win/commands/click.js +2 -1
- package/build/ox_modules/module-win/commands/clickLong.js +2 -1
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
- package/build/ox_modules/module-win/commands/findElement.js +3 -1
- package/build/ox_modules/module-win/commands/findElements.js +4 -1
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
- package/build/ox_modules/module-win/commands/getLocation.js +2 -1
- package/build/ox_modules/module-win/commands/getSource.js +2 -1
- package/build/ox_modules/module-win/commands/getText.js +4 -1
- package/build/ox_modules/module-win/commands/getValue.js +9 -5
- package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-win/commands/index.js +43 -5
- package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
- package/build/ox_modules/module-win/commands/isChecked.js +2 -1
- package/build/ox_modules/module-win/commands/isClickable.js +2 -1
- package/build/ox_modules/module-win/commands/isExist.js +3 -1
- package/build/ox_modules/module-win/commands/isSelected.js +2 -1
- package/build/ox_modules/module-win/commands/isVisible.js +3 -1
- package/build/ox_modules/module-win/commands/open.js +2 -1
- package/build/ox_modules/module-win/commands/pause.js +2 -1
- package/build/ox_modules/module-win/commands/rightClick.js +2 -1
- package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
- package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
- package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
- package/build/ox_modules/module-win/commands/tap.js +2 -1
- package/build/ox_modules/module-win/commands/type.js +4 -1
- package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
- package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-win.js +87 -48
- package/build/ox_modules/utils.js +76 -22
- package/build/ox_reporters/reporter-excel.js +58 -1
- package/build/ox_reporters/reporter-html.js +28 -1
- package/build/ox_reporters/reporter-json.js +14 -1
- package/build/ox_reporters/reporter-junit.js +24 -1
- package/build/ox_reporters/reporter-pdf.js +19 -1
- package/build/ox_reporters/reporter-xml.js +17 -1
- package/build/ox_services/service-devtools/submodule-network.js +91 -4
- package/build/ox_services/service-devtools.js +23 -1
- package/build/reporter/FileReporterBase.js +44 -5
- package/build/reporter/ReportAggregator.js +65 -1
- package/build/reporter/ReporterBase.js +6 -1
- package/build/runners/WorkerProcess.js +99 -1
- package/build/runners/cucumber/CucumberEventListener.js +29 -4
- package/build/runners/cucumber/CucumberReporter.js +56 -1
- package/build/runners/cucumber/CucumberWorker.js +66 -1
- package/build/runners/cucumber/index.js +30 -1
- package/build/runners/cucumber/worker.js +18 -1
- package/build/runners/index.js +6 -1
- package/build/runners/oxygen/OxygenWorker.js +60 -3
- package/build/runners/oxygen/index.js +178 -17
- package/build/runners/oxygen/worker.js +25 -2
- package/package.json +8 -8
- package/.babelrc +0 -28
- package/.eslintrc.json +0 -25
- package/.husky/pre-commit +0 -4
- 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=
|