@socketsecurity/cli-with-sentry 1.1.93 → 1.1.94

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.
Files changed (29) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/cli.js +247 -24
  3. package/dist/cli.js.map +1 -1
  4. package/dist/constants.js +3 -3
  5. package/dist/constants.js.map +1 -1
  6. package/dist/socket-completion.bash +2 -2
  7. package/dist/tsconfig.dts.tsbuildinfo +1 -1
  8. package/dist/types/commands/ci/handle-ci.d.mts.map +1 -1
  9. package/dist/types/commands/manifest/cmd-manifest-scala.d.mts.map +1 -1
  10. package/dist/types/commands/manifest/convert_sbt_to_maven.d.mts.map +1 -1
  11. package/dist/types/commands/scan/cmd-scan-create.d.mts.map +1 -1
  12. package/dist/types/commands/scan/cmd-scan-reach.d.mts.map +1 -1
  13. package/dist/types/commands/scan/exclude-paths.d.mts +47 -0
  14. package/dist/types/commands/scan/exclude-paths.d.mts.map +1 -0
  15. package/dist/types/commands/scan/handle-create-new-scan.d.mts.map +1 -1
  16. package/dist/types/commands/scan/handle-scan-reach.d.mts.map +1 -1
  17. package/dist/types/commands/scan/output-scan-reach.d.mts.map +1 -1
  18. package/dist/types/commands/scan/perform-reachability-analysis.d.mts +1 -0
  19. package/dist/types/commands/scan/perform-reachability-analysis.d.mts.map +1 -1
  20. package/dist/types/commands/scan/reachability-flags.d.mts +1 -0
  21. package/dist/types/commands/scan/reachability-flags.d.mts.map +1 -1
  22. package/dist/types/utils/glob.d.mts +14 -0
  23. package/dist/types/utils/glob.d.mts.map +1 -1
  24. package/dist/types/utils/path-resolve.d.mts +5 -0
  25. package/dist/types/utils/path-resolve.d.mts.map +1 -1
  26. package/dist/utils.js +273 -244
  27. package/dist/utils.js.map +1 -1
  28. package/dist/vendor.js +8181 -8181
  29. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
+ ## [1.1.94](https://github.com/SocketDev/socket-cli/releases/tag/v1.1.94) - 2026-05-12
8
+
9
+ ### Fixed
10
+ - `socket manifest scala` now copies sbt-generated `.pom` files out of each subproject's `target/` directory to the project root as `pom.xml`, so Socket scan (which discovers `**/pom.xml` and respects `.gitignore`) picks them up automatically. Use `--out` to override the destination filename.
11
+
7
12
  ## [1.1.93](https://github.com/SocketDev/socket-cli/releases/tag/v1.1.93) - 2026-05-08
8
13
 
9
14
  ### Changed
package/dist/cli.js CHANGED
@@ -880,6 +880,143 @@ async function run$R(argv, importMeta, {
880
880
  });
881
881
  }
882
882
 
883
+ function normalizeProjectIgnorePath(path) {
884
+ return utils.stripTrailingSlash(toPosixPath(path.startsWith('/') ? path.slice(1) : path));
885
+ }
886
+
887
+ /**
888
+ * Converts a Socket-scan-root anchored --exclude-paths pattern into the shape
889
+ * Coana expects for the current analysis target. Coana resolves --exclude-dirs
890
+ * relative to the path passed to `coana run`, not relative to this command's
891
+ * cwd. For a root target the pattern can pass through unchanged; for a nested
892
+ * target we strip the target prefix; documented match-anywhere globstar
893
+ * patterns remain meaningful relative to the nested target; and paths outside
894
+ * the target return undefined because Coana cannot exclude directories it is
895
+ * not analyzing.
896
+ */
897
+ function pathRelativeToTarget(path, target) {
898
+ const normalized = normalizeProjectIgnorePath(path);
899
+ if (target === '.' || target === '') {
900
+ // Root target: the project root and Coana analysis root are the same directory.
901
+ return normalized;
902
+ }
903
+ if (normalized === target) {
904
+ // Whole target excluded: manifest discovery should stop before Coana runs.
905
+ return undefined;
906
+ }
907
+ if (normalized.startsWith('**/')) {
908
+ // Match-anywhere glob: keep matching at any depth under the Coana target.
909
+ return normalized;
910
+ }
911
+ const targetPrefix = `${target}/`;
912
+ if (normalized.startsWith(targetPrefix)) {
913
+ // Nested target: strip the target prefix to make the pattern target-relative.
914
+ return normalized.slice(targetPrefix.length);
915
+ }
916
+ // Outside the target: there is nothing for this Coana run to exclude.
917
+ return undefined;
918
+ }
919
+ function toPosixPath(path) {
920
+ return path.replaceAll('\\', '/');
921
+ }
922
+
923
+ /**
924
+ * Derives the two scan-time forms of --exclude-paths: anchored minimatch
925
+ * patterns for SCA manifest discovery, and target-relative paths for Coana's
926
+ * reachability analysis.
927
+ */
928
+ function applyFullExcludePaths({
929
+ cwd,
930
+ reachabilityOptions,
931
+ target
932
+ }) {
933
+ const {
934
+ excludePaths
935
+ } = reachabilityOptions;
936
+ const additionalScaIgnores = excludePaths.flatMap(excludePathToScanIgnores);
937
+ const coanaExcludeGlobs = projectIgnorePathsToReachExcludePaths(excludePaths, {
938
+ cwd,
939
+ target
940
+ });
941
+ const mergedReachabilityOptions = excludePaths.length ? {
942
+ ...reachabilityOptions,
943
+ reachExcludePaths: [...reachabilityOptions.reachExcludePaths, ...coanaExcludeGlobs]
944
+ } : reachabilityOptions;
945
+ return {
946
+ additionalScaIgnores,
947
+ mergedReachabilityOptions
948
+ };
949
+ }
950
+
951
+ // Patterns that resolve to "exclude the entire scan" or "exclude nothing
952
+ // useful" are almost certainly typos. Rejecting them up front beats
953
+ // silently producing an empty scan or a no-op exclusion.
954
+ const DEGENERATE_EXCLUDE_PATHS = new Set(['', '.', './', './**', '/', '**', '/**']);
955
+
956
+ /**
957
+ * Validates --exclude-paths entries before they reach either exclusion sink.
958
+ * Rejects gitignore-style negations (coana's --exclude-dirs has no negation
959
+ * form), absolute paths (the flag is scan-root relative), patterns escaping
960
+ * the scan root via `..`, and degenerate match-everything sentinels like `.`,
961
+ * `**`, `/`.
962
+ */
963
+ function assertValidExcludePaths(paths) {
964
+ for (const p of paths) {
965
+ if (p.startsWith('!')) {
966
+ throw new utils.InputError(`--exclude-paths does not support negation patterns. Got: '${p}'.`);
967
+ }
968
+ const posix = toPosixPath(p).trim();
969
+ if (DEGENERATE_EXCLUDE_PATHS.has(utils.stripTrailingSlash(posix))) {
970
+ throw new utils.InputError(`--exclude-paths does not accept match-everything patterns. Got: '${p}'.`);
971
+ }
972
+ if (posix.startsWith('/')) {
973
+ throw new utils.InputError(`--exclude-paths must be relative to the scan root. Got absolute path: '${p}'.`);
974
+ }
975
+ if (posix === '..' || posix.startsWith('../') || posix.includes('/../')) {
976
+ throw new utils.InputError(`--exclude-paths cannot escape the scan root with '..'. Got: '${p}'.`);
977
+ }
978
+ }
979
+ }
980
+
981
+ /**
982
+ * Expands an anchored-micromatch --exclude-paths entry into the minimatch
983
+ * patterns fast-glob needs to skip both the matched entry itself (file-shaped
984
+ * matches like `packages/stray.json` against `packages/*`) and any subtree
985
+ * underneath it (`packages/a/foo.json`). Returned patterns are ready for
986
+ * fast-glob's `ignore` list — no gitignore translation involved.
987
+ */
988
+ function excludePathToScanIgnores(input) {
989
+ const stripped = utils.stripTrailingSlash(toPosixPath(input));
990
+ // User already opted into "match everything under this dir" — one pattern
991
+ // is enough.
992
+ if (stripped.endsWith('/**')) {
993
+ return [stripped];
994
+ }
995
+ // Emit the entry itself (catches file-shaped hits) plus its subtree
996
+ // (catches descendants when the entry resolves to a directory).
997
+ return [stripped, `${stripped}/**`];
998
+ }
999
+
1000
+ /**
1001
+ * Re-anchors --exclude-paths patterns onto the reachability analysis target.
1002
+ * Coana matches --exclude-dirs relative to whichever directory it was invoked
1003
+ * on, so when the analysis target is a nested subdirectory, scan-root
1004
+ * patterns need their target prefix stripped. Patterns that fall outside the
1005
+ * target are dropped — coana cannot exclude what it isn't analyzing. Bails
1006
+ * out entirely when any input contains a negation, since coana's --exclude-dirs
1007
+ * has no negation form.
1008
+ */
1009
+ function projectIgnorePathsToReachExcludePaths(paths, options) {
1010
+ if (!Array.isArray(paths) || paths.some(p => p.startsWith('!'))) {
1011
+ return [];
1012
+ }
1013
+ const targetPattern = normalizeProjectIgnorePath(path.relative(options.cwd, path.resolve(options.cwd, options.target)));
1014
+ return paths.flatMap(p => {
1015
+ const reachPath = pathRelativeToTarget(p, targetPattern);
1016
+ return reachPath === undefined ? [] : [reachPath];
1017
+ });
1018
+ }
1019
+
883
1020
  async function fetchCreateOrgFullScan(packagePaths, orgSlug, config, options) {
884
1021
  const {
885
1022
  branchName,
@@ -1857,6 +1994,23 @@ async function execGradleWithSpinner(bin, commandArgs, cwd) {
1857
1994
  }
1858
1995
  }
1859
1996
 
1997
+ // Walk up from a pom path to find a `target` directory ancestor and return
1998
+ // its parent (the project root). Returns undefined if no `target` ancestor
1999
+ // is found, which means we cannot safely lift the file out of the ignored
2000
+ // build dir.
2001
+ function findProjectRootAboveTarget(pomPath) {
2002
+ let dir = path.dirname(pomPath);
2003
+ const {
2004
+ root
2005
+ } = path.parse(dir);
2006
+ while (dir !== root) {
2007
+ if (path.basename(dir) === 'target') {
2008
+ return path.dirname(dir);
2009
+ }
2010
+ dir = path.dirname(dir);
2011
+ }
2012
+ return undefined;
2013
+ }
1860
2014
  async function convertSbtToMaven({
1861
2015
  bin,
1862
2016
  cwd,
@@ -1933,18 +2087,43 @@ async function convertSbtToMaven({
1933
2087
  logger.logger.info('Exiting now...');
1934
2088
  return;
1935
2089
  } else {
1936
- // if (verbose) {
1937
- // logger.log(
1938
- // `Moving manifest file from \`${loc.replace(/^\/home\/[^/]*?\//, '~/')}\` to \`${out}\``
1939
- // )
1940
- // } else {
1941
- // logger.log('Moving output pom file')
1942
- // }
1943
- // TODO: Do we prefer fs-extra? Renaming can be gnarly on windows and fs-extra's version is better.
1944
- // await renamep(loc, out)
1945
- logger.logger.success(`Generated ${poms.length} pom files`);
1946
- poms.forEach(fn => logger.logger.log('-', fn));
1947
- logger.logger.success(`OK`);
2090
+ // sbt writes poms inside each project's `target/` directory, which is
2091
+ // typically gitignored. Copy them out to a sibling of `target/` so
2092
+ // downstream SBOM/scan steps see them.
2093
+ const copied = [];
2094
+ const outBasename = path.basename(out) || 'pom.xml';
2095
+ for (const pomPath of poms) {
2096
+ let destPath;
2097
+ if (poms.length === 1 && out !== outBasename) {
2098
+ // Honor the full `--out` path verbatim when exactly one pom was
2099
+ // produced and the user (or default) supplied a path, not just a
2100
+ // bare filename.
2101
+ destPath = path.resolve(cwd, out);
2102
+ } else {
2103
+ const projectRoot = findProjectRootAboveTarget(pomPath);
2104
+ if (!projectRoot) {
2105
+ logger.logger.warn(`Could not locate \`target/\` ancestor for \`${pomPath}\`, leaving in place`);
2106
+ continue;
2107
+ }
2108
+ destPath = path.join(projectRoot, outBasename);
2109
+ }
2110
+ try {
2111
+ // eslint-disable-next-line no-await-in-loop
2112
+ await fs$1.promises.mkdir(path.dirname(destPath), {
2113
+ recursive: true
2114
+ });
2115
+ // eslint-disable-next-line no-await-in-loop
2116
+ await fs$1.promises.copyFile(pomPath, destPath);
2117
+ copied.push(destPath);
2118
+ } catch (e) {
2119
+ logger.logger.warn(`Failed to copy \`${pomPath}\` to \`${destPath}\`: ${utils.getErrorCause(e)}`);
2120
+ }
2121
+ }
2122
+ logger.logger.success(`Generated ${copied.length} pom file${copied.length === 1 ? '' : 's'}`);
2123
+ logger.logger.log('Reported exports:');
2124
+ for (const fn of copied) {
2125
+ logger.logger.log('-', fn);
2126
+ }
1948
2127
  }
1949
2128
  } catch (e) {
1950
2129
  process.exitCode = 1;
@@ -2156,7 +2335,7 @@ async function generateAutoManifest({
2156
2335
  // Note: `sbt` is more likely to be resolved against PATH env
2157
2336
  bin: sockJson.defaults?.manifest?.sbt?.bin ?? 'sbt',
2158
2337
  cwd,
2159
- out: sockJson.defaults?.manifest?.sbt?.outfile ?? './socket.sbt.pom.xml',
2338
+ out: sockJson.defaults?.manifest?.sbt?.outfile ?? './pom.xml',
2160
2339
  sbtOpts: sockJson.defaults?.manifest?.sbt?.sbtOpts?.split(' ').map(s => s.trim()).filter(Boolean) ?? [],
2161
2340
  verbose: Boolean(sockJson.defaults?.manifest?.sbt?.verbose)
2162
2341
  });
@@ -2291,7 +2470,16 @@ async function handleCreateNewScan({
2291
2470
  // Load socket.yml to respect projectIgnorePaths when collecting files.
2292
2471
  const socketYmlResult = utils.findSocketYmlSync(cwd);
2293
2472
  const socketConfig = socketYmlResult.ok ? socketYmlResult.data?.parsed : undefined;
2473
+ const {
2474
+ additionalScaIgnores,
2475
+ mergedReachabilityOptions
2476
+ } = applyFullExcludePaths({
2477
+ cwd,
2478
+ reachabilityOptions: reach,
2479
+ target: targets[0]
2480
+ });
2294
2481
  const packagePaths = await utils.getPackageFilesForScan(targets, supportedFiles, {
2482
+ additionalIgnores: additionalScaIgnores,
2295
2483
  config: socketConfig,
2296
2484
  cwd
2297
2485
  });
@@ -2324,7 +2512,7 @@ async function handleCreateNewScan({
2324
2512
  logger.logger.info('Starting reachability analysis...');
2325
2513
  require$$9.debugFn('notice', 'Reachability analysis enabled');
2326
2514
  require$$9.debugDir('inspect', {
2327
- reachabilityOptions: reach
2515
+ reachabilityOptions: mergedReachabilityOptions
2328
2516
  });
2329
2517
  spinner.start();
2330
2518
  const reachResult = await performReachabilityAnalysis({
@@ -2332,7 +2520,7 @@ async function handleCreateNewScan({
2332
2520
  cwd,
2333
2521
  orgSlug,
2334
2522
  packagePaths,
2335
- reachabilityOptions: reach,
2523
+ reachabilityOptions: mergedReachabilityOptions,
2336
2524
  repoName,
2337
2525
  spinner,
2338
2526
  target: targets[0]
@@ -2450,6 +2638,7 @@ async function handleCi(autoManifest) {
2450
2638
  pendingHead: true,
2451
2639
  pullRequest: 0,
2452
2640
  reach: {
2641
+ excludePaths: [],
2453
2642
  reachAnalysisMemoryLimit: 0,
2454
2643
  reachAnalysisTimeout: 0,
2455
2644
  reachConcurrency: 1,
@@ -6340,8 +6529,10 @@ const config$9 = {
6340
6529
 
6341
6530
  There are some caveats with \`build.sbt\` to \`pom.xml\` conversion:
6342
6531
 
6343
- - the xml is exported as socket.pom.xml as to not confuse existing build tools
6344
- but it will first hit your /target/sbt<version> folder (as a different name)
6532
+ - the xml is exported as pom.xml at the project root so Socket scan picks
6533
+ it up; sbt itself first writes it inside your /target/sbt<version> folder
6534
+ (as a different name). Use --out to override if you already have a
6535
+ hand-authored pom.xml at the project root.
6345
6536
 
6346
6537
  - the pom.xml format (standard by Scala) does not support certain sbt features
6347
6538
  - \`excludeAll()\`, \`dependencyOverrides\`, \`force()\`, \`relativePath\`
@@ -6421,7 +6612,7 @@ async function run$A(argv, importMeta, {
6421
6612
  out = sockJson.defaults?.manifest?.sbt?.outfile;
6422
6613
  logger.logger.info(`Using default --out from ${constants.SOCKET_JSON}:`, out);
6423
6614
  } else {
6424
- out = './socket.pom.xml';
6615
+ out = './pom.xml';
6425
6616
  }
6426
6617
  }
6427
6618
  if (!sbtOpts) {
@@ -11120,7 +11311,8 @@ const reachabilityFlags = {
11120
11311
  reachExcludePaths: {
11121
11312
  type: 'string',
11122
11313
  isMultiple: true,
11123
- description: 'List of paths to exclude from reachability analysis, as either a comma separated value or as multiple flags.'
11314
+ hidden: true,
11315
+ description: 'Deprecated: use --exclude-paths instead. List of paths to exclude from reachability analysis, as either a comma separated value or as multiple flags.'
11124
11316
  },
11125
11317
  reachLazyMode: {
11126
11318
  type: 'boolean',
@@ -11139,6 +11331,13 @@ const reachabilityFlags = {
11139
11331
  description: 'When using this option, the scan is created based only on pre-generated CDX and SPDX files in your project.'
11140
11332
  }
11141
11333
  };
11334
+ const excludePathsFlag = {
11335
+ excludePaths: {
11336
+ type: 'string',
11337
+ isMultiple: true,
11338
+ description: 'List of glob patterns to exclude from the scan, including SCA/SBOM manifest discovery and (when --reach is enabled) Tier 1 reachability analysis. Patterns are anchored micromatch globs matched relative to the Socket scan root, which is the command working directory (`--cwd` if set), not the reachability target: `tests` matches only `<cwd>/tests`; use `**/tests` to match at any depth. Negation patterns (`!path`) are not supported. Accepts a comma-separated value or multiple flags.'
11339
+ }
11340
+ };
11142
11341
 
11143
11342
  async function suggestTarget() {
11144
11343
  // We could prefill this with sub-dirs of the current
@@ -11309,6 +11508,7 @@ async function run$d(argv, importMeta, {
11309
11508
  hidden: hidden$a,
11310
11509
  flags: {
11311
11510
  ...generalFlags$1,
11511
+ ...excludePathsFlag,
11312
11512
  ...reachabilityFlags
11313
11513
  },
11314
11514
  help: command => `
@@ -11319,7 +11519,10 @@ async function run$d(argv, importMeta, {
11319
11519
  ${utils.getFlagApiRequirementsOutput(`${parentName}:${CMD_NAME$a}`)}
11320
11520
 
11321
11521
  Options
11322
- ${utils.getFlagListOutput(generalFlags$1)}
11522
+ ${utils.getFlagListOutput({
11523
+ ...generalFlags$1,
11524
+ ...excludePathsFlag
11525
+ })}
11323
11526
 
11324
11527
  Reachability Options (when --reach is used)
11325
11528
  ${utils.getFlagListOutput(reachabilityFlags)}
@@ -11527,6 +11730,8 @@ async function run$d(argv, importMeta, {
11527
11730
  logger.logger.info(`You can also run \`socket scan setup\` to persist these flag defaults to a ${constants.SOCKET_JSON} file.`);
11528
11731
  logger.logger.error('');
11529
11732
  }
11733
+ const excludePaths = utils.cmdFlagValueToArray(cli.flags['excludePaths']);
11734
+ assertValidExcludePaths(excludePaths);
11530
11735
  const reachExcludePaths = utils.cmdFlagValueToArray(cli.flags['reachExcludePaths']);
11531
11736
 
11532
11737
  // Validation helpers for better readability.
@@ -11622,6 +11827,7 @@ async function run$d(argv, importMeta, {
11622
11827
  pendingHead: Boolean(pendingHead),
11623
11828
  pullRequest: Number(pullRequest),
11624
11829
  reach: {
11830
+ excludePaths,
11625
11831
  reachAnalysisMemoryLimit: Number(reachAnalysisMemoryLimit),
11626
11832
  reachAnalysisTimeout: Number(reachAnalysisTimeout),
11627
11833
  reachConcurrency: Number(reachConcurrency),
@@ -12280,6 +12486,7 @@ async function scanOneRepo(repoSlug, {
12280
12486
  pendingHead: true,
12281
12487
  pullRequest: 0,
12282
12488
  reach: {
12489
+ excludePaths: [],
12283
12490
  reachAnalysisMemoryLimit: 0,
12284
12491
  reachAnalysisTimeout: 0,
12285
12492
  reachConcurrency: 1,
@@ -13462,7 +13669,7 @@ async function handleScanReach({
13462
13669
  spinner
13463
13670
  } = constants.default;
13464
13671
 
13465
- // Get supported file names
13672
+ // Get supported file names.
13466
13673
  const supportedFilesCResult = await fetchSupportedScanFileNames({
13467
13674
  spinner
13468
13675
  });
@@ -13479,7 +13686,16 @@ async function handleScanReach({
13479
13686
  // Load socket.yml to respect projectIgnorePaths when collecting files.
13480
13687
  const socketYmlResult = utils.findSocketYmlSync(cwd);
13481
13688
  const socketConfig = socketYmlResult.ok ? socketYmlResult.data?.parsed : undefined;
13689
+ const {
13690
+ additionalScaIgnores,
13691
+ mergedReachabilityOptions
13692
+ } = applyFullExcludePaths({
13693
+ cwd,
13694
+ reachabilityOptions,
13695
+ target: targets[0]
13696
+ });
13482
13697
  const packagePaths = await utils.getPackageFilesForScan(targets, supportedFiles, {
13698
+ additionalIgnores: additionalScaIgnores,
13483
13699
  config: socketConfig,
13484
13700
  cwd
13485
13701
  });
@@ -13500,7 +13716,7 @@ async function handleScanReach({
13500
13716
  orgSlug,
13501
13717
  outputPath,
13502
13718
  packagePaths,
13503
- reachabilityOptions,
13719
+ reachabilityOptions: mergedReachabilityOptions,
13504
13720
  spinner,
13505
13721
  target: targets[0],
13506
13722
  uploadManifests: true
@@ -13549,6 +13765,7 @@ async function run$7(argv, importMeta, {
13549
13765
  hidden: hidden$4,
13550
13766
  flags: {
13551
13767
  ...generalFlags,
13768
+ ...excludePathsFlag,
13552
13769
  ...reachabilityFlags
13553
13770
  },
13554
13771
  help: command => `
@@ -13562,7 +13779,10 @@ async function run$7(argv, importMeta, {
13562
13779
  ${utils.getFlagListOutput(generalFlags)}
13563
13780
 
13564
13781
  Reachability Options
13565
- ${utils.getFlagListOutput(reachabilityFlags)}
13782
+ ${utils.getFlagListOutput({
13783
+ ...excludePathsFlag,
13784
+ ...reachabilityFlags
13785
+ })}
13566
13786
 
13567
13787
  Runs the Socket reachability analysis without creating a scan in Socket.
13568
13788
  The output is written to .socket.facts.json in the current working directory
@@ -13614,8 +13834,10 @@ async function run$7(argv, importMeta, {
13614
13834
  const dryRun = !!cli.flags['dryRun'];
13615
13835
 
13616
13836
  // Process comma-separated values for isMultiple flags.
13837
+ const excludePaths = utils.cmdFlagValueToArray(cli.flags['excludePaths']);
13617
13838
  const reachEcosystemsRaw = utils.cmdFlagValueToArray(cli.flags['reachEcosystems']);
13618
13839
  const reachExcludePaths = utils.cmdFlagValueToArray(cli.flags['reachExcludePaths']);
13840
+ assertValidExcludePaths(excludePaths);
13619
13841
 
13620
13842
  // Validate ecosystem values.
13621
13843
  const reachEcosystems = [];
@@ -13699,6 +13921,7 @@ async function run$7(argv, importMeta, {
13699
13921
  outputKind,
13700
13922
  outputPath: outputPath || '',
13701
13923
  reachabilityOptions: {
13924
+ excludePaths,
13702
13925
  reachAnalysisMemoryLimit: Number(reachAnalysisMemoryLimit),
13703
13926
  reachAnalysisTimeout: Number(reachAnalysisTimeout),
13704
13927
  reachConcurrency: Number(reachConcurrency),
@@ -15642,5 +15865,5 @@ process.on('unhandledRejection', async (reason, promise) => {
15642
15865
  // eslint-disable-next-line n/no-process-exit
15643
15866
  process.exit(1);
15644
15867
  });
15645
- //# debugId=6d796b61-8e93-4815-b8ee-24e4641dd484
15868
+ //# debugId=1acf2006-28da-49e4-9572-412f961998c4
15646
15869
  //# sourceMappingURL=cli.js.map