Skip to content

Commit 80179e4

Browse files
committed
feat: add advanced package manager detection
1 parent 14d1f71 commit 80179e4

File tree

12 files changed

+202
-9
lines changed

12 files changed

+202
-9
lines changed

package-lock.json

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
"@snyk/gemfile": "1.2.0",
7373
"@snyk/snyk-cocoapods-plugin": "3.1.0",
7474
"@snyk/snyk-hex-plugin": "2.1.0",
75+
"@snyk/package-manager-detection": "^1.3.0",
7576
"@types/jest-json-schema": "^6.1.1",
7677
"@types/marked": "^4.0.0",
7778
"abbrev": "^1.1.1",

src/cli/commands/monitor/index.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import {
5353
PNPM_FEATURE_FLAG,
5454
DOTNET_WITHOUT_PUBLISH_FEATURE_FLAG,
5555
MAVEN_DVERBOSE_EXHAUSTIVE_DEPS_FF,
56+
ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG,
5657
} from '../../../lib/package-managers';
5758
import { normalizeTargetFile } from '../../../lib/normalize-target-file';
5859

@@ -167,6 +168,8 @@ export default async function monitor(...args0: MethodArgs): Promise<any> {
167168
let hasPnpmSupport = false;
168169
let hasImprovedDotnetWithoutPublish = false;
169170
let enableMavenDverboseExhaustiveDeps = false;
171+
let enableAdvancedPackageManagerDetection = false;
172+
170173
try {
171174
hasPnpmSupport = (await hasFeatureFlag(
172175
PNPM_FEATURE_FLAG,
@@ -182,6 +185,15 @@ export default async function monitor(...args0: MethodArgs): Promise<any> {
182185
hasPnpmSupport = false;
183186
}
184187

188+
try {
189+
enableAdvancedPackageManagerDetection = (await hasFeatureFlag(
190+
ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG,
191+
options,
192+
)) as boolean;
193+
} catch (err) {
194+
enableAdvancedPackageManagerDetection = false;
195+
}
196+
185197
try {
186198
const args = options['_doubleDashArgs'] || [];
187199
const verboseEnabled =
@@ -202,9 +214,13 @@ export default async function monitor(...args0: MethodArgs): Promise<any> {
202214
enableMavenDverboseExhaustiveDeps = false;
203215
}
204216

205-
const featureFlags = hasPnpmSupport
206-
? new Set<string>([PNPM_FEATURE_FLAG])
207-
: new Set<string>();
217+
const featureFlags = new Set<string>();
218+
if (hasPnpmSupport) {
219+
featureFlags.add(PNPM_FEATURE_FLAG);
220+
}
221+
if (enableAdvancedPackageManagerDetection) {
222+
featureFlags.add(ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG);
223+
}
208224

209225
if (hasImprovedDotnetWithoutPublish) {
210226
options.useImprovedDotnetWithoutPublish = true;

src/lib/detect.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import {
66
SupportedPackageManagers,
77
SUPPORTED_MANIFEST_FILES,
88
PNPM_FEATURE_FLAG,
9+
ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG,
910
} from './package-managers';
11+
import { detectPackageManagerFromFile as advancedDetectPackageManagerFromFile } from '@snyk/package-manager-detection';
1012

1113
const debug = debugLib('snyk-detect');
1214

@@ -70,6 +72,9 @@ export const AUTO_DETECTABLE_FILES: string[] = [
7072

7173
// when file is specified with --file, we look it up here
7274
// this is also used when --all-projects flag is enabled and auto detection plugin is triggered
75+
/**
76+
* @deprecated Any change here should be reflected in the package @snyk/package-manager-detection
77+
*/
7378
const DETECTABLE_PACKAGE_MANAGERS: {
7479
[key in SUPPORTED_MANIFEST_FILES]: SupportedPackageManagers;
7580
} = {
@@ -218,6 +223,18 @@ export function detectPackageFile(
218223
export function detectPackageManagerFromFile(
219224
file: string,
220225
featureFlags: Set<string> = new Set<string>(),
226+
): SupportedPackageManagers {
227+
if (featureFlags.has(ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG)) {
228+
debug(`using advanced package manager detection for ${file}`);
229+
return advancedDetectPackageManagerFromFile(file, featureFlags);
230+
}
231+
232+
return legacyDetectPackageManagerFromFile(file, featureFlags);
233+
}
234+
235+
function legacyDetectPackageManagerFromFile(
236+
file: string,
237+
featureFlags: Set<string> = new Set<string>(),
221238
): SupportedPackageManagers {
222239
let key = pathLib.basename(file);
223240

src/lib/package-managers.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@ export const DOTNET_WITHOUT_PUBLISH_FEATURE_FLAG =
33
'useImprovedDotnetWithoutPublish';
44
export const MAVEN_DVERBOSE_EXHAUSTIVE_DEPS_FF =
55
'enableMavenDverboseExhaustiveDeps';
6+
export const ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG =
7+
'enableAdvancedPackageManagerDetection';
68

9+
/**
10+
* @deprecated Any change here should be reflected in the package @snyk/package-manager-detection
11+
*/
712
export type SupportedPackageManagers =
813
| 'rubygems'
914
| 'npm'
@@ -25,6 +30,9 @@ export type SupportedPackageManagers =
2530
| 'Unmanaged (C/C++)'
2631
| 'swift';
2732

33+
/**
34+
* @deprecated Any change here should be reflected in the package @snyk/package-manager-detection
35+
*/
2836
export enum SUPPORTED_MANIFEST_FILES {
2937
GEMFILE = 'Gemfile',
3038
GEMFILE_LOCK = 'Gemfile.lock',

src/lib/snyk-test/index.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const {
1111
PNPM_FEATURE_FLAG,
1212
DOTNET_WITHOUT_PUBLISH_FEATURE_FLAG,
1313
MAVEN_DVERBOSE_EXHAUSTIVE_DEPS_FF,
14+
ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG,
1415
} = require('../package-managers');
1516

1617
async function test(root, options, callback) {
@@ -36,6 +37,8 @@ async function executeTest(root, options) {
3637
let hasPnpmSupport = false;
3738
let hasImprovedDotnetWithoutPublish = false;
3839
let enableMavenDverboseExhaustiveDeps = false;
40+
let enableAdvancedPackageManagerDetection = false;
41+
3942
try {
4043
hasPnpmSupport = await hasFeatureFlag(PNPM_FEATURE_FLAG, options);
4144
if (options['dotnet-runtime-resolution']) {
@@ -51,6 +54,15 @@ async function executeTest(root, options) {
5154
hasPnpmSupport = false;
5255
}
5356

57+
try {
58+
enableAdvancedPackageManagerDetection = await hasFeatureFlag(
59+
ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG,
60+
options,
61+
);
62+
} catch (err) {
63+
enableAdvancedPackageManagerDetection = false;
64+
}
65+
5466
try {
5567
const args = options['_doubleDashArgs'] || [];
5668
const verboseEnabled =
@@ -72,9 +84,13 @@ async function executeTest(root, options) {
7284
}
7385

7486
try {
75-
const featureFlags = hasPnpmSupport
76-
? new Set([PNPM_FEATURE_FLAG])
77-
: new Set([]);
87+
const featureFlags = new Set();
88+
if (hasPnpmSupport) {
89+
featureFlags.add(PNPM_FEATURE_FLAG);
90+
}
91+
if (enableAdvancedPackageManagerDetection) {
92+
featureFlags.add(ADVANCED_PACKAGE_MANAGER_DETECTION_FLAG);
93+
}
7894

7995
if (!options.allProjects) {
8096
options.packageManager = detect.detectPackageManager(

test/acceptance/fake-server.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const featureFlagDefaults = (): Map<string, boolean> => {
1717
['enablePnpmCli', false],
1818
['sbomMonitorBeta', false],
1919
['useImprovedDotnetWithoutPublish', false],
20+
['enableAdvancedPackageManagerDetection', false],
2021

2122
// Default these to false.
2223
// TODO: Future acceptance tests targeting these features and their
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"$schema": "./node_modules/nx/schemas/nx-schema.json"
3+
}

test/fixtures/npm-nx-build-platform/package-lock.json

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"name": "with-vulnerable-lodash-dep",
3+
"version": "1.2.3",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"keywords": [],
10+
"license": "ISC",
11+
"dependencies": {
12+
"lodash": "4.17.15"
13+
}
14+
}

0 commit comments

Comments
 (0)