@mablhq/mabl-cli 1.48.1 → 1.48.22

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 (46) hide show
  1. package/api/mablApiClient.js +11 -0
  2. package/browserEngines/browserEngines.js +2 -0
  3. package/browserEngines/chromiumBrowserEngine.js +4 -1
  4. package/browserEngines/firefoxBrowserEngine.js +20 -4
  5. package/browserEngines/unsupportedBrowserEngine.js +3 -0
  6. package/browserEngines/webkitBrowerEngine.js +50 -0
  7. package/browserLauncher/elementHandle.js +10 -1
  8. package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumElementHandleDelegate.js +63 -0
  9. package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumPageDelegate.js +25 -10
  10. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxBrowserDelegate.js +5 -12
  11. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxElementHandleDelegate.js +5 -55
  12. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxFrameDelegate.js +2 -5
  13. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxPageDelegate.js +2 -70
  14. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractBrowserDelegate.js +15 -0
  15. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractElementHandleDelegate.js +65 -0
  16. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractFrameDelegate.js +10 -0
  17. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractPageDelegate.js +75 -0
  18. package/browserLauncher/playwrightBrowserLauncher/playwrightBrowser.js +3 -0
  19. package/browserLauncher/playwrightBrowserLauncher/playwrightBrowserLauncher.js +2 -0
  20. package/browserLauncher/playwrightBrowserLauncher/playwrightDom.js +35 -52
  21. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitBrowserDelegate.js +47 -0
  22. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitElementHandleDelegate.js +16 -0
  23. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitFrameDelegate.js +10 -0
  24. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitPageDelegate.js +15 -0
  25. package/commands/browserTypes.js +5 -0
  26. package/commands/constants.js +5 -2
  27. package/commands/datatables/datatables_cmds/create.js +148 -0
  28. package/commands/datatables/datatables_cmds/export.js +1 -2
  29. package/commands/tests/testsUtil.js +20 -2
  30. package/commands/tests/tests_cmds/run.js +1 -15
  31. package/execution/index.js +1 -1
  32. package/http/requestInterceptor.js +6 -2
  33. package/mablApi/index.js +1 -1
  34. package/mablscript/importer.js +2 -0
  35. package/mablscript/steps/DoubleClickStep.js +1 -1
  36. package/mablscript/steps/RightClickStep.js +57 -0
  37. package/mablscriptFind/index.js +1 -1
  38. package/observers/mockObserver.js +3 -0
  39. package/package.json +4 -3
  40. package/popupDismissal/index.js +7 -2
  41. package/resources/mablFind.js +1 -1
  42. package/resources/popupDismissal.js +1 -1
  43. package/util/asyncUtil.js +1 -1
  44. package/util/browserTestUtils.js +6 -7
  45. package/util/clickUtil.js +24 -14
  46. package/util/csvUtil.js +6 -1
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.NonChromiumAbstractPageDelegate = void 0;
27
+ const playwright = __importStar(require("@playwright/test"));
28
+ const logUtils_1 = require("../../../util/logUtils");
29
+ class NonChromiumAbstractPageDelegate {
30
+ constructor(page) {
31
+ this.page = page;
32
+ this.pageImpl = playwright._toImpl(page);
33
+ }
34
+ setFocusEmulationEnabled(_enabled) {
35
+ return Promise.resolve();
36
+ }
37
+ waitForInitialization() {
38
+ return Promise.resolve();
39
+ }
40
+ getBrowserBounds() {
41
+ return undefined;
42
+ }
43
+ setBrowserBounds(_width, _height) {
44
+ return Promise.resolve();
45
+ }
46
+ getTargetId() {
47
+ return this.page.mainFrame()._id;
48
+ }
49
+ createCDPSession() {
50
+ var _a;
51
+ return Promise.resolve((_a = this.pageImpl._delegate) === null || _a === void 0 ? void 0 : _a._session);
52
+ }
53
+ makeCDPCall(method, paramArgs) {
54
+ return this.getCDPSession().send(method, paramArgs);
55
+ }
56
+ getCDPSession() {
57
+ var _a, _b;
58
+ this.checkCDPSession();
59
+ return (_b = (_a = this.pageImpl) === null || _a === void 0 ? void 0 : _a._delegate) === null || _b === void 0 ? void 0 : _b._session;
60
+ }
61
+ checkCDPSession() {
62
+ var _a, _b, _c, _d;
63
+ if (((_b = (_a = this.pageImpl) === null || _a === void 0 ? void 0 : _a._delegate) === null || _b === void 0 ? void 0 : _b._session) === undefined) {
64
+ const undefinedField = ((_d = (_c = this.pageImpl) === null || _c === void 0 ? void 0 : _c._delegate) === null || _d === void 0 ? void 0 : _d._session) !== undefined
65
+ ? '_session'
66
+ : '_delegate';
67
+ (0, logUtils_1.logInternal)(`Unable to get the CDP Session of the page (${undefinedField} is undefined).
68
+ Creating a fallback session. Some functionality might not work as expected.`);
69
+ }
70
+ }
71
+ enableScreencastMode() {
72
+ return Promise.resolve();
73
+ }
74
+ }
75
+ exports.NonChromiumAbstractPageDelegate = NonChromiumAbstractPageDelegate;
@@ -36,6 +36,7 @@ const path_1 = __importDefault(require("path"));
36
36
  const fs_extra_1 = __importDefault(require("fs-extra"));
37
37
  const firefoxBrowserDelegate_1 = require("./firefox/firefoxBrowserDelegate");
38
38
  const chromiumBrowserDelegate_1 = require("./chromium/chromiumBrowserDelegate");
39
+ const webkitBrowserDelegate_1 = require("./webkit/webkitBrowserDelegate");
39
40
  class PlaywrightBrowser extends events_1.default {
40
41
  constructor(defaultContext, downloadDirectory, browserWSEndpoint, browserDelegate, preferenceDirectory, disableFocusEmulation) {
41
42
  super();
@@ -168,6 +169,8 @@ function getBrowserDelegate(browserType, browserContext) {
168
169
  return new chromiumBrowserDelegate_1.ChromiumBrowserDelegate(browserContext);
169
170
  case playwright.firefox:
170
171
  return new firefoxBrowserDelegate_1.FirefoxBrowserDelegate(browserContext);
172
+ case playwright.webkit:
173
+ return new webkitBrowserDelegate_1.WebkitBrowserDelegate(browserContext);
171
174
  default:
172
175
  throw new Error(`Unsupported browser type: ${browserType}`);
173
176
  }
@@ -66,6 +66,8 @@ function getPlaywrightBrowserType(browserType) {
66
66
  return test_1.chromium;
67
67
  case browserTypes_1.BrowserType.Firefox:
68
68
  return test_1.firefox;
69
+ case browserTypes_1.BrowserType.Webkit:
70
+ return test_1.webkit;
69
71
  default:
70
72
  throw new Error(`Unsupported browser type: ${browserType}`);
71
73
  }
@@ -1,11 +1,33 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.PlaywrightElementHandle = exports.PlaywrightJsHandle = exports.NAVIGATION_ERROR_MESSAGE = void 0;
27
+ const playwright = __importStar(require("@playwright/test"));
4
28
  const types_1 = require("../types");
5
29
  const utils_1 = require("../utils");
6
30
  const logUtils_1 = require("../../util/logUtils");
7
- const elementHandle_1 = require("../elementHandle");
8
- const testsUtil_1 = require("../../commands/tests/testsUtil");
9
31
  const pureUtil_1 = require("../../util/pureUtil");
10
32
  exports.NAVIGATION_ERROR_MESSAGE = 'waiting for scheduled navigations to finish';
11
33
  class PlaywrightJsHandle {
@@ -34,6 +56,11 @@ class PlaywrightJsHandle {
34
56
  jsonValue() {
35
57
  return this.handle.jsonValue();
36
58
  }
59
+ isContextDestroyed() {
60
+ var _a, _b, _c;
61
+ const elementImpl = playwright._toImpl(this.handle);
62
+ return (_c = (_b = (_a = elementImpl._context) === null || _a === void 0 ? void 0 : _a._destroyedPromise) === null || _b === void 0 ? void 0 : _b._isDone) !== null && _c !== void 0 ? _c : true;
63
+ }
37
64
  static unwrapProperties(arg, addSecondaryWorldFlag = false) {
38
65
  if (arg === undefined) {
39
66
  return addSecondaryWorldFlag ? { secondaryWorldValue: undefined } : null;
@@ -114,6 +141,7 @@ class PlaywrightElementHandle extends PlaywrightJsHandle {
114
141
  const trial = (_a = options === null || options === void 0 ? void 0 : options.trial) !== null && _a !== void 0 ? _a : false;
115
142
  try {
116
143
  await this.element.click({
144
+ button: options === null || options === void 0 ? void 0 : options.button,
117
145
  clickCount: (_b = options === null || options === void 0 ? void 0 : options.clickCount) !== null && _b !== void 0 ? _b : 1,
118
146
  force: (_c = options === null || options === void 0 ? void 0 : options.force) !== null && _c !== void 0 ? _c : !trial,
119
147
  timeout: this.getActionTimeout(options),
@@ -201,60 +229,12 @@ class PlaywrightElementHandle extends PlaywrightJsHandle {
201
229
  minimizeScrollIntoView: options === null || options === void 0 ? void 0 : options.minimizeScrollIntoView,
202
230
  });
203
231
  }
204
- getRemoteObjectId() {
205
- var _a, _b, _c;
206
- if (((_a = this.delegate.getElementImpl()) === null || _a === void 0 ? void 0 : _a._objectId) === undefined) {
207
- (0, logUtils_1.logInternal)('ObjectId of an element handle was not found.');
208
- }
209
- return (_c = (_b = this.delegate.getElementImpl()) === null || _b === void 0 ? void 0 : _b._objectId) !== null && _c !== void 0 ? _c : '';
210
- }
211
- async highlight(highlightDurationMillis, highlightPhases) {
212
- await this.enableDom();
213
- await this.enableOverlay();
214
- const nodeInfo = await this.makeCDPCall('DOM.describeNode', {
215
- objectId: this.getRemoteObjectId(),
216
- depth: -1,
217
- pierce: true,
218
- });
219
- const highlightConfig = {
220
- backendNodeId: nodeInfo.node.backendNodeId,
221
- highlightConfig: {
222
- borderColor: (0, elementHandle_1.getHighlightColor)(0),
223
- contentColor: (0, elementHandle_1.getHighlightColor)(1),
224
- colorFormat: 'rgb',
225
- },
226
- };
227
- await this.fadeInOutHighlight(highlightConfig, highlightDurationMillis, highlightPhases);
228
- await this.hideHighlight();
232
+ highlight(highlightDurationMillis, highlightPhases) {
233
+ return this.delegate.highlight(highlightDurationMillis, highlightPhases);
229
234
  }
230
235
  async getValue() {
231
236
  return this.element.inputValue();
232
237
  }
233
- async fadeInOutHighlight(highlightConfig, highlightDurationMillis, highlightPhases) {
234
- var _a;
235
- if (highlightPhases <= 0) {
236
- throw new Error('Highlight phases must be greater than 0');
237
- }
238
- const phaseIntervalMilliseconds = highlightDurationMillis / highlightPhases;
239
- for (let iteration = 0; iteration < highlightPhases; iteration++) {
240
- if (((_a = highlightConfig.highlightConfig.contentColor) === null || _a === void 0 ? void 0 : _a.a) !== undefined) {
241
- const x = iteration / highlightPhases;
242
- highlightConfig.highlightConfig.contentColor.a =
243
- x * (1 - x) * 4 * elementHandle_1.MAX_HIGHLIGHT_OPACITY;
244
- }
245
- await this.makeCDPCall('Overlay.highlightNode', highlightConfig);
246
- await (0, testsUtil_1.sleep)(phaseIntervalMilliseconds);
247
- }
248
- }
249
- async enableDom() {
250
- await this.makeCDPCall('DOM.enable');
251
- }
252
- async enableOverlay() {
253
- await this.makeCDPCall('Overlay.enable');
254
- }
255
- async hideHighlight() {
256
- await this.makeCDPCall('Overlay.hideHighlight');
257
- }
258
238
  async makeCDPCall(method, paramArgs) {
259
239
  var _a;
260
240
  return ((_a = this.cdpSession) !== null && _a !== void 0 ? _a : this.page.getCDPSession()).send(method, paramArgs);
@@ -291,6 +271,9 @@ class PlaywrightElementHandle extends PlaywrightJsHandle {
291
271
  async isInShadowRoot() {
292
272
  return this.element.evaluate((el) => el.getRootNode().nodeName === '#document-fragment');
293
273
  }
274
+ focusAndSelect() {
275
+ return this.delegate.focusAndSelect(this);
276
+ }
294
277
  getActionTimeout(options) {
295
278
  var _a;
296
279
  const defaultTimeout = (options === null || options === void 0 ? void 0 : options.trial)
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.WebkitBrowserDelegate = void 0;
27
+ const playwright = __importStar(require("@playwright/test"));
28
+ const webkitPageDelegate_1 = require("./webkitPageDelegate");
29
+ const nonChromiumAbstractBrowserDelegate_1 = require("../nonChromium/nonChromiumAbstractBrowserDelegate");
30
+ class WebkitBrowserDelegate extends nonChromiumAbstractBrowserDelegate_1.NonChromiumAbstractBrowserDelegate {
31
+ constructor(context) {
32
+ super();
33
+ this.context = context;
34
+ const contextImpl = playwright._toImpl(context);
35
+ this._browser = contextImpl._browser;
36
+ }
37
+ getBrowser() {
38
+ return this._browser;
39
+ }
40
+ createPageDelegate(page) {
41
+ return new webkitPageDelegate_1.WebkitPageDelegate(page);
42
+ }
43
+ getCDPSession() {
44
+ return this._browser._connection.browserSession;
45
+ }
46
+ }
47
+ exports.WebkitBrowserDelegate = WebkitBrowserDelegate;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebkitElementHandleDelegate = void 0;
4
+ const nonChromiumAbstractElementHandleDelegate_1 = require("../nonChromium/nonChromiumAbstractElementHandleDelegate");
5
+ class WebkitElementHandleDelegate extends nonChromiumAbstractElementHandleDelegate_1.NonChromiumAbstractElementHandleDelegate {
6
+ async focusAndSelect(element) {
7
+ const frame = await element.frame();
8
+ return frame.evaluate((element) => {
9
+ var _a;
10
+ element.focus();
11
+ (_a = element.select) === null || _a === void 0 ? void 0 : _a.call(element);
12
+ return element.value;
13
+ }, element);
14
+ }
15
+ }
16
+ exports.WebkitElementHandleDelegate = WebkitElementHandleDelegate;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebkitFrameDelegate = void 0;
4
+ const nonChromiumAbstractFrameDelegate_1 = require("../nonChromium/nonChromiumAbstractFrameDelegate");
5
+ class WebkitFrameDelegate extends nonChromiumAbstractFrameDelegate_1.NonChromiumAbstractFrameDelegate {
6
+ addBindingToSecondaryWorld(_binding) {
7
+ return Promise.resolve();
8
+ }
9
+ }
10
+ exports.WebkitFrameDelegate = WebkitFrameDelegate;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebkitPageDelegate = void 0;
4
+ const webkitElementHandleDelegate_1 = require("./webkitElementHandleDelegate");
5
+ const webkitFrameDelegate_1 = require("./webkitFrameDelegate");
6
+ const nonChromiumAbstractPageDelegate_1 = require("../nonChromium/nonChromiumAbstractPageDelegate");
7
+ class WebkitPageDelegate extends nonChromiumAbstractPageDelegate_1.NonChromiumAbstractPageDelegate {
8
+ createElementHandleDelegate(element) {
9
+ return new webkitElementHandleDelegate_1.WebkitElementHandleDelegate(element);
10
+ }
11
+ createFrameDelegate(frame) {
12
+ return new webkitFrameDelegate_1.WebkitFrameDelegate(this, frame);
13
+ }
14
+ }
15
+ exports.WebkitPageDelegate = WebkitPageDelegate;
@@ -8,6 +8,7 @@ var BrowserType;
8
8
  BrowserType["Firefox"] = "firefox";
9
9
  BrowserType["InternetExplorer"] = "internet_explorer";
10
10
  BrowserType["Safari"] = "safari";
11
+ BrowserType["Webkit"] = "webkit";
11
12
  })(BrowserType = exports.BrowserType || (exports.BrowserType = {}));
12
13
  exports.SupportedBrowserTypeProperties = {
13
14
  chrome: { browserName: 'chrome', browserReleaseChannel: 'chrome' },
@@ -17,5 +18,9 @@ exports.SupportedBrowserTypeProperties = {
17
18
  browserName: 'safari',
18
19
  browserReleaseChannel: 'webkit',
19
20
  },
21
+ webkit: {
22
+ browserName: 'webkit',
23
+ browserReleaseChannel: 'webkit',
24
+ },
20
25
  };
21
26
  exports.DefaultBrowserProperties = exports.SupportedBrowserTypeProperties.chrome;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CommandArgUrl = exports.CommandArgTrainerVersion = exports.CommandArgTo = exports.CommandArgSilent = exports.CommandArgRevision = exports.CommandArgMaxHeartbeatAge = exports.CommandArgPlanId = exports.CommandArgContentTypes = exports.CommandArgPreview = exports.CommandArgOutputFilePath = exports.CommandArgOutput = exports.CommandArgNoPrompt = exports.CommandArgPrompt = exports.CommandArgPortNumber = exports.CommandArgName = exports.CommandArgMablBranchChangesOnly = exports.CommandArgMablBranch = exports.CommandArgMablAutoLogin = exports.CommandArgMablAutoBranch = exports.CommandArgLinkBypass = exports.CommandArgLinkLabel = exports.CommandArgLimitOutput = exports.CommandArgLabels = exports.CommandArgLabelsInclude = exports.CommandArgLabelsExclude = exports.CommandArgTestInteractionSpeed = exports.CommandArgTestRunId = exports.CommandArgTestFile = exports.CommandArgId = exports.CommandArgUserAgent = exports.CommandArgHttpHeaders = exports.CommandArgHelp = exports.CommandArgFromPlanId = exports.CommandArgFrom = exports.CommandArgFormat = exports.CommandArgFastFailure = exports.CommandArgOverrideEnvironmentId = exports.CommandArgEnvironmentId = exports.CommandArgEnableLink = exports.CommandArgDetailLevel = exports.CommandArgDescription = exports.CommandArgDeploymentId = exports.CommandArgDecrypt = exports.CommandArgDataTables = exports.CommandArgCredentials = exports.CommandArgBasicAuthCredentials = exports.CommandArgBrowsers = exports.CommandArgBrowser = exports.CommandArgApplicationId = exports.CommandArgApiKey = void 0;
4
- exports.ValidBrowserTypesForLocalRuns = exports.BrowserTypeSelections = exports.DefaultBrowserType = exports.DefaultBranchName = exports.DefaultOutputFormatChoices = exports.DetailLevelFormats = exports.ReporterOptions = exports.OutputFormats = exports.CommandArgAliases = exports.CommandArgBrowserEnableExtensions = exports.CommandArgBrowserIgnoreCertificateErrors = exports.CommandArgBrowserDisableIsolation = exports.ListTimeFormat = exports.CommandArgReporterOptions = exports.CommandArgReporter = exports.CommandArgWorkspaceId = exports.CommandArgVersion = exports.CommandArgVariables = exports.CommandArgUrlApi = exports.CommandArgUrlApp = void 0;
3
+ exports.CommandArgTrainerVersion = exports.CommandArgTo = exports.CommandArgSilent = exports.CommandArgRevision = exports.CommandArgMaxHeartbeatAge = exports.CommandArgPlanId = exports.CommandArgContentTypes = exports.CommandArgPreview = exports.CommandArgOutputFilePath = exports.CommandArgOutput = exports.CommandArgNoPrompt = exports.CommandArgPrompt = exports.CommandArgPortNumber = exports.CommandArgName = exports.CommandArgMablBranchChangesOnly = exports.CommandArgMablBranch = exports.CommandArgMablAutoLogin = exports.CommandArgMablAutoBranch = exports.CommandArgLinkBypass = exports.CommandArgLinkLabel = exports.CommandArgLimitOutput = exports.CommandArgLabels = exports.CommandArgLabelsInclude = exports.CommandArgLabelsExclude = exports.CommandArgTestInteractionSpeed = exports.CommandArgTestRunId = exports.CommandArgTestFile = exports.CommandArgInput = exports.CommandArgId = exports.CommandArgUserAgent = exports.CommandArgHttpHeaders = exports.CommandArgHelp = exports.CommandArgFromPlanId = exports.CommandArgFrom = exports.CommandArgFormat = exports.CommandArgFastFailure = exports.CommandArgOverrideEnvironmentId = exports.CommandArgEnvironmentId = exports.CommandArgEnableLink = exports.CommandArgDetailLevel = exports.CommandArgDescription = exports.CommandArgDeploymentId = exports.CommandArgDecrypt = exports.CommandArgDataTables = exports.CommandArgCredentials = exports.CommandArgBasicAuthCredentials = exports.CommandArgBrowsers = exports.CommandArgBrowser = exports.CommandArgApplicationId = exports.CommandArgApiKey = void 0;
4
+ exports.SCENARIO_NAME_HEADER = exports.ValidBrowserTypesForLocalRuns = exports.BrowserTypeSelections = exports.DefaultBrowserType = exports.DefaultBranchName = exports.DefaultOutputFormatChoices = exports.DetailLevelFormats = exports.ReporterOptions = exports.OutputFormats = exports.CommandArgAliases = exports.CommandArgBrowserEnableExtensions = exports.CommandArgBrowserIgnoreCertificateErrors = exports.CommandArgBrowserDisableIsolation = exports.ListTimeFormat = exports.CommandArgReporterOptions = exports.CommandArgReporter = exports.CommandArgWorkspaceId = exports.CommandArgVersion = exports.CommandArgVariables = exports.CommandArgUrlApi = exports.CommandArgUrlApp = exports.CommandArgUrl = void 0;
5
5
  const browserTypes_1 = require("./browserTypes");
6
6
  exports.CommandArgApiKey = 'api-key';
7
7
  exports.CommandArgApplicationId = 'application-id';
@@ -25,6 +25,7 @@ exports.CommandArgHelp = 'help';
25
25
  exports.CommandArgHttpHeaders = 'http-headers';
26
26
  exports.CommandArgUserAgent = 'user-agent';
27
27
  exports.CommandArgId = 'id';
28
+ exports.CommandArgInput = 'input';
28
29
  exports.CommandArgTestFile = 'test-file';
29
30
  exports.CommandArgTestRunId = 'run-id';
30
31
  exports.CommandArgTestInteractionSpeed = 'interaction-speed';
@@ -120,4 +121,6 @@ exports.ValidBrowserTypesForLocalRuns = [
120
121
  browserTypes_1.BrowserType.Chrome,
121
122
  browserTypes_1.BrowserType.Edge,
122
123
  browserTypes_1.BrowserType.Firefox,
124
+ browserTypes_1.BrowserType.Webkit,
123
125
  ];
126
+ exports.SCENARIO_NAME_HEADER = 'Scenario name';
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.parseCsvRows = exports.parseJsonRows = void 0;
30
+ const path_1 = require("path");
31
+ const mablApiClientFactory_1 = require("../../../api/mablApiClientFactory");
32
+ const util_1 = require("../../commandUtil/util");
33
+ const constants_1 = require("../../constants");
34
+ const fs = __importStar(require("fs"));
35
+ const csv_parser_1 = __importDefault(require("csv-parser"));
36
+ const describe_1 = require("../../commandUtil/describe");
37
+ const csvUtil_1 = require("../../../util/csvUtil");
38
+ exports.command = `create <${constants_1.CommandArgInput}>`;
39
+ exports.describe = 'Create a new mabl DataTable';
40
+ exports.builder = (yargs) => {
41
+ yargs
42
+ .positional(constants_1.CommandArgInput, {
43
+ alias: 'file',
44
+ describe: 'Relative path file to create DataTable from',
45
+ })
46
+ .option(constants_1.CommandArgWorkspaceId, {
47
+ alias: constants_1.CommandArgAliases.WorkspaceId,
48
+ describe: `Workspace to create DataTable in`,
49
+ type: 'string',
50
+ })
51
+ .option(constants_1.CommandArgName, {
52
+ alias: 'table-name',
53
+ describe: `The name for your new DataTable`,
54
+ type: 'string',
55
+ })
56
+ .option(constants_1.CommandArgFormat, {
57
+ alias: 'fmt',
58
+ describe: `Specify the format of your input file`,
59
+ choices: [constants_1.OutputFormats.Json, constants_1.OutputFormats.Csv, undefined],
60
+ });
61
+ };
62
+ exports.handler = (0, util_1.failWrapper)(createDataTable);
63
+ var AllowedExtensions;
64
+ (function (AllowedExtensions) {
65
+ AllowedExtensions["Csv"] = ".csv";
66
+ AllowedExtensions["Json"] = ".json";
67
+ })(AllowedExtensions || (AllowedExtensions = {}));
68
+ async function createDataTable(parsed) {
69
+ const input = parsed.input;
70
+ const format = parsed.format || tryInferFormat(input);
71
+ const name = parsed.name || (0, path_1.basename)((0, path_1.resolve)(input));
72
+ const workspaceId = await (0, util_1.getWorkspaceId)(parsed);
73
+ let rows = [];
74
+ switch (format) {
75
+ case constants_1.OutputFormats.Json:
76
+ const jsonInput = fs.readFileSync(input, 'utf-8');
77
+ rows = parseJsonRows(jsonInput);
78
+ break;
79
+ case constants_1.OutputFormats.Csv:
80
+ const csvInput = [];
81
+ await new Promise((resolve) => {
82
+ fs.createReadStream(input)
83
+ .pipe((0, csv_parser_1.default)())
84
+ .on('data', (data) => csvInput.push(data))
85
+ .on('end', () => resolve());
86
+ });
87
+ rows = parseCsvRows(csvInput);
88
+ break;
89
+ default:
90
+ throw Error(`${format} is not a valid option.`);
91
+ }
92
+ const options = {
93
+ prototype: {
94
+ name,
95
+ organization_id: workspaceId,
96
+ },
97
+ mappings: rows.map((datatableRow) => ({
98
+ scenario_id: datatableRow.scenario,
99
+ row: datatableRow.columns.map((column) => ({
100
+ name: column.name,
101
+ value: column.value,
102
+ })),
103
+ })),
104
+ };
105
+ const apiClient = await mablApiClientFactory_1.MablApiClientFactory.createApiClient();
106
+ const datatableRows = await apiClient.createDatatable(workspaceId, options);
107
+ (0, describe_1.outputEntity)(datatableRows, constants_1.OutputFormats.Json);
108
+ }
109
+ function tryInferFormat(input) {
110
+ const extension = (0, path_1.extname)(input);
111
+ switch (extension) {
112
+ case AllowedExtensions.Csv:
113
+ return constants_1.OutputFormats.Csv;
114
+ case AllowedExtensions.Json:
115
+ return constants_1.OutputFormats.Json;
116
+ default:
117
+ throw new Error('No format could be inferred, please specify a format for your input data.');
118
+ }
119
+ }
120
+ function parseJsonRows(input) {
121
+ const parsedJson = JSON.parse(input);
122
+ if (isDataTableRowArray(parsedJson)) {
123
+ return parsedJson;
124
+ }
125
+ throw Error('Json input was not formatted correctly');
126
+ }
127
+ exports.parseJsonRows = parseJsonRows;
128
+ function isDataTableRowArray(arg) {
129
+ return (Array.isArray(arg) &&
130
+ arg.every((row) => typeof row.scenario === 'string' &&
131
+ Array.isArray(row.columns) &&
132
+ row.columns.every((col) => typeof col.name === 'string' && typeof col.value === 'string')));
133
+ }
134
+ function parseCsvRows(input) {
135
+ if (input.length === 0) {
136
+ return [];
137
+ }
138
+ return input.map((rows) => ({
139
+ scenario: (0, csvUtil_1.desanitizeCellOutput)(rows[constants_1.SCENARIO_NAME_HEADER]),
140
+ columns: Object.entries(rows)
141
+ .filter(([key, _]) => key !== constants_1.SCENARIO_NAME_HEADER)
142
+ .map(([key, value]) => ({
143
+ name: (0, csvUtil_1.desanitizeCellOutput)(key),
144
+ value: (0, csvUtil_1.desanitizeCellOutput)(value),
145
+ })),
146
+ }));
147
+ }
148
+ exports.parseCsvRows = parseCsvRows;
@@ -8,7 +8,6 @@ const fileUtil_1 = require("../../commandUtil/fileUtil");
8
8
  const js_yaml_1 = require("js-yaml");
9
9
  const csvUtil_1 = require("../../../util/csvUtil");
10
10
  const sync_1 = require("csv-stringify/sync");
11
- const SCENARIO_NAME_HEADER = 'Scenario name';
12
11
  exports.command = `export <${constants_1.CommandArgId}>`;
13
12
  exports.describe = 'Export a mabl test in a specified file format';
14
13
  exports.builder = (yargs) => {
@@ -62,7 +61,7 @@ function dumpToCsv(datatableRows) {
62
61
  return '';
63
62
  }
64
63
  const headers = [
65
- SCENARIO_NAME_HEADER,
64
+ constants_1.SCENARIO_NAME_HEADER,
66
65
  ...(datatableRows[0].row || []).map((variable) => (0, csvUtil_1.sanitizeCellInput)(variable.name || '')),
67
66
  ];
68
67
  output.push(headers);
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.toBasicHttpAuthenticationCredentials = exports.logTestInfoIfPresent = exports.milliSecondsToSeconds = exports.calculateTotalTimeSeconds = exports.extractTestRunConfig = exports.pullDownTestRunConfig = exports.validateRunCommandWithLabels = exports.validateRunEditCommand = exports.cleanupTestResources = exports.sleep = exports.editTheTest = exports.runTheTest = exports.prepareTrainerForSplitPlayback = exports.cleanUpInitialPages = exports.getExtensionBackgroundPageWithCliTool = exports.createBrowserForExecutionEngine = exports.createBrowser = exports.getFinalUrl = void 0;
29
+ exports.parseBrowserType = exports.toBasicHttpAuthenticationCredentials = exports.logTestInfoIfPresent = exports.milliSecondsToSeconds = exports.calculateTotalTimeSeconds = exports.extractTestRunConfig = exports.pullDownTestRunConfig = exports.validateRunCommandWithLabels = exports.validateRunEditCommand = exports.cleanupTestResources = exports.sleep = exports.editTheTest = exports.runTheTest = exports.prepareTrainerForSplitPlayback = exports.cleanUpInitialPages = exports.getExtensionBackgroundPageWithCliTool = exports.createBrowserForExecutionEngine = exports.createBrowser = exports.getFinalUrl = void 0;
30
30
  const cli_table3_1 = __importDefault(require("cli-table3"));
31
31
  const fs = __importStar(require("fs-extra"));
32
32
  const os = __importStar(require("os"));
@@ -39,6 +39,7 @@ const cliConfigProvider_1 = require("../../providers/cliConfigProvider");
39
39
  const loggingProvider_1 = require("../../providers/logging/loggingProvider");
40
40
  const fileUploadUtil_1 = require("../../util/fileUploadUtil");
41
41
  const logUtils_1 = require("../../util/logUtils");
42
+ const browserTypes_1 = require("../browserTypes");
42
43
  const constants_1 = require("../constants");
43
44
  const trainerUtil_1 = require("./tests_cmds/trainerUtil");
44
45
  const chalk = require('chalk');
@@ -125,11 +126,13 @@ async function createBrowser(engine, options) {
125
126
  }
126
127
  exports.createBrowser = createBrowser;
127
128
  async function createBrowserForExecutionEngine(engine, proxyInfo, options) {
128
- const userDataDir = await engine.prepareBrowserPreferencesDirectory();
129
+ const userDataDir = await engine.prepareBrowserPreferencesDirectory(undefined, proxyInfo);
129
130
  const launchOptions = engine.getExecutionEngineBrowserLaunchOptions(options, proxyInfo);
131
+ const proxy = engine.getProxySpec(proxyInfo);
130
132
  const maybeBrowser = await maybeLaunchBrowser({
131
133
  ...options,
132
134
  ...launchOptions,
135
+ proxy,
133
136
  downloadPath: createDownloadDirectory(),
134
137
  userDataDir,
135
138
  });
@@ -469,3 +472,18 @@ function toBasicHttpAuthenticationCredentials(credentials) {
469
472
  };
470
473
  }
471
474
  exports.toBasicHttpAuthenticationCredentials = toBasicHttpAuthenticationCredentials;
475
+ function parseBrowserType(browserType) {
476
+ switch (browserType) {
477
+ case 'edge':
478
+ return browserTypes_1.BrowserType.Edge;
479
+ case 'firefox':
480
+ return browserTypes_1.BrowserType.Firefox;
481
+ case 'chrome':
482
+ return browserTypes_1.BrowserType.Chrome;
483
+ case 'webkit':
484
+ return browserTypes_1.BrowserType.Webkit;
485
+ default:
486
+ return constants_1.DefaultBrowserType;
487
+ }
488
+ }
489
+ exports.parseBrowserType = parseBrowserType;
@@ -7,7 +7,6 @@ const constants_1 = require("../../constants");
7
7
  const loggingProvider_1 = require("../../../providers/logging/loggingProvider");
8
8
  const mablApi_1 = require("../../../mablApi");
9
9
  const reporter_1 = require("../../../reporters/reporter");
10
- const browserTypes_1 = require("../../browserTypes");
11
10
  const execution_1 = require("../../../execution");
12
11
  const defaultEnv_1 = require("../../../env/defaultEnv");
13
12
  const chalk = require('chalk');
@@ -194,20 +193,7 @@ async function run(parsed) {
194
193
  extraHttpHeaders[headerParts[0].toLowerCase()] = headerParts[1];
195
194
  }
196
195
  });
197
- let browserType;
198
- switch (parsed[constants_1.CommandArgBrowser]) {
199
- case 'edge':
200
- browserType = browserTypes_1.BrowserType.Edge;
201
- break;
202
- case 'firefox':
203
- browserType = browserTypes_1.BrowserType.Firefox;
204
- break;
205
- case 'chrome':
206
- browserType = browserTypes_1.BrowserType.Chrome;
207
- break;
208
- default:
209
- browserType = constants_1.DefaultBrowserType;
210
- }
196
+ const browserType = (0, testsUtil_1.parseBrowserType)(parsed[constants_1.CommandArgBrowser]);
211
197
  const testRunnerConfig = {
212
198
  _cliCreated: true,
213
199
  basicAuthCredentialsId: parsed[constants_1.CommandArgBasicAuthCredentials],