@mablhq/mabl-cli 1.26.0 → 1.29.1
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/api/basicApiClient.js +1 -0
- package/api/mablApiClient.js +14 -0
- package/api/mablApiClientFactory.js +5 -4
- package/browserLauncher/playwrightBrowserLauncher/playwrightBrowserLauncher.js +7 -2
- package/browserLauncher/playwrightBrowserLauncher/playwrightDom.js +3 -0
- package/browserLauncher/playwrightBrowserLauncher/simplePlaywrightLogger.js +36 -0
- package/cli.js +1 -0
- package/commands/commandUtil/util.js +11 -5
- package/commands/config/config_cmds/configKeys.js +7 -1
- package/commands/config/config_cmds/set.js +6 -0
- package/commands/constants.js +3 -2
- package/commands/environments/environments_cmds/create.js +4 -4
- package/commands/tests/testsUtil.js +8 -4
- package/commands/tests/tests_cmds/run.js +23 -2
- package/commands/users/users.js +5 -0
- package/commands/users/users_cmds/list.js +58 -0
- package/domUtil/index.js +1 -1
- package/execution/index.js +1 -1
- package/mablscriptFind/index.js +1 -1
- package/package.json +4 -3
- package/providers/cliConfigProvider.js +6 -0
- package/resources/mablFind.js +1 -1
- package/util/asyncUtil.js +9 -5
- package/util/httpUtil.js +32 -12
package/api/basicApiClient.js
CHANGED
|
@@ -58,6 +58,7 @@ class BasicApiClient {
|
|
|
58
58
|
const config = (0, httpUtil_1.axiosProxyConfig)({
|
|
59
59
|
sslVerify: (_a = options.sslVerify) !== null && _a !== void 0 ? _a : DEFAULT_SSL_VERIFY,
|
|
60
60
|
proxyHost: options.proxyUrl,
|
|
61
|
+
proxyType: options.proxyType,
|
|
61
62
|
});
|
|
62
63
|
if (!config.headers) {
|
|
63
64
|
config.headers = {};
|
package/api/mablApiClient.js
CHANGED
|
@@ -745,6 +745,20 @@ class MablApiClient extends basicApiClient_1.BasicApiClient {
|
|
|
745
745
|
throw toApiError(`Failed to get feature flags for workspace ${workspaceId}`, error);
|
|
746
746
|
}
|
|
747
747
|
}
|
|
748
|
+
async getUsers(workspaceId, limit) {
|
|
749
|
+
try {
|
|
750
|
+
const userQueryString = queryString.stringify({
|
|
751
|
+
organization_id: workspaceId,
|
|
752
|
+
limit,
|
|
753
|
+
});
|
|
754
|
+
const users = await this.makeGetRequest(`${this.baseApiUrl}/users/?${userQueryString}`).then((result) => { var _a; return (_a = result.users) !== null && _a !== void 0 ? _a : []; });
|
|
755
|
+
sortTemporallyAscending(users);
|
|
756
|
+
return users;
|
|
757
|
+
}
|
|
758
|
+
catch (error) {
|
|
759
|
+
throw toApiError(`Failed to get users`, error);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
748
762
|
}
|
|
749
763
|
exports.MablApiClient = MablApiClient;
|
|
750
764
|
function sortTemporallyAscending(entities) {
|
|
@@ -32,11 +32,11 @@ class MablApiClientFactory {
|
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
static async createApiClient(opts) {
|
|
35
|
-
const {
|
|
36
|
-
.mabl;
|
|
35
|
+
const { mabl } = (await cliConfigProvider_1.CliConfigProvider.getCliConfig()).http;
|
|
37
36
|
const optsFromCliHttpConfig = {
|
|
38
|
-
proxyUrl: proxyHost,
|
|
39
|
-
sslVerify,
|
|
37
|
+
proxyUrl: mabl.proxyHost,
|
|
38
|
+
sslVerify: mabl.sslVerify,
|
|
39
|
+
proxyType: mabl.proxyType,
|
|
40
40
|
};
|
|
41
41
|
if (opts) {
|
|
42
42
|
return new mablApiClient_1.MablApiClient({
|
|
@@ -68,6 +68,7 @@ class MablApiClientFactory {
|
|
|
68
68
|
token: accessToken,
|
|
69
69
|
proxyUrl: httpConfig.proxyHost,
|
|
70
70
|
sslVerify: httpConfig.sslVerify,
|
|
71
|
+
proxyType: httpConfig.proxyType,
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
74
|
static throwUserAuthTypeError() {
|
|
@@ -5,6 +5,7 @@ const test_1 = require("@playwright/test");
|
|
|
5
5
|
const browserTypes_1 = require("../../commands/browserTypes");
|
|
6
6
|
const loggingProvider_1 = require("../../providers/logging/loggingProvider");
|
|
7
7
|
const playwrightBrowser_1 = require("./playwrightBrowser");
|
|
8
|
+
const simplePlaywrightLogger_1 = require("./simplePlaywrightLogger");
|
|
8
9
|
const BROWSER_LAUNCH_TIMEOUT_MS = 60000;
|
|
9
10
|
class PlaywrightBrowserLauncher {
|
|
10
11
|
async connect(options, currentDownloadPath) {
|
|
@@ -12,7 +13,7 @@ class PlaywrightBrowserLauncher {
|
|
|
12
13
|
return playwrightBrowser_1.PlaywrightBrowser.create(browser.contexts()[0], currentDownloadPath, options.browserWSEndpoint);
|
|
13
14
|
}
|
|
14
15
|
async launch(options) {
|
|
15
|
-
var _a, _b, _c;
|
|
16
|
+
var _a, _b, _c, _d;
|
|
16
17
|
const viewport = options.defaultDeviceDescriptor
|
|
17
18
|
? {
|
|
18
19
|
width: options.defaultDeviceDescriptor.width,
|
|
@@ -20,6 +21,9 @@ class PlaywrightBrowserLauncher {
|
|
|
20
21
|
}
|
|
21
22
|
:
|
|
22
23
|
null;
|
|
24
|
+
const playwrightLogger = options.providerLogger
|
|
25
|
+
? simplePlaywrightLogger_1.SimplePlaywrightLogger.createWarningLogger(options.providerLogger)
|
|
26
|
+
: undefined;
|
|
23
27
|
if (!options.userDataDir) {
|
|
24
28
|
loggingProvider_1.logger.error('User data directory is required to launch a persistent chromium context and was not provided with LaunchOptions [{}]', options);
|
|
25
29
|
throw new Error('User data directory is required to launch a persistent chromium context');
|
|
@@ -44,9 +48,10 @@ class PlaywrightBrowserLauncher {
|
|
|
44
48
|
ignoreDefaultArgs: options.ignoreDefaultArgs,
|
|
45
49
|
ignoreHTTPSErrors: true,
|
|
46
50
|
isMobile: (_c = options.defaultDeviceDescriptor) === null || _c === void 0 ? void 0 : _c.isMobile,
|
|
51
|
+
logger: playwrightLogger,
|
|
47
52
|
proxy: options.proxy,
|
|
48
53
|
timeout: BROWSER_LAUNCH_TIMEOUT_MS,
|
|
49
|
-
userAgent: options.userAgent,
|
|
54
|
+
userAgent: (_d = options.userAgent) !== null && _d !== void 0 ? _d : options.defaultUserAgent,
|
|
50
55
|
viewport,
|
|
51
56
|
});
|
|
52
57
|
return playwrightBrowser_1.PlaywrightBrowser.create(defaultContext, options.downloadPath, '', options.disableFocusEmulation);
|
|
@@ -326,6 +326,9 @@ class PlaywrightElementHandle extends PlaywrightJsHandle {
|
|
|
326
326
|
});
|
|
327
327
|
return (0, pureUtil_1.isNullish)(result) ? undefined : result;
|
|
328
328
|
}
|
|
329
|
+
async isInShadowRoot() {
|
|
330
|
+
return this.element.evaluate((el) => el.getRootNode().nodeName === '#document-fragment');
|
|
331
|
+
}
|
|
329
332
|
getActionTimeout(options) {
|
|
330
333
|
var _a;
|
|
331
334
|
const defaultTimeout = (options === null || options === void 0 ? void 0 : options.trial)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SimplePlaywrightLogger = void 0;
|
|
4
|
+
class SimplePlaywrightLogger {
|
|
5
|
+
constructor(logger, severityAllowList) {
|
|
6
|
+
this.logger = logger;
|
|
7
|
+
this.severityAllowList = severityAllowList;
|
|
8
|
+
}
|
|
9
|
+
static createWarningLogger(logger) {
|
|
10
|
+
return new SimplePlaywrightLogger(logger, new Set(['error', 'warning']));
|
|
11
|
+
}
|
|
12
|
+
isEnabled(_name, severity) {
|
|
13
|
+
return this.severityAllowList.has(severity);
|
|
14
|
+
}
|
|
15
|
+
log(name, severity, message, args, _hints) {
|
|
16
|
+
const msg = `[Playwright:${name}:${severity}] ${message} ${args}`;
|
|
17
|
+
switch (severity) {
|
|
18
|
+
case 'error':
|
|
19
|
+
this.logger.error(msg);
|
|
20
|
+
break;
|
|
21
|
+
case 'warning':
|
|
22
|
+
this.logger.warn(msg);
|
|
23
|
+
break;
|
|
24
|
+
case 'info':
|
|
25
|
+
this.logger.info(msg);
|
|
26
|
+
break;
|
|
27
|
+
case 'verbose':
|
|
28
|
+
this.logger.verbose(msg);
|
|
29
|
+
break;
|
|
30
|
+
default:
|
|
31
|
+
this.logger.info(msg);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.SimplePlaywrightLogger = SimplePlaywrightLogger;
|
package/cli.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.validateValuePairInputs = exports.validateArrayInputs = exports.getWorkspaceIdFromAppOrEnv = exports.getJourneyFlowArray = exports.TEST_INFO_NOT_FOUND = exports.getWorkspaceId = exports.failWrapper = exports.getDescribeDescriptions = void 0;
|
|
6
|
+
exports.parseColinJoinedVariablePair = exports.validateValuePairInputs = exports.validateArrayInputs = exports.getWorkspaceIdFromAppOrEnv = exports.getJourneyFlowArray = exports.TEST_INFO_NOT_FOUND = exports.getWorkspaceId = exports.failWrapper = exports.getDescribeDescriptions = void 0;
|
|
7
7
|
const cliConfigProvider_1 = require("../../providers/cliConfigProvider");
|
|
8
8
|
const constants_1 = require("../constants");
|
|
9
9
|
const loggingProvider_1 = require("../../providers/logging/loggingProvider");
|
|
@@ -91,10 +91,10 @@ function validateValuePairInputs(inputName, inputs) {
|
|
|
91
91
|
}
|
|
92
92
|
const wrappingWhitespace = inputs.filter((header) => !/^([^\s:]{1,2}|[^\s:][^:]+[^\s:]):([^\s:]{1,2}|[^\s:][^:]+[^\s:])?$/m.test(header));
|
|
93
93
|
if (wrappingWhitespace.length > 0) {
|
|
94
|
-
const cleanFunction = (header) =>
|
|
95
|
-
|
|
96
|
-
.map((part) => part.trim())
|
|
97
|
-
|
|
94
|
+
const cleanFunction = (header) => {
|
|
95
|
+
const { name, value } = parseColinJoinedVariablePair(header);
|
|
96
|
+
return [name, value].map((part) => part.trim()).join(':');
|
|
97
|
+
};
|
|
98
98
|
const cleaned = inputs.map(cleanFunction);
|
|
99
99
|
const cleanedAffectedHeaders = wrappingWhitespace.map(cleanFunction);
|
|
100
100
|
loggingProvider_1.logger.info(chalk.yellow.bold(`${inputName} wrapping whitespace detected. Whitespace has been trimmed to [`) +
|
|
@@ -106,3 +106,9 @@ function validateValuePairInputs(inputName, inputs) {
|
|
|
106
106
|
return inputs;
|
|
107
107
|
}
|
|
108
108
|
exports.validateValuePairInputs = validateValuePairInputs;
|
|
109
|
+
function parseColinJoinedVariablePair(input) {
|
|
110
|
+
const name = input.substring(0, input.indexOf(':'));
|
|
111
|
+
const value = input.substring(input.indexOf(':') + 1);
|
|
112
|
+
return { name, value };
|
|
113
|
+
}
|
|
114
|
+
exports.parseColinJoinedVariablePair = parseColinJoinedVariablePair;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isValidProxyMode = exports.proxyModes = exports.validConfigKeyChoices = exports.configKeys = void 0;
|
|
3
|
+
exports.isValidProxyType = exports.isValidProxyMode = exports.proxyTypes = exports.proxyModes = exports.validConfigKeyChoices = exports.configKeys = void 0;
|
|
4
4
|
exports.configKeys = Object.freeze({
|
|
5
5
|
browserPath: 'browser.path',
|
|
6
6
|
enableSourceControlMetadataCollection: 'alpha.scm_metadata.enable',
|
|
@@ -8,6 +8,7 @@ exports.configKeys = Object.freeze({
|
|
|
8
8
|
proxy: 'http.proxy',
|
|
9
9
|
sslVerify: 'http.sslVerify',
|
|
10
10
|
proxyMode: 'http.proxyMode',
|
|
11
|
+
proxyType: 'http.proxyType',
|
|
11
12
|
});
|
|
12
13
|
exports.validConfigKeyChoices = Object.values(exports.configKeys);
|
|
13
14
|
exports.proxyModes = [
|
|
@@ -16,7 +17,12 @@ exports.proxyModes = [
|
|
|
16
17
|
'all',
|
|
17
18
|
'none',
|
|
18
19
|
];
|
|
20
|
+
exports.proxyTypes = ['legacy', 'current'];
|
|
19
21
|
function isValidProxyMode(value) {
|
|
20
22
|
return exports.proxyModes.indexOf(value) !== -1;
|
|
21
23
|
}
|
|
22
24
|
exports.isValidProxyMode = isValidProxyMode;
|
|
25
|
+
function isValidProxyType(value) {
|
|
26
|
+
return exports.proxyTypes.indexOf(value) !== -1;
|
|
27
|
+
}
|
|
28
|
+
exports.isValidProxyType = isValidProxyType;
|
|
@@ -55,6 +55,12 @@ async function setConfig(parsed) {
|
|
|
55
55
|
}
|
|
56
56
|
await cliConfigProvider_1.CliConfigProvider.setConfigProperty(key, value);
|
|
57
57
|
break;
|
|
58
|
+
case configKeys_1.configKeys.proxyType:
|
|
59
|
+
if (!(0, configKeys_1.isValidProxyType)(value)) {
|
|
60
|
+
throw new Error(`Invalid proxy type. The value must be one of ${JSON.stringify(configKeys_1.proxyTypes)}`);
|
|
61
|
+
}
|
|
62
|
+
await cliConfigProvider_1.CliConfigProvider.setConfigProperty(key, value);
|
|
63
|
+
break;
|
|
58
64
|
default:
|
|
59
65
|
throw new Error(`<${exports.configKeyCommandArg}> value not one of supported types: ${JSON.stringify(configKeys_1.validConfigKeyChoices)}`);
|
|
60
66
|
}
|
package/commands/constants.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
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 = void 0;
|
|
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.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;
|
|
5
5
|
const browserTypes_1 = require("./browserTypes");
|
|
6
6
|
exports.CommandArgApiKey = 'api-key';
|
|
7
7
|
exports.CommandArgApplicationId = 'application-id';
|
|
8
|
+
exports.CommandArgBrowser = 'browser';
|
|
8
9
|
exports.CommandArgBrowsers = 'browsers';
|
|
9
10
|
exports.CommandArgBasicAuthCredentials = 'basic-auth-credentials-id';
|
|
10
11
|
exports.CommandArgCredentials = 'credentials-id';
|
|
@@ -88,10 +88,10 @@ function addUpdateEnvCommands(argv) {
|
|
|
88
88
|
return undefined;
|
|
89
89
|
}
|
|
90
90
|
(0, util_1.validateArrayInputs)(variables, 'Variables must be SPACE delimited, e.g. --variables foo:bar baz:qux');
|
|
91
|
-
|
|
92
|
-
return
|
|
93
|
-
const
|
|
94
|
-
variablesObject[
|
|
91
|
+
const validVariables = (0, util_1.validateValuePairInputs)('Variable', variables);
|
|
92
|
+
return validVariables.reduce((variablesObject, item) => {
|
|
93
|
+
const { name, value } = (0, util_1.parseColinJoinedVariablePair)(item);
|
|
94
|
+
variablesObject[name] = value;
|
|
95
95
|
return variablesObject;
|
|
96
96
|
}, {});
|
|
97
97
|
});
|
|
@@ -133,18 +133,21 @@ async function launchBrowserInstance(launchArgs, userDataDir, headless, credenti
|
|
|
133
133
|
return browser;
|
|
134
134
|
}
|
|
135
135
|
async function maybeGetProxyOptions(options) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
.proxyHost) === null || _a === void 0 ? void 0 : _a.href;
|
|
136
|
+
const proxyServer = (await cliConfigProvider_1.CliConfigProvider.getCliConfig()).http.test
|
|
137
|
+
.proxyHost;
|
|
139
138
|
let optionsProxy;
|
|
140
139
|
if (options === null || options === void 0 ? void 0 : options.proxy) {
|
|
141
140
|
optionsProxy = {
|
|
142
141
|
server: options.proxy.server,
|
|
142
|
+
username: options.proxy.username,
|
|
143
|
+
password: options.proxy.password,
|
|
143
144
|
};
|
|
144
145
|
}
|
|
145
146
|
else if (proxyServer) {
|
|
146
147
|
optionsProxy = {
|
|
147
|
-
server: proxyServer,
|
|
148
|
+
server: proxyServer.href,
|
|
149
|
+
username: proxyServer.username,
|
|
150
|
+
password: proxyServer.password,
|
|
148
151
|
};
|
|
149
152
|
}
|
|
150
153
|
return optionsProxy;
|
|
@@ -208,6 +211,7 @@ async function createBrowser(browserWidth, browserHeight, headless, containerTes
|
|
|
208
211
|
defaultDeviceDescriptor,
|
|
209
212
|
ignoreDefaultArgs,
|
|
210
213
|
userAgent: (_a = options === null || options === void 0 ? void 0 : options.userAgent) !== null && _a !== void 0 ? _a : emulationConfig === null || emulationConfig === void 0 ? void 0 : emulationConfig.device_config.user_agent,
|
|
214
|
+
defaultUserAgent: options === null || options === void 0 ? void 0 : options.defaultUserAgent,
|
|
211
215
|
});
|
|
212
216
|
if (!maybeBrowser) {
|
|
213
217
|
throw new Error('Unable to start Chrome session');
|
|
@@ -142,7 +142,7 @@ exports.builder = (yargs) => {
|
|
|
142
142
|
type: 'boolean',
|
|
143
143
|
})
|
|
144
144
|
.option(constants_1.CommandArgBrowserEnableExtensions, {
|
|
145
|
-
describe: 'Enable browser extensions on [Chrome]',
|
|
145
|
+
describe: 'Enable browser extensions on [Chrome] and [Edge]',
|
|
146
146
|
default: false,
|
|
147
147
|
type: 'boolean',
|
|
148
148
|
})
|
|
@@ -158,14 +158,27 @@ exports.builder = (yargs) => {
|
|
|
158
158
|
describe: 'Set the speed that mabl interacts with webpages. Overrides test run settings if specified.',
|
|
159
159
|
type: 'string',
|
|
160
160
|
choices: Object.keys(mablApi_1.JourneyParameters.PageLoadWaitEnum).map((pageLoadWait) => pageLoadWait.toLowerCase()),
|
|
161
|
+
})
|
|
162
|
+
.option(constants_1.CommandArgBrowser, {
|
|
163
|
+
describe: 'Target browser to execute the test against [chrome,edge]',
|
|
164
|
+
type: 'string',
|
|
165
|
+
nargs: 1,
|
|
166
|
+
choices: [browserTypes_1.BrowserType.Chrome, browserTypes_1.BrowserType.Edge],
|
|
167
|
+
hidden: true,
|
|
161
168
|
})
|
|
162
169
|
.check((argv) => {
|
|
163
170
|
(0, testsUtil_1.validateRunCommandWithLabels)(argv[constants_1.CommandArgId], argv[constants_1.CommandArgLabelsInclude], argv[constants_1.CommandArgLabelsExclude], argv[constants_1.CommandArgTestRunId], argv[constants_1.CommandArgFromPlanId], true, argv[constants_1.CommandArgTestFile]);
|
|
171
|
+
validateBrowserInput(argv[constants_1.CommandArgBrowser]);
|
|
164
172
|
const httpHeaders = argv[constants_1.CommandArgHttpHeaders];
|
|
165
173
|
(0, util_1.validateArrayInputs)(httpHeaders, 'HTTP headers must be SPACE delimited, e.g. "--http-headers "foo:bar" "baz:qux"');
|
|
166
174
|
argv[constants_1.CommandArgHttpHeaders] = (0, util_1.validateValuePairInputs)('HTTP header', httpHeaders);
|
|
167
175
|
return true;
|
|
168
176
|
});
|
|
177
|
+
function validateBrowserInput(browser) {
|
|
178
|
+
if (browser && !['chrome', 'edge'].includes(browser)) {
|
|
179
|
+
throw new Error('invalid browser type, valid browser types are [chrome,edge]');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
169
182
|
};
|
|
170
183
|
const exitCodeOnError = 1;
|
|
171
184
|
exports.handler = (0, util_1.failWrapper)(run, exitCodeOnError);
|
|
@@ -185,11 +198,19 @@ async function run(parsed) {
|
|
|
185
198
|
extraHttpHeaders[headerParts[0].toLowerCase()] = headerParts[1];
|
|
186
199
|
}
|
|
187
200
|
});
|
|
201
|
+
let browserType;
|
|
202
|
+
switch (parsed[constants_1.CommandArgBrowser]) {
|
|
203
|
+
case 'edge':
|
|
204
|
+
browserType = browserTypes_1.BrowserType.Edge;
|
|
205
|
+
break;
|
|
206
|
+
default:
|
|
207
|
+
browserType = browserTypes_1.BrowserType.Chrome;
|
|
208
|
+
}
|
|
188
209
|
const testRunnerConfig = {
|
|
189
210
|
_cliCreated: true,
|
|
190
211
|
basicAuthCredentialsId: parsed[constants_1.CommandArgBasicAuthCredentials],
|
|
191
212
|
branchName: parsed['mabl-branch'],
|
|
192
|
-
browserType
|
|
213
|
+
browserType,
|
|
193
214
|
credentialsId: parsed['credentials-id'],
|
|
194
215
|
disableIsolation: parsed[constants_1.CommandArgBrowserDisableIsolation],
|
|
195
216
|
enableExtensions: parsed[constants_1.CommandArgBrowserEnableExtensions],
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const js_yaml_1 = require("js-yaml");
|
|
7
|
+
const mablApiClientFactory_1 = require("../../../api/mablApiClientFactory");
|
|
8
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
9
|
+
const moment = require("moment");
|
|
10
|
+
const util_1 = require("../../commandUtil/util");
|
|
11
|
+
const constants_1 = require("../../constants");
|
|
12
|
+
const loggingProvider_1 = require("../../../providers/logging/loggingProvider");
|
|
13
|
+
const list_1 = require("../../commandUtil/list");
|
|
14
|
+
exports.command = 'list';
|
|
15
|
+
exports.describe = 'List users from a workspace';
|
|
16
|
+
exports.builder = (0, list_1.getListBuilderOptions)('users');
|
|
17
|
+
exports.handler = (0, util_1.failWrapper)(listUsers);
|
|
18
|
+
async function listUsers(parsed) {
|
|
19
|
+
const output = parsed.output;
|
|
20
|
+
const workspaceId = await (0, util_1.getWorkspaceId)(parsed);
|
|
21
|
+
const limit = parsed.limit;
|
|
22
|
+
const apiClient = await mablApiClientFactory_1.MablApiClientFactory.createApiClient();
|
|
23
|
+
const users = await apiClient.getUsers(workspaceId, limit);
|
|
24
|
+
printUsers(users, output, workspaceId);
|
|
25
|
+
return users.length;
|
|
26
|
+
}
|
|
27
|
+
function printUsers(users, outputFormat, workspaceId) {
|
|
28
|
+
switch (outputFormat) {
|
|
29
|
+
case 'json':
|
|
30
|
+
loggingProvider_1.logger.info(JSON.stringify(users, null, 2));
|
|
31
|
+
break;
|
|
32
|
+
case 'yaml':
|
|
33
|
+
loggingProvider_1.logger.info((0, js_yaml_1.dump)(users));
|
|
34
|
+
break;
|
|
35
|
+
default:
|
|
36
|
+
const table = new cli_table3_1.default({
|
|
37
|
+
head: ['ID', 'Name', 'Role', 'Email', 'Created time'],
|
|
38
|
+
wordWrap: true,
|
|
39
|
+
});
|
|
40
|
+
users.forEach((user) => {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
const userRole = (_c = (_b = (_a = user.roles) === null || _a === void 0 ? void 0 : _a.find((role) => role.organization_id === workspaceId)) === null || _b === void 0 ? void 0 : _b.role) !== null && _c !== void 0 ? _c : 'unknown';
|
|
43
|
+
table.push([
|
|
44
|
+
{ rowSpan: 1, content: user.id, vAlign: 'center' },
|
|
45
|
+
{ rowSpan: 1, content: user.name, vAlign: 'center' },
|
|
46
|
+
{ rowSpan: 1, content: userRole, vAlign: 'center' },
|
|
47
|
+
{ rowSpan: 1, content: user.email, vAlign: 'center' },
|
|
48
|
+
{
|
|
49
|
+
rowSpan: 1,
|
|
50
|
+
content: moment.utc(user.created_time).format(constants_1.ListTimeFormat),
|
|
51
|
+
vAlign: 'center',
|
|
52
|
+
},
|
|
53
|
+
]);
|
|
54
|
+
});
|
|
55
|
+
loggingProvider_1.logger.info(table.toString());
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|