@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.
- package/dist/module-sync/cli.js +128 -105
- package/dist/module-sync/constants.d.ts +2 -1
- package/dist/module-sync/constants.js +18 -10
- package/dist/module-sync/link.js +15 -3
- package/dist/module-sync/npm-cli.js +21 -9
- package/dist/module-sync/npm-injection.js +395 -176
- package/dist/module-sync/npx-cli.js +19 -7
- package/dist/module-sync/path-resolve.js +17 -5
- package/dist/module-sync/sdk.d.ts +1 -2
- package/dist/module-sync/sdk.js +42 -32
- package/dist/module-sync/vendor.js +82 -0
- package/dist/require/cli.js +93 -69
- package/dist/require/constants.d.ts +2 -1
- package/dist/require/constants.js +19 -6
- package/dist/require/link.js +15 -3
- package/dist/require/npm-cli.js +19 -7
- package/dist/require/npm-injection.js +156 -173
- package/dist/require/npx-cli.js +17 -5
- package/dist/require/path-resolve.js +17 -5
- package/dist/require/sdk.d.ts +1 -2
- package/dist/require/sdk.js +36 -26
- package/dist/require/vendor.js +23 -11
- package/package.json +5 -3
- package/translations.json +1 -1
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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({
|
package/dist/require/link.js
CHANGED
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
package/dist/require/npm-cli.js
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var
|
|
16
|
-
var
|
|
17
|
-
var require$$1$
|
|
18
|
-
var require$$
|
|
19
|
-
var
|
|
20
|
-
var
|
|
21
|
-
var
|
|
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.
|
|
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/
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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'
|
|
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
|
|
587
|
+
function createAlertUXLookup(settings) {
|
|
573
588
|
const cachedUX = new Map();
|
|
574
589
|
return context => {
|
|
575
|
-
const
|
|
576
|
-
|
|
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?.[
|
|
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[
|
|
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(
|
|
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$
|
|
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
|
|
628
|
-
var
|
|
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)() ??
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
833
|
-
|
|
834
|
-
|
|
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
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
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
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
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
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
//
|
|
875
|
-
//
|
|
876
|
-
|
|
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
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
916
|
-
const title = info?.title ?? type;
|
|
917
|
-
const
|
|
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}${
|
|
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
|
-
|
|
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
|
|
1676
|
-
if (!
|
|
1675
|
+
const alerts = await getPackagesAlerts(this, this['registry'], diff, output);
|
|
1676
|
+
if (!alerts.length) {
|
|
1677
1677
|
return true;
|
|
1678
1678
|
}
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
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
|
-
|
|
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.
|
|
1788
|
+
_uxLookup = (0, _issueRules.createAlertUXLookup)(settings);
|
|
1806
1789
|
})();
|
|
1807
1790
|
|
|
1808
1791
|
var _constants = constants.constants;
|
package/dist/require/npx-cli.js
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|