@mablhq/mabl-cli 1.48.7 → 1.48.26

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 (35) hide show
  1. package/api/mablApiClient.js +11 -0
  2. package/browserEngines/chromiumBrowserEngine.js +3 -0
  3. package/browserEngines/firefoxBrowserEngine.js +8 -2
  4. package/browserEngines/unsupportedBrowserEngine.js +3 -0
  5. package/browserEngines/webkitBrowerEngine.js +11 -0
  6. package/browserLauncher/elementHandle.js +10 -1
  7. package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumElementHandleDelegate.js +63 -0
  8. package/browserLauncher/playwrightBrowserLauncher/chromium/chromiumPageDelegate.js +29 -10
  9. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxBrowserDelegate.js +36 -0
  10. package/browserLauncher/playwrightBrowserLauncher/firefox/firefoxElementHandleDelegate.js +4 -0
  11. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractBrowserDelegate.js +0 -35
  12. package/browserLauncher/playwrightBrowserLauncher/nonChromium/nonChromiumAbstractElementHandleDelegate.js +4 -0
  13. package/browserLauncher/playwrightBrowserLauncher/playwrightDom.js +35 -52
  14. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitBrowserDelegate.js +36 -0
  15. package/browserLauncher/playwrightBrowserLauncher/webkit/webkitElementHandleDelegate.js +9 -0
  16. package/commands/constants.js +5 -2
  17. package/commands/datatables/datatables_cmds/create.js +148 -0
  18. package/commands/datatables/datatables_cmds/export.js +1 -2
  19. package/commands/tests/testsUtil.js +19 -1
  20. package/commands/tests/tests_cmds/run.js +1 -15
  21. package/execution/index.js +1 -1
  22. package/index.d.ts +9 -0
  23. package/mablApi/index.js +1 -1
  24. package/mablscript/importer.js +2 -0
  25. package/mablscript/steps/DoubleClickStep.js +1 -1
  26. package/mablscript/steps/RightClickStep.js +57 -0
  27. package/mablscriptFind/index.js +1 -1
  28. package/package.json +2 -1
  29. package/popupDismissal/index.js +7 -2
  30. package/resources/mablFind.js +1 -1
  31. package/resources/popupDismissal.js +1 -1
  32. package/util/asyncUtil.js +1 -1
  33. package/util/browserTestUtils.js +2 -2
  34. package/util/clickUtil.js +24 -14
  35. package/util/csvUtil.js +6 -1
@@ -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');
@@ -127,9 +128,11 @@ exports.createBrowser = createBrowser;
127
128
  async function createBrowserForExecutionEngine(engine, proxyInfo, options) {
128
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],