Skip to content

Commit

Permalink
Add user secrets support. #1.
Browse files Browse the repository at this point in the history
  • Loading branch information
olsh committed Sep 6, 2016
1 parent 7c081dd commit 494a536
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 5 deletions.
4 changes: 4 additions & 0 deletions src/Resharper.ConfigurationSense/Constants/FileNames.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ internal static class FileNames

public const string NetCoreJsonSettings = "appsettings.json";

public const string NetCoreProjectJson = "project.json";

public const string UserSecretsPathFormat = @"{0}\microsoft\UserSecrets\{1}\secrets.json";

public const string WebConfig = "web.config";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,7 @@ internal static class SettingsConstants
public const string ExternalConfigTagName = "configSource";

public const string NetCoreConnectionStringsJsonPath = "ConnectionStrings:";

public const string NetCoreUserSecretsIdJsonProperty = "userSecretsId";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System.Collections.Generic;

namespace Resharper.ConfigurationSense.Extensions
{
internal static class CollectionExtensions
{
public static void EnqueueRange<T>(this Queue<T> queue, IEnumerable<T> range)
{
foreach (var item in range)
{
queue.Enqueue(item);
}
}
}
}
53 changes: 48 additions & 5 deletions src/Resharper.ConfigurationSense/Extensions/ProjectExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.IO;

using JetBrains.Annotations;
using JetBrains.ProjectModel;
using JetBrains.ReSharper.Psi;
using JetBrains.ReSharper.Psi.Util;
Expand Down Expand Up @@ -29,14 +31,15 @@ public static class ProjectExtensions
var settings = new HashSet<KeyValueSetting>(KeyValueSetting.KeyComparer);
foreach (var projectFile in configFiles)
{
var primaryPsiFile = projectFile.GetPrimaryPsiFile();
var text = primaryPsiFile.GetUnquotedText();
var json = JObject.Parse(text);
var json = ParseJsonProjectFile(projectFile);

var properties = new Queue<JProperty>();
foreach (var property in json.Properties())
properties.EnqueueRange(json.Properties());

var secretsJson = ReadSecretsJsonSafe(project);
if (secretsJson != null)
{
properties.Enqueue(property);
properties.EnqueueRange(secretsJson.Properties());
}

while (properties.Count > 0)
Expand Down Expand Up @@ -146,5 +149,45 @@ private static IEnumerable<IProjectFile> GetXmlConfigFiles(IProject project)
file.Name.Equals(FileNames.WebConfig, StringComparison.OrdinalIgnoreCase)
|| file.Name.Equals(FileNames.AppConfig, StringComparison.OrdinalIgnoreCase));
}

private static JObject ParseJsonProjectFile(IProjectFile projectFile)
{
var primaryPsiFile = projectFile.GetPrimaryPsiFile();
var text = primaryPsiFile.GetUnquotedText();
return JObject.Parse(text);
}

[CanBeNull]
private static JObject ReadSecretsJsonSafe(IProject project)
{
var projectFiles =
project.GetAllProjectFiles(
file => file.Name.Equals(FileNames.NetCoreProjectJson, StringComparison.OrdinalIgnoreCase));

foreach (var projectFile in projectFiles)
{
try
{
var json = JObject.Parse(projectFile.GetPrimaryPsiFile().GetUnquotedText());
var userSecretsId = json[SettingsConstants.NetCoreUserSecretsIdJsonProperty];

if ((userSecretsId != null) && (userSecretsId.Type == JTokenType.String))
{
var filePath = string.Format(
FileNames.UserSecretsPathFormat,
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
userSecretsId.Value<string>());

var secretsFile = File.ReadAllText(filePath);
return JObject.Parse(secretsFile);
}
}
catch (Exception)
{
}
}

return null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@
<Compile Include="Constants\ClrTypeConstants.cs" />
<Compile Include="Constants\FileNames.cs" />
<Compile Include="Constants\SettingsConstants.cs" />
<Compile Include="Extensions\CollectionExtensions.cs" />
<Compile Include="Extensions\ProjectExtensions.cs" />
<Compile Include="Extensions\RangeExtensions.cs" />
<Compile Include="Extensions\TreeNodeExtensions.cs" />
Expand Down

0 comments on commit 494a536

Please sign in to comment.