Skip to content

Commit

Permalink
feat: adds conditional dotnet target frameworks to dep tree.
Browse files Browse the repository at this point in the history
BREAKING CHANGE: For consistency the parser now returns target frameworks as an array with a pluralised key of targetFrameworks.
  • Loading branch information
Ryan Taylor committed Jan 22, 2019
1 parent d205c24 commit 6e97e9e
Show file tree
Hide file tree
Showing 9 changed files with 229 additions and 32 deletions.
40 changes: 34 additions & 6 deletions lib/parsers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export interface PkgTree {
}

export interface DotnetDepsPkgTree extends PkgTree {
targetFramework?: string;
targetFrameworks?: string[];
}

export enum DepType {
Expand Down Expand Up @@ -119,7 +119,7 @@ function buildSubTreeFromPackagesConfig(dep, isDev: boolean): DotnetDepsPkgTree
};

if (dep.$.targetFramework) {
depSubTree.targetFramework = dep.$.targetFramework;
depSubTree.targetFrameworks = [dep.$.targetFramework];
}

return depSubTree;
Expand Down Expand Up @@ -167,14 +167,18 @@ async function getDependenciesFromPackageReference(manifestFile, includeDev: boo
return dependenciesResult;
}

const targetFrameworks: string[] = _.get(packageList, '$.Condition', false) ?
getConditionalFrameworks(packageList.$.Condition) : [];

for (const dep of packageList.PackageReference) {
const depName = dep.$.Include;
const isDev = !!dep.$.developmentDependency;
dependenciesResult.hasDevDependencies = dependenciesResult.hasDevDependencies || isDev;
if (isDev && !includeDev) {
continue;
}
dependenciesResult.dependencies[depName] = buildSubTreeFromPackageReference(dep, isDev, manifestFile);
dependenciesResult.dependencies[depName] = buildSubTreeFromPackageReference(
dep, isDev, manifestFile, targetFrameworks);
}

return dependenciesResult;
Expand All @@ -196,6 +200,9 @@ async function getDependenciesFromReferenceInclude(manifestFile, includeDev: boo
return referenceIncludeResult;
}

const targetFrameworks: string[] = _.get(referenceIncludeList, '$.Condition', false) ?
getConditionalFrameworks(referenceIncludeList.$.Condition) : [];

for (const item of referenceIncludeList.Reference) {
const propertiesList = item.$.Include.split(',').map((i) => i.trim());
const [depName, ...depInfoArray] = propertiesList;
Expand All @@ -206,29 +213,38 @@ async function getDependenciesFromReferenceInclude(manifestFile, includeDev: boo
depInfo[propertyValuePair[0]] = propertyValuePair[1];
}

const dependency: PkgTree = {
const dependency: DotnetDepsPkgTree = {
// TODO: correctly identify what makes the dep be dev only
depType: DepType.prod,
dependencies: {},
name: depName,
version: depInfo.Version || '',
};

if (targetFrameworks.length) {
dependency.targetFrameworks = targetFrameworks;
}

referenceIncludeResult.dependencies[depName] = dependency;
}
return referenceIncludeResult;
}

function buildSubTreeFromPackageReference(dep, isDev: boolean, manifestFile): PkgTree {
function buildSubTreeFromPackageReference(dep, isDev: boolean, manifestFile, targetFrameworks: string[]):
DotnetDepsPkgTree {

const depSubTree: PkgTree = {
const depSubTree: DotnetDepsPkgTree = {
depType: isDev ? DepType.dev : DepType.prod,
dependencies: {},
name: dep.$.Include,
// Version could be in attributes or as child node.
version: extractDependencyVersion(dep, manifestFile),
};

if (targetFrameworks.length) {
depSubTree.targetFrameworks = targetFrameworks;
}

return depSubTree;
}

Expand All @@ -246,7 +262,19 @@ function extractDependencyVersion(dep, manifestFile) {
.find((propertyGroup) => _.has(propertyGroup, propertyName));

return versionProperty[propertyName][0];
}

function getConditionalFrameworks(condition: string) {
const regexp = /\(TargetFramework\)'\s?==\s? '((\w|\d|\.)*)'/g;
const frameworks: string[] = [];
let match = regexp.exec(condition);

while (match !== null) {
frameworks.push(match[1]);
match = regexp.exec(condition);
}

return frameworks;
}

export async function parseManifestFile(manifestFileContents: string) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<PackageId>LiteDB</PackageId>
<Version>4.1.5</Version>
<AssemblyVersion>4.1.5.0</AssemblyVersion>
<FileVersion>4.1.5</FileVersion>
<VersionPrefix>4.1.5</VersionPrefix>
<Authors>Maurício David</Authors>
<Product>LiteDB</Product>
<Description>LiteDB - A lightweight embedded .NET NoSQL document store in a single datafile</Description>
<Copyright>MIT</Copyright>
<NeutralLanguage>en-US</NeutralLanguage>
<Title>LiteDB</Title>
<PackageId>LiteDB</PackageId>
<PackageTags>database nosql embedded</PackageTags>
<PackageIconUrl>http://www.litedb.org/img/logo_64x64.png</PackageIconUrl>
<PackageProjectUrl>https://www.litedb.org</PackageProjectUrl>
<PackageLicenseUrl>https://raw.github.com/mbdavid/LiteDB/master/LICENSE</PackageLicenseUrl>
<RepositoryUrl>https://github.com/mbdavid/LiteDB</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<RootNamespace>LiteDB</RootNamespace>
<AssemblyName>LiteDB</AssemblyName>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<NetStandardImplicitPackageVersion Condition=" '$(TargetFramework)' == 'netstandard1.3' ">1.6.1</NetStandardImplicitPackageVersion>
<NoWarn>1701;1702;1705;1591;0618</NoWarn>
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\LiteDB.xml</DocumentationFile>
<SignAssembly Condition="'$(OS)'=='Windows_NT'">true</SignAssembly>
<AssemblyOriginatorKeyFile>LiteDB.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard1.3' OR '$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="System.Reflection" Version="4.3.0" />
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.3.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard3.0'">
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Web.DynamicData" />
<Reference Include="System.Web.Entity" />
</ItemGroup>

</Project>
64 changes: 64 additions & 0 deletions test/fixtures/dotnet-conditional-frameworks/expected-tree.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{
"dependencies":{
"System.Reflection":{
"depType":"prod",
"dependencies":{

},
"name":"System.Reflection",
"version":"4.3.0",
"targetFrameworks":[
"netstandard1.3",
"netstandard2.0"
]
},
"System.Reflection.TypeExtensions":{
"depType":"prod",
"dependencies":{

},
"name":"System.Reflection.TypeExtensions",
"version":"4.3.0",
"targetFrameworks":[
"netstandard1.3",
"netstandard2.0"
]
},
"Microsoft.CSharp":{
"depType":"prod",
"dependencies":{

},
"name":"Microsoft.CSharp",
"version":"",
"targetFrameworks":[
"netstandard3.0"
]
},
"System.Web.DynamicData":{
"depType":"prod",
"dependencies":{

},
"name":"System.Web.DynamicData",
"version":"",
"targetFrameworks":[
"netstandard3.0"
]
},
"System.Web.Entity":{
"depType":"prod",
"dependencies":{

},
"name":"System.Web.Entity",
"version":"",
"targetFrameworks":[
"netstandard3.0"
]
}
},
"hasDevDependencies":false,
"name":"LiteDB",
"version":""
}
Loading

0 comments on commit 6e97e9e

Please sign in to comment.