socket 0.14.41 → 0.14.42

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,20 +1,28 @@
1
1
  import registryConstants from '@socketsecurity/registry/lib/constants';
2
2
  type RegistryEnv = typeof registryConstants.ENV;
3
- type IPCObject = {
3
+ type RegistryInternals = (typeof registryConstants)['Symbol(kInternalsSymbol)'];
4
+ type Internals = Omit<RegistryInternals, 'getIPC'> & Readonly<{
5
+ getIPC: {
6
+ (): Promise<IPC>;
7
+ <K extends keyof IPC | undefined>(key?: K): Promise<K extends keyof IPC ? IPC[K] : IPC>;
8
+ };
9
+ }>;
10
+ type ENV = RegistryEnv & Readonly<{
11
+ SOCKET_CLI_DEBUG: boolean;
12
+ }>;
13
+ type IPC = Readonly<{
4
14
  SOCKET_CLI_FIX_PACKAGE_LOCK_FILE: boolean;
5
15
  SOCKET_CLI_UPDATE_OVERRIDES_IN_PACKAGE_LOCK_FILE: boolean;
6
- [key: string]: any;
7
- };
8
- type Constants = {
16
+ }>;
17
+ type Constants = Omit<typeof registryConstants, 'Symbol(kInternalsSymbol)' | 'ENV' | 'IPC'> & {
18
+ readonly 'Symbol(kInternalsSymbol)': Internals;
9
19
  readonly API_V0_URL: 'https://api.socket.dev/v0';
10
20
  readonly BABEL_RUNTIME: '@babel/runtime';
11
21
  readonly BINARY_LOCK_EXT: '.lockb';
12
22
  readonly BUN: 'bun';
13
- readonly ENV: RegistryEnv & {
14
- SOCKET_CLI_DEBUG: boolean;
15
- };
23
+ readonly ENV: ENV;
16
24
  readonly DIST_TYPE: 'module-sync' | 'require';
17
- readonly IPC: IPCObject;
25
+ readonly IPC: IPC;
18
26
  readonly LOCK_EXT: '.lock';
19
27
  readonly MODULE_SYNC: 'module-sync';
20
28
  readonly NPM_REGISTRY_URL: 'https://registry.npmjs.org';
@@ -38,7 +46,7 @@ type Constants = {
38
46
  readonly rootPkgJsonPath: string;
39
47
  readonly shadowBinPath: string;
40
48
  readonly synpBinPath: string;
41
- } & typeof registryConstants;
49
+ };
42
50
  declare const constants: Constants;
43
51
  export { constants as default };
44
52
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAIA,OAAO,iBAAiB,MAAM,wCAAwC,CAAA;AAGtE,KAAK,WAAW,GAAG,OAAO,iBAAiB,CAAC,GAAG,CAAA;AAE/C,KAAK,SAAS,GAAG;IACf,gCAAgC,EAAE,OAAO,CAAA;IACzC,gDAAgD,EAAE,OAAO,CAAA;IACzD,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB,CAAA;AAED,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAA;IAChD,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAA;IACxC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAA;IAClC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAA;IACnB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG;QAC1B,gBAAgB,EAAE,OAAO,CAAA;KAC1B,CAAA;IACD,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,4BAA4B,CAAA;IACvD,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,CAAA;IAC7C,QAAQ,CAAC,gCAAgC,EAAE,kCAAkC,CAAA;IAC7E,QAAQ,CAAC,qBAAqB,EAAE,gDAAgD,CAAA;IAChF,QAAQ,CAAC,gDAAgD,EAAE,kDAAkD,CAAA;IAC7G,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAA;IACjC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B,GAAG,OAAO,iBAAiB,CAAA;AAiF5B,QAAA,MAAM,SAAS,WAiDd,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAIA,OAAO,iBAAiB,MAAM,wCAAwC,CAAA;AAWtE,KAAK,WAAW,GAAG,OAAO,iBAAiB,CAAC,GAAG,CAAA;AAE/C,KAAK,iBAAiB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,0BAA0B,CAAC,CAAA;AAE/E,KAAK,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAChD,QAAQ,CAAC;IACP,MAAM,EAAE;QACN,IAAI,OAAO,CAAC,GAAG,CAAC,CAAA;QAChB,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,SAAS,EAC9B,GAAG,CAAC,EAAE,CAAC,GACN,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;KAC/C,CAAA;CACF,CAAC,CAAA;AAEJ,KAAK,GAAG,GAAG,WAAW,GACpB,QAAQ,CAAC;IACP,gBAAgB,EAAE,OAAO,CAAA;CAC1B,CAAC,CAAA;AAEJ,KAAK,GAAG,GAAG,QAAQ,CAAC;IAClB,gCAAgC,EAAE,OAAO,CAAA;IACzC,gDAAgD,EAAE,OAAO,CAAA;CAC1D,CAAC,CAAA;AAEF,KAAK,SAAS,GAAG,IAAI,CACnB,OAAO,iBAAiB,EACxB,0BAA0B,GAAG,KAAK,GAAG,KAAK,CAC3C,GAAG;IACF,QAAQ,CAAC,0BAA0B,EAAE,SAAS,CAAA;IAC9C,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAA;IAChD,QAAQ,CAAC,aAAa,EAAE,gBAAgB,CAAA;IACxC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAA;IAClC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAA;IACnB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,SAAS,CAAA;IAC7C,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAA;IACjB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAA;IACnC,QAAQ,CAAC,gBAAgB,EAAE,4BAA4B,CAAA;IACvD,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,CAAA;IAC7C,QAAQ,CAAC,gCAAgC,EAAE,kCAAkC,CAAA;IAC7E,QAAQ,CAAC,qBAAqB,EAAE,gDAAgD,CAAA;IAChF,QAAQ,CAAC,gDAAgD,EAAE,kDAAkD,CAAA;IAC7G,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAA;IACjC,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B,CAAA;AAyED,QAAA,MAAM,SAAS,WAiDd,CAAA"}
@@ -24,7 +24,7 @@ var constants = require('./constants.js');
24
24
  var spinner = require('@socketsecurity/registry/lib/spinner');
25
25
  var spawn = _socketInterop(require('@npmcli/promise-spawn'));
26
26
  var objects = require('@socketsecurity/registry/lib/objects');
27
- var pathResolve = require('./path-resolve.js');
27
+ var npmPaths = require('./npm-paths.js');
28
28
  var meow = _socketInterop(require('meow'));
29
29
  var registryConstants = require('@socketsecurity/registry/lib/constants');
30
30
  var socketUrl = require('./socket-url.js');
@@ -225,24 +225,30 @@ const {
225
225
  } = constants;
226
226
  function shadowNpmInstall(opts) {
227
227
  const {
228
- flags = [],
228
+ flags: flags_ = [],
229
229
  ipc,
230
230
  ...spawnOptions
231
231
  } = {
232
232
  __proto__: null,
233
233
  ...opts
234
234
  };
235
+ const flags = flags_.filter(f => f !== '--audit' && f !== '--fund' && f !== '--progress' && f !== '--no-audit' && f !== '--no-fund' && f !== '--no-progress');
235
236
  const useIpc = objects.isObject(ipc);
236
- const useDebug = pathResolve.isDebug();
237
- const promise = spawn(
237
+ const useDebug = npmPaths.isDebug();
238
+ const spawnPromise = spawn(
238
239
  // Lazily access constants.execPath.
239
240
  constants.execPath, [
240
- // Lazily access constants.rootBinPath.
241
- path.join(constants.rootBinPath, 'npm-cli.js'), 'install',
241
+ // Lazily access constants.nodeNoWarningsFlags.
242
+ ...constants.nodeNoWarningsFlags, '--require',
243
+ // Lazily access constants.distPath.
244
+ path.join(constants.distPath, 'npm-injection.js'), npmPaths.getNpmBinPath(), 'install',
242
245
  // Even though the '--silent' flag is passed npm will still run through
243
246
  // code paths for 'audit' and 'fund' unless '--no-audit' and '--no-fund'
244
247
  // flags are passed.
245
- ...(useDebug ? ['--no-audit', '--no-fund'] : ['--silent', '--no-audit', '--no-fund']), ...flags], {
248
+ '--no-audit', '--no-fund',
249
+ // Add `--no-progress` flags to fix input being swallowed by the spinner
250
+ // when running the command with recent versions of npm.
251
+ '--no-progress', ...(useDebug || flags.some(f => f.startsWith('--loglevel') || f === '-d' || f === '--dd' || f === '--ddd' || f === '-q' || f === '--quiet' || f === '-s' || f === '--silent') ? [] : ['--silent']), ...flags], {
246
252
  signal: abortSignal$3,
247
253
  // Set stdio to include 'ipc'.
248
254
  // See https://github.com/nodejs/node/blob/v23.6.0/lib/child_process.js#L161-L166
@@ -259,9 +265,9 @@ function shadowNpmInstall(opts) {
259
265
  }
260
266
  });
261
267
  if (useIpc) {
262
- promise.process.send(ipc);
268
+ spawnPromise.process.send(ipc);
263
269
  }
264
- return promise;
270
+ return spawnPromise;
265
271
  }
266
272
 
267
273
  const {
@@ -1918,16 +1924,7 @@ async function setupCommand$j(name, description, argv, importMeta) {
1918
1924
  cli.showHelp();
1919
1925
  return;
1920
1926
  }
1921
- const {
1922
- path: binPath
1923
- } = await pathResolve.findBinPathDetails(binName$1);
1924
- if (!binPath) {
1925
- // The exit code 127 indicates that the command or binary being executed
1926
- // could not be found.
1927
- console.error(`Socket unable to locate ${binName$1}; ensure it is available in the PATH environment variable.`);
1928
- process$1.exit(127);
1929
- }
1930
- const spawnPromise = spawn(binPath, argv, {
1927
+ const spawnPromise = spawn(npmPaths.getNpmBinPath(), argv, {
1931
1928
  signal: abortSignal$1,
1932
1929
  stdio: 'inherit'
1933
1930
  });
@@ -1986,16 +1983,7 @@ async function setupCommand$i(name, description, argv, importMeta) {
1986
1983
  cli.showHelp();
1987
1984
  return;
1988
1985
  }
1989
- const {
1990
- path: binPath
1991
- } = await pathResolve.findBinPathDetails(binName);
1992
- if (!binPath) {
1993
- // The exit code 127 indicates that the command or binary being executed
1994
- // could not be found.
1995
- console.error(`Socket unable to locate ${binName}; ensure it is available in the PATH environment variable.`);
1996
- process$1.exit(127);
1997
- }
1998
- const spawnPromise = spawn(binPath, argv, {
1986
+ const spawnPromise = spawn(npmPaths.getNpxBinPath(), argv, {
1999
1987
  signal: abortSignal,
2000
1988
  stdio: 'inherit'
2001
1989
  });
@@ -2172,7 +2160,6 @@ const create$2 = {
2172
2160
  }));
2173
2161
  if (reportData) {
2174
2162
  formatReportDataOutput(reportData, {
2175
- includeAllIssues,
2176
2163
  name,
2177
2164
  outputJson,
2178
2165
  outputMarkdown,
@@ -2284,7 +2271,7 @@ async function setupCommand$g(name, description, argv, importMeta) {
2284
2271
  cause
2285
2272
  });
2286
2273
  });
2287
- const packagePaths = await pathResolve.getPackageFiles(cwd, cli.input, config$1, supportedFiles);
2274
+ const packagePaths = await npmPaths.getPackageFiles(cwd, cli.input, config$1, supportedFiles);
2288
2275
  return {
2289
2276
  config: config$1,
2290
2277
  cwd,
@@ -2302,7 +2289,7 @@ async function createReport(packagePaths, {
2302
2289
  cwd,
2303
2290
  dryRun
2304
2291
  }) {
2305
- pathResolve.debugLog('Uploading:', packagePaths.join(`\n${pathResolve.logSymbols.info} Uploading: `));
2292
+ npmPaths.debugLog('Uploading:', packagePaths.join(`\n${npmPaths.logSymbols.info} Uploading: `));
2306
2293
  if (dryRun) {
2307
2294
  return;
2308
2295
  }
@@ -2672,7 +2659,7 @@ async function setupCommand$e(name, description, argv, importMeta) {
2672
2659
  cause
2673
2660
  });
2674
2661
  });
2675
- const packagePaths = await pathResolve.getPackageFilesFullScans(cwd, cli.input, supportedFiles);
2662
+ const packagePaths = await npmPaths.getPackageFilesFullScans(cwd, cli.input, supportedFiles);
2676
2663
  const {
2677
2664
  branch: branchName,
2678
2665
  repo: repoName
@@ -3787,7 +3774,7 @@ const dependencies = {
3787
3774
  }) {
3788
3775
  const name = parentName + ' dependencies';
3789
3776
  const input = setupCommand$3(name, dependencies.description, argv, importMeta);
3790
- {
3777
+ if (input) {
3791
3778
  await searchDeps(input);
3792
3779
  }
3793
3780
  }
@@ -4355,7 +4342,7 @@ const threatFeed = {
4355
4342
  }) {
4356
4343
  const name = `${parentName} threat-feed`;
4357
4344
  const input = setupCommand(name, threatFeed.description, argv, importMeta);
4358
- {
4345
+ if (input) {
4359
4346
  const apiKey = socketUrl.getDefaultToken();
4360
4347
  if (!apiKey) {
4361
4348
  throw new socketUrl.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
@@ -4576,7 +4563,7 @@ void (async () => {
4576
4563
  } else {
4577
4564
  errorTitle = 'Unexpected error with no details';
4578
4565
  }
4579
- console.error(`${pathResolve.logSymbols.error} ${colors.bgRed(colors.white(errorTitle + ':'))} ${errorMessage}`);
4566
+ console.error(`${npmPaths.logSymbols.error} ${colors.bgRed(colors.white(errorTitle + ':'))} ${errorMessage}`);
4580
4567
  if (errorBody) {
4581
4568
  console.error(`\n${errorBody}`);
4582
4569
  }
@@ -24,14 +24,12 @@ var https = require('node:https');
24
24
  var readline = require('node:readline');
25
25
  var socketUrl = require('./socket-url.js');
26
26
  var promises = require('node:timers/promises');
27
- var pathResolve = require('./path-resolve.js');
28
- var fs = require('node:fs');
27
+ var npmPaths = require('./npm-paths.js');
29
28
  var npa = _socketInterop(require('npm-package-arg'));
30
29
 
31
30
  const {
32
31
  LOOP_SENTINEL: LOOP_SENTINEL$2,
33
- NPM_REGISTRY_URL: NPM_REGISTRY_URL$1,
34
- SOCKET_CLI_FIX_PACKAGE_LOCK_FILE: SOCKET_CLI_FIX_PACKAGE_LOCK_FILE$1
32
+ NPM_REGISTRY_URL: NPM_REGISTRY_URL$1
35
33
  } = constants;
36
34
  function getUrlOrigin(input) {
37
35
  try {
@@ -41,8 +39,7 @@ function getUrlOrigin(input) {
41
39
  }
42
40
  function getPackagesToQueryFromDiff(diff_, options) {
43
41
  const {
44
- // Lazily access constants.IPC.
45
- includeUnchanged = constants.IPC[SOCKET_CLI_FIX_PACKAGE_LOCK_FILE$1],
42
+ includeUnchanged = false,
46
43
  includeUnknownOrigin = false
47
44
  } = {
48
45
  __proto__: null,
@@ -155,7 +152,7 @@ function isArtifactAlertCveFixable(alert) {
155
152
  const {
156
153
  type
157
154
  } = alert;
158
- return (type === 'cve' || type === 'mediumCVE' || type === 'mildCVE' || type === 'criticalCVE') && !!alert.props?.['firstPatchedVersionIdentifier'];
155
+ return (type === 'cve' || type === 'mediumCVE' || type === 'mildCVE' || type === 'criticalCVE') && !!alert.props?.['firstPatchedVersionIdentifier'] && !!alert.props?.['vulnerableVersionRange'];
159
156
  }
160
157
  function isArtifactAlertFixable(alert) {
161
158
  return alert.type === 'socketUpgradeAvailable' || isArtifactAlertCveFixable(alert);
@@ -374,31 +371,7 @@ void (async () => {
374
371
  _uxLookup = createAlertUXLookup(settings);
375
372
  })();
376
373
 
377
- const {
378
- NODE_MODULES,
379
- SOCKET_CLI_ISSUES_URL
380
- } = constants;
381
- const npmEntrypoint = fs.realpathSync.native(process.argv[1]);
382
- const npmRootPath = pathResolve.findRoot(path.dirname(npmEntrypoint));
383
- if (npmRootPath === undefined) {
384
- console.error(`Unable to find npm CLI install directory.
385
- Searched parent directories of ${npmEntrypoint}.
386
-
387
- This is may be a bug with socket-npm related to changes to the npm CLI.
388
- Please report to ${SOCKET_CLI_ISSUES_URL}.`);
389
- // The exit code 127 indicates that the command or binary being executed
390
- // could not be found.
391
- process.exit(127);
392
- }
393
- const npmNmPath = path.join(npmRootPath, NODE_MODULES);
394
- const arboristPkgPath = path.join(npmNmPath, '@npmcli/arborist');
395
- const arboristClassPath = path.join(arboristPkgPath, 'lib/arborist/index.js');
396
- const arboristDepValidPath = path.join(arboristPkgPath, 'lib/dep-valid.js');
397
- const arboristEdgeClassPath = path.join(arboristPkgPath, 'lib/edge.js');
398
- const arboristNodeClassPath = path.join(arboristPkgPath, 'lib/node.js');
399
- const arboristOverrideSetClassPath = path.join(arboristPkgPath, 'lib/override-set.js');
400
-
401
- const depValid = require(arboristDepValidPath);
374
+ const depValid = require(npmPaths.getArboristDepValidPath());
402
375
 
403
376
  const {
404
377
  UNDEFINED_TOKEN
@@ -428,6 +401,7 @@ function tryRequire(...ids) {
428
401
  let _log = UNDEFINED_TOKEN;
429
402
  function getLogger() {
430
403
  if (_log === UNDEFINED_TOKEN) {
404
+ const npmNmPath = npmPaths.getNpmNodeModulesPath();
431
405
  _log = tryRequire([path.join(npmNmPath, 'proc-log/lib/index.js'),
432
406
  // The proc-log DefinitelyTyped definition is incorrect. The type definition
433
407
  // is really that of its export log.
@@ -439,7 +413,7 @@ function getLogger() {
439
413
  const {
440
414
  LOOP_SENTINEL: LOOP_SENTINEL$1
441
415
  } = constants;
442
- const OverrideSet = require(arboristOverrideSetClassPath);
416
+ const OverrideSet = require(npmPaths.getArboristOverrideSetClassPath());
443
417
 
444
418
  // Implementation code not related to patch https://github.com/npm/cli/pull/7025
445
419
  // is based on https://github.com/npm/cli/blob/v11.0.0/workspaces/arborist/lib/override-set.js:
@@ -576,7 +550,7 @@ class SafeOverrideSet extends OverrideSet {
576
550
  }
577
551
  }
578
552
 
579
- const Node = require(arboristNodeClassPath);
553
+ const Node = require(npmPaths.getArboristNodeClassPath());
580
554
 
581
555
  // Implementation code not related to patch https://github.com/npm/cli/pull/7025
582
556
  // is based on https://github.com/npm/cli/blob/v11.0.0/workspaces/arborist/lib/node.js:
@@ -849,7 +823,7 @@ class SafeNode extends Node {
849
823
  }
850
824
  }
851
825
 
852
- const Edge = require(arboristEdgeClassPath);
826
+ const Edge = require(npmPaths.getArboristEdgeClassPath());
853
827
 
854
828
  // The Edge class makes heavy use of private properties which subclasses do NOT
855
829
  // have access to. So we have to recreate any functionality that relies on those
@@ -1119,15 +1093,19 @@ const {
1119
1093
  NPM_REGISTRY_URL,
1120
1094
  SOCKET_CLI_FIX_PACKAGE_LOCK_FILE,
1121
1095
  SOCKET_CLI_UPDATE_OVERRIDES_IN_PACKAGE_LOCK_FILE,
1122
- abortSignal
1096
+ abortSignal,
1097
+ kInternalsSymbol,
1098
+ [kInternalsSymbol]: {
1099
+ getIPC
1100
+ }
1123
1101
  } = constants;
1124
1102
  const formatter = new socketUrl.ColorOrMarkdown(false);
1125
- function findBestPatchVersion(name, availableVersions, currentMajorVersion, vulnerableRange) {
1103
+ function findBestPatchVersion(name, availableVersions, currentMajorVersion, vulnerableVersionRange, _firstPatchedVersionIdentifier) {
1126
1104
  const manifestVersion = registry.getManifestData(NPM, name)?.version;
1127
1105
  // Filter versions that are within the current major version and are not in the vulnerable range
1128
1106
  const eligibleVersions = availableVersions.filter(version => {
1129
1107
  const isSameMajor = semver.major(version) === currentMajorVersion;
1130
- const isNotVulnerable = !semver.satisfies(version, vulnerableRange);
1108
+ const isNotVulnerable = !semver.satisfies(version, vulnerableVersionRange);
1131
1109
  if (isSameMajor && isNotVulnerable) {
1132
1110
  return true;
1133
1111
  }
@@ -1273,7 +1251,7 @@ async function getPackagesAlerts(details, options) {
1273
1251
  packageAlerts.push(...alerts);
1274
1252
  }
1275
1253
  } catch (e) {
1276
- pathResolve.debugLog(e);
1254
+ npmPaths.debugLog(e);
1277
1255
  } finally {
1278
1256
  spinner$1?.stop();
1279
1257
  }
@@ -1289,39 +1267,36 @@ function getTranslations() {
1289
1267
  return _translations;
1290
1268
  }
1291
1269
  async function updateAdvisoryDependencies(arb, alerts) {
1292
- let alertsByPkg;
1270
+ let patchDataByPkg;
1293
1271
  for (const alert of alerts) {
1294
1272
  if (!isArtifactAlertCveFixable(alert.raw)) {
1295
1273
  continue;
1296
1274
  }
1297
- if (!alertsByPkg) {
1298
- alertsByPkg = {};
1275
+ if (!patchDataByPkg) {
1276
+ patchDataByPkg = {};
1299
1277
  }
1300
1278
  const {
1301
1279
  name
1302
1280
  } = alert;
1303
- if (!alertsByPkg[name]) {
1304
- alertsByPkg[name] = [];
1305
- }
1306
- const props = alert.raw?.props;
1307
- alertsByPkg[name].push({
1308
- id: -1,
1309
- url: props?.url,
1310
- title: props?.title,
1311
- severity: alert.raw?.severity?.toLowerCase(),
1312
- vulnerable_versions: props?.vulnerableVersionRange,
1313
- cwe: props?.cwes,
1314
- cvss: props?.csvs,
1315
- name
1281
+ if (!patchDataByPkg[name]) {
1282
+ patchDataByPkg[name] = [];
1283
+ }
1284
+ const {
1285
+ firstPatchedVersionIdentifier,
1286
+ vulnerableVersionRange
1287
+ } = alert.raw.props;
1288
+ patchDataByPkg[name].push({
1289
+ firstPatchedVersionIdentifier,
1290
+ vulnerableVersionRange
1316
1291
  });
1317
1292
  }
1318
- if (!alertsByPkg) {
1293
+ if (!patchDataByPkg) {
1319
1294
  // No advisories to process.
1320
1295
  return;
1321
1296
  }
1322
1297
  await arb.buildIdealTree();
1323
1298
  const tree = arb.idealTree;
1324
- for (const name of Object.keys(alertsByPkg)) {
1299
+ for (const name of Object.keys(patchDataByPkg)) {
1325
1300
  const nodes = findPackageNodes(tree, name);
1326
1301
  if (!nodes.length) {
1327
1302
  continue;
@@ -1335,13 +1310,13 @@ async function updateAdvisoryDependencies(arb, alerts) {
1335
1310
  } = node;
1336
1311
  const majorVerNum = semver.major(version);
1337
1312
  const availableVersions = packument ? Object.keys(packument.versions) : [];
1338
- const pkgAlerts = alertsByPkg[name];
1339
- for (const alert of pkgAlerts) {
1340
- const {
1341
- vulnerable_versions
1342
- } = alert;
1313
+ const patchData = patchDataByPkg[name];
1314
+ for (const {
1315
+ firstPatchedVersionIdentifier,
1316
+ vulnerableVersionRange
1317
+ } of patchData) {
1343
1318
  // Find the highest non-vulnerable version within the same major range
1344
- const targetVersion = findBestPatchVersion(name, availableVersions, majorVerNum, vulnerable_versions);
1319
+ const targetVersion = findBestPatchVersion(name, availableVersions, majorVerNum, vulnerableVersionRange);
1345
1320
  const targetPackument = targetVersion ? packument.versions[targetVersion] : undefined;
1346
1321
  // Check !targetVersion to make TypeScript happy.
1347
1322
  if (!targetVersion || !targetPackument) {
@@ -1393,19 +1368,22 @@ async function updateAdvisoryDependencies(arb, alerts) {
1393
1368
  }
1394
1369
  }
1395
1370
  }
1371
+ const kRiskyReify = Symbol('riskyReify');
1396
1372
  async function reify(...args) {
1373
+ const IPC = await getIPC();
1397
1374
  // We are assuming `this[_diffTrees]()` has been called by `super.reify(...)`:
1398
1375
  // https://github.com/npm/cli/blob/v11.0.0/workspaces/arborist/lib/arborist/reify.js#L141
1399
- const needInfoOn = getPackagesToQueryFromDiff(this.diff);
1376
+ let needInfoOn = getPackagesToQueryFromDiff(this.diff, {
1377
+ includeUnchanged: !!IPC[SOCKET_CLI_FIX_PACKAGE_LOCK_FILE]
1378
+ });
1400
1379
  if (!needInfoOn.length) {
1401
1380
  // Nothing to check, hmmm already installed or all private?
1402
1381
  return await this[kRiskyReify](...args);
1403
1382
  }
1404
- // Lazily access constants.IPC.
1405
1383
  const {
1406
1384
  [SOCKET_CLI_FIX_PACKAGE_LOCK_FILE]: bypassConfirms,
1407
1385
  [SOCKET_CLI_UPDATE_OVERRIDES_IN_PACKAGE_LOCK_FILE]: bypassAlerts
1408
- } = constants.IPC;
1386
+ } = IPC;
1409
1387
  const {
1410
1388
  stderr: output,
1411
1389
  stdin: input
@@ -1441,28 +1419,28 @@ async function reify(...args) {
1441
1419
  ret = await this[kRiskyReify](...args);
1442
1420
  await this.loadActual();
1443
1421
  await this.buildIdealTree();
1444
- alerts = (await getPackagesAlerts(getPackagesToQueryFromDiff(this.diff, {
1422
+ needInfoOn = getPackagesToQueryFromDiff(this.diff, {
1445
1423
  includeUnchanged: true
1446
- }), {
1424
+ });
1425
+ alerts = (await getPackagesAlerts(needInfoOn, {
1447
1426
  includeExisting: true,
1448
1427
  includeUnfixable: true
1449
1428
  })).filter(({
1450
1429
  key
1451
1430
  }) => {
1452
- if (prev.has(key)) {
1453
- return false;
1431
+ const unseen = !prev.has(key);
1432
+ if (unseen) {
1433
+ prev.add(key);
1454
1434
  }
1455
- prev.add(key);
1456
- return true;
1435
+ return unseen;
1457
1436
  });
1458
1437
  }
1459
1438
  /* eslint-enable no-await-in-loop */
1460
1439
  return ret;
1461
1440
  }
1462
1441
 
1463
- const Arborist = require(arboristClassPath);
1442
+ const Arborist = require(npmPaths.getArboristClassPath());
1464
1443
  const kCtorArgs = Symbol('ctorArgs');
1465
- const kRiskyReify = Symbol('riskyReify');
1466
1444
 
1467
1445
  // Implementation code not related to our custom behavior is based on
1468
1446
  // https://github.com/npm/cli/blob/v11.0.0/workspaces/arborist/lib/arborist/index.js:
@@ -1519,16 +1497,16 @@ function installSafeArborist() {
1519
1497
  // Override '@npmcli/arborist' module exports with patched variants based on
1520
1498
  // https://github.com/npm/cli/pull/7025.
1521
1499
  const cache = require.cache;
1522
- cache[arboristClassPath] = {
1500
+ cache[npmPaths.getArboristClassPath()] = {
1523
1501
  exports: SafeArborist
1524
1502
  };
1525
- cache[arboristEdgeClassPath] = {
1503
+ cache[npmPaths.getArboristEdgeClassPath()] = {
1526
1504
  exports: SafeEdge
1527
1505
  };
1528
- cache[arboristNodeClassPath] = {
1506
+ cache[npmPaths.getArboristNodeClassPath()] = {
1529
1507
  exports: SafeNode
1530
1508
  };
1531
- cache[arboristOverrideSetClassPath] = {
1509
+ cache[npmPaths.getArboristOverrideSetClassPath()] = {
1532
1510
  exports: SafeOverrideSet
1533
1511
  };
1534
1512
  }
@@ -0,0 +1,14 @@
1
+ declare function directoryPatterns(): string[];
2
+ declare function getNpmBinPath(): string;
3
+ declare function isNpmBinPathShadowed(): boolean;
4
+ declare function getNpxBinPath(): string;
5
+ declare function isNpxBinPathShadowed(): boolean;
6
+ declare function getNpmPath(): string;
7
+ declare function getNpmNodeModulesPath(): string;
8
+ declare function getArboristPackagePath(): string;
9
+ declare function getArboristClassPath(): string;
10
+ declare function getArboristDepValidPath(): string;
11
+ declare function getArboristEdgeClassPath(): string;
12
+ declare function getArboristNodeClassPath(): string;
13
+ declare function getArboristOverrideSetClassPath(): string;
14
+ export { directoryPatterns, getNpmBinPath, isNpmBinPathShadowed, getNpxBinPath, isNpxBinPathShadowed, getNpmPath, getNpmNodeModulesPath, getArboristPackagePath, getArboristClassPath, getArboristDepValidPath, getArboristEdgeClassPath, getArboristNodeClassPath, getArboristOverrideSetClassPath };
@@ -12,6 +12,7 @@ function _socketInterop(e) {
12
12
  var fs = require('node:fs');
13
13
  var path = require('node:path');
14
14
  var process = require('node:process');
15
+ var constants = require('./constants.js');
15
16
  var ignore = _socketInterop(require('ignore'));
16
17
  var micromatch = _socketInterop(require('micromatch'));
17
18
  var tinyglobby = _socketInterop(require('tinyglobby'));
@@ -19,7 +20,6 @@ var which = _socketInterop(require('which'));
19
20
  var colors = _socketInterop(require('yoctocolors-cjs'));
20
21
  var isUnicodeSupported = require('@socketregistry/is-unicode-supported/index.cjs');
21
22
  var spinner = require('@socketsecurity/registry/lib/spinner');
22
- var constants = require('./constants.js');
23
23
 
24
24
  const logSymbols = isUnicodeSupported() ? {
25
25
  __proto__: null,
@@ -89,11 +89,11 @@ function directoryPatterns() {
89
89
  }
90
90
 
91
91
  const {
92
- NPM,
92
+ NPM: NPM$1,
93
93
  shadowBinPath
94
94
  } = constants;
95
95
  async function filterGlobResultToSupportedFiles(entries, supportedFiles) {
96
- const patterns = ['golang', NPM, 'pypi'].reduce((r, n) => {
96
+ const patterns = ['golang', NPM$1, 'pypi'].reduce((r, n) => {
97
97
  const supported = supportedFiles[n];
98
98
  r.push(...(supported ? Object.values(supported).map(p => `**/${p.pattern}`) : []));
99
99
  return r;
@@ -181,25 +181,12 @@ function pathsToPatterns(paths) {
181
181
  // TODO: Does not support `~/` paths.
182
182
  return paths.map(p => p === '.' ? '**/*' : p);
183
183
  }
184
- function findRoot(filepath) {
185
- let curPath = filepath;
186
- while (true) {
187
- if (path.basename(curPath) === NPM) {
188
- return curPath;
189
- }
190
- const parent = path.dirname(curPath);
191
- if (parent === curPath) {
192
- return undefined;
193
- }
194
- curPath = parent;
195
- }
196
- }
197
- async function findBinPathDetails(binName) {
184
+ function findBinPathDetailsSync(binName) {
198
185
  let shadowIndex = -1;
199
- const bins = (await which(binName, {
186
+ const bins = which.sync(binName, {
200
187
  all: true,
201
188
  nothrow: true
202
- })) ?? [];
189
+ }) ?? [];
203
190
  const binPath = bins.find((binPath, i) => {
204
191
  // Skip our bin directory if it's in the front.
205
192
  if (fs.realpathSync(path.dirname(binPath)) === shadowBinPath) {
@@ -214,6 +201,19 @@ async function findBinPathDetails(binName) {
214
201
  shadowed: shadowIndex !== -1
215
202
  };
216
203
  }
204
+ function findNpmPathSync(filepath) {
205
+ let curPath = filepath;
206
+ while (true) {
207
+ if (path.basename(curPath) === NPM$1) {
208
+ return curPath;
209
+ }
210
+ const parent = path.dirname(curPath);
211
+ if (parent === curPath) {
212
+ return undefined;
213
+ }
214
+ curPath = parent;
215
+ }
216
+ }
217
217
  async function getPackageFiles(cwd, inputPaths, config, supportedFiles) {
218
218
  debugLog(`Globbed resolving ${inputPaths.length} paths:`, inputPaths);
219
219
  const entries = await globWithGitIgnore(pathsToPatterns(inputPaths), {
@@ -236,11 +236,139 @@ async function getPackageFilesFullScans(cwd, inputPaths, supportedFiles, debugLo
236
236
  return packageFiles;
237
237
  }
238
238
 
239
+ const {
240
+ NODE_MODULES,
241
+ NPM,
242
+ NPX,
243
+ SOCKET_CLI_ISSUES_URL
244
+ } = constants;
245
+ function exitWithBinPathError(binName) {
246
+ console.error(`Socket unable to locate ${binName}; ensure it is available in the PATH environment variable.`);
247
+ // The exit code 127 indicates that the command or binary being executed
248
+ // could not be found.
249
+ process.exit(127);
250
+ }
251
+ let _npmBinPathDetails;
252
+ function getNpmBinPathDetails() {
253
+ if (_npmBinPathDetails === undefined) {
254
+ _npmBinPathDetails = findBinPathDetailsSync(NPM);
255
+ }
256
+ return _npmBinPathDetails;
257
+ }
258
+ let _npxBinPathDetails;
259
+ function getNpxBinPathDetails() {
260
+ if (_npxBinPathDetails === undefined) {
261
+ _npxBinPathDetails = findBinPathDetailsSync(NPX);
262
+ }
263
+ return _npxBinPathDetails;
264
+ }
265
+ let _npmBinPath;
266
+ function getNpmBinPath() {
267
+ if (_npmBinPath === undefined) {
268
+ _npmBinPath = getNpmBinPathDetails().path;
269
+ if (!_npmBinPath) {
270
+ exitWithBinPathError(NPM);
271
+ }
272
+ }
273
+ return _npmBinPath;
274
+ }
275
+ function isNpmBinPathShadowed() {
276
+ return getNpmBinPathDetails().shadowed;
277
+ }
278
+ let _npxBinPath;
279
+ function getNpxBinPath() {
280
+ if (_npxBinPath === undefined) {
281
+ _npxBinPath = getNpxBinPathDetails().path;
282
+ if (!_npxBinPath) {
283
+ exitWithBinPathError(NPX);
284
+ }
285
+ }
286
+ return _npxBinPath;
287
+ }
288
+ function isNpxBinPathShadowed() {
289
+ return getNpxBinPathDetails().shadowed;
290
+ }
291
+ let _npmPath;
292
+ function getNpmPath() {
293
+ if (_npmPath === undefined) {
294
+ const npmEntrypoint = path.dirname(fs.realpathSync.native(getNpmBinPath()));
295
+ _npmPath = findNpmPathSync(npmEntrypoint);
296
+ if (!_npmPath) {
297
+ console.error(`Unable to find npm CLI install directory.
298
+ Searched parent directories of ${npmEntrypoint}.
299
+
300
+ This is may be a bug with socket-npm related to changes to the npm CLI.
301
+ Please report to ${SOCKET_CLI_ISSUES_URL}.`);
302
+ // The exit code 127 indicates that the command or binary being executed
303
+ // could not be found.
304
+ process.exit(127);
305
+ }
306
+ }
307
+ return _npmPath;
308
+ }
309
+ let _npmNmPath;
310
+ function getNpmNodeModulesPath() {
311
+ if (_npmNmPath === undefined) {
312
+ _npmNmPath = path.join(getNpmPath(), NODE_MODULES);
313
+ }
314
+ return _npmNmPath;
315
+ }
316
+ let _arboristPkgPath;
317
+ function getArboristPackagePath() {
318
+ if (_arboristPkgPath === undefined) {
319
+ _arboristPkgPath = path.join(getNpmNodeModulesPath(), '@npmcli/arborist');
320
+ }
321
+ return _arboristPkgPath;
322
+ }
323
+ let _arboristClassPath;
324
+ function getArboristClassPath() {
325
+ if (_arboristClassPath === undefined) {
326
+ _arboristClassPath = path.join(getArboristPackagePath(), 'lib/arborist/index.js');
327
+ }
328
+ return _arboristClassPath;
329
+ }
330
+ let _arboristDepValidPath;
331
+ function getArboristDepValidPath() {
332
+ if (_arboristDepValidPath === undefined) {
333
+ _arboristDepValidPath = path.join(getArboristPackagePath(), 'lib/dep-valid.js');
334
+ }
335
+ return _arboristDepValidPath;
336
+ }
337
+ let _arboristEdgeClassPath;
338
+ function getArboristEdgeClassPath() {
339
+ if (_arboristEdgeClassPath === undefined) {
340
+ _arboristEdgeClassPath = path.join(getArboristPackagePath(), 'lib/edge.js');
341
+ }
342
+ return _arboristEdgeClassPath;
343
+ }
344
+ let _arboristNodeClassPath;
345
+ function getArboristNodeClassPath() {
346
+ if (_arboristNodeClassPath === undefined) {
347
+ _arboristNodeClassPath = path.join(getArboristPackagePath(), 'lib/node.js');
348
+ }
349
+ return _arboristNodeClassPath;
350
+ }
351
+ let _arboristOverrideSetClassPath;
352
+ function getArboristOverrideSetClassPath() {
353
+ if (_arboristOverrideSetClassPath === undefined) {
354
+ _arboristOverrideSetClassPath = path.join(getArboristPackagePath(), 'lib/override-set.js');
355
+ }
356
+ return _arboristOverrideSetClassPath;
357
+ }
358
+
239
359
  exports.debugLog = debugLog;
240
- exports.findBinPathDetails = findBinPathDetails;
241
- exports.findRoot = findRoot;
360
+ exports.getArboristClassPath = getArboristClassPath;
361
+ exports.getArboristDepValidPath = getArboristDepValidPath;
362
+ exports.getArboristEdgeClassPath = getArboristEdgeClassPath;
363
+ exports.getArboristNodeClassPath = getArboristNodeClassPath;
364
+ exports.getArboristOverrideSetClassPath = getArboristOverrideSetClassPath;
365
+ exports.getNpmBinPath = getNpmBinPath;
366
+ exports.getNpmNodeModulesPath = getNpmNodeModulesPath;
367
+ exports.getNpxBinPath = getNpxBinPath;
242
368
  exports.getPackageFiles = getPackageFiles;
243
369
  exports.getPackageFilesFullScans = getPackageFilesFullScans;
244
370
  exports.isDebug = isDebug;
371
+ exports.isNpmBinPathShadowed = isNpmBinPathShadowed;
372
+ exports.isNpxBinPathShadowed = isNpxBinPathShadowed;
245
373
  exports.logSymbols = logSymbols;
246
374
  exports.logger = logger;
@@ -1,13 +1,12 @@
1
1
  /// <reference types="node" />
2
2
  import { SocketYml } from '@socketsecurity/config';
3
3
  import { SocketSdkReturnType } from '@socketsecurity/sdk';
4
- declare function directoryPatterns(): string[];
5
- declare function findRoot(filepath: string): string | undefined;
6
- declare function findBinPathDetails(binName: string): Promise<{
4
+ declare function findBinPathDetailsSync(binName: string): {
7
5
  name: string;
8
6
  path: string | undefined;
9
7
  shadowed: boolean;
10
- }>;
8
+ };
9
+ declare function findNpmPathSync(filepath: string): string | undefined;
11
10
  declare function getPackageFiles(cwd: string, inputPaths: string[], config: SocketYml | undefined, supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data']): Promise<string[]>;
12
11
  declare function getPackageFilesFullScans(cwd: string, inputPaths: string[], supportedFiles: SocketSdkReturnType<'getReportSupportedFiles'>['data'], debugLog?: typeof console.error): Promise<string[]>;
13
- export { directoryPatterns, findRoot, findBinPathDetails, getPackageFiles, getPackageFilesFullScans };
12
+ export { findBinPathDetailsSync, findNpmPathSync, getPackageFiles, getPackageFilesFullScans };
@@ -13,21 +13,16 @@ var path = require('node:path');
13
13
  var process = require('node:process');
14
14
  var spawn = _socketInterop(require('@npmcli/promise-spawn'));
15
15
  var cmdShim = _socketInterop(require('cmd-shim'));
16
+ var npmPaths = require('./npm-paths.js');
16
17
  var constants = require('./constants.js');
17
- var pathResolve = require('./path-resolve.js');
18
18
 
19
+ const {
20
+ NPX
21
+ } = constants;
19
22
  async function installLinks(realBinPath, binName) {
23
+ const isNpx = binName === NPX;
20
24
  // Find package manager being shadowed by this process.
21
- const {
22
- path: binPath,
23
- shadowed
24
- } = await pathResolve.findBinPathDetails(binName);
25
- if (!binPath) {
26
- // The exit code 127 indicates that the command or binary being executed
27
- // could not be found.
28
- console.error(`Socket unable to locate ${binName}; ensure it is available in the PATH environment variable.`);
29
- process.exit(127);
30
- }
25
+ const binPath = isNpx ? npmPaths.getNpxBinPath() : npmPaths.getNpmBinPath();
31
26
  // Lazily access constants.WIN32.
32
27
  const {
33
28
  WIN32
@@ -36,6 +31,7 @@ async function installLinks(realBinPath, binName) {
36
31
  if (WIN32 && binPath) {
37
32
  return binPath;
38
33
  }
34
+ const shadowed = isNpx ? npmPaths.isNpxBinPathShadowed() : npmPaths.isNpmBinPathShadowed();
39
35
  // Move our bin directory to front of PATH so its found first.
40
36
  if (!shadowed) {
41
37
  if (WIN32) {
@@ -62,10 +58,10 @@ async function shadowBin(binName, binArgs = process.argv.slice(2)) {
62
58
  // Lazily access constants.distPath.
63
59
  path.join(constants.distPath, 'npm-injection.js'),
64
60
  // Lazily access constants.shadowBinPath.
65
- await installLinks(constants.shadowBinPath, binName), ...binArgs,
61
+ await installLinks(constants.shadowBinPath, binName), ...(binName === NPM && binArgs.includes('install') ? [
66
62
  // Add the `--quiet` and `--no-progress` flags to fix input being swallowed
67
63
  // by the spinner when running the command with recent versions of npm.
68
- ...(binName === NPM && binArgs.includes('install') && !binArgs.includes('--no-progress') && !binArgs.includes('--quiet') ? ['--no-progress', '--quiet'] : [])], {
64
+ ...binArgs.filter(a => a !== '--progress' && a !== '--no-progress'), '--no-progress', ...(binArgs.includes('-q') || binArgs.includes('--quiet') || binArgs.includes('-s') || binArgs.includes('--silent') ? [] : ['--quiet'])] : binArgs)], {
69
65
  signal: abortSignal,
70
66
  stdio: 'inherit'
71
67
  });
@@ -12,7 +12,7 @@ function _socketInterop(e) {
12
12
  var terminalLink = _socketInterop(require('terminal-link'));
13
13
  var colors = _socketInterop(require('yoctocolors-cjs'));
14
14
  var indentString = require('@socketregistry/indent-string/index.cjs');
15
- var pathResolve = require('./path-resolve.js');
15
+ var npmPaths = require('./npm-paths.js');
16
16
  var process = require('node:process');
17
17
  var hpagent = _socketInterop(require('hpagent'));
18
18
  var isInteractive = require('@socketregistry/is-interactive/index.cjs');
@@ -82,7 +82,7 @@ class ColorOrMarkdown {
82
82
  return this.useMarkdown ? `* ${indentedContent.join('\n* ')}\n` : `${indentedContent.join('\n')}\n`;
83
83
  }
84
84
  get logSymbols() {
85
- return this.useMarkdown ? markdownLogSymbols : pathResolve.logSymbols;
85
+ return this.useMarkdown ? markdownLogSymbols : npmPaths.logSymbols;
86
86
  }
87
87
  }
88
88
 
@@ -146,7 +146,7 @@ function getSettings() {
146
146
  try {
147
147
  Object.assign(_settings, JSON.parse(Buffer.from(raw, 'base64').toString()));
148
148
  } catch {
149
- pathResolve.logger.warn(`Failed to parse settings at ${settingsPath}`);
149
+ npmPaths.logger.warn(`Failed to parse settings at ${settingsPath}`);
150
150
  }
151
151
  } else {
152
152
  fs.mkdirSync(path.dirname(settingsPath), {
@@ -170,7 +170,7 @@ function getSettingsPath() {
170
170
  if (WIN32) {
171
171
  if (!_warnedSettingPathWin32Missing) {
172
172
  _warnedSettingPathWin32Missing = true;
173
- pathResolve.logger.warn(`Missing %${LOCALAPPDATA}%`);
173
+ npmPaths.logger.warn(`Missing %${LOCALAPPDATA}%`);
174
174
  }
175
175
  } else {
176
176
  dataHome = path.join(os.homedir(), ...(process.platform === 'darwin' ? ['Library', 'Application Support'] : ['.local', 'share']));
@@ -24,7 +24,7 @@ var constants = require('./constants.js');
24
24
  var spinner = require('@socketsecurity/registry/lib/spinner');
25
25
  var spawn = _socketInterop(require('@npmcli/promise-spawn'));
26
26
  var objects = require('@socketsecurity/registry/lib/objects');
27
- var pathResolve = require('./path-resolve.js');
27
+ var npmPaths = require('./npm-paths.js');
28
28
  var registryConstants = require('@socketsecurity/registry/lib/constants');
29
29
  var socketUrl = require('./socket-url.js');
30
30
  var terminalLink = _socketInterop(require('terminal-link'));
@@ -223,24 +223,30 @@ const {
223
223
  } = constants;
224
224
  function shadowNpmInstall(opts) {
225
225
  const {
226
- flags = [],
226
+ flags: flags_ = [],
227
227
  ipc,
228
228
  ...spawnOptions
229
229
  } = {
230
230
  __proto__: null,
231
231
  ...opts
232
232
  };
233
+ const flags = flags_.filter(f => f !== '--audit' && f !== '--fund' && f !== '--progress' && f !== '--no-audit' && f !== '--no-fund' && f !== '--no-progress');
233
234
  const useIpc = objects.isObject(ipc);
234
- const useDebug = pathResolve.isDebug();
235
- const promise = spawn(
235
+ const useDebug = npmPaths.isDebug();
236
+ const spawnPromise = spawn(
236
237
  // Lazily access constants.execPath.
237
238
  constants.execPath, [
238
- // Lazily access constants.rootBinPath.
239
- path.join(constants.rootBinPath, 'npm-cli.js'), 'install',
239
+ // Lazily access constants.nodeNoWarningsFlags.
240
+ ...constants.nodeNoWarningsFlags, '--require',
241
+ // Lazily access constants.distPath.
242
+ path.join(constants.distPath, 'npm-injection.js'), npmPaths.getNpmBinPath(), 'install',
240
243
  // Even though the '--silent' flag is passed npm will still run through
241
244
  // code paths for 'audit' and 'fund' unless '--no-audit' and '--no-fund'
242
245
  // flags are passed.
243
- ...(useDebug ? ['--no-audit', '--no-fund'] : ['--silent', '--no-audit', '--no-fund']), ...flags], {
246
+ '--no-audit', '--no-fund',
247
+ // Add `--no-progress` flags to fix input being swallowed by the spinner
248
+ // when running the command with recent versions of npm.
249
+ '--no-progress', ...(useDebug || flags.some(f => f.startsWith('--loglevel') || f === '-d' || f === '--dd' || f === '--ddd' || f === '-q' || f === '--quiet' || f === '-s' || f === '--silent') ? [] : ['--silent']), ...flags], {
244
250
  signal: abortSignal$3,
245
251
  // Set stdio to include 'ipc'.
246
252
  // See https://github.com/nodejs/node/blob/v23.6.0/lib/child_process.js#L161-L166
@@ -257,9 +263,9 @@ function shadowNpmInstall(opts) {
257
263
  }
258
264
  });
259
265
  if (useIpc) {
260
- promise.process.send(ipc);
266
+ spawnPromise.process.send(ipc);
261
267
  }
262
- return promise;
268
+ return spawnPromise;
263
269
  }
264
270
 
265
271
  const {
@@ -1916,16 +1922,7 @@ async function setupCommand$j(name, description, argv, importMeta) {
1916
1922
  cli.showHelp();
1917
1923
  return;
1918
1924
  }
1919
- const {
1920
- path: binPath
1921
- } = await pathResolve.findBinPathDetails(binName$1);
1922
- if (!binPath) {
1923
- // The exit code 127 indicates that the command or binary being executed
1924
- // could not be found.
1925
- console.error(`Socket unable to locate ${binName$1}; ensure it is available in the PATH environment variable.`);
1926
- process$1.exit(127);
1927
- }
1928
- const spawnPromise = spawn(binPath, argv, {
1925
+ const spawnPromise = spawn(npmPaths.getNpmBinPath(), argv, {
1929
1926
  signal: abortSignal$1,
1930
1927
  stdio: 'inherit'
1931
1928
  });
@@ -1984,16 +1981,7 @@ async function setupCommand$i(name, description, argv, importMeta) {
1984
1981
  cli.showHelp();
1985
1982
  return;
1986
1983
  }
1987
- const {
1988
- path: binPath
1989
- } = await pathResolve.findBinPathDetails(binName);
1990
- if (!binPath) {
1991
- // The exit code 127 indicates that the command or binary being executed
1992
- // could not be found.
1993
- console.error(`Socket unable to locate ${binName}; ensure it is available in the PATH environment variable.`);
1994
- process$1.exit(127);
1995
- }
1996
- const spawnPromise = spawn(binPath, argv, {
1984
+ const spawnPromise = spawn(npmPaths.getNpxBinPath(), argv, {
1997
1985
  signal: abortSignal,
1998
1986
  stdio: 'inherit'
1999
1987
  });
@@ -2170,7 +2158,6 @@ const create$2 = {
2170
2158
  }));
2171
2159
  if (reportData) {
2172
2160
  formatReportDataOutput(reportData, {
2173
- includeAllIssues,
2174
2161
  name,
2175
2162
  outputJson,
2176
2163
  outputMarkdown,
@@ -2282,7 +2269,7 @@ async function setupCommand$g(name, description, argv, importMeta) {
2282
2269
  cause
2283
2270
  });
2284
2271
  });
2285
- const packagePaths = await pathResolve.getPackageFiles(cwd, cli.input, config$1, supportedFiles);
2272
+ const packagePaths = await npmPaths.getPackageFiles(cwd, cli.input, config$1, supportedFiles);
2286
2273
  return {
2287
2274
  config: config$1,
2288
2275
  cwd,
@@ -2300,7 +2287,7 @@ async function createReport(packagePaths, {
2300
2287
  cwd,
2301
2288
  dryRun
2302
2289
  }) {
2303
- pathResolve.debugLog('Uploading:', packagePaths.join(`\n${pathResolve.logSymbols.info} Uploading: `));
2290
+ npmPaths.debugLog('Uploading:', packagePaths.join(`\n${npmPaths.logSymbols.info} Uploading: `));
2304
2291
  if (dryRun) {
2305
2292
  return;
2306
2293
  }
@@ -2670,7 +2657,7 @@ async function setupCommand$e(name, description, argv, importMeta) {
2670
2657
  cause
2671
2658
  });
2672
2659
  });
2673
- const packagePaths = await pathResolve.getPackageFilesFullScans(cwd, cli.input, supportedFiles);
2660
+ const packagePaths = await npmPaths.getPackageFilesFullScans(cwd, cli.input, supportedFiles);
2674
2661
  const {
2675
2662
  branch: branchName,
2676
2663
  repo: repoName
@@ -3785,7 +3772,7 @@ const dependencies = {
3785
3772
  }) {
3786
3773
  const name = parentName + ' dependencies';
3787
3774
  const input = setupCommand$3(name, dependencies.description, argv, importMeta);
3788
- {
3775
+ if (input) {
3789
3776
  await searchDeps(input);
3790
3777
  }
3791
3778
  }
@@ -4353,7 +4340,7 @@ const threatFeed = {
4353
4340
  }) {
4354
4341
  const name = `${parentName} threat-feed`;
4355
4342
  const input = setupCommand(name, threatFeed.description, argv, importMeta);
4356
- {
4343
+ if (input) {
4357
4344
  const apiKey = socketUrl.getDefaultToken();
4358
4345
  if (!apiKey) {
4359
4346
  throw new socketUrl.AuthError('User must be authenticated to run this command. To log in, run the command `socket login` and enter your API key.');
@@ -4574,7 +4561,7 @@ void (async () => {
4574
4561
  } else {
4575
4562
  errorTitle = 'Unexpected error with no details';
4576
4563
  }
4577
- console.error(`${pathResolve.logSymbols.error} ${colors.bgRed(colors.white(errorTitle + ':'))} ${errorMessage}`);
4564
+ console.error(`${npmPaths.logSymbols.error} ${colors.bgRed(colors.white(errorTitle + ':'))} ${errorMessage}`);
4578
4565
  if (errorBody) {
4579
4566
  console.error(`\n${errorBody}`);
4580
4567
  }
@@ -0,0 +1,3 @@
1
+ 'use strict'
2
+
3
+ module.exports = require('../module-sync/npm-paths.js')
@@ -1707,22 +1707,15 @@ function redent(string, count = 0, options = {}) {
1707
1707
  }
1708
1708
  const debug$1 = typeof process === 'object' && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error('SEMVER', ...args) : () => {};
1709
1709
  var debug_1 = debug$1;
1710
- const SEMVER_SPEC_VERSION = '2.0.0';
1711
1710
  const MAX_LENGTH$1 = 256;
1712
1711
  const MAX_SAFE_INTEGER$1 = Number.MAX_SAFE_INTEGER || 9007199254740991;
1713
1712
  const MAX_SAFE_COMPONENT_LENGTH = 16;
1714
1713
  const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH$1 - 6;
1715
- const RELEASE_TYPES = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease'];
1716
1714
  var constants$1 = {
1717
1715
  MAX_LENGTH: MAX_LENGTH$1,
1718
1716
  MAX_SAFE_COMPONENT_LENGTH,
1719
1717
  MAX_SAFE_BUILD_LENGTH,
1720
- MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1,
1721
- RELEASE_TYPES,
1722
- SEMVER_SPEC_VERSION,
1723
- FLAG_INCLUDE_PRERELEASE: 0b001,
1724
- FLAG_LOOSE: 0b010
1725
- };
1718
+ MAX_SAFE_INTEGER: MAX_SAFE_INTEGER$1};
1726
1719
  var re$1 = {
1727
1720
  exports: {}
1728
1721
  };
@@ -1828,11 +1821,8 @@ const compareIdentifiers$1 = (a, b) => {
1828
1821
  }
1829
1822
  return a === b ? 0 : anum && !bnum ? -1 : bnum && !anum ? 1 : a < b ? -1 : 1;
1830
1823
  };
1831
- const rcompareIdentifiers = (a, b) => compareIdentifiers$1(b, a);
1832
1824
  var identifiers = {
1833
- compareIdentifiers: compareIdentifiers$1,
1834
- rcompareIdentifiers
1835
- };
1825
+ compareIdentifiers: compareIdentifiers$1};
1836
1826
  const debug = debug_1;
1837
1827
  const {
1838
1828
  MAX_LENGTH,
@@ -4694,9 +4684,9 @@ function versionIncluded(nodeVersion, specifierValue) {
4694
4684
  if (typeof specifierValue === 'boolean') {
4695
4685
  return specifierValue;
4696
4686
  }
4697
- var current = typeof nodeVersion === 'undefined' ? process.versions && process.versions.node : nodeVersion;
4687
+ var current = process.versions && process.versions.node ;
4698
4688
  if (typeof current !== 'string') {
4699
- throw new TypeError(typeof nodeVersion === 'undefined' ? 'Unable to determine current node version' : 'If provided, a valid node version is required');
4689
+ throw new TypeError('Unable to determine current node version' );
4700
4690
  }
4701
4691
  if (specifierValue && typeof specifierValue === 'object') {
4702
4692
  for (var i = 0; i < specifierValue.length; ++i) {
@@ -6765,7 +6755,6 @@ function getSupportLevel$1(stream) {
6765
6755
  return translateLevel$1(level);
6766
6756
  }
6767
6757
  var supportsColor_1$1 = {
6768
- supportsColor: getSupportLevel$1,
6769
6758
  stdout: getSupportLevel$1(process.stdout),
6770
6759
  stderr: getSupportLevel$1(process.stderr)
6771
6760
  };
@@ -7391,7 +7380,6 @@ function getSupportLevel(stream) {
7391
7380
  return translateLevel(level);
7392
7381
  }
7393
7382
  var supportsColor_1 = {
7394
- supportsColor: getSupportLevel,
7395
7383
  stdout: getSupportLevel(process.stdout),
7396
7384
  stderr: getSupportLevel(process.stderr)
7397
7385
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "socket",
3
- "version": "0.14.41",
3
+ "version": "0.14.42",
4
4
  "description": "CLI tool for Socket.dev",
5
5
  "homepage": "http://github.com/SocketDev/socket-cli",
6
6
  "license": "MIT",
@@ -61,14 +61,14 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@apideck/better-ajv-errors": "^0.3.6",
64
- "@cyclonedx/cdxgen": "^11.1.5",
64
+ "@cyclonedx/cdxgen": "^11.1.7",
65
65
  "@npmcli/promise-spawn": "^8.0.2",
66
66
  "@socketregistry/hyrious__bun.lockb": "^1.0.12",
67
67
  "@socketregistry/indent-string": "^1.0.9",
68
68
  "@socketregistry/is-interactive": "^1.0.1",
69
69
  "@socketregistry/is-unicode-supported": "^1.0.0",
70
70
  "@socketsecurity/config": "^2.1.3",
71
- "@socketsecurity/registry": "^1.0.78",
71
+ "@socketsecurity/registry": "^1.0.81",
72
72
  "@socketsecurity/sdk": "^1.4.5",
73
73
  "blessed": "^0.1.81",
74
74
  "blessed-contrib": "^4.11.0",
@@ -102,7 +102,7 @@
102
102
  "@babel/preset-env": "^7.26.7",
103
103
  "@babel/preset-typescript": "^7.26.0",
104
104
  "@babel/runtime": "^7.26.7",
105
- "@eslint/compat": "^1.2.5",
105
+ "@eslint/compat": "^1.2.6",
106
106
  "@eslint/js": "^9.19.0",
107
107
  "@rollup/plugin-commonjs": "^28.0.2",
108
108
  "@rollup/plugin-json": "^6.1.0",
@@ -115,7 +115,7 @@
115
115
  "@types/micromatch": "^4.0.9",
116
116
  "@types/mocha": "^10.0.10",
117
117
  "@types/mock-fs": "^4.13.4",
118
- "@types/node": "^22.12.0",
118
+ "@types/node": "^22.13.0",
119
119
  "@types/npmcli__arborist": "^6.3.0",
120
120
  "@types/npmcli__promise-spawn": "^6.0.3",
121
121
  "@types/proc-log": "^3.0.4",
@@ -141,10 +141,10 @@
141
141
  "mock-fs": "^5.4.1",
142
142
  "nock": "^14.0.0",
143
143
  "npm-run-all2": "^7.0.2",
144
- "oxlint": "0.15.8",
144
+ "oxlint": "0.15.9",
145
145
  "prettier": "3.4.2",
146
146
  "read-package-up": "^11.0.0",
147
- "rollup": "4.32.1",
147
+ "rollup": "4.34.1",
148
148
  "rollup-plugin-ts": "^3.4.5",
149
149
  "type-coverage": "^2.29.7",
150
150
  "typescript": "5.4.5",
@@ -152,6 +152,7 @@
152
152
  "unplugin-purge-polyfills": "^0.0.7"
153
153
  },
154
154
  "overrides": {
155
+ "@socketregistry/packageurl-js": "npm:@socketregistry/packageurl-js@^1",
155
156
  "aggregate-error": "npm:@socketregistry/aggregate-error@^1",
156
157
  "es-define-property": "npm:@socketregistry/es-define-property@^1",
157
158
  "function-bind": "npm:@socketregistry/function-bind@^1",
@@ -178,6 +179,7 @@
178
179
  "yaml": "$yaml"
179
180
  },
180
181
  "resolutions": {
182
+ "@socketregistry/packageurl-js": "npm:@socketregistry/packageurl-js@^1",
181
183
  "aggregate-error": "npm:@socketregistry/aggregate-error@^1",
182
184
  "es-define-property": "npm:@socketregistry/es-define-property@^1",
183
185
  "function-bind": "npm:@socketregistry/function-bind@^1",
@@ -1,3 +0,0 @@
1
- 'use strict'
2
-
3
- module.exports = require('../module-sync/path-resolve.js')