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