@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.
@@ -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 = {};
@@ -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 { proxyHost, sslVerify } = (await cliConfigProvider_1.CliConfigProvider.getCliConfig()).http
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
@@ -60,6 +60,7 @@ yargs
60
60
  .commandDir('./commands/plans')
61
61
  .commandDir('./commands/tests')
62
62
  .commandDir('./commands/test-runs')
63
+ .commandDir('./commands/users')
63
64
  .commandDir('./commands/workspaces')
64
65
  .demandCommand(1, '')
65
66
  .recommendCommands()
@@ -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) => header
95
- .split(':', 2)
96
- .map((part) => part.trim())
97
- .join(':');
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
  }
@@ -1,10 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CommandArgUrlApp = 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.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 = 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
- variables = (0, util_1.validateValuePairInputs)('Variable', variables);
92
- return variables.reduce((variablesObject, item) => {
93
- const parts = item.split(':', 2);
94
- variablesObject[parts[0]] = parts[1];
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
- var _a;
137
- const proxyServer = (_a = (await cliConfigProvider_1.CliConfigProvider.getCliConfig()).http.test
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: browserTypes_1.BrowserType.Chrome,
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,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.command = 'users <command>';
4
+ exports.describe = 'mabl users related commands';
5
+ exports.builder = (yargs) => yargs.commandDir('users_cmds').demandCommand();
@@ -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
+ }