@socketsecurity/cli 0.14.30 → 0.14.32

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.
@@ -1,17 +1,29 @@
1
1
  'use strict';
2
2
 
3
- var require$$0 = require('node:fs');
4
- var require$$1 = require('node:path');
5
- var require$$2 = require('@socketsecurity/registry/lib/env');
6
- var require$$3 = require('@socketsecurity/registry/lib/constants');
7
- var require$$4 = require('semver');
3
+ function _interop(e) {
4
+ let d
5
+ if (e) {
6
+ let c = 0
7
+ for (const k in e) {
8
+ d = c++ === 0 && k === 'default' ? e[k] : void 0
9
+ if (!d) break
10
+ }
11
+ }
12
+ return d ?? e
13
+ }
14
+
15
+ var require$$0 = _interop(require('node:fs'));
16
+ var require$$1 = _interop(require('node:path'));
17
+ var require$$2 = _interop(require('@socketsecurity/registry/lib/env'));
18
+ var require$$3 = _interop(require('@socketsecurity/registry/lib/constants'));
19
+ var require$$4 = _interop(require('semver'));
8
20
 
9
21
  var constants = {};
10
22
 
11
23
  Object.defineProperty(constants, "__esModule", {
12
24
  value: true
13
25
  });
14
- constants.synpBinPath = constants.shadowBinPath = constants.rootPkgJsonPath = constants.rootPath = constants.rootDistPath = constants.rootBinPath = constants.nmBinPath = constants.distPath = constants.cdxgenBinPath = constants.UPDATE_SOCKET_OVERRIDES_IN_PACKAGE_LOCK_FILE = constants.SUPPORTS_SYNC_ESM = constants.SOCKET_CLI_ISSUES_URL = constants.NPM_REGISTRY_URL = constants.LOOP_SENTINEL = constants.ENV = constants.DIST_TYPE = constants.API_V0_URL = void 0;
26
+ constants.synpBinPath = constants.shadowBinPath = constants.rootPkgJsonPath = constants.rootPath = constants.rootDistPath = constants.rootBinPath = constants.nmBinPath = constants.distPath = constants.cdxgenBinPath = constants.UPDATE_SOCKET_OVERRIDES_IN_PACKAGE_LOCK_FILE = constants.SUPPORTS_SYNC_ESM = constants.SOCKET_PUBLIC_API_KEY = constants.SOCKET_CLI_ISSUES_URL = constants.NPM_REGISTRY_URL = constants.LOOP_SENTINEL = constants.ENV = constants.DIST_TYPE = constants.API_V0_URL = void 0;
15
27
  var _nodeFs = require$$0;
16
28
  var _nodePath = require$$1;
17
29
  var _env = require$$2;
@@ -25,6 +37,7 @@ constants.API_V0_URL = 'https://api.socket.dev/v0';
25
37
  const DIST_TYPE = constants.DIST_TYPE = SUPPORTS_SYNC_ESM ? 'module-sync' : 'require';
26
38
  constants.LOOP_SENTINEL = 1_000_000;
27
39
  constants.NPM_REGISTRY_URL = 'https://registry.npmjs.org';
40
+ constants.SOCKET_PUBLIC_API_KEY = 'sktsec_t_--RAN5U4ivauy4w37-6aoKyYPDt5ZbaT5JBVMqiwKo_api';
28
41
  const SOCKET_CLI_ISSUES_URL = constants.SOCKET_CLI_ISSUES_URL = 'https://github.com/SocketDev/socket-cli/issues';
29
42
  const UPDATE_SOCKET_OVERRIDES_IN_PACKAGE_LOCK_FILE = constants.UPDATE_SOCKET_OVERRIDES_IN_PACKAGE_LOCK_FILE = 'UPDATE_SOCKET_OVERRIDES_IN_PACKAGE_LOCK_FILE';
30
43
  constants.ENV = Object.freeze({
@@ -1,8 +1,20 @@
1
1
  'use strict';
2
2
 
3
- var require$$0 = require('node:fs');
4
- var require$$1 = require('node:path');
5
- var require$$4 = require('which');
3
+ function _interop(e) {
4
+ let d
5
+ if (e) {
6
+ let c = 0
7
+ for (const k in e) {
8
+ d = c++ === 0 && k === 'default' ? e[k] : void 0
9
+ if (!d) break
10
+ }
11
+ }
12
+ return d ?? e
13
+ }
14
+
15
+ var require$$0 = _interop(require('node:fs'));
16
+ var require$$1 = _interop(require('node:path'));
17
+ var require$$4 = _interop(require('which'));
6
18
 
7
19
  var link = {};
8
20
 
@@ -1,13 +1,25 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var vendor = require('./vendor.js');
5
- var require$$0 = require('node:fs');
6
- var require$$1 = require('node:path');
7
- var require$$1$1 = require('@npmcli/promise-spawn');
8
- var constants = require('./constants.js');
9
- var link = require('./link.js');
10
- var pathResolve = require('./path-resolve.js');
4
+ function _interop(e) {
5
+ let d
6
+ if (e) {
7
+ let c = 0
8
+ for (const k in e) {
9
+ d = c++ === 0 && k === 'default' ? e[k] : void 0
10
+ if (!d) break
11
+ }
12
+ }
13
+ return d ?? e
14
+ }
15
+
16
+ var vendor = _interop(require('./vendor.js'));
17
+ var require$$0 = _interop(require('node:fs'));
18
+ var require$$1 = _interop(require('node:path'));
19
+ var require$$1$1 = _interop(require('@npmcli/promise-spawn'));
20
+ var constants = _interop(require('./constants.js'));
21
+ var link = _interop(require('./link.js'));
22
+ var pathResolve = _interop(require('./path-resolve.js'));
11
23
 
12
24
  var npmCli$2 = {};
13
25
 
@@ -1,24 +1,37 @@
1
1
  'use strict';
2
2
 
3
- var vendor = require('./vendor.js');
4
- var constants = require('./constants.js');
5
- var require$$1$3 = require('node:events');
6
- var require$$0 = require('node:fs');
7
- var require$$3$2 = require('node:https');
8
- var require$$1$1 = require('node:path');
9
- var require$$3 = require('node:readline');
10
- var require$$5 = require('node:stream');
11
- var require$$7$1 = require('node:timers/promises');
12
- var require$$5$1 = require('npm-package-arg');
13
- var require$$3$1 = require('@socketregistry/yocto-spinner');
14
- var require$$4 = require('semver');
15
- var require$$6$1 = require('@socketsecurity/config');
16
- var require$$7 = require('@socketsecurity/registry/lib/objects');
17
- var require$$1$2 = require('node:net');
18
- var require$$1 = require('node:os');
19
- var sdk = require('./sdk.js');
20
- var pathResolve = require('./path-resolve.js');
21
- var link = require('./link.js');
3
+ function _interop(e) {
4
+ let d
5
+ if (e) {
6
+ let c = 0
7
+ for (const k in e) {
8
+ d = c++ === 0 && k === 'default' ? e[k] : void 0
9
+ if (!d) break
10
+ }
11
+ }
12
+ return d ?? e
13
+ }
14
+
15
+ var vendor = _interop(require('./vendor.js'));
16
+ var constants = _interop(require('./constants.js'));
17
+ var require$$1$4 = _interop(require('node:events'));
18
+ var require$$0 = _interop(require('node:fs'));
19
+ var require$$3$2 = _interop(require('node:https'));
20
+ var require$$1$1 = _interop(require('node:path'));
21
+ var require$$3 = _interop(require('node:readline'));
22
+ var require$$6$2 = _interop(require('node:timers/promises'));
23
+ var require$$1$3 = _interop(require('@inquirer/confirm'));
24
+ var require$$3$1 = _interop(require('@socketregistry/yocto-spinner'));
25
+ var require$$5$1 = _interop(require('npm-package-arg'));
26
+ var require$$4 = _interop(require('semver'));
27
+ var require$$6$1 = _interop(require('@socketsecurity/config'));
28
+ var require$$7 = _interop(require('@socketsecurity/registry/lib/objects'));
29
+ var require$$1$2 = _interop(require('node:net'));
30
+ var require$$1 = _interop(require('node:os'));
31
+ var require$$5 = _interop(require('node:stream'));
32
+ var sdk = _interop(require('./sdk.js'));
33
+ var pathResolve = _interop(require('./path-resolve.js'));
34
+ var link = _interop(require('./link.js'));
22
35
 
23
36
  var npmInjection$2 = {};
24
37
 
@@ -29,7 +42,7 @@ var arborist = {};
29
42
  var ttyServer$1 = {};
30
43
 
31
44
  var name = "@socketsecurity/cli";
32
- var version = "0.14.30";
45
+ var version = "0.14.32";
33
46
  var description = "CLI tool for Socket.dev";
34
47
  var homepage = "http://github.com/SocketDev/socket-cli";
35
48
  var license = "MIT";
@@ -105,12 +118,14 @@ var scripts = {
105
118
  var dependencies = {
106
119
  "@apideck/better-ajv-errors": "^0.3.6",
107
120
  "@cyclonedx/cdxgen": "^11.0.5",
108
- "@inquirer/prompts": "^7.1.0",
121
+ "@inquirer/confirm": "^5.0.2",
122
+ "@inquirer/password": "^4.0.3",
123
+ "@inquirer/select": "^4.0.3",
109
124
  "@npmcli/promise-spawn": "^8.0.2",
110
125
  "@socketregistry/hyrious__bun.lockb": "1.0.5",
111
126
  "@socketregistry/yocto-spinner": "^1.0.1",
112
127
  "@socketsecurity/config": "^2.1.3",
113
- "@socketsecurity/registry": "^1.0.33",
128
+ "@socketsecurity/registry": "^1.0.35",
114
129
  "@socketsecurity/sdk": "^1.3.0",
115
130
  blessed: "^0.1.81",
116
131
  "blessed-contrib": "^4.11.0",
@@ -275,7 +290,7 @@ var _nodeNet = require$$1$2;
275
290
  var _nodeOs = require$$1;
276
291
  var _nodePath$1 = require$$1$1;
277
292
  var _nodeReadline$1 = require$$3;
278
- var _nodeStream$1 = require$$5;
293
+ var _nodeStream = require$$5;
279
294
  var _package = require$$6;
280
295
  var _misc$1 = sdk.misc;
281
296
  const NEWLINE_CHAR_CODE = 10; /*'\n'*/
@@ -313,10 +328,10 @@ function createNonStandardTTYServer() {
313
328
  if (remote_ipc_version !== _package.version) {
314
329
  throw new Error('Mismatched STDIO tunnel IPC version, ensure you only have 1 version of socket CLI being called.');
315
330
  }
316
- const input = hasInput ? new _nodeStream$1.PassThrough() : null;
331
+ const input = hasInput ? new _nodeStream.PassThrough() : null;
317
332
  input?.pause();
318
333
  if (input) conn.pipe(input);
319
- const output = hasOutput ? new _nodeStream$1.PassThrough() : null;
334
+ const output = hasOutput ? new _nodeStream.PassThrough() : null;
320
335
  if (output) {
321
336
  output.pipe(conn)
322
337
  // Make ora happy
@@ -470,7 +485,7 @@ var issueRules = {};
470
485
  Object.defineProperty(issueRules, "__esModule", {
471
486
  value: true
472
487
  });
473
- issueRules.createIssueUXLookup = createIssueUXLookup;
488
+ issueRules.createAlertUXLookup = createAlertUXLookup;
474
489
  //#region UX Constants
475
490
 
476
491
  const IGNORE_UX = {
@@ -537,7 +552,7 @@ function resolveIssueRuleUX(entriesOrderedIssueRules, defaultValue) {
537
552
  function issueRuleValueDoesNotDefer(issueRule) {
538
553
  if (issueRule === undefined) {
539
554
  return false;
540
- } else if (typeof issueRule === 'object' && issueRule) {
555
+ } else if (issueRule !== null && typeof issueRule === 'object') {
541
556
  const {
542
557
  action
543
558
  } = issueRule;
@@ -569,11 +584,13 @@ function uxForDefinedNonDeferValue(issueRuleValue) {
569
584
 
570
585
  //#region exports
571
586
 
572
- function createIssueUXLookup(settings) {
587
+ function createAlertUXLookup(settings) {
573
588
  const cachedUX = new Map();
574
589
  return context => {
575
- const key = context.issue.type;
576
- let ux = cachedUX.get(key);
590
+ const {
591
+ type
592
+ } = context.alert;
593
+ let ux = cachedUX.get(type);
577
594
  if (ux) {
578
595
  return ux;
579
596
  }
@@ -586,7 +603,7 @@ function createIssueUXLookup(settings) {
586
603
  if (!resolvedTarget) {
587
604
  break;
588
605
  }
589
- const issueRuleValue = resolvedTarget.issueRules?.[key];
606
+ const issueRuleValue = resolvedTarget.issueRules?.[type];
590
607
  if (typeof issueRuleValue !== 'undefined') {
591
608
  orderedIssueRules.push(issueRuleValue);
592
609
  }
@@ -594,7 +611,7 @@ function createIssueUXLookup(settings) {
594
611
  }
595
612
  entriesOrderedIssueRules.push(orderedIssueRules);
596
613
  }
597
- const defaultValue = settings.defaults.issueRules[key];
614
+ const defaultValue = settings.defaults.issueRules[type];
598
615
  let resolvedDefaultValue = {
599
616
  action: 'error'
600
617
  };
@@ -608,7 +625,7 @@ function createIssueUXLookup(settings) {
608
625
  };
609
626
  }
610
627
  ux = resolveIssueRuleUX(entriesOrderedIssueRules, resolvedDefaultValue);
611
- cachedUX.set(key, ux);
628
+ cachedUX.set(type, ux);
612
629
  return ux;
613
630
  };
614
631
  }
@@ -619,16 +636,16 @@ Object.defineProperty(arborist, "__esModule", {
619
636
  });
620
637
  arborist.SafeArborist = void 0;
621
638
  arborist.installSafeArborist = installSafeArborist;
622
- var _nodeEvents = require$$1$3;
639
+ var _nodeEvents = require$$1$4;
623
640
  var _nodeFs = require$$0;
624
641
  var _nodeHttps = require$$3$2;
625
642
  var _nodePath = require$$1$1;
626
643
  var _nodeReadline = require$$3;
627
- var _nodeStream = require$$5;
628
- var _promises = require$$7$1;
644
+ var _promises = require$$6$2;
645
+ var _confirm = require$$1$3;
646
+ var _yoctoSpinner = require$$3$1;
629
647
  var _isInteractive = _interopRequireDefault(vendor.isInteractive);
630
648
  var _npmPackageArg = require$$5$1;
631
- var _yoctoSpinner = require$$3$1;
632
649
  var _semver = require$$4;
633
650
  var _config = require$$6$1;
634
651
  var _objects = require$$7;
@@ -701,7 +718,7 @@ const OverrideSet = require(arboristOverrideSetClassPatch);
701
718
  const kCtorArgs = Symbol('ctorArgs');
702
719
  const kRiskyReify = Symbol('riskyReify');
703
720
  const formatter = new _colorOrMarkdown.ColorOrMarkdown(false);
704
- const pubToken = (0, _sdk.getDefaultKey)() ?? _sdk.FREE_API_KEY;
721
+ const pubToken = (0, _sdk.getDefaultKey)() ?? _constants$1.SOCKET_PUBLIC_API_KEY;
705
722
  const ttyServer = (0, _ttyServer.createTTYServer)((0, _isInteractive.default)({
706
723
  stream: process.stdin
707
724
  }), log);
@@ -716,31 +733,20 @@ async function uxLookup(settings) {
716
733
  return _uxLookup(settings);
717
734
  }
718
735
  async function* batchScan(pkgIds) {
719
- const query = {
720
- packages: pkgIds.map(id => {
721
- const {
722
- name,
723
- version
724
- } = pkgidParts(id);
725
- return {
726
- eco: 'npm',
727
- pkg: name,
728
- ver: version,
729
- top: true
730
- };
731
- })
732
- };
733
- // TODO: Migrate to SDK.
734
- const pkgDataReq = _nodeHttps.request(`${_constants$1.API_V0_URL}/scan/batch`, {
736
+ const req = _nodeHttps.request(`${_constants$1.API_V0_URL}/purl?alerts=true`, {
735
737
  method: 'POST',
736
738
  headers: {
737
739
  Authorization: `Basic ${Buffer.from(`${pubToken}:`).toString('base64url')}`
738
740
  },
739
741
  signal: abortSignal
740
- }).end(JSON.stringify(query));
742
+ }).end(JSON.stringify({
743
+ components: pkgIds.map(id => ({
744
+ purl: `pkg:npm/${id}`
745
+ }))
746
+ }));
741
747
  const {
742
748
  0: res
743
- } = await _nodeEvents.once(pkgDataReq, 'response');
749
+ } = await _nodeEvents.once(req, 'response');
744
750
  const ok = res.statusCode >= 200 && res.statusCode <= 299;
745
751
  if (!ok) {
746
752
  throw new Error(`Socket API Error: ${res.statusCode}`);
@@ -806,118 +812,118 @@ function findSpecificOverrideSet(first, second) {
806
812
  log.silly('Conflicting override sets', first, second);
807
813
  return undefined;
808
814
  }
815
+ function isAlertFixable(alert) {
816
+ const {
817
+ type
818
+ } = alert;
819
+ if (type === 'cve' || type === 'mediumCVE' || type === 'mildCVE' || type === 'criticalCVE') {
820
+ return !!alert.props?.['firstPatchedVersionIdentifier'];
821
+ }
822
+ return type === 'socketUpgradeAvailable';
823
+ }
809
824
  function maybeReadfileSync(filepath) {
810
825
  try {
811
826
  return (0, _nodeFs.readFileSync)(filepath, 'utf8');
812
827
  } catch {}
813
828
  return undefined;
814
829
  }
815
- async function packagesHaveRiskyIssues(safeArb, _registry, pkgs, output) {
830
+ async function getPackagesAlerts(safeArb, _registry, pkgs, output) {
816
831
  const spinner = _yoctoSpinner({
817
832
  stream: output
818
833
  });
819
- let result = false;
820
834
  let {
821
835
  length: remaining
822
836
  } = pkgs;
837
+ const packageAlerts = [];
823
838
  if (!remaining) {
824
839
  spinner.success('No changes detected');
825
- return result;
840
+ return packageAlerts;
826
841
  }
827
842
  const getText = () => `Looking up data for ${remaining} packages`;
828
843
  spinner.start(getText());
829
844
  try {
830
- for await (const pkgData of batchScan(pkgs.map(p => p.pkgid))) {
845
+ for await (const artifact of batchScan(pkgs.map(p => p.pkgid))) {
846
+ if (!artifact.name || !artifact.version || !artifact.alerts?.length) {
847
+ continue;
848
+ }
831
849
  const {
832
- pkg: name,
833
- ver: version
834
- } = pkgData;
835
- const id = `${name}@${version}`;
850
+ version
851
+ } = artifact;
852
+ const name = `${artifact.namespace ? `${artifact.namespace}/` : ''}${artifact.name}`;
853
+ const id = `${name}@${artifact.version}`;
854
+ let blocked = false;
836
855
  let displayWarning = false;
837
- let failures = [];
838
- if (pkgData.type === 'missing') {
839
- result = true;
840
- failures.push({
841
- type: 'missingDependency',
842
- block: false,
843
- raw: undefined
856
+ let alerts = [];
857
+ for (const alert of artifact.alerts) {
858
+ // eslint-disable-next-line no-await-in-loop
859
+ const ux = await uxLookup({
860
+ package: {
861
+ name,
862
+ version
863
+ },
864
+ alert: {
865
+ type: alert.type
866
+ }
844
867
  });
845
- } else {
846
- let blocked = false;
847
- for (const failure of pkgData.value.issues) {
848
- const {
849
- type
850
- } = failure;
851
- // eslint-disable-next-line no-await-in-loop
852
- const ux = await uxLookup({
853
- package: {
854
- name,
855
- version
856
- },
857
- issue: {
858
- type
859
- }
868
+ if (ux.block) {
869
+ blocked = true;
870
+ }
871
+ if (ux.display) {
872
+ displayWarning = true;
873
+ }
874
+ if (ux.block || ux.display) {
875
+ alerts.push({
876
+ name,
877
+ version,
878
+ type: alert.type,
879
+ block: ux.block,
880
+ raw: alert,
881
+ fixable: isAlertFixable(alert)
860
882
  });
861
- if (ux.block) {
862
- result = true;
863
- blocked = true;
864
- }
865
- if (ux.display) {
866
- displayWarning = true;
867
- }
868
- if (ux.block || ux.display) {
869
- failures.push({
870
- type,
871
- block: ux.block,
872
- raw: failure
873
- });
874
- // Before we ask about problematic issues, check to see if they
875
- // already existed in the old version if they did, be quiet.
876
- const pkg = pkgs.find(p => p.pkgid === id && p.existing?.startsWith(`${name}@`));
877
- if (pkg?.existing) {
878
- const oldPkgData =
879
- // eslint-disable-next-line no-await-in-loop
880
- (await batchScan([pkg.existing]).next()).value;
881
- if (oldPkgData.type === 'success') {
882
- failures = failures.filter(issue => oldPkgData.value.issues.find(oldIssue => oldIssue.type === issue.type) === undefined);
883
- }
884
- }
883
+ // Before we ask about problematic issues, check to see if they
884
+ // already existed in the old version if they did, be quiet.
885
+ const pkg = pkgs.find(p => p.pkgid === id && p.existing?.startsWith(`${name}@`));
886
+ if (pkg?.existing) {
887
+ // const oldArtifact: SocketArtifact =
888
+ // // eslint-disable-next-line no-await-in-loop
889
+ // (await batchScan([pkg.existing]).next()).value
890
+ // console.log('oldArtifact', oldArtifact)
891
+ // if (oldArtifact.type === 'success') {
892
+ // issues = issues.filter(
893
+ // ({ type }) =>
894
+ // oldPkgData.value.issues.find(
895
+ // oldIssue => oldIssue.type === type
896
+ // ) === undefined
897
+ // )
898
+ // }
885
899
  }
886
900
  }
887
- if (!blocked) {
888
- const pkg = pkgs.find(p => p.pkgid === id);
889
- if (pkg) {
890
- await tarball.stream(id, stream => {
891
- stream.resume();
892
- return stream.promise();
893
- }, {
894
- ...safeArb[kCtorArgs][0]
895
- });
896
- }
901
+ }
902
+ if (!blocked) {
903
+ const pkg = pkgs.find(p => p.pkgid === id);
904
+ if (pkg) {
905
+ await tarball.stream(id, stream => {
906
+ stream.resume();
907
+ return stream.promise();
908
+ }, {
909
+ ...safeArb[kCtorArgs][0]
910
+ });
897
911
  }
898
912
  }
899
913
  if (displayWarning) {
900
914
  spinner.stop(`(socket) ${formatter.hyperlink(id, `https://socket.dev/npm/package/${name}/overview/${version}`)} contains risks:`);
901
- // Filter issues for blessed packages.
902
- if (name === 'socket' || name.startsWith('@socketregistry/') || name.startsWith('@socketsecurity/')) {
903
- failures = failures.filter(({
904
- type
905
- }) => type !== 'unpopularPackage' && type !== 'unstableOwnership');
906
- }
907
- failures.sort((a, b) => a.type < b.type ? -1 : 1);
915
+ alerts.sort((a, b) => a.type < b.type ? -1 : 1);
908
916
  const lines = new Set();
909
- for (const failure of failures) {
910
- const {
911
- type
912
- } = failure;
917
+ for (const alert of alerts) {
913
918
  // Based data from { pageProps: { alertTypes } } of:
914
919
  // https://socket.dev/_next/data/94666139314b6437ee4491a0864e72b264547585/en-US.json
915
- const info = translations.issues[type];
916
- const title = info?.title ?? type;
917
- const maybeBlocking = failure.block ? '' : ' (non-blocking)';
920
+ const info = translations.alerts[alert.type];
921
+ const title = info?.title ?? alert.type;
922
+ const attributes = [...(alert.fixable ? ['fixable'] : []), ...(alert.block ? [] : ['non-blocking'])];
923
+ const maybeAttributes = attributes.length ? ` (${attributes.join('; ')})` : '';
918
924
  const maybeDesc = info?.description ? ` - ${info.description}` : '';
919
925
  // TODO: emoji seems to mis-align terminals sometimes
920
- lines.add(` ${title}${maybeBlocking}${maybeDesc}\n`);
926
+ lines.add(` ${title}${maybeAttributes}${maybeDesc}\n`);
921
927
  }
922
928
  for (const line of lines) {
923
929
  output?.write(line);
@@ -926,20 +932,14 @@ async function packagesHaveRiskyIssues(safeArb, _registry, pkgs, output) {
926
932
  }
927
933
  remaining -= 1;
928
934
  spinner.text = remaining > 0 ? getText() : '';
935
+ packageAlerts.push(...alerts);
929
936
  }
930
- return result;
937
+ } catch (e) {
938
+ console.log('error', e);
931
939
  } finally {
932
940
  spinner.stop();
933
941
  }
934
- }
935
- function pkgidParts(pkgid) {
936
- const delimiter = pkgid.lastIndexOf('@');
937
- const name = pkgid.slice(0, delimiter);
938
- const version = pkgid.slice(delimiter + 1);
939
- return {
940
- name,
941
- version
942
- };
942
+ return packageAlerts;
943
943
  }
944
944
  function toRepoUrl(resolved) {
945
945
  return resolved.replace(/#[\s\S]*$/, '').replace(/\?[\s\S]*$/, '').replace(/\/[^/]*\/-\/[\s\S]*$/, '');
@@ -1672,36 +1672,19 @@ class SafeArborist extends Arborist {
1672
1672
  if (!proceed) {
1673
1673
  proceed = await ttyServer.captureTTY(async (input, output) => {
1674
1674
  if (input && output) {
1675
- const risky = await packagesHaveRiskyIssues(this, this['registry'], diff, output);
1676
- if (!risky) {
1675
+ const alerts = await getPackagesAlerts(this, this['registry'], diff, output);
1676
+ if (!alerts.length) {
1677
1677
  return true;
1678
1678
  }
1679
- const rlin = new _nodeStream.PassThrough();
1680
- input.pipe(rlin);
1681
- const rlout = new _nodeStream.PassThrough();
1682
- rlout.pipe(output, {
1683
- end: false
1679
+ return await _confirm({
1680
+ message: 'Accept risks of installing these packages?',
1681
+ default: false
1682
+ }, {
1683
+ input,
1684
+ output,
1685
+ signal: abortSignal
1684
1686
  });
1685
- const rli = _nodeReadline.createInterface(rlin, rlout);
1686
- try {
1687
- while (true) {
1688
- // eslint-disable-next-line no-await-in-loop
1689
- const answer = await new Promise(resolve => {
1690
- rli.question('Accept risks of installing these packages (y/N)?\n', {
1691
- signal: abortSignal
1692
- }, resolve);
1693
- });
1694
- if (/^\s*y(?:es)?\s*$/i.test(answer)) {
1695
- return true;
1696
- }
1697
- if (/^(?:\s*no?\s*|)$/i.test(answer)) {
1698
- return false;
1699
- }
1700
- }
1701
- } finally {
1702
- rli.close();
1703
- }
1704
- } else if (await packagesHaveRiskyIssues(this, this['registry'], diff, output)) {
1687
+ } else if ((await getPackagesAlerts(this, this['registry'], diff, output)).length > 0) {
1705
1688
  throw new Error('Socket npm Unable to prompt to accept risk, need TTY to do so');
1706
1689
  }
1707
1690
  return true;
@@ -1802,7 +1785,7 @@ void (async () => {
1802
1785
  }
1803
1786
  });
1804
1787
  }
1805
- _uxLookup = (0, _issueRules.createIssueUXLookup)(settings);
1788
+ _uxLookup = (0, _issueRules.createAlertUXLookup)(settings);
1806
1789
  })();
1807
1790
 
1808
1791
  var _constants = constants.constants;
@@ -1,11 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var vendor = require('./vendor.js');
5
- var require$$1 = require('node:path');
6
- var require$$1$1 = require('@npmcli/promise-spawn');
7
- var constants = require('./constants.js');
8
- var link = require('./link.js');
4
+ function _interop(e) {
5
+ let d
6
+ if (e) {
7
+ let c = 0
8
+ for (const k in e) {
9
+ d = c++ === 0 && k === 'default' ? e[k] : void 0
10
+ if (!d) break
11
+ }
12
+ }
13
+ return d ?? e
14
+ }
15
+
16
+ var vendor = _interop(require('./vendor.js'));
17
+ var require$$1 = _interop(require('node:path'));
18
+ var require$$1$1 = _interop(require('@npmcli/promise-spawn'));
19
+ var constants = _interop(require('./constants.js'));
20
+ var link = _interop(require('./link.js'));
9
21
 
10
22
  var npxCli$2 = {};
11
23