Skip to content

Commit f5ce0bb

Browse files
committed
Use KeyedCollection instead of Dictionary
1 parent 9f2267c commit f5ce0bb

20 files changed

+123
-64
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
- Script names are no longer case insensitive which matches NPM's behavior
6+
- Project scripts are no longer backed by `Dictionary<string, string>` which should guarantee they're executed in the order they're found in the `global.json`
7+
58
## [0.5.0](https://github.com/xt0rted/dotnet-run-script/compare/v0.4.0...v0.5.0) - 2022-10-11
69

710
### Added

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22

33
<PropertyGroup>
4-
<TargetFrameworks>netcoreapp3.1;net6.0</TargetFrameworks>
4+
<TargetFrameworks>net6.0;netcoreapp3.1</TargetFrameworks>
55
<LangVersion>latest</LangVersion>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>

src/CommandGroupRunner.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ internal class CommandGroupRunner : ICommandGroupRunner
66
{
77
private readonly IConsoleWriter _writer;
88
private readonly IEnvironment _environment;
9-
private readonly IDictionary<string, string?> _scripts;
9+
private readonly ScriptCollection _scripts;
1010
private readonly ProcessContext _processContext;
1111
private readonly bool _captureOutput;
1212
private readonly CancellationToken _cancellationToken;
1313

1414
public CommandGroupRunner(
1515
IConsoleWriter writer,
1616
IEnvironment environment,
17-
IDictionary<string, string?> scripts,
17+
ScriptCollection scripts,
1818
ProcessContext processContext,
1919
bool captureOutput,
2020
CancellationToken cancellationToken)
@@ -38,10 +38,10 @@ public async Task<int> RunAsync(string name, string[]? scriptArgs)
3838
{
3939
var scriptNames = ImmutableArray.Create(new[] { "pre" + name, name, "post" + name });
4040

41-
foreach (var subScript in scriptNames.Where(scriptName => _scripts.ContainsKey(scriptName) || scriptName == "env"))
41+
foreach (var subScript in scriptNames.Where(scriptName => _scripts.Contains(scriptName) || scriptName == "env"))
4242
{
4343
// At this point we should have done enough checks to make sure the only not found script is `env`
44-
if (!_scripts.ContainsKey(subScript))
44+
if (!_scripts.Contains(subScript))
4545
{
4646
GlobalCommands.PrintEnvironmentVariables(_writer, _environment);
4747

@@ -56,7 +56,7 @@ public async Task<int> RunAsync(string name, string[]? scriptArgs)
5656

5757
var result = await command.RunAsync(
5858
subScript,
59-
_scripts[subScript]!,
59+
_scripts[subScript].Script,
6060
args);
6161

6262
if (result != 0)

src/GlobalCommands.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ internal static class GlobalCommands
77
/// </summary>
88
/// <param name="writer">The console logger instance to use.</param>
99
/// <param name="scripts">The project's scripts.</param>
10-
public static void PrintAvailableScripts(IConsoleWriter writer, IDictionary<string, string?> scripts)
10+
public static void PrintAvailableScripts(IConsoleWriter writer, ScriptCollection scripts)
1111
{
1212
writer.Line("Available via `{0}`:", writer.ColorText(ConsoleColor.Blue, "dotnet r"));
1313
writer.BlankLine();
1414

15-
foreach (var script in scripts.Keys)
15+
foreach (var (name, script) in scripts)
1616
{
17-
writer.Line(" {0}", script);
18-
writer.SecondaryLine(" {0}", scripts[script]);
17+
writer.Line(" {0}", name);
18+
writer.SecondaryLine(" {0}", script);
1919
writer.BlankLine();
2020
}
2121
}

src/Project.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@ namespace RunScript;
22

33
using System.Text.Json.Serialization;
44

5-
using RunScript.Serialization;
6-
75
public class Project
86
{
7+
[JsonPropertyName("scriptShell")]
98
public string? ScriptShell { get; set; }
109

11-
[JsonConverter(typeof(CaseInsensitiveDictionaryConverter<string?>))]
12-
public Dictionary<string, string?>? Scripts { get; set; }
10+
[JsonPropertyName("scripts")]
11+
public ScriptCollection? Scripts { get; set; }
1312
}

src/ProjectLoader.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,9 @@ internal class ProjectLoader
5757
return JsonSerializer.Deserialize<Project>(
5858
json,
5959
new JsonSerializerOptions
60-
{
61-
PropertyNameCaseInsensitive = true,
62-
ReadCommentHandling = JsonCommentHandling.Skip,
63-
});
60+
{
61+
ReadCommentHandling = JsonCommentHandling.Skip,
62+
});
6463
}
6564
catch
6665
{

src/RunScriptCommand.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,15 @@ public async Task<int> InvokeAsync(InvocationContext context)
134134
}
135135

136136
internal static List<ScriptResult> FindScripts(
137-
IDictionary<string, string?> projectScripts,
137+
ScriptCollection projectScripts,
138138
string[] scripts)
139139
{
140140
var results = new List<ScriptResult>();
141141

142142
foreach (var script in scripts)
143143
{
144144
// The `env` script is special so if it's not explicitly declared we act like it was
145-
if (projectScripts.ContainsKey(script) || string.Equals(script, "env", StringComparison.OrdinalIgnoreCase))
145+
if (projectScripts.Contains(script) || string.Equals(script, "env", StringComparison.Ordinal))
146146
{
147147
results.Add(new(script, true));
148148

@@ -160,7 +160,7 @@ internal static List<ScriptResult> FindScripts(
160160
}
161161
});
162162

163-
foreach (var projectScript in projectScripts.Keys)
163+
foreach (var (projectScript, _) in projectScripts)
164164
{
165165
if (matcher.IsMatch(projectScript.AsSpan()))
166166
{

src/ScriptCollection.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace RunScript;
2+
3+
using System.Collections.ObjectModel;
4+
using System.Text.Json.Serialization;
5+
6+
using RunScript.Serialization;
7+
8+
[JsonConverter(typeof(ScriptCollectionConverter))]
9+
public class ScriptCollection : KeyedCollection<string, ScriptMapping>
10+
{
11+
protected override string GetKeyForItem(ScriptMapping item)
12+
{
13+
if (item is null) throw new ArgumentNullException(nameof(item));
14+
15+
return item.Name;
16+
}
17+
18+
public void Add(string name, string script)
19+
=> Add(new ScriptMapping(name, script));
20+
}

src/ScriptMapping.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
namespace RunScript;
2+
3+
public record ScriptMapping(string Name, string Script);

src/Serialization/CaseInsensitiveDictionaryConverter.cs

Lines changed: 0 additions & 33 deletions
This file was deleted.

0 commit comments

Comments
 (0)