snyk 1.815.0 → 1.816.0

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.
@@ -4073,7 +4073,9 @@ exports.getExtraProjectCount = getExtraProjectCount;
4073
4073
  Object.defineProperty(exports, "__esModule", ({ value: true }));
4074
4074
  exports.getMultiPluginResult = void 0;
4075
4075
  const cloneDeep = __webpack_require__(83465);
4076
- const path = __webpack_require__(85622);
4076
+ const pathLib = __webpack_require__(85622);
4077
+ const sortBy = __webpack_require__(58254);
4078
+ const groupBy = __webpack_require__(20276);
4077
4079
  const cliInterface = __webpack_require__(65266);
4078
4080
  const chalk_1 = __webpack_require__(32589);
4079
4081
  const theme_1 = __webpack_require__(86988);
@@ -4083,14 +4085,21 @@ const get_single_plugin_result_1 = __webpack_require__(8598);
4083
4085
  const convert_single_splugin_res_to_multi_custom_1 = __webpack_require__(99695);
4084
4086
  const convert_multi_plugin_res_to_multi_custom_1 = __webpack_require__(23110);
4085
4087
  const errors_1 = __webpack_require__(55191);
4088
+ const yarn_workspaces_parser_1 = __webpack_require__(27326);
4086
4089
  const debug = debugModule('snyk-test');
4087
4090
  async function getMultiPluginResult(root, options, targetFiles) {
4091
+ var _a;
4088
4092
  const allResults = [];
4089
4093
  const failedResults = [];
4090
- for (const targetFile of targetFiles) {
4094
+ // process any yarn workspaces first
4095
+ // the files need to be proceeded together as they provide context to each other
4096
+ const { scannedProjects, unprocessedFiles, } = await processYarnWorkspacesProjects(root, options, targetFiles);
4097
+ allResults.push(...scannedProjects);
4098
+ // process the rest 1 by 1 sent to relevant plugins
4099
+ for (const targetFile of unprocessedFiles) {
4091
4100
  const optionsClone = cloneDeep(options);
4092
- optionsClone.file = path.relative(root, targetFile);
4093
- optionsClone.packageManager = detect_1.detectPackageManagerFromFile(path.basename(targetFile));
4101
+ optionsClone.file = pathLib.relative(root, targetFile);
4102
+ optionsClone.packageManager = detect_1.detectPackageManagerFromFile(pathLib.basename(targetFile));
4094
4103
  try {
4095
4104
  const inspectRes = await get_single_plugin_result_1.getSinglePluginResult(root, optionsClone, optionsClone.file);
4096
4105
  let resultWithScannedProjects;
@@ -4107,14 +4116,15 @@ async function getMultiPluginResult(root, options, targetFiles) {
4107
4116
  options.projectNames = resultWithScannedProjects.scannedProjects.map((scannedProject) => { var _a; return (_a = scannedProject === null || scannedProject === void 0 ? void 0 : scannedProject.depTree) === null || _a === void 0 ? void 0 : _a.name; });
4108
4117
  allResults.push(...pluginResultWithCustomScannedProjects.scannedProjects);
4109
4118
  }
4110
- catch (err) {
4119
+ catch (error) {
4120
+ const errMessage = (_a = error.message) !== null && _a !== void 0 ? _a : 'Something went wrong getting dependencies';
4111
4121
  // TODO: propagate this all the way back and include in --json output
4112
4122
  failedResults.push({
4113
4123
  targetFile,
4114
- error: err,
4115
- errMessage: err.message || 'Something went wrong getting dependencies',
4124
+ error,
4125
+ errMessage: errMessage,
4116
4126
  });
4117
- debug(chalk_1.default.bold.red(`\n${theme_1.icon.ISSUE} Failed to get dependencies for ${targetFile}\nERROR: ${err.message}\n`));
4127
+ debug(chalk_1.default.bold.red(`\n${theme_1.icon.ISSUE} Failed to get dependencies for ${targetFile}\nERROR: ${errMessage}\n`));
4118
4128
  }
4119
4129
  }
4120
4130
  if (!allResults.length) {
@@ -4129,6 +4139,44 @@ async function getMultiPluginResult(root, options, targetFiles) {
4129
4139
  };
4130
4140
  }
4131
4141
  exports.getMultiPluginResult = getMultiPluginResult;
4142
+ async function processYarnWorkspacesProjects(root, options, targetFiles) {
4143
+ try {
4144
+ const { scannedProjects } = await yarn_workspaces_parser_1.processYarnWorkspaces(root, {
4145
+ strictOutOfSync: options.strictOutOfSync,
4146
+ dev: options.dev,
4147
+ }, targetFiles);
4148
+ const unprocessedFiles = filterOutProcessedWorkspaces(scannedProjects, targetFiles);
4149
+ return { scannedProjects, unprocessedFiles };
4150
+ }
4151
+ catch (e) {
4152
+ debug('Error during detecting or processing Yarn Workspaces: ', e);
4153
+ return { scannedProjects: [], unprocessedFiles: targetFiles };
4154
+ }
4155
+ }
4156
+ function filterOutProcessedWorkspaces(scannedProjects, allTargetFiles) {
4157
+ const mapped = allTargetFiles.map((p) => ({ path: p, ...pathLib.parse(p) }));
4158
+ const sorted = sortBy(mapped, 'dir');
4159
+ const targetFilesByDirectory = groupBy(sorted, 'dir');
4160
+ const scanned = scannedProjects.map((p) => p.targetFile);
4161
+ const targetFiles = [];
4162
+ for (const directory of Object.keys(targetFilesByDirectory)) {
4163
+ for (const targetFile of targetFilesByDirectory[directory]) {
4164
+ const { base, path } = targetFile;
4165
+ // any non yarn workspace files should be scanned
4166
+ if (!['package.json', 'yarn.lock'].includes(base)) {
4167
+ targetFiles.push(path);
4168
+ continue;
4169
+ }
4170
+ // check if Node manifest has already been processed a part or a workspace
4171
+ const packageJsonFileName = pathLib.join(directory, 'package.json');
4172
+ const alreadyScanned = scanned.some((f) => packageJsonFileName.endsWith(f));
4173
+ if (!alreadyScanned) {
4174
+ targetFiles.push(path);
4175
+ }
4176
+ }
4177
+ }
4178
+ return targetFiles;
4179
+ }
4132
4180
 
4133
4181
 
4134
4182
  /***/ }),
@@ -4400,25 +4448,24 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
4400
4448
  exports.packageJsonBelongsToWorkspace = exports.getWorkspacesMap = exports.processYarnWorkspaces = void 0;
4401
4449
  const baseDebug = __webpack_require__(15158);
4402
4450
  const pathUtil = __webpack_require__(85622);
4403
- // import * as _ from 'lodash';
4404
4451
  const sortBy = __webpack_require__(58254);
4405
4452
  const groupBy = __webpack_require__(20276);
4406
4453
  const micromatch = __webpack_require__(70850);
4407
4454
  const debug = baseDebug('snyk-yarn-workspaces');
4408
4455
  const lockFileParser = __webpack_require__(423);
4409
- const errors_1 = __webpack_require__(55191);
4410
4456
  const get_file_contents_1 = __webpack_require__(84210);
4457
+ const errors_1 = __webpack_require__(55191);
4411
4458
  async function processYarnWorkspaces(root, settings, targetFiles) {
4412
4459
  // the order of yarnTargetFiles folders is important
4413
4460
  // must have the root level most folders at the top
4414
4461
  const mappedAndFiltered = targetFiles
4415
4462
  .map((p) => ({ path: p, ...pathUtil.parse(p) }))
4416
- .filter((res) => ['package.json'].includes(res.base));
4463
+ .filter((res) => ['package.json', 'yarn.lock'].includes(res.base));
4417
4464
  const sorted = sortBy(mappedAndFiltered, 'dir');
4418
4465
  const grouped = groupBy(sorted, 'dir');
4419
4466
  const yarnTargetFiles = grouped;
4420
4467
  debug(`Processing potential Yarn workspaces (${targetFiles.length})`);
4421
- if (Object.keys(yarnTargetFiles).length === 0) {
4468
+ if (settings.yarnWorkspaces && Object.keys(yarnTargetFiles).length === 0) {
4422
4469
  throw errors_1.NoSupportedManifestsFoundError([root]);
4423
4470
  }
4424
4471
  let yarnWorkspacesMap = {};
@@ -4433,6 +4480,7 @@ async function processYarnWorkspaces(root, settings, targetFiles) {
4433
4480
  let rootWorkspaceManifestContent = {};
4434
4481
  // the folders must be ordered highest first
4435
4482
  for (const directory of Object.keys(yarnTargetFiles)) {
4483
+ debug(`Processing ${directory} as a potential Yarn workspace`);
4436
4484
  let isYarnWorkspacePackage = false;
4437
4485
  let isRootPackageJson = false;
4438
4486
  const packageJsonFileName = pathUtil.join(directory, 'package.json');
@@ -4455,7 +4503,11 @@ async function processYarnWorkspaces(root, settings, targetFiles) {
4455
4503
  rootWorkspaceManifestContent = JSON.parse(packageJson.content);
4456
4504
  }
4457
4505
  }
4458
- if (isYarnWorkspacePackage || isRootPackageJson) {
4506
+ if (!(isYarnWorkspacePackage || isRootPackageJson)) {
4507
+ debug(`${packageJsonFileName} is not part of any detected workspace, skipping`);
4508
+ continue;
4509
+ }
4510
+ try {
4459
4511
  const rootDir = isYarnWorkspacePackage
4460
4512
  ? pathUtil.dirname(yarnWorkspacesFilesMap[packageJsonFileName].root)
4461
4513
  : pathUtil.dirname(packageJsonFileName);
@@ -4482,8 +4534,11 @@ async function processYarnWorkspaces(root, settings, targetFiles) {
4482
4534
  };
4483
4535
  result.scannedProjects.push(project);
4484
4536
  }
4485
- else {
4486
- debug(`${packageJsonFileName} is not part of any detected workspace, skipping`);
4537
+ catch (e) {
4538
+ if (settings.yarnWorkspaces) {
4539
+ throw e;
4540
+ }
4541
+ debug(`Error process workspace: ${packageJsonFileName}. ERROR: ${e}`);
4487
4542
  }
4488
4543
  }
4489
4544
  if (!result.scannedProjects.length) {
@@ -6566,7 +6621,7 @@ async function assembleLocalPayloads(root, options) {
6566
6621
  }
6567
6622
  debug('getDepsFromPlugin returned failed results, cannot run test/monitor', failedResults);
6568
6623
  if (options['fail-fast']) {
6569
- throw new errors_1.FailedToRunTestError('Your test request could not be completed. Please email support@snyk.io');
6624
+ throw new errors_1.FailedToRunTestError(errors_1.errorMessageWithRetry('Your test request could not be completed.'));
6570
6625
  }
6571
6626
  }
6572
6627
  analytics.add('pluginName', deps.plugin.name);