socket 0.14.63 → 0.14.65

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.
@@ -20,6 +20,7 @@ var commonTags = _socketInterop(require('common-tags'));
20
20
  var fs = require('node:fs/promises');
21
21
  var ScreenWidget = _socketInterop(require('blessed/lib/widgets/screen'));
22
22
  var contrib = _socketInterop(require('blessed-contrib'));
23
+ var strings = require('@socketsecurity/registry/lib/strings');
23
24
  var shadowNpmInject = require('./shadow-npm-inject.js');
24
25
  var constants = require('./constants.js');
25
26
  var path$1 = require('node:path');
@@ -47,7 +48,6 @@ var semver = _socketInterop(require('semver'));
47
48
  var which = _socketInterop(require('which'));
48
49
  var index_cjs = require('@socketregistry/hyrious__bun.lockb/index.cjs');
49
50
  var sorts = require('@socketsecurity/registry/lib/sorts');
50
- var strings = require('@socketsecurity/registry/lib/strings');
51
51
  var registryConstants = require('@socketsecurity/registry/lib/constants');
52
52
  var isInteractive = require('@socketregistry/is-interactive/index.cjs');
53
53
  var terminalLink = _socketInterop(require('terminal-link'));
@@ -64,9 +64,6 @@ var BoxWidget = _socketInterop(require('blessed/lib/widgets/box'));
64
64
  var TableWidget = _socketInterop(require('blessed-contrib/lib/widget/table'));
65
65
  var readline$1 = require('node:readline');
66
66
 
67
- const {
68
- API_V0_URL
69
- } = constants;
70
67
  function handleUnsuccessfulApiResponse(_name, result) {
71
68
  // SocketSdkErrorType['error'] is not typed.
72
69
  const resultErrorMessage = result.error?.message;
@@ -98,13 +95,20 @@ async function handleAPIError(code) {
98
95
  return 'One of the options passed might be incorrect.';
99
96
  } else if (code === 403) {
100
97
  return 'You might be trying to access an organization that is not linked to the API key you are logged in with.';
101
- }
98
+ } else ;
102
99
  }
103
100
  function getLastFiveOfApiToken(token) {
104
101
  // Get the last 5 characters of the API token before the trailing "_api".
105
102
  return token.slice(-9, -4);
106
103
  }
104
+
105
+ // The API server that should be used for operations.
106
+ function getDefaultApiBaseUrl() {
107
+ const baseUrl = process$1.env['SOCKET_SECURITY_API_BASE_URL'] || shadowNpmInject.getSetting('apiBaseUrl');
108
+ return strings.isNonEmptyString(baseUrl) ? baseUrl : undefined;
109
+ }
107
110
  async function queryAPI(path, apiToken) {
111
+ const API_V0_URL = getDefaultApiBaseUrl();
108
112
  return await fetch(`${API_V0_URL}/${path}`, {
109
113
  method: 'GET',
110
114
  headers: {
@@ -650,7 +654,7 @@ function emitBanner(name) {
650
654
  }
651
655
  function getAsciiHeader(command) {
652
656
  const cliVersion = // The '@rollup/plugin-replace' will replace "process.env['INLINED_SOCKET_CLI_VERSION_HASH']".
653
- "0.14.63:988a495:b9768528:pub";
657
+ "0.14.65:ace6cae:00eaf610:pub";
654
658
  const nodeVersion = process.version;
655
659
  const apiToken = shadowNpmInject.getSetting('apiToken');
656
660
  const shownToken = apiToken ? getLastFiveOfApiToken(apiToken) : 'no';
@@ -775,7 +779,7 @@ async function run$C(argv, importMeta, {
775
779
  });
776
780
  }
777
781
 
778
- async function getAuditLog({
782
+ async function fetchAuditLog({
779
783
  logType,
780
784
  orgSlug,
781
785
  outputKind,
@@ -786,16 +790,59 @@ async function getAuditLog({
786
790
  if (!apiToken) {
787
791
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
788
792
  }
789
- const auditLogs = await getAuditLogWithToken({
790
- apiToken,
793
+ return await fetchAuditLogWithToken(apiToken, {
794
+ logType,
791
795
  orgSlug,
792
796
  outputKind,
793
797
  page,
794
- perPage,
795
- logType
798
+ perPage
796
799
  });
797
- if (!auditLogs) return;
798
- if (outputKind === 'json') await outputAsJson(auditLogs.results, orgSlug, logType, page, perPage);else if (outputKind === 'markdown') await outputAsMarkdown(auditLogs.results, orgSlug, logType, page, perPage);else await outputAsPrint(auditLogs.results, orgSlug, logType);
800
+ }
801
+ async function fetchAuditLogWithToken(apiToken, {
802
+ logType,
803
+ orgSlug,
804
+ outputKind,
805
+ page,
806
+ perPage
807
+ }) {
808
+ // Lazily access constants.spinner.
809
+ const {
810
+ spinner
811
+ } = constants;
812
+ spinner.start(`Looking up audit log for ${orgSlug}`);
813
+ const socketSdk = await shadowNpmInject.setupSdk(apiToken);
814
+ const result = await handleApiCall(socketSdk.getAuditLogEvents(orgSlug, {
815
+ // I'm not sure this is used at all.
816
+ outputJson: String(outputKind === 'json'),
817
+ // I'm not sure this is used at all.
818
+ outputMarkdown: String(outputKind === 'markdown'),
819
+ orgSlug,
820
+ type: logType,
821
+ page: String(page),
822
+ per_page: String(perPage)
823
+ }), `Looking up audit log for ${orgSlug}\n`);
824
+ if (!result.success) {
825
+ handleUnsuccessfulApiResponse('getAuditLogEvents', result);
826
+ return;
827
+ }
828
+ spinner.stop();
829
+ return result.data;
830
+ }
831
+
832
+ async function outputAuditLog(auditLogs, {
833
+ logType,
834
+ orgSlug,
835
+ outputKind,
836
+ page,
837
+ perPage
838
+ }) {
839
+ if (outputKind === 'json') {
840
+ await outputAsJson(auditLogs.results, orgSlug, logType, page, perPage);
841
+ } else if (outputKind === 'markdown') {
842
+ await outputAsMarkdown(auditLogs.results, orgSlug, logType, page, perPage);
843
+ } else {
844
+ await outputAsPrint(auditLogs.results, orgSlug, logType);
845
+ }
799
846
  }
800
847
  async function outputAsJson(auditLogs, orgSlug, logType, page, perPage) {
801
848
  let json;
@@ -881,36 +928,29 @@ async function outputAsPrint(auditLogs, orgSlug, logType) {
881
928
  pageSize: 30
882
929
  })]);
883
930
  }
884
- async function getAuditLogWithToken({
885
- apiToken,
931
+
932
+ async function handleAuditLog({
886
933
  logType,
887
934
  orgSlug,
888
935
  outputKind,
889
936
  page,
890
937
  perPage
891
938
  }) {
892
- // Lazily access constants.spinner.
893
- const {
894
- spinner
895
- } = constants;
896
- spinner.start(`Looking up audit log for ${orgSlug}`);
897
- const socketSdk = await shadowNpmInject.setupSdk(apiToken);
898
- const result = await handleApiCall(socketSdk.getAuditLogEvents(orgSlug, {
899
- // I'm not sure this is used at all.
900
- outputJson: String(outputKind === 'json'),
901
- // I'm not sure this is used at all.
902
- outputMarkdown: String(outputKind === 'markdown'),
939
+ const auditLogs = await fetchAuditLog({
903
940
  orgSlug,
904
- type: logType,
905
- page: String(page),
906
- per_page: String(perPage)
907
- }), `Looking up audit log for ${orgSlug}\n`);
908
- if (!result.success) {
909
- handleUnsuccessfulApiResponse('getAuditLogEvents', result);
910
- return;
911
- }
912
- spinner.stop();
913
- return result.data;
941
+ outputKind,
942
+ page,
943
+ perPage,
944
+ logType
945
+ });
946
+ if (!auditLogs) return;
947
+ await outputAuditLog(auditLogs, {
948
+ logType,
949
+ orgSlug,
950
+ outputKind,
951
+ page,
952
+ perPage
953
+ });
914
954
  }
915
955
 
916
956
  const {
@@ -994,7 +1034,7 @@ async function run$B(argv, importMeta, {
994
1034
  logger.logger.log(DRY_RUN_BAIL_TEXT$A);
995
1035
  return;
996
1036
  }
997
- await getAuditLog({
1037
+ await handleAuditLog({
998
1038
  orgSlug,
999
1039
  outputKind: json ? 'json' : markdown ? 'markdown' : 'print',
1000
1040
  page: Number(page || 0),
@@ -1253,36 +1293,60 @@ async function run$A(argv, importMeta, {
1253
1293
  await runCycloneDX(yargv);
1254
1294
  }
1255
1295
 
1256
- // @ts-ignore
1257
- async function findDependencies({
1296
+ async function fetchDependencies({
1258
1297
  limit,
1259
- offset,
1260
- outputJson
1298
+ offset
1261
1299
  }) {
1262
1300
  const apiToken = shadowNpmInject.getDefaultToken();
1263
1301
  if (!apiToken) {
1264
1302
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
1265
1303
  }
1304
+ return await fetchDependenciesWithToken(apiToken, {
1305
+ limit,
1306
+ offset
1307
+ });
1308
+ }
1309
+ async function fetchDependenciesWithToken(apiToken, {
1310
+ limit,
1311
+ offset
1312
+ }) {
1266
1313
  // Lazily access constants.spinner.
1267
1314
  const {
1268
1315
  spinner
1269
1316
  } = constants;
1270
- spinner.start('Searching dependencies...');
1317
+ spinner.start('Fetching organization dependencies...');
1271
1318
  const socketSdk = await shadowNpmInject.setupSdk(apiToken);
1272
1319
  const result = await handleApiCall(socketSdk.searchDependencies({
1273
1320
  limit,
1274
1321
  offset
1275
1322
  }), 'Searching dependencies');
1323
+ spinner?.successAndStop('Received organization dependencies response.');
1276
1324
  if (!result.success) {
1277
1325
  handleUnsuccessfulApiResponse('searchDependencies', result);
1278
1326
  return;
1279
1327
  }
1280
- spinner.stop('Organization dependencies:');
1281
- if (outputJson) {
1282
- logger.logger.log(result.data);
1328
+ return result.data;
1329
+ }
1330
+
1331
+ // @ts-ignore
1332
+ async function outputDependencies(data, {
1333
+ limit,
1334
+ offset,
1335
+ outputKind
1336
+ }) {
1337
+ if (outputKind === 'json') {
1338
+ let json;
1339
+ try {
1340
+ json = JSON.stringify(data, null, 2);
1341
+ } catch (e) {
1342
+ process.exitCode = 1;
1343
+ logger.logger.fail('There was a problem converting the data to JSON, please try without the `--json` flag');
1344
+ return;
1345
+ }
1346
+ logger.logger.log(json);
1283
1347
  return;
1284
1348
  }
1285
- logger.logger.log('Request details: Offset:', offset, ', limit:', limit, ', is there more data after this?', result.data.end ? 'no' : 'yes');
1349
+ logger.logger.log('Request details: Offset:', offset, ', limit:', limit, ', is there more data after this?', data.end ? 'no' : 'yes');
1286
1350
  const options = {
1287
1351
  columns: [{
1288
1352
  field: 'namespace',
@@ -1307,7 +1371,24 @@ async function findDependencies({
1307
1371
  name: colors.cyan('Direct')
1308
1372
  }]
1309
1373
  };
1310
- logger.logger.log(chalkTable(options, result.data.rows));
1374
+ logger.logger.log(chalkTable(options, data.rows));
1375
+ }
1376
+
1377
+ async function handleDependencies({
1378
+ limit,
1379
+ offset,
1380
+ outputKind
1381
+ }) {
1382
+ const data = await fetchDependencies({
1383
+ limit,
1384
+ offset
1385
+ });
1386
+ if (!data) return;
1387
+ await outputDependencies(data, {
1388
+ limit,
1389
+ offset,
1390
+ outputKind
1391
+ });
1311
1392
  }
1312
1393
 
1313
1394
  const {
@@ -1358,70 +1439,71 @@ async function run$z(argv, importMeta, {
1358
1439
  importMeta,
1359
1440
  parentName
1360
1441
  });
1442
+ const {
1443
+ json,
1444
+ limit,
1445
+ markdown,
1446
+ offset
1447
+ } = cli.flags;
1361
1448
  if (cli.flags['dryRun']) {
1362
1449
  logger.logger.log(DRY_RUN_BAIL_TEXT$y);
1363
1450
  return;
1364
1451
  }
1365
-
1366
- // TODO: markdown flag is ignored
1367
- await findDependencies({
1368
- limit: Number(cli.flags['limit'] || 0) || 0,
1369
- offset: Number(cli.flags['offset'] || 0) || 0,
1370
- outputJson: Boolean(cli.flags['json'])
1452
+ await handleDependencies({
1453
+ limit: Number(limit || 0) || 0,
1454
+ offset: Number(offset || 0) || 0,
1455
+ outputKind: json ? 'json' : markdown ? 'markdown' : 'text'
1371
1456
  });
1372
1457
  }
1373
1458
 
1374
- async function getDiffScan({
1459
+ async function fetchDiffScan({
1375
1460
  after,
1376
1461
  before,
1377
- depth,
1378
- file,
1379
- orgSlug,
1380
- outputJson
1462
+ orgSlug
1381
1463
  }) {
1382
1464
  const apiToken = shadowNpmInject.getDefaultToken();
1383
1465
  if (!apiToken) {
1384
1466
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
1385
1467
  }
1386
- await getDiffScanWithToken({
1468
+ return await fetchDiffScanWithToken(apiToken, {
1387
1469
  after,
1388
1470
  before,
1389
- depth,
1390
- file,
1391
- orgSlug,
1392
- outputJson,
1393
- apiToken
1471
+ orgSlug
1394
1472
  });
1395
1473
  }
1396
- async function getDiffScanWithToken({
1474
+ async function fetchDiffScanWithToken(apiToken, {
1397
1475
  after,
1398
- apiToken,
1399
1476
  before,
1400
- depth,
1401
- file,
1402
- orgSlug,
1403
- outputJson
1477
+ orgSlug
1404
1478
  }) {
1405
1479
  // Lazily access constants.spinner.
1406
1480
  const {
1407
1481
  spinner
1408
1482
  } = constants;
1409
- spinner.start('Getting diff scan...');
1483
+ spinner.start('Fetching diff-scan...');
1410
1484
  const response = await queryAPI(`orgs/${orgSlug}/full-scans/diff?before=${encodeURIComponent(before)}&after=${encodeURIComponent(after)}`, apiToken);
1485
+ spinner?.successAndStop('Received diff-scan response');
1411
1486
  if (!response.ok) {
1412
1487
  const err = await handleAPIError(response.status);
1413
1488
  spinner.errorAndStop(`${colors.bgRed(colors.white(response.statusText))}: ${err}`);
1414
1489
  return;
1415
1490
  }
1416
1491
  const result = await handleApiCall(await response.json(), 'Deserializing json');
1417
- spinner.stop();
1418
- const dashboardUrl = result?.['diff_report_url'];
1492
+ return result;
1493
+ }
1494
+
1495
+ async function outputDiffScan(result, {
1496
+ depth,
1497
+ file,
1498
+ outputKind
1499
+ }) {
1500
+ const dashboardUrl = result.diff_report_url;
1419
1501
  const dashboardMessage = dashboardUrl ? `\n View this diff scan in the Socket dashboard: ${colors.cyan(dashboardUrl)}` : '';
1420
1502
 
1421
1503
  // When forcing json, or dumping to file, serialize to string such that it
1422
1504
  // won't get truncated. The only way to dump the full raw JSON to stdout is
1423
1505
  // to use `--json --file -` (the dash is a standard notation for stdout)
1424
- if (outputJson || file) {
1506
+ if (outputKind === 'json' || file) {
1425
1507
  let json;
1426
1508
  try {
1427
1509
  json = JSON.stringify(result, null, 2);
@@ -1466,6 +1548,27 @@ async function getDiffScanWithToken({
1466
1548
  logger.logger.log(dashboardMessage);
1467
1549
  }
1468
1550
 
1551
+ async function handleDiffScan({
1552
+ after,
1553
+ before,
1554
+ depth,
1555
+ file,
1556
+ orgSlug,
1557
+ outputKind
1558
+ }) {
1559
+ const data = await fetchDiffScan({
1560
+ after,
1561
+ before,
1562
+ orgSlug
1563
+ });
1564
+ if (!data) return;
1565
+ await outputDiffScan(data, {
1566
+ depth,
1567
+ file,
1568
+ outputKind
1569
+ });
1570
+ }
1571
+
1469
1572
  const {
1470
1573
  DRY_RUN_BAIL_TEXT: DRY_RUN_BAIL_TEXT$x
1471
1574
  } = constants;
@@ -1534,8 +1637,14 @@ async function run$y(argv, importMeta, {
1534
1637
  importMeta,
1535
1638
  parentName
1536
1639
  });
1537
- const before = String(cli.flags['before'] || '');
1538
- const after = String(cli.flags['after'] || '');
1640
+ const {
1641
+ after,
1642
+ before,
1643
+ depth,
1644
+ file,
1645
+ json,
1646
+ markdown
1647
+ } = cli.flags;
1539
1648
  const [orgSlug = ''] = cli.input;
1540
1649
  if (!before || !after || cli.input.length < 1) {
1541
1650
  // Use exit status of 2 to indicate incorrect usage, generally invalid
@@ -1553,13 +1662,13 @@ async function run$y(argv, importMeta, {
1553
1662
  logger.logger.log(DRY_RUN_BAIL_TEXT$x);
1554
1663
  return;
1555
1664
  }
1556
- await getDiffScan({
1557
- outputJson: Boolean(cli.flags['json']),
1558
- before,
1559
- after,
1560
- depth: Number(cli.flags['depth']),
1665
+ await handleDiffScan({
1666
+ before: String(before || ''),
1667
+ after: String(after || ''),
1668
+ depth: Number(depth),
1561
1669
  orgSlug,
1562
- file: String(cli.flags['file'] || '')
1670
+ outputKind: json ? 'json' : markdown ? 'markdown' : 'text',
1671
+ file: String(file || '')
1563
1672
  });
1564
1673
  }
1565
1674
 
@@ -1698,11 +1807,17 @@ async function npmFix(_pkgEnvDetails, cwd, options) {
1698
1807
 
1699
1808
  async function getAlertsMapFromPnpmLockfile(lockfile, options) {
1700
1809
  const {
1810
+ include: _include,
1701
1811
  spinner
1702
1812
  } = {
1703
1813
  __proto__: null,
1704
1814
  ...options
1705
1815
  };
1816
+ const include = {
1817
+ __proto__: null,
1818
+ unfixable: true,
1819
+ ..._include
1820
+ };
1706
1821
  const depTypes = lockfile_detectDepTypes.detectDepTypes(lockfile);
1707
1822
  const pkgIds = Object.keys(depTypes);
1708
1823
  let {
@@ -1714,12 +1829,23 @@ async function getAlertsMapFromPnpmLockfile(lockfile, options) {
1714
1829
  }
1715
1830
  const getText = () => `Looking up data for ${remaining} packages`;
1716
1831
  spinner?.start(getText());
1832
+ const socketSdk = await shadowNpmInject.setupSdk(shadowNpmInject.getPublicToken());
1717
1833
  const toAlertsMapOptions = {
1718
1834
  overrides: lockfile.overrides,
1719
1835
  ...options
1720
1836
  };
1721
- for await (const artifact of shadowNpmInject.batchScan(pkgIds)) {
1722
- await shadowNpmInject.addArtifactToAlertsMap(artifact, alertsByPkgId, toAlertsMapOptions);
1837
+ for await (const batchPackageFetchResult of socketSdk.batchPackageStream({
1838
+ alerts: 'true',
1839
+ compact: 'true',
1840
+ fixable: include.unfixable ? 'false' : 'true'
1841
+ }, {
1842
+ components: pkgIds.map(id => ({
1843
+ purl: `pkg:npm/${id}`
1844
+ }))
1845
+ })) {
1846
+ if (batchPackageFetchResult.success) {
1847
+ await shadowNpmInject.addArtifactToAlertsMap(batchPackageFetchResult.data, alertsByPkgId, toAlertsMapOptions);
1848
+ }
1723
1849
  remaining -= 1;
1724
1850
  if (spinner && remaining > 0) {
1725
1851
  spinner.start();
@@ -2306,10 +2432,17 @@ async function run$x(argv, importMeta, {
2306
2432
  await runFix();
2307
2433
  }
2308
2434
 
2309
- async function fetchPackageInfo$1(pkgName, pkgVersion, includeAllIssues) {
2435
+ async function fetchPackageInfo(pkgName, pkgVersion, includeAllIssues) {
2310
2436
  const socketSdk = await shadowNpmInject.setupSdk(shadowNpmInject.getPublicToken());
2437
+
2438
+ // Lazily access constants.spinner.
2439
+ const {
2440
+ spinner
2441
+ } = constants;
2442
+ spinner.start(pkgVersion === 'latest' ? `Looking up data for the latest version of ${pkgName}` : `Looking up data for version ${pkgVersion} of ${pkgName}`);
2311
2443
  const result = await handleApiCall(socketSdk.getIssuesByNPMPackage(pkgName, pkgVersion), 'looking up package');
2312
2444
  const scoreResult = await handleApiCall(socketSdk.getScoreByNPMPackage(pkgName, pkgVersion), 'looking up package score');
2445
+ spinner.successAndStop('Data fetched');
2313
2446
  if (result.success === false) {
2314
2447
  return handleUnsuccessfulApiResponse('getIssuesByNPMPackage', result);
2315
2448
  }
@@ -2335,7 +2468,7 @@ function formatScore$1(score) {
2335
2468
  }
2336
2469
  return colors.red(`${score}`);
2337
2470
  }
2338
- function logPackageIssuesDetails(packageData, outputMarkdown) {
2471
+ function outputPackageIssuesDetails(packageData, outputMarkdown) {
2339
2472
  const issueDetails = packageData.filter(d => d.value?.severity === shadowNpmInject.SEVERITY.critical || d.value?.severity === shadowNpmInject.SEVERITY.high);
2340
2473
  const uniqueIssueDetails = issueDetails.reduce((acc, issue) => {
2341
2474
  const {
@@ -2366,7 +2499,7 @@ function logPackageIssuesDetails(packageData, outputMarkdown) {
2366
2499
  }
2367
2500
  }
2368
2501
  }
2369
- function logPackageInfo$1({
2502
+ function outputPackageInfo({
2370
2503
  data,
2371
2504
  score,
2372
2505
  severityCount
@@ -2404,7 +2537,7 @@ function logPackageInfo$1({
2404
2537
  logger.logger.log('# Issues\n');
2405
2538
  }
2406
2539
  logger.logger.log(`Package has these issues: ${shadowNpmInject.formatSeverityCount(severityCount)}\n`);
2407
- logPackageIssuesDetails(data, outputKind === 'markdown');
2540
+ outputPackageIssuesDetails(data, outputKind === 'markdown');
2408
2541
  } else {
2409
2542
  logger.logger.log('Package has no issues');
2410
2543
  }
@@ -2427,7 +2560,7 @@ function logPackageInfo$1({
2427
2560
  }
2428
2561
  }
2429
2562
 
2430
- async function getPackageInfo({
2563
+ async function handlePackageInfo({
2431
2564
  commandName,
2432
2565
  includeAllIssues,
2433
2566
  outputKind,
@@ -2435,15 +2568,9 @@ async function getPackageInfo({
2435
2568
  pkgVersion,
2436
2569
  strict
2437
2570
  }) {
2438
- // Lazily access constants.spinner.
2439
- const {
2440
- spinner
2441
- } = constants;
2442
- spinner.start(pkgVersion === 'latest' ? `Looking up data for the latest version of ${pkgName}` : `Looking up data for version ${pkgVersion} of ${pkgName}`);
2443
- const packageData = await fetchPackageInfo$1(pkgName, pkgVersion, includeAllIssues);
2444
- spinner.successAndStop('Data fetched');
2571
+ const packageData = await fetchPackageInfo(pkgName, pkgVersion, includeAllIssues);
2445
2572
  if (packageData) {
2446
- logPackageInfo$1(packageData, {
2573
+ outputPackageInfo(packageData, {
2447
2574
  name: commandName,
2448
2575
  outputKind,
2449
2576
  pkgName,
@@ -2518,7 +2645,7 @@ async function run$w(argv, importMeta, {
2518
2645
  logger.logger.log(DRY_RUN_BAIL_TEXT$v);
2519
2646
  return;
2520
2647
  }
2521
- await getPackageInfo({
2648
+ await handlePackageInfo({
2522
2649
  commandName: `${parentName} ${config$w.commandName}`,
2523
2650
  includeAllIssues: Boolean(all),
2524
2651
  outputKind: json ? 'json' : markdown ? 'markdown' : 'print',
@@ -4408,29 +4535,35 @@ async function run$l(argv, importMeta, {
4408
4535
  await applyOptimization(cwd, Boolean(cli.flags['pin']), Boolean(cli.flags['prod']));
4409
4536
  }
4410
4537
 
4411
- async function getOrganization(format = 'text') {
4538
+ async function fetchOrganization() {
4412
4539
  const apiToken = shadowNpmInject.getDefaultToken();
4413
4540
  if (!apiToken) {
4414
4541
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
4415
4542
  }
4416
- await printOrganizationsFromToken(apiToken, format);
4543
+ return await fetchOrganizationWithToken(apiToken);
4417
4544
  }
4418
- async function printOrganizationsFromToken(apiToken, format = 'text') {
4545
+ async function fetchOrganizationWithToken(apiToken) {
4546
+ const socketSdk = await shadowNpmInject.setupSdk(apiToken);
4547
+
4419
4548
  // Lazily access constants.spinner.
4420
4549
  const {
4421
4550
  spinner
4422
4551
  } = constants;
4423
- spinner.start('Fetching organizations...');
4424
- const socketSdk = await shadowNpmInject.setupSdk(apiToken);
4552
+ spinner.start('Fetching organization list...');
4425
4553
  const result = await handleApiCall(socketSdk.getOrganizations(), 'looking up organizations');
4554
+ spinner.successAndStop('Received organization list response.');
4426
4555
  if (!result.success) {
4427
4556
  handleUnsuccessfulApiResponse('getOrganizations', result);
4428
4557
  return;
4429
4558
  }
4430
- spinner.stop();
4431
- const organizations = Object.values(result.data.organizations);
4432
- const lastFiveOfApiToken = getLastFiveOfApiToken(apiToken);
4433
- switch (format) {
4559
+ return result.data;
4560
+ }
4561
+
4562
+ async function outputOrganizationList(data, outputKind = 'text') {
4563
+ const organizations = Object.values(data.organizations);
4564
+ const apiToken = shadowNpmInject.getDefaultToken();
4565
+ const lastFiveOfApiToken = getLastFiveOfApiToken(apiToken ?? '?????');
4566
+ switch (outputKind) {
4434
4567
  case 'json':
4435
4568
  {
4436
4569
  logger.logger.log(JSON.stringify(organizations.map(o => ({
@@ -4475,6 +4608,12 @@ async function printOrganizationsFromToken(apiToken, format = 'text') {
4475
4608
  }
4476
4609
  }
4477
4610
 
4611
+ async function handleOrganizationList(outputKind = 'text') {
4612
+ const data = await fetchOrganization();
4613
+ if (!data) return;
4614
+ await outputOrganizationList(data, outputKind);
4615
+ }
4616
+
4478
4617
  const {
4479
4618
  DRY_RUN_BAIL_TEXT: DRY_RUN_BAIL_TEXT$k
4480
4619
  } = constants;
@@ -4526,48 +4665,63 @@ ${colors.bgRed(colors.white('Input error'))}: Please provide the required fields
4526
4665
  logger.logger.log(DRY_RUN_BAIL_TEXT$k);
4527
4666
  return;
4528
4667
  }
4529
- await getOrganization(json ? 'json' : markdown ? 'markdown' : 'text');
4668
+ await handleOrganizationList(json ? 'json' : markdown ? 'markdown' : 'text');
4530
4669
  }
4531
4670
 
4532
- async function getSecurityPolicy(orgSlug, format) {
4671
+ async function fetchSecurityPolicy(orgSlug) {
4533
4672
  const apiToken = shadowNpmInject.getDefaultToken();
4534
4673
  if (!apiToken) {
4535
4674
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
4536
4675
  }
4537
- await getSecurityPolicyWithToken(apiToken, orgSlug, format);
4676
+ return await fetchSecurityPolicyWithToken(apiToken, orgSlug);
4538
4677
  }
4539
- async function getSecurityPolicyWithToken(apiToken, orgSlug, format) {
4678
+ async function fetchSecurityPolicyWithToken(apiToken, orgSlug) {
4540
4679
  // Lazily access constants.spinner.
4541
4680
  const {
4542
4681
  spinner
4543
4682
  } = constants;
4544
- spinner.start('Fetching organization quota...');
4545
4683
  const socketSdk = await shadowNpmInject.setupSdk(apiToken);
4684
+ spinner.start('Fetching organization quota...');
4546
4685
  const result = await handleApiCall(socketSdk.getOrgSecurityPolicy(orgSlug), 'looking up organization quota');
4686
+ spinner?.successAndStop('Received organization quota response.');
4547
4687
  if (!result.success) {
4548
4688
  handleUnsuccessfulApiResponse('getOrgSecurityPolicy', result);
4549
4689
  return;
4550
4690
  }
4551
- spinner.stop();
4552
- switch (format) {
4553
- case 'json':
4554
- {
4555
- logger.logger.log(JSON.stringify(result.data, null, 2));
4556
- return;
4557
- }
4558
- default:
4559
- {
4560
- logger.logger.log('# Security policy\n');
4561
- logger.logger.log(`The default security policy setting is: "${result.data.securityPolicyDefault}"\n`);
4562
- logger.logger.log('These are the security policies per setting for your organization:\n');
4563
- const data = result.data;
4564
- const rules = data.securityPolicyRules;
4565
- const entries = Object.entries(rules);
4566
- const mapped = entries.map(([key, value]) => [key, value.action]);
4567
- mapped.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
4568
- logger.logger.log(mdTableOfPairs(mapped, ['name', 'action']));
4569
- }
4691
+ return result.data;
4692
+ }
4693
+
4694
+ async function getSecurityPolicy(data, outputKind) {
4695
+ if (outputKind === 'json') {
4696
+ let json;
4697
+ try {
4698
+ json = JSON.stringify(data, null, 2);
4699
+ } catch {
4700
+ console.error('Failed to convert the server response to json, try running the same command without --json');
4701
+ return;
4702
+ }
4703
+ logger.logger.log(json);
4704
+ logger.logger.log('');
4705
+ return;
4570
4706
  }
4707
+ logger.logger.log('# Security policy');
4708
+ logger.logger.log('');
4709
+ logger.logger.log(`The default security policy setting is: "${data.securityPolicyDefault}"`);
4710
+ logger.logger.log('');
4711
+ logger.logger.log('These are the security policies per setting for your organization:');
4712
+ logger.logger.log('');
4713
+ const rules = data.securityPolicyRules;
4714
+ const entries = Object.entries(rules);
4715
+ const mapped = entries.map(([key, value]) => [key, value.action]);
4716
+ mapped.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
4717
+ logger.logger.log(mdTableOfPairs(mapped, ['name', 'action']));
4718
+ logger.logger.log('');
4719
+ }
4720
+
4721
+ async function handleSecurityPolicy(orgSlug, outputKind) {
4722
+ const data = await fetchSecurityPolicy(orgSlug);
4723
+ if (!data) return;
4724
+ await getSecurityPolicy(data, outputKind);
4571
4725
  }
4572
4726
 
4573
4727
  const {
@@ -4632,7 +4786,7 @@ ${colors.bgRed(colors.white('Input error'))}: Please provide the required fields
4632
4786
  logger.logger.log(DRY_RUN_BAIL_TEXT$j);
4633
4787
  return;
4634
4788
  }
4635
- await getSecurityPolicy(orgSlug, json ? 'json' : markdown ? 'markdown' : 'text');
4789
+ await handleSecurityPolicy(orgSlug, json ? 'json' : markdown ? 'markdown' : 'text');
4636
4790
  }
4637
4791
 
4638
4792
  const description$5 = 'Organization policy details';
@@ -4659,45 +4813,57 @@ const cmdOrganizationPolicy = {
4659
4813
  }
4660
4814
  };
4661
4815
 
4662
- async function getQuota(format = 'text') {
4816
+ async function fetchQuota() {
4663
4817
  const apiToken = shadowNpmInject.getDefaultToken();
4664
4818
  if (!apiToken) {
4665
4819
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
4666
4820
  }
4667
- await getQuotaWithToken(apiToken, format);
4821
+ return await fetchQuotaWithToken(apiToken);
4668
4822
  }
4669
- async function getQuotaWithToken(apiToken, format = 'text') {
4823
+ async function fetchQuotaWithToken(apiToken) {
4670
4824
  // Lazily access constants.spinner.
4671
4825
  const {
4672
4826
  spinner
4673
4827
  } = constants;
4674
- spinner.start('Fetching organization quota...');
4675
4828
  const socketSdk = await shadowNpmInject.setupSdk(apiToken);
4829
+ spinner.start('Fetching organization quota...');
4676
4830
  const result = await handleApiCall(socketSdk.getQuota(), 'looking up organization quota');
4831
+ spinner?.successAndStop('Recieved organization quota response.');
4677
4832
  if (!result.success) {
4678
4833
  handleUnsuccessfulApiResponse('getQuota', result);
4679
4834
  return;
4680
4835
  }
4681
- spinner.stop();
4682
- switch (format) {
4683
- case 'json':
4684
- {
4685
- logger.logger.log(JSON.stringify({
4686
- quota: result.data.quota
4687
- }, null, 2));
4688
- return;
4689
- }
4690
- case 'markdown':
4691
- {
4692
- logger.logger.log('# Quota\n');
4693
- logger.logger.log(`Quota left on the current API token: ${result.data.quota}\n`);
4694
- return;
4695
- }
4696
- default:
4697
- {
4698
- logger.logger.log(`Quota left on the current API token: ${result.data.quota}\n`);
4699
- }
4836
+ return result.data;
4837
+ }
4838
+
4839
+ async function outputQuota(data, outputKind = 'text') {
4840
+ if (outputKind === 'json') {
4841
+ let json;
4842
+ try {
4843
+ json = JSON.stringify(data, null, 2);
4844
+ } catch {
4845
+ console.error('Failed to convert the server response to json, try running the same command without --json');
4846
+ return;
4847
+ }
4848
+ logger.logger.log(json);
4849
+ logger.logger.log('');
4850
+ return;
4700
4851
  }
4852
+ if (outputKind === 'markdown') {
4853
+ logger.logger.log('# Quota');
4854
+ logger.logger.log('');
4855
+ logger.logger.log(`Quota left on the current API token: ${data.quota}`);
4856
+ logger.logger.log('');
4857
+ return;
4858
+ }
4859
+ logger.logger.log(`Quota left on the current API token: ${data.quota}`);
4860
+ logger.logger.log('');
4861
+ }
4862
+
4863
+ async function handleQuota(outputKind = 'text') {
4864
+ const data = await fetchQuota();
4865
+ if (!data) return;
4866
+ await outputQuota(data, outputKind);
4701
4867
  }
4702
4868
 
4703
4869
  const {
@@ -4751,7 +4917,7 @@ ${colors.bgRed(colors.white('Input error'))}: Please provide the required fields
4751
4917
  logger.logger.log(DRY_RUN_BAIL_TEXT$i);
4752
4918
  return;
4753
4919
  }
4754
- await getQuota(json ? 'json' : markdown ? 'markdown' : 'text');
4920
+ await handleQuota(json ? 'json' : markdown ? 'markdown' : 'text');
4755
4921
  }
4756
4922
 
4757
4923
  const description$4 = 'Account details';
@@ -4780,68 +4946,15 @@ const cmdOrganization = {
4780
4946
  }
4781
4947
  };
4782
4948
 
4783
- // Either an ecosystem was given or all args must be (namespaced) purls
4784
- // The `pkg:` part is optional here. We'll scan for `eco/name@version`.
4785
- // Not hardcoding the namespace since we don't know what the server accepts.
4786
- // The ecosystem is considered as the first package if it is not an a-z string.
4787
- function parsePackageSpecifiers(ecosystem, pkgs) {
4788
- let valid = true;
4789
- const purls = [];
4790
- if (!ecosystem) {
4791
- valid = false;
4792
- } else if (/^[a-zA-Z]+$/.test(ecosystem)) {
4793
- for (let i = 0; i < pkgs.length; ++i) {
4794
- const pkg = pkgs[i] ?? '';
4795
- if (!pkg) {
4796
- valid = false;
4797
- break;
4798
- } else if (pkg.startsWith('pkg:')) {
4799
- // keep
4800
- purls.push(pkg);
4801
- } else if (pkg.includes('/')) {
4802
- // Looks like this arg was already namespaced
4803
- purls.push('pkg:' + pkg);
4804
- } else {
4805
- purls.push('pkg:' + ecosystem + '/' + pkg);
4806
- }
4807
- }
4808
- if (!purls.length) {
4809
- valid = false;
4810
- }
4811
- } else {
4812
- // Assume ecosystem is a purl, too
4813
- pkgs.unshift(ecosystem);
4814
- for (let i = 0; i < pkgs.length; ++i) {
4815
- const pkg = pkgs[i] ?? '';
4816
- if (!/^(?:pkg:)?[a-zA-Z]+\/./.test(pkg)) {
4817
- // At least one purl did not start with `pkg:eco/x` or `eco/x`
4818
- valid = false;
4819
- break;
4820
- } else if (pkg.startsWith('pkg:')) {
4821
- purls.push(pkg);
4822
- } else {
4823
- purls.push('pkg:' + pkg);
4824
- }
4825
- }
4826
- if (!purls.length) {
4827
- valid = false;
4828
- }
4829
- }
4830
- return {
4831
- purls,
4832
- valid
4833
- };
4834
- }
4835
-
4836
- async function fetchPackageInfo(purls) {
4837
- const socketSdk = await shadowNpmInject.setupSdk(shadowNpmInject.getPublicToken());
4949
+ async function fetchPurlsShallowScore(purls) {
4950
+ logger.logger.error(`Requesting shallow score data for ${purls.length} package urls (purl): ${purls.join(', ')}`);
4838
4951
 
4839
4952
  // Lazily access constants.spinner.
4840
4953
  const {
4841
4954
  spinner
4842
4955
  } = constants;
4843
- logger.logger.error(`Requesting shallow score data for ${purls.length} package urls (purl): ${purls.join(', ')}`);
4844
4956
  spinner.start(`Requesting data ...`);
4957
+ const socketSdk = await shadowNpmInject.setupSdk(shadowNpmInject.getPublicToken());
4845
4958
  const result = await handleApiCall(socketSdk.batchPackageFetch({
4846
4959
  alerts: 'true'
4847
4960
  // compact: false,
@@ -4856,12 +4969,11 @@ async function fetchPackageInfo(purls) {
4856
4969
  spinner.successAndStop('Request completed');
4857
4970
  if (result.success) {
4858
4971
  return result;
4859
- } else {
4860
- handleUnsuccessfulApiResponse('batchPackageFetch', result);
4861
4972
  }
4973
+ handleUnsuccessfulApiResponse('batchPackageFetch', result);
4862
4974
  }
4863
4975
 
4864
- function logPackageInfo(purls, packageData, outputKind) {
4976
+ function outputPurlsShallowScore(purls, packageData, outputKind) {
4865
4977
  if (outputKind === 'json') {
4866
4978
  // In JSON simply return what the server responds with. Don't bother trying
4867
4979
  // to match the response with the requested packages/purls.
@@ -4941,14 +5053,67 @@ function getAlertString(alerts, noColor = false) {
4941
5053
  }
4942
5054
  }
4943
5055
 
4944
- async function showPurlInfo({
5056
+ async function handlePurlsShallowScore({
4945
5057
  outputKind,
4946
5058
  purls
4947
5059
  }) {
4948
- const packageData = await fetchPackageInfo(purls);
5060
+ const packageData = await fetchPurlsShallowScore(purls);
4949
5061
  if (packageData) {
4950
- logPackageInfo(purls, packageData.data, outputKind);
5062
+ outputPurlsShallowScore(purls, packageData.data, outputKind);
5063
+ }
5064
+ }
5065
+
5066
+ // Either an ecosystem was given or all args must be (namespaced) purls
5067
+ // The `pkg:` part is optional here. We'll scan for `eco/name@version`.
5068
+ // Not hardcoding the namespace since we don't know what the server accepts.
5069
+ // The ecosystem is considered as the first package if it is not an a-z string.
5070
+ function parsePackageSpecifiers(ecosystem, pkgs) {
5071
+ let valid = true;
5072
+ const purls = [];
5073
+ if (!ecosystem) {
5074
+ valid = false;
5075
+ } else if (/^[a-zA-Z]+$/.test(ecosystem)) {
5076
+ for (let i = 0; i < pkgs.length; ++i) {
5077
+ const pkg = pkgs[i] ?? '';
5078
+ if (!pkg) {
5079
+ valid = false;
5080
+ break;
5081
+ } else if (pkg.startsWith('pkg:')) {
5082
+ // keep
5083
+ purls.push(pkg);
5084
+ } else if (pkg.includes('/')) {
5085
+ // Looks like this arg was already namespaced
5086
+ purls.push('pkg:' + pkg);
5087
+ } else {
5088
+ purls.push('pkg:' + ecosystem + '/' + pkg);
5089
+ }
5090
+ }
5091
+ if (!purls.length) {
5092
+ valid = false;
5093
+ }
5094
+ } else {
5095
+ // Assume ecosystem is a purl, too
5096
+ pkgs.unshift(ecosystem);
5097
+ for (let i = 0; i < pkgs.length; ++i) {
5098
+ const pkg = pkgs[i] ?? '';
5099
+ if (!/^(?:pkg:)?[a-zA-Z]+\/./.test(pkg)) {
5100
+ // At least one purl did not start with `pkg:eco/x` or `eco/x`
5101
+ valid = false;
5102
+ break;
5103
+ } else if (pkg.startsWith('pkg:')) {
5104
+ purls.push(pkg);
5105
+ } else {
5106
+ purls.push('pkg:' + pkg);
5107
+ }
5108
+ }
5109
+ if (!purls.length) {
5110
+ valid = false;
5111
+ }
4951
5112
  }
5113
+ return {
5114
+ purls,
5115
+ valid
5116
+ };
4952
5117
  }
4953
5118
 
4954
5119
  const {
@@ -5040,7 +5205,7 @@ async function run$h(argv, importMeta, {
5040
5205
  logger.logger.log(DRY_RUN_BAIL_TEXT$h);
5041
5206
  return;
5042
5207
  }
5043
- await showPurlInfo({
5208
+ await handlePurlsShallowScore({
5044
5209
  outputKind: json ? 'json' : markdown ? 'markdown' : 'text',
5045
5210
  purls
5046
5211
  });
@@ -5516,7 +5681,7 @@ const cmdReport = {
5516
5681
  }
5517
5682
  };
5518
5683
 
5519
- async function createRepo({
5684
+ async function fetchCreateRepo({
5520
5685
  default_branch,
5521
5686
  description,
5522
5687
  homepage,
@@ -5528,8 +5693,7 @@ async function createRepo({
5528
5693
  if (!apiToken) {
5529
5694
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
5530
5695
  }
5531
- await createRepoWithToken({
5532
- apiToken,
5696
+ return await fetchCreateRepoWithToken(apiToken, {
5533
5697
  default_branch,
5534
5698
  description,
5535
5699
  homepage,
@@ -5538,8 +5702,7 @@ async function createRepo({
5538
5702
  visibility
5539
5703
  });
5540
5704
  }
5541
- async function createRepoWithToken({
5542
- apiToken,
5705
+ async function fetchCreateRepoWithToken(apiToken, {
5543
5706
  default_branch,
5544
5707
  description,
5545
5708
  homepage,
@@ -5551,8 +5714,8 @@ async function createRepoWithToken({
5551
5714
  const {
5552
5715
  spinner
5553
5716
  } = constants;
5554
- spinner.start('Creating repository...');
5555
5717
  const socketSdk = await shadowNpmInject.setupSdk(apiToken);
5718
+ spinner.start('Sending request ot create a repository...');
5556
5719
  const result = await handleApiCall(socketSdk.createOrgRepo(orgSlug, {
5557
5720
  name: repoName,
5558
5721
  description,
@@ -5560,11 +5723,36 @@ async function createRepoWithToken({
5560
5723
  default_branch,
5561
5724
  visibility
5562
5725
  }), 'creating repository');
5726
+ spinner.successAndStop('Received response requesting to create a repository.');
5563
5727
  if (!result.success) {
5564
5728
  handleUnsuccessfulApiResponse('createOrgRepo', result);
5565
5729
  return;
5566
5730
  }
5567
- spinner.successAndStop('Repository created successfully');
5731
+ return result.data;
5732
+ }
5733
+
5734
+ async function outputCreateRepo(_data) {
5735
+ logger.logger.success('Repository created successfully');
5736
+ }
5737
+
5738
+ async function handleCreateRepo({
5739
+ default_branch,
5740
+ description,
5741
+ homepage,
5742
+ orgSlug,
5743
+ repoName,
5744
+ visibility
5745
+ }) {
5746
+ const data = await fetchCreateRepo({
5747
+ default_branch,
5748
+ description,
5749
+ homepage,
5750
+ orgSlug,
5751
+ repoName,
5752
+ visibility
5753
+ });
5754
+ if (!data) return;
5755
+ await outputCreateRepo();
5568
5756
  }
5569
5757
 
5570
5758
  const {
@@ -5650,7 +5838,7 @@ async function run$c(argv, importMeta, {
5650
5838
  logger.logger.log(DRY_RUN_BAIL_TEXT$c);
5651
5839
  return;
5652
5840
  }
5653
- await createRepo({
5841
+ await handleCreateRepo({
5654
5842
  orgSlug,
5655
5843
  repoName,
5656
5844
  description: String(cli.flags['repoDescription'] || ''),
@@ -5660,7 +5848,7 @@ async function run$c(argv, importMeta, {
5660
5848
  });
5661
5849
  }
5662
5850
 
5663
- async function deleteRepo(orgSlug, repoName) {
5851
+ async function handleDeleteRepo(orgSlug, repoName) {
5664
5852
  const apiToken = shadowNpmInject.getDefaultToken();
5665
5853
  if (!apiToken) {
5666
5854
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
@@ -5736,14 +5924,12 @@ async function run$b(argv, importMeta, {
5736
5924
  logger.logger.log(DRY_RUN_BAIL_TEXT$b);
5737
5925
  return;
5738
5926
  }
5739
- await deleteRepo(orgSlug, repoName);
5927
+ await handleDeleteRepo(orgSlug, repoName);
5740
5928
  }
5741
5929
 
5742
- // @ts-ignore
5743
- async function listRepos({
5930
+ async function fetchListRepos({
5744
5931
  direction,
5745
5932
  orgSlug,
5746
- outputKind,
5747
5933
  page,
5748
5934
  per_page,
5749
5935
  sort
@@ -5752,21 +5938,17 @@ async function listRepos({
5752
5938
  if (!apiToken) {
5753
5939
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
5754
5940
  }
5755
- await listReposWithToken({
5756
- apiToken,
5941
+ return await fetchListReposWithToken(apiToken, {
5757
5942
  direction,
5758
5943
  orgSlug,
5759
- outputKind,
5760
5944
  page,
5761
5945
  per_page,
5762
5946
  sort
5763
5947
  });
5764
5948
  }
5765
- async function listReposWithToken({
5766
- apiToken,
5949
+ async function fetchListReposWithToken(apiToken, {
5767
5950
  direction,
5768
5951
  orgSlug,
5769
- outputKind,
5770
5952
  page,
5771
5953
  per_page,
5772
5954
  sort
@@ -5775,28 +5957,33 @@ async function listReposWithToken({
5775
5957
  const {
5776
5958
  spinner
5777
5959
  } = constants;
5778
- spinner.start('Fetching list of repositories...');
5779
5960
  const socketSdk = await shadowNpmInject.setupSdk(apiToken);
5961
+ spinner.start('Fetching list of repositories...');
5780
5962
  const result = await handleApiCall(socketSdk.getOrgRepoList(orgSlug, {
5781
5963
  sort,
5782
5964
  direction,
5783
5965
  per_page: String(per_page),
5784
5966
  page: String(page)
5785
5967
  }), 'listing repositories');
5968
+ spinner.successAndStop('Received response for repository list.');
5786
5969
  if (!result.success) {
5787
5970
  handleUnsuccessfulApiResponse('getOrgRepoList', result);
5788
5971
  return;
5789
5972
  }
5790
- spinner.stop('Fetch complete.');
5973
+ return result.data;
5974
+ }
5975
+
5976
+ // @ts-ignore
5977
+ async function outputListRepos(data, outputKind) {
5791
5978
  if (outputKind === 'json') {
5792
- const data = result.data.results.map(o => ({
5979
+ const json = data.results.map(o => ({
5793
5980
  id: o.id,
5794
5981
  name: o.name,
5795
5982
  visibility: o.visibility,
5796
5983
  defaultBranch: o.default_branch,
5797
5984
  archived: o.archived
5798
5985
  }));
5799
- logger.logger.log(JSON.stringify(data, null, 2));
5986
+ logger.logger.log(JSON.stringify(json, null, 2));
5800
5987
  return;
5801
5988
  }
5802
5989
  const options = {
@@ -5817,7 +6004,26 @@ async function listReposWithToken({
5817
6004
  name: colors.magenta('Archived')
5818
6005
  }]
5819
6006
  };
5820
- logger.logger.log(chalkTable(options, result.data.results));
6007
+ logger.logger.log(chalkTable(options, data.results));
6008
+ }
6009
+
6010
+ async function handleListRepos({
6011
+ direction,
6012
+ orgSlug,
6013
+ outputKind,
6014
+ page,
6015
+ per_page,
6016
+ sort
6017
+ }) {
6018
+ const data = await fetchListRepos({
6019
+ direction,
6020
+ orgSlug,
6021
+ page,
6022
+ per_page,
6023
+ sort
6024
+ });
6025
+ if (!data) return;
6026
+ await outputListRepos(data, outputKind);
5821
6027
  }
5822
6028
 
5823
6029
  const {
@@ -5896,7 +6102,7 @@ async function run$a(argv, importMeta, {
5896
6102
  logger.logger.log(DRY_RUN_BAIL_TEXT$a);
5897
6103
  return;
5898
6104
  }
5899
- await listRepos({
6105
+ await handleListRepos({
5900
6106
  direction: cli.flags['direction'] === 'asc' ? 'asc' : 'desc',
5901
6107
  orgSlug,
5902
6108
  outputKind: cli.flags['json'] ? 'json' : cli.flags['markdown'] ? 'markdown' : 'print',
@@ -5906,7 +6112,7 @@ async function run$a(argv, importMeta, {
5906
6112
  });
5907
6113
  }
5908
6114
 
5909
- async function updateRepo({
6115
+ async function fetchUpdateRepo({
5910
6116
  default_branch,
5911
6117
  description,
5912
6118
  homepage,
@@ -5918,8 +6124,7 @@ async function updateRepo({
5918
6124
  if (!apiToken) {
5919
6125
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
5920
6126
  }
5921
- await updateRepoWithToken({
5922
- apiToken,
6127
+ return await fetchUpdateRepoWithToken(apiToken, {
5923
6128
  default_branch,
5924
6129
  description,
5925
6130
  homepage,
@@ -5928,8 +6133,7 @@ async function updateRepo({
5928
6133
  visibility
5929
6134
  });
5930
6135
  }
5931
- async function updateRepoWithToken({
5932
- apiToken,
6136
+ async function fetchUpdateRepoWithToken(apiToken, {
5933
6137
  default_branch,
5934
6138
  description,
5935
6139
  homepage,
@@ -5941,7 +6145,7 @@ async function updateRepoWithToken({
5941
6145
  const {
5942
6146
  spinner
5943
6147
  } = constants;
5944
- spinner.start('Updating repository...');
6148
+ spinner.start('Sending request to update a repository...');
5945
6149
  const socketSdk = await shadowNpmInject.setupSdk(apiToken);
5946
6150
  const result = await handleApiCall(socketSdk.updateOrgRepo(orgSlug, repoName, {
5947
6151
  orgSlug,
@@ -5951,11 +6155,36 @@ async function updateRepoWithToken({
5951
6155
  default_branch,
5952
6156
  visibility
5953
6157
  }), 'updating repository');
6158
+ spinner.successAndStop('Received response trying to update a repository');
5954
6159
  if (!result.success) {
5955
6160
  handleUnsuccessfulApiResponse('updateOrgRepo', result);
5956
6161
  return;
5957
6162
  }
5958
- spinner.successAndStop('Repository updated successfully');
6163
+ return result.data;
6164
+ }
6165
+
6166
+ async function outputUpdateRepo(_data) {
6167
+ logger.logger.success('Repository updated successfully');
6168
+ }
6169
+
6170
+ async function handleUpdateRepo({
6171
+ default_branch,
6172
+ description,
6173
+ homepage,
6174
+ orgSlug,
6175
+ repoName,
6176
+ visibility
6177
+ }) {
6178
+ const data = await fetchUpdateRepo({
6179
+ default_branch,
6180
+ description,
6181
+ homepage,
6182
+ orgSlug,
6183
+ repoName,
6184
+ visibility
6185
+ });
6186
+ if (!data) return;
6187
+ await outputUpdateRepo();
5959
6188
  }
5960
6189
 
5961
6190
  const {
@@ -6043,7 +6272,7 @@ async function run$9(argv, importMeta, {
6043
6272
  logger.logger.log(DRY_RUN_BAIL_TEXT$9);
6044
6273
  return;
6045
6274
  }
6046
- await updateRepo({
6275
+ await handleUpdateRepo({
6047
6276
  orgSlug,
6048
6277
  repoName,
6049
6278
  description: String(cli.flags['repoDescription'] || ''),
@@ -6053,27 +6282,31 @@ async function run$9(argv, importMeta, {
6053
6282
  });
6054
6283
  }
6055
6284
 
6056
- // @ts-ignore
6057
- async function viewRepo(orgSlug, repoName, outputKind) {
6285
+ async function fetchViewRepo(orgSlug, repoName) {
6058
6286
  const apiToken = shadowNpmInject.getDefaultToken();
6059
6287
  if (!apiToken) {
6060
6288
  throw new shadowNpmInject.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
6061
6289
  }
6062
- await viewRepoWithToken(orgSlug, repoName, apiToken, outputKind);
6290
+ return await fetchViewRepoWithToken(orgSlug, repoName, apiToken);
6063
6291
  }
6064
- async function viewRepoWithToken(orgSlug, repoName, apiToken, outputKind) {
6292
+ async function fetchViewRepoWithToken(orgSlug, repoName, apiToken) {
6065
6293
  // Lazily access constants.spinner.
6066
6294
  const {
6067
6295
  spinner
6068
6296
  } = constants;
6069
- spinner.start('Fetching repository data...');
6070
6297
  const socketSdk = await shadowNpmInject.setupSdk(apiToken);
6298
+ spinner.start('Fetching repository data...');
6071
6299
  const result = await handleApiCall(socketSdk.getOrgRepo(orgSlug, repoName), 'fetching repository');
6300
+ spinner.successAndStop('Received response while fetched repository data.');
6072
6301
  if (!result.success) {
6073
6302
  handleUnsuccessfulApiResponse('getOrgRepo', result);
6074
6303
  return;
6075
6304
  }
6076
- spinner.stop('Fetched repository data.');
6305
+ return result.data;
6306
+ }
6307
+
6308
+ // @ts-ignore
6309
+ async function outputViewRepo(data, outputKind) {
6077
6310
  if (outputKind === 'json') {
6078
6311
  const {
6079
6312
  archived,
@@ -6083,7 +6316,7 @@ async function viewRepoWithToken(orgSlug, repoName, apiToken, outputKind) {
6083
6316
  id,
6084
6317
  name,
6085
6318
  visibility
6086
- } = result.data;
6319
+ } = data;
6087
6320
  logger.logger.log(JSON.stringify({
6088
6321
  id,
6089
6322
  name,
@@ -6119,7 +6352,13 @@ async function viewRepoWithToken(orgSlug, repoName, apiToken, outputKind) {
6119
6352
  name: colors.magenta('Created at')
6120
6353
  }]
6121
6354
  };
6122
- logger.logger.log(chalkTable(options, [result.data]));
6355
+ logger.logger.log(chalkTable(options, [data]));
6356
+ }
6357
+
6358
+ async function handleViewRepo(orgSlug, repoName, outputKind) {
6359
+ const data = await fetchViewRepo(orgSlug, repoName);
6360
+ if (!data) return;
6361
+ await outputViewRepo(data, outputKind);
6123
6362
  }
6124
6363
 
6125
6364
  const {
@@ -6163,7 +6402,11 @@ async function run$8(argv, importMeta, {
6163
6402
  importMeta,
6164
6403
  parentName
6165
6404
  });
6166
- const repoName = cli.flags['repoName'];
6405
+ const {
6406
+ json,
6407
+ markdown,
6408
+ repoName
6409
+ } = cli.flags;
6167
6410
  const [orgSlug = ''] = cli.input;
6168
6411
  if (!repoName || typeof repoName !== 'string' || !orgSlug) {
6169
6412
  // Use exit status of 2 to indicate incorrect usage, generally invalid
@@ -6183,7 +6426,7 @@ async function run$8(argv, importMeta, {
6183
6426
  logger.logger.log(DRY_RUN_BAIL_TEXT$8);
6184
6427
  return;
6185
6428
  }
6186
- await viewRepo(orgSlug, repoName, cli.flags['json'] ? 'json' : cli.flags['markdown'] ? 'markdown' : 'print');
6429
+ await handleViewRepo(orgSlug, repoName, json ? 'json' : markdown ? 'markdown' : 'text');
6187
6430
  }
6188
6431
 
6189
6432
  const description$1 = 'Repositories related commands';
@@ -8214,7 +8457,7 @@ void (async () => {
8214
8457
  await updateNotifier({
8215
8458
  name: SOCKET_CLI_BIN_NAME,
8216
8459
  // The '@rollup/plugin-replace' will replace "process.env['INLINED_SOCKET_CLI_VERSION']".
8217
- version: "0.14.63",
8460
+ version: "0.14.65",
8218
8461
  ttl: 86_400_000 /* 24 hours in milliseconds */
8219
8462
  });
8220
8463
  try {
@@ -8281,5 +8524,5 @@ void (async () => {
8281
8524
  await shadowNpmInject.captureException(e);
8282
8525
  }
8283
8526
  })();
8284
- //# debugId=f4f96236-93e1-49bc-8920-ea7dc4befd99
8527
+ //# debugId=a3546933-7fe3-404c-ac5f-dae11e0b6833
8285
8528
  //# sourceMappingURL=cli.js.map