Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ namespace Microsoft.ComponentDetection.Detectors.Npm;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
Expand Down Expand Up @@ -88,7 +89,31 @@ protected virtual bool ProcessIndividualPackageJTokens(string filePath, ISingleF
return false;
}

if (enginesToken != null && enginesToken["vscode"] != null)
var containsVsCodeEngine = false;
if (enginesToken != null)
{
if (enginesToken.Type == JTokenType.Array)
{
var engineStrings = enginesToken
.Children()
.Where(t => t.Type == JTokenType.String)
.Select(t => t.ToString())
.ToArray();
if (engineStrings.Any(e => e.Contains("vscode")))
{
containsVsCodeEngine = true;
}
}
else if (enginesToken.Type == JTokenType.Object)
{
if (enginesToken["vscode"] != null)
{
containsVsCodeEngine = true;
}
}
}

if (containsVsCodeEngine)
{
this.Logger.LogInformation("{NpmPackageName} found at path {NpmPackageLocation} represents a built-in VS Code extension. This package will not be registered.", name, filePath);
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,44 @@ public async Task TestNpmDetector_VSCodeEngineCausesSkippedPackageAsync()
detectedComponents.Should().BeEmpty();
}

[TestMethod]
public async Task TestNpmDetector_EnginesAsArray_VSCodeEngine()
{
var packageName = GetRandomString();
var packageVersion = NewRandomVersion();
var engineText = "vscode >= 6.0";
var (packageJsonName, packageJsonContents, packageJsonPath) =
NpmTestUtilities.GetPackageJsonNoDependenciesForNameAndVersionWithEngiesAsArray(packageName, packageVersion, engineText);

var (scanResult, componentRecorder) = await this.DetectorTestUtility
.WithFile(packageJsonName, packageJsonContents, this.packageJsonSearchPattern, fileLocation: packageJsonPath)
.ExecuteDetectorAsync();
scanResult.ResultCode.Should().Be(ProcessingResultCode.Success);
var detectedComponents = componentRecorder.GetDetectedComponents();
detectedComponents.Should().BeEmpty();
}

[TestMethod]
public async Task TestNpmDetector_EnginesAsArray_NodeEngine()
{
var packageName = GetRandomString();
var packageVersion = NewRandomVersion();
var engineText = "node >= 6.0";
var (packageJsonName, packageJsonContents, packageJsonPath) =
NpmTestUtilities.GetPackageJsonNoDependenciesForNameAndVersionWithEngiesAsArray(packageName, packageVersion, engineText);

var (scanResult, componentRecorder) = await this.DetectorTestUtility
.WithFile(packageJsonName, packageJsonContents, this.packageJsonSearchPattern, fileLocation: packageJsonPath)
.ExecuteDetectorAsync();
scanResult.ResultCode.Should().Be(ProcessingResultCode.Success);
var detectedComponents = componentRecorder.GetDetectedComponents();
detectedComponents.Should().ContainSingle();
detectedComponents.Single().Component.Type.Should().Be(ComponentType.Npm);
var detectedNpmComponent = (NpmComponent)detectedComponents.Single().Component;
detectedNpmComponent.Name.Should().Be(packageName);
detectedNpmComponent.Version.Should().Be(packageVersion);
}

private static void AssertDetectedComponentCount(IEnumerable<DetectedComponent> detectedComponents, int expectedCount)
{
detectedComponents.Should().HaveCount(expectedCount);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,19 @@ public static (string PackageJsonName, string PackageJsonContents, string Packag
return ("package.json", packageJsonTemplate, Path.Combine(Path.GetTempPath(), "package.json"));
}

public static (string PackageJsonName, string PackageJsonContents, string PackageJsonPath) GetPackageJsonNoDependenciesForNameAndVersionWithEngiesAsArray(string packageName, string packageVersion, string engineText)
{
var packagejson = @"{{
""name"": ""{0}"",
""version"": ""{1}"",
""engines"": [
""{2}""
]
}}";
var packageJsonTemplate = string.Format(packagejson, packageName, packageVersion, engineText);
return ("package.json", packageJsonTemplate, Path.Combine(Path.GetTempPath(), "package.json"));
}

public static (string PackageJsonName, string PackageJsonContents, string PackageJsonPath) GetPackageJsonNoDependenciesForAuthorAndEmailInJsonFormat(
string authorName, string authorEmail = null)
{
Expand Down