12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816 |
- "use strict";
- exports.id = 741;
- exports.ids = [741];
- exports.modules = {
- /***/ 80423:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.convertLegacyTestResultToNew = void 0;
- function convertVulnerabilities(vulns) {
- const issuesData = {};
- const issues = [];
- vulns.forEach((vuln) => {
- issuesData[vuln.id] = {
- id: vuln.id,
- severity: vuln.severity,
- title: vuln.title,
- };
- issues.push({
- pkgName: vuln.packageName,
- pkgVersion: vuln.version,
- issueId: vuln.id,
- // TODO: add fixInfo when needed
- fixInfo: {},
- });
- });
- return { issuesData, issues };
- }
- function convertLegacyTestResultToNew(testResult) {
- const { issues, issuesData } = convertVulnerabilities(testResult.vulnerabilities);
- return {
- issuesData,
- issues,
- remediation: testResult.remediation,
- // TODO: grab this once Ecosystems flow starts sending back ScanResult
- depGraphData: {},
- };
- }
- exports.convertLegacyTestResultToNew = convertLegacyTestResultToNew;
- /***/ }),
- /***/ 16898:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.convertLegacyTestResultToScanResult = void 0;
- function convertLegacyTestResultToScanResult(testResult) {
- if (!testResult.packageManager) {
- throw new Error('Only results with packageManagers are supported for conversion');
- }
- return {
- identity: {
- type: testResult.packageManager,
- // this is because not all plugins send it back today, but we should always have it
- targetFile: testResult.targetFile || testResult.displayTargetFile,
- },
- name: testResult.projectName,
- // TODO: grab this once Ecosystems flow starts sending back ScanResult
- facts: [],
- policy: testResult.policy,
- // TODO: grab this once Ecosystems flow starts sending back ScanResult
- target: {},
- };
- }
- exports.convertLegacyTestResultToScanResult = convertLegacyTestResultToScanResult;
- /***/ }),
- /***/ 92730:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.convertLegacyTestResultToFixEntities = void 0;
- const fs = __webpack_require__(35747);
- const pathLib = __webpack_require__(85622);
- const convert_legacy_test_result_to_new_1 = __webpack_require__(80423);
- const convert_legacy_test_result_to_scan_result_1 = __webpack_require__(16898);
- function convertLegacyTestResultToFixEntities(testResults, root, options) {
- if (testResults instanceof Error) {
- return [];
- }
- const oldResults = Array.isArray(testResults) ? testResults : [testResults];
- return oldResults.map((res) => ({
- options,
- workspace: {
- path: root,
- readFile: async (path) => {
- return fs.readFileSync(pathLib.resolve(root, path), 'utf8');
- },
- writeFile: async (path, content) => {
- return fs.writeFileSync(pathLib.resolve(root, path), content, 'utf8');
- },
- },
- scanResult: convert_legacy_test_result_to_scan_result_1.convertLegacyTestResultToScanResult(res),
- testResult: convert_legacy_test_result_to_new_1.convertLegacyTestResultToNew(res),
- }));
- }
- exports.convertLegacyTestResultToFixEntities = convertLegacyTestResultToFixEntities;
- /***/ }),
- /***/ 79898:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.getDisplayPath = void 0;
- const pathLib = __webpack_require__(85622);
- const detect_1 = __webpack_require__(45318);
- function getDisplayPath(path) {
- if (!detect_1.isLocalFolder(path)) {
- return path;
- }
- if (path === process.cwd()) {
- return pathLib.parse(path).name;
- }
- return pathLib.relative(process.cwd(), path);
- }
- exports.getDisplayPath = getDisplayPath;
- /***/ }),
- /***/ 73741:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- const Debug = __webpack_require__(15158);
- const snykFix = __webpack_require__(53776);
- const ora = __webpack_require__(63395);
- const snyk = __webpack_require__(9146);
- const analytics = __webpack_require__(82744);
- const convert_legacy_tests_results_to_fix_entities_1 = __webpack_require__(92730);
- const format_test_error_1 = __webpack_require__(68214);
- const process_command_args_1 = __webpack_require__(52369);
- const validate_credentials_1 = __webpack_require__(4593);
- const validate_test_options_1 = __webpack_require__(83476);
- const set_default_test_options_1 = __webpack_require__(13285);
- const validate_fix_command_is_supported_1 = __webpack_require__(16117);
- const get_display_path_1 = __webpack_require__(79898);
- const chalk_1 = __webpack_require__(32589);
- const theme_1 = __webpack_require__(86988);
- const check_paths_1 = __webpack_require__(94501);
- const debug = Debug('snyk-fix');
- const snykFixFeatureFlag = 'cliSnykFix';
- async function fix(...args) {
- const { options: rawOptions, paths } = await process_command_args_1.processCommandArgs(...args);
- const options = set_default_test_options_1.setDefaultTestOptions(rawOptions);
- debug(options);
- await validate_fix_command_is_supported_1.validateFixCommandIsSupported(options);
- if (!options.docker) {
- check_paths_1.checkOSSPaths(paths, rawOptions);
- }
- validate_test_options_1.validateTestOptions(options);
- validate_credentials_1.validateCredentials(options);
- const results = [];
- results.push(...(await runSnykTestLegacy(options, paths)));
- // fix
- debug(`Organization has ${snykFixFeatureFlag} feature flag enabled for experimental Snyk fix functionality`);
- const vulnerableResults = results.filter((res) => Object.keys(res.testResult.issues).length);
- const { dryRun, quiet, sequential: sequentialFix } = options;
- const { fixSummary, meta, results: resultsByPlugin } = await snykFix.fix(results, {
- dryRun,
- quiet,
- sequentialFix,
- });
- setSnykFixAnalytics(fixSummary, meta, results, resultsByPlugin, vulnerableResults);
- // `snyk test` did not return any test results
- if (results.length === 0) {
- throw new Error(fixSummary);
- }
- // `snyk test` returned no vulnerable results, so nothing to fix
- if (vulnerableResults.length === 0) {
- return fixSummary;
- }
- // `snyk test` returned vulnerable results
- // however some errors occurred during `snyk fix` and nothing was fixed in the end
- const anyFailed = meta.failed > 0;
- const noneFixed = meta.fixed === 0;
- if (anyFailed && noneFixed) {
- throw new Error(fixSummary);
- }
- return fixSummary;
- }
- exports.default = fix;
- /* @deprecated
- * TODO: once project envelope is default all code below will be deleted
- * we should be calling test via new Ecosystems instead
- */
- async function runSnykTestLegacy(options, paths) {
- const results = [];
- const stdOutSpinner = ora({
- isSilent: options.quiet,
- stream: process.stdout,
- });
- const stdErrSpinner = ora({
- isSilent: options.quiet,
- stream: process.stdout,
- });
- stdErrSpinner.start();
- stdOutSpinner.start();
- for (const path of paths) {
- let displayPath = path;
- const spinnerMessage = `Running \`snyk test\` for ${displayPath}`;
- try {
- displayPath = get_display_path_1.getDisplayPath(path);
- stdOutSpinner.text = spinnerMessage;
- stdOutSpinner.render();
- // Create a copy of the options so a specific test can
- // modify them i.e. add `options.file` etc. We'll need
- // these options later.
- const snykTestOptions = {
- ...options,
- path,
- projectName: options['project-name'],
- };
- const testResults = [];
- const testResultForPath = await snyk.test(path, { ...snykTestOptions, quiet: true });
- testResults.push(...(Array.isArray(testResultForPath)
- ? testResultForPath
- : [testResultForPath]));
- const newRes = convert_legacy_tests_results_to_fix_entities_1.convertLegacyTestResultToFixEntities(testResults, path, options);
- results.push(...newRes);
- stdOutSpinner.stopAndPersist({
- text: spinnerMessage,
- symbol: `\n${theme_1.icon.RUN}`,
- });
- }
- catch (error) {
- const testError = format_test_error_1.formatTestError(error);
- const userMessage = theme_1.color.status.error(`Failed! ${testError.message}.`) +
- `\n Tip: run \`snyk test ${displayPath} -d\` for more information.`;
- stdOutSpinner.stopAndPersist({
- text: spinnerMessage,
- symbol: `\n${theme_1.icon.RUN}`,
- });
- stdErrSpinner.stopAndPersist({
- text: userMessage,
- symbol: chalk_1.default.red(' '),
- });
- debug(userMessage);
- }
- }
- stdOutSpinner.stop();
- stdErrSpinner.stop();
- return results;
- }
- function setSnykFixAnalytics(fixSummary, meta, snykTestResponses, resultsByPlugin, vulnerableResults) {
- // Analytics # of projects
- analytics.add('snykFixFailedProjects', meta.failed);
- analytics.add('snykFixFixedProjects', meta.fixed);
- analytics.add('snykFixTotalProjects', snykTestResponses.length);
- analytics.add('snykFixVulnerableProjects', vulnerableResults.length);
- // Analytics # of issues
- analytics.add('snykFixFixableIssues', meta.fixableIssues);
- analytics.add('snykFixFixedIssues', meta.fixedIssues);
- analytics.add('snykFixTotalIssues', meta.totalIssues);
- analytics.add('snykFixSummary', fixSummary);
- // Analytics for errors
- for (const plugin of Object.keys(resultsByPlugin)) {
- const errors = [];
- const failedToFix = resultsByPlugin[plugin].failed;
- for (const failed of failedToFix) {
- if ('error' in failed) {
- errors.push(failed.error.message);
- }
- if ('changes' in failed) {
- errors.push(...failed.changes.map((f) => JSON.stringify(f)));
- }
- }
- analytics.add('snykFixErrors', { [plugin]: errors });
- }
- }
- /***/ }),
- /***/ 16117:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.validateFixCommandIsSupported = void 0;
- const Debug = __webpack_require__(15158);
- const ecosystems_1 = __webpack_require__(5168);
- const feature_flags_1 = __webpack_require__(63011);
- const not_supported_by_ecosystem_1 = __webpack_require__(72571);
- const errors_1 = __webpack_require__(55191);
- const chalk_1 = __webpack_require__(32589);
- const debug = Debug('snyk-fix');
- const snykFixFeatureFlag = 'cliSnykFix';
- async function validateFixCommandIsSupported(options) {
- if (options.docker) {
- throw new not_supported_by_ecosystem_1.FeatureNotSupportedByEcosystemError('snyk fix', 'docker');
- }
- const ecosystem = ecosystems_1.getEcosystemForTest(options);
- if (ecosystem) {
- throw new not_supported_by_ecosystem_1.FeatureNotSupportedByEcosystemError('snyk fix', ecosystem);
- }
- const snykFixSupported = await feature_flags_1.isFeatureFlagSupportedForOrg(snykFixFeatureFlag, options.org);
- debug('Feature flag check returned: ', snykFixSupported);
- if (snykFixSupported.code === 401 || snykFixSupported.code === 403) {
- throw errors_1.AuthFailedError(snykFixSupported.error, snykFixSupported.code);
- }
- if (!snykFixSupported.ok) {
- const snykFixErrorMessage = chalk_1.default.red(`\`snyk fix\` is not supported${options.org ? ` for org '${options.org}'` : ''}.`) +
- '\nSee documentation on how to enable this beta feature: https://docs.snyk.io/snyk-cli/fix-vulnerabilities-from-the-cli/automatic-remediation-with-snyk-fix#enabling-snyk-fix';
- const unsupportedError = new Error(snykFixErrorMessage);
- throw unsupportedError;
- }
- return true;
- }
- exports.validateFixCommandIsSupported = validateFixCommandIsSupported;
- /***/ }),
- /***/ 68214:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.formatTestError = void 0;
- function formatTestError(error) {
- // Possible error cases:
- // - the test found some vulns. `error.message` is a
- // JSON-stringified
- // test result.
- // - the flow failed, `error` is a real Error object.
- // - the flow failed, `error` is a number or string
- // describing the problem.
- //
- // To standardise this, make sure we use the best _object_ to
- // describe the error.
- let errorResponse;
- if (error instanceof Error) {
- errorResponse = error;
- }
- else if (typeof error !== 'object') {
- errorResponse = new Error(error);
- }
- else {
- try {
- errorResponse = JSON.parse(error.message);
- }
- catch (unused) {
- errorResponse = error;
- }
- }
- return errorResponse;
- }
- exports.formatTestError = formatTestError;
- /***/ }),
- /***/ 13285:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.setDefaultTestOptions = void 0;
- const config_1 = __webpack_require__(25425);
- function setDefaultTestOptions(options) {
- const svpSupplied = (options['show-vulnerable-paths'] || '')
- .toString()
- .toLowerCase();
- delete options['show-vulnerable-paths'];
- return {
- ...options,
- // org fallback to config unless specified
- org: options.org || config_1.default.org,
- // making `show-vulnerable-paths` 'some' by default.
- showVulnPaths: showVulnPathsMapping[svpSupplied] || 'some',
- };
- }
- exports.setDefaultTestOptions = setDefaultTestOptions;
- const showVulnPathsMapping = {
- false: 'none',
- none: 'none',
- true: 'some',
- some: 'some',
- all: 'all',
- };
- /***/ }),
- /***/ 4593:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.validateCredentials = void 0;
- const api_token_1 = __webpack_require__(95181);
- function validateCredentials(options) {
- try {
- api_token_1.apiTokenExists();
- }
- catch (err) {
- if (api_token_1.getOAuthToken()) {
- return;
- }
- else if (options.docker && api_token_1.getDockerToken()) {
- options.testDepGraphDockerEndpoint = '/docker-jwt/test-dependencies';
- options.isDockerUser = true;
- }
- else {
- throw err;
- }
- }
- }
- exports.validateCredentials = validateCredentials;
- /***/ }),
- /***/ 83476:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.validateTestOptions = void 0;
- const theme_1 = __webpack_require__(86988);
- const common_1 = __webpack_require__(53110);
- const fail_on_error_ts_1 = __webpack_require__(18195);
- function validateTestOptions(options) {
- if (options.severityThreshold &&
- !validateSeverityThreshold(options.severityThreshold)) {
- throw new Error('INVALID_SEVERITY_THRESHOLD');
- }
- if (options.failOn && !validateFailOn(options.failOn)) {
- const error = new fail_on_error_ts_1.FailOnError();
- throw theme_1.color.status.error(error.message);
- }
- }
- exports.validateTestOptions = validateTestOptions;
- function validateSeverityThreshold(severityThreshold) {
- return common_1.SEVERITIES.map((s) => s.verboseName).indexOf(severityThreshold) > -1;
- }
- function validateFailOn(arg) {
- return Object.keys(common_1.FAIL_ON).includes(arg);
- }
- /***/ }),
- /***/ 18195:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.FailOnError = void 0;
- const custom_error_1 = __webpack_require__(17188);
- const common_1 = __webpack_require__(53110);
- class FailOnError extends custom_error_1.CustomError {
- constructor() {
- super(FailOnError.ERROR_MESSAGE);
- }
- }
- exports.FailOnError = FailOnError;
- FailOnError.ERROR_MESSAGE = 'Invalid fail on argument, please use one of: ' +
- Object.keys(common_1.FAIL_ON).join(' | ');
- /***/ }),
- /***/ 72571:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.FeatureNotSupportedByEcosystemError = void 0;
- const custom_error_1 = __webpack_require__(17188);
- class FeatureNotSupportedByEcosystemError extends custom_error_1.CustomError {
- constructor(feature, ecosystem) {
- super(`Unsupported ecosystem ${ecosystem} for ${feature}.`);
- this.code = 422;
- this.feature = feature;
- this.userMessage = `\`${feature}\` is not supported for ecosystem '${ecosystem}'`;
- }
- }
- exports.FeatureNotSupportedByEcosystemError = FeatureNotSupportedByEcosystemError;
- /***/ }),
- /***/ 63011:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.hasFeatureFlag = exports.isFeatureFlagSupportedForOrg = void 0;
- const request_1 = __webpack_require__(52050);
- const api_token_1 = __webpack_require__(95181);
- const config_1 = __webpack_require__(25425);
- const common_1 = __webpack_require__(53110);
- const errors_1 = __webpack_require__(55191);
- async function isFeatureFlagSupportedForOrg(featureFlag, org) {
- const response = await request_1.makeRequest({
- method: 'GET',
- headers: {
- Authorization: api_token_1.getAuthHeader(),
- },
- qs: common_1.assembleQueryString({ org }),
- url: `${config_1.default.API}/cli-config/feature-flags/${featureFlag}`,
- gzip: true,
- json: true,
- });
- return response.body;
- }
- exports.isFeatureFlagSupportedForOrg = isFeatureFlagSupportedForOrg;
- async function hasFeatureFlag(featureFlag, options) {
- const { code, error, ok } = await isFeatureFlagSupportedForOrg(featureFlag, options.org);
- if (code === 401 || code === 403) {
- throw errors_1.AuthFailedError(error, code);
- }
- return ok;
- }
- exports.hasFeatureFlag = hasFeatureFlag;
- /***/ }),
- /***/ 53776:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.extractMeta = exports.groupEntitiesPerScanType = exports.fix = void 0;
- const debugLib = __webpack_require__(15158);
- const pMap = __webpack_require__(54270);
- const ora = __webpack_require__(63395);
- const chalk = __webpack_require__(98250);
- const outputFormatter = __webpack_require__(70962);
- const load_plugin_1 = __webpack_require__(65090);
- const partition_by_vulnerable_1 = __webpack_require__(24957);
- const error_to_user_message_1 = __webpack_require__(5258);
- const total_issues_count_1 = __webpack_require__(41160);
- const fixable_issues_1 = __webpack_require__(86635);
- const debug = debugLib('snyk-fix:main');
- async function fix(entities, options = {
- dryRun: false,
- quiet: false,
- stripAnsi: false,
- }) {
- debug('Running snyk fix with options:', options);
- const spinner = ora({ isSilent: options.quiet, stream: process.stdout });
- let resultsByPlugin = {};
- const { vulnerable, notVulnerable: nothingToFix, } = await partition_by_vulnerable_1.partitionByVulnerable(entities);
- const entitiesPerType = groupEntitiesPerScanType(vulnerable);
- const exceptions = {};
- await pMap(Object.keys(entitiesPerType), async (scanType) => {
- try {
- const fixPlugin = load_plugin_1.loadPlugin(scanType);
- const results = await fixPlugin(entitiesPerType[scanType], options);
- resultsByPlugin = { ...resultsByPlugin, ...results };
- }
- catch (e) {
- debug(`Failed to processes ${scanType}`, e);
- exceptions[scanType] = {
- originals: entitiesPerType[scanType],
- userMessage: error_to_user_message_1.convertErrorToUserMessage(e),
- };
- }
- }, {
- concurrency: 3,
- });
- const fixSummary = await outputFormatter.showResultsSummary(nothingToFix, resultsByPlugin, exceptions, options, entities.length);
- const meta = extractMeta(resultsByPlugin, exceptions);
- spinner.start();
- if (meta.fixed > 0) {
- spinner.stopAndPersist({
- text: 'Done',
- symbol: chalk.green('✔'),
- });
- }
- else {
- spinner.stop();
- }
- return {
- results: resultsByPlugin,
- exceptions,
- fixSummary,
- meta,
- };
- }
- exports.fix = fix;
- function groupEntitiesPerScanType(entities) {
- var _a, _b, _c;
- const entitiesPerType = {};
- for (const entity of entities) {
- // TODO: group all node
- const type = (_c = (_b = (_a = entity.scanResult) === null || _a === void 0 ? void 0 : _a.identity) === null || _b === void 0 ? void 0 : _b.type) !== null && _c !== void 0 ? _c : 'missing-type';
- if (entitiesPerType[type]) {
- entitiesPerType[type].push(entity);
- continue;
- }
- entitiesPerType[type] = [entity];
- }
- return entitiesPerType;
- }
- exports.groupEntitiesPerScanType = groupEntitiesPerScanType;
- function extractMeta(resultsByPlugin, exceptions) {
- const testResults = outputFormatter.getTestResults(resultsByPlugin, exceptions);
- const issueData = testResults.map((i) => i.issuesData);
- const failed = outputFormatter.calculateFailed(resultsByPlugin, exceptions);
- const fixed = outputFormatter.calculateFixed(resultsByPlugin);
- const totalIssueCount = total_issues_count_1.getTotalIssueCount(issueData);
- const { count: fixableCount } = fixable_issues_1.hasFixableIssues(testResults);
- const fixedIssueCount = outputFormatter.calculateFixedIssues(resultsByPlugin);
- return {
- fixed,
- failed,
- totalIssues: totalIssueCount,
- fixableIssues: fixableCount,
- fixedIssues: fixedIssueCount,
- };
- }
- exports.extractMeta = extractMeta;
- //# sourceMappingURL=index.js.map
- /***/ }),
- /***/ 72353:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.CommandFailedError = void 0;
- const custom_error_1 = __webpack_require__(33129);
- class CommandFailedError extends custom_error_1.CustomError {
- constructor(customMessage, command) {
- super(customMessage, custom_error_1.ERROR_CODES.CommandFailed);
- this.command = command;
- }
- }
- exports.CommandFailedError = CommandFailedError;
- //# sourceMappingURL=command-failed-to-run-error.js.map
- /***/ }),
- /***/ 75391:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.contactSupportMessage = exports.reTryMessage = void 0;
- exports.reTryMessage = 'Tip: Re-run in debug mode to see more information: DEBUG=*snyk* <COMMAND>';
- exports.contactSupportMessage = 'If the issue persists contact support@snyk.io';
- //# sourceMappingURL=common.js.map
- /***/ }),
- /***/ 33129:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.ERROR_CODES = exports.CustomError = void 0;
- class CustomError extends Error {
- constructor(message, errorCode) {
- super(message);
- this.name = this.constructor.name;
- this.innerError = undefined;
- this.errorCode = errorCode;
- }
- }
- exports.CustomError = CustomError;
- var ERROR_CODES;
- (function (ERROR_CODES) {
- ERROR_CODES["UnsupportedTypeError"] = "G10";
- ERROR_CODES["MissingRemediationData"] = "G11";
- ERROR_CODES["MissingFileName"] = "G12";
- ERROR_CODES["FailedToParseManifest"] = "G13";
- ERROR_CODES["CommandFailed"] = "G14";
- ERROR_CODES["NoFixesCouldBeApplied"] = "G15";
- })(ERROR_CODES = exports.ERROR_CODES || (exports.ERROR_CODES = {}));
- //# sourceMappingURL=custom-error.js.map
- /***/ }),
- /***/ 5258:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.convertErrorToUserMessage = void 0;
- const unsupported_type_error_1 = __webpack_require__(90361);
- function convertErrorToUserMessage(error) {
- if (error instanceof unsupported_type_error_1.UnsupportedTypeError) {
- return `${error.scanType} is not supported.`;
- }
- return error.message;
- }
- exports.convertErrorToUserMessage = convertErrorToUserMessage;
- //# sourceMappingURL=error-to-user-message.js.map
- /***/ }),
- /***/ 84657:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.FailedToParseManifest = void 0;
- const custom_error_1 = __webpack_require__(33129);
- class FailedToParseManifest extends custom_error_1.CustomError {
- constructor() {
- super('Failed to parse manifest', custom_error_1.ERROR_CODES.FailedToParseManifest);
- }
- }
- exports.FailedToParseManifest = FailedToParseManifest;
- //# sourceMappingURL=failed-to-parse-manifest.js.map
- /***/ }),
- /***/ 86920:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.MissingFileNameError = void 0;
- const custom_error_1 = __webpack_require__(33129);
- class MissingFileNameError extends custom_error_1.CustomError {
- constructor() {
- super('Filename is missing from test result', custom_error_1.ERROR_CODES.MissingFileName);
- }
- }
- exports.MissingFileNameError = MissingFileNameError;
- //# sourceMappingURL=missing-file-name.js.map
- /***/ }),
- /***/ 95084:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.MissingRemediationDataError = void 0;
- const custom_error_1 = __webpack_require__(33129);
- class MissingRemediationDataError extends custom_error_1.CustomError {
- constructor() {
- super('Remediation data is required to apply fixes', custom_error_1.ERROR_CODES.MissingRemediationData);
- }
- }
- exports.MissingRemediationDataError = MissingRemediationDataError;
- //# sourceMappingURL=missing-remediation-data.js.map
- /***/ }),
- /***/ 80799:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.NoFixesCouldBeAppliedError = void 0;
- const custom_error_1 = __webpack_require__(33129);
- class NoFixesCouldBeAppliedError extends custom_error_1.CustomError {
- constructor(message, tip) {
- super(message || 'No fixes could be applied', custom_error_1.ERROR_CODES.NoFixesCouldBeApplied);
- this.tip = tip;
- }
- }
- exports.NoFixesCouldBeAppliedError = NoFixesCouldBeAppliedError;
- //# sourceMappingURL=no-fixes-applied.js.map
- /***/ }),
- /***/ 90361:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.UnsupportedTypeError = void 0;
- const custom_error_1 = __webpack_require__(33129);
- class UnsupportedTypeError extends custom_error_1.CustomError {
- constructor(scanType) {
- super('Provided scan type is not supported', custom_error_1.ERROR_CODES.UnsupportedTypeError);
- this.scanType = scanType;
- }
- }
- exports.UnsupportedTypeError = UnsupportedTypeError;
- //# sourceMappingURL=unsupported-type-error.js.map
- /***/ }),
- /***/ 86635:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.hasFixableIssues = void 0;
- function hasFixableIssues(results) {
- let hasFixes = false;
- let count = 0;
- for (const result of Object.values(results)) {
- const { remediation } = result;
- if (remediation) {
- const { upgrade, pin, patch } = remediation;
- const upgrades = Object.keys(upgrade);
- const pins = Object.keys(pin);
- if (pins.length || upgrades.length) {
- hasFixes = true;
- // pins & upgrades are mutually exclusive
- count += getUpgradableIssues(pins.length ? pin : upgrade);
- }
- const patches = Object.keys(patch);
- if (patches.length) {
- hasFixes = true;
- count += patches.length;
- }
- }
- }
- return {
- hasFixes,
- count,
- };
- }
- exports.hasFixableIssues = hasFixableIssues;
- function getUpgradableIssues(updates) {
- const issues = [];
- for (const id of Object.keys(updates)) {
- issues.push(...updates[id].vulns);
- }
- return issues.length;
- }
- //# sourceMappingURL=fixable-issues.js.map
- /***/ }),
- /***/ 29748:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.getIssueCountBySeverity = void 0;
- function getIssueCountBySeverity(issueData) {
- const total = {
- low: [],
- medium: [],
- high: [],
- critical: [],
- };
- for (const entry of issueData) {
- for (const issue of Object.values(entry)) {
- const { severity, id } = issue;
- total[severity.toLowerCase()].push(id);
- }
- }
- return total;
- }
- exports.getIssueCountBySeverity = getIssueCountBySeverity;
- //# sourceMappingURL=issues-by-severity.js.map
- /***/ }),
- /***/ 41160:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.getTotalIssueCount = void 0;
- function getTotalIssueCount(issueData) {
- let total = 0;
- for (const entry of issueData) {
- total += Object.keys(entry).length;
- }
- return total;
- }
- exports.getTotalIssueCount = getTotalIssueCount;
- //# sourceMappingURL=total-issues-count.js.map
- /***/ }),
- /***/ 90686:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.formatDisplayName = void 0;
- const pathLib = __webpack_require__(85622);
- function formatDisplayName(path, identity) {
- if (!identity.targetFile) {
- return `${identity.type} project`;
- }
- // show paths relative to where `snyk fix` is running
- return pathLib.relative(process.cwd(), pathLib.join(path, identity.targetFile));
- }
- exports.formatDisplayName = formatDisplayName;
- //# sourceMappingURL=format-display-name.js.map
- /***/ }),
- /***/ 31998:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.formatFailed = void 0;
- const types_1 = __webpack_require__(71538);
- const error_to_user_message_1 = __webpack_require__(5258);
- const format_with_changes_item_1 = __webpack_require__(38154);
- const format_unresolved_item_1 = __webpack_require__(82187);
- function formatFailed(failed) {
- if (types_1.isWithError(failed)) {
- return format_unresolved_item_1.formatUnresolved(failed.original, error_to_user_message_1.convertErrorToUserMessage(failed.error), failed.tip);
- }
- return format_with_changes_item_1.formatChangesSummary(failed.original, failed.changes);
- }
- exports.formatFailed = formatFailed;
- //# sourceMappingURL=format-failed-item.js.map
- /***/ }),
- /***/ 82187:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.formatUnresolved = void 0;
- const chalk = __webpack_require__(98250);
- const format_display_name_1 = __webpack_require__(90686);
- const show_results_summary_1 = __webpack_require__(70962);
- function formatUnresolved(entity, userMessage, tip) {
- const name = format_display_name_1.formatDisplayName(entity.workspace.path, entity.scanResult.identity);
- const tipMessage = tip ? `\n${show_results_summary_1.PADDING_SPACE}Tip: ${tip}` : '';
- const errorMessage = `${show_results_summary_1.PADDING_SPACE}${name}\n${show_results_summary_1.PADDING_SPACE}${chalk.red('✖')} ${chalk.red(userMessage)}`;
- return errorMessage + tipMessage;
- }
- exports.formatUnresolved = formatUnresolved;
- //# sourceMappingURL=format-unresolved-item.js.map
- /***/ }),
- /***/ 38154:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.formatChangesSummary = void 0;
- const chalk = __webpack_require__(98250);
- const format_display_name_1 = __webpack_require__(90686);
- const show_results_summary_1 = __webpack_require__(70962);
- /*
- * Generate formatted output that describes what changes were applied, which failed.
- */
- function formatChangesSummary(entity, changes) {
- return `${show_results_summary_1.PADDING_SPACE}${format_display_name_1.formatDisplayName(entity.workspace.path, entity.scanResult.identity)}\n${changes.map((c) => formatAppliedChange(c)).join('\n')}`;
- }
- exports.formatChangesSummary = formatChangesSummary;
- function formatAppliedChange(change) {
- if (change.success === true) {
- return `${show_results_summary_1.PADDING_SPACE}${chalk.green('✔')} ${change.userMessage}`;
- }
- if (change.success === false) {
- return `${show_results_summary_1.PADDING_SPACE}${chalk.red('x')} ${chalk.red(change.userMessage)}\n${show_results_summary_1.PADDING_SPACE}Reason:${show_results_summary_1.PADDING_SPACE}${change.reason}${change.tip ? `.\n${show_results_summary_1.PADDING_SPACE}Tip: ${change.tip}` : undefined}`;
- }
- return '';
- }
- //# sourceMappingURL=format-with-changes-item.js.map
- /***/ }),
- /***/ 70962:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.getTestResults = exports.generateIssueSummary = exports.getSeveritiesColour = exports.defaultSeverityColor = exports.severitiesColourMapping = exports.formatIssueCountBySeverity = exports.calculateFailed = exports.calculateFixedIssues = exports.calculateFixed = exports.generateOverallSummary = exports.generateUnresolvedSummary = exports.generateSuccessfulFixesSummary = exports.showResultsSummary = exports.PADDING_SPACE = void 0;
- const chalk = __webpack_require__(98250);
- const stripAnsi = __webpack_require__(71990);
- const common_1 = __webpack_require__(75391);
- const fixable_issues_1 = __webpack_require__(86635);
- const issues_by_severity_1 = __webpack_require__(29748);
- const total_issues_count_1 = __webpack_require__(41160);
- const format_failed_item_1 = __webpack_require__(31998);
- const format_with_changes_item_1 = __webpack_require__(38154);
- const format_unresolved_item_1 = __webpack_require__(82187);
- exports.PADDING_SPACE = ' '; // 2 spaces
- async function showResultsSummary(nothingToFix, resultsByPlugin, exceptions, options, total) {
- const successfulFixesSummary = generateSuccessfulFixesSummary(resultsByPlugin);
- const { summary: unresolvedSummary, count: unresolvedCount, } = generateUnresolvedSummary(resultsByPlugin, exceptions);
- const { summary: overallSummary, count: changedCount, } = generateOverallSummary(resultsByPlugin, exceptions, nothingToFix, options);
- const getHelpText = `${common_1.reTryMessage}. ${common_1.contactSupportMessage}`;
- // called without any `snyk test` results
- if (total === 0) {
- const summary = `\n${chalk.red(' ✖ No successful fixes')}`;
- return options.stripAnsi ? stripAnsi(summary) : summary;
- }
- // 100% not vulnerable and had no errors/unsupported
- if (nothingToFix.length === total && unresolvedCount === 0) {
- const summary = `\n${chalk.green('✔ No vulnerable items to fix')}\n\n${overallSummary}`;
- return options.stripAnsi ? stripAnsi(summary) : summary;
- }
- const summary = `\n${successfulFixesSummary}${unresolvedSummary}${unresolvedCount || changedCount ? `\n\n${overallSummary}` : ''}${unresolvedSummary ? `\n\n${getHelpText}` : ''}`;
- return options.stripAnsi ? stripAnsi(summary) : summary;
- }
- exports.showResultsSummary = showResultsSummary;
- function generateSuccessfulFixesSummary(resultsByPlugin) {
- const sectionTitle = 'Successful fixes:';
- const formattedTitleHeader = `${chalk.bold(sectionTitle)}`;
- let summary = '';
- for (const plugin of Object.keys(resultsByPlugin)) {
- const fixedSuccessfully = resultsByPlugin[plugin].succeeded;
- if (fixedSuccessfully.length > 0) {
- summary +=
- '\n\n' +
- fixedSuccessfully
- .map((s) => format_with_changes_item_1.formatChangesSummary(s.original, s.changes))
- .join('\n\n');
- }
- }
- if (summary) {
- return formattedTitleHeader + summary;
- }
- return chalk.red(' ✖ No successful fixes\n');
- }
- exports.generateSuccessfulFixesSummary = generateSuccessfulFixesSummary;
- function generateUnresolvedSummary(resultsByPlugin, exceptionsByScanType) {
- const title = 'Unresolved items:';
- const formattedTitle = `${chalk.bold(title)}`;
- let summary = '';
- let count = 0;
- for (const plugin of Object.keys(resultsByPlugin)) {
- const skipped = resultsByPlugin[plugin].skipped;
- if (skipped.length > 0) {
- count += skipped.length;
- summary +=
- '\n\n' +
- skipped
- .map((s) => format_unresolved_item_1.formatUnresolved(s.original, s.userMessage))
- .join('\n\n');
- }
- const failed = resultsByPlugin[plugin].failed;
- if (failed.length > 0) {
- count += failed.length;
- summary += '\n\n' + failed.map((s) => format_failed_item_1.formatFailed(s)).join('\n\n');
- }
- }
- if (Object.keys(exceptionsByScanType).length) {
- for (const ecosystem of Object.keys(exceptionsByScanType)) {
- const unresolved = exceptionsByScanType[ecosystem];
- count += unresolved.originals.length;
- summary +=
- '\n\n' +
- unresolved.originals
- .map((s) => format_unresolved_item_1.formatUnresolved(s, unresolved.userMessage))
- .join('\n\n');
- }
- }
- if (summary) {
- return { summary: `\n\n${formattedTitle}${summary}`, count };
- }
- return { summary: '', count: 0 };
- }
- exports.generateUnresolvedSummary = generateUnresolvedSummary;
- function generateOverallSummary(resultsByPlugin, exceptions, nothingToFix, options) {
- const sectionTitle = 'Summary:';
- const formattedTitleHeader = `${chalk.bold(sectionTitle)}`;
- const fixed = calculateFixed(resultsByPlugin);
- const failed = calculateFailed(resultsByPlugin, exceptions);
- const dryRunText = options.dryRun
- ? chalk.hex('#EDD55E')(`${exports.PADDING_SPACE}Command run in ${chalk.bold('dry run')} mode. Fixes are not applied.\n`)
- : '';
- const notFixedMessage = failed > 0
- ? `${exports.PADDING_SPACE}${chalk.bold.red(failed)} items were not fixed\n`
- : '';
- const fixedMessage = fixed > 0
- ? `${exports.PADDING_SPACE}${chalk.green.bold(fixed)} items were successfully fixed\n`
- : '';
- const vulnsSummary = generateIssueSummary(resultsByPlugin, exceptions);
- const notVulnerableSummary = nothingToFix.length > 0
- ? `${exports.PADDING_SPACE}${nothingToFix.length} items were not vulnerable\n`
- : '';
- return {
- summary: `${formattedTitleHeader}\n\n${dryRunText}${notFixedMessage}${fixedMessage}${notVulnerableSummary}${vulnsSummary}`,
- count: fixed + failed,
- };
- }
- exports.generateOverallSummary = generateOverallSummary;
- function calculateFixed(resultsByPlugin) {
- let fixed = 0;
- for (const plugin of Object.keys(resultsByPlugin)) {
- fixed += resultsByPlugin[plugin].succeeded.length;
- }
- return fixed;
- }
- exports.calculateFixed = calculateFixed;
- function calculateFixedIssues(resultsByPlugin) {
- const fixedIssues = [];
- for (const plugin of Object.keys(resultsByPlugin)) {
- for (const entity of resultsByPlugin[plugin].succeeded) {
- // count unique vulns fixed per scanned entity
- // some fixed may need to be made in multiple places
- // and would count multiple times otherwise.
- const fixedPerEntity = new Set();
- entity.changes
- .filter((c) => c.success)
- .forEach((c) => {
- c.issueIds.map((i) => fixedPerEntity.add(i));
- });
- fixedIssues.push(...Array.from(fixedPerEntity));
- }
- }
- return fixedIssues.length;
- }
- exports.calculateFixedIssues = calculateFixedIssues;
- function calculateFailed(resultsByPlugin, exceptions) {
- let failed = 0;
- for (const plugin of Object.keys(resultsByPlugin)) {
- const results = resultsByPlugin[plugin];
- failed += results.failed.length + results.skipped.length;
- }
- if (Object.keys(exceptions).length) {
- for (const ecosystem of Object.keys(exceptions)) {
- const unresolved = exceptions[ecosystem];
- failed += unresolved.originals.length;
- }
- }
- return failed;
- }
- exports.calculateFailed = calculateFailed;
- function formatIssueCountBySeverity({ critical, high, medium, low, }) {
- const summary = [];
- if (critical && critical > 0) {
- summary.push(exports.severitiesColourMapping.critical.colorFunc(`${critical} Critical`));
- }
- if (high && high > 0) {
- summary.push(exports.severitiesColourMapping.high.colorFunc(`${high} High`));
- }
- if (medium && medium > 0) {
- summary.push(exports.severitiesColourMapping.medium.colorFunc(`${medium} Medium`));
- }
- if (low && low > 0) {
- summary.push(exports.severitiesColourMapping.low.colorFunc(`${low} Low`));
- }
- return summary.join(' | ');
- }
- exports.formatIssueCountBySeverity = formatIssueCountBySeverity;
- exports.severitiesColourMapping = {
- low: {
- colorFunc(text) {
- return chalk.hex('#BCBBC8')(text);
- },
- },
- medium: {
- colorFunc(text) {
- return chalk.hex('#EDD55E')(text);
- },
- },
- high: {
- colorFunc(text) {
- return chalk.hex('#FF872F')(text);
- },
- },
- critical: {
- colorFunc(text) {
- return chalk.hex('#FF0B0B')(text);
- },
- },
- };
- exports.defaultSeverityColor = {
- colorFunc(text) {
- return chalk.grey(text);
- },
- };
- function getSeveritiesColour(severity) {
- var _a;
- return (_a = exports.severitiesColourMapping[severity]) !== null && _a !== void 0 ? _a : exports.defaultSeverityColor;
- }
- exports.getSeveritiesColour = getSeveritiesColour;
- function generateIssueSummary(resultsByPlugin, exceptions) {
- const testResults = getTestResults(resultsByPlugin, exceptions);
- const issueData = testResults.map((i) => i.issuesData);
- const bySeverity = issues_by_severity_1.getIssueCountBySeverity(issueData);
- const issuesBySeverityMessage = formatIssueCountBySeverity({
- critical: bySeverity.critical.length,
- high: bySeverity.high.length,
- medium: bySeverity.medium.length,
- low: bySeverity.low.length,
- });
- // can't use .flat() or .flatMap() because it's not supported in Node 10
- const issues = [];
- for (const result of testResults) {
- issues.push(...result.issues);
- }
- const totalIssueCount = total_issues_count_1.getTotalIssueCount(issueData);
- let totalIssues = '';
- if (totalIssueCount > 0) {
- totalIssues = `${chalk.bold(totalIssueCount)} issues\n`;
- if (issuesBySeverityMessage) {
- totalIssues = `${chalk.bold(totalIssueCount)} issues: ${issuesBySeverityMessage}\n`;
- }
- }
- const { count: fixableCount } = fixable_issues_1.hasFixableIssues(testResults);
- const fixableIssues = fixableCount > 0 ? `${chalk.bold(fixableCount)} issues are fixable\n` : '';
- const fixedIssueCount = calculateFixedIssues(resultsByPlugin);
- const fixedIssuesSummary = fixedIssueCount > 0
- ? `${chalk.bold(fixedIssueCount)} issues were successfully fixed\n`
- : '';
- return `\n${exports.PADDING_SPACE}${totalIssues}${exports.PADDING_SPACE}${fixableIssues}${exports.PADDING_SPACE}${fixedIssuesSummary}`;
- }
- exports.generateIssueSummary = generateIssueSummary;
- function getTestResults(resultsByPlugin, exceptionsByScanType) {
- const testResults = [];
- for (const plugin of Object.keys(resultsByPlugin)) {
- const { skipped, failed, succeeded } = resultsByPlugin[plugin];
- testResults.push(...skipped.map((i) => i.original.testResult));
- testResults.push(...failed.map((i) => i.original.testResult));
- testResults.push(...succeeded.map((i) => i.original.testResult));
- }
- if (Object.keys(exceptionsByScanType).length) {
- for (const ecosystem of Object.keys(exceptionsByScanType)) {
- const unresolved = exceptionsByScanType[ecosystem];
- testResults.push(...unresolved.originals.map((i) => i.testResult));
- }
- }
- return testResults;
- }
- exports.getTestResults = getTestResults;
- //# sourceMappingURL=show-results-summary.js.map
- /***/ }),
- /***/ 24957:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.partitionByVulnerable = void 0;
- function partitionByVulnerable(entities) {
- const vulnerable = [];
- const notVulnerable = [];
- for (const entity of entities) {
- const hasIssues = entity.testResult.issues.length > 0;
- if (hasIssues) {
- vulnerable.push(entity);
- }
- else {
- notVulnerable.push(entity);
- }
- }
- return { vulnerable, notVulnerable };
- }
- exports.partitionByVulnerable = partitionByVulnerable;
- //# sourceMappingURL=partition-by-vulnerable.js.map
- /***/ }),
- /***/ 65090:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.loadPlugin = void 0;
- const unsupported_type_error_1 = __webpack_require__(90361);
- const python_1 = __webpack_require__(97090);
- function loadPlugin(type) {
- switch (type) {
- case 'pip': {
- return python_1.pythonFix;
- }
- case 'poetry': {
- return python_1.pythonFix;
- }
- default: {
- throw new unsupported_type_error_1.UnsupportedTypeError(type);
- }
- }
- }
- exports.loadPlugin = loadPlugin;
- //# sourceMappingURL=load-plugin.js.map
- /***/ }),
- /***/ 96377:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.checkPackageToolSupported = void 0;
- const chalk = __webpack_require__(98250);
- const pipenvPipfileFix = __webpack_require__(91989);
- const poetryFix = __webpack_require__(69671);
- const ora = __webpack_require__(63395);
- const supportFunc = {
- pipenv: {
- isInstalled: () => pipenvPipfileFix.isPipenvInstalled(),
- isSupportedVersion: (version) => pipenvPipfileFix.isPipenvSupportedVersion(version),
- },
- poetry: {
- isInstalled: () => poetryFix.isPoetryInstalled(),
- isSupportedVersion: (version) => poetryFix.isPoetrySupportedVersion(version),
- },
- };
- async function checkPackageToolSupported(packageManager, options) {
- const { version } = await supportFunc[packageManager].isInstalled();
- const spinner = ora({ isSilent: options.quiet, stream: process.stdout });
- spinner.clear();
- spinner.text = `Checking ${packageManager} version`;
- spinner.indent = 2;
- spinner.start();
- if (!version) {
- spinner.stopAndPersist({
- text: chalk.hex('#EDD55E')(`Could not detect ${packageManager} version, proceeding anyway. Some operations may fail.`),
- symbol: chalk.hex('#EDD55E')('⚠️'),
- });
- return;
- }
- const { supported, versions } = supportFunc[packageManager].isSupportedVersion(version);
- if (!supported) {
- const spinnerMessage = ` ${version} ${packageManager} version detected. Currently the following ${packageManager} versions are supported: ${versions.join(',')}`;
- spinner.stopAndPersist({
- text: chalk.hex('#EDD55E')(spinnerMessage),
- symbol: chalk.hex('#EDD55E')('⚠️'),
- });
- }
- else {
- spinner.stop();
- }
- }
- exports.checkPackageToolSupported = checkPackageToolSupported;
- //# sourceMappingURL=package-tool-supported.js.map
- /***/ }),
- /***/ 10774:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.isRequirementsTxtManifest = exports.getHandlerType = void 0;
- const pathLib = __webpack_require__(85622);
- const supported_handler_types_1 = __webpack_require__(56394);
- function getHandlerType(entity) {
- const targetFile = entity.scanResult.identity.targetFile;
- if (!targetFile) {
- return null;
- }
- const packageManagerOverride = entity.options.packageManager;
- if (packageManagerOverride) {
- return getTypeFromPackageManager(packageManagerOverride);
- }
- const path = pathLib.parse(targetFile);
- if (isRequirementsTxtManifest(targetFile)) {
- return supported_handler_types_1.SUPPORTED_HANDLER_TYPES.REQUIREMENTS;
- }
- else if (['Pipfile'].includes(path.base)) {
- return supported_handler_types_1.SUPPORTED_HANDLER_TYPES.PIPFILE;
- }
- else if (['pyproject.toml', 'poetry.lock'].includes(path.base)) {
- return supported_handler_types_1.SUPPORTED_HANDLER_TYPES.POETRY;
- }
- return null;
- }
- exports.getHandlerType = getHandlerType;
- function isRequirementsTxtManifest(targetFile) {
- return targetFile.endsWith('.txt');
- }
- exports.isRequirementsTxtManifest = isRequirementsTxtManifest;
- function getTypeFromPackageManager(packageManager) {
- switch (packageManager) {
- case 'pip':
- return supported_handler_types_1.SUPPORTED_HANDLER_TYPES.REQUIREMENTS;
- case 'poetry':
- return supported_handler_types_1.SUPPORTED_HANDLER_TYPES.POETRY;
- default:
- return null;
- }
- }
- //# sourceMappingURL=get-handler-type.js.map
- /***/ }),
- /***/ 70145:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.isSuccessfulChange = exports.generateSuccessfulChanges = exports.generateFailedChanges = void 0;
- function generateFailedChanges(attemptedUpdates, pins, error, command) {
- const changes = [];
- for (const pkgAtVersion of Object.keys(pins)) {
- const pin = pins[pkgAtVersion];
- if (!attemptedUpdates
- .map((update) => update.replace('==', '@'))
- .includes(pin.upgradeTo)) {
- continue;
- }
- const updatedMessage = pin.isTransitive ? 'pin' : 'upgrade';
- const newVersion = pin.upgradeTo.split('@')[1];
- const [pkgName, version] = pkgAtVersion.split('@');
- changes.push({
- success: false,
- reason: error.message,
- userMessage: `Failed to ${updatedMessage} ${pkgName} from ${version} to ${newVersion}`,
- tip: command ? `Try running \`${command}\`` : undefined,
- issueIds: pin.vulns,
- from: pkgAtVersion,
- to: `${pkgName}@${newVersion}`,
- });
- }
- return changes;
- }
- exports.generateFailedChanges = generateFailedChanges;
- function generateSuccessfulChanges(appliedUpgrades, pins) {
- const changes = [];
- for (const pkgAtVersion of Object.keys(pins)) {
- const pin = pins[pkgAtVersion];
- if (!appliedUpgrades
- .map((upgrade) => upgrade.replace('==', '@'))
- .includes(pin.upgradeTo)) {
- continue;
- }
- const updatedMessage = pin.isTransitive ? 'Pinned' : 'Upgraded';
- const newVersion = pin.upgradeTo.split('@')[1];
- const [pkgName, version] = pkgAtVersion.split('@');
- changes.push({
- success: true,
- userMessage: `${updatedMessage} ${pkgName} from ${version} to ${newVersion}`,
- issueIds: pin.vulns,
- from: pkgAtVersion,
- to: `${pkgName}@${newVersion}`,
- });
- }
- return changes;
- }
- exports.generateSuccessfulChanges = generateSuccessfulChanges;
- function isSuccessfulChange(change) {
- return change.success === true;
- }
- exports.isSuccessfulChange = isSuccessfulChange;
- //# sourceMappingURL=attempted-changes-summary.js.map
- /***/ }),
- /***/ 60174:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.partitionByFixable = exports.isSupported = exports.projectTypeSupported = void 0;
- function projectTypeSupported(res) {
- return !('reason' in res);
- }
- exports.projectTypeSupported = projectTypeSupported;
- async function isSupported(entity) {
- const remediationData = entity.testResult.remediation;
- if (!remediationData) {
- return { supported: false, reason: 'No remediation data available' };
- }
- if (!remediationData.pin || Object.keys(remediationData.pin).length === 0) {
- return {
- supported: false,
- reason: 'There is no actionable remediation to apply',
- };
- }
- return { supported: true };
- }
- exports.isSupported = isSupported;
- async function partitionByFixable(entities) {
- const fixable = [];
- const skipped = [];
- for (const entity of entities) {
- const isSupportedResponse = await isSupported(entity);
- if (projectTypeSupported(isSupportedResponse)) {
- fixable.push(entity);
- continue;
- }
- skipped.push({
- original: entity,
- userMessage: isSupportedResponse.reason,
- });
- }
- return { fixable, skipped };
- }
- exports.partitionByFixable = partitionByFixable;
- //# sourceMappingURL=is-supported.js.map
- /***/ }),
- /***/ 9744:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.containsRequireDirective = void 0;
- /* Requires like -r, -c are not supported at the moment, as multiple files
- * would have to be identified and fixed together
- * https://pip.pypa.io/en/stable/reference/pip_install/#options
- */
- async function containsRequireDirective(requirementsTxt) {
- const allMatches = [];
- const REQUIRE_PATTERN = new RegExp(/^[^\S\n]*-(r|c)\s+(.+)/, 'gm');
- const matches = getAllMatchedGroups(REQUIRE_PATTERN, requirementsTxt);
- for (const match of matches) {
- if (match && match.length > 1) {
- allMatches.push(match);
- }
- }
- return { containsRequire: allMatches.length > 0, matches: allMatches };
- }
- exports.containsRequireDirective = containsRequireDirective;
- function getAllMatchedGroups(re, str) {
- const groups = [];
- let match;
- while ((match = re.exec(str))) {
- groups.push(match);
- }
- return groups;
- }
- //# sourceMappingURL=contains-require-directive.js.map
- /***/ }),
- /***/ 85844:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.extractProvenance = void 0;
- const path = __webpack_require__(85622);
- const debugLib = __webpack_require__(15158);
- const requirements_file_parser_1 = __webpack_require__(67285);
- const contains_require_directive_1 = __webpack_require__(9744);
- const debug = debugLib('snyk-fix:python:extract-version-provenance');
- async function extractProvenance(workspace, rootDir, dir, fileName, provenance = {}) {
- const requirementsFileName = path.join(dir, fileName);
- const requirementsTxt = await workspace.readFile(requirementsFileName);
- // keep all provenance paths with `/` as a separator
- const relativeTargetFileName = path
- .normalize(path.relative(rootDir, requirementsFileName))
- .replace(path.sep, '/');
- provenance = {
- ...provenance,
- [relativeTargetFileName]: requirements_file_parser_1.parseRequirementsFile(requirementsTxt),
- };
- const { containsRequire, matches } = await contains_require_directive_1.containsRequireDirective(requirementsTxt);
- if (containsRequire) {
- for (const match of matches) {
- const requiredFilePath = match[2];
- if (provenance[requiredFilePath]) {
- debug('Detected recursive require directive, skipping');
- continue;
- }
- const { dir: requireDir, base } = path.parse(path.join(dir, requiredFilePath));
- provenance = {
- ...provenance,
- ...(await extractProvenance(workspace, rootDir, requireDir, base, provenance)),
- };
- }
- }
- return provenance;
- }
- exports.extractProvenance = extractProvenance;
- //# sourceMappingURL=extract-version-provenance.js.map
- /***/ }),
- /***/ 81065:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.selectFileForPinning = exports.applyAllFixes = exports.fixIndividualRequirementsTxt = exports.pipRequirementsTxt = void 0;
- const debugLib = __webpack_require__(15158);
- const pathLib = __webpack_require__(85622);
- const sortBy = __webpack_require__(58254);
- const groupBy = __webpack_require__(20276);
- const update_dependencies_1 = __webpack_require__(5860);
- const no_fixes_applied_1 = __webpack_require__(80799);
- const extract_version_provenance_1 = __webpack_require__(85844);
- const requirements_file_parser_1 = __webpack_require__(67285);
- const standardize_package_name_1 = __webpack_require__(78078);
- const contains_require_directive_1 = __webpack_require__(9744);
- const validate_required_data_1 = __webpack_require__(57894);
- const format_display_name_1 = __webpack_require__(90686);
- const debug = debugLib('snyk-fix:python:requirements.txt');
- async function pipRequirementsTxt(fixable, options) {
- debug(`Preparing to fix ${fixable.length} Python requirements.txt projects`);
- const handlerResult = {
- succeeded: [],
- failed: [],
- skipped: [],
- };
- const ordered = sortByDirectory(fixable);
- let fixedFilesCache = {};
- for (const dir of Object.keys(ordered)) {
- debug(`Fixing entities in directory ${dir}`);
- const entitiesPerDirectory = ordered[dir].map((e) => e.entity);
- const { failed, succeeded, skipped, fixedCache } = await fixAll(entitiesPerDirectory, options, fixedFilesCache);
- fixedFilesCache = {
- ...fixedFilesCache,
- ...fixedCache,
- };
- handlerResult.succeeded.push(...succeeded);
- handlerResult.failed.push(...failed);
- handlerResult.skipped.push(...skipped);
- }
- return handlerResult;
- }
- exports.pipRequirementsTxt = pipRequirementsTxt;
- async function fixAll(entities, options, fixedCache) {
- const handlerResult = {
- succeeded: [],
- failed: [],
- skipped: [],
- };
- for (const entity of entities) {
- const targetFile = entity.scanResult.identity.targetFile;
- try {
- const { dir, base } = pathLib.parse(targetFile);
- // parse & join again to support correct separator
- const filePath = pathLib.normalize(pathLib.join(dir, base));
- if (Object.keys(fixedCache).includes(pathLib.normalize(pathLib.join(dir, base)))) {
- handlerResult.succeeded.push({
- original: entity,
- changes: [
- {
- success: true,
- userMessage: `Fixed through ${format_display_name_1.formatDisplayName(entity.workspace.path, {
- type: entity.scanResult.identity.type,
- targetFile: fixedCache[filePath].fixedIn,
- })}`,
- issueIds: getFixedEntityIssues(fixedCache[filePath].issueIds, entity.testResult.issues),
- },
- ],
- });
- continue;
- }
- const { changes, fixedMeta } = await applyAllFixes(entity, options);
- if (!changes.length) {
- debug('Manifest has not changed!');
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError();
- }
- // keep issues were successfully fixed unique across files that are part of the same project
- // the test result is for 1 entry entity.
- const uniqueIssueIds = new Set();
- for (const c of changes) {
- c.issueIds.map((i) => uniqueIssueIds.add(i));
- }
- Object.keys(fixedMeta).forEach((f) => {
- fixedCache[f] = {
- fixedIn: targetFile,
- issueIds: Array.from(uniqueIssueIds),
- };
- });
- handlerResult.succeeded.push({ original: entity, changes });
- }
- catch (e) {
- debug(`Failed to fix ${targetFile}.\nERROR: ${e}`);
- handlerResult.failed.push({ original: entity, error: e });
- }
- }
- return { ...handlerResult, fixedCache };
- }
- // TODO: optionally verify the deps install
- async function fixIndividualRequirementsTxt(workspace, dir, entryFileName, fileName, remediation, parsedRequirements, options, directUpgradesOnly) {
- const entryFilePath = pathLib.normalize(pathLib.join(dir, entryFileName));
- const fullFilePath = pathLib.normalize(pathLib.join(dir, fileName));
- const { updatedManifest, changes } = update_dependencies_1.updateDependencies(parsedRequirements, remediation.pin, directUpgradesOnly, entryFilePath !== fullFilePath
- ? format_display_name_1.formatDisplayName(workspace.path, {
- type: 'pip',
- targetFile: fullFilePath,
- })
- : undefined);
- if (!changes.length) {
- return { changes };
- }
- if (!options.dryRun) {
- debug('Writing changes to file');
- await workspace.writeFile(pathLib.join(dir, fileName), updatedManifest);
- }
- else {
- debug('Skipping writing changes to file in --dry-run mode');
- }
- return { changes };
- }
- exports.fixIndividualRequirementsTxt = fixIndividualRequirementsTxt;
- async function applyAllFixes(entity, options) {
- const { remediation, targetFile: entryFileName, workspace, } = validate_required_data_1.validateRequiredData(entity);
- const fixedMeta = {};
- const { dir, base } = pathLib.parse(entryFileName);
- const provenance = await extract_version_provenance_1.extractProvenance(workspace, dir, dir, base);
- const upgradeChanges = [];
- /* Apply all upgrades first across all files that are included */
- for (const fileName of Object.keys(provenance)) {
- const skipApplyingPins = true;
- const { changes } = await fixIndividualRequirementsTxt(workspace, dir, base, fileName, remediation, provenance[fileName], options, skipApplyingPins);
- upgradeChanges.push(...changes);
- fixedMeta[pathLib.normalize(pathLib.join(dir, fileName))] = upgradeChanges;
- }
- /* Apply all left over remediation as pins in the entry targetFile */
- const toPin = filterOutAppliedUpgrades(remediation, upgradeChanges);
- const directUpgradesOnly = false;
- const fileForPinning = await selectFileForPinning(entity);
- const { changes: pinnedChanges } = await fixIndividualRequirementsTxt(workspace, dir, base, fileForPinning.fileName, toPin, requirements_file_parser_1.parseRequirementsFile(fileForPinning.fileContent), options, directUpgradesOnly);
- return { changes: [...upgradeChanges, ...pinnedChanges], fixedMeta };
- }
- exports.applyAllFixes = applyAllFixes;
- function filterOutAppliedUpgrades(remediation, upgradeChanges) {
- const pinRemediation = {
- ...remediation,
- pin: {},
- };
- const pins = remediation.pin;
- const normalizedAppliedRemediation = upgradeChanges
- .map((c) => {
- var _a;
- if (c.success && c.from) {
- const [pkgName, versionAndMore] = (_a = c.from) === null || _a === void 0 ? void 0 : _a.split('@');
- return `${standardize_package_name_1.standardizePackageName(pkgName)}@${versionAndMore}`;
- }
- return false;
- })
- .filter(Boolean);
- for (const pkgAtVersion of Object.keys(pins)) {
- const [pkgName, versionAndMore] = pkgAtVersion.split('@');
- if (!normalizedAppliedRemediation.includes(`${standardize_package_name_1.standardizePackageName(pkgName)}@${versionAndMore}`)) {
- pinRemediation.pin[pkgAtVersion] = pins[pkgAtVersion];
- }
- }
- return pinRemediation;
- }
- function sortByDirectory(entities) {
- const mapped = entities.map((e) => ({
- entity: e,
- ...pathLib.parse(e.scanResult.identity.targetFile),
- }));
- const sorted = sortBy(mapped, 'dir');
- return groupBy(sorted, 'dir');
- }
- async function selectFileForPinning(entity) {
- const targetFile = entity.scanResult.identity.targetFile;
- const { dir, base } = pathLib.parse(targetFile);
- const { workspace } = entity;
- // default to adding pins in the scanned file
- let fileName = base;
- let requirementsTxt = await workspace.readFile(targetFile);
- const { containsRequire, matches } = await contains_require_directive_1.containsRequireDirective(requirementsTxt);
- const constraintsMatch = matches.filter((m) => m.includes('c'));
- if (containsRequire && constraintsMatch[0]) {
- // prefer to pin in constraints file if present
- fileName = constraintsMatch[0][2];
- requirementsTxt = await workspace.readFile(pathLib.join(dir, fileName));
- }
- return { fileContent: requirementsTxt, fileName };
- }
- exports.selectFileForPinning = selectFileForPinning;
- function getFixedEntityIssues(fixedIssueIds, issues) {
- const fixed = [];
- for (const { issueId } of issues) {
- if (fixedIssueIds.includes(issueId)) {
- fixed.push(issueId);
- }
- }
- return fixed;
- }
- //# sourceMappingURL=index.js.map
- /***/ }),
- /***/ 57584:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.applyUpgrades = void 0;
- function applyUpgrades(originalRequirements, upgradedRequirements) {
- const updated = [];
- for (const requirement of originalRequirements) {
- const { originalText } = requirement;
- if (upgradedRequirements[originalText]) {
- updated.push(upgradedRequirements[originalText]);
- }
- else {
- updated.push(originalText);
- }
- }
- return updated;
- }
- exports.applyUpgrades = applyUpgrades;
- //# sourceMappingURL=apply-upgrades.js.map
- /***/ }),
- /***/ 40853:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.calculateRelevantFixes = void 0;
- const is_defined_1 = __webpack_require__(38122);
- const standardize_package_name_1 = __webpack_require__(78078);
- function calculateRelevantFixes(requirements, updates, type) {
- const lowerCasedUpdates = {};
- const topLevelDeps = requirements.map(({ name }) => name).filter(is_defined_1.isDefined);
- Object.keys(updates).forEach((update) => {
- const { upgradeTo } = updates[update];
- const [pkgName] = update.split('@');
- const isTransitive = topLevelDeps.indexOf(standardize_package_name_1.standardizePackageName(pkgName)) < 0;
- if (type === 'transitive-pins' ? isTransitive : !isTransitive) {
- const [name, newVersion] = upgradeTo.split('@');
- lowerCasedUpdates[update] = {
- ...updates[update],
- upgradeTo: `${standardize_package_name_1.standardizePackageName(name)}@${newVersion}`,
- };
- }
- });
- return lowerCasedUpdates;
- }
- exports.calculateRelevantFixes = calculateRelevantFixes;
- //# sourceMappingURL=calculate-relevant-fixes.js.map
- /***/ }),
- /***/ 2694:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.generatePins = void 0;
- const calculate_relevant_fixes_1 = __webpack_require__(40853);
- const is_defined_1 = __webpack_require__(38122);
- const standardize_package_name_1 = __webpack_require__(78078);
- function generatePins(requirements, updates, referenceFileInChanges) {
- // Lowercase the upgrades object. This might be overly defensive, given that
- // we control this input internally, but its a low cost guard rail. Outputs a
- // mapping of upgrade to -> from, instead of the nested upgradeTo object.
- const standardizedPins = calculate_relevant_fixes_1.calculateRelevantFixes(requirements, updates, 'transitive-pins');
- if (Object.keys(standardizedPins).length === 0) {
- return {
- pinnedRequirements: [],
- changes: [],
- };
- }
- const changes = [];
- const pinnedRequirements = Object.keys(standardizedPins)
- .map((pkgNameAtVersion) => {
- const [pkgName, version] = pkgNameAtVersion.split('@');
- const newVersion = standardizedPins[pkgNameAtVersion].upgradeTo.split('@')[1];
- const newRequirement = `${standardize_package_name_1.standardizePackageName(pkgName)}>=${newVersion}`;
- changes.push({
- from: `${pkgName}@${version}`,
- to: `${pkgName}@${newVersion}`,
- issueIds: standardizedPins[pkgNameAtVersion].vulns,
- success: true,
- userMessage: `Pinned ${standardize_package_name_1.standardizePackageName(pkgName)} from ${version} to ${newVersion}${referenceFileInChanges ? ` (pinned in ${referenceFileInChanges})` : ''}`,
- });
- return `${newRequirement} # not directly required, pinned by Snyk to avoid a vulnerability`;
- })
- .filter(is_defined_1.isDefined);
- return {
- pinnedRequirements,
- changes,
- };
- }
- exports.generatePins = generatePins;
- //# sourceMappingURL=generate-pins.js.map
- /***/ }),
- /***/ 86047:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.generateUpgrades = void 0;
- const standardize_package_name_1 = __webpack_require__(78078);
- const calculate_relevant_fixes_1 = __webpack_require__(40853);
- function generateUpgrades(requirements, updates, referenceFileInChanges) {
- // Lowercase the upgrades object. This might be overly defensive, given that
- // we control this input internally, but its a low cost guard rail. Outputs a
- // mapping of upgrade to -> from, instead of the nested upgradeTo object.
- const normalizedUpgrades = calculate_relevant_fixes_1.calculateRelevantFixes(requirements, updates, 'direct-upgrades');
- if (Object.keys(normalizedUpgrades).length === 0) {
- return {
- updatedRequirements: {},
- changes: [],
- };
- }
- const changes = [];
- const updatedRequirements = {};
- requirements.map(({ name, originalName, versionComparator, version, originalText, extras, }) => {
- // Defensive patching; if any of these are undefined, return
- if (typeof name === 'undefined' ||
- typeof versionComparator === 'undefined' ||
- typeof version === 'undefined' ||
- originalText === '') {
- return;
- }
- // Check if we have an upgrade; if we do, replace the version string with
- // the upgrade, but keep the rest of the content
- const upgrade = Object.keys(normalizedUpgrades).filter((packageVersionUpgrade) => {
- const [pkgName, versionAndMore] = packageVersionUpgrade.split('@');
- return `${standardize_package_name_1.standardizePackageName(pkgName)}@${versionAndMore}`.startsWith(`${standardize_package_name_1.standardizePackageName(name)}@${version}`);
- })[0];
- if (!upgrade) {
- return;
- }
- const newVersion = normalizedUpgrades[upgrade].upgradeTo.split('@')[1];
- const updatedRequirement = `${originalName}${versionComparator}${newVersion}`;
- changes.push({
- issueIds: normalizedUpgrades[upgrade].vulns,
- from: `${originalName}@${version}`,
- to: `${originalName}@${newVersion}`,
- success: true,
- userMessage: `Upgraded ${originalName} from ${version} to ${newVersion}${referenceFileInChanges
- ? ` (upgraded in ${referenceFileInChanges})`
- : ''}`,
- });
- updatedRequirements[originalText] = `${updatedRequirement}${extras ? extras : ''}`;
- });
- return {
- updatedRequirements,
- changes,
- };
- }
- exports.generateUpgrades = generateUpgrades;
- //# sourceMappingURL=generate-upgrades.js.map
- /***/ }),
- /***/ 5860:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.updateDependencies = void 0;
- const debugLib = __webpack_require__(15158);
- const generate_pins_1 = __webpack_require__(2694);
- const apply_upgrades_1 = __webpack_require__(57584);
- const generate_upgrades_1 = __webpack_require__(86047);
- const failed_to_parse_manifest_1 = __webpack_require__(84657);
- const debug = debugLib('snyk-fix:python:update-dependencies');
- /*
- * Given contents of manifest file(s) and a set of upgrades, apply the given
- * upgrades to a manifest and return the upgraded manifest.
- *
- * Currently only supported for `requirements.txt` - at least one file named
- * `requirements.txt` must be in the manifests.
- */
- function updateDependencies(parsedRequirementsData, updates, directUpgradesOnly = false, referenceFileInChanges) {
- const { requirements, endsWithNewLine: shouldEndWithNewLine, } = parsedRequirementsData;
- if (!requirements.length) {
- debug('Error: Expected to receive parsed manifest data. Is manifest empty?');
- throw new failed_to_parse_manifest_1.FailedToParseManifest();
- }
- debug('Finished parsing manifest');
- const { updatedRequirements, changes: upgradedChanges } = generate_upgrades_1.generateUpgrades(requirements, updates, referenceFileInChanges);
- debug('Finished generating upgrades to apply');
- let pinnedRequirements = [];
- let pinChanges = [];
- if (!directUpgradesOnly) {
- ({ pinnedRequirements, changes: pinChanges } = generate_pins_1.generatePins(requirements, updates, referenceFileInChanges));
- debug('Finished generating pins to apply');
- }
- let updatedManifest = [
- ...apply_upgrades_1.applyUpgrades(requirements, updatedRequirements),
- ...pinnedRequirements,
- ].join('\n');
- // This is a bit of a hack, but an easy one to follow. If a file ends with a
- // new line, ensure we keep it this way. Don't hijack customers formatting.
- if (shouldEndWithNewLine) {
- updatedManifest += '\n';
- }
- debug('Finished applying changes to manifest');
- return {
- updatedManifest,
- changes: [...pinChanges, ...upgradedChanges],
- };
- }
- exports.updateDependencies = updateDependencies;
- //# sourceMappingURL=index.js.map
- /***/ }),
- /***/ 38122:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.isDefined = void 0;
- // TS is not capable of determining when Array.filter has removed undefined
- // values without a manual Type Guard, so thats what this does
- function isDefined(t) {
- return typeof t !== 'undefined';
- }
- exports.isDefined = isDefined;
- //# sourceMappingURL=is-defined.js.map
- /***/ }),
- /***/ 67285:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.parseRequirementsFile = void 0;
- const debugLib = __webpack_require__(15158);
- const standardize_package_name_1 = __webpack_require__(78078);
- const debug = debugLib('snyk-fix:python:requirements-file-parser');
- function parseRequirementsFile(requirementsFile) {
- const endsWithNewLine = requirementsFile.endsWith('\n');
- const lines = requirementsFile.replace(/\n$/, '').split('\n');
- const requirements = [];
- lines.map((requirementText, line) => {
- const requirement = extractDependencyDataFromLine(requirementText, line);
- if (requirement) {
- requirements.push(requirement);
- }
- });
- return { requirements, endsWithNewLine };
- }
- exports.parseRequirementsFile = parseRequirementsFile;
- function extractDependencyDataFromLine(requirementText, line) {
- try {
- const requirement = { originalText: requirementText, line };
- const trimmedText = requirementText.trim();
- // Quick returns for cases we cannot remediate
- // - Empty line i.e. ''
- // - 'editable' packages i.e. '-e git://git.myproject.org/MyProject.git#egg=MyProject'
- // - Comments i.e. # This is a comment
- // - Local files i.e. file:../../lib/project#egg=MyProject
- if (requirementText === '' ||
- trimmedText.startsWith('-e') ||
- trimmedText.startsWith('#') ||
- trimmedText.startsWith('file:')) {
- return requirement;
- }
- // Regex to match against a Python package specifier. Any invalid lines (or
- // lines we can't handle) should have been returned this point.
- const regex = /([A-Z0-9-._]*)(!=|===|==|>=|<=|>|<|~=)(\d*\.?\d*\.?\d*[A-Z0-9]*)(.*)/i;
- const result = regex.exec(requirementText);
- if (result !== null) {
- requirement.name = standardize_package_name_1.standardizePackageName(result[1]);
- requirement.originalName = result[1];
- requirement.versionComparator = result[2];
- requirement.version = result[3];
- requirement.extras = result[4];
- }
- if (!(requirement.version && requirement.name)) {
- throw new Error('Failed to extract dependency data');
- }
- return requirement;
- }
- catch (err) {
- debug({ error: err.message, requirementText, line }, 'failed to parse requirement');
- return { originalText: requirementText, line };
- }
- }
- //# sourceMappingURL=requirements-file-parser.js.map
- /***/ }),
- /***/ 28006:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.pipenvPipfile = void 0;
- const debugLib = __webpack_require__(15158);
- const ora = __webpack_require__(63395);
- const package_tool_supported_1 = __webpack_require__(96377);
- const update_dependencies_1 = __webpack_require__(21110);
- const debug = debugLib('snyk-fix:python:Pipfile');
- async function pipenvPipfile(fixable, options) {
- debug(`Preparing to fix ${fixable.length} Python Pipfile projects`);
- const handlerResult = {
- succeeded: [],
- failed: [],
- skipped: [],
- };
- await package_tool_supported_1.checkPackageToolSupported('pipenv', options);
- for (const [index, entity] of fixable.entries()) {
- const spinner = ora({ isSilent: options.quiet, stream: process.stdout });
- const spinnerMessage = `Fixing Pipfile ${index + 1}/${fixable.length}`;
- spinner.text = spinnerMessage;
- spinner.start();
- const { failed, succeeded, skipped } = await update_dependencies_1.updateDependencies(entity, options);
- handlerResult.succeeded.push(...succeeded);
- handlerResult.failed.push(...failed);
- handlerResult.skipped.push(...skipped);
- spinner.stop();
- }
- return handlerResult;
- }
- exports.pipenvPipfile = pipenvPipfile;
- //# sourceMappingURL=index.js.map
- /***/ }),
- /***/ 13755:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.generateUpgrades = void 0;
- const standardize_package_name_1 = __webpack_require__(78078);
- const validate_required_data_1 = __webpack_require__(57894);
- function generateUpgrades(entity) {
- const { remediation } = validate_required_data_1.validateRequiredData(entity);
- const { pin: pins } = remediation;
- const upgrades = [];
- for (const pkgAtVersion of Object.keys(pins)) {
- const pin = pins[pkgAtVersion];
- const newVersion = pin.upgradeTo.split('@')[1];
- const [pkgName] = pkgAtVersion.split('@');
- upgrades.push(`${standardize_package_name_1.standardizePackageName(pkgName)}==${newVersion}`);
- }
- return { upgrades };
- }
- exports.generateUpgrades = generateUpgrades;
- //# sourceMappingURL=generate-upgrades.js.map
- /***/ }),
- /***/ 21110:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.updateDependencies = void 0;
- const debugLib = __webpack_require__(15158);
- const no_fixes_applied_1 = __webpack_require__(80799);
- const generate_upgrades_1 = __webpack_require__(13755);
- const pipenv_add_1 = __webpack_require__(22629);
- const attempted_changes_summary_1 = __webpack_require__(70145);
- const debug = debugLib('snyk-fix:python:Pipfile');
- function chooseFixStrategy(options) {
- return options.sequentialFix ? fixSequentially : fixAll;
- }
- async function updateDependencies(entity, options) {
- const handlerResult = await chooseFixStrategy(options)(entity, options);
- return handlerResult;
- }
- exports.updateDependencies = updateDependencies;
- async function fixAll(entity, options) {
- const handlerResult = {
- succeeded: [],
- failed: [],
- skipped: [],
- };
- const changes = [];
- try {
- const { upgrades } = await generate_upgrades_1.generateUpgrades(entity);
- if (!upgrades.length) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError('Failed to calculate package updates to apply');
- }
- // TODO: for better support we need to:
- // 1. parse the manifest and extract original requirements, version spec etc
- // 2. swap out only the version and retain original spec
- // 3. re-lock the lockfile
- // Currently this is not possible as there is no Pipfile parser that would do this.
- // update prod dependencies first
- if (upgrades.length) {
- changes.push(...(await pipenv_add_1.pipenvAdd(entity, options, upgrades)));
- }
- if (!changes.length) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError();
- }
- if (!changes.some((c) => attempted_changes_summary_1.isSuccessfulChange(c))) {
- handlerResult.failed.push({
- original: entity,
- changes,
- });
- }
- else {
- handlerResult.succeeded.push({
- original: entity,
- changes,
- });
- }
- }
- catch (error) {
- debug(`Failed to fix ${entity.scanResult.identity.targetFile}.\nERROR: ${error}`);
- handlerResult.failed.push({
- original: entity,
- error,
- tip: error.tip,
- });
- }
- return handlerResult;
- }
- async function fixSequentially(entity, options) {
- const handlerResult = {
- succeeded: [],
- failed: [],
- skipped: [],
- };
- const { upgrades } = await generate_upgrades_1.generateUpgrades(entity);
- // TODO: for better support we need to:
- // 1. parse the manifest and extract original requirements, version spec etc
- // 2. swap out only the version and retain original spec
- // 3. re-lock the lockfile
- // at the moment we do not parse Pipfile and therefore can't tell the difference
- // between prod & dev updates
- const changes = [];
- try {
- if (!upgrades.length) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError('Failed to calculate package updates to apply');
- }
- // update prod dependencies first
- if (upgrades.length) {
- for (const upgrade of upgrades) {
- changes.push(...(await pipenv_add_1.pipenvAdd(entity, options, [upgrade])));
- }
- }
- if (!changes.length) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError();
- }
- if (!changes.some((c) => attempted_changes_summary_1.isSuccessfulChange(c))) {
- handlerResult.failed.push({
- original: entity,
- changes,
- });
- }
- else {
- handlerResult.succeeded.push({
- original: entity,
- changes,
- });
- }
- }
- catch (error) {
- debug(`Failed to fix ${entity.scanResult.identity.targetFile}.\nERROR: ${error}`);
- handlerResult.failed.push({
- original: entity,
- tip: error.tip,
- error,
- });
- }
- return handlerResult;
- }
- //# sourceMappingURL=index.js.map
- /***/ }),
- /***/ 22629:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.pipenvAdd = void 0;
- const pathLib = __webpack_require__(85622);
- const pipenvPipfileFix = __webpack_require__(91989);
- const debugLib = __webpack_require__(15158);
- const validate_required_data_1 = __webpack_require__(57894);
- const attempted_changes_summary_1 = __webpack_require__(70145);
- const command_failed_to_run_error_1 = __webpack_require__(72353);
- const no_fixes_applied_1 = __webpack_require__(80799);
- const debug = debugLib('snyk-fix:python:pipenvAdd');
- async function pipenvAdd(entity, options, upgrades) {
- const changes = [];
- let pipenvCommand;
- const { remediation, targetFile } = validate_required_data_1.validateRequiredData(entity);
- try {
- const targetFilePath = pathLib.resolve(entity.workspace.path, targetFile);
- const { dir } = pathLib.parse(targetFilePath);
- if (!options.dryRun && upgrades.length) {
- const { stderr, stdout, command, exitCode, } = await pipenvPipfileFix.pipenvInstall(dir, upgrades, {
- python: entity.options.command,
- });
- debug('`pipenv add` returned:', { stderr, stdout, command });
- if (exitCode !== 0) {
- pipenvCommand = command;
- throwPipenvError(stderr, stdout, command);
- }
- }
- changes.push(...attempted_changes_summary_1.generateSuccessfulChanges(upgrades, remediation.pin));
- }
- catch (error) {
- changes.push(...attempted_changes_summary_1.generateFailedChanges(upgrades, remediation.pin, error, pipenvCommand));
- }
- return changes;
- }
- exports.pipenvAdd = pipenvAdd;
- function throwPipenvError(stderr, stdout, command) {
- const incompatibleDeps = 'There are incompatible versions in the resolved dependencies';
- const lockingFailed = 'Locking failed';
- const versionNotFound = 'Could not find a version that matches';
- const errorsToBubbleUp = [incompatibleDeps, lockingFailed, versionNotFound];
- for (const error of errorsToBubbleUp) {
- if (stderr.toLowerCase().includes(error.toLowerCase()) ||
- stdout.toLowerCase().includes(error.toLowerCase())) {
- throw new command_failed_to_run_error_1.CommandFailedError(error, command);
- }
- }
- const SOLVER_PROBLEM = /SolverProblemError(.* version solving failed)/gms;
- const solverProblemError = SOLVER_PROBLEM.exec(stderr) || SOLVER_PROBLEM.exec(stdout);
- if (solverProblemError) {
- throw new command_failed_to_run_error_1.CommandFailedError(solverProblemError[0].trim(), command);
- }
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError();
- }
- //# sourceMappingURL=pipenv-add.js.map
- /***/ }),
- /***/ 60428:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.poetry = void 0;
- const debugLib = __webpack_require__(15158);
- const ora = __webpack_require__(63395);
- const package_tool_supported_1 = __webpack_require__(96377);
- const update_dependencies_1 = __webpack_require__(61526);
- const debug = debugLib('snyk-fix:python:Poetry');
- async function poetry(fixable, options) {
- debug(`Preparing to fix ${fixable.length} Python Poetry projects`);
- const handlerResult = {
- succeeded: [],
- failed: [],
- skipped: [],
- };
- await package_tool_supported_1.checkPackageToolSupported('poetry', options);
- for (const [index, entity] of fixable.entries()) {
- const spinner = ora({ isSilent: options.quiet, stream: process.stdout });
- const spinnerMessage = `Fixing pyproject.toml ${index + 1}/${fixable.length}`;
- spinner.text = spinnerMessage;
- spinner.start();
- const { failed, succeeded, skipped } = await update_dependencies_1.updateDependencies(entity, options);
- handlerResult.succeeded.push(...succeeded);
- handlerResult.failed.push(...failed);
- handlerResult.skipped.push(...skipped);
- spinner.stop();
- }
- return handlerResult;
- }
- exports.poetry = poetry;
- //# sourceMappingURL=index.js.map
- /***/ }),
- /***/ 84204:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.generateUpgrades = void 0;
- const pathLib = __webpack_require__(85622);
- const toml = __webpack_require__(35424);
- const debugLib = __webpack_require__(15158);
- const validate_required_data_1 = __webpack_require__(57894);
- const standardize_package_name_1 = __webpack_require__(78078);
- const debug = debugLib('snyk-fix:python:Poetry');
- async function generateUpgrades(entity) {
- var _a, _b;
- const { remediation, targetFile } = validate_required_data_1.validateRequiredData(entity);
- const pins = remediation.pin;
- const targetFilePath = pathLib.resolve(entity.workspace.path, targetFile);
- const { dir } = pathLib.parse(targetFilePath);
- const pyProjectTomlRaw = await entity.workspace.readFile(pathLib.resolve(dir, 'pyproject.toml'));
- const pyProjectToml = toml.parse(pyProjectTomlRaw);
- const prodTopLevelDeps = Object.keys((_a = pyProjectToml.tool.poetry.dependencies) !== null && _a !== void 0 ? _a : {}).map((dep) => standardize_package_name_1.standardizePackageName(dep));
- const devTopLevelDeps = Object.keys((_b = pyProjectToml.tool.poetry['dev-dependencies']) !== null && _b !== void 0 ? _b : {}).map((dep) => standardize_package_name_1.standardizePackageName(dep));
- const upgrades = [];
- const devUpgrades = [];
- for (const pkgAtVersion of Object.keys(pins)) {
- const pin = pins[pkgAtVersion];
- const newVersion = pin.upgradeTo.split('@')[1];
- const [pkgName] = pkgAtVersion.split('@');
- const upgrade = `${standardize_package_name_1.standardizePackageName(pkgName)}==${newVersion}`;
- if (pin.isTransitive || prodTopLevelDeps.includes(pkgName)) {
- // transitive and it could have come from a dev or prod dep
- // since we can't tell right now let be pinned into production deps
- upgrades.push(upgrade);
- }
- else if (prodTopLevelDeps.includes(pkgName)) {
- upgrades.push(upgrade);
- }
- else if (entity.options.dev && devTopLevelDeps.includes(pkgName)) {
- devUpgrades.push(upgrade);
- }
- else {
- debug(`Could not determine what type of upgrade ${upgrade} is. When choosing between: transitive upgrade, production or dev direct upgrade. `);
- }
- }
- return { upgrades, devUpgrades };
- }
- exports.generateUpgrades = generateUpgrades;
- //# sourceMappingURL=generate-upgrades.js.map
- /***/ }),
- /***/ 61526:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.updateDependencies = void 0;
- const debugLib = __webpack_require__(15158);
- const generate_upgrades_1 = __webpack_require__(84204);
- const poetry_add_1 = __webpack_require__(24881);
- const no_fixes_applied_1 = __webpack_require__(80799);
- const attempted_changes_summary_1 = __webpack_require__(70145);
- const debug = debugLib('snyk-fix:python:Poetry');
- function chooseFixStrategy(options) {
- return options.sequentialFix ? fixSequentially : fixAll;
- }
- async function updateDependencies(entity, options) {
- const handlerResult = await chooseFixStrategy(options)(entity, options);
- return handlerResult;
- }
- exports.updateDependencies = updateDependencies;
- async function fixAll(entity, options) {
- const handlerResult = {
- succeeded: [],
- failed: [],
- skipped: [],
- };
- const { upgrades, devUpgrades } = await generate_upgrades_1.generateUpgrades(entity);
- // TODO: for better support we need to:
- // 1. parse the manifest and extract original requirements, version spec etc
- // 2. swap out only the version and retain original spec
- // 3. re-lock the lockfile
- const changes = [];
- try {
- if (![...upgrades, ...devUpgrades].length) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError('Failed to calculate package updates to apply');
- }
- // update prod dependencies first
- if (upgrades.length) {
- changes.push(...(await poetry_add_1.poetryAdd(entity, options, upgrades)));
- }
- // update dev dependencies second
- if (devUpgrades.length) {
- const installDev = true;
- changes.push(...(await poetry_add_1.poetryAdd(entity, options, devUpgrades, installDev)));
- }
- if (!changes.length) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError();
- }
- if (!changes.some((c) => attempted_changes_summary_1.isSuccessfulChange(c))) {
- handlerResult.failed.push({
- original: entity,
- changes,
- });
- }
- else {
- handlerResult.succeeded.push({
- original: entity,
- changes,
- });
- }
- }
- catch (error) {
- debug(`Failed to fix ${entity.scanResult.identity.targetFile}.\nERROR: ${error}`);
- handlerResult.failed.push({
- original: entity,
- tip: error.tip,
- error,
- });
- }
- return handlerResult;
- }
- async function fixSequentially(entity, options) {
- const handlerResult = {
- succeeded: [],
- failed: [],
- skipped: [],
- };
- const { upgrades, devUpgrades } = await generate_upgrades_1.generateUpgrades(entity);
- // TODO: for better support we need to:
- // 1. parse the manifest and extract original requirements, version spec etc
- // 2. swap out only the version and retain original spec
- // 3. re-lock the lockfile
- const changes = [];
- try {
- if (![...upgrades, ...devUpgrades].length) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError('Failed to calculate package updates to apply');
- }
- // update prod dependencies first
- if (upgrades.length) {
- for (const upgrade of upgrades) {
- changes.push(...(await poetry_add_1.poetryAdd(entity, options, [upgrade])));
- }
- }
- // update dev dependencies second
- if (devUpgrades.length) {
- for (const upgrade of devUpgrades) {
- const installDev = true;
- changes.push(...(await poetry_add_1.poetryAdd(entity, options, [upgrade], installDev)));
- }
- }
- if (!changes.length) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError();
- }
- if (!changes.some((c) => attempted_changes_summary_1.isSuccessfulChange(c))) {
- handlerResult.failed.push({
- original: entity,
- changes,
- });
- }
- else {
- handlerResult.succeeded.push({
- original: entity,
- changes,
- });
- }
- }
- catch (error) {
- debug(`Failed to fix ${entity.scanResult.identity.targetFile}.\nERROR: ${error}`);
- handlerResult.failed.push({
- original: entity,
- tip: error.tip,
- error,
- });
- }
- return handlerResult;
- }
- //# sourceMappingURL=index.js.map
- /***/ }),
- /***/ 24881:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.poetryAdd = void 0;
- const pathLib = __webpack_require__(85622);
- const debugLib = __webpack_require__(15158);
- const poetryFix = __webpack_require__(69671);
- const validate_required_data_1 = __webpack_require__(57894);
- const attempted_changes_summary_1 = __webpack_require__(70145);
- const command_failed_to_run_error_1 = __webpack_require__(72353);
- const no_fixes_applied_1 = __webpack_require__(80799);
- const debug = debugLib('snyk-fix:python:poetryAdd');
- async function poetryAdd(entity, options, upgrades, dev) {
- var _a;
- const changes = [];
- let poetryCommand;
- const { remediation, targetFile } = validate_required_data_1.validateRequiredData(entity);
- try {
- const targetFilePath = pathLib.resolve(entity.workspace.path, targetFile);
- const { dir } = pathLib.parse(targetFilePath);
- if (!options.dryRun && upgrades.length) {
- const { stderr, stdout, command, exitCode } = await poetryFix.poetryAdd(dir, upgrades, {
- dev,
- python: (_a = entity.options.command) !== null && _a !== void 0 ? _a : undefined,
- });
- debug('`poetry add` returned:', { stderr, stdout, command });
- if (exitCode !== 0) {
- poetryCommand = command;
- throwPoetryError(stderr, stdout, command);
- }
- }
- changes.push(...attempted_changes_summary_1.generateSuccessfulChanges(upgrades, remediation.pin));
- }
- catch (error) {
- changes.push(...attempted_changes_summary_1.generateFailedChanges(upgrades, remediation.pin, error, poetryCommand));
- }
- return changes;
- }
- exports.poetryAdd = poetryAdd;
- function throwPoetryError(stderr, stdout, command) {
- const ALREADY_UP_TO_DATE = 'No dependencies to install or update';
- const INCOMPATIBLE_PYTHON = new RegExp(/Python requirement (.*) is not compatible/g, 'gm');
- const SOLVER_PROBLEM = /SolverProblemError(.* version solving failed)/gms;
- const incompatiblePythonError = INCOMPATIBLE_PYTHON.exec(stderr) || SOLVER_PROBLEM.exec(stdout);
- if (incompatiblePythonError) {
- throw new command_failed_to_run_error_1.CommandFailedError(`The current project's Python requirement ${incompatiblePythonError[1]} is not compatible with some of the required packages`, command);
- }
- const solverProblemError = SOLVER_PROBLEM.exec(stderr) || SOLVER_PROBLEM.exec(stdout);
- if (solverProblemError) {
- throw new command_failed_to_run_error_1.CommandFailedError(solverProblemError[0].trim(), command);
- }
- if (stderr.includes(ALREADY_UP_TO_DATE) ||
- stdout.includes(ALREADY_UP_TO_DATE)) {
- throw new command_failed_to_run_error_1.CommandFailedError('No dependencies could be updated as they seem to be at the correct versions. Make sure installed dependencies in the environment match those in the lockfile by running `poetry update`', command);
- }
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError();
- }
- //# sourceMappingURL=poetry-add.js.map
- /***/ }),
- /***/ 57894:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.validateRequiredData = void 0;
- const missing_remediation_data_1 = __webpack_require__(95084);
- const missing_file_name_1 = __webpack_require__(86920);
- const no_fixes_applied_1 = __webpack_require__(80799);
- function validateRequiredData(entity) {
- const { remediation } = entity.testResult;
- if (!remediation) {
- throw new missing_remediation_data_1.MissingRemediationDataError();
- }
- const { targetFile } = entity.scanResult.identity;
- if (!targetFile) {
- throw new missing_file_name_1.MissingFileNameError();
- }
- const { workspace } = entity;
- if (!workspace) {
- throw new no_fixes_applied_1.NoFixesCouldBeAppliedError();
- }
- return { targetFile, remediation, workspace };
- }
- exports.validateRequiredData = validateRequiredData;
- //# sourceMappingURL=validate-required-data.js.map
- /***/ }),
- /***/ 97090:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.pythonFix = void 0;
- const debugLib = __webpack_require__(15158);
- const pMap = __webpack_require__(54270);
- const ora = __webpack_require__(63395);
- const chalk = __webpack_require__(98250);
- const load_handler_1 = __webpack_require__(7073);
- const map_entities_per_handler_type_1 = __webpack_require__(78646);
- const is_supported_1 = __webpack_require__(60174);
- const debug = debugLib('snyk-fix:python');
- async function pythonFix(entities, options) {
- const spinner = ora({ isSilent: options.quiet, stream: process.stdout });
- const spinnerMessage = 'Looking for supported Python items';
- spinner.text = spinnerMessage;
- spinner.start();
- const handlerResult = {
- python: {
- succeeded: [],
- failed: [],
- skipped: [],
- },
- };
- const results = handlerResult.python;
- const { entitiesPerType, skipped: notSupported } = map_entities_per_handler_type_1.mapEntitiesPerHandlerType(entities);
- results.skipped.push(...notSupported);
- spinner.stopAndPersist({
- text: spinnerMessage,
- symbol: chalk.green('\n✔'),
- });
- await pMap(Object.keys(entitiesPerType), async (projectType) => {
- const projectsToFix = entitiesPerType[projectType];
- if (!projectsToFix.length) {
- return;
- }
- const processingMessage = `Processing ${projectsToFix.length} ${projectType} items`;
- const processedMessage = `Processed ${projectsToFix.length} ${projectType} items`;
- spinner.text = processingMessage;
- spinner.render();
- try {
- const handler = load_handler_1.loadHandler(projectType);
- // drop unsupported Python entities early so only potentially fixable items get
- // attempted to be fixed
- const { fixable, skipped: notFixable } = await is_supported_1.partitionByFixable(projectsToFix);
- results.skipped.push(...notFixable);
- const { failed, skipped, succeeded } = await handler(fixable, options);
- results.failed.push(...failed);
- results.skipped.push(...skipped);
- results.succeeded.push(...succeeded);
- }
- catch (e) {
- debug(`Failed to fix ${projectsToFix.length} ${projectType} projects.\nError: ${e.message}`);
- results.failed.push(...generateFailed(projectsToFix, e));
- }
- spinner.stopAndPersist({
- text: processedMessage,
- symbol: chalk.green('✔'),
- });
- }, {
- concurrency: 5,
- });
- return handlerResult;
- }
- exports.pythonFix = pythonFix;
- function generateFailed(projectsToFix, error) {
- const failed = [];
- for (const project of projectsToFix) {
- failed.push({ original: project, error: error });
- }
- return failed;
- }
- //# sourceMappingURL=index.js.map
- /***/ }),
- /***/ 7073:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.loadHandler = void 0;
- const pip_requirements_1 = __webpack_require__(81065);
- const pipenv_pipfile_1 = __webpack_require__(28006);
- const poetry_1 = __webpack_require__(60428);
- const supported_handler_types_1 = __webpack_require__(56394);
- function loadHandler(type) {
- switch (type) {
- case supported_handler_types_1.SUPPORTED_HANDLER_TYPES.REQUIREMENTS: {
- return pip_requirements_1.pipRequirementsTxt;
- }
- case supported_handler_types_1.SUPPORTED_HANDLER_TYPES.PIPFILE: {
- return pipenv_pipfile_1.pipenvPipfile;
- }
- case supported_handler_types_1.SUPPORTED_HANDLER_TYPES.POETRY: {
- return poetry_1.poetry;
- }
- default: {
- throw new Error('No handler available for requested project type');
- }
- }
- }
- exports.loadHandler = loadHandler;
- //# sourceMappingURL=load-handler.js.map
- /***/ }),
- /***/ 78646:
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.mapEntitiesPerHandlerType = void 0;
- const debugLib = __webpack_require__(15158);
- const get_handler_type_1 = __webpack_require__(10774);
- const supported_handler_types_1 = __webpack_require__(56394);
- const debug = debugLib('snyk-fix:python');
- function mapEntitiesPerHandlerType(entities) {
- const entitiesPerType = {
- [supported_handler_types_1.SUPPORTED_HANDLER_TYPES.REQUIREMENTS]: [],
- [supported_handler_types_1.SUPPORTED_HANDLER_TYPES.PIPFILE]: [],
- [supported_handler_types_1.SUPPORTED_HANDLER_TYPES.POETRY]: [],
- };
- const skipped = [];
- for (const entity of entities) {
- const type = get_handler_type_1.getHandlerType(entity);
- if (type) {
- entitiesPerType[type].push(entity);
- continue;
- }
- const userMessage = `${entity.scanResult.identity.targetFile} is not supported`;
- debug(userMessage);
- skipped.push({ original: entity, userMessage });
- }
- return { entitiesPerType, skipped };
- }
- exports.mapEntitiesPerHandlerType = mapEntitiesPerHandlerType;
- //# sourceMappingURL=map-entities-per-handler-type.js.map
- /***/ }),
- /***/ 78078:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.standardizePackageName = void 0;
- /*
- * https://www.python.org/dev/peps/pep-0426/#name
- * All comparisons of distribution names MUST be case insensitive,
- * and MUST consider hyphens and underscores to be equivalent.
- *
- */
- function standardizePackageName(name) {
- return name.replace('_', '-').toLowerCase();
- }
- exports.standardizePackageName = standardizePackageName;
- //# sourceMappingURL=standardize-package-name.js.map
- /***/ }),
- /***/ 56394:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.SUPPORTED_HANDLER_TYPES = void 0;
- var SUPPORTED_HANDLER_TYPES;
- (function (SUPPORTED_HANDLER_TYPES) {
- // shortname = display name
- SUPPORTED_HANDLER_TYPES["REQUIREMENTS"] = "requirements.txt";
- SUPPORTED_HANDLER_TYPES["PIPFILE"] = "Pipfile";
- SUPPORTED_HANDLER_TYPES["POETRY"] = "pyproject.toml";
- })(SUPPORTED_HANDLER_TYPES = exports.SUPPORTED_HANDLER_TYPES || (exports.SUPPORTED_HANDLER_TYPES = {}));
- //# sourceMappingURL=supported-handler-types.js.map
- /***/ }),
- /***/ 71538:
- /***/ ((__unused_webpack_module, exports) => {
- Object.defineProperty(exports, "__esModule", ({ value: true }));
- exports.isWithError = void 0;
- function isWithError(r) {
- return 'error' in r;
- }
- exports.isWithError = isWithError;
- //# sourceMappingURL=types.js.map
- /***/ })
- };
- ;
- //# sourceMappingURL=741.index.js.map
|