Skip to content

Commit a209393

Browse files
authored
Register VS Code built-in packages as skipped (#1348)
* Register VS Code built-in packages as skipped
1 parent 14b3ed3 commit a209393

File tree

3 files changed

+72
-8
lines changed

3 files changed

+72
-8
lines changed

src/Microsoft.ComponentDetection.Detectors/npm/NpmComponentDetector.cs

+8-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public NpmComponentDetector(
4040

4141
public override IEnumerable<ComponentType> SupportedComponentTypes { get; } = [ComponentType.Npm];
4242

43-
public override int Version { get; } = 2;
43+
public override int Version { get; } = 3;
4444

4545
protected override async Task OnFileFoundAsync(ProcessRequest processRequest, IDictionary<string, string> detectorArgs, CancellationToken cancellationToken = default)
4646
{
@@ -79,6 +79,7 @@ protected virtual bool ProcessIndividualPackageJTokens(string filePath, ISingleF
7979
var name = packageJToken["name"].ToString();
8080
var version = packageJToken["version"].ToString();
8181
var authorToken = packageJToken["author"];
82+
var enginesToken = packageJToken["engines"];
8283

8384
if (!SemanticVersion.TryParse(version, out _))
8485
{
@@ -87,6 +88,12 @@ protected virtual bool ProcessIndividualPackageJTokens(string filePath, ISingleF
8788
return false;
8889
}
8990

91+
if (enginesToken != null && enginesToken["vscode"] != null)
92+
{
93+
this.Logger.LogInformation("{NpmPackageName} found at path {NpmPackageLocation} represents a built-in VS Code extension. This package will not be registered.", name, filePath);
94+
return false;
95+
}
96+
9097
var npmComponent = new NpmComponent(name, version, author: this.GetAuthor(authorToken, name, filePath));
9198

9299
singleFileComponentRecorder.RegisterUsage(new DetectedComponent(npmComponent));

test/Microsoft.ComponentDetection.Detectors.Tests/NpmDetectorTests.cs

+38-7
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ public async Task TestNpmDetector_AuthorNameAndAuthorEmailDetected_WhenAuthorNam
7878
{
7979
var authorName = GetRandomString();
8080
var authorEmail = GetRandomString();
81-
var authroUrl = GetRandomString();
81+
var authorUrl = GetRandomString();
8282
var (packageJsonName, packageJsonContents, packageJsonPath) =
83-
NpmTestUtilities.GetPackageJsonNoDependenciesForAuthorAndEmailAsSingleString(authorName, authorEmail, authroUrl);
83+
NpmTestUtilities.GetPackageJsonNoDependenciesForAuthorAndEmailAsSingleString(authorName, authorEmail, authorUrl);
8484

8585
var (scanResult, componentRecorder) = await this.DetectorTestUtility
8686
.WithFile(packageJsonName, packageJsonContents, this.packageJsonSearchPattern, fileLocation: packageJsonPath)
@@ -97,9 +97,9 @@ public async Task TestNpmDetector_AuthorNameAndAuthorEmailDetected_WhenAuthorNam
9797
public async Task TestNpmDetector_AuthorNameDetected_WhenEmailNotPresentAndUrlIsPresent_AuthorAsSingleStringAsync()
9898
{
9999
var authorName = GetRandomString();
100-
var authroUrl = GetRandomString();
100+
var authorUrl = GetRandomString();
101101
var (packageJsonName, packageJsonContents, packageJsonPath) =
102-
NpmTestUtilities.GetPackageJsonNoDependenciesForAuthorAndEmailAsSingleString(authorName, null, authroUrl);
102+
NpmTestUtilities.GetPackageJsonNoDependenciesForAuthorAndEmailAsSingleString(authorName, null, authorUrl);
103103

104104
var (scanResult, componentRecorder) = await this.DetectorTestUtility
105105
.WithFile(packageJsonName, packageJsonContents, this.packageJsonSearchPattern, fileLocation: packageJsonPath)
@@ -116,10 +116,10 @@ public async Task TestNpmDetector_AuthorNameDetected_WhenEmailNotPresentAndUrlIs
116116
public async Task TestNpmDetector_AuthorNull_WhenAuthorMalformed_AuthorAsSingleStringAsync()
117117
{
118118
var authorName = GetRandomString();
119-
var authroUrl = GetRandomString();
119+
var authorUrl = GetRandomString();
120120
var authorEmail = GetRandomString();
121121
var (packageJsonName, packageJsonContents, packageJsonPath) =
122-
NpmTestUtilities.GetPackageJsonNoDependenciesMalformedAuthorAsSingleString(authorName, authorEmail, authroUrl);
122+
NpmTestUtilities.GetPackageJsonNoDependenciesMalformedAuthorAsSingleString(authorName, authorEmail, authorUrl);
123123

124124
var (scanResult, componentRecorder) = await this.DetectorTestUtility
125125
.WithFile(packageJsonName, packageJsonContents, this.packageJsonSearchPattern, fileLocation: packageJsonPath)
@@ -135,7 +135,6 @@ public async Task TestNpmDetector_AuthorNull_WhenAuthorMalformed_AuthorAsSingleS
135135
public async Task TestNpmDetector_AuthorNameDetected_WhenEmailNotPresentAndUrlNotPresent_AuthorAsSingleStringAsync()
136136
{
137137
var authorName = GetRandomString();
138-
var authroUrl = GetRandomString();
139138
var (packageJsonName, packageJsonContents, packageJsonPath) =
140139
NpmTestUtilities.GetPackageJsonNoDependenciesForAuthorAndEmailAsSingleString(authorName);
141140

@@ -208,6 +207,38 @@ public async Task TestNpmDetector_NullAuthor_WhenAuthorNameIsNullOrEmpty_AuthorA
208207
((NpmComponent)detectedComponents.First().Component).Author.Should().BeNull();
209208
}
210209

210+
[TestMethod]
211+
public async Task TestNpmDetector_NodeEngineDoesNotCauseSkippedPackageAsync()
212+
{
213+
var componentName = GetRandomString();
214+
var version = NewRandomVersion();
215+
var (packageJsonName, packageJsonContents, packageJsonPath) =
216+
NpmTestUtilities.GetPackageJsonNoDependenciesForNameAndVersionWithNodeEngine(componentName, version);
217+
218+
var (scanResult, componentRecorder) = await this.DetectorTestUtility
219+
.WithFile(packageJsonName, packageJsonContents, this.packageJsonSearchPattern, fileLocation: packageJsonPath)
220+
.ExecuteDetectorAsync();
221+
scanResult.ResultCode.Should().Be(ProcessingResultCode.Success);
222+
var detectedComponents = componentRecorder.GetDetectedComponents();
223+
detectedComponents.Should().ContainSingle();
224+
}
225+
226+
[TestMethod]
227+
public async Task TestNpmDetector_VSCodeEngineCausesSkippedPackageAsync()
228+
{
229+
var componentName = GetRandomString();
230+
var version = NewRandomVersion();
231+
var (packageJsonName, packageJsonContents, packageJsonPath) =
232+
NpmTestUtilities.GetPackageJsonNoDependenciesForNameAndVersionWithVSCodeEngine(componentName, version);
233+
234+
var (scanResult, componentRecorder) = await this.DetectorTestUtility
235+
.WithFile(packageJsonName, packageJsonContents, this.packageJsonSearchPattern, fileLocation: packageJsonPath)
236+
.ExecuteDetectorAsync();
237+
scanResult.ResultCode.Should().Be(ProcessingResultCode.Success);
238+
var detectedComponents = componentRecorder.GetDetectedComponents();
239+
detectedComponents.Should().BeEmpty();
240+
}
241+
211242
private static void AssertDetectedComponentCount(IEnumerable<DetectedComponent> detectedComponents, int expectedCount)
212243
{
213244
detectedComponents.Should().HaveCount(expectedCount);

test/Microsoft.ComponentDetection.Detectors.Tests/NpmTestUtilities.cs

+26
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,32 @@ public static (string PackageJsonName, string PackageJsonContents, string Packag
117117
return ("package.json", packageJsonTemplate, Path.Combine(Path.GetTempPath(), "package.json"));
118118
}
119119

120+
public static (string PackageJsonName, string PackageJsonContents, string PackageJsonPath) GetPackageJsonNoDependenciesForNameAndVersionWithNodeEngine(string packageName, string packageVersion)
121+
{
122+
var packagejson = @"{{
123+
""name"": ""{0}"",
124+
""version"": ""{1}"",
125+
""engines"": {{
126+
""node"": ""^20.0.0""
127+
}}
128+
}}";
129+
var packageJsonTemplate = string.Format(packagejson, packageName, packageVersion);
130+
return ("package.json", packageJsonTemplate, Path.Combine(Path.GetTempPath(), "package.json"));
131+
}
132+
133+
public static (string PackageJsonName, string PackageJsonContents, string PackageJsonPath) GetPackageJsonNoDependenciesForNameAndVersionWithVSCodeEngine(string packageName, string packageVersion)
134+
{
135+
var packagejson = @"{{
136+
""name"": ""{0}"",
137+
""version"": ""{1}"",
138+
""engines"": {{
139+
""vscode"": ""^1.0.0""
140+
}}
141+
}}";
142+
var packageJsonTemplate = string.Format(packagejson, packageName, packageVersion);
143+
return ("package.json", packageJsonTemplate, Path.Combine(Path.GetTempPath(), "package.json"));
144+
}
145+
120146
public static (string PackageJsonName, string PackageJsonContents, string PackageJsonPath) GetPackageJsonNoDependenciesForAuthorAndEmailInJsonFormat(
121147
string authorName, string authorEmail = null)
122148
{

0 commit comments

Comments
 (0)