From 69bcbeb5ea94339f60f93dc6c1fe50885d46f8d8 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 30 Apr 2024 18:23:00 +1000 Subject: [PATCH 001/341] chore: WIP, feels like im getting somewhere. Feels like im getting close to have the text editing, replacment and substitution working soon. Then the next part starts, it won't be very fun. --- .gitignore | 1 + src/Compiler/AstHelper.cs | 90 ++++++++++++++++ src/Compiler/CompiledScript.cs | 56 ++++++++++ src/Compiler/Compiler.csproj | 62 +++++++++++ src/Compiler/Module.cs | 70 ++++++++++++ src/Compiler/Program.cs | 75 +++++++++++++ src/Compiler/Requirements.cs | 62 +++++++++++ src/Compiler/Text/Document.cs | 74 +++++++++++++ src/Compiler/Text/Span.cs | 110 +++++++++++++++++++ src/Compiler/Text/Updater.cs | 159 ++++++++++++++++++++++++++++ tests/Compiler/AstHelper.Test.cs | 19 ++++ tests/Compiler/Compiler.Test.csproj | 29 +++++ tests/Compiler/Text/Document.cs | 13 +++ tests/Compiler/Text/Span.cs | 84 +++++++++++++++ tests/Compiler/Text/Updater.cs | 0 15 files changed, 904 insertions(+) create mode 100644 src/Compiler/AstHelper.cs create mode 100644 src/Compiler/CompiledScript.cs create mode 100644 src/Compiler/Compiler.csproj create mode 100644 src/Compiler/Module.cs create mode 100644 src/Compiler/Program.cs create mode 100644 src/Compiler/Requirements.cs create mode 100644 src/Compiler/Text/Document.cs create mode 100644 src/Compiler/Text/Span.cs create mode 100644 src/Compiler/Text/Updater.cs create mode 100644 tests/Compiler/AstHelper.Test.cs create mode 100644 tests/Compiler/Compiler.Test.csproj create mode 100644 tests/Compiler/Text/Document.cs create mode 100644 tests/Compiler/Text/Span.cs create mode 100644 tests/Compiler/Text/Updater.cs diff --git a/.gitignore b/.gitignore index bbbef3f1..2da6f603 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .direnv obj bin +Output diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs new file mode 100644 index 00000000..c7d1b0e2 --- /dev/null +++ b/src/Compiler/AstHelper.cs @@ -0,0 +1,90 @@ +using System.Management.Automation.Language; +using System.Text.RegularExpressions; +using CommandLine; +using Microsoft.PowerShell.Commands; + +namespace Compiler { + public static class AstHelper + { + public static Dictionary> FindDeclaredModules(Ast ast) + { + var modules = new Dictionary>(); + + foreach (var usingStatement in ast.FindAll(testAst => testAst is UsingStatementAst && ((UsingStatementAst)testAst).UsingStatementKind == UsingStatementKind.Module, true)) + { + switch (usingStatement) + { + case UsingStatementAst usingStatementAst when usingStatementAst.Name is StringConstantExpressionAst: + modules.Add(usingStatementAst.Name.Value, new Dictionary()); + break; + + case UsingStatementAst usingStatementAst when usingStatementAst.ModuleSpecification is HashtableAst: + var table = new Dictionary(); + var pairs = usingStatementAst.ModuleSpecification.KeyValuePairs.GetEnumerator(); + while (pairs.MoveNext()) + { + var key = pairs.Current.Item1.SafeGetValue().Cast().Value; + var value = new InvokeExpressionCommand + { + Command = pairs.Current.Item2.SafeGetValue().ToString() + }.Invoke().GetEnumerator().Current.GetType(); + + table.Add(key, value); + } + + if (!table.ContainsKey("ModuleName")) + { + throw new Exception("ModuleSpecification does not contain a 'ModuleName' key."); + } + + modules.Add(table["ModuleName"].ToString(), table); + break; + default: + Console.WriteLine($"Unknown UsingStatementAst type from: {usingStatement}"); + break; + } + } + + return modules; + } + + public static (int, int) FindStartToEndBlock(string[] lines, string openPattern, string closePattern) + { + if (lines == null || lines.Length == 0) + { + return (-1, -1); + } + + int startIndex = -1; + int endIndex = -1; + int openLevel = 0; + for (int index = 0; index < lines.Length; index++) + { + string line = lines[index]; + + if (Regex.IsMatch(line, openPattern)) + { + if (openLevel == 0) + { + startIndex = index; + } + + openLevel += Regex.Matches(line, openPattern).Count; + } + + if (Regex.IsMatch(line, closePattern)) + { + openLevel -= Regex.Matches(line, closePattern).Count; + + if (openLevel == 0) + { + endIndex = index; + break; + } + } + } + + return (startIndex, endIndex); + } + } +} diff --git a/src/Compiler/CompiledScript.cs b/src/Compiler/CompiledScript.cs new file mode 100644 index 00000000..ae59b611 --- /dev/null +++ b/src/Compiler/CompiledScript.cs @@ -0,0 +1,56 @@ +using System.Text.RegularExpressions; +using Compiler; + +class CompiledScript : Module +{ + public CompiledScript(string name, string[] lines) : base(name, lines) + { + // Multiline Strings + AddPatternEdit( + @"^.*@[""']", + @"^\s+.*[""']@", + (lines) => + { + var startIndex = 0; + + // If the multiline is not at the start of the content it does not need to be trimmed, so we skip it. + var trimmedLine = lines[0].Trim(); + if (trimmedLine.StartsWith(@"@""") || trimmedLine.StartsWith("@'")) + { + startIndex++; + } + + // Get the multiline indent level from the last line of the string. + // This is used so we don't remove any whitespace that is part of the actual string formatting. + var indentLevel = Regex.Match(lines.Last(), @"^\s*").Value.Length; + + var updatedLines = lines.Select((line, index) => + { + if (index < startIndex) + { + return line; + } + + return line.Substring(indentLevel); + }); + + return updatedLines.ToArray(); + }); + + + // Document Blocks + AddPatternEdit( + @"^.*@[""']", + @"^\s+.*[""']@", + (lines) => { return []; }); + + // Entire Line Comments + AddRegexEdit(@"^\s*#.*$", _ => { return string.Empty; }); + + // Comments at the end of a line, after some code. + AddRegexEdit(@"\s*#.*$", _ => { return string.Empty; }); + + // Remove empty lines + AddRegexEdit(@"^\s*$", _ => { return string.Empty; }); + } +} diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj new file mode 100644 index 00000000..8a500025 --- /dev/null +++ b/src/Compiler/Compiler.csproj @@ -0,0 +1,62 @@ + + + + Program + Exe + net8.0 + enable + enable + + + Library + Properties + Compiler + Compiler + false + false + false + + + + + + true + portable + false + ../../Output/Debug/ + DEBUG;TRACE + prompt + 4 + AnyCPU + false + + + + embedded + true + ../../Output/Release/ + TRACE + prompt + 4 + false + + + + + + + + + + diff --git a/src/Compiler/Module.cs b/src/Compiler/Module.cs new file mode 100644 index 00000000..ab91998a --- /dev/null +++ b/src/Compiler/Module.cs @@ -0,0 +1,70 @@ +using System.Management.Automation; +using System.Management.Automation.Language; +using System.Text.RegularExpressions; +using CommandLine; +using Text; + +namespace Compiler +{ + public class Module : TextEditor + { + public string Name { get; } + public Requirements Requirements { get; } + // public Dictionary InnerModules { get; } + private string[] Lines { get; } + private List TextRanges { get; } + private readonly ScriptBlockAst Ast; + + public Module(string name, string[] lines) : base(new TextDocument(lines)) + { + Name = name; + Lines = lines; + EditApplied = false; + Requirements = new Requirements(); + TextRanges = []; + + Ast = System.Management.Automation.Language.Parser.ParseInput(string.Join("\n", Lines), out _, out ParseError[] ParserErrors); + if (ParserErrors.Length > 0) + { + throw new ParseException(ParserErrors); + } + + AstHelper.FindDeclaredModules(Ast).ToList().ForEach(module => + { + Requirements.AddRequirement(new ModuleRequirement( + name: module.Key, + guid: module.Value.TryGetValue("Guid", out object? value) ? Guid.Parse(value.Cast()) : null, + mimimumVersion: module.Value.TryGetValue("MinimumVersion", out object? minimumVersion) ? Version.Parse(minimumVersion.Cast()) : null, + maximumVersion: module.Value.TryGetValue("MaximumVersion", out object? maximumVersion) ? Version.Parse(maximumVersion.Cast()) : null, + requiredVersion: module.Value.TryGetValue("RequiredVersion", out object? requiredVersion) ? Version.Parse(requiredVersion.Cast()) : null + )); + }); + + foreach (var match in Lines.SelectMany(line => Regex.Matches(line, @"^\s*#Requires -(?[A-Z]+) (?.+)$").Cast())) + { + var type = match.Groups["type"].Value; + // C# Switch statements are fucking grose. + switch (type) + { + case "Version": + var parsedVersion = Version.Parse(match.Groups["value"].Value)!; + Requirements.AddRequirement(new VersionRequirement(parsedVersion)); + break; + case "Modules": + var modules = match.Groups["value"].Value.Split(',').Select(v => v.Trim()).ToArray(); + foreach (var module in modules) + { + Requirements.AddRequirement(new ModuleRequirement( + name: module + )); + } + + break; + default: + Console.Error.WriteLine($"Not sure what to do with unexpected type: {type}, skipping."); + break; + }; + } + } + } +} diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs new file mode 100644 index 00000000..052dcd48 --- /dev/null +++ b/src/Compiler/Program.cs @@ -0,0 +1,75 @@ +using CommandLine; + +class Program +{ + public class Options + { + [Option('v', "verbose", Required = false, HelpText = "Set output to verbose messages.")] + public bool Verbose { get; set; } + + [Option('i', "input", Required = true, HelpText = "Input file to be processed.")] + public string InputFile { get; set; } + + [Option('o', "output", Required = false, HelpText = "Output file to be written.")] + public string? OutputFile { get; set; } + + [Option('f', "force", Required = false, HelpText = "Force overwrite of output file.")] + public bool Force { get; set; } + } + + public static void Main(string[] args) + { + Parser.Default.ParseArguments(args).WithParsed(o => + { + Console.WriteLine($"Verbose: {o.Verbose}"); + Console.WriteLine($"Input file: {o.InputFile}"); + Console.WriteLine($"Output file: {o.OutputFile}"); + + if (string.IsNullOrWhiteSpace(o.InputFile)) { + Console.WriteLine("Input file is required"); + return; + } + + var compiledContent = CompileScript(o.InputFile); + OutputToFile(o, compiledContent); + }); + } + + public static string CompileScript(string inputFile) { + var script = File.ReadAllText(inputFile); + var compiledScript = new CompiledScript(Path.GetFileNameWithoutExtension(inputFile), script.Split('\n')); + + compiledScript.ApplyRangeEdits(); + return compiledScript.GetContent(); + } + + public static void OutputToFile(Options options, string content) + { + if (string.IsNullOrWhiteSpace(options.OutputFile)) { + // Output to console to allow for piping + Console.WriteLine(content); + return; + } + + // Output to file + if (File.Exists(options.OutputFile)) { + Console.WriteLine("Output file already exists"); + + var removeFile = options.Force; + if (!removeFile) { + Console.WriteLine($"File {options.OutputFile} already exists. Overwrite? (Y/n)"); + var response = Console.ReadLine(); + removeFile = String.IsNullOrWhiteSpace(response) || response.Equals("y", StringComparison.CurrentCultureIgnoreCase); + } + + if (removeFile) { + Console.WriteLine("Removing file"); + File.Delete(options.OutputFile); + } + } + + Console.WriteLine($"Writing to file {options.OutputFile}"); + File.Create(options.OutputFile); + File.WriteAllText(options.OutputFile, content); + } +} diff --git a/src/Compiler/Requirements.cs b/src/Compiler/Requirements.cs new file mode 100644 index 00000000..6a2e67eb --- /dev/null +++ b/src/Compiler/Requirements.cs @@ -0,0 +1,62 @@ +using System.Collections; +using CommandLine; + +namespace Compiler +{ + public class Requirements + { + public Hashtable StoredRequirements { get; } + + public Requirements() + { + StoredRequirements = []; + } + + public void AddRequirement(object value) + { + if (!StoredRequirements.ContainsKey(value.GetType())) + { + StoredRequirements.Add(value.GetType(), new List { value }); + } + else + { + StoredRequirements[value.GetType()].Cast>().Add(value); + } + } + + // TODO + public bool VerifyRequirements() + { + return true; + } + } + + public abstract class Requirement; + + public class VersionRequirement(Version version) : Requirement + { + public Version Version { get; } = version; + } + + public class ModuleRequirement( + string name, + Guid? guid = null, + Version? mimimumVersion = null, + Version? maximumVersion = null, + Version? requiredVersion = null + ) : Requirement + { + public string Name { get; } = name; + public Guid? Guid { get; } = guid; + public Version? MimimumVersion { get; } = mimimumVersion; + public Version? MaximumVersion { get; } = maximumVersion; + public Version? RequiredVersion { get; } = requiredVersion; + public ModuleType Type { get; } = ModuleType.Downloadable; + + public enum ModuleType + { + Downloadable, + Local + } + } +} diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs new file mode 100644 index 00000000..55746fd8 --- /dev/null +++ b/src/Compiler/Text/Document.cs @@ -0,0 +1,74 @@ +using System.Diagnostics.CodeAnalysis; +using System.Text.RegularExpressions; +using Text.Updater; + +namespace Text +{ + public class TextDocument(string[] lines) + { + public List Lines { get; set; } = new List(lines); + } + + public class TextEditor(TextDocument document) + { + public TextDocument Document { get; set; } = document; + public List TextUpdaters { get; set; } = []; + public bool EditApplied { get; set; } = false; + + public void AddPatternEdit( + [StringSyntax("Regex")] string openingPattern, + [StringSyntax("Regex")] string closingPattern, + Func updater) + { + VerifyNotAppliedOrError(); + + TextUpdaters.Add(new PatternUpdater( + new Regex(openingPattern), + new Regex(closingPattern), + updater + )); + } + + public void AddRegexEdit( + [StringSyntax("Regex")] string pattern, + Func updater) + { + VerifyNotAppliedOrError(); + + TextUpdaters.Add(new RegexUpdater( + new Regex(pattern), + updater + )); + } + + public void ApplyRangeEdits() + { + VerifyNotAppliedOrError(); + + foreach (var textUpdater in TextUpdaters) + { + textUpdater.Apply(Document); + } + + EditApplied = true; + } + + public string GetContent() + { + if (!EditApplied) + { + throw new Exception("Cannot get content from a document that has not had its edits applied."); + } + + return string.Join(Environment.NewLine, Document.Lines); + } + + private void VerifyNotAppliedOrError() + { + if (EditApplied) + { + throw new Exception("Cannot add a range edit to a document that has had its edits applied."); + } + } + } +} diff --git a/src/Compiler/Text/Span.cs b/src/Compiler/Text/Span.cs new file mode 100644 index 00000000..4f01972f --- /dev/null +++ b/src/Compiler/Text/Span.cs @@ -0,0 +1,110 @@ +using System.Text; + +namespace Text +{ + public class TextSpan(int startingIndex, int startingColumn, int endingIndex, int endingColumn) + { + public int StartingIndex { get; } = startingIndex; + public int StartingColumn { get; } = startingColumn; + public int EndingIndex { get; } = endingIndex; + public int EndingColumn { get; } = endingColumn; + + public static TextSpan WrappingEntireDocument(TextDocument document) + { + return new TextSpan(0, 0, document.Lines.Count - 1, document.Lines[^1].Length); + } + + public bool Contains(int index, int column) + { + if (index < StartingIndex || index > EndingIndex) + { + return false; + } + + if (index == StartingIndex && column < StartingColumn) + { + return false; + } + + if (index == EndingIndex && column > EndingColumn) + { + return false; + } + + return true; + } + + public string GetContent(TextDocument document) + { + if (StartingIndex == EndingIndex) + { + return document.Lines[StartingIndex][StartingColumn..EndingColumn]; + } + + string content = document.Lines[StartingIndex][StartingColumn..]; + content += Environment.NewLine; + content += string.Join(Environment.NewLine, document.Lines[(StartingIndex + 1)..EndingIndex]); + content += document.Lines[EndingIndex][..EndingColumn]; + return content; + } + + /// + /// Set the content of the span to the provided content. + /// + /// + /// The lines to update. + /// + /// + /// The content to set the span to. + /// + /// + /// The number of lines added or removed by the update. + /// + public int SetContent(TextDocument document, string[] content) + { + var offset = 0; + if (StartingIndex == EndingIndex) + { + document.Lines[StartingIndex] = string.Concat(document.Lines[StartingIndex][StartingColumn..], string.Join(Environment.NewLine, content), document.Lines[StartingIndex][..EndingColumn]); + } + else + { + StringBuilder sb = new StringBuilder(); + sb.Append(document.Lines[StartingIndex][StartingColumn..]); + sb.Append(content[0]); + + document.Lines[StartingIndex] = document.Lines[StartingIndex][..StartingColumn] + content[0]; + + for (int i = StartingIndex + 1; i < EndingIndex; i++) + { + document.Lines.RemoveAt(StartingIndex + 1); + offset--; + } + + // Skip the first line, since it was already updated. + for (int i = 1; i < content.Length; i++) + { + document.Lines.Insert(StartingIndex + i + 1, content[i]); + offset++; + } + + if (content.Length > 1) + { + document.Lines[EndingIndex] = content[^1] + document.Lines[EndingIndex + offset][EndingColumn..]; + } + else + { + document.Lines[EndingIndex] = document.Lines[EndingIndex][EndingColumn..]; + + } + } + + return offset; + } + + public void RemoveContent(TextDocument document) + { + SetContent(document, []); + } + } +} diff --git a/src/Compiler/Text/Updater.cs b/src/Compiler/Text/Updater.cs new file mode 100644 index 00000000..5c803fb8 --- /dev/null +++ b/src/Compiler/Text/Updater.cs @@ -0,0 +1,159 @@ +using System.Text.RegularExpressions; + +namespace Text.Updater { + public abstract class TextSpanUpdater + { + /// + /// Apply the update to the document. + /// + /// + /// The document to apply the update to. + /// + /// + /// The number of lines changed by the update. + /// + public abstract int Apply(TextDocument document); + } + + public class PatternUpdater( + Regex startingPattern, + Regex endingPattern, + Func updater + ) : TextSpanUpdater + { + public Func Updater { get; } = updater; + public Regex StartingPattern { get; } = startingPattern; + public Regex EndingPattern { get; } = endingPattern; + + override public int Apply(TextDocument document) + { + var skipRanges = new HashSet(); + var offset = 0; + + while (true) + { + var (startIndex, endIndex) = FindStartToEndBlock([.. document.Lines], offset, skipRanges); + if (startIndex == -1 || endIndex == -1) + { + break; + } + + var updatingLines = document.Lines.Skip(startIndex).Take(endIndex - startIndex + 1).ToArray(); + var newLines = Updater(updatingLines); + + document.Lines = document.Lines.Take(startIndex).Concat(newLines).Concat(document.Lines.Skip(endIndex + 1)).ToList(); + offset = newLines.Length - updatingLines.Length; + skipRanges.Add(new Range(startIndex, endIndex)); + + Console.WriteLine($"Updated block from {startIndex} to {endIndex}"); + Console.WriteLine("Previous content:"); + Console.WriteLine(string.Join(Environment.NewLine, updatingLines)); + Console.WriteLine("New content:"); + Console.WriteLine(string.Join(Environment.NewLine, newLines)); + } + + return offset; + } + + private (int, int) FindStartToEndBlock( + string[] lines, + int offset, + HashSet skipRanges + ) + { + if (offset < 0 || offset >= lines.Length || lines.Length == 0) + { + return (-1, -1); + } + + int startIndex = -1; + int endIndex = -1; + int openLevel = 0; + + for (int i = offset; i < lines.Length; i++) + { + if (skipRanges.Any(range => (range.Start.Value + offset) <= i && (range.End.Value + offset) >= i)) + { + continue; + } + + var openingMatch = StartingPattern.Matches(lines[i]); + if (openingMatch.Count > 0) + { + if (openLevel == 0) + { + startIndex = i; + } + + openLevel += openingMatch.Count; + } + + var closingMatch = EndingPattern.Matches(lines[i]); + if (closingMatch.Count > 0) + { + openLevel -= closingMatch.Count; + + if (openLevel == 0) + { + endIndex = i; + break; + } + } + } + + return (startIndex, endIndex); + } + } + + public class RegexUpdater( + Regex pattern, + Func updater + ) : TextSpanUpdater + { + public Func Updater { get; } = updater; + public Regex Pattern { get; } = pattern; + + override public int Apply(TextDocument document) + { + var offset = 0; + + for (int i = 0; i < document.Lines.Count; i++) + { + var matches = Pattern.Matches(document.Lines[i]); + if (matches.Count == 0) + { + continue; + } + + foreach (Match match in matches) + { + var span = new TextSpan( + i, + match.Index, + i, + match.Index + match.Length + ); + + var isMultiLine = match.Value.Contains(Environment.NewLine); + var newContent = Updater(match); + + if (string.IsNullOrWhiteSpace(newContent)) + { + span.RemoveContent(document); + } + else + { + + span.SetContent(document, [newContent]); + if (isMultiLine) + { + offset += newContent.Split(Environment.NewLine).Length - 1; + } + } + } + } + + return offset; + } + } +} diff --git a/tests/Compiler/AstHelper.Test.cs b/tests/Compiler/AstHelper.Test.cs new file mode 100644 index 00000000..61fa036e --- /dev/null +++ b/tests/Compiler/AstHelper.Test.cs @@ -0,0 +1,19 @@ +using System.Management.Automation; + +[TestFixture] +public class AstHelpersTests +{ + // [Test] + // public void FindDeclaredModules_ThrowsException_WhenModuleNameKeyIsMissing() + // { + // var ScriptBlockAst = ScriptBlock.Create(@" + // Using module @{ + // ModuleName = 'Microsoft.Graph'; + // ModuleValue = '1.0.0'; + // }" + // ).Ast!; + + // // Act & Assert + // Assert.Throws(() => AstHelpers.FindDeclaredModules(ast)); + // } +} diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj new file mode 100644 index 00000000..7298ff12 --- /dev/null +++ b/tests/Compiler/Compiler.Test.csproj @@ -0,0 +1,29 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + + diff --git a/tests/Compiler/Text/Document.cs b/tests/Compiler/Text/Document.cs new file mode 100644 index 00000000..22bf4e27 --- /dev/null +++ b/tests/Compiler/Text/Document.cs @@ -0,0 +1,13 @@ +using Text; + +[TestFixture] +public class DocumentTests +{ + private TextDocument _document; + + [SetUp] + public void SetUp() + { + _document = new TextDocument([]); + } +} diff --git a/tests/Compiler/Text/Span.cs b/tests/Compiler/Text/Span.cs new file mode 100644 index 00000000..903d60a6 --- /dev/null +++ b/tests/Compiler/Text/Span.cs @@ -0,0 +1,84 @@ + +namespace Text.Tests +{ + [TestFixture] + public class TextSpanTests + { + private TextDocument document; + + [SetUp] + public void SetUp() + { + string[] lines = [ + "Hello,", + "World!" + ]; + + document = new TextDocument(lines); + } + + [Test] + public void WrappingEntireDocument_ReturnsSpanWithCorrectIndices() + { + // Act + var span = TextSpan.WrappingEntireDocument(document); + + // Assert + Assert.Multiple(() => + { + Assert.That(span.StartingIndex, Is.EqualTo(0)); + Assert.That(span.StartingColumn, Is.EqualTo(0)); + Assert.That(span.EndingIndex, Is.EqualTo(1)); + Assert.That(span.EndingColumn, Is.EqualTo(6)); + }); + } + + [Test] + public void Contains_ReturnsTrue_WhenIndexAndColumnAreWithinSpan() + { + var span = TextSpan.WrappingEntireDocument(document); + bool result = span.Contains(1, 2); + Assert.That(result, Is.True); + } + + [Test] + public void GetContent_ReturnsCorrectContent() + { + var span = TextSpan.WrappingEntireDocument(document); + string content = span.GetContent(document); + Assert.That(content, Is.EqualTo($"Hello,{Environment.NewLine}World")); + } + + [Test] + public void SetContent_UpdatesLinesWithNewContent() + { + var span = TextSpan.WrappingEntireDocument(document); + int linesChanged = span.SetContent(document, ["New Content"]); + + Assert.Multiple(() => + { + Assert.That(linesChanged, Is.EqualTo(-1)); + Assert.That(document.Lines[0], Is.EqualTo("New Content")); + Assert.That(document.Lines, Has.Count.EqualTo(1)); + }); + + } + + [Test] + public void RemoveContent_RemovesContentFromLines() + { + var span = new TextSpan(0, 0, 0, 6); + + // Act + span.RemoveContent(document); + + Assert.Multiple(() => + { + // Assert + Assert.That(document.Lines[0], Is.EqualTo("World!")); + Assert.That(document.Lines, Has.Count.EqualTo(1)); + }); + + } + } +} diff --git a/tests/Compiler/Text/Updater.cs b/tests/Compiler/Text/Updater.cs new file mode 100644 index 00000000..e69de29b From 9a63319b5b26be316fa67c48b56b66c9230ea9ed Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 2 May 2024 13:58:50 +1000 Subject: [PATCH 002/341] feat: fix and complete span and span tests for now --- .vscode/launch.json | 6 ++ src/Compiler/Text/Span.cs | 103 +++++++++++++++++------ tests/Compiler/Text/Span.cs | 158 ++++++++++++++++++++++++++++++++---- 3 files changed, 228 insertions(+), 39 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 78493811..4a847a35 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,12 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "name": "C#: Compiler Debug", + "type": "dotnet", + "request": "launch", + "projectPath": "${workspaceFolder}/src/compiler/Compiler.csproj" + }, { "name": "PowerShell Run Pester Tests", "type": "PowerShell", diff --git a/src/Compiler/Text/Span.cs b/src/Compiler/Text/Span.cs index 4f01972f..3cf66937 100644 --- a/src/Compiler/Text/Span.cs +++ b/src/Compiler/Text/Span.cs @@ -1,3 +1,4 @@ +using System.Runtime.InteropServices; using System.Text; namespace Text @@ -38,14 +39,28 @@ public string GetContent(TextDocument document) { if (StartingIndex == EndingIndex) { + if (StartingColumn == 0 && EndingColumn == document.Lines[StartingIndex].Length) + { + return document.Lines[StartingIndex]; + } + + if (StartingColumn == EndingColumn) + { + return string.Empty; + } + return document.Lines[StartingIndex][StartingColumn..EndingColumn]; } - string content = document.Lines[StartingIndex][StartingColumn..]; - content += Environment.NewLine; - content += string.Join(Environment.NewLine, document.Lines[(StartingIndex + 1)..EndingIndex]); - content += document.Lines[EndingIndex][..EndingColumn]; - return content; + var builder = new StringBuilder(); + builder.AppendLine(document.Lines[StartingIndex][StartingColumn..]); + for (int i = StartingIndex + 1; i < EndingIndex; i++) + { + builder.AppendLine(document.Lines[i]); + } + builder.Append(document.Lines[EndingIndex][..EndingColumn]); + + return builder.ToString(); } /// @@ -63,48 +78,88 @@ public string GetContent(TextDocument document) public int SetContent(TextDocument document, string[] content) { var offset = 0; + var lastLineAfter = document.Lines[EndingIndex][EndingColumn..]; + var firstLineBefore = document.Lines[StartingIndex][..StartingColumn]; + if (StartingIndex == EndingIndex) { - document.Lines[StartingIndex] = string.Concat(document.Lines[StartingIndex][StartingColumn..], string.Join(Environment.NewLine, content), document.Lines[StartingIndex][..EndingColumn]); + // If the span is a single line and we took nothing from the line before or after, remove the line, since it will be empty. + if (string.IsNullOrEmpty(firstLineBefore) || string.IsNullOrEmpty(lastLineAfter)) + { + document.Lines.RemoveAt(StartingIndex); + offset--; + + // Short circuit if the new content is empty, there will be no need to update the document. + if (content.Length == 0) + { + return offset; + } + } else { + document.Lines.RemoveAt(StartingIndex); + offset--; + } } else { - StringBuilder sb = new StringBuilder(); - sb.Append(document.Lines[StartingIndex][StartingColumn..]); - sb.Append(content[0]); - - document.Lines[StartingIndex] = document.Lines[StartingIndex][..StartingColumn] + content[0]; - - for (int i = StartingIndex + 1; i < EndingIndex; i++) + // Remove all lines in the span to get a clean slate. + for (int i = StartingIndex; i <= EndingIndex; i++) { - document.Lines.RemoveAt(StartingIndex + 1); + document.Lines.RemoveAt(StartingIndex); offset--; } + } - // Skip the first line, since it was already updated. - for (int i = 1; i < content.Length; i++) + if (content.Length == 0) + { + if (!string.IsNullOrEmpty(firstLineBefore)) { - document.Lines.Insert(StartingIndex + i + 1, content[i]); + document.Lines.Insert(StartingIndex, firstLineBefore); offset++; } - if (content.Length > 1) + if (!string.IsNullOrEmpty(lastLineAfter)) { - document.Lines[EndingIndex] = content[^1] + document.Lines[EndingIndex + offset][EndingColumn..]; + document.Lines.Insert(EndingIndex + offset, lastLineAfter); + offset++; } - else - { - document.Lines[EndingIndex] = document.Lines[EndingIndex][EndingColumn..]; + } + else if (content.Length == 1) + { + if (StartingIndex == EndingIndex) { + document.Lines.Insert(StartingIndex, firstLineBefore + content[0] + lastLineAfter); + offset++; + } else { + document.Lines.Insert(StartingIndex, firstLineBefore + content[0]); + offset++; + if (!string.IsNullOrEmpty(lastLineAfter)) + { + document.Lines.Insert(EndingIndex + offset, lastLineAfter); + offset++; + } } } + else + { + document.Lines.Insert(StartingIndex, firstLineBefore + content[0]); + offset++; + + // Add the new content. + for (int i = 1; i < content.Length; i++) + { + document.Lines.Insert(StartingIndex + i, content[i]); + offset++; + } + + document.Lines.Insert(EndingIndex + offset, content[^1] + lastLineAfter); + } return offset; } - public void RemoveContent(TextDocument document) + public int RemoveContent(TextDocument document) { - SetContent(document, []); + return SetContent(document, []); } } } diff --git a/tests/Compiler/Text/Span.cs b/tests/Compiler/Text/Span.cs index 903d60a6..6ca737ad 100644 --- a/tests/Compiler/Text/Span.cs +++ b/tests/Compiler/Text/Span.cs @@ -1,17 +1,22 @@ +using System.Collections; + namespace Text.Tests { [TestFixture] public class TextSpanTests { + private string[] lines; private TextDocument document; [SetUp] public void SetUp() { - string[] lines = [ + lines = [ "Hello,", - "World!" + "World!", + "I'm the", + "Document!" ]; document = new TextDocument(lines); @@ -28,8 +33,8 @@ public void WrappingEntireDocument_ReturnsSpanWithCorrectIndices() { Assert.That(span.StartingIndex, Is.EqualTo(0)); Assert.That(span.StartingColumn, Is.EqualTo(0)); - Assert.That(span.EndingIndex, Is.EqualTo(1)); - Assert.That(span.EndingColumn, Is.EqualTo(6)); + Assert.That(span.EndingIndex, Is.EqualTo(lines.Length - 1)); + Assert.That(span.EndingColumn, Is.EqualTo(expected: lines[^1].Length)); }); } @@ -42,22 +47,68 @@ public void Contains_ReturnsTrue_WhenIndexAndColumnAreWithinSpan() } [Test] - public void GetContent_ReturnsCorrectContent() + public void GetContent_EntireDocument() { var span = TextSpan.WrappingEntireDocument(document); string content = span.GetContent(document); - Assert.That(content, Is.EqualTo($"Hello,{Environment.NewLine}World")); + Assert.That(content, Is.EqualTo($"Hello,{Environment.NewLine}World!{Environment.NewLine}I'm the{Environment.NewLine}Document!")); + } + + [Test] + public void GetContent_SingleLineFromBeginingAndEndLines() + { + var spanFirst = new TextSpan(0, 0, 0, lines[0].Length); + var contentFirst = spanFirst.GetContent(document); + + var spanLast = new TextSpan(3, 0, lines.Length - 1, lines[^1].Length); + var contentLast = spanLast.GetContent(document); + + Assert.Multiple(() => + { + Assert.That(contentFirst, Is.EqualTo(lines[0])); + Assert.That(contentLast, Is.EqualTo(lines[^1])); + }); + } + + [Test] + public void GetContent_SingleLineFromMiddleLines() + { + var spans = new List(); + var contents = new List(); + + for (int i = 1; i < lines.Length - 1; i++) + { + spans.Add(new TextSpan(i, 0, i, lines[i].Length)); + contents.Add(spans[i - 1].GetContent(document)); + } + + Assert.Multiple(() => + { + for (int i = 0; i < contents.Count; i++) + { + Assert.That(contents[i], Is.EqualTo(lines[i + 1])); + } + }); + } + + [Test] + public void GetContent_MultipleLines() + { + var span = new TextSpan(1, 0, 2, lines[2].Length); + var content = span.GetContent(document); + + Assert.That(content, Is.EqualTo($"World!{Environment.NewLine}I'm the")); } [Test] public void SetContent_UpdatesLinesWithNewContent() { var span = TextSpan.WrappingEntireDocument(document); - int linesChanged = span.SetContent(document, ["New Content"]); + int lengthChanged = span.SetContent(document, ["New Content"]); Assert.Multiple(() => { - Assert.That(linesChanged, Is.EqualTo(-1)); + Assert.That(lengthChanged, Is.EqualTo(-3)); Assert.That(document.Lines[0], Is.EqualTo("New Content")); Assert.That(document.Lines, Has.Count.EqualTo(1)); }); @@ -65,20 +116,97 @@ public void SetContent_UpdatesLinesWithNewContent() } [Test] - public void RemoveContent_RemovesContentFromLines() + public void SetContent_UpdateMiddleLine() { + var span = new TextSpan(1, 0, 1, lines[1].Length); + int lengthChanged = span.SetContent(document, ["New Content"]); + + Assert.Multiple(() => + { + Assert.That(lengthChanged, Is.EqualTo(0)); + Assert.That(document.Lines[1], Is.EqualTo("New Content")); + }); + } + + [Test] + public void SetContent_UpdateFirstLine() { + var span = new TextSpan(0, 0, 0, lines[0].Length); + int lengthChanged = span.SetContent(document, ["New Content"]); + + Assert.Multiple(() => + { + Assert.That(lengthChanged, Is.EqualTo(0)); + Assert.That(document.Lines[0], Is.EqualTo("New Content")); + }); + } + + [Test] + public void SetContent_UpdateLastLine() { + var span = new TextSpan(3, 0, 3, lines[^1].Length); + int lengthChanged = span.SetContent(document, ["New Content"]); + + Assert.Multiple(() => + { + Assert.That(lengthChanged, Is.EqualTo(0)); + Assert.That(document.Lines[3], Is.EqualTo("New Content")); + }); + } + + [Test] + public void SetContent_InsertsNewLines() { - var span = new TextSpan(0, 0, 0, 6); + var span = new TextSpan(1, 0, 1, lines[1].Length); + int lengthChanged = span.SetContent(document, ["New", "Content"]); - // Act - span.RemoveContent(document); + Assert.Multiple(() => + { + Assert.That(lengthChanged, Is.EqualTo(1)); + Assert.That(document.Lines[1], Is.EqualTo("New")); + Assert.That(document.Lines[2], Is.EqualTo("Content")); + Assert.That(document.Lines, Has.Count.EqualTo(5)); + }); + } + + [Test] + public void SetContent_AppendAndPrependColumns() + { + var spanStart = new TextSpan(0, lines[0].Length - 1, 0, lines[0].Length - 1); + int lengthChangedStart = spanStart.SetContent(document, [" beautiful"]); + var spanEnd = new TextSpan(lines.Length - 1, 0, lines.Length - 1, 0); + int lengthChangedEnd = spanEnd.SetContent(document, ["Awesome "]); Assert.Multiple(() => { - // Assert - Assert.That(document.Lines[0], Is.EqualTo("World!")); - Assert.That(document.Lines, Has.Count.EqualTo(1)); + Assert.That(lengthChangedStart, Is.EqualTo(0)); + Assert.That(lengthChangedEnd, Is.EqualTo(0)); + Assert.That(document.Lines[0], Is.EqualTo("Hello beautiful,")); + Assert.That(document.Lines[^1], Is.EqualTo("Awesome Document!")); + }); + } + + [Test] + public void SetContent_UpdateMiddleOfLines() { + var span = new TextSpan(lines.Length - 2, 3, lines.Length - 2, 3); + int lengthChanged = span.SetContent(document, [" not"]); + + Assert.Multiple(() => + { + Assert.That(lengthChanged, Is.EqualTo(0)); + Assert.That(document.Lines[^2], Is.EqualTo("I'm not the")); }); + } + + [Test] + public void RemoveContent_RemovesContentFromLines() + { + var span = new TextSpan(startingIndex: 0, 0, 0, 6); + var lengthChanged = span.RemoveContent(document); + Assert.Multiple(() => + { + Assert.That(lengthChanged, Is.EqualTo(-1)); + Assert.That(document.Lines[0], Is.EqualTo("World!")); + Assert.That(document.Lines, Has.Count.EqualTo(3)); + }); } } } From e9cd14c64e6be590e26b56979a504b23ff10f20c Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 2 May 2024 18:43:41 +1000 Subject: [PATCH 003/341] chore: lots more work on compiler * In process of implementing graph system for dependencies --- src/Compiler/AstHelper.cs | 79 ++++++------------ src/Compiler/CompiledScript.cs | 101 ++++++++++++++--------- src/Compiler/Compiler.csproj | 4 +- src/Compiler/Module.cs | 70 ---------------- src/Compiler/Module/Local.cs | 146 +++++++++++++++++++++++++++++++++ src/Compiler/Module/Module.cs | 26 ++++++ src/Compiler/Module/Remote.cs | 32 ++++++++ src/Compiler/Program.cs | 53 +++++++----- src/Compiler/Requirements.cs | 18 +++- src/Compiler/Text/Updater.cs | 7 +- tests/Compiler/Text/Span.cs | 2 - tests/Compiler/Text/Updater.cs | 24 ++++++ 12 files changed, 373 insertions(+), 189 deletions(-) delete mode 100644 src/Compiler/Module.cs create mode 100644 src/Compiler/Module/Local.cs create mode 100644 src/Compiler/Module/Module.cs create mode 100644 src/Compiler/Module/Remote.cs diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index c7d1b0e2..64da083b 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -1,34 +1,29 @@ using System.Management.Automation.Language; -using System.Text.RegularExpressions; using CommandLine; -using Microsoft.PowerShell.Commands; -namespace Compiler { +namespace Compiler +{ public static class AstHelper { public static Dictionary> FindDeclaredModules(Ast ast) { var modules = new Dictionary>(); - foreach (var usingStatement in ast.FindAll(testAst => testAst is UsingStatementAst && ((UsingStatementAst)testAst).UsingStatementKind == UsingStatementKind.Module, true)) + foreach (var usingStatement in ast.FindAll(testAst => testAst is UsingStatementAst usingAst && usingAst.UsingStatementKind == UsingStatementKind.Module, true)) { switch (usingStatement) { - case UsingStatementAst usingStatementAst when usingStatementAst.Name is StringConstantExpressionAst: - modules.Add(usingStatementAst.Name.Value, new Dictionary()); + case UsingStatementAst usingStatementAst when usingStatementAst.Name is not null: + modules.Add(usingStatementAst.Name.Value, []); break; - case UsingStatementAst usingStatementAst when usingStatementAst.ModuleSpecification is HashtableAst: + case UsingStatementAst usingStatementAst when usingStatementAst.ModuleSpecification is not null: var table = new Dictionary(); var pairs = usingStatementAst.ModuleSpecification.KeyValuePairs.GetEnumerator(); while (pairs.MoveNext()) { - var key = pairs.Current.Item1.SafeGetValue().Cast().Value; - var value = new InvokeExpressionCommand - { - Command = pairs.Current.Item2.SafeGetValue().ToString() - }.Invoke().GetEnumerator().Current.GetType(); - + var key = pairs.Current.Item1.SafeGetValue().Cast(); + var value = pairs.Current.Item2.SafeGetValue().GetType(); table.Add(key, value); } @@ -37,7 +32,24 @@ public static Dictionary> FindDeclaredModules throw new Exception("ModuleSpecification does not contain a 'ModuleName' key."); } - modules.Add(table["ModuleName"].ToString(), table); + foreach (var key in table.Keys) + { + if (key == "ModuleName") + { + continue; + } + + if (key == "Guid" && table[key] is string guid) + { + table[key] = Guid.Parse(guid); + } + + if (key.EndsWith("Version") && table[key] is string version) + { + table[key] = Version.Parse(version); + } + } + break; default: Console.WriteLine($"Unknown UsingStatementAst type from: {usingStatement}"); @@ -47,44 +59,5 @@ public static Dictionary> FindDeclaredModules return modules; } - - public static (int, int) FindStartToEndBlock(string[] lines, string openPattern, string closePattern) - { - if (lines == null || lines.Length == 0) - { - return (-1, -1); - } - - int startIndex = -1; - int endIndex = -1; - int openLevel = 0; - for (int index = 0; index < lines.Length; index++) - { - string line = lines[index]; - - if (Regex.IsMatch(line, openPattern)) - { - if (openLevel == 0) - { - startIndex = index; - } - - openLevel += Regex.Matches(line, openPattern).Count; - } - - if (Regex.IsMatch(line, closePattern)) - { - openLevel -= Regex.Matches(line, closePattern).Count; - - if (openLevel == 0) - { - endIndex = index; - break; - } - } - } - - return (startIndex, endIndex); - } } } diff --git a/src/Compiler/CompiledScript.cs b/src/Compiler/CompiledScript.cs index ae59b611..15295ee1 100644 --- a/src/Compiler/CompiledScript.cs +++ b/src/Compiler/CompiledScript.cs @@ -1,56 +1,81 @@ -using System.Text.RegularExpressions; +using System.Security.Cryptography; using Compiler; +using Compiler.Module; +using QuikGraph; -class CompiledScript : Module +class CompiledScript : LocalFileModule { + public readonly AdjacencyGraph> ModuleGraph = new(); + public readonly Dictionary ResolvedModules = []; + public CompiledScript(string name, string[] lines) : base(name, lines) { - // Multiline Strings - AddPatternEdit( - @"^.*@[""']", - @"^\s+.*[""']@", - (lines) => + + foreach (var module in Requirements.GetRequirements()) + { + ModuleGraph.AddEdge(new Edge(ModuleSpec, module)); + } + + ResolveRequirements(); + } + + private void ResolveRequirements() + { + var localModules = new List(); + var downloadableModules = new List(); + + var iterating = new Queue([ModuleSpec]); + while (iterating.TryDequeue(out ModuleSpec? current) && current != null) + { + if (localModules.Any(module => module.GetModuleMatchFor(current) == ModuleMatch.Exact) || downloadableModules.Any(module => module.GetModuleMatchFor(current) == ModuleMatch.Exact)) { - var startIndex = 0; + continue; + } - // If the multiline is not at the start of the content it does not need to be trimmed, so we skip it. - var trimmedLine = lines[0].Trim(); - if (trimmedLine.StartsWith(@"@""") || trimmedLine.StartsWith("@'")) - { - startIndex++; - } + if (!ModuleGraph.ContainsVertex(current)) + { + ModuleGraph.AddVertex(current); + } - // Get the multiline indent level from the last line of the string. - // This is used so we don't remove any whitespace that is part of the actual string formatting. - var indentLevel = Regex.Match(lines.Last(), @"^\s*").Value.Length; + ModuleGraph.AddEdge(new Edge(ModuleSpec, current)); - var updatedLines = lines.Select((line, index) => - { - if (index < startIndex) - { - return line; - } + var resolvedPath = Path.GetFullPath(current.Name); + if (File.Exists(resolvedPath)) + { + var localModule = LocalFileModule.FromFile(current.Name); + localModules.Add(localModule); - return line.Substring(indentLevel); + localModule.Requirements.GetRequirements().ForEach(module => + { + ModuleGraph.AddEdge(new Edge(current, module)); + iterating.Enqueue(module); }); - return updatedLines.ToArray(); - }); + continue; + } + var downloadableModule = RemoteModule.FromModuleRequirement(current); + downloadableModules.Add(downloadableModule); + } - // Document Blocks - AddPatternEdit( - @"^.*@[""']", - @"^\s+.*[""']@", - (lines) => { return []; }); + localModules.ForEach(module => + { + ResolvedModules.Add(module.Name, module); + }); - // Entire Line Comments - AddRegexEdit(@"^\s*#.*$", _ => { return string.Empty; }); - - // Comments at the end of a line, after some code. - AddRegexEdit(@"\s*#.*$", _ => { return string.Empty; }); + foreach (var module in downloadableModules) + { + if (!ResolvedModules.TryGetValue(module.Name, out Module? value)) + { + ResolvedModules.Add(module.Name, module); + continue; + } - // Remove empty lines - AddRegexEdit(@"^\s*$", _ => { return string.Empty; }); + var existingModule = value; + if (existingModule.Version < module.Version) + { + ResolvedModules[module.Name] = module; + } + } } } diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 8a500025..d8a9a9c0 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -8,7 +8,7 @@ enable - Library + Properties Compiler Compiler @@ -58,5 +58,7 @@ + + diff --git a/src/Compiler/Module.cs b/src/Compiler/Module.cs deleted file mode 100644 index ab91998a..00000000 --- a/src/Compiler/Module.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.Management.Automation; -using System.Management.Automation.Language; -using System.Text.RegularExpressions; -using CommandLine; -using Text; - -namespace Compiler -{ - public class Module : TextEditor - { - public string Name { get; } - public Requirements Requirements { get; } - // public Dictionary InnerModules { get; } - private string[] Lines { get; } - private List TextRanges { get; } - private readonly ScriptBlockAst Ast; - - public Module(string name, string[] lines) : base(new TextDocument(lines)) - { - Name = name; - Lines = lines; - EditApplied = false; - Requirements = new Requirements(); - TextRanges = []; - - Ast = System.Management.Automation.Language.Parser.ParseInput(string.Join("\n", Lines), out _, out ParseError[] ParserErrors); - if (ParserErrors.Length > 0) - { - throw new ParseException(ParserErrors); - } - - AstHelper.FindDeclaredModules(Ast).ToList().ForEach(module => - { - Requirements.AddRequirement(new ModuleRequirement( - name: module.Key, - guid: module.Value.TryGetValue("Guid", out object? value) ? Guid.Parse(value.Cast()) : null, - mimimumVersion: module.Value.TryGetValue("MinimumVersion", out object? minimumVersion) ? Version.Parse(minimumVersion.Cast()) : null, - maximumVersion: module.Value.TryGetValue("MaximumVersion", out object? maximumVersion) ? Version.Parse(maximumVersion.Cast()) : null, - requiredVersion: module.Value.TryGetValue("RequiredVersion", out object? requiredVersion) ? Version.Parse(requiredVersion.Cast()) : null - )); - }); - - foreach (var match in Lines.SelectMany(line => Regex.Matches(line, @"^\s*#Requires -(?[A-Z]+) (?.+)$").Cast())) - { - var type = match.Groups["type"].Value; - // C# Switch statements are fucking grose. - switch (type) - { - case "Version": - var parsedVersion = Version.Parse(match.Groups["value"].Value)!; - Requirements.AddRequirement(new VersionRequirement(parsedVersion)); - break; - case "Modules": - var modules = match.Groups["value"].Value.Split(',').Select(v => v.Trim()).ToArray(); - foreach (var module in modules) - { - Requirements.AddRequirement(new ModuleRequirement( - name: module - )); - } - - break; - default: - Console.Error.WriteLine($"Not sure what to do with unexpected type: {type}, skipping."); - break; - }; - } - } - } -} diff --git a/src/Compiler/Module/Local.cs b/src/Compiler/Module/Local.cs new file mode 100644 index 00000000..32222589 --- /dev/null +++ b/src/Compiler/Module/Local.cs @@ -0,0 +1,146 @@ +using System.Management.Automation; +using System.Management.Automation.Language; +using System.Text.RegularExpressions; +using CommandLine; +using Text; + +namespace Compiler.Module; + +public partial class LocalFileModule : Module +{ + public readonly TextEditor Document; + private readonly ScriptBlockAst Ast; + + public LocalFileModule(string name, string[] lines) : base(new ModuleSpec(name)) + { + Document = new(new TextDocument(lines)); + + Ast = System.Management.Automation.Language.Parser.ParseInput(string.Join("\n", lines), out _, out ParseError[] ParserErrors); + if (ParserErrors.Length > 0) + { + throw new ParseException(ParserErrors); + } + + AstHelper.FindDeclaredModules(Ast).ToList().ForEach(module => + { + Requirements.AddRequirement(new ModuleSpec( + name: module.Key, + guid: module.Value.TryGetValue("Guid", out object? value) ? Guid.Parse(value.Cast()) : null, + mimimumVersion: module.Value.TryGetValue("MinimumVersion", out object? minimumVersion) ? Version.Parse(minimumVersion.Cast()) : null, + maximumVersion: module.Value.TryGetValue("MaximumVersion", out object? maximumVersion) ? Version.Parse(maximumVersion.Cast()) : null, + requiredVersion: module.Value.TryGetValue("RequiredVersion", out object? requiredVersion) ? Version.Parse(requiredVersion.Cast()) : null + )); + }); + + foreach (var match in lines.SelectMany(line => RequiresStatementRegex().Matches(line).Cast())) + { + var type = match.Groups["type"].Value; + // C# Switch statements are fucking grose. + switch (type) + { + case "Version": + var parsedVersion = Version.Parse(match.Groups["value"].Value)!; + Requirements.AddRequirement(new VersionRequirement(parsedVersion)); + break; + case "Modules": + var modules = match.Groups["value"].Value.Split(',').Select(v => v.Trim()).ToArray(); + foreach (var module in modules) + { + Requirements.AddRequirement(new ModuleSpec( + name: module + )); + } + + break; + default: + Console.Error.WriteLine($"Not sure what to do with unexpected type: {type}, skipping."); + break; + }; + } + + // Cleanup must be done after AST + FixAndCleanLines(); + + // Check the AST for any issues that have been introduced by the cleanup. + Ast = System.Management.Automation.Language.Parser.ParseInput(string.Join("\n", lines), out _, out ParseError[] PostFixupParserErrors); + if (PostFixupParserErrors.Length > 0) + { + Console.WriteLine("There was an issue trying to parse the script after cleanup was applied."); + throw new ParseException(PostFixupParserErrors); + } + } + + private void FixAndCleanLines() + { + // Multiline Strings + Document.AddPatternEdit( + @"^.*@[""']", + @"^\s+.*[""']@", + (lines) => + { + var startIndex = 0; + + // If the multiline is not at the start of the content it does not need to be trimmed, so we skip it. + var trimmedLine = lines[0].Trim(); + if (trimmedLine.StartsWith(@"@""") || trimmedLine.StartsWith("@'")) + { + startIndex++; + } + + // Get the multiline indent level from the last line of the string. + // This is used so we don't remove any whitespace that is part of the actual string formatting. + var indentLevel = BeginingWhitespaceMatchRegex().Match(lines.Last()).Value.Length; + + var updatedLines = lines.Select((line, index) => + { + if (index < startIndex) + { + return line; + } + + return line[indentLevel..]; + }); + + return updatedLines.ToArray(); + }); + + + // Document Blocks + Document.AddPatternEdit( + @"^\s*<#", + @"^\s*#>", + (lines) => { return []; }); + + // Entire Line Comments + Document.AddRegexEdit(@"^\s*#.*$", _ => { return string.Empty; }); + + // Comments at the end of a line, after some code. + Document.AddRegexEdit(@"\s*#.*$", _ => { return string.Empty; }); + + // Remove empty lines + Document.AddRegexEdit(@"^\s*$", _ => { return string.Empty; }); + } + + public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) + { + // Local files have nothing but a name. + if (ModuleSpec.Name == requirement.Name) + { + return ModuleMatch.Exact; + } + + return ModuleMatch.None; + } + + public static LocalFileModule FromFile(string path) + { + return new LocalFileModule(path, File.ReadAllLines(path)); + } + + [GeneratedRegex(@"^\s*#Requires -(?[A-Z]+) (?.+)$")] + private static partial Regex RequiresStatementRegex(); + + [GeneratedRegex(@"^\s*")] + private static partial Regex BeginingWhitespaceMatchRegex(); + +} diff --git a/src/Compiler/Module/Module.cs b/src/Compiler/Module/Module.cs new file mode 100644 index 00000000..7191b367 --- /dev/null +++ b/src/Compiler/Module/Module.cs @@ -0,0 +1,26 @@ +namespace Compiler.Module; + +public abstract partial class Module(ModuleSpec moduleSpec) +{ + public string Name => ModuleSpec.Name; + public Version Version => ModuleSpec.RequiredVersion ?? new Version(0, 0, 0, 0); + public ModuleSpec ModuleSpec { get; } = moduleSpec; + public Requirements Requirements { get; } = new Requirements(); + + public abstract ModuleMatch GetModuleMatchFor(ModuleSpec requirement); +} + +public enum ModuleMatch +{ + // This module is an exact match for the requirement + Exact, + + // This module is a higher version than the requirement + Above, + + // This module has a version that makes it incompatible with the requirement + Incompatible, + + // This module does not match the requirement + None +} diff --git a/src/Compiler/Module/Remote.cs b/src/Compiler/Module/Remote.cs new file mode 100644 index 00000000..ae80ccfd --- /dev/null +++ b/src/Compiler/Module/Remote.cs @@ -0,0 +1,32 @@ +namespace Compiler.Module +{ + public class RemoteModule(string name, byte[] bytes) : Module(new ModuleSpec(name)) + { + public byte[] Bytes { get; } = bytes; + + /* + Create a new module that is hosted on the PowerShell Gallery. + */ + public static RemoteModule FromModuleRequirement(ModuleSpec requirement) + { + // Obtain a variable which contains the binary zip file of the module. + // Compress the binary zip into a string that we can store in the powershell script. + // This will later be extracted and imported into the script. + + var binaryZip = GetBinaryZip(requirement.Name); + + return new RemoteModule(requirement.Name, binaryZip); + } + + public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) + { + throw new NotImplementedException(); + } + + private static byte[] GetBinaryZip(string name) + { + // TODO + return []; + } + } +} diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 052dcd48..cf89d0eb 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -1,4 +1,9 @@ +using System.Reflection; +using System.Text; using CommandLine; +using Json.More; +using QuikGraph; +using QuikGraph.Graphviz; class Program { @@ -21,11 +26,12 @@ public static void Main(string[] args) { Parser.Default.ParseArguments(args).WithParsed(o => { - Console.WriteLine($"Verbose: {o.Verbose}"); - Console.WriteLine($"Input file: {o.InputFile}"); - Console.WriteLine($"Output file: {o.OutputFile}"); + // Console.WriteLine($"Verbose: {o.Verbose}"); + // Console.WriteLine($"Input file: {o.InputFile}"); + // Console.WriteLine($"Output file: {o.OutputFile}"); - if (string.IsNullOrWhiteSpace(o.InputFile)) { + if (string.IsNullOrWhiteSpace(o.InputFile)) + { Console.WriteLine("Input file is required"); return; } @@ -35,41 +41,50 @@ public static void Main(string[] args) }); } - public static string CompileScript(string inputFile) { + public static string CompileScript(string inputFile) + { var script = File.ReadAllText(inputFile); var compiledScript = new CompiledScript(Path.GetFileNameWithoutExtension(inputFile), script.Split('\n')); - compiledScript.ApplyRangeEdits(); - return compiledScript.GetContent(); + var graphViz = compiledScript.ModuleGraph.ToGraphviz(); + Console.WriteLine(graphViz); + + compiledScript.Document.ApplyRangeEdits(); + return compiledScript.Document.GetContent(); } - public static void OutputToFile(Options options, string content) + public static async void OutputToFile(Options options, string content) { - if (string.IsNullOrWhiteSpace(options.OutputFile)) { + if (string.IsNullOrWhiteSpace(options.OutputFile)) + { // Output to console to allow for piping - Console.WriteLine(content); + Console.OpenStandardOutput().Write(Encoding.UTF8.GetBytes(content)); return; } // Output to file - if (File.Exists(options.OutputFile)) { - Console.WriteLine("Output file already exists"); + if (File.Exists(options.OutputFile)) + { + // Console.WriteLine("Output file already exists"); var removeFile = options.Force; - if (!removeFile) { - Console.WriteLine($"File {options.OutputFile} already exists. Overwrite? (Y/n)"); + if (!removeFile) + { + // Console.WriteLine($"File {options.OutputFile} already exists. Overwrite? (Y/n)"); var response = Console.ReadLine(); removeFile = String.IsNullOrWhiteSpace(response) || response.Equals("y", StringComparison.CurrentCultureIgnoreCase); } - if (removeFile) { - Console.WriteLine("Removing file"); + if (removeFile) + { + // Console.WriteLine("Removing file"); File.Delete(options.OutputFile); } } - Console.WriteLine($"Writing to file {options.OutputFile}"); - File.Create(options.OutputFile); - File.WriteAllText(options.OutputFile, content); + // Console.WriteLine($"Writing to file {options.OutputFile}"); + var fileStream = File.Open(options.OutputFile, FileMode.CreateNew, FileAccess.Write, FileShare.ReadWrite); + await fileStream.WriteAsync(Encoding.UTF8.GetBytes(content)); + fileStream.Close(); } } diff --git a/src/Compiler/Requirements.cs b/src/Compiler/Requirements.cs index 6a2e67eb..e2e15969 100644 --- a/src/Compiler/Requirements.cs +++ b/src/Compiler/Requirements.cs @@ -12,18 +12,28 @@ public Requirements() StoredRequirements = []; } - public void AddRequirement(object value) + public void AddRequirement(Requirement value) { if (!StoredRequirements.ContainsKey(value.GetType())) { - StoredRequirements.Add(value.GetType(), new List { value }); + StoredRequirements.Add(value.GetType(), new List { value }); } else { - StoredRequirements[value.GetType()].Cast>().Add(value); + StoredRequirements[value.GetType()].Cast>().Add(value); } } + public List GetRequirements() + { + if (StoredRequirements.ContainsKey(typeof(T))) + { + return StoredRequirements[typeof(T)].Cast>().FindAll(requirement => requirement.CanCast()).Cast().ToList(); + } + + return []; + } + // TODO public bool VerifyRequirements() { @@ -38,7 +48,7 @@ public class VersionRequirement(Version version) : Requirement public Version Version { get; } = version; } - public class ModuleRequirement( + public class ModuleSpec( string name, Guid? guid = null, Version? mimimumVersion = null, diff --git a/src/Compiler/Text/Updater.cs b/src/Compiler/Text/Updater.cs index 5c803fb8..96afb6ad 100644 --- a/src/Compiler/Text/Updater.cs +++ b/src/Compiler/Text/Updater.cs @@ -1,6 +1,7 @@ using System.Text.RegularExpressions; -namespace Text.Updater { +namespace Text.Updater +{ public abstract class TextSpanUpdater { /// @@ -137,9 +138,11 @@ override public int Apply(TextDocument document) var isMultiLine = match.Value.Contains(Environment.NewLine); var newContent = Updater(match); - if (string.IsNullOrWhiteSpace(newContent)) + // Remove the entire line if the replacement is empty and the match is the entire line. + if (string.IsNullOrEmpty(newContent) && match.Index == 0 && match.Length == document.Lines[i].Length) { span.RemoveContent(document); + offset--; } else { diff --git a/tests/Compiler/Text/Span.cs b/tests/Compiler/Text/Span.cs index 6ca737ad..2206c4c9 100644 --- a/tests/Compiler/Text/Span.cs +++ b/tests/Compiler/Text/Span.cs @@ -1,6 +1,4 @@ -using System.Collections; - namespace Text.Tests { [TestFixture] diff --git a/tests/Compiler/Text/Updater.cs b/tests/Compiler/Text/Updater.cs index e69de29b..3a61a2dc 100644 --- a/tests/Compiler/Text/Updater.cs +++ b/tests/Compiler/Text/Updater.cs @@ -0,0 +1,24 @@ +namespace Text.Tests + +{ + [TestFixture] + public class PatternTests + { + private string[] lines; + private TextDocument document; + + [SetUp] + public void SetUp() + { + lines = [ + "\"@", + "Doing cool stuff with this multiline string!", + "", + "This is the end of the string!", + "@\"" + ]; + + document = new TextDocument(lines); + } + } +} From 28bf84603184689c9d8785f3f4dc0f22acca6f31 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 3 May 2024 13:05:58 +1000 Subject: [PATCH 004/341] test: implement tests for document and updater files --- src/Compiler/Program.cs | 2 +- src/Compiler/Text/Document.cs | 2 +- src/Compiler/Text/Updater.cs | 13 ++++- tests/Compiler/Text/Document.cs | 42 +++++++++++++++- tests/Compiler/Text/Span.cs | 1 - tests/Compiler/Text/Updater.cs | 88 +++++++++++++++++++++++++++++++-- 6 files changed, 137 insertions(+), 11 deletions(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index cf89d0eb..36d9484c 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -49,7 +49,7 @@ public static string CompileScript(string inputFile) var graphViz = compiledScript.ModuleGraph.ToGraphviz(); Console.WriteLine(graphViz); - compiledScript.Document.ApplyRangeEdits(); + compiledScript.Document.ApplyEdits(); return compiledScript.Document.GetContent(); } diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index 55746fd8..f5a7ed06 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -41,7 +41,7 @@ public void AddRegexEdit( )); } - public void ApplyRangeEdits() + public void ApplyEdits() { VerifyNotAppliedOrError(); diff --git a/src/Compiler/Text/Updater.cs b/src/Compiler/Text/Updater.cs index 96afb6ad..7386a974 100644 --- a/src/Compiler/Text/Updater.cs +++ b/src/Compiler/Text/Updater.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using CommandLine; namespace Text.Updater { @@ -73,12 +74,13 @@ HashSet skipRanges for (int i = offset; i < lines.Length; i++) { + var clonedLine = lines[i].Clone().Cast()!; if (skipRanges.Any(range => (range.Start.Value + offset) <= i && (range.End.Value + offset) >= i)) { continue; } - var openingMatch = StartingPattern.Matches(lines[i]); + var openingMatch = StartingPattern.Matches(clonedLine); if (openingMatch.Count > 0) { if (openLevel == 0) @@ -89,7 +91,14 @@ HashSet skipRanges openLevel += openingMatch.Count; } - var closingMatch = EndingPattern.Matches(lines[i]); + // If we found at least one startPattern we will want to remove them from the string, + // This is so that the endingPattern does not match the same elements, and we can find the correct end. + if (openingMatch.Count > 0) + { + clonedLine = StartingPattern.Replace(clonedLine, "", openingMatch.Count); + } + + var closingMatch = EndingPattern.Matches(clonedLine); if (closingMatch.Count > 0) { openLevel -= closingMatch.Count; diff --git a/tests/Compiler/Text/Document.cs b/tests/Compiler/Text/Document.cs index 22bf4e27..5668de9c 100644 --- a/tests/Compiler/Text/Document.cs +++ b/tests/Compiler/Text/Document.cs @@ -1,13 +1,51 @@ +using System.Reflection; using Text; +namespace Compiler.Test.Text; + [TestFixture] public class DocumentTests { - private TextDocument _document; + private TextEditor Editor; [SetUp] public void SetUp() { - _document = new TextDocument([]); + Editor = new TextEditor(new TextDocument([])); + } + + [Test] + public void AddPaternEdit_ThrowsException_WhenAlreadyApplied() + { + Editor.ApplyEdits(); + Assert.Throws(() => Editor.AddPatternEdit("", "", _ => _)); + } + + [Test] + public void AddRegexEdit_ThrowsException_WhenAlreadyApplied() + { + Editor.ApplyEdits(); + Assert.Throws(() => Editor.AddRegexEdit("", _ => "")); + } + + [Test] + public void ApplyEdits_ThrowsException_WhenAlreadyApplied() + { + Editor.ApplyEdits(); + Assert.Throws(() => Editor.ApplyEdits()); + } + + [Test] + public void GetContent_ThrowsException_WhenEditsNotApplied() + { + Assert.Throws(() => Editor.GetContent()); + } + + [Test] + public void GetContent_ReturnsContent_WhenEditsApplied() + { + Editor.AddPatternEdit("", "", _ => ["Hello, World!"]); + Editor.ApplyEdits(); + Assert.That(Editor.GetContent(), Is.EqualTo("Hello, World!")); } } diff --git a/tests/Compiler/Text/Span.cs b/tests/Compiler/Text/Span.cs index 2206c4c9..1be6880e 100644 --- a/tests/Compiler/Text/Span.cs +++ b/tests/Compiler/Text/Span.cs @@ -160,7 +160,6 @@ public void SetContent_InsertsNewLines() Assert.That(lengthChanged, Is.EqualTo(1)); Assert.That(document.Lines[1], Is.EqualTo("New")); Assert.That(document.Lines[2], Is.EqualTo("Content")); - Assert.That(document.Lines, Has.Count.EqualTo(5)); }); } diff --git a/tests/Compiler/Text/Updater.cs b/tests/Compiler/Text/Updater.cs index 3a61a2dc..d6099591 100644 --- a/tests/Compiler/Text/Updater.cs +++ b/tests/Compiler/Text/Updater.cs @@ -5,20 +5,100 @@ namespace Text.Tests public class PatternTests { private string[] lines; - private TextDocument document; + private TextEditor Editor; [SetUp] public void SetUp() { lines = [ - "\"@", + "@\"", "Doing cool stuff with this multiline string!", "", "This is the end of the string!", - "@\"" + "\"@" ]; - document = new TextDocument(lines); + Editor = new TextEditor(new(lines)); + } + + [Test] + public void AddPatternEdit_ReplaceAllContent() + { + Editor.AddPatternEdit(openingPattern: "@\"", "\"@", _ => ["Updated content!"]); + Editor.ApplyEdits(); + + Assert.That(Editor.GetContent(), Is.EqualTo("Updated content!")); + } + + [Test] + public void AddPatternEdit_UseContentToUpdate() + { + Editor.AddPatternEdit("@\"", "\"@", content => + { + return content.Select(line => line + "Updated content!").ToArray(); + }); + Editor.ApplyEdits(); + + Assert.That(Editor.GetContent(), Is.EqualTo($"@\"Updated content!{Environment.NewLine}Doing cool stuff with this multiline string!Updated content!{Environment.NewLine}Updated content!{Environment.NewLine}This is the end of the string!Updated content!{Environment.NewLine}\"@Updated content!")); + } + + [Test] + public void AddPatternEdit_ReplaceContentWithEmpty() + { + Editor.AddPatternEdit("@\"", "\"@", _ => ["@\"", "\"@"]); + Editor.ApplyEdits(); + + Assert.That(Editor.GetContent(), Is.EqualTo($"@\"{Environment.NewLine}\"@")); + } + } + + [TestFixture] + public class RegexTests + { + private string[] lines; + private TextEditor Editor; + + [SetUp] + public void SetUp() + { + lines = [ + "Hello,", + "World!", + "I'm the", + "Document!" + ]; + + Editor = new TextEditor(new(lines)); + } + + [Test] + public void AddRegexEdit_ReplaceAllContent() + { + Editor.AddRegexEdit(".*", _ => "Updated content!"); + Editor.ApplyEdits(); + + Assert.That(Editor.GetContent(), Is.EqualTo("Updated content!")); + } + + [Test] + public void AddRegexEdit_UseContentToUpdate() + { + Editor.AddRegexEdit(".*", match => + { + return match.Value + " Updated content!"; + }); + Editor.ApplyEdits(); + + Assert.That(Editor.GetContent(), Is.EqualTo("Hello, Updated content!World! Updated content!I'm the Updated content!Document! Updated content!")); + } + + [Test] + public void AddRegexEdit_ReplaceContentWithEmpty() + { + Editor.AddRegexEdit(".*", _ => ""); + Editor.ApplyEdits(); + + Assert.That(Editor.GetContent(), Is.EqualTo("")); } } } From 58ee8e5de7f415f4062769a24fea993728f1acb5 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 3 May 2024 18:52:26 +1000 Subject: [PATCH 005/341] chore: debugger --- .vscode/launch.json | 33 +++++++++++++++++++++++++-------- .vscode/tasks.json | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 .vscode/tasks.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 4a847a35..1e44e175 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,12 +4,6 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - { - "name": "C#: Compiler Debug", - "type": "dotnet", - "request": "launch", - "projectPath": "${workspaceFolder}/src/compiler/Compiler.csproj" - }, { "name": "PowerShell Run Pester Tests", "type": "PowerShell", @@ -24,9 +18,9 @@ "request": "launch", "script": "${file}", "cwd": "${cwd}", - "args": [ "-Verbose", "-Debug" ], + "args": ["-Verbose", "-Debug"], "createTemporaryIntegratedConsole": true, - "attachDotnetDebugger": true, + "attachDotnetDebugger": true }, { "name": "PowerShell: Launch Current File", @@ -35,6 +29,29 @@ "script": "${file}", "cwd": "${workspaceFolder}", "createTemporaryIntegratedConsole": true + }, + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/dotnet/vscode-csharp/blob/main/debugger-launchjson.md + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/Output/Debug/Compiler.dll", + "args": ["-i", "utils/test.ps1"], + "cwd": "${workspaceFolder}", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "internalConsole", + "stopAtEntry": false, + "internalConsoleOptions": "openOnSessionStart" + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..2706e08f --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/scripts.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/scripts.sln", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/scripts.sln" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file From db5c929a320d7c6ae597997e19b29259a66d8aea Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 3 May 2024 18:59:01 +1000 Subject: [PATCH 006/341] feat(Compiler): ExactUpdater This is useful for using something like the AST to decide where the changes need to be but the index these items live at can and will be updated, so we account for this by using the new SpanUpdateInfo class and its new method that uses it in TextSpanUpdater called PushByUpdate, this will update the index based off the last changes made. --- src/Compiler/Text/Document.cs | 22 ++++++++- src/Compiler/Text/Updater.cs | 89 +++++++++++++++++++++++++++++------ 2 files changed, 96 insertions(+), 15 deletions(-) diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index f5a7ed06..d32d5b53 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -41,13 +41,33 @@ public void AddRegexEdit( )); } + public void AddExactEdit( + int startingIndex, + int startingColumn, + int endingIndex, + int endingColumn, + Func updater) + { + VerifyNotAppliedOrError(); + + TextUpdaters.Add(new ExactUpdater( + startingIndex, + startingColumn, + endingIndex, + endingColumn, + updater + )); + } + public void ApplyEdits() { VerifyNotAppliedOrError(); + var spanUpdates = new List(); foreach (var textUpdater in TextUpdaters) { - textUpdater.Apply(Document); + spanUpdates.ForEach(textUpdater.PushByUpdate); + textUpdater.Apply(Document).ToList().ForEach(spanUpdates.Add); } EditApplied = true; diff --git a/src/Compiler/Text/Updater.cs b/src/Compiler/Text/Updater.cs index 7386a974..b355a256 100644 --- a/src/Compiler/Text/Updater.cs +++ b/src/Compiler/Text/Updater.cs @@ -1,8 +1,14 @@ using System.Text.RegularExpressions; using CommandLine; +// TODO :: Ast based updater namespace Text.Updater { + public record SpanUpdateInfo( + TextSpan TextSpan, + int Offset + ); + public abstract class TextSpanUpdater { /// @@ -14,7 +20,13 @@ public abstract class TextSpanUpdater /// /// The number of lines changed by the update. /// - public abstract int Apply(TextDocument document); + public abstract SpanUpdateInfo[] Apply(TextDocument document); + + /// + /// Use informaiton from another update to possibly update this ones variables. + /// This can be used to update the starting index of a span after a previous span has been removed. + /// + public abstract void PushByUpdate(SpanUpdateInfo updateInfo); } public class PatternUpdater( @@ -27,8 +39,9 @@ Func updater public Regex StartingPattern { get; } = startingPattern; public Regex EndingPattern { get; } = endingPattern; - override public int Apply(TextDocument document) + override public SpanUpdateInfo[] Apply(TextDocument document) { + var spanUpdateInfo = new List(); var skipRanges = new HashSet(); var offset = 0; @@ -43,20 +56,18 @@ override public int Apply(TextDocument document) var updatingLines = document.Lines.Skip(startIndex).Take(endIndex - startIndex + 1).ToArray(); var newLines = Updater(updatingLines); + var thisOffset = newLines.Length - updatingLines.Length; + offset += thisOffset; document.Lines = document.Lines.Take(startIndex).Concat(newLines).Concat(document.Lines.Skip(endIndex + 1)).ToList(); - offset = newLines.Length - updatingLines.Length; skipRanges.Add(new Range(startIndex, endIndex)); - - Console.WriteLine($"Updated block from {startIndex} to {endIndex}"); - Console.WriteLine("Previous content:"); - Console.WriteLine(string.Join(Environment.NewLine, updatingLines)); - Console.WriteLine("New content:"); - Console.WriteLine(string.Join(Environment.NewLine, newLines)); + spanUpdateInfo.Add(new SpanUpdateInfo(new TextSpan(startIndex, 0, endIndex, 0), thisOffset)); } - return offset; + return [.. spanUpdateInfo]; } + public override void PushByUpdate(SpanUpdateInfo updateInfo) { } + private (int, int) FindStartToEndBlock( string[] lines, int offset, @@ -123,8 +134,9 @@ Func updater public Func Updater { get; } = updater; public Regex Pattern { get; } = pattern; - override public int Apply(TextDocument document) + override public SpanUpdateInfo[] Apply(TextDocument document) { + var spanUpdateInfo = new List(); var offset = 0; for (int i = 0; i < document.Lines.Count; i++) @@ -135,6 +147,7 @@ override public int Apply(TextDocument document) continue; } + var thisOffset = 0; foreach (Match match in matches) { var span = new TextSpan( @@ -151,7 +164,7 @@ override public int Apply(TextDocument document) if (string.IsNullOrEmpty(newContent) && match.Index == 0 && match.Length == document.Lines[i].Length) { span.RemoveContent(document); - offset--; + thisOffset--; } else { @@ -159,13 +172,61 @@ override public int Apply(TextDocument document) span.SetContent(document, [newContent]); if (isMultiLine) { - offset += newContent.Split(Environment.NewLine).Length - 1; + thisOffset += newContent.Split(Environment.NewLine).Length - 1; } } + + spanUpdateInfo.Add(new SpanUpdateInfo(new( + i, + match.Index, + i, + match.Index + match.Length + ), thisOffset)); + + offset += thisOffset; } } - return offset; + return [.. spanUpdateInfo]; + } + + public override void PushByUpdate(SpanUpdateInfo updateInfo) { } + } + + public class ExactUpdater( + int startingIndex, + int startingColumn, + int endingIndex, + int endingColumn, + Func updater + ) : TextSpanUpdater + { + public Func Updater = updater; + public TextSpan Span { get; } = new TextSpan(startingIndex, startingColumn, endingIndex, endingColumn); + + override public SpanUpdateInfo[] Apply(TextDocument document) + { + var updatingLines = document.Lines.Skip(Span.StartingIndex).Take(Span.EndingIndex - Span.StartingIndex + 1).ToArray(); + updatingLines[0] = document.Lines[Span.StartingIndex][Span.StartingColumn..]; + updatingLines[^1] = document.Lines[Span.EndingIndex][..Span.EndingColumn]; + + var newLines = Updater(updatingLines); + var offset = Span.SetContent(document, newLines); + + return [new SpanUpdateInfo(Span, offset)]; + } + + override public void PushByUpdate(SpanUpdateInfo updateInfo) + { + if (Span.StartingIndex >= updateInfo.TextSpan.StartingIndex) + { + Span.StartingIndex += updateInfo.Offset; + } + + if (Span.EndingIndex >= updateInfo.TextSpan.StartingIndex) + { + Span.EndingIndex += updateInfo.Offset; + } } } } From 652018b8330cb774e5292ede4faa211ae02c328c Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 3 May 2024 18:59:50 +1000 Subject: [PATCH 007/341] fix(Compiler): Ast Errors on parse Fix AST errors from missing modules during parse, these will be automatically populated when modules are automatically downloaded for these modules. --- src/Compiler/Module/Local.cs | 39 ++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/Compiler/Module/Local.cs b/src/Compiler/Module/Local.cs index 32222589..e611ebef 100644 --- a/src/Compiler/Module/Local.cs +++ b/src/Compiler/Module/Local.cs @@ -9,26 +9,22 @@ namespace Compiler.Module; public partial class LocalFileModule : Module { public readonly TextEditor Document; - private readonly ScriptBlockAst Ast; + protected readonly ScriptBlockAst Ast; public LocalFileModule(string name, string[] lines) : base(new ModuleSpec(name)) { Document = new(new TextDocument(lines)); - Ast = System.Management.Automation.Language.Parser.ParseInput(string.Join("\n", lines), out _, out ParseError[] ParserErrors); - if (ParserErrors.Length > 0) - { - throw new ParseException(ParserErrors); - } + Ast = GetAstReportingErrors(string.Join(Environment.NewLine, lines)); AstHelper.FindDeclaredModules(Ast).ToList().ForEach(module => { Requirements.AddRequirement(new ModuleSpec( - name: module.Key, - guid: module.Value.TryGetValue("Guid", out object? value) ? Guid.Parse(value.Cast()) : null, - mimimumVersion: module.Value.TryGetValue("MinimumVersion", out object? minimumVersion) ? Version.Parse(minimumVersion.Cast()) : null, - maximumVersion: module.Value.TryGetValue("MaximumVersion", out object? maximumVersion) ? Version.Parse(maximumVersion.Cast()) : null, - requiredVersion: module.Value.TryGetValue("RequiredVersion", out object? requiredVersion) ? Version.Parse(requiredVersion.Cast()) : null + Name: module.Key, + Guid: module.Value.TryGetValue("Guid", out object? value) ? Guid.Parse(value.Cast()) : null, + MimimumVersion: module.Value.TryGetValue("MinimumVersion", out object? minimumVersion) ? Version.Parse(minimumVersion.Cast()) : null, + MaximumVersion: module.Value.TryGetValue("MaximumVersion", out object? maximumVersion) ? Version.Parse(maximumVersion.Cast()) : null, + RequiredVersion: module.Value.TryGetValue("RequiredVersion", out object? requiredVersion) ? Version.Parse(requiredVersion.Cast()) : null )); }); @@ -40,14 +36,14 @@ public LocalFileModule(string name, string[] lines) : base(new ModuleSpec(name)) { case "Version": var parsedVersion = Version.Parse(match.Groups["value"].Value)!; - Requirements.AddRequirement(new VersionRequirement(parsedVersion)); + Requirements.AddRequirement(new PSVersionRequirement(parsedVersion)); break; case "Modules": var modules = match.Groups["value"].Value.Split(',').Select(v => v.Trim()).ToArray(); foreach (var module in modules) { Requirements.AddRequirement(new ModuleSpec( - name: module + Name: module )); } @@ -62,12 +58,20 @@ public LocalFileModule(string name, string[] lines) : base(new ModuleSpec(name)) FixAndCleanLines(); // Check the AST for any issues that have been introduced by the cleanup. - Ast = System.Management.Automation.Language.Parser.ParseInput(string.Join("\n", lines), out _, out ParseError[] PostFixupParserErrors); - if (PostFixupParserErrors.Length > 0) + GetAstReportingErrors(string.Join(Environment.NewLine, lines)); + } + + private static ScriptBlockAst GetAstReportingErrors(string astContent) { + var ast = System.Management.Automation.Language.Parser.ParseInput(astContent, out _, out ParseError[] ParserErrors); + + ParserErrors = [.. ParserErrors.ToList().FindAll(error => !error.ErrorId.Equals("ModuleNotFoundDuringParse"))]; + if (ParserErrors.Length > 0) { - Console.WriteLine("There was an issue trying to parse the script after cleanup was applied."); - throw new ParseException(PostFixupParserErrors); + Console.WriteLine("There was an issue trying to parse the script."); + throw new ParseException(ParserErrors); } + + return ast; } private void FixAndCleanLines() @@ -143,4 +147,5 @@ public static LocalFileModule FromFile(string path) [GeneratedRegex(@"^\s*")] private static partial Regex BeginingWhitespaceMatchRegex(); + public override string GetContent() => Document.GetContent(); } From 2802932709f04fc2a6d4fdc4c243ad557f5930ac Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 3 May 2024 19:01:45 +1000 Subject: [PATCH 008/341] refactor(Compiler): Add modules and some code rearranging updaters Modules are now being embedded into the output string, though not perfect yet its pretty close for the local files, downloadable files are still going to be a challenge though. --- src/Compiler/CompiledScript.cs | 180 +++++++++++++++++++++++++++------ src/Compiler/Compiler.csproj | 5 +- src/Compiler/Module/Module.cs | 12 +++ src/Compiler/Module/Remote.cs | 6 ++ src/Compiler/Program.cs | 8 +- src/Compiler/Requirements.cs | 68 +++++++++---- src/Compiler/Text/Span.cs | 20 ++-- 7 files changed, 235 insertions(+), 64 deletions(-) diff --git a/src/Compiler/CompiledScript.cs b/src/Compiler/CompiledScript.cs index 15295ee1..2d08eec4 100644 --- a/src/Compiler/CompiledScript.cs +++ b/src/Compiler/CompiledScript.cs @@ -1,4 +1,5 @@ -using System.Security.Cryptography; +using System.Management.Automation.Language; +using System.Text; using Compiler; using Compiler.Module; using QuikGraph; @@ -7,6 +8,7 @@ class CompiledScript : LocalFileModule { public readonly AdjacencyGraph> ModuleGraph = new(); public readonly Dictionary ResolvedModules = []; + public readonly ParamBlockAst ScriptParamBlockAst; public CompiledScript(string name, string[] lines) : base(name, lines) { @@ -16,7 +18,62 @@ public CompiledScript(string name, string[] lines) : base(name, lines) ModuleGraph.AddEdge(new Edge(ModuleSpec, module)); } + // Extract the param block and its attributes from the script and store it in a variable so we can place it at the top of the script later. + ScriptParamBlockAst = Ast.ParamBlock; + Document.AddExactEdit( + ScriptParamBlockAst.Extent.StartLineNumber - 1, + ScriptParamBlockAst.Extent.StartColumnNumber - 1, + ScriptParamBlockAst.Extent.EndLineNumber - 1, + ScriptParamBlockAst.Extent.EndColumnNumber - 1, + lines => [] + ); + ScriptParamBlockAst.Attributes.ToList().ForEach(attribute => + { + Document.AddExactEdit( + attribute.Extent.StartLineNumber - 1, + attribute.Extent.StartColumnNumber - 1, + attribute.Extent.EndLineNumber - 1, + attribute.Extent.EndColumnNumber - 1, + lines => [] + ); + }); + ResolveRequirements(); + + // Remove all the using statmenets from the script. + var usingStatements = Ast.FindAll(ast => ast is UsingStatementAst usingStatment && usingStatment.UsingStatementKind == UsingStatementKind.Module, false).ToList(); + usingStatements.ForEach(usingStatement => + { + Document.AddExactEdit( + usingStatement.Extent.StartLineNumber - 1, + usingStatement.Extent.StartColumnNumber - 1, + usingStatement.Extent.EndLineNumber - 1, + usingStatement.Extent.EndColumnNumber - 1, + lines => [] + ); + }); + } + + public string Compile() + { + var script = new StringBuilder(); + + Requirements.GetRequirements().ForEach(requirement => + { + script.AppendLine(requirement.GetInsertableLine()); + }); + + ScriptParamBlockAst.Attributes.ToList().ForEach(attribute => + { + script.AppendLine(attribute.Extent.Text); + }); + script.AppendLine(ScriptParamBlockAst.Extent.Text); + + script.AppendLine(GetModuleTable()); + + script.AppendLine(Document.GetContent()); + + return script.ToString(); } private void ResolveRequirements() @@ -24,38 +81,47 @@ private void ResolveRequirements() var localModules = new List(); var downloadableModules = new List(); - var iterating = new Queue([ModuleSpec]); - while (iterating.TryDequeue(out ModuleSpec? current) && current != null) + var iterating = new Queue([this]); + while (iterating.TryDequeue(out Module? current) && current != null) { - if (localModules.Any(module => module.GetModuleMatchFor(current) == ModuleMatch.Exact) || downloadableModules.Any(module => module.GetModuleMatchFor(current) == ModuleMatch.Exact)) + if (localModules.Any(module => module.GetModuleMatchFor(current.ModuleSpec) == ModuleMatch.Exact) || downloadableModules.Any(module => module.GetModuleMatchFor(current.ModuleSpec) == ModuleMatch.Exact)) { continue; } - if (!ModuleGraph.ContainsVertex(current)) + switch (current) { - ModuleGraph.AddVertex(current); + case LocalFileModule local: + localModules.Add(local); + break; + case RemoteModule remote: + downloadableModules.Add(remote); + break; } - ModuleGraph.AddEdge(new Edge(ModuleSpec, current)); - - var resolvedPath = Path.GetFullPath(current.Name); - if (File.Exists(resolvedPath)) + if (!ModuleGraph.ContainsVertex(current.ModuleSpec)) { - var localModule = LocalFileModule.FromFile(current.Name); - localModules.Add(localModule); + ModuleGraph.AddVertex(current.ModuleSpec); + } - localModule.Requirements.GetRequirements().ForEach(module => - { - ModuleGraph.AddEdge(new Edge(current, module)); - iterating.Enqueue(module); - }); + ModuleGraph.AddEdge(new Edge(ModuleSpec, current.ModuleSpec)); - continue; - } + current.Requirements.GetRequirements().ForEach(module => + { + Module? resolved = null; + var resolvedPath = Path.GetFullPath(module.Name); + if (File.Exists(resolvedPath)) + { + resolved = FromFile(module.Name); + } + else + { + resolved = RemoteModule.FromModuleRequirement(module); + } - var downloadableModule = RemoteModule.FromModuleRequirement(current); - downloadableModules.Add(downloadableModule); + ModuleGraph.AddEdge(new Edge(current.ModuleSpec, module)); + iterating.Enqueue(resolved); + }); } localModules.ForEach(module => @@ -63,19 +129,75 @@ private void ResolveRequirements() ResolvedModules.Add(module.Name, module); }); - foreach (var module in downloadableModules) + // foreach (var module in downloadableModules) + // { + // if (!ResolvedModules.TryGetValue(module.Name, out Module? value)) + // { + // ResolvedModules.Add(module.Name, module); + // continue; + // } + + // var existingModule = value; + // if (existingModule.Version < module.Version) + // { + // ResolvedModules[module.Name] = module; + // } + // } + + PSVersionRequirement? highestPSVersion = null; + foreach (var module in ResolvedModules.Values) { - if (!ResolvedModules.TryGetValue(module.Name, out Module? value)) + foreach (var version in module.Requirements.GetRequirements()) { - ResolvedModules.Add(module.Name, module); - continue; + if (highestPSVersion == null || version.Version > highestPSVersion.Version) + { + highestPSVersion = version; + } } + } + + if (highestPSVersion != null) + { + Requirements.AddRequirement(highestPSVersion); + } - var existingModule = value; - if (existingModule.Version < module.Version) + PSEditionRequirement? foundPSEdition = null; + ResolvedModules.SelectMany(module => module.Value.Requirements.GetRequirements()) + .ToList() + .ForEach(edition => { - ResolvedModules[module.Name] = module; - } + foundPSEdition ??= edition; + + if (edition.Edition != foundPSEdition.Edition) + { + throw new Exception("Multiple PSEditions found in resolved modules."); + } + }); + + if (foundPSEdition != null) + { + Requirements.AddRequirement(foundPSEdition); } + + ResolvedModules.Values.SelectMany(module => module.Requirements.GetRequirements()) + .ToList() + .ForEach(requirements => + { + if (Requirements.GetRequirements().Count == 0) + { + Requirements.AddRequirement(requirements); + } + }); + } + + private string GetModuleTable() + { + + var table = new StringBuilder(); + table.AppendLine("$Global:EmbeddedModules = @{"); + ResolvedModules.ToList().ForEach(module => table.AppendLine(module.Value.GetInsertableContent())); + table.AppendLine("};"); + + return table.ToString(); } } diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index d8a9a9c0..06630ab6 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -7,6 +7,9 @@ enable enable + true + portable + Properties @@ -14,7 +17,7 @@ Compiler false false - false + True - Properties Compiler Compiler @@ -65,4 +64,10 @@ + + + + + + diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs new file mode 100644 index 00000000..1ac066f9 --- /dev/null +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -0,0 +1,52 @@ +using System.Text; +using Compiler.Requirements; + +namespace Compiler.Module.Compiled; + +public abstract partial class Compiled(ModuleSpec moduleSpec) +{ + public readonly ModuleSpec ModuleSpec = moduleSpec; + + public required RequirementGroup Requirements; + + /// + /// Gets combined the hash of the content and requirements of the module. + /// + public abstract string ComputedHash { get; } + + /// + /// Determines how the content string of this module should be interpreted. + /// + public abstract ContentType ContentType { get; } + + /// + /// The version of the module, not necessarily the same as the version of the module spec. + /// + public abstract Version Version { get; } + + public abstract string StringifyContent(); + + public abstract IEnumerable GetExportedFunctions(); + + /// + /// Gets a PowerShell Hashtable that represents this module. + /// + /// + /// A Stringified PowerShell Hashtable. + /// + public virtual string GetPowerShellObject() => $$""" + @{ + Name = '{{ModuleSpec.Name}}'; + Version = '{{Version}}'; + Hash = '{{ComputedHash}}'; + Type = '{{ContentType}}'; + Content = {{StringifyContent()}} + } + """; +} + +public enum ContentType +{ + UTF8String, + ZipHex +} diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs new file mode 100644 index 00000000..f7915214 --- /dev/null +++ b/src/Compiler/Module/Compiled/Local.cs @@ -0,0 +1,63 @@ + +using System.Collections; +using System.Management.Automation.Language; +using System.Security.Cryptography; +using System.Text; +using Compiler.Requirements; +using Compiler.Text; + +namespace Compiler.Module.Compiled; + + +public class CompiledLocalModule : Compiled +{ + public readonly CompiledDocument Document; + + public readonly ScriptBlockAst Ast; + + public override string ComputedHash + { + get + { + var hashableBytes = Encoding.UTF8.GetBytes(Document.GetContent()).ToList(); + + var requirements = Requirements.GetRequirements(); + if (requirements.IsEmpty) + { + Requirements.GetRequirements().ToList().ForEach(requirement => + { + hashableBytes.AddRange(requirement.Hash); + }); + } + + return Convert.ToHexString(SHA1.HashData([.. hashableBytes])); + } + } + + public override ContentType ContentType => ContentType.UTF8String; + + /// + /// A local modules version is always 0.0.1. + /// + public override Version Version => Version.Parse("0.0.1"); + + public CompiledLocalModule(PathedModuleSpec moduleSpec, CompiledDocument document) : base(moduleSpec) + { + Document = document; + Ast = AstHelper.GetAstReportingErrors(string.Join('\n', Document.Lines), moduleSpec.FullPath, ["ModuleNotFoundDuringParse"]); + } + + public override string StringifyContent() => new StringBuilder() + .AppendLine("<#ps1#> @'") + .AppendJoin('\n', Requirements.GetRequirements().Select(requirement => + { + var data = new Hashtable() { { "NameSuffix", Convert.ToHexString(requirement.Hash) } }; + return requirement.GetInsertableLine(data); + })) + .AppendLine() + .AppendLine(Document.GetContent()) + .AppendLine("'@;") + .ToString(); + + public override IEnumerable GetExportedFunctions() => AstHelper.FindAvailableFunctions(Ast, true).Select(function => function.Name); +} diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs new file mode 100644 index 00000000..9d4fb5d5 --- /dev/null +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -0,0 +1,105 @@ +using System.Collections; +using System.IO.Compression; +using System.Security.Cryptography; +using CommandLine; +using Compiler.Requirements; +using NLog; +using NLog.LayoutRenderers; + +namespace Compiler.Module.Compiled; + +public class CompiledRemoteModule(ModuleSpec moduleSpec) : Compiled(moduleSpec) +{ + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private Hashtable? _powerShellManifest; + private ZipArchive? _zipArchive; + + public required MemoryStream MemoryStream { get; init; } + + public override string ComputedHash + { + get + { + var hashableBytes = MemoryStream.ToArray().ToList(); + + var requirements = Requirements.GetRequirements(); + if (requirements.IsEmpty) + { + Requirements.GetRequirements().ToList().ForEach(requirement => + { + hashableBytes.AddRange(requirement.Hash); + }); + } + + return Convert.ToHexString(SHA1.HashData([.. hashableBytes])); + } + } + + public override ContentType ContentType => ContentType.ZipHex; + + public override Version Version + { + get + { + var manifest = GetPowerShellManifest(); + if (manifest["ModuleVersion"] is string version) return Version.Parse(version); + return new Version(0, 0, 1); + } + } + + public override string StringifyContent() => $"'{Convert.ToHexString(MemoryStream.ToArray())}'"; + + public override IEnumerable GetExportedFunctions() + { + var manifest = GetPowerShellManifest(); + + var exportedFunctions = new List(); + var functionsToExport = manifest["FunctionsToExport"] switch + { + string[] functions => functions, + string function => [function], + object[] functions => functions.Cast(), + null => [], + _ => throw new Exception($"FunctionsToExport must be a string or an array of strings, but was {manifest["FunctionsToExport"]?.GetType()}") + }; + var cmdletsToExport = manifest["CmdletsToExport"] switch + { + string[] cmdlets => cmdlets, + string cmdlet => [cmdlet], + object[] cmdlets => cmdlets.Cast(), + null => [], + _ => throw new Exception($"CmdletsToExport must be a string or an array of strings, but was {manifest["CmdletsToExport"]?.GetType()}") + }; + + exportedFunctions.AddRange(functionsToExport); + exportedFunctions.AddRange(cmdletsToExport); + + return exportedFunctions; + } + + private ZipArchive GetZipArchive() => _zipArchive ??= new ZipArchive(MemoryStream, ZipArchiveMode.Read, true); + + private Hashtable GetPowerShellManifest() + { + if (_powerShellManifest != null) return _powerShellManifest; + + var archive = GetZipArchive(); + var psd1Entry = archive.GetEntry($"{ModuleSpec.Name}.psd1"); + if (psd1Entry == null) + { + Logger.Debug($"Failed to find the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); + _powerShellManifest = []; + return _powerShellManifest; + } + + using var psd1Stream = psd1Entry.Open(); + if (Program.RunPowerShell(new StreamReader(psd1Stream).ReadToEnd())[0].BaseObject is not Hashtable psd1) + { + Logger.Debug($"Failed to parse the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); + _powerShellManifest = []; + return _powerShellManifest; + } + + return _powerShellManifest = psd1; + } +} diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs new file mode 100644 index 00000000..edbe1b84 --- /dev/null +++ b/src/Compiler/Module/Compiled/Script.cs @@ -0,0 +1,214 @@ +using System.Collections; +using System.Management.Automation.Language; +using System.Text; +using Compiler.Analyser; +using Compiler.Module.Resolvable; +using Compiler.Requirements; +using Compiler.Text; +using NLog; +using QuikGraph; +using QuikGraph.Algorithms; +using QuikGraph.Graphviz; + +namespace Compiler.Module.Compiled; + +public class CompiledScript : Compiled +{ + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public readonly ParamBlockAst? ScriptParamBlock; + + public readonly BidirectionalGraph> Graph; + + public readonly CompiledDocument Document; + + public override string ComputedHash => throw new NotImplementedException(); + + public override ContentType ContentType => throw new NotImplementedException(); + + public override Version Version => throw new NotImplementedException(); + + public CompiledScript( + PathedModuleSpec moduleSpec, + TextEditor editor, + ResolvableParent resolvableParent, + ParamBlockAst? scriptParamBlock + ) : base(moduleSpec) + { + var graphviz = resolvableParent.Graph.ToGraphviz(alg => + { + alg.FormatVertex += (sender, args) => + { + args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; + args.VertexFormat.Comment = args.Vertex.ModuleSpec.InternalGuid.ToString(); + }; + }); + Logger.Debug("Initial graphviz:"); + Logger.Debug(graphviz); + + Document = CompiledDocument.FromBuilder(editor, 0); + ScriptParamBlock = scriptParamBlock; + Graph = new BidirectionalGraph>(); + Graph.AddVertex(this); + + Graph.VertexAdded += vertex => Logger.Debug($"Vertex added: {vertex.ModuleSpec.Name}"); + Graph.VertexRemoved += vertex => Logger.Debug($"Vertex removed: {vertex.ModuleSpec.Name}"); + Graph.EdgeAdded += edge => Logger.Debug($"Edge added: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); + Graph.EdgeRemoved += edge => Logger.Debug($"Edge removed: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); + + var loadOrder = resolvableParent.Graph.TopologicalSort(); + var reversedLoadOrder = loadOrder.Reverse(); + reversedLoadOrder.ToList().ForEach(resolvable => + { + Logger.Trace($"Compiling {resolvable.ModuleSpec.Name}"); + + var compiledRequirements = resolvableParent.Graph + .OutEdges(resolvable) + .AsParallel() + .Select(edge => + { + try + { + Logger.Trace($"Getting compiled module for {edge.Target.ModuleSpec}"); + return Graph.Vertices.First(module => module.ModuleSpec == edge.Target.ModuleSpec); + } + catch + { + Logger.Trace($"Could not find module from edge {edge.Target.ModuleSpec}"); + throw; + } + }); + + Compiled compiledModule; + if (resolvable.ModuleSpec == moduleSpec) { compiledModule = this; } + else { compiledModule = resolvable.IntoCompiled(); } + + if (compiledRequirements.Any()) { Graph.AddVerticesAndEdgeRange(compiledRequirements.Select(requirement => new Edge(compiledModule, requirement))); } + else { Graph.AddVertex(compiledModule); } + }); + + graphviz = Graph.ToGraphviz(alg => + { + alg.FormatVertex += (sender, args) => + { + args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; + args.VertexFormat.Comment = args.Vertex.ModuleSpec.InternalGuid.ToString(); + }; + }); + Logger.Debug("Compiled graphviz:"); + Logger.Debug(graphviz); + + Logger.Trace("Analyzing compiled modules."); + Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => + { + var imports = Graph.OutEdges(compiled).Select(edge => edge.Target); + StaticAnalyser.Analyse((CompiledLocalModule)compiled, [.. imports]); + }); + } + + /// + /// The script contents. + /// + /// + /// The script contents. + /// + public override string GetPowerShellObject() + { + var sb = new StringBuilder(); + + sb.AppendJoin('\n', Requirements.GetRequirements().Select(requirement => + { + var data = new Hashtable() { { "NameSuffix", Convert.ToHexString(requirement.Hash) } }; + return requirement.GetInsertableLine(data); + })); + sb.AppendLine(); + + if (ScriptParamBlock != null) + { + sb.AppendJoin('\n', ScriptParamBlock.Attributes.Select(attr => attr.Extent.Text)); + sb.AppendLine(); + + sb.Append(ScriptParamBlock.Extent.Text); + sb.AppendLine(); + } + + #region Begin Block + sb.AppendLine("begin {"); + sb.AppendLine(" $Global:CompiledScript = $True;"); + sb.AppendLine(" $Global:EmbeddedModules = @{"); + Graph.Vertices.Skip(1).ToList().ForEach(module => sb.AppendLine($$""" '{{module.ModuleSpec.Name}}' = {{module.GetPowerShellObject()}}""")); + sb.AppendLine("};"); + + sb.AppendLine(/*ps1*/ """ + $Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; + if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { + Write-Host "Creating module root folder: $Local:PrivatePSModulePath"; + New-Item -Path $Local:PrivatePSModulePath -ItemType Directory | Out-Null; + } + if (-not ($Env:PSModulePath -like "*$Local:PrivatePSModulePath*")) { + $Env:PSModulePath = "$Local:PrivatePSModulePath;" + $Env:PSModulePath; + } + $Global:EmbeddedModules.GetEnumerator() | ForEach-Object { + $Local:Content = $_.Value.Content; + $Local:Name = $_.Key; + $Local:ModuleFolderPath = Join-Path -Path $Local:PrivatePSModulePath -ChildPath $Local:Name; + if (-not (Test-Path -Path $Local:ModuleFolderPath)) { + Write-Host "Creating module folder: $Local:ModuleFolderPath"; + New-Item -Path $Local:ModuleFolderPath -ItemType Directory | Out-Null; + } + switch ($_.Value.Type) { + 'UTF8String' { + $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:Name.psm1"; + if (-not (Test-Path -Path $Local:InnerModulePath)) { + Write-Host "Writing content to module file: $Local:InnerModulePath" + Set-Content -Path $Local:InnerModulePath -Value $Content; + } + } + 'ZipHex' { + if ((Get-ChildItem -Path $Local:ModuleFolderPath).Count -ne 0) { + return; + } + [String]$Local:TempFile = [System.IO.Path]::GetTempFileName(); + [Byte[]]$Local:Bytes = [System.Convert]::FromHexString($Content); + [System.IO.File]::WriteAllBytes($Local:TempFile, $Local:Bytes); + Write-Host "Expanding module file: $Local:TempFile" + Expand-Archive -Path $Local:TempFile -DestinationPath $Local:ModuleFolderPath -Force; + } + Default { + Write-Warning "Unknown module type: $($_)"; + } + } + } + """); + + sb.AppendLine("}"); + #endregion + + #region End Block + sb.AppendLine($$""" + end { + {{Document.GetContent()}} + $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; + } + """); + #endregion + + return sb.ToString(); + } + + public override string StringifyContent() => throw new NotImplementedException(); + public override IEnumerable GetExportedFunctions() => throw new NotImplementedException(); + + private static string IndentString(string str, int indentBy, bool indentFirstLine = true) + { + var indent = new string(' ', indentBy); + var lines = str.Split('\n'); + var indentedLines = lines.Select((line, index) => + { + if (index == 0 && !indentFirstLine) { return line; } + return indent + line; + }); + + return string.Join('\n', indentedLines); + } +} diff --git a/src/Compiler/Module/CompiledModule.cs b/src/Compiler/Module/CompiledModule.cs deleted file mode 100644 index b5687e38..00000000 --- a/src/Compiler/Module/CompiledModule.cs +++ /dev/null @@ -1,203 +0,0 @@ -using System.Collections; -using System.IO.Compression; -using System.Management.Automation.Language; -using System.Security.Cryptography; -using System.Text; -using Compiler.Requirements; -using Compiler.Text; -using NLog; - -namespace Compiler.Module; - -public record CompiledModule( - ContentType ContentType, - ModuleSpec PreCompileModuleSpec, - RequirementGroup Requirements, - string Content, - int IndentBy -) -{ - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - private readonly ZipArchive? MemoryZipArchive = ContentType switch - { - ContentType.UTF8String => null, - ContentType.ZipHex => new ZipArchive(new MemoryStream(Convert.FromHexString(Content))), - _ => throw new NotImplementedException() - }; - - public ModuleSpec ModuleSpec => new( - $"{PreCompileModuleSpec.Name}-{ContentHash}", - PreCompileModuleSpec.Guid, - PreCompileModuleSpec.MinimumVersion, - PreCompileModuleSpec.MaximumVersion, - PreCompileModuleSpec.RequiredVersion, - PreCompileModuleSpec.InternalGuid - ); - - public Ast ModuleAst => GetAst(); - - public string ContentHash - { - get - { - var RawContentBytes = ContentType switch - { - ContentType.UTF8String => Encoding.UTF8.GetBytes(Content), - ContentType.ZipHex => Convert.FromHexString(Content), - _ => throw new NotImplementedException(), - }; - var requirements = Requirements.GetRequirements(); - if (requirements.IsEmpty) - { - return Convert.ToHexString(SHA1.HashData(RawContentBytes)); - } - else - { - var addedRequirements = Requirements.GetRequirements().Select(requirement => requirement.Hash).Aggregate((acc, next) => SHA256.HashData(acc.Concat(next).ToArray())); - return Convert.ToHexString(SHA1.HashData([.. RawContentBytes.Concat(addedRequirements)])); - } - } - } - - public static CompiledModule From(Module module, int indentBy) - { - Logger.Trace($"Compiling module {module.ModuleSpec.Name}"); - - return module switch - { - LocalFileModule localFileModule => new CompiledModule( - ContentType.UTF8String, - localFileModule.ModuleSpec, - localFileModule.Requirements, - CompiledDocument.FromBuilder(localFileModule.Document, 0).GetContent(), - indentBy - ), - RemoteModule remoteModule => new CompiledModule( - ContentType.ZipHex, - remoteModule.ModuleSpec, - remoteModule.Requirements, - Convert.ToHexString(remoteModule.ZipBytes.Value), - indentBy - ), - _ => throw new NotImplementedException() - }; - } - - public Ast GetAst() - { - switch (ContentType) - { - case ContentType.UTF8String: - return Parser.ParseInput(Content, PreCompileModuleSpec.Name, out _, out _); - case ContentType.ZipHex: - { - var entry = MemoryZipArchive!.GetEntry($"{PreCompileModuleSpec.Name}.psm1")!; - using var entryStream = entry.Open(); - using var reader = new StreamReader(entryStream); - return Parser.ParseInput(reader.ReadToEnd(), out _, out _); - } - default: - throw new NotImplementedException(); - } - } - - public IEnumerable GetExportedFunctions() - { - switch (ContentType) - { - case ContentType.ZipHex: - { - var entry = MemoryZipArchive!.GetEntry($"{PreCompileModuleSpec.Name}.psd1"); - using var entryStream = entry!.Open(); - using var reader = new StreamReader(entryStream); - var ast = Parser.ParseInput(reader.ReadToEnd(), out _, out _); - - // Find the values of the FunctionsToExport and CmdletsToExport keys - var functionsToExport = ast.Find(testAst => testAst is HashtableAst hashtableAst && hashtableAst.KeyValuePairs.Any(keyValuePair => (string)keyValuePair.Item1.SafeGetValue() == "FunctionsToExport"), true) as HashtableAst; - var cmdletsToExport = ast.Find(testAst => testAst is HashtableAst hashtableAst && hashtableAst.KeyValuePairs.Any(keyValuePair => (string)keyValuePair.Item1.SafeGetValue() == "CmdletsToExport"), true) as HashtableAst; - - // Join the two into a single list - // The values can be either a string or an array of strings - var exportedFunctions = new List(); - if (functionsToExport is not null) - { - var functionsToExportValue = functionsToExport.KeyValuePairs.First(keyValuePair => (string)keyValuePair.Item1.SafeGetValue() == "FunctionsToExport").Item2.SafeGetValue(); - if (functionsToExportValue is string function) - { - exportedFunctions.Add(function); - } - else if (functionsToExportValue is IEnumerable functions) - { - exportedFunctions.AddRange(functions.Cast()); - } - } - if (cmdletsToExport is not null) - { - var cmdletsToExportValue = cmdletsToExport.KeyValuePairs.First(keyValuePair => (string)keyValuePair.Item1.SafeGetValue() == "CmdletsToExport").Item2.SafeGetValue(); - if (cmdletsToExportValue is string cmdlet) - { - exportedFunctions.Add(cmdlet); - } - else if (cmdletsToExportValue is IEnumerable cmdlets) - { - exportedFunctions.AddRange(cmdlets.Cast()); - } - } - return exportedFunctions; - } - case ContentType.UTF8String: - { - var ast = GetAst(); - return AstHelper.FindAvailableFunctions(ast, true).Select(function => function.Name); - } - default: - throw new NotImplementedException(); - } - } - - public override string ToString() - { - var indentStr = new string(' ', IndentBy); - var contentIndentStr = new string(' ', IndentBy + 4); - - string contentObject; - switch (ContentType) - { - case ContentType.UTF8String: - { - var sb = new StringBuilder(); - sb.AppendLine($"<#ps1#> @'"); - - // Modules are using statements and must go below the #Requires statements - Requirements.GetRequirements().Where(requirement => requirement is not Compiler.Requirements.ModuleSpec).ToList().ForEach(requirement => sb.AppendLine(requirement.GetInsertableLine())); - Requirements.GetRequirements().ToList().ForEach(requirement => sb.AppendLine(requirement.GetInsertableLine())); - - sb.AppendLine(Content); - - sb.AppendLine("'@;"); - contentObject = sb.ToString(); - break; - } - case ContentType.ZipHex: - contentObject = $"'{Content}'"; - break; - default: - throw new NotImplementedException(); - } - - return $$""" - {{indentStr}}'{{ModuleSpec.Name}}' = @{ - {{indentStr}} Type = '{{ContentType}}'; - {{indentStr}} Hash = '{{ContentHash}}'; - {{indentStr}} Content = {{contentObject}} - {{indentStr}}}; - """; - } -} - -public enum ContentType -{ - UTF8String, - ZipHex -} diff --git a/src/Compiler/Module/CompiledScript.cs b/src/Compiler/Module/CompiledScript.cs deleted file mode 100644 index 9794dcd2..00000000 --- a/src/Compiler/Module/CompiledScript.cs +++ /dev/null @@ -1,361 +0,0 @@ -using System.Management.Automation.Language; -using System.Text; -using Compiler.Module; -using Compiler.Requirements; -using Microsoft.CodeAnalysis; -using NLog; -using QuikGraph; -using Compiler.Text; -using System.Text.RegularExpressions; -using QuikGraph.Algorithms; -using QuikGraph.Graphviz; -using Compiler.Analyser; - -namespace Compiler; - -public partial class CompiledScript : LocalFileModule -{ - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private static readonly string InvokeRunMain = "(New-Module -ScriptBlock ([ScriptBlock]::Create($Global:EmbeddedModules['{0}'].Content)) -AsCustomObject -ArgumentList {1}.BoundParameters).'Invoke-RunMain'({1}, ({2}));"; - [GeneratedRegex(@"(?smi)^Import-Module\s(?:\$PSScriptRoot)?(?:[/\\\.]*(?:(?:src|common)[/\\])+)00-Environment\.psm1;?\s*$", RegexOptions.None, "en-AU")] - private static partial Regex ImportEnvironmentRegex(); - [GeneratedRegex(@"^Invoke-RunMain\s+(?:\$MyInvocation)?\s+(?{.+})")] - private static partial Regex RunMainRegex(); - - public readonly BidirectionalGraph> ModuleGraph = new(); - public readonly List ResolvedModules = []; - public readonly ParamBlockAst? ScriptParamBlockAst; - - public CompiledScript( - string path - ) : this( - path, - new PathedModuleSpec(path, Path.GetFileNameWithoutExtension(path)), - new TextDocument(File.ReadAllLines(path)) - ) - { } - - public CompiledScript( - string path, - ModuleSpec moduleSpec, - TextDocument document - ) : base(path, moduleSpec, document) - { - Document.AddRegexEdit(ImportEnvironmentRegex(), match => null); - Document.AddRegexEdit(RunMainRegex(), UpdateOptions.MatchEntireDocument, match => - { - var block = match.Groups["Block"].Value; - var invocation = match.Groups.ContainsKey("Invocation") ? match.Groups["Invocation"].Value : "$MyInvocation"; - - Logger.Debug("Invocation: {0}", invocation); - Logger.Debug("Block: {0}", block); - Logger.Debug("ResolvedModules: {0}", ResolvedModules.Count); - - return string.Format(InvokeRunMain, ResolvedModules.Find(module => module.PreCompileModuleSpec.Name == "00-Environment")!.ModuleSpec.Name, invocation, block); - }); - - // Extract the param block and its attributes from the script and store it in a variable so we can place it at the top of the script later. - ScriptParamBlockAst = ExtractParameterBlock(); - ResolveRequirements(); - } - - public string Compile() - { - var script = new StringBuilder(); - - Requirements.GetRequirements().ToList().ForEach(requirement => script.AppendLine(requirement.GetInsertableLine())); - - if (ScriptParamBlockAst != null) - { - ScriptParamBlockAst.Attributes.ToList().ForEach(attribute => - { - script.AppendLine(attribute.Extent.Text); - }); - - script.AppendLine(ScriptParamBlockAst.Extent.Text); - } - - #region Begin Block - script.AppendLine("begin {"); - - script.AppendLine(" $Global:CompiledScript = $True;"); - script.AppendLine(" $Global:EmbeddedModules = @{"); - ResolvedModules.ToList().ForEach(module => script.AppendLine(module.ToString())); - script.AppendLine("};"); - - script.AppendLine(/*ps1*/ """ - $Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; - if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { - Write-Host "Creating module root folder: $Local:PrivatePSModulePath"; - New-Item -Path $Local:PrivatePSModulePath -ItemType Directory | Out-Null; - } - if (-not ($Env:PSModulePath -like "*$Local:PrivatePSModulePath*")) { - $Env:PSModulePath = "$Local:PrivatePSModulePath;" + $Env:PSModulePath; - } - $Global:EmbeddedModules.GetEnumerator() | ForEach-Object { - $Local:Content = $_.Value.Content; - $Local:Name = $_.Key; - $Local:ModuleFolderPath = Join-Path -Path $Local:PrivatePSModulePath -ChildPath $Local:Name; - if (-not (Test-Path -Path $Local:ModuleFolderPath)) { - Write-Host "Creating module folder: $Local:ModuleFolderPath"; - New-Item -Path $Local:ModuleFolderPath -ItemType Directory | Out-Null; - } - switch ($_.Value.Type) { - 'UTF8String' { - $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:Name.psm1"; - if (-not (Test-Path -Path $Local:InnerModulePath)) { - Write-Host "Writing content to module file: $Local:InnerModulePath" - Set-Content -Path $Local:InnerModulePath -Value $Content; - } - } - 'ZipHex' { - if ((Get-ChildItem -Path $Local:ModuleFolderPath).Count -ne 0) { - return; - } - [String]$Local:TempFile = [System.IO.Path]::GetTempFileName(); - [Byte[]]$Local:Bytes = [System.Convert]::FromHexString($Content); - [System.IO.File]::WriteAllBytes($Local:TempFile, $Local:Bytes); - Write-Host "Expanding module file: $Local:TempFile" - Expand-Archive -Path $Local:TempFile -DestinationPath $Local:ModuleFolderPath -Force; - } - Default { - Write-Warning "Unknown module type: $($_)"; - } - } - } - """); - - script.AppendLine("}"); - #endregion - - #region End Block - script.AppendLine($$""" - end { - {{CompiledDocument.FromBuilder(Document, 4).GetContent()}} - $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; - } - """); - #endregion - return script.ToString(); - } - - public ParamBlockAst? ExtractParameterBlock() - { - var scriptParamBlockAst = Ast.ParamBlock; - - if (scriptParamBlockAst == null) - { - return null; - } - - Document.AddExactEdit( - scriptParamBlockAst.Extent.StartLineNumber - 1, - scriptParamBlockAst.Extent.StartColumnNumber - 1, - scriptParamBlockAst.Extent.EndLineNumber - 1, - scriptParamBlockAst.Extent.EndColumnNumber - 1, - lines => [] - ); - - scriptParamBlockAst.Attributes.ToList().ForEach(attribute => - { - Document.AddExactEdit( - attribute.Extent.StartLineNumber - 1, - attribute.Extent.StartColumnNumber - 1, - attribute.Extent.EndLineNumber - 1, - attribute.Extent.EndColumnNumber - 1, - lines => [] - ); - }); - - return scriptParamBlockAst; - } - - // TODO - This is a bit of a mess. Refactor this to be more readable, maybe split it into smaller functions. - private void ResolveRequirements() - { - var (ModuleGraph, unsortedModules) = CreateModuleGraph(this); - var sortedModules = new Queue(ModuleGraph.TopologicalSort().Reverse()) ?? throw new Exception("Cyclic dependency detected."); - var graphviz = ModuleGraph.ToGraphviz(alg => - { - alg.FormatVertex += (sender, args) => - { - args.VertexFormat.Label = args.Vertex.Name; - args.VertexFormat.Comment = args.Vertex.InternalGuid.ToString(); - }; - }); - Logger.Info(message: graphviz); - - ModuleGraph.TopologicalSort().Skip(1).Reverse().ToList().ForEach(moduleSpec => - { - var matchingModule = unsortedModules.Find(module => moduleSpec.CompareTo(module.ModuleSpec) == ModuleMatch.Same) ?? throw new Exception($"Could not find module {moduleSpec.Name} in local or downloadable modules.")!; - // Update the ModuleSpecs in the resolved modules list to be the actual modules. - matchingModule.Requirements.GetRequirements().ToList().ForEach(requirement => - { - Logger.Debug("Getting matching module for {0}", requirement.Name); - var matchingModuleSpec = ResolvedModules.Find(module => - { - Logger.Debug("Comparing {0} to {1}", module.ModuleSpec.Name, requirement.Name); - Logger.Debug("InternalGuid: {0} == {1}", module.ModuleSpec.InternalGuid, requirement.InternalGuid); - - return module.ModuleSpec.InternalGuid == requirement.InternalGuid; - })?.ModuleSpec; - Logger.Debug("Found matching module {0}", matchingModuleSpec?.Name); - - matchingModule.Requirements.RemoveRequirement(requirement); - matchingModule.Requirements.AddRequirement(matchingModuleSpec ?? throw new Exception($"Could not find module {requirement.Name} in resolved modules.")); - }); - - var compiledModule = CompiledModule.From(matchingModule, 8); - // Only validate unknown requirements for local modules. - if (matchingModule is LocalFileModule) - { - var importedModulesResolved = matchingModule.Requirements.GetRequirements().Select(req => ResolvedModules.Find(module => module.ModuleSpec.InternalGuid == req.InternalGuid)); - StaticAnalyser.Analyse(compiledModule, [.. importedModulesResolved]); - } - ResolvedModules.Add(compiledModule); - }); - - PSVersionRequirement? highestPSVersion = null; - foreach (var module in ResolvedModules) - { - foreach (var version in module.Requirements.GetRequirements()) - { - if (highestPSVersion == null || version.Version > highestPSVersion.Version) - { - highestPSVersion = version; - } - } - } - - if (highestPSVersion != null) - { - Requirements.AddRequirement(highestPSVersion); - } - - PSEditionRequirement? foundPSEdition = null; - ResolvedModules.SelectMany(module => module.Requirements.GetRequirements()) - .ToList() - .ForEach(edition => - { - foundPSEdition ??= edition; - - if (edition.Edition != foundPSEdition.Edition) - { - throw new Exception("Multiple PSEditions found in resolved modules."); - } - }); - - if (foundPSEdition != null) - { - Requirements.AddRequirement(foundPSEdition); - } - - ResolvedModules.SelectMany(module => module.Requirements.GetRequirements()) - .ToList() - .ForEach(requirements => - { - if (Requirements.GetRequirements().Count == 0) - { - Requirements.AddRequirement(requirements); - } - }); - } - - public static Module.Module? LinkFindingPossibleResolved( - ModuleSpec? parentModule, - ModuleSpec currentModule, - List unsortedModules, - ref BidirectionalGraph> moduleGraph - ) - { - var alreadyResolvedModule = unsortedModules.Find(module => module.GetModuleMatchFor(currentModule) == ModuleMatch.Same); - if (alreadyResolvedModule != null) - { - if (!moduleGraph.ContainsVertex(alreadyResolvedModule.ModuleSpec)) - { - Logger.Debug("Adding vertex for {0}", alreadyResolvedModule.Name); - moduleGraph.AddVertex(alreadyResolvedModule.ModuleSpec); - } - - Logger.Debug("Skipping {0} because it is already resolved.", currentModule.Name); - if (parentModule != null) - { - moduleGraph.AddEdge(new Edge(parentModule, alreadyResolvedModule.ModuleSpec)); - } - - return alreadyResolvedModule; - } - - if (!moduleGraph.ContainsVertex(currentModule)) - { - Logger.Debug("Adding vertex for {0}", currentModule.Name); - moduleGraph.AddVertex(currentModule); - } - - if (parentModule != null) - { - Logger.Debug("Adding edge from {0} to {1}", parentModule.Name, currentModule.Name); - moduleGraph.AddEdge(new Edge(parentModule, currentModule)); - } - - return null; - } - - public static (BidirectionalGraph>, List) CreateModuleGraph(Module.Module rootModule) - { - var moduleGraph = new BidirectionalGraph>(); - var unsortedModules = new HashSet(); - - var iterating = new Queue<(Module.Module?, Module.Module)>([(null, rootModule)]); - do - { - var (parentModule, currentModule) = iterating.Dequeue()!; - Logger.Debug($"Resolving requirements for {currentModule.Name}"); - - // The parent was a module which was already resolved, so we can skip this one as it would be an orphan. - if (parentModule != null && !moduleGraph.ContainsVertex(parentModule.ModuleSpec)) - { - Logger.Debug($"Parent to {0} was determined to be already resolved, skipping.", currentModule.Name); - continue; - } - - var resolvedModule = LinkFindingPossibleResolved(parentModule?.ModuleSpec, currentModule.ModuleSpec, [.. unsortedModules], ref moduleGraph); - // The module has already been resolved, so we can skip this one. - if (resolvedModule != null) - { - // Update the modules RequirementGroup to the correct specs. - if (parentModule != null) - { - Logger.Debug("Updating requirements for parent {0}", parentModule.Name); - - Logger.Debug("Replacing {0} with {1} in requirements for {2}", currentModule.ModuleSpec.InternalGuid, resolvedModule.ModuleSpec.InternalGuid, parentModule.Name); - - var replacingReq = parentModule.Requirements.GetRequirements().ToList().Find(req => req.InternalGuid == currentModule.ModuleSpec.InternalGuid)!; - parentModule.Requirements.RemoveRequirement(replacingReq); - parentModule.Requirements.AddRequirement(resolvedModule.ModuleSpec); - } - - continue; - } - - unsortedModules.Add(currentModule); - - currentModule.Requirements.GetRequirements().ToList().ForEach(nestedRequirement => - { - Logger.Debug($"Adding {nestedRequirement.Name} to the queue."); - Module.Module? requirementModule = null; - if (currentModule is LocalFileModule local) - { - var parentPath = Path.GetDirectoryName(local.FilePath); - requirementModule ??= TryFromFile(parentPath!, nestedRequirement); - } - requirementModule ??= new RemoteModule(nestedRequirement); - - iterating.Enqueue((currentModule, requirementModule ?? throw new Exception("Could not resolve module."))); - }); - } while (iterating.Count > 0); - - - return (moduleGraph, [.. unsortedModules]); - } -} diff --git a/src/Compiler/Module/Local.cs b/src/Compiler/Module/Local.cs deleted file mode 100644 index 01972f59..00000000 --- a/src/Compiler/Module/Local.cs +++ /dev/null @@ -1,241 +0,0 @@ -using System.Management.Automation; -using System.Management.Automation.Language; -using System.Text.RegularExpressions; -using CommandLine; -using Compiler.Requirements; -using Compiler.Text; -using NLog; - -namespace Compiler.Module; - -public partial class LocalFileModule : Module -{ - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - protected readonly ScriptBlockAst Ast; - public readonly TextEditor Document; - public readonly string FilePath; - - public LocalFileModule(string path, Guid moduleGuid) : this( - path, - new PathedModuleSpec(path, Path.GetFileNameWithoutExtension(path), PassedInternalGuid: moduleGuid), - new TextDocument(File.ReadAllLines(path)) - ) - { } - - public LocalFileModule( - string path, - ModuleSpec moduleSpec, - TextDocument document, - bool skipAstErrors = false, - bool skipCleanup = false - ) : base(moduleSpec) - { - FilePath = path; - Document = new TextEditor(document); - Ast = GetAstReportingErrors(string.Join('\n', Document.Document.Lines), skipAstErrors); - - ResolveRequirements(); - ResolveUsingStatements(); - - if (skipCleanup) - { - return; - } - - CompressLines(); - FixLines(); - - // Check the AST for any issues that have been introduced by the cleanup. - GetAstReportingErrors(string.Join('\n', Document.Document.Lines), skipAstErrors); - } - - private static ScriptBlockAst GetAstReportingErrors(string astContent, bool ignoreErrors = false) - { - var ast = System.Management.Automation.Language.Parser.ParseInput(astContent, out _, out ParseError[] ParserErrors); - - ParserErrors = [.. ParserErrors.ToList().FindAll(error => !error.ErrorId.Equals("ModuleNotFoundDuringParse"))]; - if (!ignoreErrors && ParserErrors.Length > 0) - { - Logger.Error("There was an issue trying to parse the script."); - throw new ParseException(ParserErrors); - } - - return ast; - } - - private void CompressLines() - { - // Remove empty lines - Document.AddRegexEdit(0, EntireEmptyLineRegex(), _ => { return null; }); - - // Document Blocks - Document.AddPatternEdit( - 5, - DocumentationStartRegex(), - DocumentationEndRegex(), - (lines) => { return []; }); - - // Entire Line Comments - Document.AddRegexEdit(10, EntireLineCommentRegex(), _ => { return null; }); - - // Comments at the end of a line, after some code. - Document.AddRegexEdit(priority: 15, EndOfLineComment(), _ => { return null; }); - } - - public void FixLines() - { - // Fix indentation for Multiline Strings - Document.AddPatternEdit( - 80, - MultilineStringOpenRegex(), - MultilineStringCloseRegex(), - UpdateOptions.InsertInline, - (lines) => - { - // Get the multiline indent level from the last line of the string. - // This is used so we don't remove any whitespace that is part of the actual string formatting. - var indentLevel = BeginingWhitespaceMatchRegex().Match(lines.Last()).Value.Length; - var updatedLines = lines.Select((line, index) => - { - if (index < 1 || string.IsNullOrWhiteSpace(line)) - { - return line; - } - - return line[indentLevel..]; - }); - - return updatedLines.ToArray(); - }); - } - - private void ResolveRequirements() - { - foreach (var match in Document.Document.Lines.SelectMany(line => RequiresStatementRegex().Matches(line).Cast())) - { - var type = match.Groups["type"].Value; - // C# Switch statements are fucking grose. - switch (type) - { - case "Version": - var parsedVersion = Version.Parse(match.Groups["value"].Value)!; - Requirements.AddRequirement(new PSVersionRequirement(parsedVersion)); - break; - case "Modules": - var modules = match.Groups["value"].Value.Split(',').Select(v => v.Trim()).ToArray(); - foreach (var module in modules) - { - Requirements.AddRequirement(new ModuleSpec( - Name: module - )); - } - - break; - default: - Logger.Error($"Not sure what to do with unexpected type: {type}, skipping."); - break; - }; - } - } - - private void ResolveUsingStatements() - { - AstHelper.FindDeclaredModules(ast: Ast).ToList().ForEach(module => - { - Requirements.AddRequirement(new ModuleSpec( - Name: module.Key, - Guid: module.Value.TryGetValue("Guid", out object? value) ? Guid.Parse(value.Cast()) : null, - MinimumVersion: module.Value.TryGetValue("ModuleVersion", out object? minimumVersion) ? Version.Parse(minimumVersion.Cast()) : null, - MaximumVersion: module.Value.TryGetValue("MaximumVersion", out object? maximumVersion) ? Version.Parse(maximumVersion.Cast()) : null, - RequiredVersion: module.Value.TryGetValue("RequiredVersion", out object? requiredVersion) ? Version.Parse(requiredVersion.Cast()) : null - )); - - if (module.Value.TryGetValue("AST", out object? obj) && obj is UsingStatementAst ast) - { - // TODO - Remove the ; if it is at the end of the line - Document.AddExactEdit( - ast.Extent.StartLineNumber - 1, - ast.Extent.StartColumnNumber - 1, - ast.Extent.EndLineNumber - 1, - ast.Extent.EndColumnNumber - 1, - lines => [] - ); - } - else - { - Logger.Warn($"No AST found for module {module.Key}"); - } - }); - - AstHelper.FindDeclaredNamespaces(Ast).ToList().ForEach(statement => - { - var ns = statement.Item1; - var ast = statement.Item2; - - Requirements.AddRequirement(new UsingNamespace(ns)); - // TODO - Remove the ; if it is at the end of the line - Document.AddExactEdit( - ast.Extent.StartLineNumber - 1, - ast.Extent.StartColumnNumber - 1, - ast.Extent.EndLineNumber - 1, - ast.Extent.EndColumnNumber - 1, - lines => [] - ); - }); - } - - public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) - { - // Local files have nothing but a name. - if (ModuleSpec.Name == requirement.Name) - { - return ModuleMatch.Same; - } - - return ModuleMatch.None; - } - - public static LocalFileModule? TryFromFile(string relativeFrom, ModuleSpec spec) - { - var fullPath = spec switch - { - PathedModuleSpec pathedSpec => pathedSpec.FullPath, - _ => Path.GetFullPath(Path.Combine(relativeFrom, spec.Name)) - }; - - Logger.Debug($"Trying to load local file: {fullPath}"); - if (!File.Exists(fullPath)) - { - Logger.Debug($"File does not exist: {fullPath}"); - return null; - } - - return new LocalFileModule(fullPath, spec.InternalGuid); - } - - [GeneratedRegex(@"^\s*#Requires -(?[A-Z]+) (?.+)$")] - private static partial Regex RequiresStatementRegex(); - - [GeneratedRegex(@"^\s*")] - private static partial Regex BeginingWhitespaceMatchRegex(); - [GeneratedRegex(@"^(?!\n)*$")] - public static partial Regex EntireEmptyLineRegex(); - - [GeneratedRegex(@"^(?!\n)\s*<#")] - public static partial Regex DocumentationStartRegex(); - - [GeneratedRegex(@"^(?!\n)\s*#>")] - public static partial Regex DocumentationEndRegex(); - - [GeneratedRegex(@"^(?!\n)\s*#.*$")] - public static partial Regex EntireLineCommentRegex(); - - [GeneratedRegex(@"(?!\n)\s*(?).*$")] - public static partial Regex EndOfLineComment(); - - [GeneratedRegex(@"^.*@[""']")] - public static partial Regex MultilineStringOpenRegex(); - - [GeneratedRegex(@"^\s*[""']@")] - public static partial Regex MultilineStringCloseRegex(); -} diff --git a/src/Compiler/Module/Module.cs b/src/Compiler/Module/Module.cs index 48dc6fe6..a5758137 100644 --- a/src/Compiler/Module/Module.cs +++ b/src/Compiler/Module/Module.cs @@ -4,9 +4,8 @@ namespace Compiler.Module; public abstract partial class Module(ModuleSpec moduleSpec) { - public string Name => ModuleSpec.Name; - public Version Version => ModuleSpec.RequiredVersion ?? new Version(0, 0, 0, 0); - public ModuleSpec ModuleSpec { get; } = moduleSpec; + public virtual ModuleSpec ModuleSpec { get; } = moduleSpec; + public RequirementGroup Requirements { get; } = new(); public abstract ModuleMatch GetModuleMatchFor(ModuleSpec requirement); @@ -21,6 +20,11 @@ public enum ModuleMatch /// Same, + /// + /// This module is both stricter and looser than the requirements, and can be merged. + /// + MergeRequired, + /// /// This module fulfills the requirements, but has a stricter scope. /// diff --git a/src/Compiler/Module/Remote.cs b/src/Compiler/Module/Remote.cs deleted file mode 100644 index 1de3f08b..00000000 --- a/src/Compiler/Module/Remote.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Management.Automation; -using System.Management.Automation.Runspaces; -using Compiler.Requirements; -using NLog; - -namespace Compiler.Module; - -public class RemoteModule(ModuleSpec moduleSpec) : Module(moduleSpec) -{ - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - private string CachePath => Path.Join( - Path.GetTempPath(), - "PowerShellGet", - ModuleSpec.Name - ); - - public Lazy ZipBytes => new(() => File.ReadAllBytes(FindCachedResult() ?? CacheResult())); - - public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) - { - return ModuleSpec.CompareTo(requirement); - } - - public string? FindCachedResult() - { - if (!Directory.Exists(CachePath)) - { - return null; - } - - var files = Directory.GetFiles(CachePath, "*.nupkg"); - if (files.Length == 0) - { - return null; - } - - var versions = files.Select(file => - { - var fileName = Path.GetFileName(file); - var version = fileName.Substring(ModuleSpec.Name.Length + 1, fileName.Length - ModuleSpec.Name.Length - 1 - ".nupkg".Length); - return new Version(version); - }); - - var selectedVersion = versions.Where(version => - { - var otherSpec = new ModuleSpec(ModuleSpec.Name, ModuleSpec.Guid, RequiredVersion: version); - var matchType = ModuleSpec.CompareTo(otherSpec); - - return matchType == ModuleMatch.Same || matchType == ModuleMatch.Stricter; - }).OrderByDescending(version => version).FirstOrDefault(); - - return selectedVersion == null ? null : Path.Join(CachePath, $"{ModuleSpec.Name}.{selectedVersion}.nupkg"); - } - - public string CacheResult() - { - var versionString = ConvertVersionParameters(ModuleSpec.RequiredVersion?.ToString(), ModuleSpec.MinimumVersion?.ToString(), ModuleSpec.MaximumVersion?.ToString()); - var PowerShellCode = /*ps1*/ $$""" - Set-PSResourceRepository -Name PSGallery -Trusted -Confirm:$False; - - try { - $Module = Find-PSResource -Name '{{ModuleSpec.Name}}' {{(versionString != null ? $"-Version '{versionString}'" : "")}}; - } catch { - exit 10; - } - - try { - $Module | Save-PSResource -Path '{{CachePath}}' -AsNupkg; - } catch { - exit 11; - } - - return $env:TEMP | Join-Path -ChildPath "PowerShellGet/{{ModuleSpec.Name}}/{{ModuleSpec.Name}}.$($Module.Version).nupkg"; - """; - - if (!Directory.Exists(CachePath)) - { - Directory.CreateDirectory(CachePath); - } - - var pwsh = PowerShell.Create(RunspaceMode.NewRunspace); - pwsh.RunspacePool = Program.RunspacePool.Value; - pwsh.AddScript(PowerShellCode); - var result = pwsh.Invoke(); - - if (pwsh.HadErrors) - { - throw new Exception($"Failed to download module {ModuleSpec.Name} from the PowerShell Gallery. Error: {pwsh.Streams.Error[0].Exception.Message}"); - } - - var returnedResult = result.First().ToString(); - Logger.Debug($"Downloaded module {ModuleSpec.Name} from the PowerShell Gallery to {returnedResult}."); - return returnedResult; - } - - // Based on https://github.com/PowerShell/PowerShellGet/blob/c6aea39ea05491c648efd7aebdefab1ae7c5b213/src/PowerShellGet.psm1#L111-L144 - private static string? ConvertVersionParameters( - string? requiredVersion, - string? minimumVersion, - string? maximumVersion) => (requiredVersion, minimumVersion, maximumVersion) switch - { - (null, null, null) => null, - (string ver, null, null) => ver, - (_, string min, null) => $"[{min},)", - (_, null, string max) => $"(,{max}]", - (_, string min, string max) => $"[{min},{max}]" - }; -} diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs new file mode 100644 index 00000000..a0758f31 --- /dev/null +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -0,0 +1,205 @@ +using System.Management.Automation.Language; +using System.Text.RegularExpressions; +using Compiler.Module.Compiled; +using Compiler.Requirements; +using Compiler.Text; + +namespace Compiler.Module.Resolvable; + +public partial class ResolvableLocalModule : Resolvable +{ + private RequirementGroup? _requirements; + internal readonly ScriptBlockAst _ast; + + public readonly TextEditor Editor; + public override PathedModuleSpec ModuleSpec => (PathedModuleSpec)base.ModuleSpec; + + /// + /// Creates a new LocalModule from the moduleSpec and a path to the root to find the path. + /// + /// + /// + /// Thrown when the path is not a valid module path. + public ResolvableLocalModule( + string parentPath, + ModuleSpec moduleSpec + ) : this( + moduleSpec is PathedModuleSpec pathedModuleSpec + ? pathedModuleSpec + : new PathedModuleSpec( + Path.GetFullPath(Path.Combine(parentPath, moduleSpec.Name)), + Path.GetFileNameWithoutExtension(moduleSpec.Name) + ) + ) + { + if (!Path.IsPathRooted(parentPath)) throw new InvalidModulePathException("The parent path must be an absolute path."); + if (!Directory.Exists(parentPath)) throw new InvalidModulePathException("The parent path must be a file."); + } + + public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) + { + if (!File.Exists(moduleSpec.FullPath)) throw new InvalidModulePathException($"The module path must be a file, got {moduleSpec.FullPath}"); + Editor = new TextEditor(new TextDocument(File.ReadAllLines(moduleSpec.FullPath))); + _ast = AstHelper.GetAstReportingErrors(string.Join('\n', Editor.Document.Lines), moduleSpec.FullPath, ["ModuleNotFoundDuringParse"]); + + // Remove empty lines + Editor.AddRegexEdit(0, EntireEmptyLineRegex(), _ => { return null; }); + + // Document Blocks + Editor.AddPatternEdit( + 5, + DocumentationStartRegex(), + DocumentationEndRegex(), + (lines) => { return []; }); + + // Entire Line Comments + Editor.AddRegexEdit(10, EntireLineCommentRegex(), _ => { return null; }); + + // Comments at the end of a line, after some code. + Editor.AddRegexEdit(priority: 15, EndOfLineComment(), _ => { return null; }); + + // Remove #Requires statements + Editor.AddRegexEdit(20, RequiresStatementRegex(), _ => { return null; }); + + // Fix indentation for Multiline Strings + Editor.AddPatternEdit( + 80, + MultilineStringOpenRegex(), + MultilineStringCloseRegex(), + UpdateOptions.InsertInline, + (lines) => + { + // Get the multiline indent level from the last line of the string. + // This is used so we don't remove any whitespace that is part of the actual string formatting. + var indentLevel = BeginingWhitespaceMatchRegex().Match(lines.Last()).Value.Length; + var updatedLines = lines.Select((line, index) => + { + if (index < 1 || string.IsNullOrWhiteSpace(line)) + { + return line; + } + + return line[indentLevel..]; + }); + + return updatedLines.ToArray(); + }); + } + + /// + /// Returns the module match for the given requirement. + /// + /// Module matches for Local files are based on only the name of the module. + /// + /// + /// The requirement to match against. + /// + /// + /// The module match for the given requirement. + /// + public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) + { + // Local files have nothing but a name. + if (ModuleSpec.Name == requirement.Name) + { + return ModuleMatch.Same; + } + + return ModuleMatch.None; + } + + public override RequirementGroup ResolveRequirements() + { + if (_requirements != null) return _requirements; + var requirementGroup = new RequirementGroup(); + + AstHelper.FindDeclaredModules(_ast).ToList().ForEach(module => + { + if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) + { + Editor.AddExactEdit( + ast.Extent.StartLineNumber - 1, + ast.Extent.StartColumnNumber - 1, + ast.Extent.EndLineNumber - 1, + ast.Extent.EndColumnNumber - 1, + _ => [] + ); + } + + module.Value.TryGetValue("Guid", out var guid); + module.Value.TryGetValue("MinimumVersion", out var minimumVersion); + module.Value.TryGetValue("MaximumVersion", out var maximumVersion); + module.Value.TryGetValue("RequiredVersion", out var requiredVersion); + var spec = new ModuleSpec( + module.Key, + (Guid?)guid, + (Version?)minimumVersion, + (Version?)maximumVersion, + (Version?)requiredVersion + ); + + requirementGroup.AddRequirement(spec); + }); + + AstHelper.FindDeclaredNamespaces(_ast).ToList().ForEach(statement => + { + Editor.AddExactEdit( + statement.Item2.Extent.StartLineNumber - 1, + statement.Item2.Extent.StartColumnNumber - 1, + statement.Item2.Extent.EndLineNumber - 1, + statement.Item2.Extent.EndColumnNumber - 1, + _ => [] + ); + + var ns = new UsingNamespace(statement.Item1); + requirementGroup.AddRequirement(ns); + }); + + return _requirements = requirementGroup; + } + + public override Compiled.Compiled IntoCompiled() => new CompiledLocalModule(ModuleSpec, CompiledDocument.FromBuilder(Editor, 0)) + { + Requirements = ResolveRequirements() + }; + + public override bool Equals(object? obj) + { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + return obj is ResolvableLocalModule other && + ModuleSpec.CompareTo(other.ModuleSpec) == ModuleMatch.Same && + Editor.Document.Lines == other.Editor.Document.Lines; + } + + public override int GetHashCode() => ModuleSpec.GetHashCode(); + + #region Regex Patterns + [GeneratedRegex(@"^\s*")] + private static partial Regex BeginingWhitespaceMatchRegex(); + [GeneratedRegex(@"^(?!\n)*$")] + public static partial Regex EntireEmptyLineRegex(); + + [GeneratedRegex(@"^(?!\n)\s*<#")] + public static partial Regex DocumentationStartRegex(); + + [GeneratedRegex(@"^(?!\n)\s*#>")] + public static partial Regex DocumentationEndRegex(); + + [GeneratedRegex(@"^(?!\n)\s*#.*$")] + public static partial Regex EntireLineCommentRegex(); + + [GeneratedRegex(@"(?!\n)\s*(?).*$")] + public static partial Regex EndOfLineComment(); + + [GeneratedRegex(@"^.*@[""']")] + public static partial Regex MultilineStringOpenRegex(); + + [GeneratedRegex(@"^\s*[""']@")] + public static partial Regex MultilineStringCloseRegex(); + [GeneratedRegex(@"^\s*#Requires\s+-Version\s+\d+\.\d+")] + private static partial Regex RequiresStatementRegex(); + #endregion +} + +public class InvalidModulePathException(string message) : Exception(message); diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs new file mode 100644 index 00000000..36b32561 --- /dev/null +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -0,0 +1,174 @@ +using System.Collections; +using System.IO.Compression; +using System.Management.Automation; +using Compiler.Module.Compiled; +using Compiler.Requirements; +using NLog; + +namespace Compiler.Module.Resolvable; + +public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSpec) +{ + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + private MemoryStream? _memoryStream; + private string? _cachedFile; + + private string CachePath => Path.Join( + Path.GetTempPath(), + "PowerShellGet", + ModuleSpec.Name + ); + + public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) => ModuleSpec.CompareTo(requirement); + + public override RequirementGroup ResolveRequirements() + { + var requirementGroup = new RequirementGroup(); + + var memoryStream = _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false); + using var archive = new ZipArchive(memoryStream, ZipArchiveMode.Read, true); + var psd1Entry = archive.GetEntry($"{ModuleSpec.Name}.psd1"); + if (psd1Entry == null) + { + Logger.Debug($"Failed to find the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); + return requirementGroup; + } + + // Read the PSD1 file and parse it as a hashtable. + using var psd1Stream = psd1Entry.Open(); + if (PowerShell.Create().AddScript(new StreamReader(psd1Stream).ReadToEnd()).Invoke()[0].BaseObject is not Hashtable psd1) + { + Logger.Debug($"Failed to parse the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); + return requirementGroup; + } + + if (psd1["PowerShellVersion"] is string psVersion) requirementGroup.AddRequirement(new PSVersionRequirement(Version.Parse(psVersion))); + if (psd1["RequiredModules"] is object[] requiredModules) + { + foreach (var requiredModule in requiredModules.Cast()) + { + var moduleName = requiredModule["ModuleName"]!.ToString(); + _ = Version.TryParse((string?)requiredModule["ModuleVersion"], out var minimumVersion); + _ = Version.TryParse((string?)requiredModule["MaximumVersion"], out var maximumVersion); + _ = Version.TryParse((string?)requiredModule["RequiredVersion"], out var requiredVersion); + _ = Guid.TryParse((string?)requiredModule["Guid"], out var guid); + + var requiredModuleSpec = new ModuleSpec(moduleName!, guid, minimumVersion, maximumVersion, requiredVersion); + requirementGroup.AddRequirement(requiredModuleSpec); + } + } + + + return requirementGroup; + } + + public override Compiled.Compiled IntoCompiled() => new CompiledRemoteModule(ModuleSpec) + { + MemoryStream = _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false), + Requirements = ResolveRequirements() + }; + + public override bool Equals(object? obj) + { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + return obj is ResolvableRemoteModule other && + ModuleSpec.CompareTo(other.ModuleSpec) == ModuleMatch.Same; + } + + public string? FindCachedResult() + { + if (_cachedFile != null) return _cachedFile; + + if (!Directory.Exists(CachePath)) + { + return null; + } + + var files = Directory.GetFiles(CachePath, "*.nupkg"); + if (files.Length == 0) + { + return null; + } + + var versions = files.Where(file => + { + var fileName = Path.GetFileName(file); + return fileName.StartsWith(ModuleSpec.Name); + }).Select(file => + { + var fileName = Path.GetFileName(file); + var version = fileName.Substring(ModuleSpec.Name.Length + 1, fileName.Length - ModuleSpec.Name.Length - 1 - ".nupkg".Length); + + try { return new Version(version); } + catch { throw new Exception($"Failed to parse version {version} from file {file}"); } + }); + + var selectedVersion = versions.Where(version => + { + var otherSpec = new ModuleSpec(ModuleSpec.Name, ModuleSpec.Guid, RequiredVersion: version); + var matchType = ModuleSpec.CompareTo(otherSpec); + + return matchType == ModuleMatch.Same || matchType == ModuleMatch.Stricter; + }).OrderByDescending(version => version).FirstOrDefault(); + + return selectedVersion == null ? null : _cachedFile = Path.Join(CachePath, $"{ModuleSpec.Name}.{selectedVersion}.nupkg"); + } + + public string CacheResult() + { + var versionString = ConvertVersionParameters(ModuleSpec.RequiredVersion?.ToString(), ModuleSpec.MinimumVersion?.ToString(), ModuleSpec.MaximumVersion?.ToString()); + var PowerShellCode = /*ps1*/ $$""" + Set-PSResourceRepository -Name PSGallery -Trusted -Confirm:$False; + + try { + $Module = Find-PSResource -Name '{{ModuleSpec.Name}}' {{(versionString != null ? $"-Version '{versionString}'" : "")}}; + } catch { + exit 10; + } + + try { + $Module | Save-PSResource -Path '{{CachePath}}' -AsNupkg -SkipDependencyCheck; + } catch { + exit 11; + } + + return $env:TEMP | Join-Path -ChildPath "PowerShellGet/{{ModuleSpec.Name}}/{{ModuleSpec.Name}}.$($Module.Version).nupkg"; + """; + + if (!Directory.Exists(CachePath)) + { + Directory.CreateDirectory(CachePath); + } + + var pwsh = PowerShell.Create(RunspaceMode.NewRunspace); + pwsh.RunspacePool = Program.RunspacePool.Value; + pwsh.AddScript(PowerShellCode); + var result = pwsh.Invoke(); + + if (pwsh.HadErrors) + { + throw new Exception($"Failed to download module {ModuleSpec.Name} from the PowerShell Gallery. Error: {pwsh.Streams.Error[0].Exception.Message}"); + } + + var returnedResult = result.First().ToString(); + Logger.Debug($"Downloaded module {ModuleSpec.Name} from the PowerShell Gallery to {returnedResult}."); + return returnedResult; + } + + // Based on https://github.com/PowerShell/PowerShellGet/blob/c6aea39ea05491c648efd7aebdefab1ae7c5b213/src/PowerShellGet.psm1#L111-L144 + private static string? ConvertVersionParameters( + string? requiredVersion, + string? minimumVersion, + string? maximumVersion) => (requiredVersion, minimumVersion, maximumVersion) switch + { + (null, null, null) => null, + (string ver, null, null) => ver, + (_, string min, null) => $"[{min},)", + (_, null, string max) => $"(,{max}]", + (_, string min, string max) => $"[{min},{max}]" + }; + + public override int GetHashCode() => ModuleSpec.GetHashCode(); +} diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs new file mode 100644 index 00000000..a2d7bb98 --- /dev/null +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -0,0 +1,169 @@ +using Compiler.Requirements; +using NLog; +using QuikGraph; + +namespace Compiler.Module.Resolvable; + +public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleSpec) +{ + /// + /// Resolves the requirements of the module. + /// + /// + public abstract RequirementGroup ResolveRequirements(); + + public abstract Compiled.Compiled IntoCompiled(); +} + +/// +/// A group of resolvables that can be resolved together. +/// This is useful for resolving a group of modules that have dependencies between each other. +/// While resolving, the resolvables will check for circular dependencies and resolve them in the correct order. +/// +public class ResolvableParent +{ + public record ResolvedMatch(Resolvable Resolvable, ModuleMatch Match); + + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public readonly BidirectionalGraph> Graph; + + public ResolvableParent(Resolvable rootModule) + { + Graph = new BidirectionalGraph>(); + Graph.AddVertex(rootModule); + + #region Deduplication and merging of Resolvables using events + Graph.VertexAdded += vertex => Logger.Debug($"Vertex added: {vertex.ModuleSpec.Name}"); + Graph.VertexRemoved += vertex => Logger.Debug($"Vertex removed: {vertex.ModuleSpec.Name}"); + Graph.EdgeRemoved += edge => Logger.Debug($"Edge removed: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); + Graph.EdgeAdded += edge => Logger.Debug($"Edge added: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); + Graph.EdgeRemoved += edge => edge.Source.Requirements.RemoveRequirement(edge.Target.ModuleSpec); + Graph.EdgeAdded += edge => edge.Source.Requirements.AddRequirement(edge.Target.ModuleSpec); + #endregion + } + + /// + /// Locates a module which matches the given spec within the group. + /// + /// + /// + public ResolvedMatch? FindResolvable(ModuleSpec moduleSpec) + { + var resolvable = Graph.Vertices.FirstOrDefault(resolvable => resolvable.ModuleSpec.CompareTo(moduleSpec) != ModuleMatch.None); + if (resolvable == null) return null; + + return new(resolvable, resolvable.ModuleSpec.CompareTo(moduleSpec)); + } + + public void Resolve() + { + var iterating = new Queue<(Resolvable?, ModuleSpec)>(Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); + do + { + var (parentResolvable, workingModuleSpec) = iterating.Dequeue(); + Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); + + // If the parent module has already been resolved this will be an orphan. + if (parentResolvable != null && !Graph.ContainsVertex(parentResolvable)) + { + Logger.Debug("Parent module had already been resolved, skipping orphan."); + continue; + } + + var workingResolvable = LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); + + // If it was null or there are out edges it means this module has already been resolved. + if (workingResolvable == null || Graph.TryGetOutEdges(workingResolvable, out var outEdges) && outEdges.Any()) + { + Logger.Debug("Module has already been resolved, skipping."); + continue; + } + + workingResolvable.ResolveRequirements().GetRequirements().ToList().ForEach(requirement => iterating.Enqueue((workingResolvable, requirement))); + } while (iterating.Count > 0); + } + + /// + /// Links a module to a new ModuleSpec, if the module has already been resolved it will return the resolved module. + /// + /// If the resolved module is a looser match it will merge the requirements and return the new module, updating the graph. + /// + /// + /// The parent which is trying to resolve the module. + /// + /// + /// The module to resolve. + /// + /// + /// The resolved module. + /// + /// Returns null if the module was already resolved. + /// + /// + /// If the module is incompatible with the current module. + /// + public Resolvable? LinkFindingPossibleResolved( + Resolvable? parentResolvable, + ModuleSpec moduleToResolve) + { + var resolveableMatch = FindResolvable(moduleToResolve); + Resolvable? resultingResolvable = null; + if (resolveableMatch != null) + { + Logger.Debug($"Found existing resolvable for {moduleToResolve.Name}."); + + resolveableMatch.Deconstruct(out var foundResolvable, out var match); + // If the module is not a same match we need to merge and propagate the requirements. + // If its an incompatible match we need to throw an error. + resultingResolvable = match switch + { + ModuleMatch.Same => foundResolvable, + ModuleMatch.Looser => foundResolvable, + ModuleMatch.Stricter => foundResolvable switch + { + ResolvableLocalModule local => new ResolvableLocalModule(Path.GetDirectoryName(local.ModuleSpec.FullPath)!, moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])), + _ => new ResolvableRemoteModule(moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])) + }, + ModuleMatch.Incompatible => throw new Exception($"Incompatible module versions found for {moduleToResolve.Name}."), + _ => throw new Exception("This should never happen.") + }; + + // Propogate the new requirement if it was merged. + if (resultingResolvable != foundResolvable) + { + Logger.Debug($"Propogating merge of {foundResolvable.ModuleSpec} with {moduleToResolve}, resulting in {resultingResolvable.ModuleSpec}."); + + Graph.TryGetInEdges(foundResolvable, out var inEdges); + Graph.TryGetOutEdges(foundResolvable, out var outEdges); + + Graph.RemoveVertex(foundResolvable); + inEdges.ToList().ForEach(edge => Graph.AddVerticesAndEdge(new Edge(edge.Source, resultingResolvable))); + outEdges.ToList().ForEach(edge => Graph.AddVerticesAndEdge(new Edge(resultingResolvable, edge.Target))); + } + } + else + { + if (parentResolvable is ResolvableLocalModule local) + { + try { resultingResolvable = new ResolvableLocalModule(Path.GetDirectoryName(local.ModuleSpec.FullPath)!, moduleToResolve); } + catch { /*This just happens when its not a file and might actually be a remote module*/ } + } + resultingResolvable ??= new ResolvableRemoteModule(moduleToResolve); + } + + if (parentResolvable != null) + { + if (Graph.Edges.Where(edge => edge.Source == parentResolvable && edge.Target == resultingResolvable).Any()) + { + Logger.Debug("Edge already exists, skipping."); + return null; + } + + Graph.AddVerticesAndEdge(new Edge(parentResolvable, resultingResolvable)); + } + else { Graph.AddVertex(resultingResolvable); } + + return resultingResolvable; + } +} diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs new file mode 100644 index 00000000..57500aac --- /dev/null +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -0,0 +1,97 @@ +using System.Management.Automation.Language; +using System.Text.RegularExpressions; +using Compiler.Requirements; + +namespace Compiler.Module.Resolvable; + +public partial class ResolvableScript : ResolvableLocalModule +{ + private static readonly string InvokeRunMain = "(New-Module -ScriptBlock ([ScriptBlock]::Create($Global:EmbeddedModules['{0}'].Content)) -AsCustomObject -ArgumentList {1}.BoundParameters).'Invoke-RunMain'({1}, ({2}));"; + + private readonly ResolvableParent ResolvableParent; + + public ResolvableScript(PathedModuleSpec moduleSpec) : base(moduleSpec) + { + ResolvableParent = new ResolvableParent(this); + + Editor.AddRegexEdit(RunMainRegex(), Text.UpdateOptions.MatchEntireDocument, static match => + { + var block = match.Groups["Block"].Value; + var invocation = match.Groups.ContainsKey("Invocation") ? match.Groups["Invocation"].Value : "$MyInvocation"; + return string.Format(InvokeRunMain, "00-Environment", invocation, block); + }); + + ResolvableParent.Resolve(); + + #region Requirement Compatability checking + PSVersionRequirement? highestPSVersion = null; + PSEditionRequirement? foundPSEdition = null; + RunAsAdminRequirement? foundRunAsAdmin = null; + foreach (var resolvable in ResolvableParent.Graph.Vertices) + { + var versionRequirement = resolvable.Requirements.GetRequirements().FirstOrDefault(); + if (versionRequirement != null && versionRequirement.Version > highestPSVersion?.Version) highestPSVersion = versionRequirement; + + var editionRequirement = resolvable.Requirements.GetRequirements().FirstOrDefault(); + if (editionRequirement != null && foundPSEdition != null && editionRequirement.Edition != foundPSEdition.Edition) throw new Exception("Multiple PSEditions found in resolved modules."); + foundPSEdition ??= editionRequirement; + + foundRunAsAdmin ??= resolvable.Requirements.GetRequirements().FirstOrDefault(); + } + + if (highestPSVersion != null) Requirements.AddRequirement(highestPSVersion); + if (foundPSEdition != null) Requirements.AddRequirement(foundPSEdition); + if (foundRunAsAdmin != null) Requirements.AddRequirement(foundRunAsAdmin); + #endregion + } + + public override Compiled.Compiled IntoCompiled() => new Compiled.CompiledScript( + ModuleSpec, + Editor, + ResolvableParent, + ExtractParameterBlock() + ) + { + Requirements = ResolveRequirements() + }; + + /// + /// Looks for the parameter block of the script, + /// If there is none it returns null and makes no changes. + /// + /// If there is a param block it removes it from the script and returns an Ast representing the param block. + /// + public ParamBlockAst? ExtractParameterBlock() + { + var scriptParamBlockAst = _ast.ParamBlock; + + if (scriptParamBlockAst == null) + { + return null; + } + + Editor.AddExactEdit( + scriptParamBlockAst.Extent.StartLineNumber - 1, + scriptParamBlockAst.Extent.StartColumnNumber - 1, + scriptParamBlockAst.Extent.EndLineNumber - 1, + scriptParamBlockAst.Extent.EndColumnNumber - 1, + lines => [] + ); + + scriptParamBlockAst.Attributes.ToList().ForEach(attribute => + { + Editor.AddExactEdit( + attribute.Extent.StartLineNumber - 1, + attribute.Extent.StartColumnNumber - 1, + attribute.Extent.EndLineNumber - 1, + attribute.Extent.EndColumnNumber - 1, + lines => [] + ); + }); + + return scriptParamBlockAst; + } + + [GeneratedRegex(@"^Invoke-RunMain\s+(?:\$MyInvocation)?\s+(?{.+})")] + private static partial Regex RunMainRegex(); +} diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index f1e8edb3..827ac44c 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -1,11 +1,14 @@ +using System.Collections.ObjectModel; +using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Text; using CommandLine; -using Compiler; +using Compiler.Module.Resolvable; +using Compiler.Requirements; using NLog; using NLog.Targets; -class Program +class Program : IDisposable { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -42,7 +45,7 @@ public class Options public static void Main(string[] args) { - Parser.Default.ParseArguments(args).WithParsed(o => + _ = Parser.Default.ParseArguments(args).WithParsed(opts => { LogManager.Setup().LoadConfiguration(builder => { @@ -52,81 +55,90 @@ public static void Main(string[] args) DetectConsoleAvailable = true, EnableAnsiOutput = true, RowHighlightingRules = { - new() { - Condition = "level == LogLevel.Fatal", - ForegroundColor = ConsoleOutputColor.Red, + new() { + Condition = "level == LogLevel.Fatal", + ForegroundColor = ConsoleOutputColor.Red, + }, + new() { + Condition = "level == LogLevel.Error", + ForegroundColor = ConsoleOutputColor.DarkRed + }, + new() { + Condition = "level == LogLevel.Warn", + ForegroundColor = ConsoleOutputColor.Yellow + }, + new() { + Condition = "level == LogLevel.Info", + ForegroundColor = ConsoleOutputColor.Gray + }, + new() { + Condition = "level == LogLevel.Debug", + ForegroundColor = ConsoleOutputColor.DarkMagenta + }, + new() { + Condition = "level == LogLevel.Trace", + ForegroundColor = ConsoleOutputColor.DarkGray + } }, - new() { - Condition = "level == LogLevel.Error", - ForegroundColor = ConsoleOutputColor.DarkRed - }, - new() { - Condition = "level == LogLevel.Warn", - ForegroundColor = ConsoleOutputColor.Yellow - }, - new() { - Condition = "level == LogLevel.Info", - ForegroundColor = ConsoleOutputColor.Gray - }, - new() { - Condition = "level == LogLevel.Debug", - ForegroundColor = ConsoleOutputColor.DarkMagenta - }, - new() { - Condition = "level == LogLevel.Trace", - ForegroundColor = ConsoleOutputColor.DarkGray - } - }, WordHighlightingRules = { - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:error|exception|fail|fatal|warn|warning)\\b", - ForegroundColor = ConsoleOutputColor.DarkRed - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:info|log|message|success)\\b", - ForegroundColor = ConsoleOutputColor.Green - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:debug)\\b", - ForegroundColor = ConsoleOutputColor.Blue - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:trace)\\b", - ForegroundColor = ConsoleOutputColor.Gray + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:error|exception|fail|fatal|warn|warning)\\b", + ForegroundColor = ConsoleOutputColor.DarkRed + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:info|log|message|success)\\b", + ForegroundColor = ConsoleOutputColor.Green + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:debug)\\b", + ForegroundColor = ConsoleOutputColor.Blue + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:trace)\\b", + ForegroundColor = ConsoleOutputColor.Gray + } } - } }; builder.ForLogger().FilterLevels(LogLevel.Info, LogLevel.Fatal).WriteTo(console); - if (o.Verbose) builder.ForLogger().FilterLevel(LogLevel.Trace).WriteTo(console); - if (o.Debug) builder.ForLogger().FilterLevel(LogLevel.Debug).WriteTo(console); + if (opts.Verbose) builder.ForLogger().FilterLevel(LogLevel.Trace).WriteTo(console); + if (opts.Debug) builder.ForLogger().FilterLevel(LogLevel.Debug).WriteTo(console); }); var compiledContent = string.Empty; try { - var compiledScript = new CompiledScript(Path.GetFullPath(o.InputFile!)); - compiledContent = compiledScript.Compile(); + var pathedModuleSpec = new PathedModuleSpec( + Path.GetFullPath(opts.InputFile!), + Path.GetFileNameWithoutExtension(opts.InputFile!) + ); + + var resolvableScript = new ResolvableScript(pathedModuleSpec); + var compiledScript = resolvableScript.IntoCompiled(); + compiledContent = compiledScript.GetPowerShellObject(); } catch (Exception e) { Logger.Error("There was an error compiling the script, please see the error below:"); - var printing = o.Verbose == true ? e.ToString() : e.Message; + var printing = opts.Verbose == true ? e.ToString() : e.Message; Logger.Error(printing); Environment.Exit(1); } - OutputToFile(o, compiledContent); + OutputToFile(opts, compiledContent); }); + + LogManager.Shutdown(); + Environment.Exit(0); } - public static async void OutputToFile(Options options, string content) + public static void OutputToFile(Options options, string content) { if (string.IsNullOrWhiteSpace(options.OutputFile)) { @@ -155,8 +167,20 @@ public static async void OutputToFile(Options options, string content) } Logger.Info($"Writing to file {options.OutputFile}"); - var fileStream = File.Open(options.OutputFile, FileMode.CreateNew, FileAccess.Write, FileShare.ReadWrite); - await fileStream.WriteAsync(Encoding.UTF8.GetBytes(content)); - fileStream.Close(); + using var fileStream = File.Open(options.OutputFile, FileMode.CreateNew, FileAccess.Write, FileShare.ReadWrite); + fileStream.Write(Encoding.UTF8.GetBytes(content)); + } + + internal static Collection RunPowerShell(string script) + { + var pwsh = PowerShell.Create(RunspaceMode.NewRunspace); + pwsh.RunspacePool = RunspacePool.Value; + pwsh.AddScript(script); + return pwsh.Invoke(); + } + + public void Dispose() + { + throw new NotImplementedException(); } } diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index cb4c3a9a..69359ec2 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -1,3 +1,4 @@ +using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography; using System.Text; @@ -17,6 +18,18 @@ public record PathedModuleSpec( ) : ModuleSpec(Name, Guid, MinimumVersion, MaximumVersion, RequiredVersion, PassedInternalGuid) { public override byte[] Hash => SHA1.HashData(File.ReadAllBytes(FullPath)); + + // TODO - this may not be the best way to do this. + public override ModuleMatch CompareTo(ModuleSpec other) + { + if (other is not PathedModuleSpec && other.Guid == null && other.MinimumVersion == null && other.MaximumVersion == null && other.RequiredVersion == null) + { + var otherMaybeFileName = Path.GetFileNameWithoutExtension(other.Name); + if (Name == otherMaybeFileName) return ModuleMatch.Same; + } + + return base.CompareTo(other); + } } public record ModuleSpec( @@ -74,15 +87,18 @@ public ModuleSpec MergeSpecs(ModuleSpec[] merge) return new ModuleSpec(Name, guid, minVersion, maxVersion, reqVersion, InternalGuid); } - public override string GetInsertableLine() + public override string GetInsertableLine(Hashtable data) { + var nameSuffix = data.ContainsKey("NameSuffix") ? $"-{data["NameSuffix"]}" : string.Empty; + var moduleName = $"{Path.GetFileNameWithoutExtension(Name)}{nameSuffix}"; + if (Guid == null && RequiredVersion == null && MinimumVersion == null && MaximumVersion == null) { - return $"Using module '{Path.GetFileNameWithoutExtension(Name)}'"; + return $"Using module '{moduleName}'"; } var sb = new StringBuilder("Using module @{"); - sb.Append($"ModuleName = '{Path.GetFileNameWithoutExtension(Name)}';"); + sb.Append($"ModuleName = '{moduleName}';"); if (Guid != null) sb.Append($"GUID = {Guid};"); switch (RequiredVersion, MinimumVersion, MaximumVersion) @@ -98,18 +114,7 @@ public override string GetInsertableLine() return sb.ToString(); } - public virtual bool Equals(ModuleSpec? other) - { - if (other is null) return false; - if (ReferenceEquals(this, other)) return true; - return Name == other.Name && - Guid == other.Guid && - MinimumVersion == other.MinimumVersion && - MaximumVersion == other.MaximumVersion && - RequiredVersion == other.RequiredVersion; - } - - public ModuleMatch CompareTo(ModuleSpec other) + public virtual ModuleMatch CompareTo(ModuleSpec other) { if (Name != other.Name) return ModuleMatch.None; if (Guid != null && other.Guid != null && Guid != other.Guid) return ModuleMatch.None; @@ -176,7 +181,7 @@ public ModuleMatch CompareTo(ModuleSpec other) } // We can't really determine if its higher or lower so we just call it the same. - if (isStricter && isLooser) return ModuleMatch.Same; + if (isStricter && isLooser) return ModuleMatch.MergeRequired; if (isStricter) return ModuleMatch.Stricter; if (isLooser) return ModuleMatch.Looser; diff --git a/src/Compiler/Requirements/PSEdition.cs b/src/Compiler/Requirements/PSEdition.cs index 5b3b2d11..41e7a370 100644 --- a/src/Compiler/Requirements/PSEdition.cs +++ b/src/Compiler/Requirements/PSEdition.cs @@ -1,3 +1,4 @@ +using System.Collections; using System.Security.Cryptography; using System.Text; @@ -16,7 +17,7 @@ public record PSEditionRequirement(PSEdition Edition) : Requirement(false) /// Gets the insertable line for the requirement. /// /// The insertable line for the requirement. - public override string GetInsertableLine() => $"#Requires -PSEdition {Edition}"; + public override string GetInsertableLine(Hashtable _) => $"#Requires -PSEdition {Edition}"; /// /// Determines whether this requirement is compatible with another requirement. diff --git a/src/Compiler/Requirements/PSVersion.cs b/src/Compiler/Requirements/PSVersion.cs index 22af9f26..e92cf501 100644 --- a/src/Compiler/Requirements/PSVersion.cs +++ b/src/Compiler/Requirements/PSVersion.cs @@ -1,6 +1,6 @@ +using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography; -using System.Security.Policy; using System.Text; namespace Compiler.Requirements; @@ -9,7 +9,7 @@ public record PSVersionRequirement(Version Version) : Requirement(false) { public override byte[] Hash => SHA1.HashData(Encoding.UTF8.GetBytes(Version.ToString())); - public override string GetInsertableLine() + public override string GetInsertableLine(Hashtable _) { var sb = new StringBuilder(); sb.Append("#Requires -Version "); diff --git a/src/Compiler/Requirements/Requirements.cs b/src/Compiler/Requirements/Requirements.cs index 4fa5fc68..075a957e 100644 --- a/src/Compiler/Requirements/Requirements.cs +++ b/src/Compiler/Requirements/Requirements.cs @@ -1,4 +1,6 @@ +using System.Collections; using System.Collections.Immutable; +using System.Configuration; using NLog; namespace Compiler.Requirements; @@ -67,11 +69,7 @@ public bool ReplaceRequirement(T oldValue, T newValue) where T : Requirement public ImmutableHashSet GetRequirements() { var rawRequirements = StoredRequirements.Values; - if (rawRequirements.Count == 0) - { - Logger.Debug("No requirements found"); - return []; - } + if (rawRequirements.Count == 0) return []; var flattenedList = StoredRequirements.Values.ToList().SelectMany(x => x).ToList(); flattenedList.Sort(new RequirementWeightSorter()); @@ -124,7 +122,14 @@ public abstract record Requirement(bool SupportsMultiple) /// Gets the insertable line for the requirement. /// This is the code which will be inserted into the script. /// - public abstract string GetInsertableLine(); + public abstract string GetInsertableLine(Hashtable data); + + bool IEquatable.Equals(Requirement? obj) + { + if (obj == null) return false; + return obj.Hash.SequenceEqual(Hash); + + } } /// diff --git a/src/Compiler/Requirements/RunAsAdmin.cs b/src/Compiler/Requirements/RunAsAdmin.cs index 6ad292e6..38c4ac9e 100644 --- a/src/Compiler/Requirements/RunAsAdmin.cs +++ b/src/Compiler/Requirements/RunAsAdmin.cs @@ -1,3 +1,4 @@ +using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography; using System.Text; @@ -11,7 +12,7 @@ public record RunAsAdminRequirement() : Requirement(false) public override byte[] Hash => SHA1.HashData(Encoding.UTF8.GetBytes(STRING)); [ExcludeFromCodeCoverage(Justification = "It's just a string.")] - public override string GetInsertableLine() => STRING; + public override string GetInsertableLine(Hashtable _) => STRING; [ExcludeFromCodeCoverage(Justification = "Just a sick as fuck bool man!")] public override bool IsCompatibleWith(Requirement other) => true; diff --git a/src/Compiler/Requirements/UsingNamespace.cs b/src/Compiler/Requirements/UsingNamespace.cs index e5308912..a2407142 100644 --- a/src/Compiler/Requirements/UsingNamespace.cs +++ b/src/Compiler/Requirements/UsingNamespace.cs @@ -1,3 +1,4 @@ +using System.Collections; using System.Security.Cryptography; using System.Text; @@ -21,7 +22,7 @@ string Namespace /// Gets the insertable line for the requirement. /// /// The insertable line. - public override string GetInsertableLine() => $"Using namespace {Namespace};"; + public override string GetInsertableLine(Hashtable _) => $"Using namespace {Namespace};"; /// /// Checks if the requirement is compatible with another requirement. diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index cbdff0aa..1b865b56 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -1,5 +1,3 @@ -using System.Security.Cryptography; -using System.Text; using System.Text.RegularExpressions; using Compiler.Text.Updater; using NLog; @@ -14,25 +12,8 @@ public partial class TextDocument(string[] lines) public class CompiledDocument(string[] lines) : TextDocument(lines) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private string Text - { - get - { - return string.Join('\n', Lines); - } - } - public string ContentHash - { - get - { - var hash = SHA256.HashData(Encoding.UTF8.GetBytes(Text)); - return Convert.ToHexString(hash); - } - } - - public string GetContent() => Text; - public static implicit operator string(CompiledDocument document) => document.GetContent(); + public string GetContent() => string.Join('\n', Lines); public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) { @@ -45,7 +26,7 @@ public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) var sortedUpdaters = builder.TextUpdaters.OrderBy(updater => updater.Priority).ToList(); foreach (var textUpdater in sortedUpdaters) { - Logger.Debug($"Applying updater {textUpdater} with priority {textUpdater.Priority}"); + // Logger.Debug($"Applying updater {textUpdater} with priority {textUpdater.Priority}"); spanUpdates.ForEach(textUpdater.PushByUpdate); textUpdater.Apply(ref lines).ToList().ForEach(spanUpdates.Add); } @@ -56,8 +37,9 @@ public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) public class TextEditor(TextDocument document) { - public TextDocument Document { get; } = document; - public List TextUpdaters { get; } = []; + public readonly TextDocument OriginalCopy = document; + public readonly TextDocument Document = document; + public readonly List TextUpdaters = []; public void AddEdit(Func updater) { @@ -169,14 +151,4 @@ Func updater options, updater )); - - public override string ToString() - { - var sb = new StringBuilder() - .AppendLine("TextEditor:") - .AppendLine(" Document:") - .AppendLine(" TextUpdaters:") - .AppendLine('\t' + string.Join("\n\t", TextUpdaters.Select(updater => updater.ToString()))); - return sb.ToString(); - } } diff --git a/src/Compiler/Text/Updater/IndentUpdater.cs b/src/Compiler/Text/Updater/IndentUpdater.cs index 4908d1f2..c902fd93 100644 --- a/src/Compiler/Text/Updater/IndentUpdater.cs +++ b/src/Compiler/Text/Updater/IndentUpdater.cs @@ -17,7 +17,7 @@ public override SpanUpdateInfo[] Apply(ref List lines) } lines[i] = $"{indentString}{lines[i]}"; - updateSpans.Add(new SpanUpdateInfo(new(i, i, 0, 0), 4)); + updateSpans.Add(new SpanUpdateInfo(new(i, i, 0, 0), IndentBy)); } return [.. updateSpans]; diff --git a/tests/Compiler/Requirements/ModuleSpec.cs b/tests/Compiler/Requirements/ModuleSpec.cs index e4f6ed6d..26a98254 100644 --- a/tests/Compiler/Requirements/ModuleSpec.cs +++ b/tests/Compiler/Requirements/ModuleSpec.cs @@ -10,7 +10,7 @@ public class ModuleSpecTests [TestCaseSource(typeof(TestData), nameof(TestData.InsetableLinesCases))] public string GetInsertableLine_ReturnsCorrectLine(ModuleSpec moduleSpec) { - return moduleSpec.GetInsertableLine(); + return moduleSpec.GetInsertableLine([]); } [TestCaseSource(typeof(TestData), nameof(TestData.MatchTestCases))] diff --git a/tests/Compiler/Requirements/PSEdition.cs b/tests/Compiler/Requirements/PSEdition.cs index d53bfcf5..fe942356 100644 --- a/tests/Compiler/Requirements/PSEdition.cs +++ b/tests/Compiler/Requirements/PSEdition.cs @@ -10,7 +10,7 @@ public class PSEditionTests [Test, TestCaseSource(typeof(TestData), nameof(TestData.CaseForEachEdition))] public string GetInsertableStringFromEdition(PSEdition edition) { - return new PSEditionRequirement(edition).GetInsertableLine(); + return new PSEditionRequirement(edition).GetInsertableLine([]); } [Test] diff --git a/tests/Compiler/Requirements/PSVersion.cs b/tests/Compiler/Requirements/PSVersion.cs index dc2e5a83..d5cc4ed0 100644 --- a/tests/Compiler/Requirements/PSVersion.cs +++ b/tests/Compiler/Requirements/PSVersion.cs @@ -10,7 +10,7 @@ public class PSVersionTests [Test, TestCaseSource(typeof(TestData), nameof(TestData.CaseForVersionString))] public string GetInsertableLine_CheckContent(Version version) { - var line = new PSVersionRequirement(version).GetInsertableLine(); + var line = new PSVersionRequirement(version).GetInsertableLine([]); Assert.Multiple(() => { diff --git a/tests/Compiler/Requirements/Requirements.cs b/tests/Compiler/Requirements/Requirements.cs index 16d2ab93..dbc6ad13 100644 --- a/tests/Compiler/Requirements/Requirements.cs +++ b/tests/Compiler/Requirements/Requirements.cs @@ -145,13 +145,13 @@ private record SampleRequirement(string Data) : Requirement(true) { public override byte[] Hash => Encoding.UTF8.GetBytes(Data); public override bool IsCompatibleWith(Requirement other) => true; - public override string GetInsertableLine() => string.Empty; + public override string GetInsertableLine(Hashtable _data) => string.Empty; } private record IncompatibleRequirement() : Requirement(true) { public override byte[] Hash => []; public override bool IsCompatibleWith(Requirement other) => false; - public override string GetInsertableLine() => string.Empty; + public override string GetInsertableLine(Hashtable _data) => string.Empty; } } diff --git a/tests/Compiler/Requirements/RunAsAdmin.cs b/tests/Compiler/Requirements/RunAsAdmin.cs index bb83b4d7..6fc9b0df 100644 --- a/tests/Compiler/Requirements/RunAsAdmin.cs +++ b/tests/Compiler/Requirements/RunAsAdmin.cs @@ -26,7 +26,7 @@ public void Hash_ShouldAlwaysBeTheSame() { public void GetInsertableLine_ShouldReturnString() { var requirement = new RunAsAdminRequirement(); - var insertableLine = requirement.GetInsertableLine(); + var insertableLine = requirement.GetInsertableLine([]); Assert.That(insertableLine, Is.EqualTo("#Requires -RunAsAdministrator")); } From 5897f883c766243e6cbc5aecb5212fec05ed1315 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 11 Jul 2024 18:46:43 +1000 Subject: [PATCH 079/341] fix(Compiler): fix documentation formatting --- src/Compiler/Analyser/Analyser.cs | 37 +++++++++++++------------------ 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index f3c893bb..3919213e 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -9,10 +9,10 @@ public static class StaticAnalyser { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - /* - A list of all the built-in functions that are provided in a standard session. - This includes modules that are imported by default. - */ + /// + /// A list of all the built-in functions that are provided in a standard session. + /// This includes modules that are imported by default. + /// private static readonly IEnumerable BuiltinsFunctions = GetDefaultSessionFunctions(); public static void Analyse(CompiledLocalModule module, IEnumerable availableImports) @@ -24,8 +24,6 @@ public static void Analyse(CompiledLocalModule module, IEnumerable ava { foreach (var undefinedFunction in undefinedFunctions) { - // Logger.Error($"Undefined function: {undefinedFunction.GetCommandName()}"); - // Logger.Error($"Location: {undefinedFunction.Extent.File}({undefinedFunction.Extent.StartLineNumber},{undefinedFunction.Extent.StartColumnNumber})"); AstHelper.PrintPrettyAstError(undefinedFunction.CommandElements[0].Extent, undefinedFunction, "Undefined function found in module."); } @@ -33,34 +31,31 @@ public static void Analyse(CompiledLocalModule module, IEnumerable ava } } - /* - Get all functions which should always be available in a session. - This will collect the builtin functions of powershell as-well, - as well as the functions from modules in the compiling hosts C:\Windows\system32\WindowsPowerShell\v1.0\Modules path. - */ + + /// + /// Get all functions which should always be available in a session. + /// This will collect the builtin functions of powershell, + /// as-well as the functions from modules in the compiling hosts C:\Windows\system32\WindowsPowerShell\v1.0\Modules path. + /// public static IEnumerable GetDefaultSessionFunctions() { var defaultFunctions = new List(); + var pwsh = PowerShell.Create(); + pwsh.Runspace.SessionStateProxy.LanguageMode = PSLanguageMode.FullLanguage; defaultFunctions.AddRange(PowerShell.Create().Runspace.SessionStateProxy.InvokeCommand .GetCommands("*", CommandTypes.Function | CommandTypes.Alias | CommandTypes.Cmdlet, true) .Select(command => command.Name)); var modulesPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "WindowsPowerShell", "v1.0", "Modules"); - if (!Directory.Exists(modulesPath)) - { - return defaultFunctions; - } var moduleDirectories = Directory.GetDirectories(modulesPath); var ps = PowerShell.Create().AddScript(/*ps1*/ $$""" $env:PSModulePath = '{{modulesPath}}'; + $env:Path = 'C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;'; $PSModuleAutoLoadingPreference = 'All'; - Get-Command | Select-Object -ExpandProperty Name -Unique + Get-Command * | Select-Object -ExpandProperty Name """).Invoke(); - foreach (var commandName in ps) - { - defaultFunctions.Add((string)commandName.BaseObject); - } - return defaultFunctions; + defaultFunctions.AddRange(ps.Select(commandName => ((string)commandName.BaseObject).Replace(".exe", ""))); + return defaultFunctions.Distinct(); } public static List FindUndefinedFunctions(CompiledLocalModule module, IEnumerable availableImports) From 9f825d092c7f9aa259ca47190175b2ee56bad28f Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 11 Jul 2024 18:47:12 +1000 Subject: [PATCH 080/341] chore: updates for compiler changes --- src/common/00-Utils.psm1 | 167 +++++++++++++++++++++++++++++++------- src/common/05-Ensure.psm1 | 23 +++++- src/common/50-Input.psm1 | 2 + 3 files changed, 157 insertions(+), 35 deletions(-) diff --git a/src/common/00-Utils.psm1 b/src/common/00-Utils.psm1 index c851a5cb..9a335293 100644 --- a/src/common/00-Utils.psm1 +++ b/src/common/00-Utils.psm1 @@ -2,36 +2,6 @@ Using module ./01-Logging.psm1 Using module ./01-Scope.psm1 Using module ./02-Exit.psm1 -<# -.DESCRIPTION - This module contains utility functions that have no dependencies on other modules and can be used by any module. -#> - -<# -.DESCRIPTION - This function is used to measure the time it takes to execute a script block. - -.EXAMPLE - Measure-ElapsedTime { - Start-Sleep -Seconds 5; - } -#> -function Measure-ElaspedTime { - param( - [Parameter(Mandatory, ValueFromPipeline)] - [ScriptBlock]$ScriptBlock - ) - - process { - [DateTime]$Local:StartAt = Get-Date; - - & $ScriptBlock; - - [TimeSpan]$Local:ElapsedTime = (Get-Date) - $Local:StartAt; - return $Local:ElapsedTime * 10000; # Why does this make it more accurate? - } -} - <# .SYNOPSIS Get the value of an environment variable or save it if it does not exist. @@ -1103,4 +1073,139 @@ function Compare-FileHashToS3ETag { } } -Export-ModuleMember -Function * -Alias *; +function Get-BlobCompatableHash { + param( + [Parameter(Mandatory)] + [String]$Path + ) + + begin { + Enter-Scope; + $Private:Algorithm = [System.Security.Cryptography.HashAlgorithm]::Create('MD5'); + } + end { Exit-Scope; } + + process { + [Byte[]]$Private:ByteStream = [System.IO.File]::ReadAllBytes($Path); + [Byte[]]$Private:HashBytes = $Private:Algorithm.ComputeHash($Private:ByteStream); + + return [System.Convert]::ToBase64String($Private:HashBytes); + } +} + +function Get-FactorOf1MB { + param( + [Parameter(Mandatory)] + [Int]$Size, + + [Parameter(Mandatory)] + [Int]$Parts + ) + + if ($Size -lt 1MB -and $Parts -le 1) { + return $Size; + } + + $ChunkSize = $Size / $Parts; + $NumberOfChunks = $ChunkSize % 1MB; + return $ChunkSize + 1MB - $NumberOfChunks; +} + +function Get-ETag { + param( + [Parameter(Mandatory)] + [String]$Path, + + [Parameter(Mandatory)] + [Int]$ChunkSize + ) + + begin { + Enter-Scope; + $Algorithm = [System.Security.Cryptography.HashAlgorithm]::Create('MD5'); + } + + process { + $Digest = @(); + $OpenFile = [System.IO.File]::OpenRead($Path); + try { + do { + $Bytes = New-Object byte[] $ChunkSize; + $OpenFile.Read($Bytes, 0, $ChunkSize) | Out-Null; + $Digest += $Algorithm.ComputeHash($Bytes); + } while ($OpenFile.Position -lt $OpenFile.Length); + + $StringBuilder = [System.Text.StringBuilder]::new(); + $StringBuilder.Append([System.Convert]::ToHexString($Algorithm.ComputeHash($Digest))); + + if ($Digest.Count -gt 1) { + $StringBuilder.Append('-'); + $StringBuilder.Append($Digest.Count); + } + + return $StringBuilder.ToString(); + } + finally { + $OpenFile.Close(); + } + } + + end { Exit-Scope; } +} + +function Get-PossiblePartSizes { + param( + [Parameter(Mandatory)] + [Int]$Size, + + [Parameter(Mandatory)] + [Int]$Parts + ) + + $PartSizes = @( + 8388608, # aws_cli/boto3 + 15728640, # s3cmd + (Get-FactorOf1MB -Size $FileSize -Parts $Parts) + ) | Where-Object { $_ -lt $FileSize -and ($FileSize / $_) -le $Parts }; + + if ($PartSizes.Count -eq 0) { + return $Size; + } + + return $PartSizes; +} + +function Compare-FileHashToS3ETag { + param( + [Parameter(Mandatory)] + [String]$Path, + + [Parameter(Mandatory)] + [String]$ETag + ) + + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + $FileSize = (Get-Item $Path).Length; + $Parts = $ETag.Split('-'); + if ($Parts.Count -lt 2) { $Parts = 1; } + else { $Parts = $Parts[1]; } + + $PossiblePartSizes = Get-PossiblePartSizes -Size $FileSize -Parts $Parts; + if ($PossiblePartSizes.Count -eq 0) { + Invoke-Debug "No possible part sizes found for $Path with ETag $ETag"; + return $False; + } + foreach ($PossiblePartSize in $PossiblePartSizes) { + $Local:OurETag = Get-ETag -Path $Path -ChunkSize $PossiblePartSize; + Invoke-Debug "Comparing Our ETag $Local:OurETag to S3 ETag $ETag"; + if ($Local:OurETag -eq $ETag) { + return $True; + } + } + } +} + +Export-ModuleMember -Function Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Export-Types, Add-ModuleCallback, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag -Alias await, async, lazy; diff --git a/src/common/05-Ensure.psm1 b/src/common/05-Ensure.psm1 index 23b9da96..89f7836a 100644 --- a/src/common/05-Ensure.psm1 +++ b/src/common/05-Ensure.psm1 @@ -1,6 +1,21 @@ +Using module ./00-Utils.psm1 Using module ./01-Logging.psm1 Using module ./01-Scope.psm1 Using module ./02-Exit.psm1 +Using module ./40-Temp.psm1 + +Using module @{ + ModuleName = 'Microsoft.PowerShell.PSResourceGet'; + ModuleVersion = '1.0.5'; +} +Using module @{ + ModuleName = 'PowerShellGet'; + ModuleVersion = '2.2.5'; +} +Using module @{ + ModuleName = 'PackageManagement'; + ModuleVersion = '1.4.8.1'; +} $Script:NOT_ADMINISTRATOR = Register-ExitCode -Description @' Not running as administrator! @@ -261,7 +276,7 @@ function Invoke-EnsureModule { if ($Local:ModuleMinimumVersion -and $Local:AvailableModule.Version -lt $Local:ModuleMinimumVersion) { Invoke-Verbose 'Module is installed, but the version is less than the minimum version required, trying to update...'; try { - Update-Module -Name $Local:ModuleName -Force -RequiredVersion $Local:ModuleMinimumVersion -ErrorAction Stop; + Update-PSResource -Name $Local:ModuleName -Force -RequiredVersion $Local:ModuleMinimumVersion -ErrorAction Stop; Import-Module_Internal -ModuleName:$Local:ModuleName -ModuleImport:$Local:ModuleName -DontRemove:$Local:DontRemove; } catch { @@ -285,15 +300,15 @@ function Invoke-EnsureModule { } if ($null -eq $Local:AvailableModule -or $Local:TryInstall) { - $Local:FoundModule = Find-Module ` + $Local:FoundModule = Find-PSResource ` -Name $Local:ModuleName ` - -MinimumVersion:$(if ($Local:InstallArgs.MinimumVersion) { $Local:InstallArgs.MinimumVersion } else { '0.0.0' }) ` + -Version "[$(if ($Local:InstallArgs.MinimumVersion) { $Local:InstallArgs.MinimumVersion } else { '0.0.0' }),)" ` -ErrorAction SilentlyContinue; if ($Local:FoundModule) { Invoke-Info "Module '$Local:ModuleName' is not installed, installing..."; try { - $Local:FoundModule | Install-Module -AllowClobber -Scope CurrentUser -Force; + $Local:FoundModule | Install-PSResource -Scope CurrentUser -TrustRepository -Quiet -AcceptLicense; } catch { Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:UNABLE_TO_INSTALL_MODULE -FormatArgs @($Local:ModuleName); diff --git a/src/common/50-Input.psm1 b/src/common/50-Input.psm1 index 1c647e1f..feee41e8 100644 --- a/src/common/50-Input.psm1 +++ b/src/common/50-Input.psm1 @@ -1,6 +1,8 @@ Using module ./00-Utils.psm1 Using module ./01-Logging.psm1 Using module ./01-Scope.psm1 +Using module ./05-Assert.psm1 +Using module ./05-Ensure.psm1 Using module @{ ModuleName = 'PSReadLine'; ModuleVersion = '2.3.2'; From f2a46f206877cda21aec0b4a3b634e7eea091558 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 11 Jul 2024 18:47:31 +1000 Subject: [PATCH 081/341] chore(Compiler): update to testing script --- utils/test.ps1 | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/utils/test.ps1 b/utils/test.ps1 index bd5d5e9a..4bdbf681 100644 --- a/utils/test.ps1 +++ b/utils/test.ps1 @@ -1,10 +1,14 @@ +#Requires -Version 5.1; +#Requires -Modules @{ModuleName='PSReadLine';RequiredVersion='2.3.5'}; + Using namespace System.Management.Automation + Using module ../src/common/00-Environment.psm1 +Using module ../src/common/01-Logging.psm1 Using module ../src/common/02-Exit.psm1 -Using module @{ - ModuleName = 'PSReadLine'; - RequiredVersion = '2.3.5'; -} +Using module ../src/common/50-Input.psm1 + +Using module 'PSWindowsUpdate' <# Making some random documentation for the module here!! @@ -17,20 +21,19 @@ param( Set-StrictMode -Version 3; -Import-Module $PSScriptRoot/../src/common/00-Environment.psm1; Invoke-RunMain $MyInvocation { Write-Host 'Hello, World!'; # Write-Error 'This is an error message!' -Category InvalidOperation; - Invoke-FailedExit 1050; + # Invoke-FailedExit 1050; # Random comment $Restart = Get-UserConfirmation 'Restart' 'Do you want to restart the script?'; if ($Restart) { - Write-Host 'Restarting script...'; + Invoke-Info 'Restarting script...'; Restart-Script; # Comment at the end of a line!! } else { - Write-Host 'Exiting script...'; + Invoke-Info 'Exiting script...'; }; } From a74e2cc956d0cc49087aa5d0153de03bc2052bf6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 12 Jul 2024 18:02:55 +1000 Subject: [PATCH 082/341] refactor(Compiler): Remove internal Guid from modulespec No longer required, also update local modules constructor --- src/Compiler/Module/Compiled/Script.cs | 2 - src/Compiler/Module/Resolvable/Local.cs | 5 +- src/Compiler/Module/Resolvable/Remote.cs | 8 +- src/Compiler/Program.cs | 94 ++++++++++++------------ src/Compiler/Requirements/ModuleSpec.cs | 13 +--- 5 files changed, 57 insertions(+), 65 deletions(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index edbe1b84..02fbe252 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -40,7 +40,6 @@ public CompiledScript( alg.FormatVertex += (sender, args) => { args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; - args.VertexFormat.Comment = args.Vertex.ModuleSpec.InternalGuid.ToString(); }; }); Logger.Debug("Initial graphviz:"); @@ -92,7 +91,6 @@ public CompiledScript( alg.FormatVertex += (sender, args) => { args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; - args.VertexFormat.Comment = args.Vertex.ModuleSpec.InternalGuid.ToString(); }; }); Logger.Debug("Compiled graphviz:"); diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index a0758f31..77abcc38 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -26,10 +26,7 @@ ModuleSpec moduleSpec ) : this( moduleSpec is PathedModuleSpec pathedModuleSpec ? pathedModuleSpec - : new PathedModuleSpec( - Path.GetFullPath(Path.Combine(parentPath, moduleSpec.Name)), - Path.GetFileNameWithoutExtension(moduleSpec.Name) - ) + : new PathedModuleSpec(Path.GetFullPath(Path.Combine(parentPath, moduleSpec.Name))) ) { if (!Path.IsPathRooted(parentPath)) throw new InvalidModulePathException("The parent path must be an absolute path."); diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 36b32561..92abef92 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -137,6 +137,9 @@ public string CacheResult() return $env:TEMP | Join-Path -ChildPath "PowerShellGet/{{ModuleSpec.Name}}/{{ModuleSpec.Name}}.$($Module.Version).nupkg"; """; + Logger.Debug("Running PowerShell code to download module from the PowerShell Gallery."); + Logger.Debug(PowerShellCode); + if (!Directory.Exists(CachePath)) { Directory.CreateDirectory(CachePath); @@ -149,7 +152,10 @@ public string CacheResult() if (pwsh.HadErrors) { - throw new Exception($"Failed to download module {ModuleSpec.Name} from the PowerShell Gallery. Error: {pwsh.Streams.Error[0].Exception.Message}"); + Logger.Error($"Failed to download module {ModuleSpec.Name} from the PowerShell Gallery."); + pwsh.Streams.Error.ToList().ForEach(error => Logger.Error(error)); + + throw new Exception("Failed to download module from the PowerShell Gallery."); } var returnedResult = result.First().ToString(); diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 827ac44c..f406071a 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -55,53 +55,53 @@ public static void Main(string[] args) DetectConsoleAvailable = true, EnableAnsiOutput = true, RowHighlightingRules = { - new() { - Condition = "level == LogLevel.Fatal", - ForegroundColor = ConsoleOutputColor.Red, - }, - new() { - Condition = "level == LogLevel.Error", - ForegroundColor = ConsoleOutputColor.DarkRed - }, - new() { - Condition = "level == LogLevel.Warn", - ForegroundColor = ConsoleOutputColor.Yellow - }, - new() { - Condition = "level == LogLevel.Info", - ForegroundColor = ConsoleOutputColor.Gray - }, - new() { - Condition = "level == LogLevel.Debug", - ForegroundColor = ConsoleOutputColor.DarkMagenta - }, - new() { - Condition = "level == LogLevel.Trace", - ForegroundColor = ConsoleOutputColor.DarkGray - } + new() { + Condition = "level == LogLevel.Fatal", + ForegroundColor = ConsoleOutputColor.Red, }, + new() { + Condition = "level == LogLevel.Error", + ForegroundColor = ConsoleOutputColor.DarkRed + }, + new() { + Condition = "level == LogLevel.Warn", + ForegroundColor = ConsoleOutputColor.Yellow + }, + new() { + Condition = "level == LogLevel.Info", + ForegroundColor = ConsoleOutputColor.Gray + }, + new() { + Condition = "level == LogLevel.Debug", + ForegroundColor = ConsoleOutputColor.DarkMagenta + }, + new() { + Condition = "level == LogLevel.Trace", + ForegroundColor = ConsoleOutputColor.DarkGray + } + }, WordHighlightingRules = { - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:error|exception|fail|fatal|warn|warning)\\b", - ForegroundColor = ConsoleOutputColor.DarkRed - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:info|log|message|success)\\b", - ForegroundColor = ConsoleOutputColor.Green - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:debug)\\b", - ForegroundColor = ConsoleOutputColor.Blue - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:trace)\\b", - ForegroundColor = ConsoleOutputColor.Gray - } + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:error|exception|fail|fatal|warn|warning)\\b", + ForegroundColor = ConsoleOutputColor.DarkRed + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:info|log|message|success)\\b", + ForegroundColor = ConsoleOutputColor.Green + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:debug)\\b", + ForegroundColor = ConsoleOutputColor.Blue + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:trace)\\b", + ForegroundColor = ConsoleOutputColor.Gray } + } }; builder.ForLogger().FilterLevels(LogLevel.Info, LogLevel.Fatal).WriteTo(console); @@ -112,11 +112,7 @@ public static void Main(string[] args) var compiledContent = string.Empty; try { - var pathedModuleSpec = new PathedModuleSpec( - Path.GetFullPath(opts.InputFile!), - Path.GetFileNameWithoutExtension(opts.InputFile!) - ); - + var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(opts.InputFile!)); var resolvableScript = new ResolvableScript(pathedModuleSpec); var compiledScript = resolvableScript.IntoCompiled(); compiledContent = compiledScript.GetPowerShellObject(); diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index 69359ec2..f0789508 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -9,13 +9,11 @@ namespace Compiler.Requirements; public record PathedModuleSpec( string FullPath, - string Name, Guid? Guid = null, Version? MinimumVersion = null, Version? MaximumVersion = null, - Version? RequiredVersion = null, - Guid? PassedInternalGuid = null -) : ModuleSpec(Name, Guid, MinimumVersion, MaximumVersion, RequiredVersion, PassedInternalGuid) + Version? RequiredVersion = null +) : ModuleSpec(Path.GetFileNameWithoutExtension(FullPath), Guid, MinimumVersion, MaximumVersion, RequiredVersion) { public override byte[] Hash => SHA1.HashData(File.ReadAllBytes(FullPath)); @@ -37,8 +35,7 @@ public record ModuleSpec( Guid? Guid = null, Version? MinimumVersion = null, Version? MaximumVersion = null, - Version? RequiredVersion = null, - Guid? PassedInternalGuid = null + Version? RequiredVersion = null ) : Requirement(true), IEquatable { private readonly static Logger Logger = LogManager.GetCurrentClassLogger(); @@ -47,8 +44,6 @@ public record ModuleSpec( public override byte[] Hash => SHA1.HashData(Encoding.UTF8.GetBytes(string.Concat(Name, Guid, MinimumVersion, MaximumVersion, RequiredVersion))); - public readonly Guid InternalGuid = PassedInternalGuid ?? System.Guid.NewGuid(); - // TODO - Maybe use IsCompatibleWith to do some other check stuff public ModuleSpec MergeSpecs(ModuleSpec[] merge) { @@ -84,7 +79,7 @@ public ModuleSpec MergeSpecs(ModuleSpec[] merge) } } - return new ModuleSpec(Name, guid, minVersion, maxVersion, reqVersion, InternalGuid); + return new ModuleSpec(Name, guid, minVersion, maxVersion, reqVersion); } public override string GetInsertableLine(Hashtable data) From 6eb2cbe3e62ef24db440dc9b2bea569ae0f575d0 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 12 Jul 2024 18:21:58 +1000 Subject: [PATCH 083/341] refactor(Compiler): move updater to their own files --- src/Compiler/Text/Updater.cs | 358 +------------------- src/Compiler/Text/Updater/ExactUpdater.cs | 106 ++++++ src/Compiler/Text/Updater/PatternUpdater.cs | 135 ++++++++ src/Compiler/Text/Updater/RegexUpdater.cs | 102 ++++++ 4 files changed, 347 insertions(+), 354 deletions(-) create mode 100644 src/Compiler/Text/Updater/ExactUpdater.cs create mode 100644 src/Compiler/Text/Updater/PatternUpdater.cs create mode 100644 src/Compiler/Text/Updater/RegexUpdater.cs diff --git a/src/Compiler/Text/Updater.cs b/src/Compiler/Text/Updater.cs index 758e16d6..67c1aed9 100644 --- a/src/Compiler/Text/Updater.cs +++ b/src/Compiler/Text/Updater.cs @@ -1,16 +1,11 @@ using System.Diagnostics.CodeAnalysis; -using System.Diagnostics.Contracts; -using System.Text; -using System.Text.RegularExpressions; -using CommandLine; -using NLog; +using Compiler.Text.Updater; namespace Compiler.Text; public record SpanUpdateInfo( TextSpan TextSpan, - int Offset -) + int Offset) { public override string ToString() => $"{nameof(PatternUpdater)}({TextSpan} +- {Offset})"; } @@ -23,7 +18,7 @@ public abstract class TextSpanUpdater(uint priority = 50) /// Apply the update to the lines. /// /// - /// The document to apply the update to. + /// The lines of the document to apply the update to. /// /// /// The number of lines changed by the update. @@ -35,350 +30,5 @@ public abstract class TextSpanUpdater(uint priority = 50) /// This can be used to update the starting index of a span after a previous span has been removed. /// [ExcludeFromCodeCoverage(Justification = "This is a virtual method that may be overridden.")] - public virtual void PushByUpdate(SpanUpdateInfo updateInfo) - { - // Do Nothing - } -} - -public class PatternUpdater( - uint priority, - Regex startingPattern, - Regex endingPattern, - UpdateOptions options, - Func updater -) : TextSpanUpdater(priority) -{ - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - public Func Updater { get; } = updater; - public Regex StartingPattern { get; } = startingPattern; - public Regex EndingPattern { get; } = endingPattern; - - override public SpanUpdateInfo[] Apply(ref List lines) - { - var spanUpdateInfo = new List(); - var skipRanges = new HashSet(); - var offset = 0; - - while (true) - { - var (startIndex, endIndex) = FindStartToEndBlock([.. lines], offset, skipRanges); - if (startIndex == -1 || endIndex == -1) - { - break; - } - - var span = new TextSpan( - startIndex, - 0, - endIndex, - lines[endIndex].Length - ); - - var updatingLines = lines[startIndex..(endIndex + 1)].ToArray(); - var newLines = Updater(updatingLines); - var thisOffset = span.SetContent(ref lines, options, newLines); - - offset += thisOffset; - skipRanges.Add(new Range(startIndex, endIndex)); - spanUpdateInfo.Add(new SpanUpdateInfo(span, thisOffset)); - } - - return [.. spanUpdateInfo]; - } - - [Pure, ExcludeFromCodeCoverage(Justification = "Does nothing in this context.")] - public override void PushByUpdate(SpanUpdateInfo updateInfo) - { - // Do Nothing - } - - private (int, int) FindStartToEndBlock( - string[] lines, - int offset, - HashSet skipRanges - ) - { - if (lines == null || lines.Length == 0) - { - return (-1, -1); - } - - var offsetSkipRanges = new HashSet>(); - foreach (var range in skipRanges) - { - var clampedStart = Math.Clamp(range.Start.Value + offset, 0, lines.Length - 1); - var clampedEnd = Math.Clamp(range.End.Value + offset, 0, lines.Length - 1); - if (clampedStart < clampedEnd) - { - offsetSkipRanges.Add(Enumerable.Range(clampedStart, clampedEnd - clampedStart + 1)); - } - } - - int startIndex = -1; - int endIndex = -1; - int openLevel = 0; - - for (int i = 0; i < lines.Length; i++) - { - var clonedLine = lines[i].Clone().Cast()!; - if (offsetSkipRanges.Any(range => range.Contains(i))) - { - continue; - } - - var openingMatch = StartingPattern.Matches(clonedLine); - if (openingMatch.Count > 0) - { - if (openLevel == 0) - { - startIndex = i; - } - - openLevel += openingMatch.Count; - } - - // If we found at least one startPattern we will want to remove them from the string, - // This is so that the endingPattern does not match the same elements, and we can find the correct end. - if (openingMatch.Count > 0) - { - var lineOffset = 0; - foreach (Match match in openingMatch) - { - clonedLine = new StringBuilder() - .Append(clonedLine[..(match.Index + lineOffset)]) - .Append(clonedLine[(match.Index + lineOffset + match.Length)..]) - .ToString(); - lineOffset -= match.Length; - } - } - - if (openLevel > 0) - { - var closingMatch = EndingPattern.Matches(clonedLine); - if (closingMatch.Count > 0) - { - openLevel -= closingMatch.Count; - - if (openLevel == 0) - { - endIndex = i; - break; - } - } - } - } - - return (startIndex, endIndex); - } - - public override string ToString() => $"{nameof(PatternUpdater)}({StartingPattern} -> {EndingPattern})"; -} - -public class RegexUpdater( - uint priority, - Regex pattern, - UpdateOptions options, - Func updater -) : TextSpanUpdater(priority) -{ - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - public readonly Func Updater = updater; - public Regex Pattern - { - get - { - if (options.HasFlag(UpdateOptions.MatchEntireDocument)) - { - return new Regex(pattern.ToString(), pattern.Options | RegexOptions.Multiline | RegexOptions.Singleline); - } - else - { - return new Regex(pattern.ToString(), pattern.Options | RegexOptions.Multiline); - } - } - } - - /// - /// Applies the specified pattern to the given text document and returns an array of objects. - /// - /// The text document to apply the pattern to. - /// An array of objects representing the updates made to the document. - override public SpanUpdateInfo[] Apply(ref List lines) - { - var spanUpdateInfo = new List(); - var offset = 0; - - var multilinedContent = string.Join('\n', lines); - var matches = Pattern.Matches(multilinedContent); - - if (matches.Count == 0) - { - return []; - } - - foreach (Match match in matches) - { - var thisOffset = 0; - var multilineEndingIndex = match.Index + match.Length; - var contentBeforeThisLine = multilinedContent[..match.Index].LastIndexOf(value: '\n'); - var isMultiLine = options.HasFlag(UpdateOptions.MatchEntireDocument) && match.Value.Contains('\n'); - var startingLineIndex = multilinedContent[..match.Index].Count(c => c == '\n') + offset; - var endingLineIndex = multilinedContent[..multilineEndingIndex].Count(c => c == '\n') + offset; - - int startingColumn; - int endingColumn; - startingColumn = match.Index - (contentBeforeThisLine + 1); - if (isMultiLine) - { - endingColumn = multilineEndingIndex - (multilinedContent[..multilineEndingIndex].LastIndexOf('\n') + 1); - } - else - { - endingColumn = startingColumn + match.Length; - } - - var span = new TextSpan( - startingLineIndex, - startingColumn, - endingLineIndex, - endingColumn - ); - - var newContent = Updater(match); - - // Remove the entire line if the replacement is empty and the match is the entire line. - if (newContent == null && startingColumn == 0 && match.Length == lines[startingLineIndex].Length) - { - thisOffset += span.RemoveContent(ref lines); - } - else - { - var newLines = newContent == null ? [] : isMultiLine ? newContent.Split('\n') : [newContent]; - thisOffset += span.SetContent(ref lines, options, newLines); - if (isMultiLine) - { - thisOffset += newLines.Length - 1; - } - } - - spanUpdateInfo.Add(new SpanUpdateInfo(span, thisOffset)); - offset += thisOffset; - } - - return [.. spanUpdateInfo]; - } - - [Pure, ExcludeFromCodeCoverage(Justification = "Does nothing in this context.")] - public override void PushByUpdate(SpanUpdateInfo updateInfo) - { - // Do Nothing - } - - public override string ToString() => $"{nameof(RegexUpdater)}({Pattern})"; -} - -public class ExactUpdater( - uint priority, - int startingIndex, - int startingColumn, - int endingIndex, - int endingColumn, - UpdateOptions options, - Func updater -) : TextSpanUpdater(priority) -{ - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - public Func Updater = updater; - public TextSpan Span { get; } = new TextSpan(startingIndex, startingColumn, endingIndex, endingColumn); - - override public SpanUpdateInfo[] Apply(ref List lines) - { - if (Span.StartingIndex < 0 || Span.EndingIndex >= lines.Count) - { - return []; - } - - if (Span.StartingIndex > Span.EndingIndex) - { - Logger.Error($"Starting index must be less than ending index, got {Span.StartingIndex} and {Span.EndingIndex}."); - return []; - } - - if (Span.StartingIndex == Span.EndingIndex && Span.StartingColumn > Span.EndingColumn) - { - Logger.Error($"Starting column must be less than ending column, got {Span.StartingColumn} and {Span.EndingColumn}."); - return []; - } - - switch (lines) - { - case null: - Logger.Error("Document must not be null."); - return []; - case var l when l.Count == 0: - Logger.Error("Document lines must not be null."); - return []; - case var l when l.Count <= Span.StartingIndex: - Logger.Error($"Starting index must be less than the number of lines, got index {Span.StartingIndex} for length {l.Count}."); - return []; - case var l when l.Count <= Span.EndingIndex: - Logger.Error($"Ending index must be less than the number of lines, got index {Span.EndingIndex} for length {l.Count}."); - return []; - } - - var startingLine = lines[Span.StartingIndex]; - var endingLine = lines[Span.EndingIndex]; - switch ((startingLine, endingLine)) - { - case var (start, _) when Span.StartingColumn > start.Length: - Logger.Error($"Starting column must be less than the length of the line, got index {Span.StartingColumn} for length {start.Length}."); - return []; - case var (_, end) when Span.EndingColumn > end.Length: - Logger.Error($"Ending column must be less than the length of the line, got index {Span.EndingColumn} for length {end.Length}."); - return []; - case var _ when Span.StartingIndex == Span.EndingIndex && Span.StartingColumn > Span.EndingColumn: - Logger.Error($"Starting column must be less than ending column, got index {Span.StartingColumn} for length {Span.EndingColumn}."); - return []; - } - - string[] newLines; - int offset; - if (Span.StartingIndex == Span.EndingIndex) - { - var updatingLine = lines[Span.StartingIndex][Span.StartingColumn..Span.EndingColumn]; - newLines = Updater([updatingLine]); - offset = Span.SetContent(ref lines, options, newLines); - } - else - { - var updatingLines = lines.Skip(Span.StartingIndex).Take(Span.EndingIndex - Span.StartingIndex + 1).ToArray(); - // Trim the starting and ending lines to the correct columns. - updatingLines[0] = lines[Span.StartingIndex][Span.StartingColumn..]; - updatingLines[^1] = lines[Span.EndingIndex][..Span.EndingColumn]; - - newLines = Updater(updatingLines); - offset = Span.SetContent(ref lines, options, newLines); - } - - return [new SpanUpdateInfo(Span, offset)]; - } - - override public void PushByUpdate(SpanUpdateInfo updateInfo) - { - if (Span.StartingIndex >= updateInfo.TextSpan.StartingIndex) - { - Span.StartingIndex += updateInfo.Offset; - } - - if (Span.EndingIndex >= updateInfo.TextSpan.StartingIndex) - { - Span.EndingIndex += updateInfo.Offset; - } - } - - public override string ToString() => $"{nameof(ExactUpdater)}({startingIndex}[{startingColumn}..]..{endingIndex}[..{endingColumn}])"; + public virtual void PushByUpdate(SpanUpdateInfo updateInfo) { /*Do Nothing*/ } } diff --git a/src/Compiler/Text/Updater/ExactUpdater.cs b/src/Compiler/Text/Updater/ExactUpdater.cs new file mode 100644 index 00000000..94839d0b --- /dev/null +++ b/src/Compiler/Text/Updater/ExactUpdater.cs @@ -0,0 +1,106 @@ +using System.Diagnostics.CodeAnalysis; +using NLog; + +namespace Compiler.Text.Updater; + +public class ExactUpdater( + uint priority, + int startingIndex, + int startingColumn, + int endingIndex, + int endingColumn, + UpdateOptions options, + Func updater +) : TextSpanUpdater(priority) +{ + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public Func Updater = updater; + public TextSpan Span { get; } = new TextSpan(startingIndex, startingColumn, endingIndex, endingColumn); + + override public SpanUpdateInfo[] Apply([NotNull] ref List lines) + { + ArgumentNullException.ThrowIfNull(lines); + + if (Span.StartingIndex < 0 || Span.EndingIndex >= lines.Count) + { + return []; + } + + if (Span.StartingIndex > Span.EndingIndex) + { + Logger.Error($"Starting index must be less than ending index, got {Span.StartingIndex} and {Span.EndingIndex}."); + return []; + } + + if (Span.StartingIndex == Span.EndingIndex && Span.StartingColumn > Span.EndingColumn) + { + Logger.Error($"Starting column must be less than ending column, got {Span.StartingColumn} and {Span.EndingColumn}."); + return []; + } + + switch (lines) + { + case var l when l.Count == 0: + Logger.Error("Document lines must not be null."); + return []; + case var l when l.Count <= Span.StartingIndex: + Logger.Error($"Starting index must be less than the number of lines, got index {Span.StartingIndex} for length {l.Count}."); + return []; + case var l when l.Count <= Span.EndingIndex: + Logger.Error($"Ending index must be less than the number of lines, got index {Span.EndingIndex} for length {l.Count}."); + return []; + } + + var startingLine = lines[Span.StartingIndex]; + var endingLine = lines[Span.EndingIndex]; + switch ((startingLine, endingLine)) + { + case var (start, _) when Span.StartingColumn > start.Length: + Logger.Error($"Starting column must be less than the length of the line, got index {Span.StartingColumn} for length {start.Length}."); + return []; + case var (_, end) when Span.EndingColumn > end.Length: + Logger.Error($"Ending column must be less than the length of the line, got index {Span.EndingColumn} for length {end.Length}."); + return []; + case var _ when Span.StartingIndex == Span.EndingIndex && Span.StartingColumn > Span.EndingColumn: + Logger.Error($"Starting column must be less than ending column, got index {Span.StartingColumn} for length {Span.EndingColumn}."); + return []; + } + + string[] newLines; + int offset; + if (Span.StartingIndex == Span.EndingIndex) + { + var updatingLine = lines[Span.StartingIndex][Span.StartingColumn..Span.EndingColumn]; + newLines = Updater([updatingLine]); + offset = Span.SetContent(ref lines, options, newLines); + } + else + { + var updatingLines = lines.Skip(Span.StartingIndex).Take(Span.EndingIndex - Span.StartingIndex + 1).ToArray(); + // Trim the starting and ending lines to the correct columns. + updatingLines[0] = lines[Span.StartingIndex][Span.StartingColumn..]; + updatingLines[^1] = lines[Span.EndingIndex][..Span.EndingColumn]; + + newLines = Updater(updatingLines); + offset = Span.SetContent(ref lines, options, newLines); + } + + return [new SpanUpdateInfo(Span, offset)]; + } + + override public void PushByUpdate(SpanUpdateInfo updateInfo) + { + if (Span.StartingIndex >= updateInfo.TextSpan.StartingIndex) + { + Span.StartingIndex += updateInfo.Offset; + } + + if (Span.EndingIndex >= updateInfo.TextSpan.StartingIndex) + { + Span.EndingIndex += updateInfo.Offset; + } + } + + public override string ToString() => $"{nameof(ExactUpdater)}({startingIndex}[{startingColumn}..]..{endingIndex}[..{endingColumn}])"; +} diff --git a/src/Compiler/Text/Updater/PatternUpdater.cs b/src/Compiler/Text/Updater/PatternUpdater.cs new file mode 100644 index 00000000..3bd29b99 --- /dev/null +++ b/src/Compiler/Text/Updater/PatternUpdater.cs @@ -0,0 +1,135 @@ +using System.Text; +using System.Text.RegularExpressions; +using CommandLine; +using NLog; + +namespace Compiler.Text.Updater; + +public class PatternUpdater( + uint priority, + Regex startingPattern, + Regex endingPattern, + UpdateOptions options, + Func updater +) : TextSpanUpdater(priority) +{ + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public Func Updater { get; } = updater; + public Regex StartingPattern { get; } = startingPattern; + public Regex EndingPattern { get; } = endingPattern; + + override public SpanUpdateInfo[] Apply(ref List lines) + { + var spanUpdateInfo = new List(); + var skipRanges = new HashSet(); + var offset = 0; + + while (true) + { + var (startIndex, endIndex) = FindStartToEndBlock([.. lines], offset, skipRanges); + if (startIndex == -1 || endIndex == -1) + { + break; + } + + var span = new TextSpan( + startIndex, + 0, + endIndex, + lines[endIndex].Length + ); + + var updatingLines = lines[startIndex..(endIndex + 1)].ToArray(); + var newLines = Updater(updatingLines); + var thisOffset = span.SetContent(ref lines, options, newLines); + + offset += thisOffset; + skipRanges.Add(new Range(startIndex, endIndex)); + spanUpdateInfo.Add(new SpanUpdateInfo(span, thisOffset)); + } + + return [.. spanUpdateInfo]; + } + + private (int, int) FindStartToEndBlock( + string[] lines, + int offset, + HashSet skipRanges + ) + { + if (lines == null || lines.Length == 0) + { + return (-1, -1); + } + + var offsetSkipRanges = new HashSet>(); + foreach (var range in skipRanges) + { + var clampedStart = Math.Clamp(range.Start.Value + offset, 0, lines.Length - 1); + var clampedEnd = Math.Clamp(range.End.Value + offset, 0, lines.Length - 1); + if (clampedStart < clampedEnd) + { + offsetSkipRanges.Add(Enumerable.Range(clampedStart, clampedEnd - clampedStart + 1)); + } + } + + int startIndex = -1; + int endIndex = -1; + int openLevel = 0; + + for (int i = 0; i < lines.Length; i++) + { + var clonedLine = lines[i].Clone().Cast()!; + if (offsetSkipRanges.Any(range => range.Contains(i))) + { + continue; + } + + var openingMatch = StartingPattern.Matches(clonedLine); + if (openingMatch.Count > 0) + { + if (openLevel == 0) + { + startIndex = i; + } + + openLevel += openingMatch.Count; + } + + // If we found at least one startPattern we will want to remove them from the string, + // This is so that the endingPattern does not match the same elements, and we can find the correct end. + if (openingMatch.Count > 0) + { + var lineOffset = 0; + foreach (Match match in openingMatch) + { + clonedLine = new StringBuilder() + .Append(clonedLine[..(match.Index + lineOffset)]) + .Append(clonedLine[(match.Index + lineOffset + match.Length)..]) + .ToString(); + lineOffset -= match.Length; + } + } + + if (openLevel > 0) + { + var closingMatch = EndingPattern.Matches(clonedLine); + if (closingMatch.Count > 0) + { + openLevel -= closingMatch.Count; + + if (openLevel == 0) + { + endIndex = i; + break; + } + } + } + } + + return (startIndex, endIndex); + } + + public override string ToString() => $"{nameof(PatternUpdater)}({StartingPattern} -> {EndingPattern})"; +} diff --git a/src/Compiler/Text/Updater/RegexUpdater.cs b/src/Compiler/Text/Updater/RegexUpdater.cs new file mode 100644 index 00000000..79849db7 --- /dev/null +++ b/src/Compiler/Text/Updater/RegexUpdater.cs @@ -0,0 +1,102 @@ +using System.Text.RegularExpressions; +using NLog; + +namespace Compiler.Text.Updater; + +public class RegexUpdater( + uint priority, + Regex pattern, + UpdateOptions options, + Func updater +) : TextSpanUpdater(priority) +{ + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public readonly Func Updater = updater; + public Regex Pattern + { + get + { + if (options.HasFlag(UpdateOptions.MatchEntireDocument)) + { + return new Regex(pattern.ToString(), pattern.Options | RegexOptions.Multiline | RegexOptions.Singleline); + } + else + { + return new Regex(pattern.ToString(), pattern.Options | RegexOptions.Multiline); + } + } + } + + /// + /// Applies the specified pattern to the given text document and returns an array of objects. + /// + /// The text document to apply the pattern to. + /// An array of objects representing the updates made to the document. + override public SpanUpdateInfo[] Apply(ref List lines) + { + var spanUpdateInfo = new List(); + var offset = 0; + + var multilinedContent = string.Join('\n', lines); + var matches = Pattern.Matches(multilinedContent); + + if (matches.Count == 0) + { + return []; + } + + foreach (Match match in matches) + { + var thisOffset = 0; + var multilineEndingIndex = match.Index + match.Length; + var contentBeforeThisLine = multilinedContent[..match.Index].LastIndexOf(value: '\n'); + var isMultiLine = options.HasFlag(UpdateOptions.MatchEntireDocument) && match.Value.Contains('\n'); + var startingLineIndex = multilinedContent[..match.Index].Count(c => c == '\n') + offset; + var endingLineIndex = multilinedContent[..multilineEndingIndex].Count(c => c == '\n') + offset; + + int startingColumn; + int endingColumn; + startingColumn = match.Index - (contentBeforeThisLine + 1); + if (isMultiLine) + { + endingColumn = multilineEndingIndex - (multilinedContent[..multilineEndingIndex].LastIndexOf('\n') + 1); + } + else + { + endingColumn = startingColumn + match.Length; + } + + var span = new TextSpan( + startingLineIndex, + startingColumn, + endingLineIndex, + endingColumn + ); + + var newContent = Updater(match); + + // Remove the entire line if the replacement is empty and the match is the entire line. + if (newContent == null && startingColumn == 0 && match.Length == lines[startingLineIndex].Length) + { + thisOffset += span.RemoveContent(ref lines); + } + else + { + var newLines = newContent == null ? [] : isMultiLine ? newContent.Split('\n') : [newContent]; + thisOffset += span.SetContent(ref lines, options, newLines); + if (isMultiLine) + { + thisOffset += newLines.Length - 1; + } + } + + spanUpdateInfo.Add(new SpanUpdateInfo(span, thisOffset)); + offset += thisOffset; + } + + return [.. spanUpdateInfo]; + } + + public override string ToString() => $"{nameof(RegexUpdater)}({Pattern})"; +} From 1c447ec3464a9cc86e8aed10e7d2d2d6d1b19d54 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 12 Jul 2024 18:39:25 +1000 Subject: [PATCH 084/341] test(Compiler): fix tests after rewrite. --- resources/mod.schema.json | 26 --------- resources/sandbox.schema.xsd | 46 --------------- {utils => resources}/test.ps1 | 0 .../Compiler/Module/{ => Resolvable}/Local.cs | 22 +++---- .../Resolvable/Script.cs} | 58 ++++--------------- tests/Compiler/Requirements/ModuleSpec.cs | 3 +- tests/Compiler/Text/Updater.cs | 18 +++--- tests/Compiler/Utils.cs | 14 +++++ 8 files changed, 43 insertions(+), 144 deletions(-) delete mode 100644 resources/mod.schema.json delete mode 100644 resources/sandbox.schema.xsd rename {utils => resources}/test.ps1 (100%) rename tests/Compiler/Module/{ => Resolvable}/Local.cs (75%) rename tests/Compiler/{CompiledScript.cs => Module/Resolvable/Script.cs} (83%) create mode 100644 tests/Compiler/Utils.cs diff --git a/resources/mod.schema.json b/resources/mod.schema.json deleted file mode 100644 index a9b49ca1..00000000 --- a/resources/mod.schema.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft-07/schema#", - "title": "Schema for the mod.json file", - "type": "object", - "properties": { - "exports": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "functions": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["name", "functions"] - } - } - }, - "required": ["exports"] -} diff --git a/resources/sandbox.schema.xsd b/resources/sandbox.schema.xsd deleted file mode 100644 index ff740610..00000000 --- a/resources/sandbox.schema.xsd +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/utils/test.ps1 b/resources/test.ps1 similarity index 100% rename from utils/test.ps1 rename to resources/test.ps1 diff --git a/tests/Compiler/Module/Local.cs b/tests/Compiler/Module/Resolvable/Local.cs similarity index 75% rename from tests/Compiler/Module/Local.cs rename to tests/Compiler/Module/Resolvable/Local.cs index 56910052..d92f2af1 100644 --- a/tests/Compiler/Module/Local.cs +++ b/tests/Compiler/Module/Resolvable/Local.cs @@ -1,29 +1,23 @@ -using Compiler.Module; -using Compiler.Requirements; +using Compiler.Module.Resolvable; using Compiler.Text; using System.Collections; -namespace Compiler.Test.Module; +namespace Compiler.Test.Module.Resolvable; [TestFixture] public class LocalModuleTests { - [TestCaseSource(typeof(TestData), nameof(TestData.FixLinesCases))] - public string FixLines( - string[] testLines - ) + public string TestCompileDocument(string testContent) { - var module = new LocalFileModule("test.ps1", new ModuleSpec("test"), new TextDocument(testLines), true, true); - module.FixLines(); - - var compiledDocument = CompiledDocument.FromBuilder(module.Document); + var module = new ResolvableLocalModule(TestUtils.GetModuleSpecFromContent(testContent)); + var compiledDocument = CompiledDocument.FromBuilder(module.Editor); return compiledDocument.GetContent(); } public class TestData { - private static readonly string[] MULTILINE_STRING_LINES = """ + private static readonly string MULTILINE_STRING_LINES = """ @" Doing cool stuff with this indented multiline string! @@ -35,14 +29,14 @@ This is a multiline string with single quotes! $MyVariable = @" This is a multiline string with a variable inside: $MyVariable "@; - """.Split('\n'); + """; public static IEnumerable FixLinesCases { get { yield return new TestCaseData( - arg: MULTILINE_STRING_LINES + MULTILINE_STRING_LINES ).Returns(""" @" Doing cool stuff with this indented multiline string! diff --git a/tests/Compiler/CompiledScript.cs b/tests/Compiler/Module/Resolvable/Script.cs similarity index 83% rename from tests/Compiler/CompiledScript.cs rename to tests/Compiler/Module/Resolvable/Script.cs index 15db8c78..d2d8a14b 100644 --- a/tests/Compiler/CompiledScript.cs +++ b/tests/Compiler/Module/Resolvable/Script.cs @@ -1,50 +1,14 @@ using System.Collections; using System.Text.RegularExpressions; -using Compiler.Module; +using Compiler.Module.Resolvable; using Compiler.Text; -namespace Compiler.Test; +namespace Compiler.Test.Module.Resolvable; [TestFixture] public class CompiledScriptTest { - const string TEST_SCRIPT = /*ps1*/ """ - #Requires -Version 5.1 - - <# - Making some random documentation for the module here!! - #> - [CmdletBinding()] - param( - [Parameter()] - [string]$Name - ) - - Set-StrictMode -Version 3; - - Import-Module $PSScriptRoot/src/common/00-Environment.psm1; - Invoke-RunMain $MyInvocation { - Write-Host 'Hello, World!'; - - Write-Host @" - This is a multiline string! - It can have multiple lines! - "@; - - # Write-Error 'This is an error message!' -Category InvalidOperation; - Invoke-FailedExit 1050; - - # Random comment - $Restart = Get-UserConfirmation 'Restart' 'Do you want to restart the script?'; - if ($Restart) { - Write-Host 'Restarting script...'; - Restart-Script; # Comment at the end of a line!! - } - else { - Write-Host 'Exiting script...'; - }; - } - """; + static readonly string TEST_SCRIPT = Path.Combine(Environment.CurrentDirectory, "resources", "test.ps1"); [TestCaseSource(typeof(TestData), nameof(TestData.TestCases))] public string Test( @@ -66,7 +30,7 @@ string scriptText ) { var scriptLines = scriptText.Split('\n'); - var script = new CompiledScript("test", new("test"), new(scriptLines)); + var script = new ResolvableScript(TestUtils.GetModuleSpecFromContent(scriptText)); var result = script.ExtractParameterBlock(); @@ -122,8 +86,8 @@ public static IEnumerable TestCases yield return new TestCaseData( new PatternUpdater( 50, - LocalFileModule.MultilineStringOpenRegex(), - LocalFileModule.MultilineStringCloseRegex(), + ResolvableLocalModule.MultilineStringOpenRegex(), + ResolvableLocalModule.MultilineStringCloseRegex(), UpdateOptions.None, (lines) => { @@ -169,7 +133,7 @@ It can have multiple lines! yield return new TestCaseData( new RegexUpdater( 50, - LocalFileModule.EntireLineCommentRegex(), + ResolvableLocalModule.EntireLineCommentRegex(), UpdateOptions.None, _ => null ), @@ -186,7 +150,7 @@ It can have multiple lines! yield return new TestCaseData( new RegexUpdater( 50, - LocalFileModule.EntireEmptyLineRegex(), + ResolvableLocalModule.EntireEmptyLineRegex(), UpdateOptions.None, _ => null ), @@ -209,8 +173,8 @@ It can have multiple lines! yield return new TestCaseData( new PatternUpdater( 50, - LocalFileModule.DocumentationStartRegex(), - LocalFileModule.DocumentationEndRegex(), + ResolvableLocalModule.DocumentationStartRegex(), + ResolvableLocalModule.DocumentationEndRegex(), UpdateOptions.None, _ => [] ), @@ -232,7 +196,7 @@ function foo { yield return new TestCaseData( new RegexUpdater( 50, - LocalFileModule.EndOfLineComment(), + ResolvableLocalModule.EndOfLineComment(), UpdateOptions.None, _ => null ), diff --git a/tests/Compiler/Requirements/ModuleSpec.cs b/tests/Compiler/Requirements/ModuleSpec.cs index 26a98254..a096bdef 100644 --- a/tests/Compiler/Requirements/ModuleSpec.cs +++ b/tests/Compiler/Requirements/ModuleSpec.cs @@ -144,7 +144,6 @@ public static IEnumerable MatchTestCases new Version("1.5.0") )).Returns(ModuleMatch.Same).SetName("Same match with all properties"); - // TODO - handle this better?, maybe a specific enum for it. yield return new TestCaseData(new ModuleSpec( "MyModule", guid, @@ -154,7 +153,7 @@ public static IEnumerable MatchTestCases "MyModule", guid, new Version("1.0.0") - )).Returns(ModuleMatch.Same).SetName("Same match because both are technically stricter"); + )).Returns(ModuleMatch.MergeRequired).SetName("Merge Required because both are stricter in different ways"); #endregion #region Looser matches diff --git a/tests/Compiler/Text/Updater.cs b/tests/Compiler/Text/Updater.cs index e6a2b157..9200cb69 100644 --- a/tests/Compiler/Text/Updater.cs +++ b/tests/Compiler/Text/Updater.cs @@ -1,7 +1,7 @@ using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; -using Compiler.Module; +using Compiler.Module.Resolvable; using Compiler.Text; namespace Compiler.Test.Text; @@ -62,24 +62,24 @@ public static IEnumerable AddPatternEditCases { yield return new TestCaseData( MULTINE_STRING_LINES, - LocalFileModule.MultilineStringOpenRegex().ToString(), - LocalFileModule.MultilineStringCloseRegex().ToString(), + ResolvableLocalModule.MultilineStringOpenRegex().ToString(), + ResolvableLocalModule.MultilineStringCloseRegex().ToString(), UpdateOptions.None, (Func)(_ => []) ).Returns(string.Empty).SetName("Remove all multiline strings with empty"); yield return new TestCaseData( MULTINE_STRING_LINES, - LocalFileModule.MultilineStringOpenRegex().ToString(), - LocalFileModule.MultilineStringCloseRegex().ToString(), + ResolvableLocalModule.MultilineStringOpenRegex().ToString(), + ResolvableLocalModule.MultilineStringCloseRegex().ToString(), UpdateOptions.None, (Func)(_ => ["Updated content!"]) ).Returns(string.Join('\n', Enumerable.Repeat("Updated content!", 2))).SetName("Replace each multiline string with 'Updated content'"); yield return new TestCaseData( MULTINE_STRING_LINES, - LocalFileModule.MultilineStringOpenRegex().ToString(), - LocalFileModule.MultilineStringCloseRegex().ToString(), + ResolvableLocalModule.MultilineStringOpenRegex().ToString(), + ResolvableLocalModule.MultilineStringCloseRegex().ToString(), UpdateOptions.None, (Func)(content => content.Select((line, index) => { @@ -104,8 +104,8 @@ public static IEnumerable AddPatternEditCases yield return new TestCaseData( DOCUMENTATION_LINES, - LocalFileModule.DocumentationStartRegex().ToString(), - LocalFileModule.DocumentationEndRegex().ToString(), + ResolvableLocalModule.DocumentationStartRegex().ToString(), + ResolvableLocalModule.DocumentationEndRegex().ToString(), UpdateOptions.None, (Func)(_ => []) ).Returns(string.Empty).SetName("Ensure that documentation blocks are removed from content."); diff --git a/tests/Compiler/Utils.cs b/tests/Compiler/Utils.cs new file mode 100644 index 00000000..9c993a5b --- /dev/null +++ b/tests/Compiler/Utils.cs @@ -0,0 +1,14 @@ +using Compiler.Requirements; + +namespace Compiler.Test; + +public class TestUtils +{ + public static PathedModuleSpec GetModuleSpecFromContent(string content) + { + var tempFile = Path.GetTempFileName(); + File.WriteAllText(tempFile, content); + return new PathedModuleSpec(tempFile); + } +} + From 653a65b7c589eb4667de4a36f8096fe18d14eefc Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 15 Jul 2024 15:46:22 +1000 Subject: [PATCH 085/341] feat(Compiler): Ast Updater Also refactor the multiline indentation to its own class, and add termination changes to fix a bug in compilation. --- src/Compiler/Module/Resolvable/Local.cs | 32 +------- src/Compiler/Program.cs | 4 + src/Compiler/Text/Span.cs | 5 +- src/Compiler/Text/Updater/AstUpdater.cs | 57 +++++++++++++ src/Compiler/Text/Updater/Built/HereString.cs | 81 +++++++++++++++++++ 5 files changed, 145 insertions(+), 34 deletions(-) create mode 100644 src/Compiler/Text/Updater/AstUpdater.cs create mode 100644 src/Compiler/Text/Updater/Built/HereString.cs diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 77abcc38..19af173e 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -3,6 +3,7 @@ using Compiler.Module.Compiled; using Compiler.Requirements; using Compiler.Text; +using Compiler.Text.Updater.Built; namespace Compiler.Module.Resolvable; @@ -58,29 +59,7 @@ public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) // Remove #Requires statements Editor.AddRegexEdit(20, RequiresStatementRegex(), _ => { return null; }); - // Fix indentation for Multiline Strings - Editor.AddPatternEdit( - 80, - MultilineStringOpenRegex(), - MultilineStringCloseRegex(), - UpdateOptions.InsertInline, - (lines) => - { - // Get the multiline indent level from the last line of the string. - // This is used so we don't remove any whitespace that is part of the actual string formatting. - var indentLevel = BeginingWhitespaceMatchRegex().Match(lines.Last()).Value.Length; - var updatedLines = lines.Select((line, index) => - { - if (index < 1 || string.IsNullOrWhiteSpace(line)) - { - return line; - } - - return line[indentLevel..]; - }); - - return updatedLines.ToArray(); - }); + Editor.AddEdit(() => new HereStringUpdater()); } /// @@ -172,8 +151,6 @@ public override bool Equals(object? obj) public override int GetHashCode() => ModuleSpec.GetHashCode(); #region Regex Patterns - [GeneratedRegex(@"^\s*")] - private static partial Regex BeginingWhitespaceMatchRegex(); [GeneratedRegex(@"^(?!\n)*$")] public static partial Regex EntireEmptyLineRegex(); @@ -189,11 +166,6 @@ public override bool Equals(object? obj) [GeneratedRegex(@"(?!\n)\s*(?).*$")] public static partial Regex EndOfLineComment(); - [GeneratedRegex(@"^.*@[""']")] - public static partial Regex MultilineStringOpenRegex(); - - [GeneratedRegex(@"^\s*[""']@")] - public static partial Regex MultilineStringCloseRegex(); [GeneratedRegex(@"^\s*#Requires\s+-Version\s+\d+\.\d+")] private static partial Regex RequiresStatementRegex(); #endregion diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index f406071a..622fd2a5 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -12,6 +12,8 @@ class Program : IDisposable { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + internal static bool IsDebugging; + public static readonly Lazy RunspacePool = new(() => { var sessionState = InitialSessionState.CreateDefault2(); @@ -47,6 +49,8 @@ public static void Main(string[] args) { _ = Parser.Default.ParseArguments(args).WithParsed(opts => { + Program.IsDebugging = opts.Debug; + LogManager.Setup().LoadConfiguration(builder => { var console = new ColoredConsoleTarget("console") diff --git a/src/Compiler/Text/Span.cs b/src/Compiler/Text/Span.cs index 5058dc24..0319a577 100644 --- a/src/Compiler/Text/Span.cs +++ b/src/Compiler/Text/Span.cs @@ -69,10 +69,7 @@ public bool Contains(int index, int column) [Pure] public string GetContent(string[] lines) { - if (lines.Length == 0) - { - return string.Empty; - } + if (lines.Length == 0) return string.Empty; if (StartingIndex < 0 || StartingIndex >= lines.Length) { diff --git a/src/Compiler/Text/Updater/AstUpdater.cs b/src/Compiler/Text/Updater/AstUpdater.cs new file mode 100644 index 00000000..023c1687 --- /dev/null +++ b/src/Compiler/Text/Updater/AstUpdater.cs @@ -0,0 +1,57 @@ +using System.Management.Automation.Language; + +namespace Compiler.Text.Updater; + +public class AstUpdater( + uint priority, + Func astPredicate, + Func updater, + UpdateOptions options) : TextSpanUpdater(priority) +{ + public override SpanUpdateInfo[] Apply(ref List lines) + { + var ast = AstHelper.GetAstReportingErrors(string.Join('\n', lines), "AstUpdater", []); + if (ast == null || string.IsNullOrWhiteSpace(ast.Extent.Text)) return []; + + IEnumerable nodesToUpdate; + if (options.HasFlag(UpdateOptions.MatchEntireDocument)) + { + nodesToUpdate = ast.FindAll(astPredicate, true); + if (!nodesToUpdate.Any()) return []; + } + else + { + var node = ast.Find(astPredicate, true); + if (node == null) return []; + nodesToUpdate = [node]; + } + + var offset = 0; + var updateSpans = new List(); + foreach (var node in nodesToUpdate) + { + var thisOffset = 0; + var extent = node.Extent; + var span = new TextSpan( + extent.StartLineNumber - 1, + extent.StartColumnNumber - 1, + extent.EndLineNumber - 1, + extent.EndColumnNumber - 1 + ); + + var isMultiLine = span.StartingIndex != span.EndingIndex; + var newContent = updater(node); + ArgumentNullException.ThrowIfNull(newContent); + + // Remove the entire line if the replacement is empty and the match is the entire line. + if (newContent == null && span.StartingColumn == 0 && span.EndingColumn == lines[span.StartingIndex].Length) + { thisOffset += span.RemoveContent(ref lines); } + else { thisOffset += span.SetContent(ref lines, options, newContent!); } + + updateSpans.Add(new SpanUpdateInfo(span, thisOffset)); + offset += thisOffset; + } + + return [.. updateSpans]; + } +} diff --git a/src/Compiler/Text/Updater/Built/HereString.cs b/src/Compiler/Text/Updater/Built/HereString.cs new file mode 100644 index 00000000..213c042e --- /dev/null +++ b/src/Compiler/Text/Updater/Built/HereString.cs @@ -0,0 +1,81 @@ +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using System.Management.Automation.Language; + +namespace Compiler.Text.Updater.Built; + +public partial class HereStringUpdater() : AstUpdater( + 80, + static ast => ast is StringConstantExpressionAst stringConstantAst && stringConstantAst.StringConstantType is StringConstantType.SingleQuotedHereString or StringConstantType.DoubleQuotedHereString, + static hereString => InternalApply(hereString), + UpdateOptions.InsertInline +) +{ + [Pure] + public static string[] InternalApply([NotNull] Ast ast) + { + ArgumentNullException.ThrowIfNull(ast); + if (ast is not StringConstantExpressionAst stringConstant) return []; + + var linesAfterMaybeUpdate = stringConstant.StringConstantType switch + { + StringConstantType.SingleQuotedHereString => UpdateTerminators(stringConstant), + StringConstantType.DoubleQuotedHereString => stringConstant.Extent.Text.Split('\n'), + // This should never happen, but if it does, throw an exception. + _ => throw new NotImplementedException($"Unsupported string constant type: {stringConstant.StringConstantType}") + }; + + return UpdateIndentation(linesAfterMaybeUpdate); + } + + /// + /// Removes the indentation from the multiline string. + /// + /// This is done by finding how much whitespace is present on the terminating line, + /// and then removing that amount of whitespace from every line in the string. + /// + /// + /// The lines of the multiline string. + /// + /// + /// An array of strings with the indentation removed. + /// + [Pure] + internal static string[] UpdateIndentation([NotNull] IEnumerable lines) + { + // Get the multiline indent level from the last line of the string. + // This is used so we don't remove any whitespace that is part of the actual string formatting. + var indentLevel = lines.Last().TakeWhile(char.IsWhiteSpace).Count(); + var updatedLines = lines.Select((line, index) => + { + if (index < 1 || string.IsNullOrWhiteSpace(line)) + { + return line; + } + + return line[indentLevel..]; + }); + + return updatedLines.ToArray(); + } + + /// + /// Updates the terminators of a here-string. + /// + /// This is done by returning a string with the exact same content, + /// but with double quoted terminators. + /// + /// + /// The here-string to update. + /// + /// + /// A string with the same content as the AST, but with double quoted terminators. + /// + [Pure] + internal static string[] UpdateTerminators([NotNull] StringConstantExpressionAst stringConstant) + { + ArgumentNullException.ThrowIfNull(stringConstant); + + return ["@\"", stringConstant.Value, "\"@"]; + } +} From f9a32edfc39e8e58d1daf85100917de287ca6b78 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 15 Jul 2024 18:47:23 +1000 Subject: [PATCH 086/341] refactor(Compiler): User a template for the compiled script. --- src/Compiler/Compiler.csproj | 4 + src/Compiler/Module/Compiled/Local.cs | 2 +- src/Compiler/Module/Compiled/Script.cs | 150 +++++++--------------- src/Compiler/Module/Resolvable/Script.cs | 12 +- src/Compiler/Program.cs | 2 +- src/Compiler/Resources/ScriptTemplate.ps1 | 52 ++++++++ 6 files changed, 113 insertions(+), 109 deletions(-) create mode 100644 src/Compiler/Resources/ScriptTemplate.ps1 diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index d551076d..2a95adae 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -55,6 +55,10 @@ false + + + + diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index f7915214..b0593351 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -56,7 +56,7 @@ public CompiledLocalModule(PathedModuleSpec moduleSpec, CompiledDocument documen })) .AppendLine() .AppendLine(Document.GetContent()) - .AppendLine("'@;") + .Append("'@;") .ToString(); public override IEnumerable GetExportedFunctions() => AstHelper.FindAvailableFunctions(Ast, true).Select(function => function.Name); diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 02fbe252..7fad6924 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -1,5 +1,5 @@ -using System.Collections; using System.Management.Automation.Language; +using System.Reflection; using System.Text; using Compiler.Analyser; using Compiler.Module.Resolvable; @@ -12,7 +12,7 @@ namespace Compiler.Module.Compiled; -public class CompiledScript : Compiled +public class CompiledScript : CompiledLocalModule { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -20,20 +20,12 @@ public class CompiledScript : Compiled public readonly BidirectionalGraph> Graph; - public readonly CompiledDocument Document; - - public override string ComputedHash => throw new NotImplementedException(); - - public override ContentType ContentType => throw new NotImplementedException(); - - public override Version Version => throw new NotImplementedException(); - public CompiledScript( PathedModuleSpec moduleSpec, TextEditor editor, ResolvableParent resolvableParent, ParamBlockAst? scriptParamBlock - ) : base(moduleSpec) + ) : base(moduleSpec, CompiledDocument.FromBuilder(editor, 0)) { var graphviz = resolvableParent.Graph.ToGraphviz(alg => { @@ -45,7 +37,6 @@ public CompiledScript( Logger.Debug("Initial graphviz:"); Logger.Debug(graphviz); - Document = CompiledDocument.FromBuilder(editor, 0); ScriptParamBlock = scriptParamBlock; Graph = new BidirectionalGraph>(); Graph.AddVertex(this); @@ -104,106 +95,63 @@ public CompiledScript( }); } - /// - /// The script contents. - /// - /// - /// The script contents. - /// public override string GetPowerShellObject() { - var sb = new StringBuilder(); - - sb.AppendJoin('\n', Requirements.GetRequirements().Select(requirement => + var info = Assembly.GetExecutingAssembly().GetName(); + using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.ScriptTemplate.ps1")!; + using var streamReader = new StreamReader(templateStream, Encoding.UTF8); + var template = streamReader.ReadToEnd(); + + var EMBEDDED_MODULES = new StringBuilder(); + EMBEDDED_MODULES.AppendLine("$Script:EMBEDDED_MODULES = @("); + Graph.Vertices.ToList().ForEach(module => { - var data = new Hashtable() { { "NameSuffix", Convert.ToHexString(requirement.Hash) } }; - return requirement.GetInsertableLine(data); - })); - sb.AppendLine(); + var moduleObject = module switch + { + CompiledScript script when script == this => base.GetPowerShellObject(), + _ => module.GetPowerShellObject() + }; - if (ScriptParamBlock != null) - { - sb.AppendJoin('\n', ScriptParamBlock.Attributes.Select(attr => attr.Extent.Text)); - sb.AppendLine(); - - sb.Append(ScriptParamBlock.Extent.Text); - sb.AppendLine(); - } - - #region Begin Block - sb.AppendLine("begin {"); - sb.AppendLine(" $Global:CompiledScript = $True;"); - sb.AppendLine(" $Global:EmbeddedModules = @{"); - Graph.Vertices.Skip(1).ToList().ForEach(module => sb.AppendLine($$""" '{{module.ModuleSpec.Name}}' = {{module.GetPowerShellObject()}}""")); - sb.AppendLine("};"); - - sb.AppendLine(/*ps1*/ """ - $Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; - if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { - Write-Host "Creating module root folder: $Local:PrivatePSModulePath"; - New-Item -Path $Local:PrivatePSModulePath -ItemType Directory | Out-Null; - } - if (-not ($Env:PSModulePath -like "*$Local:PrivatePSModulePath*")) { - $Env:PSModulePath = "$Local:PrivatePSModulePath;" + $Env:PSModulePath; - } - $Global:EmbeddedModules.GetEnumerator() | ForEach-Object { - $Local:Content = $_.Value.Content; - $Local:Name = $_.Key; - $Local:ModuleFolderPath = Join-Path -Path $Local:PrivatePSModulePath -ChildPath $Local:Name; - if (-not (Test-Path -Path $Local:ModuleFolderPath)) { - Write-Host "Creating module folder: $Local:ModuleFolderPath"; - New-Item -Path $Local:ModuleFolderPath -ItemType Directory | Out-Null; - } - switch ($_.Value.Type) { - 'UTF8String' { - $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:Name.psm1"; - if (-not (Test-Path -Path $Local:InnerModulePath)) { - Write-Host "Writing content to module file: $Local:InnerModulePath" - Set-Content -Path $Local:InnerModulePath -Value $Content; - } - } - 'ZipHex' { - if ((Get-ChildItem -Path $Local:ModuleFolderPath).Count -ne 0) { - return; - } - [String]$Local:TempFile = [System.IO.Path]::GetTempFileName(); - [Byte[]]$Local:Bytes = [System.Convert]::FromHexString($Content); - [System.IO.File]::WriteAllBytes($Local:TempFile, $Local:Bytes); - Write-Host "Expanding module file: $Local:TempFile" - Expand-Archive -Path $Local:TempFile -DestinationPath $Local:ModuleFolderPath -Force; - } - Default { - Write-Warning "Unknown module type: $($_)"; - } - } - } - """); - - sb.AppendLine("}"); - #endregion - - #region End Block - sb.AppendLine($$""" - end { - {{Document.GetContent()}} - $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; - } - """); - #endregion - - return sb.ToString(); - } + var lineCount = moduleObject.Split('\n').Length; + var skipLines = Enumerable.Range(6, lineCount - 1); + EMBEDDED_MODULES.AppendLine(IndentString(moduleObject, 8, skipLines)); + }); + EMBEDDED_MODULES.AppendLine(IndentString(");", 4)); - public override string StringifyContent() => throw new NotImplementedException(); - public override IEnumerable GetExportedFunctions() => throw new NotImplementedException(); + // TODO - Implement a way to replace #!DEFINE macros in the template. + // This could also be how we can implement secure variables during compilation. + template = template.Replace("#!DEFINE EMBEDDED_MODULES", EMBEDDED_MODULES.ToString()); + return template; + } - private static string IndentString(string str, int indentBy, bool indentFirstLine = true) + /// + /// Utility method for indenting a string. + /// + /// As indentation is optional in PowerShell this will not add any indentations + /// if the program is running without the Debug flag to conserve space. + /// + /// + /// The string to indent. + /// + /// + /// The amount of spaces to indent by. + /// + /// + /// The lines to skip when indenting. + /// + /// + /// The indented string. + /// + private static string IndentString(string str, int indentBy, IEnumerable? skipLines = null) { + if (!Program.IsDebugging) { return str; } + var indent = new string(' ', indentBy); var lines = str.Split('\n'); var indentedLines = lines.Select((line, index) => { - if (index == 0 && !indentFirstLine) { return line; } + if (string.IsNullOrWhiteSpace(line)) { return line; } // Skip empty lines. + if (skipLines != null && skipLines.Contains(index)) { return line; } return indent + line; }); diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index 57500aac..ef57b65d 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -14,12 +14,12 @@ public ResolvableScript(PathedModuleSpec moduleSpec) : base(moduleSpec) { ResolvableParent = new ResolvableParent(this); - Editor.AddRegexEdit(RunMainRegex(), Text.UpdateOptions.MatchEntireDocument, static match => - { - var block = match.Groups["Block"].Value; - var invocation = match.Groups.ContainsKey("Invocation") ? match.Groups["Invocation"].Value : "$MyInvocation"; - return string.Format(InvokeRunMain, "00-Environment", invocation, block); - }); + // Editor.AddRegexEdit(RunMainRegex(), Text.UpdateOptions.MatchEntireDocument, static match => + // { + // var block = match.Groups["Block"].Value; + // var invocation = match.Groups.ContainsKey("Invocation") ? match.Groups["Invocation"].Value : "$MyInvocation"; + // return string.Format(InvokeRunMain, "00-Environment", invocation, block); + // }); ResolvableParent.Resolve(); diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 622fd2a5..d580f050 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -49,7 +49,7 @@ public static void Main(string[] args) { _ = Parser.Default.ParseArguments(args).WithParsed(opts => { - Program.IsDebugging = opts.Debug; + IsDebugging = opts.Debug; LogManager.Setup().LoadConfiguration(builder => { diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 new file mode 100644 index 00000000..a164aa7d --- /dev/null +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -0,0 +1,52 @@ +begin { + $Global:CompiledScript = $True; + #!DEFINE EMBEDDED_MODULES + + $Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; + if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { + Write-Host "Creating module root folder: $Local:PrivatePSModulePath"; + New-Item -Path $Local:PrivatePSModulePath -ItemType Directory | Out-Null; + } + if (-not ($Env:PSModulePath -like "*$Local:PrivatePSModulePath*")) { + $Env:PSModulePath = "$Local:PrivatePSModulePath;" + $Env:PSModulePath; + } + $Script:EMBEDDED_MODULES.GetEnumerator() | ForEach-Object { + $Local:Content = $_.Value.Content; + $Local:Name = $_.Key; + $Local:ModuleFolderPath = Join-Path -Path $Local:PrivatePSModulePath -ChildPath $Local:Name; + if (-not (Test-Path -Path $Local:ModuleFolderPath)) { + Write-Host "Creating module folder: $Local:ModuleFolderPath"; + New-Item -Path $Local:ModuleFolderPath -ItemType Directory | Out-Null; + } + switch ($_.Value.Type) { + 'UTF8String' { + $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:Name.psm1"; + if (-not (Test-Path -Path $Local:InnerModulePath)) { + Write-Host "Writing content to module file: $Local:InnerModulePath" + Set-Content -Path $Local:InnerModulePath -Value $Content; + } + } + 'ZipHex' { + if ((Get-ChildItem -Path $Local:ModuleFolderPath).Count -ne 0) { + return; + } + [String]$Local:TempFile = [System.IO.Path]::GetTempFileName(); + [Byte[]]$Local:Bytes = [System.Convert]::FromHexString($Content); + [System.IO.File]::WriteAllBytes($Local:TempFile, $Local:Bytes); + Write-Host "Expanding module file: $Local:TempFile" + Expand-Archive -Path $Local:TempFile -DestinationPath $Local:ModuleFolderPath -Force; + } + Default { + Write-Warning "Unknown module type: $($_)"; + } + } + } +} +process { + $Private:ScriptContents = $Script:EMBEDDED_MODULES[0]; + Invoke-Expression -Command $Private:ScriptContents; +} +end { + $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; + Remove-Variable -Scope Global -Name CompiledScript, EMBEDDED_MODULES; +} From b58a1d3c3bbba4be9e659a390f512e938bae2e03 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 16 Jul 2024 17:05:27 +1000 Subject: [PATCH 087/341] fix(Compiler): module comparison for pre-cached remotes --- src/Compiler/Module/Resolvable/Remote.cs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 92abef92..c3438032 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -81,16 +81,10 @@ public override bool Equals(object? obj) { if (_cachedFile != null) return _cachedFile; - if (!Directory.Exists(CachePath)) - { - return null; - } + if (!Directory.Exists(CachePath)) return null; var files = Directory.GetFiles(CachePath, "*.nupkg"); - if (files.Length == 0) - { - return null; - } + if (files.Length == 0) return null; var versions = files.Where(file => { @@ -108,7 +102,7 @@ public override bool Equals(object? obj) var selectedVersion = versions.Where(version => { var otherSpec = new ModuleSpec(ModuleSpec.Name, ModuleSpec.Guid, RequiredVersion: version); - var matchType = ModuleSpec.CompareTo(otherSpec); + var matchType = otherSpec.CompareTo(ModuleSpec); return matchType == ModuleMatch.Same || matchType == ModuleMatch.Stricter; }).OrderByDescending(version => version).FirstOrDefault(); From aefa2a0d0114144f2eda0cb0ad9aafb18faaf3f0 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 16 Jul 2024 17:05:44 +1000 Subject: [PATCH 088/341] fix(Compiler): Formatting of last line in module definition --- src/Compiler/Module/Compiled/Script.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 7fad6924..68547e5b 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -112,8 +112,9 @@ public override string GetPowerShellObject() _ => module.GetPowerShellObject() }; - var lineCount = moduleObject.Split('\n').Length; - var skipLines = Enumerable.Range(6, lineCount - 1); + var lineCount = moduleObject.Count(character => character == '\n'); + // Only skip the lines of the content of the module object. + var skipLines = Enumerable.Range(6, lineCount - 6); EMBEDDED_MODULES.AppendLine(IndentString(moduleObject, 8, skipLines)); }); EMBEDDED_MODULES.AppendLine(IndentString(");", 4)); From bb51b7ca4ff7abe904f864b0cae0897c5882b6eb Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 16 Jul 2024 17:06:03 +1000 Subject: [PATCH 089/341] fix(Compiler): Version comparison issue --- src/Compiler/Requirements/ModuleSpec.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index f0789508..320251a9 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -159,7 +159,7 @@ public virtual ModuleMatch CompareTo(ModuleSpec other) { case (null, null): break; - case (null, var b) when b < MinimumVersion || b > MaximumVersion: + case (null, var b) when (MinimumVersion != null && b < MinimumVersion) || (MaximumVersion != null && b > MaximumVersion): return ModuleMatch.Incompatible; case (var a, null) when (other.MinimumVersion != null && a < other.MinimumVersion) || (other.MaximumVersion != null && a > other.MaximumVersion): return ModuleMatch.Incompatible; From 8fccabf12c36aa60de9d16a13bd0bb278ad79160 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 16 Jul 2024 17:07:13 +1000 Subject: [PATCH 090/341] fix(Compiler): Template, modules are a list now not a hashtable. Also export the script itself as a module then run it by calling that file with the arguments. Changes all the Logging to verbose instead of host to reduce verbositiy. --- src/Compiler/Resources/ScriptTemplate.ps1 | 43 ++++++++++++++--------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index a164aa7d..51178dad 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -1,30 +1,42 @@ begin { - $Global:CompiledScript = $True; + [Boolean]$Global:CompiledScript = $True; #!DEFINE EMBEDDED_MODULES - - $Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; + [String]$Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { - Write-Host "Creating module root folder: $Local:PrivatePSModulePath"; + Write-Verbose "Creating module root folder: $Local:PrivatePSModulePath"; New-Item -Path $Local:PrivatePSModulePath -ItemType Directory | Out-Null; } if (-not ($Env:PSModulePath -like "*$Local:PrivatePSModulePath*")) { $Env:PSModulePath = "$Local:PrivatePSModulePath;" + $Env:PSModulePath; } - $Script:EMBEDDED_MODULES.GetEnumerator() | ForEach-Object { - $Local:Content = $_.Value.Content; - $Local:Name = $_.Key; - $Local:ModuleFolderPath = Join-Path -Path $Local:PrivatePSModulePath -ChildPath $Local:Name; + $Script:ScriptPath; + $Script:EMBEDDED_MODULES | ForEach-Object { + $Local:Name = $_.Name; + $Local:Type = $_.Type; + $Local:Hash = $_.Hash; + $Local:Content = $_.Content; + $Local:NameHash = "$Local:Name-$Local:Hash"; + if (-not $Local:Name -or -not $Local:Type -or -not $Local:Hash -or -not $Local:Content) { + Write-Warning "Invalid module definition: $($_), skipping..."; + return; + } + + $Local:ModuleFolderPath = Join-Path -Path $Local:PrivatePSModulePath -ChildPath $Local:NameHash; if (-not (Test-Path -Path $Local:ModuleFolderPath)) { - Write-Host "Creating module folder: $Local:ModuleFolderPath"; + Write-Verbose "Creating module folder: $Local:ModuleFolderPath"; New-Item -Path $Local:ModuleFolderPath -ItemType Directory | Out-Null; } - switch ($_.Value.Type) { + + switch ($_.Type) { 'UTF8String' { - $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:Name.psm1"; + $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:NameHash.psm1"; if (-not (Test-Path -Path $Local:InnerModulePath)) { - Write-Host "Writing content to module file: $Local:InnerModulePath" + Write-Verbose "Writing content to module file: $Local:InnerModulePath" Set-Content -Path $Local:InnerModulePath -Value $Content; } + if ($null -eq $Script:ScriptPath) { + $Script:ScriptPath = $Local:InnerModulePath; + } } 'ZipHex' { if ((Get-ChildItem -Path $Local:ModuleFolderPath).Count -ne 0) { @@ -33,7 +45,7 @@ begin { [String]$Local:TempFile = [System.IO.Path]::GetTempFileName(); [Byte[]]$Local:Bytes = [System.Convert]::FromHexString($Content); [System.IO.File]::WriteAllBytes($Local:TempFile, $Local:Bytes); - Write-Host "Expanding module file: $Local:TempFile" + Write-Verbose "Expanding module file: $Local:TempFile" Expand-Archive -Path $Local:TempFile -DestinationPath $Local:ModuleFolderPath -Force; } Default { @@ -43,10 +55,9 @@ begin { } } process { - $Private:ScriptContents = $Script:EMBEDDED_MODULES[0]; - Invoke-Expression -Command $Private:ScriptContents; + & $Script:ScriptPath @PSBoundParameters; } end { $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; - Remove-Variable -Scope Global -Name CompiledScript, EMBEDDED_MODULES; + Remove-Variable -Scope Global -Name CompiledScript; } From 0f74d9a48f00c024cd79c1f36ae28a0dea5dc356 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 30 Jul 2024 12:56:53 +1000 Subject: [PATCH 091/341] test(Compiler): more tests and fixes --- resources/test2.ps1 | 7 + tests/Compiler/Module/Compiled/Compiled.cs | 81 ++++++ tests/Compiler/Module/Resolvable/Local.cs | 16 +- tests/Compiler/Module/Resolvable/Script.cs | 105 +++---- tests/Compiler/Requirements/ModuleSpec.cs | 55 +++- tests/Compiler/Requirements/Requirements.cs | 305 ++++++++++++++++---- tests/Compiler/Requirements/RunAsAdmin.cs | 15 +- tests/Compiler/Text/Updater.cs | 42 --- tests/Compiler/Utils.cs | 9 + tests/common/Base.ps1 | 2 +- 10 files changed, 459 insertions(+), 178 deletions(-) create mode 100644 resources/test2.ps1 create mode 100644 tests/Compiler/Module/Compiled/Compiled.cs diff --git a/resources/test2.ps1 b/resources/test2.ps1 new file mode 100644 index 00000000..f6bef7bd --- /dev/null +++ b/resources/test2.ps1 @@ -0,0 +1,7 @@ +Using module ../src/common/00-Environment.psm1 +Using module ../src/common/01-Logging.psm1 +Using module ../src/common/02-Exit.psm1 +Invoke-RunMain $MyInvocation { + Write-Error 'This is an error message!' -Category InvalidOperation; + Invoke-FailedExit 1050; +} diff --git a/tests/Compiler/Module/Compiled/Compiled.cs b/tests/Compiler/Module/Compiled/Compiled.cs new file mode 100644 index 00000000..25ac8942 --- /dev/null +++ b/tests/Compiler/Module/Compiled/Compiled.cs @@ -0,0 +1,81 @@ +using static Compiler.Module.Compiled.Compiled; +using Compiler.Requirements; +using System.Collections; + +namespace Compiler.Test.Module.Compiled; + +[TestFixture] +public class CompiledTests +{ + [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementHashData)), Repeat(10)] + public void AddRequirementHashBytes_AlwaysSameResult( + byte[] hashableBytes, + RequirementGroup requirementGroup + ) + { + var random = new Random(); + List bytesList; + var hashResults = new List(); + do + { + bytesList = new List(hashableBytes); + AddRequirementHashBytes(bytesList, requirementGroup); + hashResults.Add([.. hashableBytes]); + } while (hashResults.Count < random.Next(2, 5)); + + var firstResult = hashResults.First(); + Assert.Multiple(() => + { + foreach (var result in hashResults) + { + Assert.That(result, Is.EqualTo(firstResult)); + } + }); + } +} + +file static class TestData +{ + public static IEnumerable AddRequirementHashData + { + get + { + var random = new Random(); + var hashableBytes = new byte[random.Next(10, 100)]; + random.NextBytes(hashableBytes); + + yield return new TestCaseData( + hashableBytes, + new RequirementGroup() + { + StoredRequirements = { + { typeof(ModuleSpec), new HashSet { + new ModuleSpec("PSWindowsUpdate"), + new ModuleSpec("PSReadLine", requiredVersion: new (2, 3, 5)), + new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/00-Environment.psm1") + } }, + { typeof(PSEditionRequirement), new HashSet { + new PSEditionRequirement(PSEdition.Core) + } }, + { typeof(UsingNamespace), new HashSet { + new UsingNamespace("System.Collections"), + new UsingNamespace("System.Diagnostics") + } }, + } + } + ).SetName("Multiple types of Requirements"); + + yield return new TestCaseData( + hashableBytes, + new RequirementGroup() + { + StoredRequirements = { + { typeof(ModuleSpec), new HashSet { + new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/00-Environment.psm1") + } }, + } + } + ).SetName("Single type of Requirement"); + } + } +} diff --git a/tests/Compiler/Module/Resolvable/Local.cs b/tests/Compiler/Module/Resolvable/Local.cs index d92f2af1..75fd69b8 100644 --- a/tests/Compiler/Module/Resolvable/Local.cs +++ b/tests/Compiler/Module/Resolvable/Local.cs @@ -7,13 +7,13 @@ namespace Compiler.Test.Module.Resolvable; [TestFixture] public class LocalModuleTests { - [TestCaseSource(typeof(TestData), nameof(TestData.FixLinesCases))] - public string TestCompileDocument(string testContent) - { - var module = new ResolvableLocalModule(TestUtils.GetModuleSpecFromContent(testContent)); - var compiledDocument = CompiledDocument.FromBuilder(module.Editor); - return compiledDocument.GetContent(); - } + // [TestCaseSource(typeof(TestData), nameof(TestData.FixLinesCases))] + // public string TestCompileDocument(string testContent) + // { + // var module = new ResolvableLocalModule(TestUtils.GetModuleSpecFromContent(testContent)); + // var compiledDocument = CompiledDocument.FromBuilder(module.Editor); + // return compiledDocument.GetContent(); + // } public class TestData { @@ -38,7 +38,7 @@ public static IEnumerable FixLinesCases yield return new TestCaseData( MULTILINE_STRING_LINES ).Returns(""" - @" + @" Doing cool stuff with this indented multiline string! This is the end of the string! diff --git a/tests/Compiler/Module/Resolvable/Script.cs b/tests/Compiler/Module/Resolvable/Script.cs index d2d8a14b..e8386cc4 100644 --- a/tests/Compiler/Module/Resolvable/Script.cs +++ b/tests/Compiler/Module/Resolvable/Script.cs @@ -2,6 +2,7 @@ using System.Text.RegularExpressions; using Compiler.Module.Resolvable; using Compiler.Text; +using Compiler.Text.Updater; namespace Compiler.Test.Module.Resolvable; @@ -56,12 +57,12 @@ public static IEnumerable ExtractParameterBlockCases { get { - yield return new TestCaseData(false, TEST_SCRIPT).Returns(""" - param( - [Parameter()] - [string]$Name - ) - """).SetName("ExtractParameterBlock_ReturnsParameterBlockAst_WhenParameterBlockExists"); + // yield return new TestCaseData(false, TEST_SCRIPT).Returns(""" + // param( + // [Parameter()] + // [string]$Name + // ) + // """).SetName("ExtractParameterBlock_ReturnsParameterBlockAst_WhenParameterBlockExists"); yield return new TestCaseData(true, """ #Requires -Version 5.1 @@ -83,52 +84,52 @@ public static IEnumerable TestCases { get { - yield return new TestCaseData( - new PatternUpdater( - 50, - ResolvableLocalModule.MultilineStringOpenRegex(), - ResolvableLocalModule.MultilineStringCloseRegex(), - UpdateOptions.None, - (lines) => - { - var startIndex = 0; - - // If the multiline is not at the start of the content it does not need to be trimmed, so we skip it. - var trimmedLine = lines[0].Trim(); - if (trimmedLine.StartsWith(@"@""") || trimmedLine.StartsWith("@'")) - { - startIndex++; - } - - // Get the multiline indent level from the last line of the string. - // This is used so we don't remove any whitespace that is part of the actual string formatting. - var indentLevel = new Regex(@"^\s*").Match(lines.Last()).Value.Length; - - var updatedLines = lines.Select((line, index) => - { - if (index < startIndex) - { - return line; - } - - return line[indentLevel..]; - }); - - return updatedLines.ToArray(); - } - ), - """ - Write-Host @" - This is a multiline string! - It can have multiple lines! - "@; - """ - ).Returns(""" - Write-Host @" - This is a multiline string! - It can have multiple lines! - "@; - """).SetName("Fix Indentation for Multiline Strings"); + // yield return new TestCaseData( + // new PatternUpdater( + // 50, + // ResolvableLocalModule.MultilineStringOpenRegex(), + // ResolvableLocalModule.MultilineStringCloseRegex(), + // UpdateOptions.None, + // (lines) => + // { + // var startIndex = 0; + + // // If the multiline is not at the start of the content it does not need to be trimmed, so we skip it. + // var trimmedLine = lines[0].Trim(); + // if (trimmedLine.StartsWith(@"@""") || trimmedLine.StartsWith("@'")) + // { + // startIndex++; + // } + + // // Get the multiline indent level from the last line of the string. + // // This is used so we don't remove any whitespace that is part of the actual string formatting. + // var indentLevel = new Regex(@"^\s*").Match(lines.Last()).Value.Length; + + // var updatedLines = lines.Select((line, index) => + // { + // if (index < startIndex) + // { + // return line; + // } + + // return line[indentLevel..]; + // }); + + // return updatedLines.ToArray(); + // } + // ), + // """ + // Write-Host @" + // This is a multiline string! + // It can have multiple lines! + // "@; + // """ + // ).Returns(""" + // Write-Host @" + // This is a multiline string! + // It can have multiple lines! + // "@; + // """).SetName("Fix Indentation for Multiline Strings"); yield return new TestCaseData( new RegexUpdater( diff --git a/tests/Compiler/Requirements/ModuleSpec.cs b/tests/Compiler/Requirements/ModuleSpec.cs index a096bdef..76b7fa36 100644 --- a/tests/Compiler/Requirements/ModuleSpec.cs +++ b/tests/Compiler/Requirements/ModuleSpec.cs @@ -1,6 +1,7 @@ using Compiler.Module; using Compiler.Requirements; using System.Collections; +using System.Security.Policy; namespace Compiler.Test.Requirements; @@ -14,7 +15,7 @@ public string GetInsertableLine_ReturnsCorrectLine(ModuleSpec moduleSpec) } [TestCaseSource(typeof(TestData), nameof(TestData.MatchTestCases))] - public ModuleMatch CompareTo_ReturnsModuleMatchExact( + public ModuleMatch CompareTo( ModuleSpec moduleSpec1, ModuleSpec moduleSpec2 ) @@ -41,7 +42,18 @@ ModuleSpec[] otherModuleSpecs } } -public class TestData +[TestFixture] +public class PathedModuleSpecTests +{ + [TestCaseSource(typeof(TestData), nameof(TestData.MatchTestCases))] + [TestCaseSource(typeof(TestData), nameof(TestData.ComparePathedSpecCases))] + public ModuleMatch CompareTo( + ModuleSpec moduleSpec1, + ModuleSpec moduleSpec2 + ) => moduleSpec1.CompareTo(moduleSpec2); +} + +file class TestData { public static IEnumerable InsetableLinesCases { @@ -67,7 +79,7 @@ public static IEnumerable InsetableLinesCases yield return new TestCaseData(new ModuleSpec( "MyModule", guid, - MaximumVersion: new Version("2.0.0") + maximumVersion: new Version("2.0.0") )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{guid}};MaximumVersion = '2.0.0';}""").SetName("Name, guid and maximum version"); yield return new TestCaseData(new ModuleSpec( @@ -352,11 +364,11 @@ public static IEnumerable MatchTestCases yield return new TestCaseData(new ModuleSpec( "MyModule", guid, - RequiredVersion: new Version("1.0.0") + requiredVersion: new Version("1.0.0") ), new ModuleSpec( "MyModule", guid, - RequiredVersion: new Version("1.0.1") + requiredVersion: new Version("1.0.1") )).Returns(ModuleMatch.Incompatible).SetName("Incompatible match because of different required version"); yield return new TestCaseData(new ModuleSpec( @@ -467,7 +479,7 @@ public static IEnumerable MergeSpecCases new( "MyModule", guid, - RequiredVersion: new Version("1.5.0") + requiredVersion: new Version("1.5.0") ) }).SetName("Update required version").Returns(new ModuleSpec( "MyModule", @@ -504,7 +516,7 @@ public static IEnumerable MergeSpecCases new( "MyModule", guid, - MaximumVersion: new Version("1.5.0") + maximumVersion: new Version("1.5.0") ) }).SetName("Update maximum version").Returns(new ModuleSpec( "MyModule", @@ -533,4 +545,33 @@ public static IEnumerable MergeSpecCases )); } } + + public static IEnumerable ComparePathedSpecCases + { + get + { + var testScript1 = Path.GetFullPath($"{TestUtils.RepositoryDirectory()}/resources/test.ps1"); + var testScript2 = Path.GetFullPath($"{TestUtils.RepositoryDirectory()}/resources/test2.ps1"); + + yield return new TestCaseData( + new PathedModuleSpec(testScript1), + new PathedModuleSpec(testScript1) + ).Returns(ModuleMatch.Same).SetName("Same match"); + + yield return new TestCaseData( + new PathedModuleSpec(testScript1), + new PathedModuleSpec(testScript2) + ).Returns(ModuleMatch.None).SetName("Different name"); + + yield return new TestCaseData( + new PathedModuleSpec(testScript1), + new ModuleSpec("./test.ps1") + ).Returns(ModuleMatch.Same).SetName("Same match with relative path"); + + yield return new TestCaseData( + new PathedModuleSpec(testScript1), + new ModuleSpec("./test2.ps1") + ).Returns(ModuleMatch.None).SetName("Different name with relative path"); + } + } } diff --git a/tests/Compiler/Requirements/Requirements.cs b/tests/Compiler/Requirements/Requirements.cs index dbc6ad13..238fccd8 100644 --- a/tests/Compiler/Requirements/Requirements.cs +++ b/tests/Compiler/Requirements/Requirements.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.Security.Cryptography; using System.Text; using Compiler.Requirements; @@ -41,116 +42,294 @@ public static IEnumerable CaseForEachRequirementType [TestFixture] public class RequirementGroupTests { - [Test] - public void AddRequirement_ShouldAddRequirementToList() + [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementTests))] + public void AddRequirement(Requirement[] requirements) { var requirementGroup = new RequirementGroup(); - var requirement = new SampleRequirement("Data"); - - requirementGroup.AddRequirement(requirement); + foreach (var requirement in requirements) + { + requirementGroup.AddRequirement(requirement); + } - var storedRequirements = requirementGroup.GetRequirements(); + var storedRequirements = requirementGroup.GetRequirements(); Assert.Multiple(() => { - Assert.That(storedRequirements, Has.Count.EqualTo(1)); - Assert.That(storedRequirements, Does.Contain(requirement)); + Assert.That(storedRequirements, Has.Count.EqualTo(requirements.Length)); + Assert.That(storedRequirements, Is.EquivalentTo(requirements)); }); } - [Test] - public void RemoveRequirement_ShouldRemoveRequirementFromList() + [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementTests))] + public void RemoveRequirement(Requirement[] requirements) { var requirementGroup = new RequirementGroup(); - var requirement = new SampleRequirement("Data"); - requirementGroup.AddRequirement(requirement); + foreach (var requirement in requirements) + { + requirementGroup.AddRequirement(requirement); + } - var removed = requirementGroup.RemoveRequirement(requirement); + var removingCount = (int)Math.Ceiling(requirements.Length / 2.0); // Ensure we remove at least one + var removed = 0; + for (var i = 0; i < removingCount; i++) + { + if (requirementGroup.RemoveRequirement(requirements[i])) removed++; + } - var storedRequirements = requirementGroup.GetRequirements(); + var storedRequirements = requirementGroup.GetRequirements(); Assert.Multiple(() => { - Assert.That(removed, Is.True); - Assert.That(storedRequirements, Is.Empty); - Assert.That(storedRequirements, Does.Not.Contain(requirement)); + Assert.That(removed, Is.EqualTo(removingCount)); + Assert.That(storedRequirements, Has.Count.EqualTo(requirements.Length - removed)); + Assert.That(storedRequirements, Is.EquivalentTo(requirements.Skip(removingCount))); }); } - [Test] - public void ReplaceRequirement_ShouldReplaceOldRequirementWithNewRequirement() + [Test, Repeat(1000)] + public void GetRequirements_ShouldReturnAllRequirementsInOrderOfHashWhenSameWeight() { var requirementGroup = new RequirementGroup(); - var oldRequirement = new SampleRequirement("Data1"); - var newRequirement = new SampleRequirement("Data2"); - requirementGroup.AddRequirement(oldRequirement); - - var replaced = requirementGroup.ReplaceRequirement(oldRequirement, newRequirement); + var requirementsList = new List(); + for (var i = 0; i < 100; i++) + { + var requirement = new TestData.SampleRequirement(i.ToString()); + requirementsList.Add(requirement); + requirementGroup.AddRequirement(requirement); + } - var storedRequirements = requirementGroup.GetRequirements(); + var requirements = requirementGroup.GetRequirements(); Assert.Multiple(() => { - Assert.That(replaced, Is.True); - Assert.That(storedRequirements, Has.Count.EqualTo(1)); - Assert.That(storedRequirements, Does.Not.Contain(oldRequirement)); - Assert.That(storedRequirements, Does.Contain(newRequirement)); + Assert.That(requirements, Has.Count.EqualTo(100)); + Assert.That(requirements, Is.Ordered.By(nameof(Requirement.Weight))); + for (var i = 0; i < 100; i++) + { + Assert.That(requirements.ElementAt(i), Is.EqualTo(requirementsList[i])); + } }); } +} - [Test, Repeat(100)] - public void GetRequirements_ShouldReturnAllRequirementsInOrder() +[TestFixture] +public class RequirementWeightSorterTests +{ + [Test] + public void Compare_WhenBothRequirementsAreNull_ReturnsZero() { - var requirementGroup = new RequirementGroup(); - var requirement1 = new SampleRequirement("Data1"); - var requirement2 = new SampleRequirement("Data2"); - requirementGroup.AddRequirement(requirement1); - requirementGroup.AddRequirement(requirement2); + var sorter = new RequirementWeightSorter(); + int result = sorter.Compare(null, null); - var requirements = requirementGroup.GetRequirements(); + Assert.That(result, Is.EqualTo(0)); + } - Assert.Multiple(() => - { - Assert.That(requirements, Has.Count.EqualTo(2)); - Assert.That(requirements.ElementAt(0), Is.EqualTo(requirement1)); - Assert.That(requirements.ElementAt(1), Is.EqualTo(requirement2)); - }); + [Test] + public void Compare_WhenFirstRequirementIsNull_ReturnsNegativeOne() + { + var sorter = new RequirementWeightSorter(); + var requirement = new TestData.TestRequirement(true); + int result = sorter.Compare(null, requirement); + Assert.That(result, Is.EqualTo(-1)); } [Test] - public void VerifyRequirements_ShouldReturnTrueWhenAllRequirementsAreCompatible() + public void Compare_WhenSecondRequirementIsNull_ReturnsOne() { - var requirementGroup = new RequirementGroup(); - var requirement1 = new SampleRequirement("Data1"); - var requirement2 = new SampleRequirement("Data2"); - requirementGroup.AddRequirement(requirement1); - requirementGroup.AddRequirement(requirement2); + var sorter = new RequirementWeightSorter(); + var requirement = new TestData.TestRequirement(true); + int result = sorter.Compare(requirement, null); - var result = requirementGroup.VerifyRequirements(); - Assert.That(result, Is.True); + Assert.That(result, Is.EqualTo(1)); } [Test] - public void VerifyRequirements_ShouldReturnFalseWhenIncompatibleRequirementsExist() + public void Compare_WhenBothRequirementsHaveSameWeight_ReturnsZero() { - var requirementGroup = new RequirementGroup(); - var requirement1 = new SampleRequirement("Data1"); - var requirement2 = new IncompatibleRequirement(); - requirementGroup.AddRequirement(requirement1); - requirementGroup.AddRequirement(requirement2); + var sorter = new RequirementWeightSorter(); + var requirement1 = new TestData.TestRequirement(true); + var requirement2 = new TestData.TestRequirement(true); + int result = sorter.Compare(requirement1, requirement2); + + Assert.That(result, Is.EqualTo(0)); + } + + [Test] + public void Compare_WhenFirstRequirementHasLowerWeight_ReturnsNegativeOne() + { + var sorter = new RequirementWeightSorter(); + var requirement1 = new TestData.TestRequirement(true, 50); + var requirement2 = new TestData.TestRequirement(true, 100); + int result = sorter.Compare(requirement1, requirement2); + + Assert.That(result, Is.EqualTo(-1)); + } + + [Test] + public void Compare_WhenFirstRequirementHasHigherWeight_ReturnsOne() + { + var sorter = new RequirementWeightSorter(); + var requirement1 = new TestData.TestRequirement(true, 100); + var requirement2 = new TestData.TestRequirement(true, 50); + int result = sorter.Compare(requirement1, requirement2); + + Assert.That(result, Is.EqualTo(1)); + } + + [Test] + public void Compare_WhenRequirementsHaveSameWeight_ReturnsZero() + { + var sorter = new RequirementWeightSorter(); + var requirement1 = new TestData.TestRequirement(true, hash: [1, 2, 3]); + var requirement2 = new TestData.TestRequirement(true, hash: [1, 2, 4]); + int result = sorter.Compare(requirement1, requirement2); + + Assert.That(result, Is.EqualTo(0)); + } + + [TestCaseSource(typeof(TestData), nameof(TestData.CaseForEachRequirementType))] + public void Compare( + Requirement requirement1, + Requirement requirement2, + int expected) + { + var sorter = new RequirementWeightSorter(); + int result = sorter.Compare(requirement1, requirement2); + + switch (result) + { + case var _ when result < 0: + Assert.That(result, Is.LessThanOrEqualTo(expected)); + break; + case var _ when result > 0: + Assert.That(result, Is.GreaterThanOrEqualTo(expected)); + break; + default: + Assert.That(result, Is.EqualTo(expected)); + break; + } + } +} + +file class TestData +{ + private static int _counter = 0; + public static Requirement GetNewRequirement() => new SampleRequirement(_counter++.ToString()); + public static Requirement[] GetNewRequirements(int count) + { + var requirements = new Requirement[count]; + for (var i = 0; i < count; i++) { requirements[i] = GetNewRequirement(); } + return requirements; + } + + public static IEnumerable CaseForEachRequirementType + { + get + { + yield return new TestCaseData( + new RunAsAdminRequirement(), + new RunAsAdminRequirement(), + 0 + ).SetCategory("Equal"); + + yield return new TestCaseData( + new RunAsAdminRequirement(), + new UsingNamespace("System"), + -1 + ).SetCategory("Hash Difference"); + + yield return new TestCaseData( + new UsingNamespace("System"), + new RunAsAdminRequirement(), + 1 + ).SetCategory("Hash Difference"); + + yield return new TestCaseData( + new ModuleSpec("TestModule"), + new PSEditionRequirement(PSEdition.Desktop), + 1 + ).SetCategory("Weight Difference"); + + yield return new TestCaseData( + new PSEditionRequirement(PSEdition.Desktop), + new ModuleSpec("TestModule"), + -1 + ).SetCategory("Weight Difference"); - var result = requirementGroup.VerifyRequirements(); - Assert.That(result, Is.False); + yield return new TestCaseData( + new ModuleSpec("TestModule"), + new ModuleSpec("TestModule"), + 0 + ).SetCategory("Equal"); + + yield return new TestCaseData( + new ModuleSpec("TestModule-2"), + new ModuleSpec("TestModule-1"), + -1 + ).SetCategory("Hash Difference"); + + yield return new TestCaseData( + new ModuleSpec("TestModule-1"), + new ModuleSpec("TestModule-2"), + 1 + ).SetCategory("Hash Difference"); + } + } + + public static IEnumerable AddRequirementTests + { + get + { + yield return new TestCaseData( + arg: GetNewRequirements(1) + ).SetDescription("Single Requirement"); + + yield return new TestCaseData( + arg: GetNewRequirements(2) + ).SetDescription("Two Requirements"); + + yield return new TestCaseData( + arg: GetNewRequirements(10) + ).SetDescription("Multiple Requirements"); + } + } + + internal sealed class TestRequirement : Requirement + { + public TestRequirement( + bool supportsMultiple, + uint weight = 50, + byte[]? hash = null) : base() + { + SupportsMultiple = supportsMultiple; + Weight = weight; + Hash = hash ?? SHA1.HashData(Encoding.UTF8.GetBytes(weight.ToString())); + } + + public override string GetInsertableLine(Hashtable data) => throw new NotImplementedException(); + public override bool IsCompatibleWith(Requirement other) => throw new NotImplementedException(); } - private record SampleRequirement(string Data) : Requirement(true) + internal sealed class SampleRequirement : Requirement { - public override byte[] Hash => Encoding.UTF8.GetBytes(Data); + private readonly string _data; + public SampleRequirement(string data) : base() + { + _data = data; + SupportsMultiple = true; + Hash = SHA1.HashData(Encoding.UTF8.GetBytes(data)); + } + public override bool IsCompatibleWith(Requirement other) => true; public override string GetInsertableLine(Hashtable _data) => string.Empty; } - private record IncompatibleRequirement() : Requirement(true) + internal sealed class IncompatibleRequirement : Requirement { - public override byte[] Hash => []; + public IncompatibleRequirement() : base() + { + SupportsMultiple = false; + Hash = SHA1.HashData(Encoding.UTF8.GetBytes("Incompatible")); + } + public override bool IsCompatibleWith(Requirement other) => false; public override string GetInsertableLine(Hashtable _data) => string.Empty; } diff --git a/tests/Compiler/Requirements/RunAsAdmin.cs b/tests/Compiler/Requirements/RunAsAdmin.cs index 6fc9b0df..80a7b2e3 100644 --- a/tests/Compiler/Requirements/RunAsAdmin.cs +++ b/tests/Compiler/Requirements/RunAsAdmin.cs @@ -5,9 +5,11 @@ namespace Compiler.Test.Requirements; [TestFixture] -public class RunAsAdminRequirementTests { +public class RunAsAdminRequirementTests +{ [Test] - public void Hash_ShouldReturnHashOfString() { + public void Hash_ShouldReturnHashOfString() + { var requirement = new RunAsAdminRequirement(); var hash = requirement.Hash; @@ -15,7 +17,8 @@ public void Hash_ShouldReturnHashOfString() { } [Test] - public void Hash_ShouldAlwaysBeTheSame() { + public void Hash_ShouldAlwaysBeTheSame() + { var requirement = new RunAsAdminRequirement(); var requirement1 = new RunAsAdminRequirement(); @@ -23,7 +26,8 @@ public void Hash_ShouldAlwaysBeTheSame() { } [Test] - public void GetInsertableLine_ShouldReturnString() { + public void GetInsertableLine_ShouldReturnString() + { var requirement = new RunAsAdminRequirement(); var insertableLine = requirement.GetInsertableLine([]); @@ -32,7 +36,8 @@ public void GetInsertableLine_ShouldReturnString() { } [Test] - public void IsCompatibleWith_ShouldReturnTrue() { + public void IsCompatibleWith_ShouldReturnTrue() + { var requirement = new RunAsAdminRequirement(); var isCompatible = requirement.IsCompatibleWith(new RunAsAdminRequirement()); diff --git a/tests/Compiler/Text/Updater.cs b/tests/Compiler/Text/Updater.cs index 9200cb69..82fa7149 100644 --- a/tests/Compiler/Text/Updater.cs +++ b/tests/Compiler/Text/Updater.cs @@ -60,48 +60,6 @@ public static IEnumerable AddPatternEditCases { get { - yield return new TestCaseData( - MULTINE_STRING_LINES, - ResolvableLocalModule.MultilineStringOpenRegex().ToString(), - ResolvableLocalModule.MultilineStringCloseRegex().ToString(), - UpdateOptions.None, - (Func)(_ => []) - ).Returns(string.Empty).SetName("Remove all multiline strings with empty"); - - yield return new TestCaseData( - MULTINE_STRING_LINES, - ResolvableLocalModule.MultilineStringOpenRegex().ToString(), - ResolvableLocalModule.MultilineStringCloseRegex().ToString(), - UpdateOptions.None, - (Func)(_ => ["Updated content!"]) - ).Returns(string.Join('\n', Enumerable.Repeat("Updated content!", 2))).SetName("Replace each multiline string with 'Updated content'"); - - yield return new TestCaseData( - MULTINE_STRING_LINES, - ResolvableLocalModule.MultilineStringOpenRegex().ToString(), - ResolvableLocalModule.MultilineStringCloseRegex().ToString(), - UpdateOptions.None, - (Func)(content => content.Select((line, index) => - { - if (index > 0 && index < content.Length - 1) - { - return line + "Updated content!"; - } - else - { - return line; - } - }).ToArray())).Returns(string.Join('\n', [ - "@\"", - "Doing cool stuff with this multiline string!Updated content!", - "Updated content!", - "This is the end of the string!Updated content!", - "\"@;", - "@'", - "This is a multiline string with single quotes!Updated content!", - "'@" - ])).SetName("Prepend 'Updated content' to each line except first and last"); - yield return new TestCaseData( DOCUMENTATION_LINES, ResolvableLocalModule.DocumentationStartRegex().ToString(), diff --git a/tests/Compiler/Utils.cs b/tests/Compiler/Utils.cs index 9c993a5b..8ff1be14 100644 --- a/tests/Compiler/Utils.cs +++ b/tests/Compiler/Utils.cs @@ -1,3 +1,5 @@ +using System.Reflection; +using System.Runtime.CompilerServices; using Compiler.Requirements; namespace Compiler.Test; @@ -10,5 +12,12 @@ public static PathedModuleSpec GetModuleSpecFromContent(string content) File.WriteAllText(tempFile, content); return new PathedModuleSpec(tempFile); } + + private static string CallerFilePath([CallerFilePath] string? callerFilePath = null) => + callerFilePath ?? throw new ArgumentNullException(nameof(callerFilePath)); + + public static string ProjectDirectory() => Path.GetDirectoryName(CallerFilePath())!; + + public static string RepositoryDirectory() => Path.GetDirectoryName(Path.Combine(ProjectDirectory(), "../../"))!; } diff --git a/tests/common/Base.ps1 b/tests/common/Base.ps1 index 1546d925..c8395318 100644 --- a/tests/common/Base.ps1 +++ b/tests/common/Base.ps1 @@ -1,10 +1,10 @@ $VerbosePreference = 'Continue'; $DebugPreference = 'Continue'; Import-Module -Name $PSScriptRoot/../../src/common/00-Environment.psm1; -Import-CommonModules; if ((Get-PSCallStack)[3].Command -or -not ((Get-PSCallStack)[0].Command -match "|$($PSCommandPath | Split-Path -Leaf)")) { $Local:ModuleName = ((Get-PSCallStack)[0].InvocationInfo.PSCommandPath | Split-Path -LeafBase) -replace '\.Tests$', ''; + Import-Module -Name "$PSScriptRoot/../../src/common/$Local:ModuleName.psm1"; if (-not (Get-Module -Name $Local:ModuleName)) { throw "Module $Local:ModuleName is not available."; From 021e95eb1028e03918ed63f8174e1edfa63ad4fa Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 30 Jul 2024 13:01:17 +1000 Subject: [PATCH 092/341] refactor(Compiler): Hashing changes --- src/Compiler/Compiler.csproj | 1 + src/Compiler/Module/Compiled/Compiled.cs | 45 ++++++-- src/Compiler/Module/Compiled/Local.cs | 38 ++----- src/Compiler/Module/Compiled/Remote.cs | 46 +++----- src/Compiler/Module/Compiled/Script.cs | 5 +- src/Compiler/Module/Module.cs | 24 ++--- src/Compiler/Module/Resolvable/Local.cs | 11 +- src/Compiler/Module/Resolvable/Remote.cs | 12 +-- src/Compiler/Module/Resolvable/Resolvable.cs | 27 +++-- src/Compiler/Module/Resolvable/Script.cs | 22 +--- src/Compiler/Requirements/ModuleSpec.cs | 82 +++++++++++---- src/Compiler/Requirements/PSEdition.cs | 12 ++- src/Compiler/Requirements/PSVersion.cs | 12 ++- src/Compiler/Requirements/Requirements.cs | 105 ++++++++----------- src/Compiler/Requirements/RunAsAdmin.cs | 8 +- src/Compiler/Requirements/UsingNamespace.cs | 18 ++-- 16 files changed, 250 insertions(+), 218 deletions(-) diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 2a95adae..47eff437 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -11,6 +11,7 @@ true portable + preview Properties Compiler Compiler diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 1ac066f9..e03a3383 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -1,28 +1,40 @@ -using System.Text; +using System.Diagnostics.Contracts; +using System.Security.Cryptography; using Compiler.Requirements; namespace Compiler.Module.Compiled; -public abstract partial class Compiled(ModuleSpec moduleSpec) +public abstract class Compiled { - public readonly ModuleSpec ModuleSpec = moduleSpec; + public readonly ModuleSpec ModuleSpec; - public required RequirementGroup Requirements; + public RequirementGroup Requirements; /// /// Gets combined the hash of the content and requirements of the module. /// - public abstract string ComputedHash { get; } + public string ComputedHash; /// - /// Determines how the content string of this module should be interpreted. + /// The version of the module, not necessarily the same as the version of the module spec. /// - public abstract ContentType ContentType { get; } + public abstract Version Version { get; } /// - /// The version of the module, not necessarily the same as the version of the module spec. + /// Determines how the content string of this module should be interpreted. /// - public abstract Version Version { get; } + public abstract ContentType Type { get; } + + [Pure] + protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] hashableBytes) + { + ModuleSpec = moduleSpec; + Requirements = requirements; + + var byteList = new List(hashableBytes); + AddRequirementHashBytes(byteList, requirements); + ComputedHash = Convert.ToHexString(SHA1.HashData(byteList.ToArray())); + } public abstract string StringifyContent(); @@ -39,14 +51,27 @@ public virtual string GetPowerShellObject() => $$""" Name = '{{ModuleSpec.Name}}'; Version = '{{Version}}'; Hash = '{{ComputedHash}}'; - Type = '{{ContentType}}'; + Type = '{{Type}}'; Content = {{StringifyContent()}} } """; + + public static void AddRequirementHashBytes(List hashableBytes, RequirementGroup requirementGroup) + { + var requirements = requirementGroup.GetRequirements(); + if (requirements.IsEmpty) + { + requirements.ToList().ForEach(requirement => + { + hashableBytes.AddRange(requirement.Hash); + }); + } + } } public enum ContentType { UTF8String, + ZipHex } diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index b0593351..393a720e 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -1,4 +1,3 @@ - using System.Collections; using System.Management.Automation.Language; using System.Security.Cryptography; @@ -11,37 +10,20 @@ namespace Compiler.Module.Compiled; public class CompiledLocalModule : Compiled { - public readonly CompiledDocument Document; + public override ContentType Type { get; } = ContentType.UTF8String; - public readonly ScriptBlockAst Ast; + // Local modules are always version 0.0.1, as they are not versioned. + public override Version Version { get; } = new Version(0, 0, 1); - public override string ComputedHash - { - get - { - var hashableBytes = Encoding.UTF8.GetBytes(Document.GetContent()).ToList(); - - var requirements = Requirements.GetRequirements(); - if (requirements.IsEmpty) - { - Requirements.GetRequirements().ToList().ForEach(requirement => - { - hashableBytes.AddRange(requirement.Hash); - }); - } - - return Convert.ToHexString(SHA1.HashData([.. hashableBytes])); - } - } - - public override ContentType ContentType => ContentType.UTF8String; + public readonly CompiledDocument Document; - /// - /// A local modules version is always 0.0.1. - /// - public override Version Version => Version.Parse("0.0.1"); + public readonly ScriptBlockAst Ast; - public CompiledLocalModule(PathedModuleSpec moduleSpec, CompiledDocument document) : base(moduleSpec) + public CompiledLocalModule( + PathedModuleSpec moduleSpec, + CompiledDocument document, + RequirementGroup requirements + ) : base(moduleSpec, requirements, Encoding.UTF8.GetBytes(document.GetContent())) { Document = document; Ast = AstHelper.GetAstReportingErrors(string.Join('\n', Document.Lines), moduleSpec.FullPath, ["ModuleNotFoundDuringParse"]); diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 9d4fb5d5..3c638e01 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -1,50 +1,38 @@ using System.Collections; using System.IO.Compression; -using System.Security.Cryptography; using CommandLine; using Compiler.Requirements; using NLog; -using NLog.LayoutRenderers; namespace Compiler.Module.Compiled; -public class CompiledRemoteModule(ModuleSpec moduleSpec) : Compiled(moduleSpec) +public class CompiledRemoteModule : Compiled { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private Hashtable? _powerShellManifest; private ZipArchive? _zipArchive; - public required MemoryStream MemoryStream { get; init; } + public readonly MemoryStream MemoryStream; - public override string ComputedHash - { - get - { - var hashableBytes = MemoryStream.ToArray().ToList(); - - var requirements = Requirements.GetRequirements(); - if (requirements.IsEmpty) - { - Requirements.GetRequirements().ToList().ForEach(requirement => - { - hashableBytes.AddRange(requirement.Hash); - }); - } - - return Convert.ToHexString(SHA1.HashData([.. hashableBytes])); - } - } + public override ContentType Type => ContentType.ZipHex; - public override ContentType ContentType => ContentType.ZipHex; + public override Version Version { get; } - public override Version Version + internal CompiledRemoteModule( + ModuleSpec moduleSpec, + RequirementGroup requirements, + MemoryStream memoryStream + ) : base(moduleSpec, requirements, memoryStream.ToArray()) { - get + MemoryStream = memoryStream; + + var manifest = GetPowerShellManifest(); + Version = manifest["ModuleVersion"] switch { - var manifest = GetPowerShellManifest(); - if (manifest["ModuleVersion"] is string version) return Version.Parse(version); - return new Version(0, 0, 1); - } + string version => Version.Parse(version), + null => new Version(0, 0, 1), + _ => throw new Exception($"ModuleVersion must be a string, but was {manifest["ModuleVersion"]?.GetType()}") + }; } public override string StringifyContent() => $"'{Convert.ToHexString(MemoryStream.ToArray())}'"; diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 68547e5b..3f841729 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -24,8 +24,9 @@ public CompiledScript( PathedModuleSpec moduleSpec, TextEditor editor, ResolvableParent resolvableParent, - ParamBlockAst? scriptParamBlock - ) : base(moduleSpec, CompiledDocument.FromBuilder(editor, 0)) + ParamBlockAst? scriptParamBlock, + RequirementGroup requirements + ) : base(moduleSpec, CompiledDocument.FromBuilder(editor, 0), requirements) { var graphviz = resolvableParent.Graph.ToGraphviz(alg => { diff --git a/src/Compiler/Module/Module.cs b/src/Compiler/Module/Module.cs index a5758137..2ad323c2 100644 --- a/src/Compiler/Module/Module.cs +++ b/src/Compiler/Module/Module.cs @@ -13,35 +13,35 @@ public abstract partial class Module(ModuleSpec moduleSpec) public override int GetHashCode() => ModuleSpec.GetHashCode(); } -public enum ModuleMatch +public enum ModuleMatch : short { /// - /// This module matches the requirements and doesn't have any additional restrictions. + /// This module has incompatible restrictions. /// - Same, + Incompatible = -2, /// - /// This module is both stricter and looser than the requirements, and can be merged. + /// This module does not match the requirements. /// - MergeRequired, + None = -1, /// - /// This module fulfills the requirements, but has a stricter scope. + /// This module matches the requirements and doesn't have any additional restrictions. /// - Stricter, + Same = 0, /// /// This module fulfills the requirements, but has a looser scope. /// - Looser, + Looser = 1, /// - /// This module has incompatible restrictions. + /// This module is both stricter and looser than the requirements, and can be merged. /// - Incompatible, + MergeRequired = 2, /// - /// This module does not match the requirements. + /// This module fulfills the requirements, but has a stricter scope. /// - None + Stricter = 3, } diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 19af173e..21c6824e 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -59,7 +59,7 @@ public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) // Remove #Requires statements Editor.AddRegexEdit(20, RequiresStatementRegex(), _ => { return null; }); - Editor.AddEdit(() => new HereStringUpdater()); + Editor.AddEdit(static () => new HereStringUpdater()); } /// @@ -134,10 +134,11 @@ public override RequirementGroup ResolveRequirements() return _requirements = requirementGroup; } - public override Compiled.Compiled IntoCompiled() => new CompiledLocalModule(ModuleSpec, CompiledDocument.FromBuilder(Editor, 0)) - { - Requirements = ResolveRequirements() - }; + public override Compiled.Compiled IntoCompiled() => new CompiledLocalModule( + ModuleSpec, + CompiledDocument.FromBuilder(Editor, 0), + ResolveRequirements() + ); public override bool Equals(object? obj) { diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index c3438032..08431a0e 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -63,11 +63,11 @@ public override RequirementGroup ResolveRequirements() return requirementGroup; } - public override Compiled.Compiled IntoCompiled() => new CompiledRemoteModule(ModuleSpec) - { - MemoryStream = _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false), - Requirements = ResolveRequirements() - }; + public override Compiled.Compiled IntoCompiled() => new CompiledRemoteModule( + ModuleSpec, + ResolveRequirements(), + _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false) + ); public override bool Equals(object? obj) { @@ -101,7 +101,7 @@ public override bool Equals(object? obj) var selectedVersion = versions.Where(version => { - var otherSpec = new ModuleSpec(ModuleSpec.Name, ModuleSpec.Guid, RequiredVersion: version); + var otherSpec = new ModuleSpec(ModuleSpec.Name, ModuleSpec.Guid, requiredVersion: version); var matchType = otherSpec.CompareTo(ModuleSpec); return matchType == ModuleMatch.Same || matchType == ModuleMatch.Stricter; diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index a2d7bb98..a456f80c 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using Compiler.Requirements; using NLog; using QuikGraph; @@ -36,10 +37,18 @@ public ResolvableParent(Resolvable rootModule) #region Deduplication and merging of Resolvables using events Graph.VertexAdded += vertex => Logger.Debug($"Vertex added: {vertex.ModuleSpec.Name}"); Graph.VertexRemoved += vertex => Logger.Debug($"Vertex removed: {vertex.ModuleSpec.Name}"); - Graph.EdgeRemoved += edge => Logger.Debug($"Edge removed: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); - Graph.EdgeAdded += edge => Logger.Debug($"Edge added: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); - Graph.EdgeRemoved += edge => edge.Source.Requirements.RemoveRequirement(edge.Target.ModuleSpec); - Graph.EdgeAdded += edge => edge.Source.Requirements.AddRequirement(edge.Target.ModuleSpec); + Graph.EdgeRemoved += edge => + { + Logger.Debug($"Edge removed: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); + var didRemove = edge.Source.Requirements.RemoveRequirement(edge.Target.ModuleSpec); + if (!didRemove) Logger.Warn($"Failed to remove requirement {edge.Target.ModuleSpec} from {edge.Source.ModuleSpec}."); + }; + Graph.EdgeAdded += edge => + { + Logger.Debug($"Edge added: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); + var didAdd = edge.Source.Requirements.AddRequirement(edge.Target.ModuleSpec); + if (!didAdd) Logger.Warn($"Failed to add requirement {edge.Target.ModuleSpec} to {edge.Source.ModuleSpec}."); + }; #endregion } @@ -118,9 +127,8 @@ public void Resolve() // If its an incompatible match we need to throw an error. resultingResolvable = match switch { - ModuleMatch.Same => foundResolvable, - ModuleMatch.Looser => foundResolvable, - ModuleMatch.Stricter => foundResolvable switch + ModuleMatch.Same or ModuleMatch.Looser => foundResolvable, + ModuleMatch.MergeRequired or ModuleMatch.Stricter => foundResolvable switch { ResolvableLocalModule local => new ResolvableLocalModule(Path.GetDirectoryName(local.ModuleSpec.FullPath)!, moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])), _ => new ResolvableRemoteModule(moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])) @@ -129,8 +137,8 @@ public void Resolve() _ => throw new Exception("This should never happen.") }; - // Propogate the new requirement if it was merged. - if (resultingResolvable != foundResolvable) + // Propogate the merge if the match is not the same. + if (resultingResolvable.GetModuleMatchFor(foundResolvable.ModuleSpec) != ModuleMatch.Same) { Logger.Debug($"Propogating merge of {foundResolvable.ModuleSpec} with {moduleToResolve}, resulting in {resultingResolvable.ModuleSpec}."); @@ -141,6 +149,7 @@ public void Resolve() inEdges.ToList().ForEach(edge => Graph.AddVerticesAndEdge(new Edge(edge.Source, resultingResolvable))); outEdges.ToList().ForEach(edge => Graph.AddVerticesAndEdge(new Edge(resultingResolvable, edge.Target))); } + else { resultingResolvable = foundResolvable; } } else { diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index ef57b65d..53005128 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -1,26 +1,15 @@ using System.Management.Automation.Language; -using System.Text.RegularExpressions; using Compiler.Requirements; namespace Compiler.Module.Resolvable; public partial class ResolvableScript : ResolvableLocalModule { - private static readonly string InvokeRunMain = "(New-Module -ScriptBlock ([ScriptBlock]::Create($Global:EmbeddedModules['{0}'].Content)) -AsCustomObject -ArgumentList {1}.BoundParameters).'Invoke-RunMain'({1}, ({2}));"; - private readonly ResolvableParent ResolvableParent; public ResolvableScript(PathedModuleSpec moduleSpec) : base(moduleSpec) { ResolvableParent = new ResolvableParent(this); - - // Editor.AddRegexEdit(RunMainRegex(), Text.UpdateOptions.MatchEntireDocument, static match => - // { - // var block = match.Groups["Block"].Value; - // var invocation = match.Groups.ContainsKey("Invocation") ? match.Groups["Invocation"].Value : "$MyInvocation"; - // return string.Format(InvokeRunMain, "00-Environment", invocation, block); - // }); - ResolvableParent.Resolve(); #region Requirement Compatability checking @@ -49,11 +38,9 @@ public ResolvableScript(PathedModuleSpec moduleSpec) : base(moduleSpec) ModuleSpec, Editor, ResolvableParent, - ExtractParameterBlock() - ) - { - Requirements = ResolveRequirements() - }; + ExtractParameterBlock(), + ResolveRequirements() + ); /// /// Looks for the parameter block of the script, @@ -91,7 +78,4 @@ public ResolvableScript(PathedModuleSpec moduleSpec) : base(moduleSpec) return scriptParamBlockAst; } - - [GeneratedRegex(@"^Invoke-RunMain\s+(?:\$MyInvocation)?\s+(?{.+})")] - private static partial Regex RunMainRegex(); } diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index 320251a9..f5fc8707 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -2,20 +2,28 @@ using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography; using System.Text; +using System.Text.Json; using Compiler.Module; using NLog; namespace Compiler.Requirements; -public record PathedModuleSpec( - string FullPath, - Guid? Guid = null, - Version? MinimumVersion = null, - Version? MaximumVersion = null, - Version? RequiredVersion = null -) : ModuleSpec(Path.GetFileNameWithoutExtension(FullPath), Guid, MinimumVersion, MaximumVersion, RequiredVersion) +public sealed class PathedModuleSpec : ModuleSpec { - public override byte[] Hash => SHA1.HashData(File.ReadAllBytes(FullPath)); + public readonly string FullPath; + + public PathedModuleSpec( + string fullPath, + Guid? guid = null, + Version? minimumVersion = null, + Version? maximumVersion = null, + Version? requiredVersion = null + ) : base(Path.GetFileNameWithoutExtension(fullPath), guid, minimumVersion, maximumVersion, requiredVersion) + { + FullPath = fullPath; + Weight = 73; + Hash = SHA1.HashData(File.ReadAllBytes(fullPath)); + } // TODO - this may not be the best way to do this. public override ModuleMatch CompareTo(ModuleSpec other) @@ -30,19 +38,34 @@ public override ModuleMatch CompareTo(ModuleSpec other) } } -public record ModuleSpec( - string Name, - Guid? Guid = null, - Version? MinimumVersion = null, - Version? MaximumVersion = null, - Version? RequiredVersion = null -) : Requirement(true), IEquatable +public class ModuleSpec : Requirement { private readonly static Logger Logger = LogManager.GetCurrentClassLogger(); + public string Name { get; } + public Guid? Guid { get; } + public Version? MinimumVersion { get; } + public Version? MaximumVersion { get; } + public Version? RequiredVersion { get; } + + public ModuleSpec( + string name, + Guid? guid = null, + Version? minimumVersion = null, + Version? maximumVersion = null, + Version? requiredVersion = null + ) : base() + { + SupportsMultiple = true; + Weight = 70; - public override uint Weight => 70; + Name = name; + Guid = guid; + MinimumVersion = minimumVersion; + MaximumVersion = maximumVersion; + RequiredVersion = requiredVersion; - public override byte[] Hash => SHA1.HashData(Encoding.UTF8.GetBytes(string.Concat(Name, Guid, MinimumVersion, MaximumVersion, RequiredVersion))); + Hash = SHA1.HashData(Encoding.UTF8.GetBytes(string.Concat(Name, Guid, MinimumVersion, MaximumVersion, RequiredVersion))); + } // TODO - Maybe use IsCompatibleWith to do some other check stuff public ModuleSpec MergeSpecs(ModuleSpec[] merge) @@ -56,25 +79,25 @@ public ModuleSpec MergeSpecs(ModuleSpec[] merge) { if (match.Guid != null && guid == null) { - Logger.Debug($"Merging {Name} with {match.Name} - {Guid} -> {match.Guid}"); + Logger.Debug($"Merging {Name} with {match.Name} - {guid?.ToString() ?? "null"} -> {match.Guid}"); guid = match.Guid; } if (match.MinimumVersion != null && (minVersion == null || match.MinimumVersion > minVersion)) { - Logger.Debug($"Merging {Name} with {match.Name} - {minVersion} -> {match.MinimumVersion}"); + Logger.Debug($"Merging {Name} with {match.Name} - {minVersion?.ToString() ?? "null"} -> {match.MinimumVersion}"); minVersion = match.MinimumVersion; } if (match.MaximumVersion != null && (maxVersion == null || match.MaximumVersion < maxVersion)) { - Logger.Debug($"Merging {Name} with {match.Name} - {maxVersion} -> {match.MaximumVersion}"); + Logger.Debug($"Merging {Name} with {match.Name} - {maxVersion?.ToString() ?? "null"} -> {match.MaximumVersion}"); maxVersion = match.MaximumVersion; } if (match.RequiredVersion != null && reqVersion == null) { - Logger.Debug($"Merging {Name} with {match.Name} - {RequiredVersion} -> {match.RequiredVersion}"); + Logger.Debug($"Merging {Name} with {match.Name} - {RequiredVersion?.ToString() ?? "null"} -> {match.RequiredVersion}"); reqVersion = match.RequiredVersion; } } @@ -111,6 +134,7 @@ public override string GetInsertableLine(Hashtable data) public virtual ModuleMatch CompareTo(ModuleSpec other) { + if (ReferenceEquals(this, other)) return ModuleMatch.Same; if (Name != other.Name) return ModuleMatch.None; if (Guid != null && other.Guid != null && Guid != other.Guid) return ModuleMatch.None; @@ -187,5 +211,21 @@ public virtual ModuleMatch CompareTo(ModuleSpec other) public override bool IsCompatibleWith(Requirement other) => true; public override int GetHashCode() => HashCode.Combine(Name, Guid, MinimumVersion, MaximumVersion, RequiredVersion); + + public override int CompareTo(Requirement? other) + { + if (other is not ModuleSpec) return 0; + return CompareTo((ModuleSpec)other).CompareTo(ModuleMatch.Same); + } + + public override bool Equals(object? obj) + { + if (obj is null) return false; + if (obj is not ModuleSpec other) return false; + if (ReferenceEquals(this, other)) return true; + return Name == other.Name && Guid == other.Guid && MinimumVersion == other.MinimumVersion && MaximumVersion == other.MaximumVersion && RequiredVersion == other.RequiredVersion; + } + + public override string ToString() => JsonSerializer.Serialize(this, SerializerOptions); } diff --git a/src/Compiler/Requirements/PSEdition.cs b/src/Compiler/Requirements/PSEdition.cs index 41e7a370..ecabcd40 100644 --- a/src/Compiler/Requirements/PSEdition.cs +++ b/src/Compiler/Requirements/PSEdition.cs @@ -9,12 +9,18 @@ public enum PSEdition { Desktop, Core } /// /// Represents a PowerShell edition requirement. /// -public record PSEditionRequirement(PSEdition Edition) : Requirement(false) +public sealed class PSEditionRequirement : Requirement { - public override byte[] Hash => SHA1.HashData(Encoding.UTF8.GetBytes(Edition.ToString())); + public PSEdition Edition { get; } + + public PSEditionRequirement(PSEdition edition) : base() + { + Edition = edition; + Hash = SHA1.HashData(Encoding.UTF8.GetBytes(Edition.ToString())); + } - /// /// Gets the insertable line for the requirement. + /// /// /// The insertable line for the requirement. public override string GetInsertableLine(Hashtable _) => $"#Requires -PSEdition {Edition}"; diff --git a/src/Compiler/Requirements/PSVersion.cs b/src/Compiler/Requirements/PSVersion.cs index e92cf501..0bff2c24 100644 --- a/src/Compiler/Requirements/PSVersion.cs +++ b/src/Compiler/Requirements/PSVersion.cs @@ -5,9 +5,17 @@ namespace Compiler.Requirements; -public record PSVersionRequirement(Version Version) : Requirement(false) +public sealed class PSVersionRequirement : Requirement { - public override byte[] Hash => SHA1.HashData(Encoding.UTF8.GetBytes(Version.ToString())); + public Version Version { get; } + + public PSVersionRequirement(Version version) : base() + { + SupportsMultiple = false; + + Version = version; + Hash = SHA1.HashData(Encoding.UTF8.GetBytes(Version.ToString())); + } public override string GetInsertableLine(Hashtable _) { diff --git a/src/Compiler/Requirements/Requirements.cs b/src/Compiler/Requirements/Requirements.cs index 075a957e..a2bdc494 100644 --- a/src/Compiler/Requirements/Requirements.cs +++ b/src/Compiler/Requirements/Requirements.cs @@ -1,39 +1,39 @@ using System.Collections; using System.Collections.Immutable; -using System.Configuration; -using NLog; +using System.Text.Json; +using System.Text.Json.Serialization; namespace Compiler.Requirements; -public class RequirementGroup +public sealed class RequirementGroup { - private readonly static Logger Logger = LogManager.GetCurrentClassLogger(); - public Dictionary> StoredRequirements { get; } + public Dictionary> StoredRequirements { get; init; } public RequirementGroup() { - StoredRequirements = []; + StoredRequirements ??= []; } - public void AddRequirement(T value) where T : Requirement + public bool AddRequirement(T value) where T : Requirement { var typeName = typeof(T); - if (!StoredRequirements.TryGetValue(typeName, out List? requirementList)) + if (!StoredRequirements.TryGetValue(typeName, out HashSet? requirementList)) { StoredRequirements.Add(typeName, [value]); + return true; } else { - requirementList.Add(value); + return requirementList.Add(value); } } - public ImmutableHashSet GetRequirements() where T : Requirement + public ImmutableList GetRequirements() where T : Requirement { var typeName = typeof(T); - if (StoredRequirements.TryGetValue(typeName, out List? value)) + if (StoredRequirements.TryGetValue(typeName, out HashSet? value)) { - return value.Cast().ToImmutableHashSet(); + return value.Cast().ToImmutableList(); } return []; @@ -42,7 +42,7 @@ public ImmutableHashSet GetRequirements() where T : Requirement public bool RemoveRequirement(T value) where T : Requirement { var typeName = typeof(T); - if (StoredRequirements.TryGetValue(typeName, out List? collection)) + if (StoredRequirements.TryGetValue(typeName, out HashSet? collection)) { return collection.Remove(value); } @@ -50,45 +50,14 @@ public bool RemoveRequirement(T value) where T : Requirement return false; } - public bool ReplaceRequirement(T oldValue, T newValue) where T : Requirement - { - var typeName = typeof(T); - if (StoredRequirements.TryGetValue(typeName, out List? value)) - { - var index = value.ToList().IndexOf(oldValue); - if (index != -1) - { - value[index] = newValue; - return true; - } - } - - return false; - } - - public ImmutableHashSet GetRequirements() + public ImmutableList GetRequirements() { var rawRequirements = StoredRequirements.Values; if (rawRequirements.Count == 0) return []; - var flattenedList = StoredRequirements.Values.ToList().SelectMany(x => x).ToList(); - flattenedList.Sort(new RequirementWeightSorter()); - flattenedList.Sort((x, y) => x.GetType().Name.CompareTo(y.GetType().Name)); - return [.. flattenedList]; - } - - // FIXME - Not very efficient - public bool VerifyRequirements() - { - var hadError = false; - var requirements = GetRequirements(); - requirements.SelectMany(x => requirements.Where(y => !x.IsCompatibleWith(y))).ToList().ForEach(x => - { - Logger.Error($"Requirement {x} is incompatible with another requirement"); - hadError = true; - }); - - return !hadError; + var flattenedList = rawRequirements.ToList().SelectMany(x => x); + // bubble sort the requirements by their weight + return [.. flattenedList.OrderBy(x => x, new RequirementWeightSorter())]; } } @@ -98,20 +67,34 @@ public bool VerifyRequirements() /// /// True if the requirement supports multiple instances, false otherwise. /// -public abstract record Requirement(bool SupportsMultiple) +public abstract class Requirement : IComparable { + protected static readonly JsonSerializerOptions SerializerOptions = new() + { + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } + }; + + /// + /// Indicates if the requirement supports multiple instances. + /// + [JsonIgnore] + public bool SupportsMultiple { get; protected set; } + /// /// Gets the weight of the requirement. /// This weight is used for the order when inserting the requirements. /// - public virtual uint Weight => 50; + [JsonIgnore] + public uint Weight { get; protected set; } = 50; /// /// Gets the hash of the requirement. /// /// This is implemented by the derived class. /// - public abstract byte[] Hash { get; } + public byte[] Hash { get; protected set; } = []; /// /// Checks if the requirement is compatible with another requirement. @@ -124,26 +107,24 @@ public abstract record Requirement(bool SupportsMultiple) /// public abstract string GetInsertableLine(Hashtable data); - bool IEquatable.Equals(Requirement? obj) - { - if (obj == null) return false; - return obj.Hash.SequenceEqual(Hash); + public virtual int CompareTo(Requirement? other) => 0; - } + public override string ToString() => JsonSerializer.Serialize(this, SerializerOptions); } /// /// Sorts requirements by their weight. /// -public class RequirementWeightSorter : IComparer +public sealed class RequirementWeightSorter : IComparer { public int Compare(Requirement? x, Requirement? y) { - if (x == null) - { - return y == null ? 0 : -1; - } + if (ReferenceEquals(x, y)) return 0; + if (x == null) return y == null ? 0 : -1; + if (y == null) return x == null ? 0 : 1; - return x.Weight.CompareTo(y?.Weight); + var weight = x.Weight.CompareTo(y?.Weight); + if (weight != 0) return weight; + return x.CompareTo(y); } } diff --git a/src/Compiler/Requirements/RunAsAdmin.cs b/src/Compiler/Requirements/RunAsAdmin.cs index 38c4ac9e..5c2c9d55 100644 --- a/src/Compiler/Requirements/RunAsAdmin.cs +++ b/src/Compiler/Requirements/RunAsAdmin.cs @@ -5,11 +5,15 @@ namespace Compiler.Requirements; -public record RunAsAdminRequirement() : Requirement(false) +public sealed class RunAsAdminRequirement : Requirement { const string STRING = "#Requires -RunAsAdministrator"; - public override byte[] Hash => SHA1.HashData(Encoding.UTF8.GetBytes(STRING)); + public RunAsAdminRequirement() : base() + { + SupportsMultiple = false; + Hash = SHA1.HashData(Encoding.UTF8.GetBytes(STRING)); + } [ExcludeFromCodeCoverage(Justification = "It's just a string.")] public override string GetInsertableLine(Hashtable _) => STRING; diff --git a/src/Compiler/Requirements/UsingNamespace.cs b/src/Compiler/Requirements/UsingNamespace.cs index a2407142..72741cc6 100644 --- a/src/Compiler/Requirements/UsingNamespace.cs +++ b/src/Compiler/Requirements/UsingNamespace.cs @@ -7,16 +7,18 @@ namespace Compiler.Requirements; /// /// Represents a requirement to include a using namespace statement in the code. /// -public record UsingNamespace( - string Namespace -) : Requirement(true) +public sealed class UsingNamespace : Requirement { - public override uint Weight => 75; + public string Namespace { get; } - /// - /// Gets the hash of the requirement. - /// - public override byte[] Hash => SHA1.HashData(Encoding.UTF8.GetBytes(Namespace)); + public UsingNamespace(string @namespace) : base() + { + SupportsMultiple = true; + Weight = 75; + + Namespace = @namespace; + Hash = SHA1.HashData(Encoding.UTF8.GetBytes(Namespace)); + } /// /// Gets the insertable line for the requirement. From a99b4b6320bfd7cb8f697c59f14ca6031028cd85 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 30 Jul 2024 13:01:44 +1000 Subject: [PATCH 093/341] chore: vscode stuff --- .vscode/launch.json | 9 ++++++++- .vscode/settings.json | 3 ++- .vscode/tasks.json | 20 ++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 474df961..a4270ec4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -36,7 +36,14 @@ "request": "launch", "preLaunchTask": "build", "program": "${workspaceFolder}/Output/Debug/Compiler.dll", - "args": ["-i", ".\\utils\\test.ps1", "-v", "-o", "test.ps1", "-f"], + "args": [ + "-i", + ".\\resources\\test.ps1", + "-v", + "-o", + "test.ps1", + "-f" + ], "cwd": "${workspaceFolder}", "console": "internalConsole", "stopAtEntry": false, diff --git a/.vscode/settings.json b/.vscode/settings.json index 5b902a93..cac69abc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,5 +16,6 @@ "powershell.scriptAnalysis.settingsPath": "PSScriptAnalyzerSettings.psd1", "poshProTools.ignoredPaths": "compiled", "pester.testFilePath": ["tests/*.[tT]ests.[pP][sS]1"], - "markiscodecoverage.searchCriteria": "tests\\Compiler\\Coverage/coverage.info" + "markiscodecoverage.searchCriteria": "tests\\Compiler\\Coverage/coverage.info", + "markiscodecoverage.enableDecorations": true } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index e0101944..eb88837f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -48,6 +48,26 @@ "/p:CoverletOutputFormat=lcov" ], "problemMatcher": [] + }, + { + "label": "Generate coverage report", + "command": "reportgenerator", + "type": "shell", + "args": [ + "-reports:./**/coverage.cobertura.xml", + "-targetdir:coverage_report", + "-assemblyfilters:'+Compiler;-Compiler.Test'", + "-classfilters:'-System.Text.RegularExpressions.Generated*'" + ], + "dependsOn": ["Generate coverage stats"], + "problemMatcher": [] + }, + { + "label": "Open Coverage Report", + "dependsOn": ["Generate coverage report"], + "type": "shell", + "command": ".\\coverage_report\\index.html", + "problemMatcher": [] } ] } From 16c454bc2e937cac32c9ac86396eef44bc84e338 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 30 Jul 2024 13:01:52 +1000 Subject: [PATCH 094/341] fix(Compiler): Script Template --- src/Compiler/Resources/ScriptTemplate.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index 51178dad..6aca7d9e 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -29,7 +29,8 @@ begin { switch ($_.Type) { 'UTF8String' { - $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:NameHash.psm1"; + $Local:FileSuffix = if ($null -eq $Script:ScriptPath) { 'ps1' } else { 'psm1' }; + $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:NameHash.$Local:FileSuffix"; if (-not (Test-Path -Path $Local:InnerModulePath)) { Write-Verbose "Writing content to module file: $Local:InnerModulePath" Set-Content -Path $Local:InnerModulePath -Value $Content; From 11abaa114f6a5de3115bbcd3bed435c8c21ba14c Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 30 Jul 2024 17:53:18 +1000 Subject: [PATCH 095/341] fix(Compiler): Fix import names and add background resolving. - Resolve in the background once resolvables are created to speed up compilation. - Use a lock for accessing requirements & graph. - Fix the GetInsertableLine method in the ModuleSpec, was removing extensions that were never there to start with and breaking module names. - Add a Parents list to the Compiled class to store the parent modules. - Implement the GetRootParent method in the Compiled class to find the root parent module. - Implement the GetSiblings method in the Compiled class to get all sibling modules. - Implement the FindSibling method in the Compiled class to find a sibling module with a specific ModuleSpec. --- src/Compiler/Module/Compiled/Compiled.cs | 34 ++++++++ src/Compiler/Module/Compiled/Local.cs | 9 +- src/Compiler/Module/Compiled/Script.cs | 8 +- src/Compiler/Module/Module.cs | 16 +++- src/Compiler/Module/Resolvable/Local.cs | 89 ++++++++++---------- src/Compiler/Module/Resolvable/Remote.cs | 71 ++++++++-------- src/Compiler/Module/Resolvable/Resolvable.cs | 75 ++++++++++------- src/Compiler/Module/Resolvable/Script.cs | 20 +++-- src/Compiler/Requirements/ModuleSpec.cs | 4 +- src/Compiler/Requirements/Requirements.cs | 7 ++ 10 files changed, 208 insertions(+), 125 deletions(-) diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index e03a3383..daa2ce23 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -6,6 +6,8 @@ namespace Compiler.Module.Compiled; public abstract class Compiled { + internal List Parents = []; + public readonly ModuleSpec ModuleSpec; public RequirementGroup Requirements; @@ -67,6 +69,38 @@ public static void AddRequirementHashBytes(List hashableBytes, Requirement }); } } + + protected Compiled GetRootParent() + { + if (Parents.Count == 0) return this; + + // All parents should point to the same root parent eventually. + var parent = Parents[0]; + while (parent.Parents.Count > 0) + { + parent = parent.Parents[0]; + } + + return parent; + } + + protected Compiled[] GetSiblings() + { + var rootParent = GetRootParent(); + if (rootParent is not CompiledScript script) return []; + + return script.Graph.Vertices.Where(compiled => compiled != this).ToArray(); + } + + protected Compiled? FindSibling(ModuleSpec moduleSpec) + { + if (ReferenceEquals(moduleSpec, ModuleSpec)) return this; + + var siblings = GetSiblings(); + if (siblings.Length == 0) return null; + + return siblings.FirstOrDefault(compiled => compiled.ModuleSpec == moduleSpec); + } } public enum ContentType diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index 393a720e..3d16814e 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -1,6 +1,5 @@ using System.Collections; using System.Management.Automation.Language; -using System.Security.Cryptography; using System.Text; using Compiler.Requirements; using Compiler.Text; @@ -33,7 +32,13 @@ RequirementGroup requirements .AppendLine("<#ps1#> @'") .AppendJoin('\n', Requirements.GetRequirements().Select(requirement => { - var data = new Hashtable() { { "NameSuffix", Convert.ToHexString(requirement.Hash) } }; + var hash = requirement switch + { + ModuleSpec req => FindSibling(req)!.ComputedHash, + _ => requirement.HashString + }; + + var data = new Hashtable() { { "NameSuffix", hash } }; return requirement.GetInsertableLine(data); })) .AppendLine() diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 3f841729..cce5d05d 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -78,11 +78,17 @@ RequirementGroup requirements else { Graph.AddVertex(compiledModule); } }); + // Iterate over the graph and add the parent-child relationships. + Graph.Edges.ToList().ForEach(edge => + { + edge.Target.Parents.Add(edge.Source); + }); + graphviz = Graph.ToGraphviz(alg => { alg.FormatVertex += (sender, args) => { - args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; + args.VertexFormat.Label = args.Vertex.ModuleSpec.Name + '-' + args.Vertex.ComputedHash; }; }); Logger.Debug("Compiled graphviz:"); diff --git a/src/Compiler/Module/Module.cs b/src/Compiler/Module/Module.cs index 2ad323c2..07a1481e 100644 --- a/src/Compiler/Module/Module.cs +++ b/src/Compiler/Module/Module.cs @@ -30,18 +30,28 @@ public enum ModuleMatch : short /// Same = 0, + /// + /// This module matches the requirements, but our module should be used instead. + /// + PreferOurs = 1, + + /// + /// This module fulfills the requirements, but the other module should be used instead. + /// + PreferTheirs = 2, + /// /// This module fulfills the requirements, but has a looser scope. /// - Looser = 1, + Looser = 3, /// /// This module is both stricter and looser than the requirements, and can be merged. /// - MergeRequired = 2, + MergeRequired = 4, /// /// This module fulfills the requirements, but has a stricter scope. /// - Stricter = 3, + Stricter = 5, } diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 21c6824e..d31ee067 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -9,7 +9,6 @@ namespace Compiler.Module.Resolvable; public partial class ResolvableLocalModule : Resolvable { - private RequirementGroup? _requirements; internal readonly ScriptBlockAst _ast; public readonly TextEditor Editor; @@ -60,6 +59,8 @@ public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) Editor.AddRegexEdit(20, RequiresStatementRegex(), _ => { return null; }); Editor.AddEdit(static () => new HereStringUpdater()); + + ThreadPool.QueueUserWorkItem(_ => ResolveRequirements()); } /// @@ -84,60 +85,58 @@ public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) return ModuleMatch.None; } - public override RequirementGroup ResolveRequirements() + public override void ResolveRequirements() { - if (_requirements != null) return _requirements; - var requirementGroup = new RequirementGroup(); - - AstHelper.FindDeclaredModules(_ast).ToList().ForEach(module => + lock (Requirements) { - if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) + AstHelper.FindDeclaredModules(_ast).ToList().ForEach(module => + { + if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) + { + Editor.AddExactEdit( + ast.Extent.StartLineNumber - 1, + ast.Extent.StartColumnNumber - 1, + ast.Extent.EndLineNumber - 1, + ast.Extent.EndColumnNumber - 1, + _ => [] + ); + } + + module.Value.TryGetValue("Guid", out var guid); + module.Value.TryGetValue("MinimumVersion", out var minimumVersion); + module.Value.TryGetValue("MaximumVersion", out var maximumVersion); + module.Value.TryGetValue("RequiredVersion", out var requiredVersion); + var spec = new ModuleSpec( + module.Key, + (Guid?)guid, + (Version?)minimumVersion, + (Version?)maximumVersion, + (Version?)requiredVersion + ); + + Requirements.AddRequirement(spec); + }); + + AstHelper.FindDeclaredNamespaces(_ast).ToList().ForEach(statement => { Editor.AddExactEdit( - ast.Extent.StartLineNumber - 1, - ast.Extent.StartColumnNumber - 1, - ast.Extent.EndLineNumber - 1, - ast.Extent.EndColumnNumber - 1, - _ => [] + statement.Item2.Extent.StartLineNumber - 1, + statement.Item2.Extent.StartColumnNumber - 1, + statement.Item2.Extent.EndLineNumber - 1, + statement.Item2.Extent.EndColumnNumber - 1, + _ => [] ); - } - - module.Value.TryGetValue("Guid", out var guid); - module.Value.TryGetValue("MinimumVersion", out var minimumVersion); - module.Value.TryGetValue("MaximumVersion", out var maximumVersion); - module.Value.TryGetValue("RequiredVersion", out var requiredVersion); - var spec = new ModuleSpec( - module.Key, - (Guid?)guid, - (Version?)minimumVersion, - (Version?)maximumVersion, - (Version?)requiredVersion - ); - - requirementGroup.AddRequirement(spec); - }); - - AstHelper.FindDeclaredNamespaces(_ast).ToList().ForEach(statement => - { - Editor.AddExactEdit( - statement.Item2.Extent.StartLineNumber - 1, - statement.Item2.Extent.StartColumnNumber - 1, - statement.Item2.Extent.EndLineNumber - 1, - statement.Item2.Extent.EndColumnNumber - 1, - _ => [] - ); - - var ns = new UsingNamespace(statement.Item1); - requirementGroup.AddRequirement(ns); - }); - - return _requirements = requirementGroup; + + var ns = new UsingNamespace(statement.Item1); + Requirements.AddRequirement(ns); + }); + } } public override Compiled.Compiled IntoCompiled() => new CompiledLocalModule( ModuleSpec, CompiledDocument.FromBuilder(Editor, 0), - ResolveRequirements() + Requirements ); public override bool Equals(object? obj) diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 08431a0e..1939bec0 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -7,13 +7,18 @@ namespace Compiler.Module.Resolvable; -public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSpec) +public class ResolvableRemoteModule : Resolvable { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private MemoryStream? _memoryStream; private string? _cachedFile; + public ResolvableRemoteModule(ModuleSpec moduleSpec) : base(moduleSpec) + { + ThreadPool.QueueUserWorkItem(_ => ResolveRequirements()); + } + private string CachePath => Path.Join( Path.GetTempPath(), "PowerShellGet", @@ -22,50 +27,48 @@ public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSp public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) => ModuleSpec.CompareTo(requirement); - public override RequirementGroup ResolveRequirements() + public override void ResolveRequirements() { - var requirementGroup = new RequirementGroup(); - - var memoryStream = _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false); - using var archive = new ZipArchive(memoryStream, ZipArchiveMode.Read, true); - var psd1Entry = archive.GetEntry($"{ModuleSpec.Name}.psd1"); - if (psd1Entry == null) + lock (Requirements) { - Logger.Debug($"Failed to find the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); - return requirementGroup; - } + var memoryStream = _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false); + using var archive = new ZipArchive(memoryStream, ZipArchiveMode.Read, true); + var psd1Entry = archive.GetEntry($"{ModuleSpec.Name}.psd1"); + if (psd1Entry == null) + { + Logger.Debug($"Failed to find the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); + return; + } - // Read the PSD1 file and parse it as a hashtable. - using var psd1Stream = psd1Entry.Open(); - if (PowerShell.Create().AddScript(new StreamReader(psd1Stream).ReadToEnd()).Invoke()[0].BaseObject is not Hashtable psd1) - { - Logger.Debug($"Failed to parse the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); - return requirementGroup; - } + // Read the PSD1 file and parse it as a hashtable. + using var psd1Stream = psd1Entry.Open(); + if (PowerShell.Create().AddScript(new StreamReader(psd1Stream).ReadToEnd()).Invoke()[0].BaseObject is not Hashtable psd1) + { + Logger.Debug($"Failed to parse the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); + return; + } - if (psd1["PowerShellVersion"] is string psVersion) requirementGroup.AddRequirement(new PSVersionRequirement(Version.Parse(psVersion))); - if (psd1["RequiredModules"] is object[] requiredModules) - { - foreach (var requiredModule in requiredModules.Cast()) + if (psd1["PowerShellVersion"] is string psVersion) Requirements.AddRequirement(new PSVersionRequirement(Version.Parse(psVersion))); + if (psd1["RequiredModules"] is object[] requiredModules) { - var moduleName = requiredModule["ModuleName"]!.ToString(); - _ = Version.TryParse((string?)requiredModule["ModuleVersion"], out var minimumVersion); - _ = Version.TryParse((string?)requiredModule["MaximumVersion"], out var maximumVersion); - _ = Version.TryParse((string?)requiredModule["RequiredVersion"], out var requiredVersion); - _ = Guid.TryParse((string?)requiredModule["Guid"], out var guid); - - var requiredModuleSpec = new ModuleSpec(moduleName!, guid, minimumVersion, maximumVersion, requiredVersion); - requirementGroup.AddRequirement(requiredModuleSpec); + foreach (var requiredModule in requiredModules.Cast()) + { + var moduleName = requiredModule["ModuleName"]!.ToString(); + _ = Version.TryParse((string?)requiredModule["ModuleVersion"], out var minimumVersion); + _ = Version.TryParse((string?)requiredModule["MaximumVersion"], out var maximumVersion); + _ = Version.TryParse((string?)requiredModule["RequiredVersion"], out var requiredVersion); + _ = Guid.TryParse((string?)requiredModule["Guid"], out var guid); + + var requiredModuleSpec = new ModuleSpec(moduleName!, guid, minimumVersion, maximumVersion, requiredVersion); + Requirements.AddRequirement(requiredModuleSpec); + } } } - - - return requirementGroup; } public override Compiled.Compiled IntoCompiled() => new CompiledRemoteModule( ModuleSpec, - ResolveRequirements(), + Requirements, _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false) ); diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index a456f80c..02883e92 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -1,4 +1,3 @@ -using System.Diagnostics; using Compiler.Requirements; using NLog; using QuikGraph; @@ -10,8 +9,7 @@ public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleS /// /// Resolves the requirements of the module. /// - /// - public abstract RequirementGroup ResolveRequirements(); + public abstract void ResolveRequirements(); public abstract Compiled.Compiled IntoCompiled(); } @@ -40,14 +38,20 @@ public ResolvableParent(Resolvable rootModule) Graph.EdgeRemoved += edge => { Logger.Debug($"Edge removed: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); - var didRemove = edge.Source.Requirements.RemoveRequirement(edge.Target.ModuleSpec); - if (!didRemove) Logger.Warn($"Failed to remove requirement {edge.Target.ModuleSpec} from {edge.Source.ModuleSpec}."); + lock (edge.Source.Requirements) + { + var didRemove = edge.Source.Requirements.RemoveRequirement(edge.Target.ModuleSpec); + if (!didRemove) Logger.Warn($"Failed to remove requirement {edge.Target.ModuleSpec} from {edge.Source.ModuleSpec}."); + } }; Graph.EdgeAdded += edge => { Logger.Debug($"Edge added: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); - var didAdd = edge.Source.Requirements.AddRequirement(edge.Target.ModuleSpec); - if (!didAdd) Logger.Warn($"Failed to add requirement {edge.Target.ModuleSpec} to {edge.Source.ModuleSpec}."); + lock (edge.Source.Requirements) + { + var didAdd = edge.Source.Requirements.AddRequirement(edge.Target.ModuleSpec); + if (!didAdd) Logger.Warn($"Failed to add requirement {edge.Target.ModuleSpec} to {edge.Source.ModuleSpec}."); + } }; #endregion } @@ -67,30 +71,36 @@ public ResolvableParent(Resolvable rootModule) public void Resolve() { - var iterating = new Queue<(Resolvable?, ModuleSpec)>(Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); - do + lock (Graph) { - var (parentResolvable, workingModuleSpec) = iterating.Dequeue(); - Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); - - // If the parent module has already been resolved this will be an orphan. - if (parentResolvable != null && !Graph.ContainsVertex(parentResolvable)) + var iterating = new Queue<(Resolvable?, ModuleSpec)>(Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); + do { - Logger.Debug("Parent module had already been resolved, skipping orphan."); - continue; - } + var (parentResolvable, workingModuleSpec) = iterating.Dequeue(); + Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); + + // If the parent module has already been resolved this will be an orphan. + if (parentResolvable != null && !Graph.ContainsVertex(parentResolvable)) + { + Logger.Debug("Parent module had already been resolved, skipping orphan."); + continue; + } - var workingResolvable = LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); + var workingResolvable = LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); - // If it was null or there are out edges it means this module has already been resolved. - if (workingResolvable == null || Graph.TryGetOutEdges(workingResolvable, out var outEdges) && outEdges.Any()) - { - Logger.Debug("Module has already been resolved, skipping."); - continue; - } + // If it was null or there are out edges it means this module has already been resolved. + if (workingResolvable == null || Graph.TryGetOutEdges(workingResolvable, out var outEdges) && outEdges.Any()) + { + Logger.Debug("Module has already been resolved, skipping."); + continue; + } - workingResolvable.ResolveRequirements().GetRequirements().ToList().ForEach(requirement => iterating.Enqueue((workingResolvable, requirement))); - } while (iterating.Count > 0); + lock (workingResolvable.Requirements) + { + workingResolvable.Requirements.GetRequirements().ToList().ForEach(requirement => iterating.Enqueue((workingResolvable, requirement))); + } + } while (iterating.Count > 0); + } } /// @@ -127,7 +137,7 @@ public void Resolve() // If its an incompatible match we need to throw an error. resultingResolvable = match switch { - ModuleMatch.Same or ModuleMatch.Looser => foundResolvable, + ModuleMatch.PreferOurs or ModuleMatch.Same or ModuleMatch.Looser => foundResolvable, ModuleMatch.MergeRequired or ModuleMatch.Stricter => foundResolvable switch { ResolvableLocalModule local => new ResolvableLocalModule(Path.GetDirectoryName(local.ModuleSpec.FullPath)!, moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])), @@ -137,19 +147,18 @@ public void Resolve() _ => throw new Exception("This should never happen.") }; - // Propogate the merge if the match is not the same. - if (resultingResolvable.GetModuleMatchFor(foundResolvable.ModuleSpec) != ModuleMatch.Same) + // Propogate the merge if the module isn't the same. + if (!ReferenceEquals(foundResolvable, resultingResolvable)) { Logger.Debug($"Propogating merge of {foundResolvable.ModuleSpec} with {moduleToResolve}, resulting in {resultingResolvable.ModuleSpec}."); Graph.TryGetInEdges(foundResolvable, out var inEdges); Graph.TryGetOutEdges(foundResolvable, out var outEdges); - Graph.RemoveVertex(foundResolvable); + if (!Graph.RemoveVertex(foundResolvable)) Logger.Warn($"Failed to remove vertex {foundResolvable.ModuleSpec}."); inEdges.ToList().ForEach(edge => Graph.AddVerticesAndEdge(new Edge(edge.Source, resultingResolvable))); outEdges.ToList().ForEach(edge => Graph.AddVerticesAndEdge(new Edge(resultingResolvable, edge.Target))); } - else { resultingResolvable = foundResolvable; } } else { @@ -169,6 +178,10 @@ public void Resolve() return null; } + lock (parentResolvable.Requirements) + { + if (!parentResolvable.Requirements.RemoveRequirement(moduleToResolve)) Logger.Warn($"Failed to remove requirement {moduleToResolve} from {parentResolvable.ModuleSpec}."); + } Graph.AddVerticesAndEdge(new Edge(parentResolvable, resultingResolvable)); } else { Graph.AddVertex(resultingResolvable); } diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index 53005128..c6bcaab2 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -34,13 +34,19 @@ public ResolvableScript(PathedModuleSpec moduleSpec) : base(moduleSpec) #endregion } - public override Compiled.Compiled IntoCompiled() => new Compiled.CompiledScript( - ModuleSpec, - Editor, - ResolvableParent, - ExtractParameterBlock(), - ResolveRequirements() - ); + public override Compiled.Compiled IntoCompiled() + { + lock (Requirements) + { + return new Compiled.CompiledScript( + ModuleSpec, + Editor, + ResolvableParent, + ExtractParameterBlock(), + Requirements + ); + } + } /// /// Looks for the parameter block of the script, diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index f5fc8707..0952ad41 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -31,7 +31,7 @@ public override ModuleMatch CompareTo(ModuleSpec other) if (other is not PathedModuleSpec && other.Guid == null && other.MinimumVersion == null && other.MaximumVersion == null && other.RequiredVersion == null) { var otherMaybeFileName = Path.GetFileNameWithoutExtension(other.Name); - if (Name == otherMaybeFileName) return ModuleMatch.Same; + if (Name == otherMaybeFileName) return ModuleMatch.PreferOurs; } return base.CompareTo(other); @@ -108,7 +108,7 @@ public ModuleSpec MergeSpecs(ModuleSpec[] merge) public override string GetInsertableLine(Hashtable data) { var nameSuffix = data.ContainsKey("NameSuffix") ? $"-{data["NameSuffix"]}" : string.Empty; - var moduleName = $"{Path.GetFileNameWithoutExtension(Name)}{nameSuffix}"; + var moduleName = $"{Name}{nameSuffix}"; if (Guid == null && RequiredVersion == null && MinimumVersion == null && MaximumVersion == null) { diff --git a/src/Compiler/Requirements/Requirements.cs b/src/Compiler/Requirements/Requirements.cs index a2bdc494..54933b4a 100644 --- a/src/Compiler/Requirements/Requirements.cs +++ b/src/Compiler/Requirements/Requirements.cs @@ -94,8 +94,15 @@ public abstract class Requirement : IComparable /// /// This is implemented by the derived class. /// + [JsonIgnore] public byte[] Hash { get; protected set; } = []; + /// + /// Used only for serialization purposes. + /// + [JsonInclude] + internal string HashString => Convert.ToHexString(Hash); + /// /// Checks if the requirement is compatible with another requirement. /// From d46a370ae5bdcbc21708c4ecb247850a177b4667 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 30 Jul 2024 17:53:40 +1000 Subject: [PATCH 096/341] fix(Compiler): rename psd1 for remote modules so they actually work --- src/Compiler/Resources/ScriptTemplate.ps1 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index 6aca7d9e..73fb6dc1 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -46,8 +46,13 @@ begin { [String]$Local:TempFile = [System.IO.Path]::GetTempFileName(); [Byte[]]$Local:Bytes = [System.Convert]::FromHexString($Content); [System.IO.File]::WriteAllBytes($Local:TempFile, $Local:Bytes); + Write-Verbose "Expanding module file: $Local:TempFile" Expand-Archive -Path $Local:TempFile -DestinationPath $Local:ModuleFolderPath -Force; + + $Local:ManifestPath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:Name.psd1"; + $Local:NewManifestPath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:NameHash.psd1"; + Move-Item -Path $Local:ManifestPath -Destination $Local:NewManifestPath -Force; } Default { Write-Warning "Unknown module type: $($_)"; From f9e11bc674817c3180a64e394e78452037127bec Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 30 Jul 2024 18:17:12 +1000 Subject: [PATCH 097/341] chore: another module --- src/microsoft/windows/AutoSetup.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/microsoft/windows/AutoSetup.ps1 b/src/microsoft/windows/AutoSetup.ps1 index 6db3b963..86917d67 100644 --- a/src/microsoft/windows/AutoSetup.ps1 +++ b/src/microsoft/windows/AutoSetup.ps1 @@ -726,6 +726,7 @@ function Invoke-PhaseCleanup { 'HP Wolf Security - Console' 'HP Wolf Security Application Support for Sure Sense' 'HP Wolf Security Application Support for Windows' + 'HP Wolf Security Application Support for Chrome' ); Invoke-Progress ` From 1e5f8acb792edef2204b8795c88d88d860318053 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 11:58:17 +1000 Subject: [PATCH 098/341] fix(Compiler): hash calculations --- src/Compiler/Module/Compiled/Compiled.cs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index daa2ce23..29969a24 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -61,13 +61,7 @@ public virtual string GetPowerShellObject() => $$""" public static void AddRequirementHashBytes(List hashableBytes, RequirementGroup requirementGroup) { var requirements = requirementGroup.GetRequirements(); - if (requirements.IsEmpty) - { - requirements.ToList().ForEach(requirement => - { - hashableBytes.AddRange(requirement.Hash); - }); - } + requirements.ToList().ForEach(requirement => hashableBytes.AddRange(requirement.Hash)); } protected Compiled GetRootParent() From 7ab8160aad5e9fd6d1e5547f580ac84cc46c129b Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 11:58:34 +1000 Subject: [PATCH 099/341] fix(Compiler): the param block shouldn't be removed anymore --- src/Compiler/Module/Resolvable/Local.cs | 1 + src/Compiler/Module/Resolvable/Script.cs | 32 ++++-------------------- 2 files changed, 6 insertions(+), 27 deletions(-) diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index d31ee067..767b8f35 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -12,6 +12,7 @@ public partial class ResolvableLocalModule : Resolvable internal readonly ScriptBlockAst _ast; public readonly TextEditor Editor; + public override PathedModuleSpec ModuleSpec => (PathedModuleSpec)base.ModuleSpec; /// diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index c6bcaab2..9e7a887e 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.Contracts; using System.Management.Automation.Language; using Compiler.Requirements; @@ -50,37 +51,14 @@ public override Compiled.Compiled IntoCompiled() /// /// Looks for the parameter block of the script, - /// If there is none it returns null and makes no changes. - /// - /// If there is a param block it removes it from the script and returns an Ast representing the param block. /// + /// + /// The parameter block of the script, if it exists. + /// public ParamBlockAst? ExtractParameterBlock() { var scriptParamBlockAst = _ast.ParamBlock; - - if (scriptParamBlockAst == null) - { - return null; - } - - Editor.AddExactEdit( - scriptParamBlockAst.Extent.StartLineNumber - 1, - scriptParamBlockAst.Extent.StartColumnNumber - 1, - scriptParamBlockAst.Extent.EndLineNumber - 1, - scriptParamBlockAst.Extent.EndColumnNumber - 1, - lines => [] - ); - - scriptParamBlockAst.Attributes.ToList().ForEach(attribute => - { - Editor.AddExactEdit( - attribute.Extent.StartLineNumber - 1, - attribute.Extent.StartColumnNumber - 1, - attribute.Extent.EndLineNumber - 1, - attribute.Extent.EndColumnNumber - 1, - lines => [] - ); - }); + if (scriptParamBlockAst == null) return null; return scriptParamBlockAst; } From 23801f5a796a6ea2bce791425318b427ba9414b8 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 11:59:00 +1000 Subject: [PATCH 100/341] fix: environment & logging fixes --- resources/test.ps1 | 11 ++--- resources/test2.ps1 | 6 ++- src/Compiler/Resources/ScriptTemplate.ps1 | 3 +- src/common/00-Environment.psm1 | 56 +++-------------------- src/common/01-Logging.psm1 | 51 ++++++++------------- 5 files changed, 36 insertions(+), 91 deletions(-) diff --git a/resources/test.ps1 b/resources/test.ps1 index 4bdbf681..c772d8e9 100644 --- a/resources/test.ps1 +++ b/resources/test.ps1 @@ -21,19 +21,16 @@ param( Set-StrictMode -Version 3; -Invoke-RunMain $MyInvocation { - Write-Host 'Hello, World!'; - - # Write-Error 'This is an error message!' -Category InvalidOperation; - # Invoke-FailedExit 1050; +Invoke-RunMain $PSCmdlet { + Write-Output 'Hello, World!'; + Invoke-Info 'This is an info message!'; # Random comment $Restart = Get-UserConfirmation 'Restart' 'Do you want to restart the script?'; if ($Restart) { Invoke-Info 'Restarting script...'; Restart-Script; # Comment at the end of a line!! - } - else { + } else { Invoke-Info 'Exiting script...'; }; } diff --git a/resources/test2.ps1 b/resources/test2.ps1 index f6bef7bd..ad4c3415 100644 --- a/resources/test2.ps1 +++ b/resources/test2.ps1 @@ -1,7 +1,11 @@ Using module ../src/common/00-Environment.psm1 Using module ../src/common/01-Logging.psm1 Using module ../src/common/02-Exit.psm1 -Invoke-RunMain $MyInvocation { + +[CmdletBinding()] +param() + +Invoke-RunMain $PSCmdlet { Write-Error 'This is an error message!' -Category InvalidOperation; Invoke-FailedExit 1050; } diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index 73fb6dc1..f0954253 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -1,5 +1,5 @@ begin { - [Boolean]$Global:CompiledScript = $True; + [Boolean]$Script:CompiledScript = $True; #!DEFINE EMBEDDED_MODULES [String]$Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { @@ -65,5 +65,4 @@ process { } end { $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; - Remove-Variable -Scope Global -Name CompiledScript; } diff --git a/src/common/00-Environment.psm1 b/src/common/00-Environment.psm1 index 210eb8d2..b220c20d 100644 --- a/src/common/00-Environment.psm1 +++ b/src/common/00-Environment.psm1 @@ -6,8 +6,8 @@ Using module ./02-Exit.psm1 Using namespace System.Management.Automation.Language; Using namespace System.Collections.Generic -[System.Boolean]$Global:ScriptRestarted = $False; -[System.Boolean]$Global:ScriptRestarting = $False; +[System.Boolean]$Script:ScriptRestarted = $False; +[System.Boolean]$Script:ScriptRestarting = $False; [System.Collections.Generic.List[String]]$Script:ImportedModules = [System.Collections.Generic.List[String]]::new(); #region - Utility Functions @@ -31,34 +31,6 @@ function Get-OrFalse { } } -function Test-OrGetBooleanVariable { - Param( - [Parameter(Mandatory)] - [ValidateNotNull()] - [String]$Name - ) - - process { - if (Test-Path Variable:Global:$Name) { - return Get-Variable -Scope Global -Name $Name -ValueOnly; - } else { - return $false; - } - } -} - -function Test-IsCompiledScript { - Test-OrGetBooleanVariable -Name 'CompiledScript'; -} - -function Test-IsRestartingScript { - Test-OrGetBooleanVariable -Name 'ScriptRestarting'; -} - -function Test-IsRestartedScript { - Test-OrGetBooleanVariable -Name 'ScriptRestarted'; -} - function Test-ExplicitlyCalled { Param( [Parameter(Mandatory)] @@ -199,7 +171,7 @@ function Invoke-RunMain { begin { # If the script is being restarted, we have already done this. - if (-not $Global:ScriptRestarted) { + if (-not $Script:ScriptRestarted) { foreach ($Local:Param in @('Verbose', 'Debug')) { if ($Cmdlet.MyInvocation.BoundParameters.ContainsKey($Local:Param)) { $Logging[$Local:Param] = $Cmdlet.MyInvocation.BoundParameters[$Local:Param]; @@ -247,7 +219,7 @@ function Invoke-RunMain { $Error.RemoveAt(0); } 'RestartScript' { - Set-Variable -Scope Global -Name ScriptRestarting -Value $True; + $Script:ScriptRestarting = $True; } default { Invoke-Error 'Uncaught Exception during script execution'; @@ -255,35 +227,21 @@ function Invoke-RunMain { } } } finally { - [Boolean]$Private:WasCompiled = Test-IsCompiledScript; - [Boolean]$Private:WasRestarted = Test-IsRestartedScript; - [Boolean]$Private:IsRestarting = Test-IsRestartingScript; - if (-not $Local:DontImport) { Invoke-Handlers; Invoke-Teardown; # There is no point in removing the modules if the script is restarting. - if (-not (Test-IsRestartingScript)) { + if (-not $Script:ScriptRestarting) { Invoke-Debug 'Cleaning up' Remove-Modules; - - if ($Private:WasCompiled) { - Remove-Variable -Scope Global -Name CompiledScript, EmbeddedModules; - } - - # Without this explicit check theres a silent error. - # It has no effect but it annoys me. - if ($Private:WasRestarted) { - Remove-Variable -Scope Global -Name ScriptRestarted; - } } } - if ($Private:IsRestarting) { + if ($Script:ScriptRestarting) { Invoke-Verbose -UnicodePrefix '🔄' -Message 'Restarting script.'; Remove-Variable -Scope Global -Name ScriptRestarting; - Set-Variable -Scope Global -Name ScriptRestarted -Value $True; # Bread trail for the script to know it's been restarted. + $Script:ScriptRestarted = $True; # Bread trail for the script to know it's been restarted. Invoke-Inner @PSBoundParameters; } } diff --git a/src/common/01-Logging.psm1 b/src/common/01-Logging.psm1 index d69ca463..9971ff83 100644 --- a/src/common/01-Logging.psm1 +++ b/src/common/01-Logging.psm1 @@ -4,7 +4,7 @@ Using module @{ RequiredVersion = '2.3.5'; } -[HashTable]$Logging = @{ +[HashTable]$Script:Logging = @{ Error = $True; Warning = $True; Information = $True; @@ -71,13 +71,11 @@ function Invoke-Write { [String]$Local:NewLineTab = if ($PSPrefix -and (Test-SupportsUnicode)) { "$(' ' * $($PSPrefix.Length))"; - } - else { ''; } + } else { ''; } [String]$Local:FormattedMessage = if ($PSMessage.Contains("`n")) { $PSMessage -replace "`n", "`n$Local:NewLineTab+ "; - } - else { $PSMessage; } + } else { $PSMessage; } if (Test-SupportsColour) { $Local:FormattedMessage = "$(Get-ConsoleColour $PSColour)$Local:FormattedMessage$($PSStyle.Reset)"; @@ -85,13 +83,11 @@ function Invoke-Write { [String]$Local:FormattedMessage = if ($PSPrefix -and (Test-SupportsUnicode)) { "$PSPrefix $Local:FormattedMessage"; - } - else { $Local:FormattedMessage; } + } else { $Local:FormattedMessage; } if ($PassThru) { return $Local:FormattedMessage; - } - else { + } else { $InformationPreference = 'Continue'; Write-Information $Local:FormattedMessage; } @@ -128,8 +124,7 @@ function Format-Error( if ($Local:StatementIndex -lt 0) { [Int]$Local:StatementIndex = 0; } - } - else { + } else { [Int]$Local:StatementIndex = 0; [String]$Local:Statement = $TrimmedLine; } @@ -139,8 +134,7 @@ function Format-Error( # Position the message to the same indent as the statement. [String]$Local:Message = if ($null -ne $Message) { (' ' * $Local:StatementIndex) + $Message; - } - else { $null }; + } else { $null }; # Fucking PS 5 doesn't allow variable overrides so i have to add the colour to all of them. :<( [HashTable]$Private:BaseArgs = @{ @@ -189,7 +183,7 @@ function Invoke-Verbose { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '🔍' }; PSMessage = $Message; PSColour = 'Yellow'; - ShouldWrite = $Global:Logging.Verbose; + ShouldWrite = $Script:Logging.Verbose; PassThru = $PassThru; }; @@ -226,7 +220,7 @@ function Invoke-Debug { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '🐛' }; PSMessage = $Message; PSColour = 'Magenta'; - ShouldWrite = $Global:Logging.Debug; + ShouldWrite = $Script:Logging.Debug; PassThru = $PassThru; }; @@ -263,7 +257,7 @@ function Invoke-Info { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { 'ℹ️' }; PSMessage = $Message; PSColour = 'Cyan'; - ShouldWrite = $Global:Logging.Information; + ShouldWrite = $Script:Logging.Information; PassThru = $PassThru; }; @@ -297,7 +291,7 @@ function Invoke-Warn { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '⚠️' }; PSMessage = $Message; PSColour = 'Yellow'; - ShouldWrite = $Global:Logging.Warning; + ShouldWrite = $Script:Logging.Warning; }; Invoke-Write @Local:Params; @@ -330,7 +324,7 @@ function Invoke-Error { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '❌' }; PSMessage = $Message; PSColour = 'Red'; - ShouldWrite = $Global:Logging.Error; + ShouldWrite = $Script:Logging.Error; }; Invoke-Write @Local:Params; @@ -394,8 +388,7 @@ function Invoke-Timeout { # Can't use -duration because it isn't available in PS 5.1 Start-Sleep -Milliseconds $Local:IntervalMinusElasped.TotalMilliseconds; - } - else { + } else { $Local:TimeLeft -= $Local:ElaspedTime; } } while ($Local:TimeLeft.TotalMilliseconds -gt 0) @@ -407,8 +400,7 @@ function Invoke-Timeout { if ($TimeoutScript) { & $TimeoutScript; } - } - elseif ($AllowCancel) { + } elseif ($AllowCancel) { Invoke-Verbose -Message 'Timeout cancelled, invoking cancel script if one is present.' -UnicodePrefix $Local:Prefix; if ($CancelScript) { & $CancelScript; @@ -457,8 +449,7 @@ function Invoke-Progress { $Local:FuncName = (Get-PSCallStack)[1].InvocationInfo.MyCommand.Name; $Activity = if (-not $Local:FuncName) { 'Main'; - } - else { $Local:FuncName; } + } else { $Local:FuncName; } } Write-Progress -Id:$Id -Activity:$Activity -CurrentOperation 'Getting items...' -PercentComplete 0; @@ -468,8 +459,7 @@ function Invoke-Progress { if ($null -eq $Local:InputItems -or $Local:InputItems.Count -eq 0) { Write-Progress -Id:$Id -Activity:$Activity -Status 'No items found.' -PercentComplete 100 -Completed; return; - } - else { + } else { Write-Progress -Id:$Id -Activity:$Activity -Status "Processing $($Local:InputItems.Count) items..."; } @@ -515,8 +505,7 @@ function Invoke-Progress { try { $ErrorActionPreference = 'Stop'; $Process.InvokeReturnAsIs($Item); - } - catch { + } catch { Invoke-Warn "Failed to process item [$ItemName]"; Invoke-Debug -Message "Due to reason - $($_.Exception.Message)"; try { @@ -524,10 +513,8 @@ function Invoke-Progress { if ($null -eq $FailedProcessItem) { $Local:FailedItems.Add($Item); - } - else { $FailedProcessItem.InvokeReturnAsIs($Item); } - } - catch { + } else { $FailedProcessItem.InvokeReturnAsIs($Item); } + } catch { Invoke-Warn "Failed to process item [$ItemName] in failed process item block"; } } From 91821e95b781027c43b519fc1d9e1aeb220e48a9 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 12:58:38 +1000 Subject: [PATCH 101/341] fix: script error handling --- resources/test.ps1 | 1 - src/Compiler/Resources/ScriptTemplate.ps1 | 2 ++ src/common/00-Environment.psm1 | 27 +++++++++++++++++------ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/resources/test.ps1 b/resources/test.ps1 index c772d8e9..9d8d1653 100644 --- a/resources/test.ps1 +++ b/resources/test.ps1 @@ -28,7 +28,6 @@ Invoke-RunMain $PSCmdlet { # Random comment $Restart = Get-UserConfirmation 'Restart' 'Do you want to restart the script?'; if ($Restart) { - Invoke-Info 'Restarting script...'; Restart-Script; # Comment at the end of a line!! } else { Invoke-Info 'Exiting script...'; diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index f0954253..a5ddf220 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -65,4 +65,6 @@ process { } end { $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; + # TODO - Remove by reverse order of import + Get-Module | Where-Object { ($_.ModuleBase | Split-Path -Parent) -eq $Local:PrivatePSModulePath } | Remove-Module -Force; } diff --git a/src/common/00-Environment.psm1 b/src/common/00-Environment.psm1 index b220c20d..b004703d 100644 --- a/src/common/00-Environment.psm1 +++ b/src/common/00-Environment.psm1 @@ -39,7 +39,6 @@ function Test-ExplicitlyCalled { ) process { - $Global:Invocation = $Invocation; # $Global:PSCallStack = Get-PSCallStack; # Being ran from terminal @@ -197,16 +196,30 @@ function Invoke-RunMain { if (Test-ExplicitlyCalled -Invocation:$Cmdlet.MyInvocation) { Invoke-Verbose -UnicodePrefix '🚀' -Message 'Running main function.'; - $Local:RunBoundParameters = $Cmdlet.MyInvocation.BoundParameters; - $Cmdlet.InvokeCommand.InvokeScript( + $Result = $Cmdlet.InvokeCommand.InvokeScript( $Cmdlet.SessionState, $Main, [System.Management.Automation.Runspaces.PipelineResultTypes]::All, - $Local:RunBoundParameters + $Cmdlet.MyInvocation.BoundParameters ); + + if ($Cmdlet.InvokeCommand.HasErrors) { + Invoke-Info 'Throwing error from main function.'; + throw $Cmdlet.InvokeCommand.Streams.Error[0]; + } + + if ($Result.Count -gt 0) { + Invoke-Info 'Writing output from main function.'; + $Result | ForEach-Object { Write-Output $_; } + } + + Invoke-Info 'Main function finished successfully.'; } - } catch { - $Local:CatchingError = $_; + } catch [System.Management.Automation.ParseException] { + Invoke-Error 'Unable to execute script due to a parse error.'; + Invoke-FailedExit -ExitCode 9998 -ErrorRecord $_ -DontExit; + } catch [System.Management.Automation.RuntimeException] { + $Local:CatchingError = $_.Exception.ErrorRecord; switch ($Local:CatchingError.FullyQualifiedErrorId) { 'QuickExit' { Invoke-Verbose -UnicodePrefix '✅' -Message 'Main function finished successfully.'; @@ -240,7 +253,7 @@ function Invoke-RunMain { if ($Script:ScriptRestarting) { Invoke-Verbose -UnicodePrefix '🔄' -Message 'Restarting script.'; - Remove-Variable -Scope Global -Name ScriptRestarting; + $Script:ScriptRestarting = $False; $Script:ScriptRestarted = $True; # Bread trail for the script to know it's been restarted. Invoke-Inner @PSBoundParameters; } From e2b6df7d6696b0c8c313909144e2b0e5d6aee0f2 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 15:59:25 +1000 Subject: [PATCH 102/341] fix: get the actual error, no longer need to remove from here --- src/common/00-Environment.psm1 | 39 +++++----------------------------- 1 file changed, 5 insertions(+), 34 deletions(-) diff --git a/src/common/00-Environment.psm1 b/src/common/00-Environment.psm1 index b004703d..ad001293 100644 --- a/src/common/00-Environment.psm1 +++ b/src/common/00-Environment.psm1 @@ -91,29 +91,6 @@ function Invoke-Teardown { $PSDefaultParameterValues.Remove('*:Debug'); } -function Remove-Modules { - # Get the AST of the script and look for all the using module statements. - # Then remove the modules in reverse order. - - # Get the AST of the script. - [String]$Private:CallingScript = (Get-PSCallStack)[-1].Location; - [System.Management.Automation.Language.Ast]$Private:ScriptAst = [Parser]::ParseFile($Private:CallingScript, [ref]$null, [ref]$null); - - # Find all the using module statements. - [List[UsingStatementAst]]$Private:UsingStatements = [List[UsingStatementAst]]::new(); - $Private:ScriptAst.FindAll({ $args[0] -is [UsingStatementAst] -and ($args[0] -as [UsingStatementAst]).UsingStatementKind -eq 'Module' }, $true) | ForEach-Object { - $Private:UsingStatements.Add(([UsingStatementAst]$_).Name); - }; - - Invoke-Verbose -Message "Cleaning up $($Private:UsingStatements.Count) imported modules."; - Invoke-Verbose -Message "Removing modules: `n$(($Private:UsingStatements | Sort-Object -Descending) -join "`n")"; - $Private:UsingStatements | ForEach-Object { - $Private:ModuleName = $_; - Invoke-Debug -Message "Removing module $Private:ModuleName."; - Remove-Module -Name $Private:ModuleName -Force -Verbose:$False -Debug:$False; - }; -} - <# .SYNOPSIS Runs the main function of a script while ensuring that all common modules have been imported. @@ -219,14 +196,14 @@ function Invoke-RunMain { Invoke-Error 'Unable to execute script due to a parse error.'; Invoke-FailedExit -ExitCode 9998 -ErrorRecord $_ -DontExit; } catch [System.Management.Automation.RuntimeException] { - $Local:CatchingError = $_.Exception.ErrorRecord; - switch ($Local:CatchingError.FullyQualifiedErrorId) { + $CatchingError = $_.Exception.ErrorRecord; + switch ($CatchingError.FullyQualifiedErrorId) { 'QuickExit' { Invoke-Verbose -UnicodePrefix '✅' -Message 'Main function finished successfully.'; } # TODO - Remove the error from the record. 'FailedExit' { - [Int]$Local:ExitCode = $Local:CatchingError.TargetObject; + [Int]$Local:ExitCode = $CatchingError.TargetObject; Invoke-Verbose -Message "Script exited with an error code of $Local:ExitCode."; $LASTEXITCODE = $Local:ExitCode; $Error.RemoveAt(0); @@ -236,19 +213,13 @@ function Invoke-RunMain { } default { Invoke-Error 'Uncaught Exception during script execution'; - Invoke-FailedExit -ExitCode 9999 -ErrorRecord $Local:CatchingError -DontExit; + Invoke-FailedExit -ExitCode 9999 -ErrorRecord $CatchingError -DontExit; } } } finally { if (-not $Local:DontImport) { Invoke-Handlers; Invoke-Teardown; - - # There is no point in removing the modules if the script is restarting. - if (-not $Script:ScriptRestarting) { - Invoke-Debug 'Cleaning up' - Remove-Modules; - } } if ($Script:ScriptRestarting) { @@ -273,4 +244,4 @@ function Invoke-RunMain { -Debug:(Get-OrFalse $Cmdlet.MyInvocation.BoundParameters 'Debug'); } -Export-ModuleMember -Function Invoke-RunMain, Remove-CommonModules, Test-IsNableRunner -Variable ScriptRestarted, ScriptRestarting; +Export-ModuleMember -Function Invoke-RunMain, Test-IsNableRunner -Variable ScriptRestarted, ScriptRestarting; From fc3c594b3eb20cfe808d3c6e227fc1cb30763941 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 16:00:25 +1000 Subject: [PATCH 103/341] feat: add missing param block to script & cleanup modules better --- src/Compiler/Module/Compiled/Compiled.cs | 5 ++++- src/Compiler/Module/Compiled/Local.cs | 4 ++-- src/Compiler/Module/Compiled/Script.cs | 24 ++++++++++++++++++----- src/Compiler/Resources/ScriptTemplate.ps1 | 17 ++++++++++------ 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 29969a24..9eb92e3b 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -38,6 +38,9 @@ protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] ComputedHash = Convert.ToHexString(SHA1.HashData(byteList.ToArray())); } + + public string GetNameHash() => $"{ModuleSpec.Name}-{ComputedHash[..6]}"; + public abstract string StringifyContent(); public abstract IEnumerable GetExportedFunctions(); @@ -52,7 +55,7 @@ public virtual string GetPowerShellObject() => $$""" @{ Name = '{{ModuleSpec.Name}}'; Version = '{{Version}}'; - Hash = '{{ComputedHash}}'; + Hash = '{{ComputedHash[..6]}}'; Type = '{{Type}}'; Content = {{StringifyContent()}} } diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index 3d16814e..4a48dc55 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -32,11 +32,11 @@ RequirementGroup requirements .AppendLine("<#ps1#> @'") .AppendJoin('\n', Requirements.GetRequirements().Select(requirement => { - var hash = requirement switch + var hash = (requirement switch { ModuleSpec req => FindSibling(req)!.ComputedHash, _ => requirement.HashString - }; + })[..6]; var data = new Hashtable() { { "NameSuffix", hash } }; return requirement.GetInsertableLine(data); diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index cce5d05d..065411db 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -86,10 +86,7 @@ RequirementGroup requirements graphviz = Graph.ToGraphviz(alg => { - alg.FormatVertex += (sender, args) => - { - args.VertexFormat.Label = args.Vertex.ModuleSpec.Name + '-' + args.Vertex.ComputedHash; - }; + alg.FormatVertex += (sender, args) => args.VertexFormat.Label = args.Vertex.GetNameHash(); }); Logger.Debug("Compiled graphviz:"); Logger.Debug(graphviz); @@ -126,9 +123,26 @@ public override string GetPowerShellObject() }); EMBEDDED_MODULES.AppendLine(IndentString(");", 4)); + var PARAM_BLOCK = new StringBuilder(); + if (ScriptParamBlock != null) + { + ScriptParamBlock.Attributes.ToList().ForEach(attribute => PARAM_BLOCK.AppendLine(attribute.Extent.Text)); + PARAM_BLOCK.Append(ScriptParamBlock.Extent.Text); + } + + var IMPORT_ORDER = Graph.TopologicalSort() + .Skip(1) // Skip the root node. + .Reverse() + .Select(module => $"'{module.GetNameHash()}'") + .Aggregate((a, b) => $"{a}, {b}"); + // TODO - Implement a way to replace #!DEFINE macros in the template. // This could also be how we can implement secure variables during compilation. - template = template.Replace("#!DEFINE EMBEDDED_MODULES", EMBEDDED_MODULES.ToString()); + template = template + .Replace("#!DEFINE EMBEDDED_MODULES", EMBEDDED_MODULES.ToString()) + .Replace("#!DEFINE PARAM_BLOCK", PARAM_BLOCK.ToString()) + .Replace("#!DEFINE IMPORT_ORDER", $"$Script:REMOVE_ORDER = @({IMPORT_ORDER});"); + return template; } diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index a5ddf220..0320e86a 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -1,14 +1,19 @@ +#!DEFINE PARAM_BLOCK begin { [Boolean]$Script:CompiledScript = $True; #!DEFINE EMBEDDED_MODULES + #!DEFINE IMPORT_ORDER + [String]$Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { Write-Verbose "Creating module root folder: $Local:PrivatePSModulePath"; New-Item -Path $Local:PrivatePSModulePath -ItemType Directory | Out-Null; } + if (-not ($Env:PSModulePath -like "*$Local:PrivatePSModulePath*")) { $Env:PSModulePath = "$Local:PrivatePSModulePath;" + $Env:PSModulePath; } + $Script:ScriptPath; $Script:EMBEDDED_MODULES | ForEach-Object { $Local:Name = $_.Name; @@ -61,10 +66,10 @@ begin { } } process { - & $Script:ScriptPath @PSBoundParameters; -} -end { - $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; - # TODO - Remove by reverse order of import - Get-Module | Where-Object { ($_.ModuleBase | Split-Path -Parent) -eq $Local:PrivatePSModulePath } | Remove-Module -Force; + try { + & $Script:ScriptPath @PSBoundParameters; + } finally { + $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; + $Script:REMOVE_ORDER | ForEach-Object { Get-Module -Name $_ | Remove-Module -Force; } + } } From 4f8434f4b5514690b48acc67fb601ec517014d13 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 16:00:51 +1000 Subject: [PATCH 104/341] chore: use param for testing --- resources/test.ps1 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/test.ps1 b/resources/test.ps1 index 9d8d1653..4018e8f5 100644 --- a/resources/test.ps1 +++ b/resources/test.ps1 @@ -22,8 +22,7 @@ param( Set-StrictMode -Version 3; Invoke-RunMain $PSCmdlet { - Write-Output 'Hello, World!'; - Invoke-Info 'This is an info message!'; + Invoke-Info "Hello, $Name!"; # Random comment $Restart = Get-UserConfirmation 'Restart' 'Do you want to restart the script?'; From 04308698d24b98bc3a3831a9f862c33d7ac48969 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 17:01:27 +1000 Subject: [PATCH 105/341] ci: sarif reports & c# compiler coverage --- .github/workflows/build.yaml | 23 +++++++++++++ .github/workflows/linter.yaml | 26 ++++++++++++++- .github/workflows/test-scripts.yaml | 21 ------------ .github/workflows/test.yaml | 51 +++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/build.yaml delete mode 100644 .github/workflows/test-scripts.yaml create mode 100644 .github/workflows/test.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 00000000..539a2d42 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,23 @@ +name: Build Compiler + +on: ["push", "pull_request"] + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + + - name: Setup DotNet + uses: actions/setup-dotnet@v3 + with: + cache: true + dotnet-version: 8.0.x + + - name: Install dependencies + run: dotnet restore + + - name: Build + run: dotnet build diff --git a/.github/workflows/linter.yaml b/.github/workflows/linter.yaml index c9cf513d..23fcf142 100644 --- a/.github/workflows/linter.yaml +++ b/.github/workflows/linter.yaml @@ -1,8 +1,31 @@ name: Lint -on: [workflow_dispatch] +on: + pull_request: + paths: ["src/**", "tests/**", "utils/**", ".github/workflows/**"] + push: + paths: ["src/**", "tests/**", "utils/**", ".github/workflows/**"] jobs: + powershell: + name: PowerShell Lint + runs-on: ubuntu-latest + permissions: + contents: read + security-events: write + actions: read + steps: + - name: Run PSScriptAnalyzer + uses: microsoft/psscriptanalyzer-action@main + with: + settings: .\PSScriptAnalyzerSettings.psd1 + output: results.sarif + + - name: Upload SARIF results + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: results.sarif + lint: name: Lint runs-on: ubuntu-latest @@ -23,3 +46,4 @@ jobs: EDITORCONFIG_FILE_NAME: ".editorconfig" POWERSHELL_CONFIG_FILE: "PSScriptAnalyzerSettings.psd1" FILTER_REGEX_EXCLUDE: ".*compiled/.*|.*docs/.*|LICENSE" + SAVE_SUPER_LINTER_OUTPUT: true diff --git a/.github/workflows/test-scripts.yaml b/.github/workflows/test-scripts.yaml deleted file mode 100644 index db82532a..00000000 --- a/.github/workflows/test-scripts.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: PowerShell Script Tests - -on: - push: - branches: [master] - paths: ["src/**", "tests/**", ".github/workflows/test-scripts.yaml"] - -jobs: - test: - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Run Pester Tests - shell: pwsh - run: .\utils\Invoke-CodeCoverage.ps1 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 00000000..f1354c5d --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,51 @@ +name: Tests + +on: + push: + branches: [master] + paths: ["src/**", "tests/**", ".github/workflows/test-scripts.yaml"] + +jobs: + test-compiler: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup DotNet + uses: actions/setup-dotnet@v3 + with: + cache: true + dotnet-version: 8.0.x + + - name: Install dependencies + run: dotnet restore + + - name: Test & Collect lcov coverage + run: dotnet test --logger trx /p:CollectCoverage=true /p:CoverletOutput=Coverage/ /p:CoverletOutputFormat=lcov" + + - name: Upload coverage artifact + uses: actions/upload-artifact@v4 + if: ${{ always() }} + with: + name: dotnet-coverage + path: tests/Compiler/coverage.info + + test-scripts: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Run Pester Tests + shell: pwsh + run: .\utils\Invoke-CodeCoverage.ps1 From e8fa95dc449eeee0bd2e4c94473af6a380db0e13 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 17:06:21 +1000 Subject: [PATCH 106/341] chore: rename common files No longer need the number before the name to have a fixed load order. --- src/common/{05-Assert.psm1 => Assert.psm1} | 0 src/common/{99-Cache.psm1 => Cache.psm1} | 0 .../{99-Connection.psm1 => Connection.psm1} | 0 src/common/{05-Ensure.psm1 => Ensure.psm1} | 0 .../{00-Environment.psm1 => Environment.psm1} | 2 +- src/common/{02-Event.psm1 => Event.psm1} | 0 src/common/{02-Exit.psm1 => Exit.psm1} | 0 src/common/{99-Flag.psm1 => Flag.psm1} | 0 src/common/{50-Input.psm1 => Input.psm1} | 57 +++++++------------ src/common/{01-Logging.psm1 => Logging.psm1} | 0 src/common/{00-PSStyle.psm1 => PSStyle.psm1} | 0 ...ackageManager.psm1 => PackageManager.psm1} | 0 .../{99-Registry.psm1 => Registry.psm1} | 0 src/common/{01-Scope.psm1 => Scope.psm1} | 0 src/common/{40-Temp.psm1 => Temp.psm1} | 0 ...AndAccounts.psm1 => UsersAndAccounts.psm1} | 0 src/common/{00-Utils.psm1 => Utils.psm1} | 0 17 files changed, 21 insertions(+), 38 deletions(-) rename src/common/{05-Assert.psm1 => Assert.psm1} (100%) rename src/common/{99-Cache.psm1 => Cache.psm1} (100%) rename src/common/{99-Connection.psm1 => Connection.psm1} (100%) rename src/common/{05-Ensure.psm1 => Ensure.psm1} (100%) rename src/common/{00-Environment.psm1 => Environment.psm1} (99%) rename src/common/{02-Event.psm1 => Event.psm1} (100%) rename src/common/{02-Exit.psm1 => Exit.psm1} (100%) rename src/common/{99-Flag.psm1 => Flag.psm1} (100%) rename src/common/{50-Input.psm1 => Input.psm1} (94%) rename src/common/{01-Logging.psm1 => Logging.psm1} (100%) rename src/common/{00-PSStyle.psm1 => PSStyle.psm1} (100%) rename src/common/{45-PackageManager.psm1 => PackageManager.psm1} (100%) rename src/common/{99-Registry.psm1 => Registry.psm1} (100%) rename src/common/{01-Scope.psm1 => Scope.psm1} (100%) rename src/common/{40-Temp.psm1 => Temp.psm1} (100%) rename src/common/{99-UsersAndAccounts.psm1 => UsersAndAccounts.psm1} (100%) rename src/common/{00-Utils.psm1 => Utils.psm1} (100%) diff --git a/src/common/05-Assert.psm1 b/src/common/Assert.psm1 similarity index 100% rename from src/common/05-Assert.psm1 rename to src/common/Assert.psm1 diff --git a/src/common/99-Cache.psm1 b/src/common/Cache.psm1 similarity index 100% rename from src/common/99-Cache.psm1 rename to src/common/Cache.psm1 diff --git a/src/common/99-Connection.psm1 b/src/common/Connection.psm1 similarity index 100% rename from src/common/99-Connection.psm1 rename to src/common/Connection.psm1 diff --git a/src/common/05-Ensure.psm1 b/src/common/Ensure.psm1 similarity index 100% rename from src/common/05-Ensure.psm1 rename to src/common/Ensure.psm1 diff --git a/src/common/00-Environment.psm1 b/src/common/Environment.psm1 similarity index 99% rename from src/common/00-Environment.psm1 rename to src/common/Environment.psm1 index ad001293..41138260 100644 --- a/src/common/00-Environment.psm1 +++ b/src/common/Environment.psm1 @@ -1,4 +1,4 @@ -Using module ./00-Utils.psm1 +Using module ./Utils.psm1 Using module ./01-Logging.psm1 Using module ./01-Scope.psm1 Using module ./02-Exit.psm1 diff --git a/src/common/02-Event.psm1 b/src/common/Event.psm1 similarity index 100% rename from src/common/02-Event.psm1 rename to src/common/Event.psm1 diff --git a/src/common/02-Exit.psm1 b/src/common/Exit.psm1 similarity index 100% rename from src/common/02-Exit.psm1 rename to src/common/Exit.psm1 diff --git a/src/common/99-Flag.psm1 b/src/common/Flag.psm1 similarity index 100% rename from src/common/99-Flag.psm1 rename to src/common/Flag.psm1 diff --git a/src/common/50-Input.psm1 b/src/common/Input.psm1 similarity index 94% rename from src/common/50-Input.psm1 rename to src/common/Input.psm1 index feee41e8..bbf93dd1 100644 --- a/src/common/50-Input.psm1 +++ b/src/common/Input.psm1 @@ -49,6 +49,7 @@ function Register-CustomReadLineHandlers([Switch]$DontSaveInputs) { Set-PSReadLineKeyHandler -Chord Ctrl+c -ScriptBlock { Param([System.ConsoleKeyInfo]$Key, $Arg) + Invoke-Info 'Ctrl+C was pressed, aborting...'; $Script:ShouldAbort = $True; [Microsoft.PowerShell.PSConsoleReadLine]::CancelLine($Key, $Arg); }; @@ -174,7 +175,7 @@ function Get-UserInput { [Switch]$AllowEmpty ) - begin { Enter-Scope; Install-Requirements; } + begin { Enter-Scope; } end { Exit-Scope -ReturnValue $Local:UserInput; } process { @@ -203,8 +204,7 @@ function Get-UserInput { $Private:Value = $Script:ExtraLines + 2; $Script:ExtraLines = 0; $Private:Value; - } - else { + } else { 1 }; @@ -215,8 +215,7 @@ function Get-UserInput { $Local:FailedAtLeastOnce = $true; $Script:PressedEnter = $false; - } - else { + } else { Clear-HostLight -Count 1; break; } @@ -295,7 +294,8 @@ function Get-UserSelection { begin { Enter-Scope; - Install-Requirements; + + [Console]::TreatControlCAsInput = $True; #region Setup PSReadLine Key Handlers [HashTable]$Local:PreviousFunctions = Register-CustomReadLineHandlers -DontSaveInputs; @@ -328,8 +328,7 @@ function Get-UserSelection { if ($Script:PreviewingChoices -and $Line -eq $Script:PreviewingInput) { if ($Script:ChoicesGoneThrough -eq $Script:MatchedChoices.Count - 1) { $Script:ChoicesGoneThrough = 0; - } - else { + } else { $Script:ChoicesGoneThrough++; } @@ -349,8 +348,7 @@ function Get-UserSelection { $Script:PreviewingInput = $Script:MatchedChoices[$Script:ChoicesGoneThrough]; [Microsoft.PowerShell.PSConsoleReadLine]::Replace(0, $MatchingInput.Length, $Script:MatchedChoices[$Script:ChoicesGoneThrough]); - } - elseif ($Script:MatchedChoices.Count -eq 1) { + } elseif ($Script:MatchedChoices.Count -eq 1) { [Microsoft.PowerShell.PSConsoleReadLine]::Replace(0, $MatchingInput.Length, $Script:MatchedChoices); } } @@ -365,8 +363,7 @@ function Get-UserSelection { if ($Script:PreviewingChoices -and $Line -eq $Script:PreviewingInput) { if ($Script:ChoicesGoneThrough -eq 0) { $Script:ChoicesGoneThrough = $Script:MatchedChoices.Count - 1; - } - else { + } else { $Script:ChoicesGoneThrough--; } @@ -393,13 +390,20 @@ function Get-UserSelection { Write-Host "`r>> " -NoNewline; do { + if ([Console]::KeyAvailable) { + $Key = [Console]::ReadKey($True); + if ($Key.Modifiers -eq 'Control' -and $Key.Key -eq 'C') { + Invoke-Info 'Ctrl+C was pressed, aborting...'; + $Script:ShouldAbort = $True; + break; + } + } $Local:Selection = ([Microsoft.PowerShell.PSConsoleReadLine]::ReadLine($Host.Runspace, $ExecutionContext, $?)).Trim(); if (-not $Local:Selection -and $Local:FirstRun -and $null -ne $DefaultChoice) { $Local:Selection = $Choices[$DefaultChoice]; Clear-HostLight -Count 1; - } - elseif ($Local:Selection -notin $ChoicesList) { + } elseif ($Local:Selection -notin $ChoicesList) { $Local:ClearLines = if ($Local:FailedAtLeastOnce -and $Script:PressedEnter) { 2 } else { 1 }; Clear-HostLight -Count $Local:ClearLines; @@ -416,8 +420,7 @@ function Get-UserSelection { if ($Script:ShouldAbort) { if (-not $AllowNone) { throw [System.Management.Automation.PipelineStoppedException]::new(); - } - else { + } else { return $null; } } @@ -431,6 +434,7 @@ function Get-UserSelection { if ($Local:PreviousTabFunction -ne 'CustomAction') { Set-PSReadLineKeyHandler -Chord Tab -Function $Local:PreviousTabFunction; } if ($Local:PreviousShiftTabFunction -ne 'CustomAction') { Set-PSReadLineKeyHandler -Chord Shift+Tab -Function $Local:PreviousShiftTabFunction; } if ($Local:PreviousFunctions) { Unregister-CustomReadLineHandlers -PreviousHandlers $Local:PreviousFunctions; } + [Console]::TreatControlCAsInput = $False; } } @@ -460,25 +464,4 @@ function Get-PopupSelection { return $Local:Selection; } -# TODO :: Make a common way to handle requirements. -[Boolean]$Script:CompletedSetup = $False; -function Install-Requirements { - if ($Script:CompletedSetup) { - return; - } - - # Windows comes pre-installed with PSReadLine 2.0.0, so we need to ensure that we have at least 2.3.0; - Invoke-EnsureModule @{ - Name = 'PSReadLine'; - MinimumVersion = '2.3.0'; - DontRemove = $True; - RestartIfUpdated = $True; - }; - - $Using = [ScriptBlock]::Create('Using module ''PSReadLine'''); - . $Using; - - [Boolean]$Script:CompletedSetup = $True; -} - Export-ModuleMember -Function Get-UserInput, Get-UserConfirmation, Get-UserSelection, Get-PopupSelection -Variable Validations; diff --git a/src/common/01-Logging.psm1 b/src/common/Logging.psm1 similarity index 100% rename from src/common/01-Logging.psm1 rename to src/common/Logging.psm1 diff --git a/src/common/00-PSStyle.psm1 b/src/common/PSStyle.psm1 similarity index 100% rename from src/common/00-PSStyle.psm1 rename to src/common/PSStyle.psm1 diff --git a/src/common/45-PackageManager.psm1 b/src/common/PackageManager.psm1 similarity index 100% rename from src/common/45-PackageManager.psm1 rename to src/common/PackageManager.psm1 diff --git a/src/common/99-Registry.psm1 b/src/common/Registry.psm1 similarity index 100% rename from src/common/99-Registry.psm1 rename to src/common/Registry.psm1 diff --git a/src/common/01-Scope.psm1 b/src/common/Scope.psm1 similarity index 100% rename from src/common/01-Scope.psm1 rename to src/common/Scope.psm1 diff --git a/src/common/40-Temp.psm1 b/src/common/Temp.psm1 similarity index 100% rename from src/common/40-Temp.psm1 rename to src/common/Temp.psm1 diff --git a/src/common/99-UsersAndAccounts.psm1 b/src/common/UsersAndAccounts.psm1 similarity index 100% rename from src/common/99-UsersAndAccounts.psm1 rename to src/common/UsersAndAccounts.psm1 diff --git a/src/common/00-Utils.psm1 b/src/common/Utils.psm1 similarity index 100% rename from src/common/00-Utils.psm1 rename to src/common/Utils.psm1 From c11f58b0bed9b57214a3e069a3e5bdeda1491082 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 1 Aug 2024 17:13:52 +1000 Subject: [PATCH 107/341] chore: fix references to renamed common modules --- .vscode/snippets.code-snippets | 2 +- resources/test.ps1 | 8 +-- resources/test2.ps1 | 6 +-- src/automation/Backup-BitLocker.ps1 | 2 +- src/automation/Disable-AdobeUpdater.ps1 | 2 +- src/automation/Disable-FastStartup.ps1 | 2 +- src/automation/Invoke-Expression.ps1 | 2 +- src/automation/Invoke-PackageManager.ps1 | 2 +- src/automation/Invoke-RebootNotice.ps1 | 2 +- src/automation/Invoke-RemoteRunner.ps1 | 2 +- src/automation/Remove-Administrators.ps1 | 2 +- src/automation/Set-Wallpaper.ps1 | 2 +- src/automation/Uninstall-Applications.ps1 | 2 +- src/common/Assert.psm1 | 4 +- src/common/Cache.psm1 | 6 +-- src/common/Connection.psm1 | 6 +-- src/common/Ensure.psm1 | 49 +++++++------------ src/common/Environment.psm1 | 6 +-- src/common/Exit.psm1 | 2 +- src/common/Flag.psm1 | 2 +- src/common/Input.psm1 | 10 ++-- src/common/Logging.psm1 | 2 +- src/common/PackageManager.psm1 | 6 +-- src/common/Registry.psm1 | 4 +- src/common/Scope.psm1 | 2 +- src/common/Temp.psm1 | 2 +- src/common/UsersAndAccounts.psm1 | 6 +-- src/common/Utils.psm1 | 6 +-- src/hudu/Database.ps1 | 2 +- src/hudu/New-ExcelSheet.ps1 | 2 +- src/hudu/Update-Entra-Integration.ps1 | 2 +- src/hudu/Update-Links.ps1 | 2 +- src/microsoft/Security.ps1 | 2 +- src/microsoft/admin/Invoke-ForCustomer.ps1 | 2 +- .../admin/New-PartnerApplication.ps1 | 2 +- src/microsoft/admin/Update-DKIM.ps1 | 2 +- .../entra/Disable-EnterpriseUserConsent.ps1 | 2 +- src/microsoft/entra/Get-MFAChanges.ps1 | 2 +- src/microsoft/entra/Invoke-TravelAccess.ps1 | 2 +- src/microsoft/entra/New-User.ps1 | 2 +- src/microsoft/entra/OffboardUser.ps1 | 2 +- src/microsoft/entra/StaffLocation.ps1 | 2 +- src/microsoft/entra/TravelAccess.ps1 | 2 +- src/microsoft/intune/Setup.ps1 | 2 +- src/microsoft/security/ConditonalAccess.ps1 | 2 +- src/microsoft/security/Exchange.ps1 | 2 +- src/microsoft/security/Retention.ps1 | 2 +- src/microsoft/security/Setup-Alerts.ps1 | 2 +- src/microsoft/windows/AutoSetup.ps1 | 10 ++-- .../windows/Extract-DownloadedTo.ps1 | 2 +- src/microsoft/windows/Invoke-Downloadable.ps1 | 2 +- .../windows/Repair-WMIRepository.ps1 | 2 +- src/microsoft/windows/Setup-Printer.ps1 | 2 +- src/microsoft/windows/Setup-Wireguard.ps1 | 2 +- src/misc/Export-KaseyaQuotes.ps1 | 2 +- src/misc/Setup-SecretManagement.ps1 | 2 +- src/n-sight/Get-InstalledSoftware.ps1 | 2 +- src/n-sight/Invoke-EnvTest.ps1 | 2 +- src/n-sight/cleaners/Update.ps1 | 2 +- tests/Compiler/Module/Compiled/Compiled.cs | 4 +- tests/common/01-Scope.Tests.ps1 | 2 +- tests/common/05-Assert.Tests.ps1 | 2 +- tests/common/99-Flag.Tests.ps1 | 2 +- tests/common/Base.ps1 | 2 +- utils/Compiler.ps1 | 2 +- utils/Generate-Documentation.ps1 | 2 +- utils/Invoke-CompileAllScripts.ps1 | 2 +- utils/Invoke-Linter.ps1 | 2 +- utils/Invoke-Sandbox.ps1 | 2 +- 69 files changed, 114 insertions(+), 127 deletions(-) diff --git a/.vscode/snippets.code-snippets b/.vscode/snippets.code-snippets index 853e8499..73a74920 100644 --- a/.vscode/snippets.code-snippets +++ b/.vscode/snippets.code-snippets @@ -34,7 +34,7 @@ "scope": "powershell", "prefix": "run", "body": [ - "Import-Module \\$PSScriptRoot/${1:Path/To/src}/common/00-Environment.psm1;", + "Import-Module \\$PSScriptRoot/${1:Path/To/src}/common/Environment.psm1;", "", "Invoke-RunMain \\$MyInvocation {", "", diff --git a/resources/test.ps1 b/resources/test.ps1 index 4018e8f5..57416b21 100644 --- a/resources/test.ps1 +++ b/resources/test.ps1 @@ -3,10 +3,10 @@ Using namespace System.Management.Automation -Using module ../src/common/00-Environment.psm1 -Using module ../src/common/01-Logging.psm1 -Using module ../src/common/02-Exit.psm1 -Using module ../src/common/50-Input.psm1 +Using module ../src/common/Environment.psm1 +Using module ../src/common/Logging.psm1 +Using module ../src/common/Exit.psm1 +Using module ../src/common/Input.psm1 Using module 'PSWindowsUpdate' diff --git a/resources/test2.ps1 b/resources/test2.ps1 index ad4c3415..c6da9dcf 100644 --- a/resources/test2.ps1 +++ b/resources/test2.ps1 @@ -1,6 +1,6 @@ -Using module ../src/common/00-Environment.psm1 -Using module ../src/common/01-Logging.psm1 -Using module ../src/common/02-Exit.psm1 +Using module ../src/common/Environment.psm1 +Using module ../src/common/Logging.psm1 +Using module ../src/common/Exit.psm1 [CmdletBinding()] param() diff --git a/src/automation/Backup-BitLocker.ps1 b/src/automation/Backup-BitLocker.ps1 index adb49a69..ac31f48e 100644 --- a/src/automation/Backup-BitLocker.ps1 +++ b/src/automation/Backup-BitLocker.ps1 @@ -1,7 +1,7 @@ #Requires -Version 5.1 #Requires -Modules BitLocker -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Disable-AdobeUpdater.ps1 b/src/automation/Disable-AdobeUpdater.ps1 index 05a20b79..c2824f74 100644 --- a/src/automation/Disable-AdobeUpdater.ps1 +++ b/src/automation/Disable-AdobeUpdater.ps1 @@ -22,7 +22,7 @@ [CmdletBinding()] param() -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Disable-FastStartup.ps1 b/src/automation/Disable-FastStartup.ps1 index a2b6a323..38774320 100644 --- a/src/automation/Disable-FastStartup.ps1 +++ b/src/automation/Disable-FastStartup.ps1 @@ -16,7 +16,7 @@ System, Windows, Power, Boot #> -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Invoke-Expression.ps1 b/src/automation/Invoke-Expression.ps1 index 05a72bb7..047234a1 100644 --- a/src/automation/Invoke-Expression.ps1 +++ b/src/automation/Invoke-Expression.ps1 @@ -3,7 +3,7 @@ Param( [ScriptBlock]$Expression ) -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { try { & $Expression; diff --git a/src/automation/Invoke-PackageManager.ps1 b/src/automation/Invoke-PackageManager.ps1 index b497e32c..722c7e6a 100644 --- a/src/automation/Invoke-PackageManager.ps1 +++ b/src/automation/Invoke-PackageManager.ps1 @@ -21,7 +21,7 @@ $Script:DefaultPackages = @{ displaylink = {}; } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Invoke-RebootNotice.ps1 b/src/automation/Invoke-RebootNotice.ps1 index 19141987..2eb93c89 100644 --- a/src/automation/Invoke-RebootNotice.ps1 +++ b/src/automation/Invoke-RebootNotice.ps1 @@ -79,7 +79,7 @@ function Get-ShouldRestart { } } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { $Local:RequiresRestart = Get-ShouldRestart; if (-not $Local:RequiresRestart.required) { diff --git a/src/automation/Invoke-RemoteRunner.ps1 b/src/automation/Invoke-RemoteRunner.ps1 index 2d36fb53..374ffa77 100644 --- a/src/automation/Invoke-RemoteRunner.ps1 +++ b/src/automation/Invoke-RemoteRunner.ps1 @@ -287,7 +287,7 @@ function Invoke-Executable( } } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { $ErrorActionPreference = 'Stop'; #region - Error Codes diff --git a/src/automation/Remove-Administrators.ps1 b/src/automation/Remove-Administrators.ps1 index a416e00d..08294c7c 100644 --- a/src/automation/Remove-Administrators.ps1 +++ b/src/automation/Remove-Administrators.ps1 @@ -225,7 +225,7 @@ function Get-ProcessedExceptions( } } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { if ($NoModify) { Invoke-Info 'Running in WhatIf mode, no changes will be made.'; diff --git a/src/automation/Set-Wallpaper.ps1 b/src/automation/Set-Wallpaper.ps1 index 2acc4f01..6ef7b4e8 100644 --- a/src/automation/Set-Wallpaper.ps1 +++ b/src/automation/Set-Wallpaper.ps1 @@ -269,7 +269,7 @@ function Get-ReusableFile { } } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Uninstall-Applications.ps1 b/src/automation/Uninstall-Applications.ps1 index 70a55d9b..2b436e3e 100644 --- a/src/automation/Uninstall-Applications.ps1 +++ b/src/automation/Uninstall-Applications.ps1 @@ -4,7 +4,7 @@ param( [String[]]$ApplicationName ) -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { $Local:Applications = Get-WmiObject -Class Win32_Product | Select-Object -Property Name,Version; $Local:LikeApplications = $Local:Applications | Where-Object { diff --git a/src/common/Assert.psm1 b/src/common/Assert.psm1 index 7f9d4c52..4a853067 100644 --- a/src/common/Assert.psm1 +++ b/src/common/Assert.psm1 @@ -1,7 +1,7 @@ #Requires -Version 5.1 -Using module ./01-Logging.psm1 -Using module ./02-Exit.psm1 +Using module ./Logging.psm1 +Using module ./Exit.psm1 function Assert-NotNull( [Parameter(ValueFromPipeline)] diff --git a/src/common/Cache.psm1 b/src/common/Cache.psm1 index 57b3c1ef..7d6dcbfa 100644 --- a/src/common/Cache.psm1 +++ b/src/common/Cache.psm1 @@ -1,6 +1,6 @@ -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 -Using module ./02-Exit.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 +Using module ./Exit.psm1 [Int]$Script:FAILED_FOLDER_CREATION = Register-ExitCode 'Failed to create the cache folder.'; [Int]$Script:FAILED_FILE_CREATION = Register-ExitCode 'Failed to create the cache file.'; diff --git a/src/common/Connection.psm1 b/src/common/Connection.psm1 index 4ea56062..3d7c75fb 100644 --- a/src/common/Connection.psm1 +++ b/src/common/Connection.psm1 @@ -1,6 +1,6 @@ -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 -Using module ./02-Exit.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 +Using module ./Exit.psm1 function Local:Invoke-NonNullParams { [CmdletBinding()] diff --git a/src/common/Ensure.psm1 b/src/common/Ensure.psm1 index 89f7836a..a67c5053 100644 --- a/src/common/Ensure.psm1 +++ b/src/common/Ensure.psm1 @@ -1,8 +1,8 @@ -Using module ./00-Utils.psm1 -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 -Using module ./02-Exit.psm1 -Using module ./40-Temp.psm1 +Using module ./Utils.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 +Using module ./Exit.psm1 +Using module ./Temp.psm1 Using module @{ ModuleName = 'Microsoft.PowerShell.PSResourceGet'; @@ -159,13 +159,11 @@ function Invoke-EnsureModule { $ErrorActionPreference = 'Stop'; Get-PackageProvider -Name NuGet -ErrorAction SilentlyContinue | Out-Null; - } - catch { + } catch { try { Install-PackageProvider -Name NuGet -ForceBootstrap -Force -Confirm:$False; Set-PSRepository -Name 'PSGallery' -InstallationPolicy Trusted; - } - catch { + } catch { # TODO :: Handle this better, this is a no network case. Invoke-Warn 'Unable to install the NuGet package provider, some modules may not be installed.'; return; @@ -195,8 +193,7 @@ function Invoke-EnsureModule { } [Version]$Local:MinimumVersion = [Version]::Parse($Local:ModuleMinimumVersion); - } - else { + } else { [String]$Local:ModuleName = $Local:Module; [Boolean]$Local:DontRemove = $False; } @@ -235,15 +232,13 @@ function Invoke-EnsureModule { -Global ` -Force ` -PassThru; - } - else { + } else { [PSModuleInfo]$Local:ImportedModule = Import-Module -Name $ModuleImport -Global -Force -PassThru; } Invoke-Info "Module '$ModuleName' imported with version $($Local:ImportedModule.Version)."; $Script:SatisfiedModules[$ModuleName] = [Version]::Parse($Local:ImportedModule.Version); - } - catch { + } catch { Invoke-FailedExit -ExitCode $Script:UNABLE_TO_IMPORT_MODULE -FormatArgs $ModuleName; } } @@ -278,8 +273,7 @@ function Invoke-EnsureModule { try { Update-PSResource -Name $Local:ModuleName -Force -RequiredVersion $Local:ModuleMinimumVersion -ErrorAction Stop; Import-Module_Internal -ModuleName:$Local:ModuleName -ModuleImport:$Local:ModuleName -DontRemove:$Local:DontRemove; - } - catch { + } catch { if ($_.FullyQualifiedErrorId -ne 'ModuleNotInstalledUsingInstallModuleCmdlet,Update-Module') { Invoke-Error -Message "Unable to update module '$Local:ModuleName'"; Invoke-FailedExit -ExitCode $Script:UNABLE_TO_UPDATE_MODULE -FormatArgs @($Local:ModuleName); @@ -288,12 +282,10 @@ function Invoke-EnsureModule { Invoke-Verbose 'Module was unable to be updated, will try to install...'; [Boolean]$Local:TryInstall = $true } - } - elseif ($null -eq $Local:CurrentImportedModule -or ($Local:CurrentImportedModule.Version -lt $Local:ModuleMinimumVersion)) { + } elseif ($null -eq $Local:CurrentImportedModule -or ($Local:CurrentImportedModule.Version -lt $Local:ModuleMinimumVersion)) { Invoke-Debug "Module '$Local:ModuleName' is installed, but the version is less than the minimum version required, importing..."; Import-Module_Internal -ModuleName:$Local:ModuleName -ModuleImport:$Local:ModuleName -DontRemove:$Local:DontRemove; - } - else { + } else { Invoke-Debug "Module '$Local:ModuleName' is installed, skipping..."; $Script:SatisfiedModules[$Local:ModuleName] = $Local:CurrentImportedModule.Version; } @@ -309,8 +301,7 @@ function Invoke-EnsureModule { Invoke-Info "Module '$Local:ModuleName' is not installed, installing..."; try { $Local:FoundModule | Install-PSResource -Scope CurrentUser -TrustRepository -Quiet -AcceptLicense; - } - catch { + } catch { Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:UNABLE_TO_INSTALL_MODULE -FormatArgs @($Local:ModuleName); } @@ -318,13 +309,11 @@ function Invoke-EnsureModule { # Like an assembly conflict or something. if (-not $Local:Module.RestartIfUpdated) { Import-Module_Internal -ModuleName:$Local:ModuleName -ModuleImport:$Local:ModuleName -DontRemove:$Local:DontRemove -ErrorAction SilentlyContinue; - } - else { + } else { Invoke-Info "Module '$Local:ModuleName' has been installed, restart script..."; Restart-Script; } - } - else { + } else { Invoke-Warn "Unable to find module '$Local:ModuleName'."; } } @@ -332,8 +321,7 @@ function Invoke-EnsureModule { [PSModuleInfo]$Local:AfterEnsureModule = Get-Module -Name $Local:ModuleName -ErrorAction SilentlyContinue | Sort-Object -Property Version -Descending | Select-Object -First 1; if ($null -eq $Local:AfterEnsureModule) { Invoke-FailedExit -ExitCode $Script:UNABLE_TO_FIND_MODULE -FormatArgs @($Local:ModuleName); - } - elseif ($Local:CurrentImportedModule -ne $Local:AfterEnsureModule -and $Local:Module.RestartIfUpdated) { + } elseif ($Local:CurrentImportedModule -ne $Local:AfterEnsureModule -and $Local:Module.RestartIfUpdated) { Invoke-Info "Module '$Local:ModuleName' has been updated, restart script..."; Restart-Script; } @@ -416,8 +404,7 @@ function Invoke-EnsureNetwork( if ($WhatIfPreference) { Invoke-Info -Message 'WhatIf is set, skipping network setup...'; return $true; - } - else { + } else { Invoke-Info -Message 'Setting up network...'; netsh wlan add profile filename="$Local:ProfileFile" | Out-Null; netsh wlan show profiles $Name key=clear | Out-Null; diff --git a/src/common/Environment.psm1 b/src/common/Environment.psm1 index 41138260..251a2516 100644 --- a/src/common/Environment.psm1 +++ b/src/common/Environment.psm1 @@ -1,7 +1,7 @@ Using module ./Utils.psm1 -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 -Using module ./02-Exit.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 +Using module ./Exit.psm1 Using namespace System.Management.Automation.Language; Using namespace System.Collections.Generic diff --git a/src/common/Exit.psm1 b/src/common/Exit.psm1 index 561928a6..6fabe673 100644 --- a/src/common/Exit.psm1 +++ b/src/common/Exit.psm1 @@ -1,4 +1,4 @@ -Using module ./01-Logging.psm1 +Using module ./Logging.psm1 [HashTable]$Global:ExitHandlers = @{}; [HashTable]$Global:ExitCodes = @{}; diff --git a/src/common/Flag.psm1 b/src/common/Flag.psm1 index c254d8e9..e248a0ce 100644 --- a/src/common/Flag.psm1 +++ b/src/common/Flag.psm1 @@ -1,4 +1,4 @@ -Using module ./01-Logging.psm1 +Using module ./Logging.psm1 class Flag { [String][ValidateNotNull()]$Context; diff --git a/src/common/Input.psm1 b/src/common/Input.psm1 index bbf93dd1..cb1a8649 100644 --- a/src/common/Input.psm1 +++ b/src/common/Input.psm1 @@ -1,8 +1,8 @@ -Using module ./00-Utils.psm1 -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 -Using module ./05-Assert.psm1 -Using module ./05-Ensure.psm1 +Using module ./Utils.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 +Using module ./Assert.psm1 +Using module ./Ensure.psm1 Using module @{ ModuleName = 'PSReadLine'; ModuleVersion = '2.3.2'; diff --git a/src/common/Logging.psm1 b/src/common/Logging.psm1 index 9971ff83..03823d34 100644 --- a/src/common/Logging.psm1 +++ b/src/common/Logging.psm1 @@ -1,4 +1,4 @@ -Using module ./00-PSStyle.psm1 +Using module ./PSStyle.psm1 Using module @{ ModuleName = 'PSReadLine'; RequiredVersion = '2.3.5'; diff --git a/src/common/PackageManager.psm1 b/src/common/PackageManager.psm1 index 5d28d617..b5ce11bc 100644 --- a/src/common/PackageManager.psm1 +++ b/src/common/PackageManager.psm1 @@ -1,8 +1,8 @@ #Requires -Version 5.1 -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 -Using module ./02-Exit.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 +Using module ./Exit.psm1 enum PackageManager { Chocolatey diff --git a/src/common/Registry.psm1 b/src/common/Registry.psm1 index e889dd4d..32a4a547 100644 --- a/src/common/Registry.psm1 +++ b/src/common/Registry.psm1 @@ -1,5 +1,5 @@ -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 function Invoke-EnsureRegistryPath { [CmdletBinding(SupportsShouldProcess)] diff --git a/src/common/Scope.psm1 b/src/common/Scope.psm1 index d0d90690..31ee389a 100644 --- a/src/common/Scope.psm1 +++ b/src/common/Scope.psm1 @@ -1,6 +1,6 @@ #Requires -Version 5.1 -Using module ./01-Logging.psm1 +Using module ./Logging.psm1 [System.Collections.Stack]$Script:InvocationStack = [System.Collections.Stack]::new(); [String]$Script:Tab = ' '; diff --git a/src/common/Temp.psm1 b/src/common/Temp.psm1 index bf48c751..b4f69b78 100644 --- a/src/common/Temp.psm1 +++ b/src/common/Temp.psm1 @@ -1,4 +1,4 @@ -Using module ./01-Logging.psm1 +Using module ./Logging.psm1 function Get-NamedTempFolder { Param( diff --git a/src/common/UsersAndAccounts.psm1 b/src/common/UsersAndAccounts.psm1 index 69a00880..c94bac19 100644 --- a/src/common/UsersAndAccounts.psm1 +++ b/src/common/UsersAndAccounts.psm1 @@ -1,8 +1,8 @@ #Requires -Version 5.1 -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 -Using module ./02-Exit.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 +Using module ./Exit.psm1 #region - Caching diff --git a/src/common/Utils.psm1 b/src/common/Utils.psm1 index 9a335293..ec766cf8 100644 --- a/src/common/Utils.psm1 +++ b/src/common/Utils.psm1 @@ -1,6 +1,6 @@ -Using module ./01-Logging.psm1 -Using module ./01-Scope.psm1 -Using module ./02-Exit.psm1 +Using module ./Logging.psm1 +Using module ./Scope.psm1 +Using module ./Exit.psm1 <# .SYNOPSIS diff --git a/src/hudu/Database.ps1 b/src/hudu/Database.ps1 index 6e348b3d..a14f8872 100644 --- a/src/hudu/Database.ps1 +++ b/src/hudu/Database.ps1 @@ -54,7 +54,7 @@ function New-HuduDatabase { $Local:Matches | ConvertTo-Json | Out-File -FilePath "$Database"; } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureModule -Modules "$PSScriptRoot/Common.psm1"; diff --git a/src/hudu/New-ExcelSheet.ps1 b/src/hudu/New-ExcelSheet.ps1 index 393bc520..76b23162 100644 --- a/src/hudu/New-ExcelSheet.ps1 +++ b/src/hudu/New-ExcelSheet.ps1 @@ -93,7 +93,7 @@ function Set-Style( #endregion - Excel Functions -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureUser; Invoke-EnsureModule -Modules 'ImportExcel', "$PSScriptRoot\Common.psm1"; # TODO - This should be imported by compiler in future. diff --git a/src/hudu/Update-Entra-Integration.ps1 b/src/hudu/Update-Entra-Integration.ps1 index c0661905..83a35839 100644 --- a/src/hudu/Update-Entra-Integration.ps1 +++ b/src/hudu/Update-Entra-Integration.ps1 @@ -32,7 +32,7 @@ function Remove-OldSecrets { } # Invoke-Init; -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { [String]$Local:HuduKey = Get-VarOrSave -VariableName 'HUDU_KEY' -LazyValue { $Local:Input = Get-UserInput -Title 'Hudu API Key' -Question 'Please enter your Hudu API Key'; diff --git a/src/hudu/Update-Links.ps1 b/src/hudu/Update-Links.ps1 index b1ab1695..0e4cd0e7 100644 --- a/src/hudu/Update-Links.ps1 +++ b/src/hudu/Update-Links.ps1 @@ -53,7 +53,7 @@ function Get-Passwords { } -Import-Module $PSScriptRoot/../src/common/00-Environment.psm1; +Import-Module $PSScriptRoot/../src/common/Environment.psm1; Invoke-RunMain $PSCmdlet { [PSCustomObject]$Private:Companies = Get-HuduCompanies -Endpoint:$Private:Endpoint; diff --git a/src/microsoft/Security.ps1 b/src/microsoft/Security.ps1 index 39d1c13f..b1c03315 100644 --- a/src/microsoft/Security.ps1 +++ b/src/microsoft/Security.ps1 @@ -144,7 +144,7 @@ function New-ConditionalAccessPrivilegedIdentityManagementPolicy { #endregion - Conditional Access Policies -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { switch ($Action) { 'SecurityAlerts' { diff --git a/src/microsoft/admin/Invoke-ForCustomer.ps1 b/src/microsoft/admin/Invoke-ForCustomer.ps1 index 97f35940..786d0828 100644 --- a/src/microsoft/admin/Invoke-ForCustomer.ps1 +++ b/src/microsoft/admin/Invoke-ForCustomer.ps1 @@ -1,7 +1,7 @@ Using module Microsoft.Graph.Authentication; Using module PartnerCenter; -Using module ../../common/00-Environment.psm1; +Using module ../../common/Environment.psm1; [CmdletBinding(DefaultParameterSetName = 'ScriptBlock')] param ( diff --git a/src/microsoft/admin/New-PartnerApplication.ps1 b/src/microsoft/admin/New-PartnerApplication.ps1 index 6012dd9e..67d5c842 100644 --- a/src/microsoft/admin/New-PartnerApplication.ps1 +++ b/src/microsoft/admin/New-PartnerApplication.ps1 @@ -22,7 +22,7 @@ #Requires -Version 5.1 #Requires -PSEdition Desktop -Using module ../../common/00-Environment.psm1; +Using module ../../common/Environment.psm1; Param( [Parameter(Mandatory)] diff --git a/src/microsoft/admin/Update-DKIM.ps1 b/src/microsoft/admin/Update-DKIM.ps1 index 898eeade..a0e68df3 100644 --- a/src/microsoft/admin/Update-DKIM.ps1 +++ b/src/microsoft/admin/Update-DKIM.ps1 @@ -19,7 +19,7 @@ foreach ($domain in $domains) { } } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureModule @('Microsoft.Graph'); diff --git a/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 b/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 index c7c2f756..7d9a6b9d 100644 --- a/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 +++ b/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 @@ -14,7 +14,7 @@ function Set-EnterpriseConsent_ForwardRequestsToAlerts { } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { }; diff --git a/src/microsoft/entra/Get-MFAChanges.ps1 b/src/microsoft/entra/Get-MFAChanges.ps1 index 29ad0cde..bc0d127f 100644 --- a/src/microsoft/entra/Get-MFAChanges.ps1 +++ b/src/microsoft/entra/Get-MFAChanges.ps1 @@ -764,7 +764,7 @@ function Save-Excel([OfficeOpenXml.ExcelPackage]$ExcelData) { } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { if (-not $ClientsFolder) { [String[]]$Local:PossiblePaths = @( diff --git a/src/microsoft/entra/Invoke-TravelAccess.ps1 b/src/microsoft/entra/Invoke-TravelAccess.ps1 index 1efc87d5..be34b294 100644 --- a/src/microsoft/entra/Invoke-TravelAccess.ps1 +++ b/src/microsoft/entra/Invoke-TravelAccess.ps1 @@ -22,7 +22,7 @@ function Test-TravelAccess { # Try to use graph api to use whatif with a generated ip from country-ip } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { # Get exact users by recursive input quary diff --git a/src/microsoft/entra/New-User.ps1 b/src/microsoft/entra/New-User.ps1 index 933b0e4e..4a26fb05 100644 --- a/src/microsoft/entra/New-User.ps1 +++ b/src/microsoft/entra/New-User.ps1 @@ -11,7 +11,7 @@ function New-User { # Use a auto complete input box to allow the user to select the licenses } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureModule -Modules 'Graph' -Scopes ''; diff --git a/src/microsoft/entra/OffboardUser.ps1 b/src/microsoft/entra/OffboardUser.ps1 index e765c0f8..c5a15ae3 100644 --- a/src/microsoft/entra/OffboardUser.ps1 +++ b/src/microsoft/entra/OffboardUser.ps1 @@ -21,7 +21,7 @@ function Update-User { # Remove all licenses (This may need to be done after everything else) } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureModule "$PSScriptRoot/../Common.psm1", 'ExchangeOnlineManagement', 'Microsoft.Graph'; Connect-Service 'Graph','ExchangeOnline' -Scopes @('User.ReadWrite.All', 'Directory.ReadWrite.All'); diff --git a/src/microsoft/entra/StaffLocation.ps1 b/src/microsoft/entra/StaffLocation.ps1 index 2dc5c3cb..a114cafe 100644 --- a/src/microsoft/entra/StaffLocation.ps1 +++ b/src/microsoft/entra/StaffLocation.ps1 @@ -241,7 +241,7 @@ function Set-ConditionalAccessPolicy { }; # Register-ArgumentCompleter -CommandName:($PSCommandPath | Split-Path -Leaf) -ScriptBlock $Local:ScriptBlock -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet -Main:$Local:ScriptBlock; dynamicparam { diff --git a/src/microsoft/entra/TravelAccess.ps1 b/src/microsoft/entra/TravelAccess.ps1 index cbbd46af..c3d09e36 100644 --- a/src/microsoft/entra/TravelAccess.ps1 +++ b/src/microsoft/entra/TravelAccess.ps1 @@ -1,6 +1,6 @@ #Requires -Version 5.1 -Import-Module ../common/00-Environment.psm1; +Import-Module ../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Write-Host "Hello, World!" diff --git a/src/microsoft/intune/Setup.ps1 b/src/microsoft/intune/Setup.ps1 index d48a36a8..2f63c475 100644 --- a/src/microsoft/intune/Setup.ps1 +++ b/src/microsoft/intune/Setup.ps1 @@ -450,7 +450,7 @@ function Set-CustomPolicies { #endregion - Conditional Access Policies -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service -Services 'Graph' -Scopes DeviceManagementServiceConfig.ReadWrite.All,deviceManagementConfiguration.ReadWrite.All, Group.ReadWrite.All; diff --git a/src/microsoft/security/ConditonalAccess.ps1 b/src/microsoft/security/ConditonalAccess.ps1 index db37b812..374dd744 100644 --- a/src/microsoft/security/ConditonalAccess.ps1 +++ b/src/microsoft/security/ConditonalAccess.ps1 @@ -109,7 +109,7 @@ function New-ConditionalAccessPrivilegedIdentityManagementPolicy { } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service AzureAD; }; diff --git a/src/microsoft/security/Exchange.ps1 b/src/microsoft/security/Exchange.ps1 index af9e5a16..99f05a8e 100644 --- a/src/microsoft/security/Exchange.ps1 +++ b/src/microsoft/security/Exchange.ps1 @@ -281,7 +281,7 @@ function Update-AntiMalwarePolicy { #endregion - Policies -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service -Service ExchangeOnline; diff --git a/src/microsoft/security/Retention.ps1 b/src/microsoft/security/Retention.ps1 index 71e907b2..0a443eb6 100644 --- a/src/microsoft/security/Retention.ps1 +++ b/src/microsoft/security/Retention.ps1 @@ -6,7 +6,7 @@ [String]$Script:RetentionPolicyDuration = 'TwelveMonths'; [String[]]$Script:RentionPolicyRecordTypes = @('ExchangeAdmin', 'ExchangeItem', 'ExchangeItemGroup', 'SharePoint', 'SyntheticProbe', 'SharePointFileOperation', 'OneDrive', 'AzureActiveDirectory', 'AzureActiveDirectoryAccountLogon', 'DataCenterSecurityCmdlet', 'ComplianceDLPSharePoint', 'Sway', 'ComplianceDLPExchange', 'SharePointSharingOperation', 'AzureActiveDirectoryStsLogon', 'SkypeForBusinessPSTNUsage', 'SkypeForBusinessUsersBlocked', 'SecurityComplianceCenterEOPCmdlet', 'ExchangeAggregatedOperation', 'PowerBIAudit', 'CRM', 'Yammer', 'SkypeForBusinessCmdlets', 'Discovery', 'MicrosoftTeams', 'ThreatIntelligence', 'MailSubmission', 'MicrosoftFlow', 'AeD', 'MicrosoftStream', 'ComplianceDLPSharePointClassification', 'ThreatFinder', 'Project', 'SharePointListOperation', 'SharePointCommentOperation', 'DataGovernance', 'Kaizala', 'SecurityComplianceAlerts', 'ThreatIntelligenceUrl', 'SecurityComplianceInsights', 'MIPLabel', 'WorkplaceAnalytics', 'PowerAppsApp', 'PowerAppsPlan', 'ThreatIntelligenceAtpContent', 'LabelContentExplorer', 'TeamsHealthcare', 'ExchangeItemAggregated', 'HygieneEvent', 'DataInsightsRestApiAudit', 'InformationBarrierPolicyApplication', 'SharePointListItemOperation', 'SharePointContentTypeOperation', 'SharePointFieldOperation', 'MicrosoftTeamsAdmin', 'HRSignal', 'MicrosoftTeamsDevice', 'MicrosoftTeamsAnalytics', 'InformationWorkerProtection', 'Campaign', 'DLPEndpoint', 'AirInvestigation', 'Quarantine', 'MicrosoftForms', 'ApplicationAudit', 'ComplianceSupervisionExchange', 'CustomerKeyServiceEncryption', 'OfficeNative', 'MipAutoLabelSharePointItem', 'MipAutoLabelSharePointPolicyLocation', 'MicrosoftTeamsShifts', 'SecureScore', 'MipAutoLabelExchangeItem', 'CortanaBriefing', 'Search', 'WDATPAlerts', 'PowerPlatformAdminDlp', 'PowerPlatformAdminEnvironment', 'MDATPAudit', 'SensitivityLabelPolicyMatch', 'SensitivityLabelAction', 'SensitivityLabeledFileAction', 'AttackSim', 'AirManualInvestigation', 'SecurityComplianceRBAC', 'UserTraining', 'AirAdminActionInvestigation', 'MSTIC', 'PhysicalBadgingSignal', 'TeamsEasyApprovals', 'AipDiscover', 'AipSensitivityLabelAction', 'AipProtectionAction', 'AipFileDeleted', 'AipHeartBeat', 'MCASAlerts', 'OnPremisesFileShareScannerDlp', 'OnPremisesSharePointScannerDlp', 'ExchangeSearch', 'SharePointSearch', 'PrivacyDataMinimization', 'LabelAnalyticsAggregate', 'MyAnalyticsSettings', 'SecurityComplianceUserChange', 'ComplianceDLPExchangeClassification', 'ComplianceDLPEndpoint', 'MipExactDataMatch', 'MSDEResponseActions', 'MSDEGeneralSettings', 'MSDEIndicatorsSettings', 'MS365DCustomDetection', 'MSDERolesSettings', 'MAPGAlerts', 'MAPGPolicy', 'MAPGRemediation', 'PrivacyRemediationAction', 'PrivacyDigestEmail', 'MipAutoLabelSimulationProgress', 'MipAutoLabelSimulationCompletion', 'MipAutoLabelProgressFeedback', 'DlpSensitiveInformationType', 'MipAutoLabelSimulationStatistics', 'LargeContentMetadata', 'Microsoft365Group', 'CDPMlInferencingResult', 'FilteringMailMetadata', 'CDPClassificationMailItem', 'CDPClassificationDocument', 'OfficeScriptsRunAction', 'FilteringPostMailDeliveryAction', 'CDPUnifiedFeedback', 'TenantAllowBlockList', 'ConsumptionResource', 'HealthcareSignal', 'DlpImportResult', 'CDPCompliancePolicyExecution', 'MultiStageDisposition', 'PrivacyDataMatch', 'FilteringDocMetadata', 'FilteringEmailFeatures', 'PowerBIDlp', 'FilteringUrlInfo', 'FilteringAttachmentInfo', 'CoreReportingSettings', 'ComplianceConnector', 'PowerPlatformLockboxResourceAccessRequest', 'PowerPlatformLockboxResourceCommand', 'CDPPredictiveCodingLabel', 'CDPCompliancePolicyUserFeedback', 'WebpageActivityEndpoint', 'OMEPortal', 'CMImprovementActionChange', 'FilteringUrlClick', 'MipLabelAnalyticsAuditRecord', 'FilteringEntityEvent', 'FilteringRuleHits', 'FilteringMailSubmission', 'LabelExplorer', 'MicrosoftManagedServicePlatform', 'PowerPlatformServiceActivity', 'ScorePlatformGenericAuditRecord', 'FilteringTimeTravelDocMetadata', 'Alert', 'AlertStatus', 'AlertIncident', 'IncidentStatus', 'Case', 'CaseInvestigation', 'RecordsManagement', 'PrivacyRemediation', 'DataShareOperation', 'CdpDlpSensitive', 'EHRConnector', 'FilteringMailGradingResult', 'PublicFolder', 'PrivacyTenantAuditHistoryRecord', 'AipScannerDiscoverEvent', 'EduDataLakeDownloadOperation', 'M365ComplianceConnector', 'MicrosoftGraphDataConnectOperation', 'MicrosoftPurview', 'FilteringEmailContentFeatures', 'PowerPagesSite', 'PowerAppsResource', 'PlannerPlan', 'PlannerCopyPlan', 'PlannerTask', 'PlannerRoster', 'PlannerPlanList', 'PlannerTaskList', 'PlannerTenantSettings', 'ProjectForTheWebProject', 'ProjectForTheWebTask', 'ProjectForTheWebRoadmap', 'ProjectForTheWebRoadmapItem', 'ProjectForTheWebProjectSettings', 'ProjectForTheWebRoadmapSettings', 'QuarantineMetadata', 'MicrosoftTodoAudit', 'TimeTravelFilteringDocMetadata', 'TeamsQuarantineMetadata', 'SharePointAppPermissionOperation', 'MicrosoftTeamsSensitivityLabelAction', 'FilteringTeamsMetadata', 'FilteringTeamsUrlInfo', 'FilteringTeamsPostDeliveryAction', 'MDCAssessments', 'MDCRegulatoryComplianceStandards', 'MDCRegulatoryComplianceControls', 'MDCRegulatoryComplianceAssessments', 'MDCSecurityConnectors', 'MDADataSecuritySignal', 'VivaGoals', 'FilteringRuntimeInfo', 'AttackSimAdmin', 'MicrosoftGraphDataConnectConsent', 'FilteringAtpDetonationInfo', 'PrivacyPortal', 'ManagedTenants', 'UnifiedSimulationMatchedItem', 'UnifiedSimulationSummary', 'UpdateQuarantineMetadata', 'MS365DSuppressionRule', 'PurviewDataMapOperation', 'FilteringUrlPostClickAction', 'IrmUserDefinedDetectionSignal', 'TeamsUpdates', 'PlannerRosterSensitivityLabel', 'MS365DIncident', 'FilteringDelistingMetadata', 'ComplianceDLPSharePointClassificationExtended', 'MicrosoftDefenderForIdentityAudit', 'SupervisoryReviewDayXInsight', 'DefenderExpertsforXDRAdmin', 'CDPEdgeBlockedMessage', 'HostedRpa', 'CdpContentExplorerAggregateRecord', 'CDPHygieneAttachmentInfo', 'CDPHygieneSummary', 'CDPPostMailDeliveryAction', 'CDPEmailFeatures', 'CDPHygieneUrlInfo', 'CDPUrlClick', 'CDPPackageManagerHygieneEvent', 'FilteringDocScan', 'TimeTravelFilteringDocScan', 'MAPGOnboard', 'VfamCreatePolicy', 'VfamUpdatePolicy', 'VfamDeletePolicy', 'M365DAAD', 'CdpColdCrawlStatus', 'PowerPlatformAdministratorActivity', 'Windows365CustomerLockbox', 'CdpResourceScopeChangeEvent'); -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service -Service SecurityComplience; diff --git a/src/microsoft/security/Setup-Alerts.ps1 b/src/microsoft/security/Setup-Alerts.ps1 index 0ae10f42..0f399d36 100644 --- a/src/microsoft/security/Setup-Alerts.ps1 +++ b/src/microsoft/security/Setup-Alerts.ps1 @@ -55,7 +55,7 @@ function Update-SecurityAndCompilence( } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service -Services SecurityComplience,Graph -Scopes 'SecurityEvents.ReadWrite.All'; diff --git a/src/microsoft/windows/AutoSetup.ps1 b/src/microsoft/windows/AutoSetup.ps1 index 86917d67..f6871fd3 100644 --- a/src/microsoft/windows/AutoSetup.ps1 +++ b/src/microsoft/windows/AutoSetup.ps1 @@ -1,10 +1,10 @@ #Requires -Version 5.1 #Requires -RunAsAdministrator -Using module ../../common/00-Environment.psm1; -Using module ../../common/01-Logging.psm1; -Using module ../../common/01-Scope.psm1; -Using module ../../common/02-Exit.psm1; +Using module ../../common/Environment.psm1; +Using module ../../common/Logging.psm1; +Using module ../../common/Scope.psm1; +Using module ../../common/Exit.psm1; Using module PSWindowsUpdate; # Windows 10 Setup screen raw inputs @@ -1007,7 +1007,7 @@ function Invoke-PhaseFinish { #endregion - Phase Functions -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Register-ExitHandler -Name 'Running Flag Removal' -ExitHandler { (Get-RunningFlag).Remove(); diff --git a/src/microsoft/windows/Extract-DownloadedTo.ps1 b/src/microsoft/windows/Extract-DownloadedTo.ps1 index 3a1d3193..7037f157 100644 --- a/src/microsoft/windows/Extract-DownloadedTo.ps1 +++ b/src/microsoft/windows/Extract-DownloadedTo.ps1 @@ -38,7 +38,7 @@ function Get-DownloadedItem( } } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { if (-not (Test-Path $ExtractTo)) { Invoke-Error "ExtractTo path $ExtractTo does not exist."; diff --git a/src/microsoft/windows/Invoke-Downloadable.ps1 b/src/microsoft/windows/Invoke-Downloadable.ps1 index 2b03d134..2b73d263 100644 --- a/src/microsoft/windows/Invoke-Downloadable.ps1 +++ b/src/microsoft/windows/Invoke-Downloadable.ps1 @@ -66,7 +66,7 @@ function Invoke-Exec( } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-WithinEphemeral { [String]$Local:Executable = Get-Executable -URL:$URL -ExecutablePattern:$ExecutablePattern; diff --git a/src/microsoft/windows/Repair-WMIRepository.ps1 b/src/microsoft/windows/Repair-WMIRepository.ps1 index ccfa894d..6ae1f131 100644 --- a/src/microsoft/windows/Repair-WMIRepository.ps1 +++ b/src/microsoft/windows/Repair-WMIRepository.ps1 @@ -31,7 +31,7 @@ function Get-DependentServices { return $result } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/microsoft/windows/Setup-Printer.ps1 b/src/microsoft/windows/Setup-Printer.ps1 index 2e9b8c62..7085b14a 100644 --- a/src/microsoft/windows/Setup-Printer.ps1 +++ b/src/microsoft/windows/Setup-Printer.ps1 @@ -202,7 +202,7 @@ function Install-PrinterImpl( } } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { [String]$Local:TrimmedPrinterName = $PrinterName.Trim(); [String]$Local:TrimmedPrinterIP = $PrinterIP.Trim(); diff --git a/src/microsoft/windows/Setup-Wireguard.ps1 b/src/microsoft/windows/Setup-Wireguard.ps1 index 91321ace..96f059bd 100644 --- a/src/microsoft/windows/Setup-Wireguard.ps1 +++ b/src/microsoft/windows/Setup-Wireguard.ps1 @@ -6,7 +6,7 @@ param ( [String]$WireGuardPackage = 'wireguard' ) -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/misc/Export-KaseyaQuotes.ps1 b/src/misc/Export-KaseyaQuotes.ps1 index 09295299..4f74c9bc 100644 --- a/src/misc/Export-KaseyaQuotes.ps1 +++ b/src/misc/Export-KaseyaQuotes.ps1 @@ -106,7 +106,7 @@ function Invoke-ApiRequest { } } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { trap { Remove-Variable -Scope Global -Name 'Quotes' -ErrorAction SilentlyContinue; diff --git a/src/misc/Setup-SecretManagement.ps1 b/src/misc/Setup-SecretManagement.ps1 index 56c9b644..02e6ef76 100644 --- a/src/misc/Setup-SecretManagement.ps1 +++ b/src/misc/Setup-SecretManagement.ps1 @@ -18,7 +18,7 @@ function Install-1Password { } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureUser; Invoke-EnsureModule -Modules @('Microsoft.Powershell.SecretManagement'); diff --git a/src/n-sight/Get-InstalledSoftware.ps1 b/src/n-sight/Get-InstalledSoftware.ps1 index 12e84c52..453b56bf 100644 --- a/src/n-sight/Get-InstalledSoftware.ps1 +++ b/src/n-sight/Get-InstalledSoftware.ps1 @@ -191,7 +191,7 @@ function Out-ToExcel { } } -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureModule -Modules 'ImportExcel'; diff --git a/src/n-sight/Invoke-EnvTest.ps1 b/src/n-sight/Invoke-EnvTest.ps1 index 055c591b..30d56e87 100644 --- a/src/n-sight/Invoke-EnvTest.ps1 +++ b/src/n-sight/Invoke-EnvTest.ps1 @@ -3,7 +3,7 @@ Used to print environment variables and other information within a N-Able ScriptRunner environment. #> -Import-Module $PSScriptRoot/../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-Info 'Printing environment variables...' [Object[]]$Local:EnvironmentVariables = Get-ChildItem -Path 'env:'; diff --git a/src/n-sight/cleaners/Update.ps1 b/src/n-sight/cleaners/Update.ps1 index 5c201592..9aa361fb 100644 --- a/src/n-sight/cleaners/Update.ps1 +++ b/src/n-sight/cleaners/Update.ps1 @@ -67,7 +67,7 @@ Function Invoke-UpdateScript { Invoke-Info "File '$ScriptName' has been updated."; } -Import-Module $PSScriptRoot/../../common/00-Environment.psm1; +Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { foreach ($File in $FilesToFetch) { Invoke-UpdateScript -BaseUrl:$BaseUrl -ScriptName:$File; diff --git a/tests/Compiler/Module/Compiled/Compiled.cs b/tests/Compiler/Module/Compiled/Compiled.cs index 25ac8942..45192397 100644 --- a/tests/Compiler/Module/Compiled/Compiled.cs +++ b/tests/Compiler/Module/Compiled/Compiled.cs @@ -52,7 +52,7 @@ public static IEnumerable AddRequirementHashData { typeof(ModuleSpec), new HashSet { new ModuleSpec("PSWindowsUpdate"), new ModuleSpec("PSReadLine", requiredVersion: new (2, 3, 5)), - new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/00-Environment.psm1") + new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/Environment.psm1") } }, { typeof(PSEditionRequirement), new HashSet { new PSEditionRequirement(PSEdition.Core) @@ -71,7 +71,7 @@ public static IEnumerable AddRequirementHashData { StoredRequirements = { { typeof(ModuleSpec), new HashSet { - new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/00-Environment.psm1") + new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/Environment.psm1") } }, } } diff --git a/tests/common/01-Scope.Tests.ps1 b/tests/common/01-Scope.Tests.ps1 index 54ac78ec..8a56891a 100644 --- a/tests/common/01-Scope.Tests.ps1 +++ b/tests/common/01-Scope.Tests.ps1 @@ -2,7 +2,7 @@ BeforeDiscovery { $Script:ModuleName = & $PSScriptRoot/Base.ps1; } -Describe '01-Scope.psm1 Tests' { +Describe 'Scope.psm1 Tests' { Context 'Formatting Tests' { It 'Should format a single scope correctly' { Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-StackTop -MockWith { return @{Invocation = @{MyCommand = @{Name = 'It' } }; }; }; diff --git a/tests/common/05-Assert.Tests.ps1 b/tests/common/05-Assert.Tests.ps1 index 4be741a0..e3e2f86b 100644 --- a/tests/common/05-Assert.Tests.ps1 +++ b/tests/common/05-Assert.Tests.ps1 @@ -2,7 +2,7 @@ BeforeDiscovery { $Script:ModuleName = & $PSScriptRoot/Base.ps1; } -Describe '05-Assert.psm1 Tests' { +Describe 'Assert.psm1 Tests' { Context 'Assert-NotNull' { It 'Should throw an error if the object is null' { { Assert-NotNull -Object $null } | Should -Throw diff --git a/tests/common/99-Flag.Tests.ps1 b/tests/common/99-Flag.Tests.ps1 index abfa3e8a..51ed54a2 100644 --- a/tests/common/99-Flag.Tests.ps1 +++ b/tests/common/99-Flag.Tests.ps1 @@ -3,7 +3,7 @@ BeforeDiscovery { } -Describe "99-Flag.psm1 Tests" { +Describe 'Flags.psm1 Tests' { AfterEach { $Flag.Remove(); } Context 'Base Flag Class' { diff --git a/tests/common/Base.ps1 b/tests/common/Base.ps1 index c8395318..d3e2fbcf 100644 --- a/tests/common/Base.ps1 +++ b/tests/common/Base.ps1 @@ -1,6 +1,6 @@ $VerbosePreference = 'Continue'; $DebugPreference = 'Continue'; -Import-Module -Name $PSScriptRoot/../../src/common/00-Environment.psm1; +Import-Module -Name $PSScriptRoot/../../src/common/Environment.psm1; if ((Get-PSCallStack)[3].Command -or -not ((Get-PSCallStack)[0].Command -match "|$($PSCommandPath | Split-Path -Leaf)")) { $Local:ModuleName = ((Get-PSCallStack)[0].InvocationInfo.PSCommandPath | Split-Path -LeafBase) -replace '\.Tests$', ''; diff --git a/utils/Compiler.ps1 b/utils/Compiler.ps1 index 3dd0f4ed..bc9db158 100644 --- a/utils/Compiler.ps1 +++ b/utils/Compiler.ps1 @@ -485,7 +485,7 @@ $(if ($Local:InvokeMain) { } if (-not $InnerInvocation) { - Import-Module $PSScriptRoot/../src/common/00-Environment.psm1 -ErrorAction Stop -Global; + Import-Module $PSScriptRoot/../src/common/Environment.psm1 -ErrorAction Stop -Global; } function Invoke-Compile { diff --git a/utils/Generate-Documentation.ps1 b/utils/Generate-Documentation.ps1 index 544390d3..37513ab9 100644 --- a/utils/Generate-Documentation.ps1 +++ b/utils/Generate-Documentation.ps1 @@ -1,4 +1,4 @@ -Import-Module $PSScriptRoot/../src/common/00-Environment.psm1; +Import-Module $PSScriptRoot/../src/common/Environment.psm1; Invoke-RunMain $PSCmdlet { $PSDefaultParameterValues['*:ErrorAction'] = 'Stop'; diff --git a/utils/Invoke-CompileAllScripts.ps1 b/utils/Invoke-CompileAllScripts.ps1 index b009d3ca..df6ba9f0 100644 --- a/utils/Invoke-CompileAllScripts.ps1 +++ b/utils/Invoke-CompileAllScripts.ps1 @@ -44,7 +44,7 @@ function Invoke-EnsureDirectoryStructure { } } -Import-Module $PSScriptRoot/../src/common/00-Environment.psm1; +Import-Module $PSScriptRoot/../src/common/Environment.psm1; Invoke-RunMain $PSCmdlet { $SourceDir = [System.IO.Path]::GetFullPath($SourceDir); $OutputDir = [System.IO.Path]::GetFullPath($OutputDir); diff --git a/utils/Invoke-Linter.ps1 b/utils/Invoke-Linter.ps1 index a92dbc63..93c09282 100644 --- a/utils/Invoke-Linter.ps1 +++ b/utils/Invoke-Linter.ps1 @@ -1,4 +1,4 @@ -Import-Module $PSScriptRoot/../src/common/00-Environment.psm1; +Import-Module $PSScriptRoot/../src/common/Environment.psm1; Invoke-RunMain $PSCommandPath { Invoke-EnsureModule -Modules 'PSScriptAnalyzer'; diff --git a/utils/Invoke-Sandbox.ps1 b/utils/Invoke-Sandbox.ps1 index b80207b4..594154d5 100644 --- a/utils/Invoke-Sandbox.ps1 +++ b/utils/Invoke-Sandbox.ps1 @@ -52,7 +52,7 @@ function Invoke-Sandbox { Remove-Item -Path:$Private:TempSandboxPath; } -Import-Module $PSScriptRoot/../src/common/00-Environment.psm1; +Import-Module $PSScriptRoot/../src/common/Environment.psm1; Invoke-RunMain $MyInvocation { Import-Module "$PSScriptRoot/Compiler.ps1" -Function * -Global; From b67edfc77490f8e74f09abb4444633eb63a7dfd3 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 2 Aug 2024 12:31:43 +1000 Subject: [PATCH 108/341] fix(Compiler): missreporting scoped functions as not available --- src/Compiler/Analyser/Analyser.cs | 4 +++- src/Compiler/AstHelper.cs | 19 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index 3919213e..f3aea4f9 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -62,7 +62,9 @@ public static List FindUndefinedFunctions(CompiledLocalModule module { var calledFunctions = AstHelper.FindCalledFunctions(module.Ast); var availableFunctions = new List(); - availableFunctions.AddRange(AstHelper.FindAvailableFunctions(module.Ast, false).Select(definition => definition.Name)); + availableFunctions.AddRange(AstHelper.FindAvailableFunctions(module.Ast, false).Select(definition => { + return definition.Name.Contains(':') ? definition.Name.Split(':').Last() : definition.Name; + })); availableFunctions.AddRange(availableImports.SelectMany(module => module.GetExportedFunctions())); var combinedFunctions = availableFunctions.Concat(BuiltinsFunctions).ToList(); var unknownCalls = calledFunctions.Where(func => !combinedFunctions.Any(availableFunc => availableFunc == func.GetCommandName())); diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index 052bb42f..634d70df 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -93,15 +93,18 @@ public static Dictionary> FindDeclaredModules public static List FindAvailableFunctions(Ast ast, bool onlyExported) { - // Check for Export-ModuleMember statement, if one exists return only functions listed - // Otherwise return all functions - var allDefinedFunctions = ast.FindAll(testAst => testAst is FunctionDefinitionAst, true).Cast().ToList(); + var allDefinedFunctions = ast + .FindAll(testAst => testAst is FunctionDefinitionAst, true) + .Cast() + .ToList(); - if (ast.Find(testAst => testAst is CommandAst commandAst && commandAst.CommandElements[0].Extent.Text == "Export-ModuleMember", true) is not CommandAst command || !onlyExported) + // If there is no export command or we are not filtering for only exported functions, return all functions. + if (ast.Find(testAst => !onlyExported || testAst is CommandAst commandAst && commandAst.CommandElements[0].Extent.Text == "Export-ModuleMember", true) is not CommandAst command) { return allDefinedFunctions; } + // TODO - Support using * to export all of a type. var wantingToExport = new List<(string, List)>(); var namedParameters = ast.FindAll(testAst => testAst is CommandParameterAst commandParameter && commandParameter.Parent == command, true).Cast().ToList(); foreach (var (namedParameter, index) in namedParameters.Select((value, i) => (value, i))) @@ -124,7 +127,13 @@ public static List FindAvailableFunctions(Ast ast, bool o wantingToExport.Add((namedParameter.ParameterName, objects.Cast().ToList())); } - return allDefinedFunctions.Where(function => wantingToExport.Any(wanting => wanting.Item2.Contains(function.Name))).ToList(); + return allDefinedFunctions + .Where(function => + { + // If the name is scoped to a namespace, remove the namespace. + var name = function.Name.Contains(':') ? function.Name.Split(':').Last() : function.Name; + return wantingToExport.Any(wanting => wanting.Item2.Contains(name)); + }).ToList(); } /// From 1fc2b67ae7afd500ea16a02f8489bdec920d1e09 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 2 Aug 2024 13:22:07 +1000 Subject: [PATCH 109/341] refactor(Compiler): Implement verbosity and quiet flags --- src/Compiler/Program.cs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index d580f050..97933236 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -29,11 +29,11 @@ class Program : IDisposable public class Options { - [Option('v', "verbose", Required = false, HelpText = "Set output to verbose messages.")] - public bool Verbose { get; set; } + [Option('v', "verbosity", FlagCounter = true, HelpText = "Set the verbosity level of the output.")] + public int Verbosity { get; set; } - [Option('d', "debug", Required = false, HelpText = "Set output to debug messages.")] - public bool Debug { get; set; } + [Option('q', "quiet", FlagCounter = true, HelpText = "Silence the Info output.")] + public int Quiet { get; set; } [Option('i', "input", Required = true, HelpText = "Input file to be processed.")] public string? InputFile { get; set; } @@ -47,9 +47,15 @@ public class Options public static void Main(string[] args) { - _ = Parser.Default.ParseArguments(args).WithParsed(opts => + var parser = new Parser(settings => { - IsDebugging = opts.Debug; + settings.GetoptMode = true; + }); + + _ = parser.ParseArguments(args).WithParsed(opts => + { + var logLevel = LogLevel.FromOrdinal(Math.Abs(opts.Quiet - opts.Verbosity + 2)); + IsDebugging = logLevel <= LogLevel.Debug; LogManager.Setup().LoadConfiguration(builder => { @@ -108,9 +114,7 @@ public static void Main(string[] args) } }; - builder.ForLogger().FilterLevels(LogLevel.Info, LogLevel.Fatal).WriteTo(console); - if (opts.Verbose) builder.ForLogger().FilterLevel(LogLevel.Trace).WriteTo(console); - if (opts.Debug) builder.ForLogger().FilterLevel(LogLevel.Debug).WriteTo(console); + if (logLevel != LogLevel.Off) builder.ForLogger().FilterLevels(logLevel, LogLevel.Fatal).WriteTo(console); }); var compiledContent = string.Empty; @@ -125,7 +129,7 @@ public static void Main(string[] args) { Logger.Error("There was an error compiling the script, please see the error below:"); - var printing = opts.Verbose == true ? e.ToString() : e.Message; + var printing = logLevel <= LogLevel.Debug ? e.ToString() : e.Message; Logger.Error(printing); Environment.Exit(1); @@ -147,6 +151,13 @@ public static void OutputToFile(Options options, string content) return; } + var outputPath = Path.GetFullPath(options.OutputFile); + if (!Directory.Exists(Path.GetDirectoryName(outputPath))) + { + Logger.Debug($"Creating directory {Path.GetDirectoryName(outputPath)}"); + Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!); + } + if (File.Exists(options.OutputFile)) { Logger.Info("Output file already exists"); From e0615dbd1bd44e6c8b667b585c8a462a3503521f Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 5 Aug 2024 18:40:44 +1000 Subject: [PATCH 110/341] feat: WIP installer for all script requirements --- utils/Install-Requirements.ps1 | 100 +++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 utils/Install-Requirements.ps1 diff --git a/utils/Install-Requirements.ps1 b/utils/Install-Requirements.ps1 new file mode 100644 index 00000000..2b5cf66c --- /dev/null +++ b/utils/Install-Requirements.ps1 @@ -0,0 +1,100 @@ +Using module ../src/common/Environment.psm1 +Using module ../src/common/Logging.psm1 + +Using namespace System.Management.Automation.Language + +[CmdletBinding()] +param() + +Invoke-RunMain $PSCmdlet { + $AvailableModules = Get-Module -ListAvailable; + $AllFiles = Get-ChildItem -Path '..\' -Recurse -Include *.ps1,*.psm1; + $ModulesToInstall = @(); + + foreach ($File in $AllFiles) { + $Ast = [Parser]::ParseFile($File.FullName, [ref]$null, [ref]$null); + [UsingStatementAst[]]$UsingStatements = $Ast.FindAll({ + param($ast) + + if (-not $ast -is [UsingStatementAst]) { + return $false; + } + [UsingStatementAst]$ast = $ast -as [UsingStatementAst]; + + $ast.UsingStatementKind -eq 'Module' ` + -and $ast.Name.Value -notlike '*.psm1' ` + -and $ast.Name.Value -notlike '*.ps1'; + }, $True); + + # Check if the module is already installed + # If it is check that it meets the version requirements + foreach ($UsingStatement in $UsingStatements) { + $ModuleName = $UsingStatement.Name.Value; + + $InstalledVersions = $AvailableModules | Where-Object { $_.Name -eq $ModuleName } | Select-Object -ExpandProperty Version; + + if ($null -ne $UsingStatement.ModuleSpecification) { + [Version]$RequiredVersion = $UsingStatement.ModuleSpecification.SafeGetValue('RequiredVersion'); + [Version]$MinimumVersion = $UsingStatement.ModuleSpecification.SafeGetValue('MinimumVersion'); + [Version]$MaximumVersion = $UsingStatement.ModuleSpecification.SafeGetValue('MaximumVersion'); + + if ($InstalledVersions) { + if ($RequiredVersion -and $InstalledVersions -notcontains $RequiredVersion) { + $ModulesToInstall += @{ + Name = $ModuleName; + RequiredVersion = $RequiredVersion; + }; + continue; + } + + $MeetsMinimum = $MinimumVersion -and ($InstalledVersions | Where-Object { $_ -ge $MinimumVersion }) -ge 1; + $MeetsMaximum = $MaximumVersion -and ($InstalledVersions | Where-Object { $_ -le $MaximumVersion }) -ge 1; + + if ($MeetsMinimum -and $MeetsMaximum) { + continue; + } + } + + $ModulesToInstall += @{ + Name = $ModuleName; + MinimumVersion = $MinimumVersion; + MaximumVersion = $MaximumVersion; + } + } else { + if ($InstalledVersions) { + continue; + } + + $ModulesToInstall += @{ + Name = $ModuleName; + }; + } + } + + if ($ModulesToInstall) { + $ModulesToInstall | ForEach-Object { + $Name = $_.Name; + $MinimumVersion = $_.MinimumVersion; + $MaximumVersion = $_.MaximumVersion; + $RequiredVersion = $_.RequiredVersion; + + if ($RequiredVersion) { + Invoke-Info "Installing module $Name with version $RequiredVersion"; + Install-Module -Name $Name -RequiredVersion $RequiredVersion -Force -Scope CurrentUser; + return; + } + + $VersionRange = @{}; + if ($MinimumVersion) { + $VersionRange | Add-Member -MemberType NoteProperty -Name 'MinimumVersion' -Value $MinimumVersion; + } + if ($MaximumVersion) { + $VersionRange | Add-Member -MemberType NoteProperty -Name 'MaximumVersion' -Value $MaximumVersion; + } + + Invoke-Info "Installing module $Name with version range $($VersionRange | ConvertTo-Json)"; + Install-Module -Name $Name -Force -Scope CurrentUser @VersionRange; + } + } + } +} From 994162ad4a7005883da3845f45ff62f47035d538 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 5 Aug 2024 18:44:54 +1000 Subject: [PATCH 111/341] chore: migrate for new compiler --- src/automation/Backup-BitLocker.ps1 | 32 +++++---- src/automation/Disable-AdobeUpdater.ps1 | 5 +- src/automation/Disable-FastStartup.ps1 | 5 +- src/automation/Invoke-Expression.ps1 | 4 +- src/automation/Invoke-PackageManager.ps1 | 7 +- src/automation/Invoke-RebootNotice.ps1 | 7 +- src/automation/Invoke-RemoteRunner.ps1 | 59 +++++++-------- src/automation/Remove-Administrators.ps1 | 30 ++++---- src/automation/Set-Wallpaper.ps1 | 30 ++++---- src/automation/Uninstall-Applications.ps1 | 14 +++- src/common/Cache.psm1 | 1 + src/common/Ensure.psm1 | 2 - src/common/Flag.psm1 | 1 + src/common/PackageManager.psm1 | 13 ++-- src/common/Utils.psm1 | 88 +++++++++-------------- src/hudu/Common.psm1 | 5 ++ src/hudu/Database.ps1 | 8 ++- src/hudu/Invoke.ps1 | 62 ---------------- src/hudu/New-ExcelSheet.ps1 | 23 +++--- src/hudu/Update-Entra-Integration.ps1 | 5 ++ src/hudu/Update-Links.ps1 | 8 ++- src/hudu/mod.json | 8 --- src/microsoft/entra/TravelAccess.ps1 | 4 +- src/n-sight/Get-InstalledSoftware.ps1 | 12 ++-- src/n-sight/Invoke-EnvTest.ps1 | 4 +- utils/Generate-Documentation.ps1 | 16 ++--- utils/Invoke-CompileAllScripts.ps1 | 28 +++++--- 27 files changed, 230 insertions(+), 251 deletions(-) delete mode 100644 src/hudu/Invoke.ps1 delete mode 100644 src/hudu/mod.json diff --git a/src/automation/Backup-BitLocker.ps1 b/src/automation/Backup-BitLocker.ps1 index ac31f48e..61cdbe9f 100644 --- a/src/automation/Backup-BitLocker.ps1 +++ b/src/automation/Backup-BitLocker.ps1 @@ -1,35 +1,37 @@ #Requires -Version 5.1 -#Requires -Modules BitLocker -Import-Module $PSScriptRoot/../common/Environment.psm1; -Invoke-RunMain $PSCmdlet { - Invoke-EnsureAdministrator; +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Exit.psm1 +Using module ../common/Ensure.psm1 - #region - Error Codes +Using namespace Microsoft.BitLocker.Structures - $Script:ERROR_BITLOCKER_DISABLED = Register-ExitCode 'BitLocker is not enabled on the system drive.'; - $Script:ERROR_NO_RECOVERY_PASSWORD = Register-ExitCode 'BitLocker is not configured to use a recovery password.'; - $Script:ERROR_DURING_UPLOAD = Register-ExitCode 'An error occurred while uploading the recovery key to Azure AD.'; +#region - Error Codes +$Script:ERROR_BITLOCKER_DISABLED = Register-ExitCode 'BitLocker is not enabled on the system drive.'; +$Script:ERROR_NO_RECOVERY_PASSWORD = Register-ExitCode 'BitLocker is not configured to use a recovery password.'; +$Script:ERROR_DURING_UPLOAD = Register-ExitCode 'An error occurred while uploading the recovery key to Azure AD.'; +#endregion - Error Codes - #endregion - Error Codes +Invoke-RunMain $PSCmdlet { + Invoke-EnsureAdministrator; # Safety: This should never have a null value, as we are using the system drive environment variable. - [Microsoft.BitLocker.Structures.BitLockerVolume]$Local:Volume = Get-BitLockerVolume -MountPoint $env:SystemDrive; - [Microsoft.BitLocker.Structures.BitLockerVolumeKeyProtector]$Local:RecoveryProtector = ($Local:Volume.KeyProtector | Where-Object { $_.KeyProtectorType -eq [Microsoft.BitLocker.Structures.BitLockerVolumeKeyProtectorType]::RecoveryPassword }); + [BitLockerVolume]$Local:Volume = Get-BitLockerVolume -MountPoint $env:SystemDrive; + [BitLockerVolumeKeyProtector]$Local:RecoveryProtector = ($Local:Volume.KeyProtector | Where-Object { $_.KeyProtectorType -eq [Microsoft.BitLocker.Structures.BitLockerVolumeKeyProtectorType]::RecoveryPassword }); if (($Local:Volume.ProtectionStatus -eq 'Off') -or $Local:Volume.KeyProtector.Count -eq 0) { - Invoke-failedExit -ExitCode $Script:ERROR_BITLOCKER_DISABLED; + Invoke-FailedExit -ExitCode $Script:ERROR_BITLOCKER_DISABLED; } if ($null -eq $Local:RecoveryProtector) { - Invoke-failedExit -ExitCode $Script:ERROR_NO_RECOVERY_PASSWORD; + Invoke-FailedExit -ExitCode $Script:ERROR_NO_RECOVERY_PASSWORD; } try { BackupToAAD-BitLockerKeyProtector -MountPoint $env:SystemDrive -KeyProtectorId $Local:RecoveryProtector.KeyProtectorID | Out-Null; Invoke-Info 'BitLocker recovery key successfully backed up to Azure AD.'; - } - catch { + } catch { Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:ERROR_DURING_UPLOAD; } }; diff --git a/src/automation/Disable-AdobeUpdater.ps1 b/src/automation/Disable-AdobeUpdater.ps1 index c2824f74..a6faf043 100644 --- a/src/automation/Disable-AdobeUpdater.ps1 +++ b/src/automation/Disable-AdobeUpdater.ps1 @@ -19,10 +19,13 @@ ``` #> +Using module ../common/Environment.psm1 +Using module ../common/Ensure.psm1 +Using module ../common/Registry.psm1 + [CmdletBinding()] param() -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Disable-FastStartup.ps1 b/src/automation/Disable-FastStartup.ps1 index 38774320..7809c50e 100644 --- a/src/automation/Disable-FastStartup.ps1 +++ b/src/automation/Disable-FastStartup.ps1 @@ -16,7 +16,10 @@ System, Windows, Power, Boot #> -Import-Module $PSScriptRoot/../common/Environment.psm1; +Using module ../common/Environment.psm1 +Using module ../common/Ensure.psm1 +Using module ../common/Registry.psm1 + Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Invoke-Expression.ps1 b/src/automation/Invoke-Expression.ps1 index 047234a1..df645fd5 100644 --- a/src/automation/Invoke-Expression.ps1 +++ b/src/automation/Invoke-Expression.ps1 @@ -1,9 +1,11 @@ +Using module ../common/Environment.psm1 +Using module ../common/Exit.psm1 + Param( [Parameter(Mandatory)] [ScriptBlock]$Expression ) -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { try { & $Expression; diff --git a/src/automation/Invoke-PackageManager.ps1 b/src/automation/Invoke-PackageManager.ps1 index 722c7e6a..a0f2a64e 100644 --- a/src/automation/Invoke-PackageManager.ps1 +++ b/src/automation/Invoke-PackageManager.ps1 @@ -1,3 +1,9 @@ +Using module ../common/Environment.psm1 +Using module ../common/Exit.psm1 +Using module ../common/Ensure.psm1 +Using module ../common/Logging.psm1 +Using module ../common/PackageManager.psm1 + [CmdletBinding(SupportsShouldProcess)] Param( [Parameter(ValueFromRemainingArguments)] @@ -21,7 +27,6 @@ $Script:DefaultPackages = @{ displaylink = {}; } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Invoke-RebootNotice.ps1 b/src/automation/Invoke-RebootNotice.ps1 index 2eb93c89..576fa29b 100644 --- a/src/automation/Invoke-RebootNotice.ps1 +++ b/src/automation/Invoke-RebootNotice.ps1 @@ -24,6 +24,12 @@ Runs the script with a maximum uptime of 1 day instead of the default 7. #> +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Scope.psm1 +Using module ../common/Flag.psm1 +Using module ../common/Exit.psm1 + param( [TimeSpan]$MaxUpTime = [TimeSpan]::FromDays(7) ) @@ -79,7 +85,6 @@ function Get-ShouldRestart { } } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { $Local:RequiresRestart = Get-ShouldRestart; if (-not $Local:RequiresRestart.required) { diff --git a/src/automation/Invoke-RemoteRunner.ps1 b/src/automation/Invoke-RemoteRunner.ps1 index 374ffa77..9861f4ac 100644 --- a/src/automation/Invoke-RemoteRunner.ps1 +++ b/src/automation/Invoke-RemoteRunner.ps1 @@ -1,5 +1,11 @@ #Requires -Version 5.1 +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Scope.psm1 +Using module ../common/Exit.psm1 +Using module ../common/Cache.psm1 + Param( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] @@ -8,10 +14,27 @@ Param( [Parameter(ValueFromRemainingArguments)] [String[]]$Arguments, - [Parameter(HelpMessage="Don't use the cached response, always call the API.")] + [Parameter(HelpMessage = "Don't use the cached response, always call the API.")] [Switch]$NoCache ) + +#region - Error Codes +$Script:FAILED_WRITE = Register-ExitCode 'Failed to write to the file system.'; + +$Script:FAILED_RESPONSE = Register-ExitCode 'Failed to get a response from the API.'; +$Script:FAILED_DOWNLOAD = Register-ExitCode 'There was an issue while downloading the executable.'; + +$Script:FAILED_MISSING_RELEASES = Register-ExitCode 'Unable to find any releases for the repository.'; +$Script:FAILED_MISSING_ARTIFACTS = Register-ExitCode 'Unable to find any artifacts for the current release.'; +$Script:FAILED_MISSING_EXECUTABLE = Register-ExitCode 'Unable to find an executable artifact for the current system.'; + +$Script:FAILED_MISSING_ARCHITECTURE = Register-ExitCode "Unable to find executable to match the current architecture. (${Env:PROCESSOR_ARCHITECTURE})"; +$Script:FAILED_MISSING_OS = Register-ExitCode "Unable to find executable to match the current operating system. (${Env:OS})"; + +$Script:FAILED_EXECUTION = Register-ExitCode 'There was an issue while running the executable.'; +#endregion - Error Codes + function Get-RunnerFolder { begin { Enter-Scope; } end { Exit-Scope -ReturnValue $Local:Folder; } @@ -81,7 +104,7 @@ function Get-CachableResponse { } if (-not (Test-Path -Path $Local:CachePath)) { - Invoke-Verbose "Cache file not found, creating a new one."; + Invoke-Verbose 'Cache file not found, creating a new one.'; [String]$Local:Url = 'https://api.github.com/repos/AMTSupport/tools/releases'; try { $ErrorActionPreference = 'Stop'; @@ -107,7 +130,7 @@ function Get-VersionComparable( end { Exit-Scope -ReturnValue $Local:Concat; } process { - [Int]$Local:Index = $Version.LastIndexOf("-v"); + [Int]$Local:Index = $Version.LastIndexOf('-v'); if ($Local:Index -eq -1) { throw "Failed to get the version comparable for $Local:Version." } @@ -165,19 +188,19 @@ function Get-ExecutableArtifact( #region Setup Variables for finding the correct artifact # Get the Executable Suffix for the current system [String]$Local:Architecture = switch ($Env:PROCESSOR_ARCHITECTURE) { - "AMD64" { "x86_64" } - "x86" { "i686" } + 'AMD64' { 'x86_64' } + 'x86' { 'i686' } default { Invoke-FailedExit -ExitCode $Script:FAILED_MISSING_ARCHITECTURE; } }; # https://github.com/PowerShell/PowerShell/issues/6347#issuecomment-372072077 [Boolean]$Local:IsOSWindows = $env:OS -eq 'Windows_NT' -or $IsWindows; [String]$Local:OperatingSystem = if ($Local:IsOSWindows) { - "windows" + 'windows' } elseif ($IsLinux) { - "linux" + 'linux' } elseif ($IsMacOS) { - "macos" + 'macos' } else { Invoke-FailedExit -ExitCode $Script:FAILED_MISSING_OS; }; @@ -287,27 +310,7 @@ function Invoke-Executable( } } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { - $ErrorActionPreference = 'Stop'; - #region - Error Codes - - $Script:FAILED_WRITE = Register-ExitCode 'Failed to write to the file system.'; - - $Script:FAILED_RESPONSE = Register-ExitCode 'Failed to get a response from the API.'; - $Script:FAILED_DOWNLOAD = Register-ExitCode 'There was an issue while downloading the executable.'; - - $Script:FAILED_MISSING_RELEASES = Register-ExitCode 'Unable to find any releases for the repository.'; - $Script:FAILED_MISSING_ARTIFACTS = Register-ExitCode 'Unable to find any artifacts for the current release.'; - $Script:FAILED_MISSING_EXECUTABLE = Register-ExitCode 'Unable to find an executable artifact for the current system.'; - - $Script:FAILED_MISSING_ARCHITECTURE = Register-ExitCode "Unable to find executable to match the current architecture. (${Env:PROCESSOR_ARCHITECTURE})"; - $Script:FAILED_MISSING_OS = Register-ExitCode "Unable to find executable to match the current operating system. (${Env:OS})"; - - $Script:FAILED_EXECUTION = Register-ExitCode 'There was an issue while running the executable.'; - - #endregion - Error Codes - [PSCustomObject]$Local:LatestRelease = Get-LatestRelease -Program $ProgramName; $Local:Artifact = Get-ExecutableArtifact -Program $ProgramName -Release $Local:LatestRelease; $Local:ExecutablePath = Get-DownloadedExecutable -Artifact $Local:Artifact; diff --git a/src/automation/Remove-Administrators.ps1 b/src/automation/Remove-Administrators.ps1 index 08294c7c..dcf87a5b 100644 --- a/src/automation/Remove-Administrators.ps1 +++ b/src/automation/Remove-Administrators.ps1 @@ -1,5 +1,13 @@ #Requires -Version 5.1 +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Exit.psm1 +Using module ../common/Ensure.psm1 +Using module ../common/Assert.psm1 +Using module ../common/Scope.psm1 +Using module ../common/UsersAndAccounts.psm1 + Param( [Parameter()] [Switch]$NoModify, @@ -52,8 +60,7 @@ function Get-FilteredUsers( (-not $Local:Exception) -or ($Local:Exception.Computers -contains $env:COMPUTERNAME) }; - } - else { + } else { [HashTable[]]$Local:FilteredMembers = $Local:Members; } @@ -165,8 +172,7 @@ function Get-ProcessedExceptions( Name = $Split[1]; Domain = $Split[0]; }; - } - else { + } else { Invoke-Debug "No domain specified for [$Name], using local domain"; return @{ @@ -194,8 +200,7 @@ function Get-ProcessedExceptions( [String[]]$Local:Computers = if ($Local:Split[1].Contains(',')) { $Local:Split[1].Split(','); - } - else { + } else { @($Local:Split[1]) } @@ -205,13 +210,11 @@ function Get-ProcessedExceptions( $Local:Exception | Add-Member -MemberType NoteProperty -Name Computers -Value $Local:Computers; return $Local:Exception; - } - else { + } else { Invoke-Error "Invalid format for exception [$_]"; Invoke-FailedExit -ExitCode 1003; } - } - else { + } else { Invoke-Debug "Exception for [$Local:Exception] is not scoped"; [HashTable]$Local:Exception = Split-NameAndDomain -Name $Local:Exception; @@ -225,12 +228,10 @@ function Get-ProcessedExceptions( } } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { if ($NoModify) { Invoke-Info 'Running in WhatIf mode, no changes will be made.'; - } - else { + } else { Invoke-EnsureAdministrator; } @@ -243,8 +244,7 @@ Invoke-RunMain $PSCmdlet { if ($RemovedAdmins.Count -eq 0 -and $FixedUsers.Count -eq 0) { Invoke-Info 'No accounts modified' - } - else { + } else { foreach ($User in $FixedUsers) { Invoke-Info "Fixed user $($User.Name) by adding them to the Users group" } diff --git a/src/automation/Set-Wallpaper.ps1 b/src/automation/Set-Wallpaper.ps1 index 6ef7b4e8..9d51b2ba 100644 --- a/src/automation/Set-Wallpaper.ps1 +++ b/src/automation/Set-Wallpaper.ps1 @@ -1,3 +1,14 @@ +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Utils.psm1 +Using module ../common/Scope.psm1 +Using module ../common/Registry.psm1 +Using module ../common/Assert.psm1 +Using module ../common/Ensure.psm1 +Using module ../common/Exit.psm1 + +Using module RunAsUser + [CmdletBinding(DefaultParameterSetName = 'Set_Base64')] param( [Parameter(ParameterSetName = 'Set_StorageBlob')] @@ -23,6 +34,7 @@ param( function Invoke-EncodeFromFile { [CmdletBinding()] + [OutputType([String])] param( [Parameter(Mandatory)] [String]$Path @@ -115,8 +127,7 @@ function Get-FromBlob { $Private:Value = if ($Private:Key -eq 'sig') { Invoke-Info "Applying URI encoding to $Private:RawValue..."; [URI]::EscapeDataString($Private:RawValue); - } - else { + } else { Invoke-Info "Decoding $Private:RawValue..."; $Private:RawValue; } @@ -134,8 +145,7 @@ function Get-FromBlob { Invoke-Debug "Response Headers: $Local:ResponseHeaders"; [String]$Local:MD5 = $Local:ResponseHeaders['Content-MD5']; Assert-NotNull -Object:$Local:MD5 -Message:"Failed to get MD5 hash from $Local:Uri"; - } - catch { + } catch { Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:ERROR_INVALID_HEADERS -FormatArgs @($Local:Uri); } @@ -222,17 +232,13 @@ function Update-PerUserSystemParameters { $Local:ScriptBlock = { # For some reason, we need to run this multiple times to get it to work for ($i = 0; $i -lt 50; $i++) { - rundll32.exe user32.dll, UpdatePerUserSystemParameters; + rundll32 user32.dll, UpdatePerUserSystemParameters; } } if (Test-IsRunningAsSystem) { - Install-PackageProvider NuGet -MinimumVersion 2.8.5.201 -Force; - Set-PSRepository PSGallery -InstallationPolicy Trusted; - Invoke-EnsureModule 'RunAsUser'; Invoke-AsCurrentUser -ScriptBlock $Local:ScriptBlock; - } - else { + } else { & $Local:ScriptBlock; } } @@ -253,8 +259,7 @@ function Get-ReusableFile { if ($Local:ExistingFile) { Remove-Item -Path $Path; # Remove the file if it is the same as an existing file. $Path = $Local:ExistingFile; - } - else { + } else { # Enter Loop to ensure unique file name do { [System.IO.DirectoryInfo]$Local:FileName = [IO.Path]::GetFileNameWithoutExtension([System.IO.Path]::GetRandomFileName()) + '.png'; @@ -269,7 +274,6 @@ function Get-ReusableFile { } } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Uninstall-Applications.ps1 b/src/automation/Uninstall-Applications.ps1 index 2b436e3e..c12407e9 100644 --- a/src/automation/Uninstall-Applications.ps1 +++ b/src/automation/Uninstall-Applications.ps1 @@ -1,12 +1,22 @@ +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Utils.psm1 +Using module ../common/Analyser.psm1 + [CmdletBinding(SupportsShouldProcess)] param( [Parameter(Mandatory)] [String[]]$ApplicationName ) -Import-Module $PSScriptRoot/../common/Environment.psm1; +# TODO wmic no longer available on Windows 11 need to find alternative. Invoke-RunMain $PSCmdlet { - $Local:Applications = Get-WmiObject -Class Win32_Product | Select-Object -Property Name,Version; + + if (Test-IsWindows11) { + Invoke-Error 'This script is currently broken due to wmic not being available on Windows 11'; + } + + $Local:Applications = Get-CimInstance -ClassName Win32_Product | Select-Object -Property Name,Version; $Local:LikeApplications = $Local:Applications | Where-Object { $Application = $_; ($ApplicationName | Where-Object { $Application.Name -like $_; }).Count -gt 0; diff --git a/src/common/Cache.psm1 b/src/common/Cache.psm1 index 7d6dcbfa..a3692685 100644 --- a/src/common/Cache.psm1 +++ b/src/common/Cache.psm1 @@ -1,6 +1,7 @@ Using module ./Logging.psm1 Using module ./Scope.psm1 Using module ./Exit.psm1 +Using module ./Utils.psm1 [Int]$Script:FAILED_FOLDER_CREATION = Register-ExitCode 'Failed to create the cache folder.'; [Int]$Script:FAILED_FILE_CREATION = Register-ExitCode 'Failed to create the cache file.'; diff --git a/src/common/Ensure.psm1 b/src/common/Ensure.psm1 index a67c5053..08812668 100644 --- a/src/common/Ensure.psm1 +++ b/src/common/Ensure.psm1 @@ -146,8 +146,6 @@ function Invoke-EnsureModule { end { Exit-Scope; } process { - $ErrorActionPreference = 'Stop'; - if (-not (Test-NetworkConnection)) { Invoke-Warn 'No network connection, some modules may not be installed.'; return; diff --git a/src/common/Flag.psm1 b/src/common/Flag.psm1 index e248a0ce..462441ec 100644 --- a/src/common/Flag.psm1 +++ b/src/common/Flag.psm1 @@ -1,4 +1,5 @@ Using module ./Logging.psm1 +Using module ./Utils.psm1 class Flag { [String][ValidateNotNull()]$Context; diff --git a/src/common/PackageManager.psm1 b/src/common/PackageManager.psm1 index b5ce11bc..c32a9067 100644 --- a/src/common/PackageManager.psm1 +++ b/src/common/PackageManager.psm1 @@ -3,6 +3,7 @@ Using module ./Logging.psm1 Using module ./Scope.psm1 Using module ./Exit.psm1 +Using module ./Utils.psm1 enum PackageManager { Chocolatey @@ -38,6 +39,12 @@ enum PackageManager { [Boolean]$Script:CompletedSetup = $False; function Local:Install-Requirements { + [Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSAvoidUsingInvokeExpression', + Justification = 'Required to install Chocolatey, there is no other way to do this.' + )] + param() + if ($Script:CompletedSetup) { Invoke-Debug 'Setup already completed. Skipping...'; return; @@ -70,8 +77,7 @@ function Local:Install-Requirements { refreshenv | Out-Null; return; - } - else { + } else { Invoke-Warn 'Chocolatey bin not found, deleting folder and reinstalling...'; Remove-Item -Path "$($env:SystemDrive)\ProgramData\chocolatey" -Recurse -Force; } @@ -181,8 +187,7 @@ function Update-ManagedPackage( if ($LASTEXITCODE -ne 0) { throw "Error Code: $LASTEXITCODE"; } - } - catch { + } catch { Invoke-Error "There was an issue while updating $Local:PackageName."; Invoke-Error $_.Exception.Message; } diff --git a/src/common/Utils.psm1 b/src/common/Utils.psm1 index ec766cf8..8ba39f92 100644 --- a/src/common/Utils.psm1 +++ b/src/common/Utils.psm1 @@ -49,21 +49,18 @@ function Get-VarOrSave { if ($Validate.InvokeReturnAsIs($Local:EnvValue)) { Invoke-Debug "Validated environment variable ${VariableName}: $Local:EnvValue"; return $Local:EnvValue; - } - else { + } else { Invoke-Error "Failed to validate environment variable ${VariableName}: $Local:EnvValue"; [Environment]::SetEnvironmentVariable($VariableName, $null, 'Process'); }; - } - catch { + } catch { Invoke-Error " Failed to validate environment variable ${VariableName}: $Local:EnvValue. Due to reason ${$_.Exception.Message}".Trim(); [Environment]::SetEnvironmentVariable($VariableName, $null, 'Process'); } - } - else { + } else { Invoke-Debug "Found environment variable $VariableName with value $Local:EnvValue"; return $Local:EnvValue; } @@ -77,16 +74,13 @@ function Get-VarOrSave { if ($Validate.InvokeReturnAsIs($Local:Value)) { Invoke-Debug "Validated lazy value for environment variable ${VariableName}: $Local:Value"; break; - } - else { + } else { Invoke-Error "Failed to validate lazy value for environment variable ${VariableName}: $Local:Value"; } - } - else { + } else { break; } - } - catch { + } catch { Invoke-Error "Encountered an error while evalutating LazyValue for ${VariableName}."; return $null; } @@ -118,8 +112,7 @@ function Get-Ast { if (Test-Path -LiteralPath $_) { $Local:Path = Resolve-Path -Path $_; [System.Management.Automation.Language.Parser]::ParseFile($Local:Path.ProviderPath, [ref]$null, [ref]$null) - } - else { + } else { [System.Management.Automation.Language.Parser]::ParseInput($_, [ref]$null, [ref]$null) } @@ -198,13 +191,11 @@ function Get-ReturnType { if ($Local:Variable) { [System.Reflection.TypeInfo]$Local:ReturnType = $Local:Variable.GetType(); $Local:ReturnTypes += $Local:ReturnType; - } - else { + } else { Invoke-Warn -Message "Could not resolve the variable: $Local:VariableName."; continue } - } - else { + } else { [System.Reflection.TypeInfo]$Local:ReturnType = $Local:Expression.StaticType; $Local:ReturnTypes += $Local:ReturnType; } @@ -248,11 +239,9 @@ function Test-ReturnType { foreach ($Local:ReturnType in $Local:ReturnTypes) { if ($ValidTypes -contains $Local:ReturnType) { continue; - } - elseif ($AllowNull -and $Local:ReturnType -eq [Void]) { + } elseif ($AllowNull -and $Local:ReturnType -eq [Void]) { continue; - } - else { + } else { Invoke-Warn -Message "The return type of the AST object is not valid. Expected: $($ValidTypes -join ', '); Actual: $($Local:ReturnType.Name)"; return $False; } @@ -288,13 +277,11 @@ function Test-ReturnType { if ($ValidTypes -contains $Local:ReturnType) { continue; } - } - else { + } else { Invoke-Debug -Message "Could not resolve the variable: $Local:VariableName."; continue } - } - else { + } else { [System.Reflection.TypeInfo]$Local:ReturnType = $Local:Expression.StaticType; [String]$Local:TypeName = $Local:ReturnType.Name; @@ -386,8 +373,7 @@ function Install-ModuleFromGitHub { $ErrorActionPreference = 'Stop'; Invoke-RestMethod $Local:ZipballUrl -OutFile $Local:OutFile; - } - catch { + } catch { Invoke-Error "Failed to download $Local:ModuleName from $Local:ZipballUrl to $Local:OutFile"; Invoke-FailedExit -ExitCode 9999 -ErrorRecord $_; } @@ -402,8 +388,7 @@ function Install-ModuleFromGitHub { Invoke-Verbose "Extracting $Local:OutFile to $Local:ExtractDir"; try { Expand-Archive -Path $Local:OutFile -DestinationPath $Local:ExtractDir -Force; - } - catch { + } catch { Invoke-Error "Failed to extract $Local:OutFile to $Local:ExtractDir"; Invoke-FailedExit -ExitCode 9999 -ErrorRecord $_; } @@ -423,22 +408,19 @@ function Install-ModuleFromGitHub { if ([System.Environment]::OSVersion.Platform -eq 'Unix') { [System.IO.FileInfo[]]$Local:ManifestFiles = Get-ChildItem (Join-Path -Path $Local:UnzippedArchive -ChildPath *) -File | Where-Object { $_.Name -like '*.psd1' }; - } - else { + } else { [System.IO.FileInfo[]]$Local:ManifestFiles = Get-ChildItem -Path $Local:UnzippedArchive.FullName -File | Where-Object { $_.Name -like '*.psd1' }; } if ($Local:ManifestFiles.Count -eq 0) { Invoke-Error "No manifest file found in $($Local:UnzippedArchive.FullName)"; Invoke-FailedExit -ExitCode 9999; - } - elseif ($Local:ManifestFiles.Count -gt 1) { + } elseif ($Local:ManifestFiles.Count -gt 1) { Invoke-Debug "Multiple manifest files found in $($Local:UnzippedArchive.FullName)"; Invoke-Debug "Manifest files: $($Local:ManifestFiles.FullName -join ', ')"; [System.IO.FileInfo]$Local:ManifestFile = $Local:ManifestFiles | Where-Object { $_.Name -like "$Local:ModuleName*.psd1" } | Select-Object -First 1; - } - else { + } else { [System.IO.FileInfo]$Local:ManifestFile = $Local:ManifestFiles | Select-Object -First 1; Invoke-Debug "Manifest file: $($Local:ManifestFile.FullName)"; } @@ -455,8 +437,7 @@ function Install-ModuleFromGitHub { if ([System.Environment]::OSVersion.Platform -eq 'Unix') { Copy-Item "$(Join-Path -Path $Local:UnzippedArchive -ChildPath *)" $Local:TargetPath -Force -Recurse | Out-Null; - } - else { + } else { Copy-Item "$Local:SourcePath\*" $Local:TargetPath -Force -Recurse | Out-Null; } @@ -763,20 +744,16 @@ function Wait-Task { $Local:Result = if ($_.PWSH) { try { $_.PWSH.EndInvoke($_) - } - catch { + } catch { #[System.Management.Automation.MethodInvocationException] $_.Exception.InnerException - } - finally { + } finally { $_.PWSH.Dispose() } - } - elseif ($_.IsFaulted) { + } elseif ($_.IsFaulted) { #[System.AggregateException] $_.Exception.InnerException - } - else { + } else { $_.Result } @@ -785,8 +762,7 @@ function Wait-Task { if ($PassThru) { $Local:Out - } - else { + } else { $Local:Out.Result } } @@ -870,8 +846,7 @@ function Start-AsyncTask { if ($null -ne $Local:Run.Input) { $Local:Run.Job = $PWSH.BeginInvoke([System.Management.Automation.PSDataCollection[PSObject]]::new([PSObject[]]($Local:Run.Input))); - } - else { + } else { $Local:Run.Job = $PWSH.BeginInvoke(); } @@ -1009,8 +984,7 @@ function Get-ETag { } return $StringBuilder.ToString(); - } - finally { + } finally { $OpenFile.Close(); } } @@ -1144,8 +1118,7 @@ function Get-ETag { } return $StringBuilder.ToString(); - } - finally { + } finally { $OpenFile.Close(); } } @@ -1208,4 +1181,9 @@ function Compare-FileHashToS3ETag { } } -Export-ModuleMember -Function Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Export-Types, Add-ModuleCallback, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag -Alias await, async, lazy; +function Test-IsWindows11 { + [String]$Private:OSCaption = (Get-CimInstance -Query 'select caption from win32_operatingsystem' | Select-Object -Property Caption).Caption; + return $Private:OSCaption -match 'Windows 11'; +} + +Export-ModuleMember -Function Test-IsWindows11, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Export-Types, Add-ModuleCallback, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag -Alias await, async, lazy; diff --git a/src/hudu/Common.psm1 b/src/hudu/Common.psm1 index 38101549..0c83e683 100644 --- a/src/hudu/Common.psm1 +++ b/src/hudu/Common.psm1 @@ -1,3 +1,8 @@ +Using module ../common/Logging.psm1 +Using module ../common/Scope.psm1 +Using module ../common/Input.psm1 +Using module ../common/Exit.psm1 + function Get-HuduApiKey { begin { Enter-Scope; } end { Exit-Scope; } diff --git a/src/hudu/Database.ps1 b/src/hudu/Database.ps1 index a14f8872..cc090d99 100644 --- a/src/hudu/Database.ps1 +++ b/src/hudu/Database.ps1 @@ -1,3 +1,8 @@ +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Input.psm1 +Using module ./Common.psm1 + [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Update')] Param( [Parameter(ParameterSetName = 'Update')] @@ -54,10 +59,7 @@ function New-HuduDatabase { $Local:Matches | ConvertTo-Json | Out-File -FilePath "$Database"; } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { - Invoke-EnsureModule -Modules "$PSScriptRoot/Common.psm1"; - if ($PSCmdlet.ParameterSetName -eq 'Update') { Invoke-Info "Updating companies" diff --git a/src/hudu/Invoke.ps1 b/src/hudu/Invoke.ps1 deleted file mode 100644 index 2b27f04c..00000000 --- a/src/hudu/Invoke.ps1 +++ /dev/null @@ -1,62 +0,0 @@ -# Function to get Bitwarden entry by name -function Get-BitwardenEntryByName { - param ( - [string]$EntryName - ) - - # Use the Bitwarden CLI to get the entry by name - $entry = bw list items --search "$EntryName" --pretty | ConvertFrom-Json - - # Return the entry - return $entry -} - -# Function to get OnePassword entry by name -function Get-OnePasswordEntryByName { - param ( - [string]$EntryName - ) - - # Use the OnePassword CLI to get the entry by name - $entry = op get item "$EntryName" --session my --output json - - # Return the entry - return $entry -} - -# Function to log in to a tenant and invoke the script block -function Invoke-TenantScriptBlock { - param ( - [string]$TenantName, - [string]$Username, - [string]$Password, - [string]$ScriptBlock - ) - - # Log in to the tenant using a browser - - - # Invoke the script block - Invoke-Command -ScriptBlock $ScriptBlock -} - -# Main script - -# Get all Bitwarden entries that start with "O365 admin" -$bitwardenEntries = Get-BitwardenEntryByName "O365 admin" - -# Loop through each Bitwarden entry -foreach ($entry in $bitwardenEntries) { - # Get the tenant details from the Bitwarden entry - $tenantName = $entry.Name - $username = $entry.Username - - # Get the password from OnePassword using the same name as the Bitwarden entry - $passwordEntry = Get-OnePasswordEntryByName $tenantName - $password = $passwordEntry.details.password - - # Invoke the script block for the tenant - Invoke-TenantScriptBlock -TenantName $tenantName -Username $username -Password $password -ScriptBlock { - # Your script block code goes here - } -} diff --git a/src/hudu/New-ExcelSheet.ps1 b/src/hudu/New-ExcelSheet.ps1 index 76b23162..52c13ce9 100644 --- a/src/hudu/New-ExcelSheet.ps1 +++ b/src/hudu/New-ExcelSheet.ps1 @@ -1,5 +1,12 @@ #Requires -Version 5.1 +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Scope.psm1 +Using module ../common/Ensure.psm1 +Using module ./Common.psm1 +Using module ImportExcel + using namespace OfficeOpenXml; <# @@ -22,11 +29,11 @@ using namespace OfficeOpenXml; Param( [Parameter()] [ValidateNotNullOrEmpty()] - [String]$ApiKey = "", + [String]$ApiKey = '', [Parameter()] [ValidateNotNullOrEmpty()] - [String]$Endpoint = "", + [String]$Endpoint = '', [Parameter()] [ValidateNotNullOrEmpty()] @@ -42,12 +49,12 @@ function New-ExcelPackage { process { [ExcelPackage]$Local:Excel = [ExcelPackage]::new(); - [ExcelWorksheet]$Local:WorkSheet = $Local:Excel.Workbook.Worksheets.Add("Main"); + [ExcelWorksheet]$Local:WorkSheet = $Local:Excel.Workbook.Worksheets.Add('Main'); $Local:WorkSheet.InsertColumn(1, 1); $Local:WorkSheet.InsertRow(1, 1); - $Local:WorkSheet.Cells[1, 1].Value = "Company"; - $Local:WorkSheet.Cells[1, 2].Value = "Type"; + $Local:WorkSheet.Cells[1, 1].Value = 'Company'; + $Local:WorkSheet.Cells[1, 2].Value = 'Type'; return $Local:Excel; } @@ -93,18 +100,16 @@ function Set-Style( #endregion - Excel Functions -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureUser; - Invoke-EnsureModule -Modules 'ImportExcel', "$PSScriptRoot\Common.psm1"; # TODO - This should be imported by compiler in future. [ExcelPackage]$Local:Excel = New-ExcelPackage; [PSCustomObject[]]$Local:Companies = Get-HuduCompanies -Endpoint $Endpoint -OnlyParents; - [ExcelWorksheet]$Local:WorkSheet = $Local:Excel.Workbook.Worksheets["Main"]; + [ExcelWorksheet]$Local:WorkSheet = $Local:Excel.Workbook.Worksheets['Main']; Set-Companies -WorkSheet $Local:WorkSheet -Companies $Local:Companies; Set-Style -WorkSheet $Local:WorkSheet; - $Local:OutputLocation = Join-Path -Path $OutputPath -ChildPath "Companies.xlsx"; + $Local:OutputLocation = Join-Path -Path $OutputPath -ChildPath 'Companies.xlsx'; Close-ExcelPackage $Local:Excel -Show -SaveAs $Local:OutputLocation; }; diff --git a/src/hudu/Update-Entra-Integration.ps1 b/src/hudu/Update-Entra-Integration.ps1 index 83a35839..71d277a4 100644 --- a/src/hudu/Update-Entra-Integration.ps1 +++ b/src/hudu/Update-Entra-Integration.ps1 @@ -1,5 +1,10 @@ #Requires -Version 7.1 +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Input.psm1 +Using module ../common/Utils.psm1 + Param( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] diff --git a/src/hudu/Update-Links.ps1 b/src/hudu/Update-Links.ps1 index 0e4cd0e7..241bb9d8 100644 --- a/src/hudu/Update-Links.ps1 +++ b/src/hudu/Update-Links.ps1 @@ -1,3 +1,8 @@ +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Scope.psm1 +Using module ./Common.psm1 + <# .SYNOPSIS Update all links for users in passwords. @@ -27,7 +32,7 @@ function Update-Links { Invoke-Info "Updating links for user card $UserCardId"; $MatchingPasswordCard = $PasswordCards | Where-Object { - $_. + $_ } } } @@ -53,7 +58,6 @@ function Get-Passwords { } -Import-Module $PSScriptRoot/../src/common/Environment.psm1; Invoke-RunMain $PSCmdlet { [PSCustomObject]$Private:Companies = Get-HuduCompanies -Endpoint:$Private:Endpoint; diff --git a/src/hudu/mod.json b/src/hudu/mod.json deleted file mode 100644 index 6fc269da..00000000 --- a/src/hudu/mod.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/AMTSupport/scripts/master/resources/mod.schema.json", - "exports": [ - { - "name": "" - } - ] -} diff --git a/src/microsoft/entra/TravelAccess.ps1 b/src/microsoft/entra/TravelAccess.ps1 index c3d09e36..2f603a9f 100644 --- a/src/microsoft/entra/TravelAccess.ps1 +++ b/src/microsoft/entra/TravelAccess.ps1 @@ -1,10 +1,8 @@ #Requires -Version 5.1 -Import-Module ../common/Environment.psm1; +Using module ../common/Environment.psm1 Invoke-RunMain $PSCmdlet { - Write-Host "Hello, World!" - # Sign into EntraID # Ensure that the "Travel Access" Group exists, if not create it. diff --git a/src/n-sight/Get-InstalledSoftware.ps1 b/src/n-sight/Get-InstalledSoftware.ps1 index 453b56bf..9073df63 100644 --- a/src/n-sight/Get-InstalledSoftware.ps1 +++ b/src/n-sight/Get-InstalledSoftware.ps1 @@ -1,3 +1,8 @@ +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Scope.psm1 +Using module ImportExcel + [CmdletBinding()] param ( [String]$Endpoint = 'system-monitor.com', @@ -142,11 +147,11 @@ function Out-ToExcel { # We should also have a matrix called data which is indexed by the row then by the column, # We should not have any rows longer than the header length. if (-not $Local:Headers -or -not $Local:Matrix) { - throw "Invalid data structure. Please ensure the object has headers and rows properties."; + throw 'Invalid data structure. Please ensure the object has headers and rows properties.'; } if (-not $Local:Headers -is [Array] -or -not $Local:Matrix -is [System.Collections.Generic.List[System.Object]]) { - throw "Invalid data structure. Please ensure the headers and rows properties are arrays."; + throw 'Invalid data structure. Please ensure the headers and rows properties are arrays.'; } #endregion @@ -191,10 +196,7 @@ function Out-ToExcel { } } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { - Invoke-EnsureModule -Modules 'ImportExcel'; - if (-not (Get-Variable Clients -Scope Global)) { Invoke-Debug 'Creating global clients variable.'; $Local:Clients = @{ }; diff --git a/src/n-sight/Invoke-EnvTest.ps1 b/src/n-sight/Invoke-EnvTest.ps1 index 30d56e87..62a578f6 100644 --- a/src/n-sight/Invoke-EnvTest.ps1 +++ b/src/n-sight/Invoke-EnvTest.ps1 @@ -3,7 +3,9 @@ Used to print environment variables and other information within a N-Able ScriptRunner environment. #> -Import-Module $PSScriptRoot/../common/Environment.psm1; +Using module ../common/Environment.psm1 +Using module ../common/Logging.psm1 + Invoke-RunMain $PSCmdlet { Invoke-Info 'Printing environment variables...' [Object[]]$Local:EnvironmentVariables = Get-ChildItem -Path 'env:'; diff --git a/utils/Generate-Documentation.ps1 b/utils/Generate-Documentation.ps1 index 37513ab9..3b32a237 100644 --- a/utils/Generate-Documentation.ps1 +++ b/utils/Generate-Documentation.ps1 @@ -1,10 +1,10 @@ -Import-Module $PSScriptRoot/../src/common/Environment.psm1; -Invoke-RunMain $PSCmdlet { - $PSDefaultParameterValues['*:ErrorAction'] = 'Stop'; +Using module ../src/common/Environment.psm1 +Using module ../src/common/Logging.psm1 +Using module Alt3.Docusaurus.Powershell +Using module PlatyPS - Set-StrictMode -Version Latest; +Invoke-RunMain $PSCmdlet { Push-Location -Path $PSScriptRoot; - Invoke-EnsureModule -Modules @('Alt3.Docusaurus.Powershell', 'PlatyPS'); # ----------------------------------------------------------------------------- # Use below settings to manipulate the rendered MDX files @@ -41,8 +41,7 @@ Invoke-RunMain $PSCmdlet { Invoke-Info "Generating new MDX files for module: $($Local:Module.BaseName) in $Local:Parents"; try { New-DocusaurusHelp @Local:ModuleDocusaurusOptions; - } - catch { + } catch { Invoke-Error "Failed to generate MDX files for module: $($Local:Module.BaseName) in $Local:Parents"; } @@ -63,8 +62,7 @@ Invoke-RunMain $PSCmdlet { Invoke-Info "Generating new MDX files for script: $($Local:Script.BaseName) in $Local:Parents"; try { New-DocusaurusHelp @Local:ScriptDocusaurusOptions; - } - catch { + } catch { Invoke-Error "Failed to generate MDX files for script: $($Local:Script.BaseName) in $Local:Parents"; } diff --git a/utils/Invoke-CompileAllScripts.ps1 b/utils/Invoke-CompileAllScripts.ps1 index df6ba9f0..3267fef0 100644 --- a/utils/Invoke-CompileAllScripts.ps1 +++ b/utils/Invoke-CompileAllScripts.ps1 @@ -1,5 +1,9 @@ #Requires -Version 7.1 +Using module ../src/common/Environment.psm1 +Using module ../src/common/Logging.psm1 +Using module ../src/common/Exit.psm1 + [CmdletBinding(SupportsShouldProcess)] param ( [Parameter(HelpMessage = 'This directory to source scripts from.')] @@ -10,10 +14,9 @@ param ( [Parameter(DontShow, HelpMessage = 'The compiler scripts location.')] [ValidateScript({ Test-Path -Path $_ -PathType Leaf })] - [String]$CompilerScript = "$PSScriptRoot/Compiler.ps1" + [String]$Compiler = "$PSScriptRoot/Compiler.ps1" ) -# Function to create directory structure function Invoke-EnsureDirectoryStructure { param ( [Parameter(Mandatory)] @@ -44,28 +47,33 @@ function Invoke-EnsureDirectoryStructure { } } -Import-Module $PSScriptRoot/../src/common/Environment.psm1; Invoke-RunMain $PSCmdlet { - $SourceDir = [System.IO.Path]::GetFullPath($SourceDir); - $OutputDir = [System.IO.Path]::GetFullPath($OutputDir); Invoke-Info "Compiling scripts from $SourceDir to $OutputDir"; + $Errors = @(); [Object[]]$Local:Items = Get-ChildItem -Path $SourceDir -Recurse -Filter '*.ps1' -Depth 9 -File; - $Local:Items | ForEach-Object { - $Local:Item = $_; + foreach ($Local:Item in $Local:Items) { [String]$Local:Content = Get-Content -Path $Local:Item.FullName; if (($Local:Content.Length -eq 0) -or (Select-String -InputObject $Local:Content -Pattern '^\s*#.*@compile-ignore')) { Invoke-Info "Ignoring $($Local:Item.FullName)"; - return; + continue; } Invoke-Info "Compiling $($Local:Item.FullName)"; - # Get the relative path of the file [String]$Local:RelativePath = $Local:Item.DirectoryName.Substring((Get-Item $SourceDir).FullName.Length).TrimStart('\'); [String]$Local:OutputFolderPath = Join-Path $OutputDir $Local:RelativePath; + [String]$Local:OutputFilePath = Join-Path $Local:OutputFolderPath $Local:Item.Name; Invoke-EnsureDirectoryStructure -SourcePath $SourceDir -TargetBasePath $OutputDir -CurrentPath ($Local:Item.FullName | Split-Path -Parent); - & $CompilerScript -CompileScript:$Local:Item.FullName -Output:$Local:OutputFolderPath -Force -InnerInvocation; + $Result = Start-Process ` + -FilePath $Compiler ` + -ArgumentList "--input ""$($Local:Item.FullName)"" --output ""$Local:OutputFilePath"" --force $($VerbosePreference -eq 'Continue' ? '--verbose' : '') $($DebugPreference -eq 'Continue' ? '--debug' : '')" ` + -Wait -NoNewWindow -PassThru; + + if ($Result.ExitCode -ne 0) { + Invoke-Error "Failed to compile $($Local:Item.FullName)"; + return; + } } } From 857b1f2eb054dbfd4a91a0171b2c461c34e8dc27 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 5 Aug 2024 18:46:50 +1000 Subject: [PATCH 112/341] refactor(Compiler): a little bit of cleaning --- src/Compiler/Compiler.csproj | 1 - src/Compiler/Module/Compiled/Script.cs | 19 ------------------- src/Compiler/Module/Resolvable/Remote.cs | 5 +---- 3 files changed, 1 insertion(+), 24 deletions(-) diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 47eff437..e4e55298 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -67,7 +67,6 @@ - diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 065411db..84bb1586 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -8,7 +8,6 @@ using NLog; using QuikGraph; using QuikGraph.Algorithms; -using QuikGraph.Graphviz; namespace Compiler.Module.Compiled; @@ -28,16 +27,6 @@ public CompiledScript( RequirementGroup requirements ) : base(moduleSpec, CompiledDocument.FromBuilder(editor, 0), requirements) { - var graphviz = resolvableParent.Graph.ToGraphviz(alg => - { - alg.FormatVertex += (sender, args) => - { - args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; - }; - }); - Logger.Debug("Initial graphviz:"); - Logger.Debug(graphviz); - ScriptParamBlock = scriptParamBlock; Graph = new BidirectionalGraph>(); Graph.AddVertex(this); @@ -55,7 +44,6 @@ RequirementGroup requirements var compiledRequirements = resolvableParent.Graph .OutEdges(resolvable) - .AsParallel() .Select(edge => { try @@ -84,13 +72,6 @@ RequirementGroup requirements edge.Target.Parents.Add(edge.Source); }); - graphviz = Graph.ToGraphviz(alg => - { - alg.FormatVertex += (sender, args) => args.VertexFormat.Label = args.Vertex.GetNameHash(); - }); - Logger.Debug("Compiled graphviz:"); - Logger.Debug(graphviz); - Logger.Trace("Analyzing compiled modules."); Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 1939bec0..fc558c3e 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -149,10 +149,7 @@ public string CacheResult() if (pwsh.HadErrors) { - Logger.Error($"Failed to download module {ModuleSpec.Name} from the PowerShell Gallery."); - pwsh.Streams.Error.ToList().ForEach(error => Logger.Error(error)); - - throw new Exception("Failed to download module from the PowerShell Gallery."); + throw new Exception("Failed to download module from the PowerShell Gallery.", pwsh.Streams.Error[0]?.Exception); } var returnedResult = result.First().ToString(); From 3e462344d11a97e69e6de098d1befe135be575ed Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 5 Aug 2024 19:06:21 +1000 Subject: [PATCH 113/341] feat(Compiler): Analyser rules & Multi File Compiling * Allow the Input to be of a Directory in which case it will compile all scripts in parallel (No sharing of compiled modules between then yet) * Moduler Analyser rule system with supressions for rules in a scriptblock scope by being applied to the param block. --- .vscode/launch.json | 9 +- .vscode/settings.json | 6 +- src/Compiler/Analyser/Analyser.cs | 67 +--- src/Compiler/Analyser/Issue.cs | 37 ++ src/Compiler/Analyser/Rules/Rule.cs | 26 ++ src/Compiler/Analyser/Rules/RuleVisitor.cs | 69 ++++ .../Analyser/Rules/UseOfUndefinedFunction.cs | 80 +++++ src/Compiler/Analyser/Supression.cs | 7 + src/Compiler/AstHelper.cs | 40 ++- src/Compiler/Module/Compiled/Script.cs | 2 +- src/Compiler/Module/Resolvable/Remote.cs | 1 + src/Compiler/Program.cs | 328 ++++++++++++------ src/automation/Uninstall-Applications.ps1 | 6 + src/common/Analyser.psm1 | 22 ++ 14 files changed, 531 insertions(+), 169 deletions(-) create mode 100644 src/Compiler/Analyser/Issue.cs create mode 100644 src/Compiler/Analyser/Rules/Rule.cs create mode 100644 src/Compiler/Analyser/Rules/RuleVisitor.cs create mode 100644 src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs create mode 100644 src/Compiler/Analyser/Supression.cs create mode 100644 src/common/Analyser.psm1 diff --git a/.vscode/launch.json b/.vscode/launch.json index a4270ec4..95039f8b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -36,14 +36,7 @@ "request": "launch", "preLaunchTask": "build", "program": "${workspaceFolder}/Output/Debug/Compiler.dll", - "args": [ - "-i", - ".\\resources\\test.ps1", - "-v", - "-o", - "test.ps1", - "-f" - ], + "args": ["-i", ".\\src\\automation\\", "-vvv", "-o", ".\\", "-f"], "cwd": "${workspaceFolder}", "console": "internalConsole", "stopAtEntry": false, diff --git a/.vscode/settings.json b/.vscode/settings.json index cac69abc..10076913 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,5 +17,9 @@ "poshProTools.ignoredPaths": "compiled", "pester.testFilePath": ["tests/*.[tT]ests.[pP][sS]1"], "markiscodecoverage.searchCriteria": "tests\\Compiler\\Coverage/coverage.info", - "markiscodecoverage.enableDecorations": true + "markiscodecoverage.enableDecorations": true, + "poshProTools.disableNewsNotification": true, + "poshProTools.toolbar.formDesigner": false, + "poshProTools.toolbar.packageAsExecutable": false, + "poshProTools.toolbar.quickScripts": false } diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index f3aea4f9..33978a24 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -1,74 +1,23 @@ -using System.Management.Automation; -using System.Management.Automation.Language; +using Compiler.Analyser.Rules; using Compiler.Module.Compiled; using NLog; namespace Compiler.Analyser; -public static class StaticAnalyser +public static class Analyser { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - /// - /// A list of all the built-in functions that are provided in a standard session. - /// This includes modules that are imported by default. - /// - private static readonly IEnumerable BuiltinsFunctions = GetDefaultSessionFunctions(); + private static readonly IEnumerable Rules = [ + new UseOfUndefinedFunction() + ]; public static void Analyse(CompiledLocalModule module, IEnumerable availableImports) { Logger.Trace($"Analyzing module {module.ModuleSpec.Name}"); - var undefinedFunctions = FindUndefinedFunctions(module, availableImports); - if (undefinedFunctions.Count > 0) - { - foreach (var undefinedFunction in undefinedFunctions) - { - AstHelper.PrintPrettyAstError(undefinedFunction.CommandElements[0].Extent, undefinedFunction, "Undefined function found in module."); - } - - throw new Exception("Undefined functions found in module."); - } - } - - - /// - /// Get all functions which should always be available in a session. - /// This will collect the builtin functions of powershell, - /// as-well as the functions from modules in the compiling hosts C:\Windows\system32\WindowsPowerShell\v1.0\Modules path. - /// - public static IEnumerable GetDefaultSessionFunctions() - { - var defaultFunctions = new List(); - var pwsh = PowerShell.Create(); - pwsh.Runspace.SessionStateProxy.LanguageMode = PSLanguageMode.FullLanguage; - defaultFunctions.AddRange(PowerShell.Create().Runspace.SessionStateProxy.InvokeCommand - .GetCommands("*", CommandTypes.Function | CommandTypes.Alias | CommandTypes.Cmdlet, true) - .Select(command => command.Name)); - - var modulesPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "WindowsPowerShell", "v1.0", "Modules"); - var moduleDirectories = Directory.GetDirectories(modulesPath); - var ps = PowerShell.Create().AddScript(/*ps1*/ $$""" - $env:PSModulePath = '{{modulesPath}}'; - $env:Path = 'C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;'; - $PSModuleAutoLoadingPreference = 'All'; - Get-Command * | Select-Object -ExpandProperty Name - """).Invoke(); - defaultFunctions.AddRange(ps.Select(commandName => ((string)commandName.BaseObject).Replace(".exe", ""))); - return defaultFunctions.Distinct(); - } - - public static List FindUndefinedFunctions(CompiledLocalModule module, IEnumerable availableImports) - { - var calledFunctions = AstHelper.FindCalledFunctions(module.Ast); - var availableFunctions = new List(); - availableFunctions.AddRange(AstHelper.FindAvailableFunctions(module.Ast, false).Select(definition => { - return definition.Name.Contains(':') ? definition.Name.Split(':').Last() : definition.Name; - })); - availableFunctions.AddRange(availableImports.SelectMany(module => module.GetExportedFunctions())); - var combinedFunctions = availableFunctions.Concat(BuiltinsFunctions).ToList(); - var unknownCalls = calledFunctions.Where(func => !combinedFunctions.Any(availableFunc => availableFunc == func.GetCommandName())); - - return unknownCalls.ToList(); + var visitor = new RuleVisitor(Rules, availableImports); + module.Ast.Visit(visitor); + visitor.Issues.ForEach(Program.Issues.Add); } } diff --git a/src/Compiler/Analyser/Issue.cs b/src/Compiler/Analyser/Issue.cs new file mode 100644 index 00000000..d0f8ebde --- /dev/null +++ b/src/Compiler/Analyser/Issue.cs @@ -0,0 +1,37 @@ +using System.Management.Automation.Language; + +namespace Compiler.Analyser; + +public record Issue( + IssueSeverity Severity, + string Message, + IScriptExtent Extent, + Ast Parent +) +{ + public void Print() + { + AstHelper.PrintPrettyAstError(Extent, Parent, Message); + } +} + +public sealed class IssueException( + string message, + IScriptExtent extent, + Ast parent, + Exception? inner) : Exception(message, inner) +{ + public readonly Issue Issue = new(IssueSeverity.Error, message, extent, parent); + + public IssueException( + string message, + IScriptExtent extent, + Ast parent) : this(message, extent, parent, null) { } +} + +public enum IssueSeverity +{ + Error, + Warning +} + diff --git a/src/Compiler/Analyser/Rules/Rule.cs b/src/Compiler/Analyser/Rules/Rule.cs new file mode 100644 index 00000000..24a7c983 --- /dev/null +++ b/src/Compiler/Analyser/Rules/Rule.cs @@ -0,0 +1,26 @@ +using System.Management.Automation.Language; +using Compiler.Module.Compiled; + +namespace Compiler.Analyser.Rules; + +public abstract class Rule +{ + /// + /// Determines if the rule should be processed for this Ast node. + /// + /// + /// A list of suppressions that are relevant to this rule. + /// + /// + /// True if the rule should be processed, false otherwise. + /// + public abstract bool ShouldProcess( + Ast node, + IEnumerable supressions + ); + + public abstract IEnumerable Analyse( + Ast node, + IEnumerable imports + ); +} diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs new file mode 100644 index 00000000..fea13039 --- /dev/null +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -0,0 +1,69 @@ +using System.Management.Automation.Language; +using Compiler.Module.Compiled; + +namespace Compiler.Analyser.Rules; + +public sealed class RuleVisitor( + IEnumerable rules, + IEnumerable imports) : AstVisitor +{ + private readonly IEnumerable _rules = rules; + private readonly IEnumerable _imports = imports; + + public readonly List Issues = []; + + public override AstVisitAction DefaultVisit(Ast ast) + { + var supressions = GetSupressions(ast); + foreach (var rule in _rules) + { + if (!rule.ShouldProcess(ast, supressions)) continue; + Issues.AddRange(rule.Analyse(ast, _imports)); + } + + return AstVisitAction.Continue; + } + + public IEnumerable GetSupressions(Ast ast) + { + var paramBlock = AstHelper.FindClosestParamBlock(ast); + if (paramBlock == null) yield break; + + foreach (var attribute in paramBlock.Attributes) + { + if (attribute.TypeName.Name != "SuppressAnalyser") continue; + + var justification = string.Empty; + Type? type = null; + object? data = null; + + foreach (var arg in attribute.NamedArguments) + { + var lowerArgName = arg.ArgumentName.ToLower(); + if (lowerArgName == "justification") + { + justification = (string)arg.Argument.SafeGetValue(); + continue; + } + + if (lowerArgName == "checktype") + { + type = _rules.First(rule => rule.GetType().Name == (string)arg.Argument.SafeGetValue()).GetType(); + continue; + } + + if (lowerArgName == "data") + { + data = arg.Argument.SafeGetValue(); + continue; + } + + throw new NotImplementedException($"Unknown argument {arg.ArgumentName}/{lowerArgName}"); + } + + if (type == null) throw new NotImplementedException("Type is required for a suppression"); + + yield return new Supression(justification, type, data); + } + } +} diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs new file mode 100644 index 00000000..b380179a --- /dev/null +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -0,0 +1,80 @@ +using System.Management.Automation; +using System.Management.Automation.Language; +using Compiler.Module.Compiled; + +namespace Compiler.Analyser.Rules; + +public class UseOfUndefinedFunction : Rule +{ + /// + /// A list of all the built-in functions that are provided in a standard session. + /// This includes modules that are imported by default. + /// + private static readonly IEnumerable BuiltinsFunctions = GetDefaultSessionFunctions(); + + public override bool ShouldProcess( + Ast node, + IEnumerable supressions) + { + if (node is not CommandAst commandAst) return false; + if (commandAst.GetCommandName() == null) return false; + var callName = SanatiseName(commandAst.GetCommandName()); + + return !supressions.Any(supression => (string)supression.Data! == callName); + } + + public override IEnumerable Analyse( + Ast node, + IEnumerable imports) + { + var commandAst = (CommandAst)node; + var callName = SanatiseName(commandAst.GetCommandName()); + if (BuiltinsFunctions.Contains(callName)) yield break; + if (AstHelper.FindAvailableFunctions(AstHelper.FindRoot(node), false).Select(definition => SanatiseName(definition.Name)).Any(name => name == callName)) yield break; + if (imports.Any(module => module.GetExportedFunctions().Contains(callName))) yield break; + + yield return new Issue( + IssueSeverity.Warning, + $"Undefined function '{callName}'", + commandAst.CommandElements[0].Extent, + commandAst + ); + } + + public static string SanatiseName(string name) + { + var withOutExtension = name.Contains('.') ? name.Split('.').First() : name; + var withoutScope = withOutExtension.Contains(':') ? withOutExtension.Split(':').Last() : withOutExtension; + + return withoutScope; + } + + /// + /// Get all functions which should always be available in a session. + /// This will collect the following: + /// + /// - Builtin functions of powershell + /// - Functions from modules in the compiling hosts C:\Windows\system32\WindowsPowerShell\v1.0\Modules path. + /// - Executables in the system32 directory. + /// - A few manual inclusions to cover some edge cases. + /// + /// + public static IEnumerable GetDefaultSessionFunctions() + { + var defaultFunctions = new List(); + defaultFunctions.AddRange(PowerShell.Create().Runspace.SessionStateProxy.InvokeCommand + .GetCommands("*", CommandTypes.Application | CommandTypes.Function | CommandTypes.Alias | CommandTypes.Cmdlet, true) + .Select(command => command.Name)); + + var modulesPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "WindowsPowerShell", "v1.0", "Modules"); + var moduleDirectories = Directory.GetDirectories(modulesPath); + var ps = PowerShell.Create().AddScript(/*ps1*/ $$""" + $env:PSModulePath = '{{modulesPath}}'; + $env:Path = "${env:SystemRoot}\system32;${env:SystemRoot};${env:SystemRoot}\System32\Wbem;${env:SystemRoot}\System32\WindowsPowerShell\v1.0\;"; + $PSModuleAutoLoadingPreference = 'All'; + Get-Command * | Select-Object -ExpandProperty Name + """).Invoke(); + defaultFunctions.AddRange(ps.Select(commandName => ((string)commandName.BaseObject).Replace(".exe", ""))); + return defaultFunctions.Distinct(); + } +} diff --git a/src/Compiler/Analyser/Supression.cs b/src/Compiler/Analyser/Supression.cs new file mode 100644 index 00000000..4f7313d1 --- /dev/null +++ b/src/Compiler/Analyser/Supression.cs @@ -0,0 +1,7 @@ +namespace Compiler.Analyser; + +public record Supression( + string Justification, + Type Type, + object? Data +); diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index 634d70df..1fd0ee0c 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using System.Management.Automation; using System.Management.Automation.Language; using System.Text; using CommandLine; @@ -160,8 +161,19 @@ public static ScriptBlockAst GetAstReportingErrors( if (parserErrors.Length != 0) { - Logger.Error($"There was an issue while parsing {filePath}, {parserErrors.Length} errors were found."); - parserErrors.ToList().ForEach(error => PrintPrettyAstError(error.Extent, ast, error.Message)); + foreach (var error in parserErrors) + { + Program.Issues.Add( + new Analyser.Issue( + Analyser.IssueSeverity.Error, + error.Message, + error.Extent, + ast + ) + ); + } + + throw new ParseException($"Failed to parse {filePath}, encountered {parserErrors.Length} errors."); } return ast; @@ -235,4 +247,28 @@ public static void PrintPrettyAstError( {firstColumnIndentString}{colouredPipe} {message.Pastel(ConsoleColor.DarkRed)} """); } + + public static ParamBlockAst? FindClosestParamBlock(Ast ast) + { + ParamBlockAst? foundParamBlock = null; + var parent = ast; + while (parent.Parent != null && foundParamBlock is null) + { + if (parent is ScriptBlockAst scriptBlock && scriptBlock.ParamBlock != null) foundParamBlock = scriptBlock.ParamBlock; + parent = parent.Parent; + } + + return foundParamBlock; + } + + public static Ast FindRoot(Ast ast) + { + var parent = ast; + while (parent.Parent != null) + { + parent = parent.Parent; + } + + return parent; + } } diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 84bb1586..f10a21e1 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -76,7 +76,7 @@ RequirementGroup requirements Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { var imports = Graph.OutEdges(compiled).Select(edge => edge.Target); - StaticAnalyser.Analyse((CompiledLocalModule)compiled, [.. imports]); + Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports]); }); } diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index fc558c3e..ef792332 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -1,6 +1,7 @@ using System.Collections; using System.IO.Compression; using System.Management.Automation; +using Compiler.Analyser; using Compiler.Module.Compiled; using Compiler.Requirements; using NLog; diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 97933236..4cb52af5 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -1,19 +1,26 @@ +using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.Management.Automation; using System.Management.Automation.Runspaces; using System.Text; using CommandLine; +using Compiler.Analyser; +using Compiler.Module.Compiled; using Compiler.Module.Resolvable; using Compiler.Requirements; using NLog; using NLog.Targets; -class Program : IDisposable +class Program { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); internal static bool IsDebugging; + internal static readonly ConcurrentBag Issues = []; + + internal static readonly CancellationTokenSource CancelSource = new(); + public static readonly Lazy RunspacePool = new(() => { var sessionState = InitialSessionState.CreateDefault2(); @@ -35,11 +42,14 @@ public class Options [Option('q', "quiet", FlagCounter = true, HelpText = "Silence the Info output.")] public int Quiet { get; set; } - [Option('i', "input", Required = true, HelpText = "Input file to be processed.")] - public string? InputFile { get; set; } + [Option('i', "input", Required = true, HelpText = "Input file or directory to be processed.")] + public string? Input { get; set; } [Option('o', "output", Required = false, HelpText = "Output file to be written.")] - public string? OutputFile { get; set; } + public string? Output { get; set; } + + [Option("fail-fast", Required = false, HelpText = "Fail fast on error.")] + public bool FailFast { get; set; } [Option('f', "force", Required = false, HelpText = "Force overwrite of output file.")] public bool Force { get; set; } @@ -52,120 +62,234 @@ public static void Main(string[] args) settings.GetoptMode = true; }); - _ = parser.ParseArguments(args).WithParsed(opts => + + _ = parser.ParseArguments(args).WithParsed(async opts => { - var logLevel = LogLevel.FromOrdinal(Math.Abs(opts.Quiet - opts.Verbosity + 2)); - IsDebugging = logLevel <= LogLevel.Debug; + CleanInput(opts); + IsDebugging = SetupLogger(opts) <= LogLevel.Debug; + + ConcurrentBag<(string, Exception)> compilerErrors = []; + // TODO - Super parent, Submit completed scripts so they can be resolved by other scripts + CancelSource.Token.Register(() => Logger.Error("Compilation was cancelled.")); + var compilerTask = Parallel.ForEachAsync( + GetFilesToCompile(opts.Input!), + CancelSource.Token, + async (script, ct) => + { + var compiledScript = await CompileScript(script, compilerErrors, ct); + if (compiledScript == null && opts.FailFast) { CancelSource.Cancel(); } + if (compiledScript == null) return; + OutputToFile( + opts.Output, + Path.ChangeExtension(compiledScript.ModuleSpec.Name, "ps1"), + compiledScript.GetPowerShellObject(), + opts.Force + ); + Logger.Debug($"Compiled {script}"); + } + ); - LogManager.Setup().LoadConfiguration(builder => + do { - var console = new ColoredConsoleTarget("console") + if (compilerTask.Status == TaskStatus.Canceled || compilerTask.Status == TaskStatus.Canceled || !compilerErrors.IsEmpty) { - Layout = "${pad:padding=5:inner=${level:uppercase=true}}|${message}", - DetectConsoleAvailable = true, - EnableAnsiOutput = true, - RowHighlightingRules = { - new() { - Condition = "level == LogLevel.Fatal", - ForegroundColor = ConsoleOutputColor.Red, - }, - new() { - Condition = "level == LogLevel.Error", - ForegroundColor = ConsoleOutputColor.DarkRed - }, - new() { - Condition = "level == LogLevel.Warn", - ForegroundColor = ConsoleOutputColor.Yellow - }, - new() { - Condition = "level == LogLevel.Info", - ForegroundColor = ConsoleOutputColor.Gray - }, - new() { - Condition = "level == LogLevel.Debug", - ForegroundColor = ConsoleOutputColor.DarkMagenta - }, - new() { - Condition = "level == LogLevel.Trace", - ForegroundColor = ConsoleOutputColor.DarkGray - } - }, - WordHighlightingRules = { - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:error|exception|fail|fatal|warn|warning)\\b", - ForegroundColor = ConsoleOutputColor.DarkRed - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:info|log|message|success)\\b", - ForegroundColor = ConsoleOutputColor.Green - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:debug)\\b", - ForegroundColor = ConsoleOutputColor.Blue - }, - new ConsoleWordHighlightingRule - { - Regex = "\\b(?:trace)\\b", - ForegroundColor = ConsoleOutputColor.Gray - } + await CancelSource.CancelAsync(); + LogManager.Flush(); + + Logger.Error("There was an error compiling the script, please see the errors below:"); + if (compilerTask.Exception != null) + { + Logger.Error(compilerTask.Exception.Message); + } + + foreach (var (scriptPath, e) in compilerErrors) + { + Logger.Error($"Error compiling script {scriptPath}"); + var printing = IsDebugging ? e.ToString() : e.Message; + Logger.Error(printing); } - }; - if (logLevel != LogLevel.Off) builder.ForLogger().FilterLevels(logLevel, LogLevel.Fatal).WriteTo(console); - }); + break; + } - var compiledContent = string.Empty; - try + Task.Delay(25).Wait(); + } while (compilerTask.Status != TaskStatus.RanToCompletion); + }).WithNotParsed(errors => + { + Console.Error.WriteLine("There was an error parsing the command line arguments."); + foreach (var err in errors) { - var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(opts.InputFile!)); - var resolvableScript = new ResolvableScript(pathedModuleSpec); - var compiledScript = resolvableScript.IntoCompiled(); - compiledContent = compiledScript.GetPowerShellObject(); + Console.Error.WriteLine(err); } - catch (Exception e) - { - Logger.Error("There was an error compiling the script, please see the error below:"); + errors.Output(); + Environment.Exit(1); + }); - var printing = logLevel <= LogLevel.Debug ? e.ToString() : e.Message; - Logger.Error(printing); + if (!Issues.IsEmpty) + { + Logger.Warn("There were issues found by the analyser during compilation."); + Issues.ToList().ForEach(issue => issue.Print()); + } + Environment.Exit(0); + } + + public static async Task CompileScript(string scriptPath, ConcurrentBag<(string, Exception)> compilerErrors, CancellationToken ct) => await Task.Run(() => + { + var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); + var resolvableScript = new ResolvableScript(pathedModuleSpec); + + try + { + return (CompiledScript)resolvableScript.IntoCompiled(); + } + catch (Exception e) + { + lock (compilerErrors) { compilerErrors.Add((scriptPath, e)); } + return null; + } + }, ct); + + public static void CleanInput(Options opts) + { + opts.Input = Path.GetFullPath(opts.Input!.Trim()); + + if (opts.Output != null) + { + opts.Output = Path.GetFullPath(opts.Output.Trim()); + if (File.Exists(opts.Output)) + { + Logger.Error("Output must be a directory."); Environment.Exit(1); } + } + } - OutputToFile(opts, compiledContent); + public static IEnumerable GetFilesToCompile(string input) + { + if (File.Exists(input)) + { + yield return input; + } + else if (Directory.Exists(input)) + { + foreach (var file in Directory.EnumerateFiles(input, "*.ps1", SearchOption.AllDirectories)) + { + yield return file; + } + } + else + { + Logger.Error("Input must be a file or directory."); + Environment.Exit(1); + } + } + + public static LogLevel SetupLogger(Options opts) + { + var logLevel = LogLevel.FromOrdinal(Math.Abs(Math.Min(opts.Quiet, 3) - Math.Min(opts.Verbosity, 2) + 2)); + LogManager.Setup().LoadConfiguration(builder => + { + var layout = "${pad:padding=5:inner=${level:uppercase=true}}|${message}"; + if (logLevel <= LogLevel.Debug) layout = "[${threadid}] " + layout; + + var console = new ColoredConsoleTarget("console") + { + Layout = layout, + DetectConsoleAvailable = true, + EnableAnsiOutput = true, + RowHighlightingRules = { + new() { + Condition = "level == LogLevel.Warn", + ForegroundColor = ConsoleOutputColor.Yellow + }, + new() { + Condition = "level == LogLevel.Info", + ForegroundColor = ConsoleOutputColor.Gray + }, + new() { + Condition = "level == LogLevel.Debug", + ForegroundColor = ConsoleOutputColor.DarkMagenta + }, + new() { + Condition = "level == LogLevel.Trace", + ForegroundColor = ConsoleOutputColor.DarkGray + } + }, + WordHighlightingRules = { + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:error|exception|fail|fatal|warn|warning)\\b", + ForegroundColor = ConsoleOutputColor.DarkRed + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:info|log|message|success)\\b", + ForegroundColor = ConsoleOutputColor.Green + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:debug)\\b", + ForegroundColor = ConsoleOutputColor.Blue + }, + new ConsoleWordHighlightingRule + { + Regex = "\\b(?:trace)\\b", + ForegroundColor = ConsoleOutputColor.Gray + } + } + }; + + var errorConsole = new ColoredConsoleTarget("errorConsole") + { + Layout = layout, + DetectConsoleAvailable = console.DetectConsoleAvailable, + EnableAnsiOutput = console.EnableAnsiOutput, + StdErr = true, + RowHighlightingRules = { + new ConsoleRowHighlightingRule + { + Condition = "level == LogLevel.Fatal", + ForegroundColor = ConsoleOutputColor.Red + }, + new ConsoleRowHighlightingRule + { + Condition = "level == LogLevel.Error", + ForegroundColor = ConsoleOutputColor.DarkRed + }, + } + }; + + if (logLevel != LogLevel.Off) + { + if (logLevel <= LogLevel.Fatal) builder.ForLogger().FilterLevels(LogLevel.FromOrdinal(Math.Max(logLevel.Ordinal, LogLevel.Error.Ordinal)), LogLevel.Fatal).WriteTo(errorConsole); + if (logLevel <= LogLevel.Warn) builder.ForLogger().FilterLevels(logLevel, LogLevel.FromOrdinal(Math.Max(logLevel.Ordinal, LogLevel.Warn.Ordinal))).WriteTo(console); + } }); - LogManager.Shutdown(); - Environment.Exit(0); + return logLevel; } - public static void OutputToFile(Options options, string content) + public static async void OutputToFile( + string? directory, + string fileName, + string content, + bool overwrite) { - if (string.IsNullOrWhiteSpace(options.OutputFile)) + if (string.IsNullOrWhiteSpace(directory)) { // Output to console to allow for piping Console.OpenStandardOutput().Write(Encoding.UTF8.GetBytes(content)); return; } - var outputPath = Path.GetFullPath(options.OutputFile); - if (!Directory.Exists(Path.GetDirectoryName(outputPath))) - { - Logger.Debug($"Creating directory {Path.GetDirectoryName(outputPath)}"); - Directory.CreateDirectory(Path.GetDirectoryName(outputPath)!); - } - - if (File.Exists(options.OutputFile)) + var output = Path.Combine(directory, fileName); + if (File.Exists(output)) { - Logger.Info("Output file already exists"); - - var removeFile = options.Force; + var removeFile = overwrite; if (!removeFile) { - Logger.Info($"File {options.OutputFile} already exists. Overwrite? (Y/n)"); + Logger.Info($"File {output} already exists. Overwrite? (Y/n)"); var response = Console.ReadLine(); removeFile = string.IsNullOrWhiteSpace(response) || response.Equals("y", StringComparison.CurrentCultureIgnoreCase); } @@ -173,25 +297,33 @@ public static void OutputToFile(Options options, string content) if (removeFile) { Logger.Trace("Removing file"); - File.Delete(options.OutputFile); + File.Delete(output); } } - Logger.Info($"Writing to file {options.OutputFile}"); - using var fileStream = File.Open(options.OutputFile, FileMode.CreateNew, FileAccess.Write, FileShare.ReadWrite); - fileStream.Write(Encoding.UTF8.GetBytes(content)); + Logger.Info($"Writing to file {output}"); + using var fileStream = File.Open(output, FileMode.CreateNew, FileAccess.Write, FileShare.None); + await fileStream.WriteAsync(Encoding.UTF8.GetBytes(content)); } - internal static Collection RunPowerShell(string script) + internal static PowerShell GetPowerShellSession() { - var pwsh = PowerShell.Create(RunspaceMode.NewRunspace); + var pwsh = PowerShell.Create(RunspacePool.Value.InitialSessionState); pwsh.RunspacePool = RunspacePool.Value; + return pwsh; + } + + internal static Collection RunPowerShell(string script) + { + var pwsh = GetPowerShellSession(); pwsh.AddScript(script); return pwsh.Invoke(); } - public void Dispose() + ~Program() { - throw new NotImplementedException(); + RunspacePool.Value.Close(); + RunspacePool.Value.Dispose(); + LogManager.Shutdown(); } } diff --git a/src/automation/Uninstall-Applications.ps1 b/src/automation/Uninstall-Applications.ps1 index c12407e9..38e15dd6 100644 --- a/src/automation/Uninstall-Applications.ps1 +++ b/src/automation/Uninstall-Applications.ps1 @@ -11,6 +11,12 @@ param( # TODO wmic no longer available on Windows 11 need to find alternative. Invoke-RunMain $PSCmdlet { + [SuppressAnalyser( + CheckType = 'UseOfUndefinedFunction', + Data = 'wmic', + Justification = 'wmic is not available on the builder machine' + )] + param() if (Test-IsWindows11) { Invoke-Error 'This script is currently broken due to wmic not being available on Windows 11'; diff --git a/src/common/Analyser.psm1 b/src/common/Analyser.psm1 new file mode 100644 index 00000000..d87bb614 --- /dev/null +++ b/src/common/Analyser.psm1 @@ -0,0 +1,22 @@ +Using module ./Utils.psm1 + +class SupressAnalyserAttribute : System.Attribute { + [String]$CheckType; + [Object]$Data; + [String]$Justification = ''; + + SuppressAnalyser([String]$CheckType, [Object]$Data) { + $this.CheckType = $CheckType; + $this.Data = $Data; + } + + SuppressAnalyser([String]$CheckType, [Object]$Data, [String]$Justification) { + $this.CheckType = $CheckType; + $this.Data = $Data; + $this.Justification = $Justification; + } +} + +Export-Types -Types @( + [SupressAnalyserAttribute] +) From 3afeb049a6f9c3dc5a6685e7dd45b8b89d204d03 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 15:28:34 +1000 Subject: [PATCH 114/341] feat(Compiler): Support multiple function names per suppression --- .../Analyser/Rules/UseOfUndefinedFunction.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index b380179a..180b1373 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -1,11 +1,14 @@ using System.Management.Automation; using System.Management.Automation.Language; using Compiler.Module.Compiled; +using NLog; namespace Compiler.Analyser.Rules; public class UseOfUndefinedFunction : Rule { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + /// /// A list of all the built-in functions that are provided in a standard session. /// This includes modules that are imported by default. @@ -20,7 +23,19 @@ public override bool ShouldProcess( if (commandAst.GetCommandName() == null) return false; var callName = SanatiseName(commandAst.GetCommandName()); - return !supressions.Any(supression => (string)supression.Data! == callName); + return !supressions.Any(supression => + { + switch (supression.Data) + { + case IEnumerable functions: + return functions.Contains(callName); + case string function: + return function == callName; + default: + Logger.Warn($"Supression data is not a string or IEnumerable for rule {GetType().Name}"); + return false; + } + }); } public override IEnumerable Analyse( From d895f6732bdf59a152db610521cd0cd5561f0590 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 15:36:41 +1000 Subject: [PATCH 115/341] feat(Compiler): Support * statements in exports from remote modules, also add aliases --- src/Compiler/Module/Compiled/Compiled.cs | 2 +- src/Compiler/Module/Compiled/Remote.cs | 55 ++++++++++++++++-------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 9eb92e3b..58603972 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -104,5 +104,5 @@ public enum ContentType { UTF8String, - ZipHex + Zip } diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 3c638e01..8a2642e7 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -1,5 +1,7 @@ using System.Collections; using System.IO.Compression; +using System.Management.Automation; +using System.Management.Automation.Runspaces; using CommandLine; using Compiler.Requirements; using NLog; @@ -14,7 +16,7 @@ public class CompiledRemoteModule : Compiled public readonly MemoryStream MemoryStream; - public override ContentType Type => ContentType.ZipHex; + public override ContentType Type => ContentType.Zip; public override Version Version { get; } @@ -36,28 +38,47 @@ MemoryStream memoryStream } public override string StringifyContent() => $"'{Convert.ToHexString(MemoryStream.ToArray())}'"; + public IEnumerable GetExported(object? data, CommandTypes commandTypes) + { + switch (data) + { + case object[] strings: + return strings.Cast(); + case string starString when starString == "*": + var version = GetPowerShellManifest()["ModuleVersion"]!.ToString()!; + var tempModuleRootPath = Path.Combine(Path.GetTempPath(), $"PowerShellGet\\_Export_{ModuleSpec.Name}"); + var tempOutput = Path.Combine(tempModuleRootPath, ModuleSpec.Name, version); + if (!Directory.Exists(tempOutput)) + { + Directory.CreateDirectory(tempOutput); + using var archive = GetZipArchive(); + archive.ExtractToDirectory(tempOutput); + } + + var sessionState = InitialSessionState.CreateDefault(); + sessionState.ImportPSModulesFromPath(tempModuleRootPath); + var pwsh = PowerShell.Create(sessionState); + return pwsh.Runspace.SessionStateProxy.InvokeCommand + .GetCommands("*", commandTypes, true) + .Where(command => command.ModuleName == ModuleSpec.Name) + .Select(command => command.Name); + case string str: + return [str]; + case null: + return []; + default: + throw new Exception($"FunctionsToExport must be a string or an array of strings, but was {data.GetType()}"); + } + } public override IEnumerable GetExportedFunctions() { var manifest = GetPowerShellManifest(); var exportedFunctions = new List(); - var functionsToExport = manifest["FunctionsToExport"] switch - { - string[] functions => functions, - string function => [function], - object[] functions => functions.Cast(), - null => [], - _ => throw new Exception($"FunctionsToExport must be a string or an array of strings, but was {manifest["FunctionsToExport"]?.GetType()}") - }; - var cmdletsToExport = manifest["CmdletsToExport"] switch - { - string[] cmdlets => cmdlets, - string cmdlet => [cmdlet], - object[] cmdlets => cmdlets.Cast(), - null => [], - _ => throw new Exception($"CmdletsToExport must be a string or an array of strings, but was {manifest["CmdletsToExport"]?.GetType()}") - }; + var functionsToExport = GetExported(manifest["FunctionsToExport"], CommandTypes.Function); + var cmdletsToExport = GetExported(manifest["CmdletsToExport"], CommandTypes.Cmdlet); + var aliasesToExport = GetExported(manifest["AliasesToExport"], CommandTypes.Alias); exportedFunctions.AddRange(functionsToExport); exportedFunctions.AddRange(cmdletsToExport); From 27a1f2171a1251659f987dd1f1506b3ee086b1bb Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 15:37:16 +1000 Subject: [PATCH 116/341] chore(Compiler): Less console spam --- src/Compiler/Module/Compiled/Script.cs | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index f10a21e1..2346b994 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -1,7 +1,6 @@ using System.Management.Automation.Language; using System.Reflection; using System.Text; -using Compiler.Analyser; using Compiler.Module.Resolvable; using Compiler.Requirements; using Compiler.Text; @@ -31,11 +30,6 @@ RequirementGroup requirements Graph = new BidirectionalGraph>(); Graph.AddVertex(this); - Graph.VertexAdded += vertex => Logger.Debug($"Vertex added: {vertex.ModuleSpec.Name}"); - Graph.VertexRemoved += vertex => Logger.Debug($"Vertex removed: {vertex.ModuleSpec.Name}"); - Graph.EdgeAdded += edge => Logger.Debug($"Edge added: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); - Graph.EdgeRemoved += edge => Logger.Debug($"Edge removed: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); - var loadOrder = resolvableParent.Graph.TopologicalSort(); var reversedLoadOrder = loadOrder.Reverse(); reversedLoadOrder.ToList().ForEach(resolvable => @@ -44,19 +38,7 @@ RequirementGroup requirements var compiledRequirements = resolvableParent.Graph .OutEdges(resolvable) - .Select(edge => - { - try - { - Logger.Trace($"Getting compiled module for {edge.Target.ModuleSpec}"); - return Graph.Vertices.First(module => module.ModuleSpec == edge.Target.ModuleSpec); - } - catch - { - Logger.Trace($"Could not find module from edge {edge.Target.ModuleSpec}"); - throw; - } - }); + .Select(edge => Graph.Vertices.First(module => module.ModuleSpec == edge.Target.ModuleSpec)); Compiled compiledModule; if (resolvable.ModuleSpec == moduleSpec) { compiledModule = this; } From c0ebf55533b611c7f98356a9a5c07f2a283b047f Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 18:09:33 +1000 Subject: [PATCH 117/341] chore: more migrating --- src/automation/Uninstall-Applications.ps1 | 2 +- src/common/Analyser.psm1 | 4 +- src/common/Connection.psm1 | 38 ++-- src/common/PackageManager.psm1 | 6 + src/hudu/New-ExcelSheet.ps1 | 2 +- src/microsoft/Security.ps1 | 61 ++--- src/microsoft/admin/Invoke-ForCustomer.ps1 | 22 +- .../admin/New-PartnerApplication.ps1 | 92 ++++---- src/microsoft/admin/Update-DKIM.ps1 | 45 ++-- .../entra/Disable-EnterpriseUserConsent.ps1 | 5 +- src/microsoft/entra/Get-MFAChanges.ps1 | 75 ++++--- src/microsoft/entra/Invoke-TravelAccess.ps1 | 49 ---- src/microsoft/entra/New-User.ps1 | 9 +- src/microsoft/entra/OffboardUser.ps1 | 7 +- src/microsoft/entra/StaffLocation.ps1 | 16 +- src/microsoft/intune/Setup.ps1 | 211 +++++++++--------- src/microsoft/reports/Exchange.ps1 | 4 + src/misc/Export-KaseyaQuotes.ps1 | 33 ++- src/misc/Setup-SecretManagement.ps1 | 6 +- utils/Invoke-Linter.ps1 | 7 +- 20 files changed, 316 insertions(+), 378 deletions(-) delete mode 100644 src/microsoft/entra/Invoke-TravelAccess.ps1 diff --git a/src/automation/Uninstall-Applications.ps1 b/src/automation/Uninstall-Applications.ps1 index 38e15dd6..5e11cebd 100644 --- a/src/automation/Uninstall-Applications.ps1 +++ b/src/automation/Uninstall-Applications.ps1 @@ -11,7 +11,7 @@ param( # TODO wmic no longer available on Windows 11 need to find alternative. Invoke-RunMain $PSCmdlet { - [SuppressAnalyser( + [SuppressAnalyserAttribute( CheckType = 'UseOfUndefinedFunction', Data = 'wmic', Justification = 'wmic is not available on the builder machine' diff --git a/src/common/Analyser.psm1 b/src/common/Analyser.psm1 index d87bb614..a73c3355 100644 --- a/src/common/Analyser.psm1 +++ b/src/common/Analyser.psm1 @@ -5,12 +5,12 @@ class SupressAnalyserAttribute : System.Attribute { [Object]$Data; [String]$Justification = ''; - SuppressAnalyser([String]$CheckType, [Object]$Data) { + SupressAnalyserAttribute([String]$CheckType, [Object]$Data) { $this.CheckType = $CheckType; $this.Data = $Data; } - SuppressAnalyser([String]$CheckType, [Object]$Data, [String]$Justification) { + SupressAnalyserAttribute([String]$CheckType, [Object]$Data, [String]$Justification) { $this.CheckType = $CheckType; $this.Data = $Data; $this.Justification = $Justification; diff --git a/src/common/Connection.psm1 b/src/common/Connection.psm1 index 3d7c75fb..353418cf 100644 --- a/src/common/Connection.psm1 +++ b/src/common/Connection.psm1 @@ -1,6 +1,10 @@ Using module ./Logging.psm1 Using module ./Scope.psm1 Using module ./Exit.psm1 +Using module Microsoft.Graph.Authentication +Using module ExchangeOnlineManagement +Using module AzureAD +Using module MSOnline function Local:Invoke-NonNullParams { [CmdletBinding()] @@ -87,8 +91,7 @@ $Script:Services = @{ Invoke-Debug "Current Scopes: $($Local:Context.Scopes -join ', ')"; [Bool]$Local:HasAllScopes = ($Scopes | Where-Object { $Local:Context.Scopes -notcontains $_; }).Count -eq 0; - } - else { + } else { $Local:HasAllScopes = $True; } @@ -117,8 +120,7 @@ function Local:Disconnect-ServiceInternal { if ($PSCmdlet.ShouldProcess("Disconnect from $Local:Service")) { & $Script:Services[$Local:Service].Disconnect | Out-Null; }; - } - catch { + } catch { Invoke-FailedExit -ExitCode $Script:ERROR_CANT_DISCONNECT -FormatArgs @($Local:Service) -ErrorRecord $_; } } @@ -149,8 +151,7 @@ function Local:Connect-ServiceInternal { if ($PSCmdlet.ShouldProcess("Connect to $Local:Service")) { $null = & $Script:Services[$Local:Service].Connect -Scopes:$Scopes -AccessToken:$AccessToken; } - } - catch { + } catch { Invoke-FailedExit -ExitCode $Script:ERROR_COULDNT_CONNECT -FormatArgs @($Local:Service) -ErrorRecord $_; } } @@ -166,8 +167,7 @@ function Local:Get-ServiceContext { try { & $Script:Services[$Service].Context; - } - catch { + } catch { # If we can't get the context, we're not connected. $null; } @@ -262,12 +262,9 @@ function Connect-Service( foreach ($Local:Service in $Services) { [String]$Local:Context = try { Get-ServiceContext -Service $Local:Service; - } - catch { + } catch { Invoke-Debug "Failed to get connection information for $Local:Service"; - if ($Global:Logging.Debug) { - Format-Error -InvocationInfo $_.InvocationInfo; - } + Format-Error -InvocationInfo $_.InvocationInfo; } # FIXME @@ -284,14 +281,12 @@ function Connect-Service( if ($Local:LastService -and (Test-NotMatchableOrSameContext -ServiceA:$Local:Service -ServiceB:$Local:LastService)) { Invoke-Info 'Not all services are connected with the same account, forcing disconnect...'; Disconnect-ServiceInternal -Service:$Local:Service; - } - elseif ($Local:Context) { + } elseif ($Local:Context) { [ScriptBlock]$Local:ValidCheck = $Script:Services[$Local:Service].IsValid; if ($Local:ValidCheck -and -not (& $Local:ValidCheck -Scopes:$Scopes)) { Invoke-Info "Connected to $Local:Service, but missing required scopes. Disconnecting..."; Disconnect-ServiceInternal -Service $Local:Service; - } - elseif (!$DontConfirm) { + } elseif (!$DontConfirm) { $Local:Continue = Get-UserConfirmation -Title "Already connected to $Local:Service as [$Local:Context]" -Question 'Do you want to continue?' -DefaultChoice $true; if ($Local:Continue) { Invoke-Verbose 'Continuing with current connection...'; @@ -301,15 +296,13 @@ function Connect-Service( } Disconnect-ServiceInternal -Service $Local:Service; - } - else { + } else { Invoke-Verbose "Already connected to $Local:Service. Skipping..."; $Local:Account = $Local:Context; $Local:LastService = $Local:Service; continue } - } - elseif ($CheckOnly) { + } elseif ($CheckOnly) { Invoke-FailedExit -ExitCode:$Script:ERROR_NOT_CONNECTED -FormatArgs @($Local:Service) -ErrorRecord $_; } @@ -319,8 +312,7 @@ function Connect-Service( else { Invoke-Info "Connecting to $Local:Service..."; } Connect-ServiceInternal -Service:$Local:Service -Scopes:$Scopes -AccessToken:$AccessToken; - } - catch { + } catch { Invoke-FailedExit -ExitCode $Script:ERROR_COULDNT_CONNECT -FormatArgs @($Local:Service) -ErrorRecord $_; } diff --git a/src/common/PackageManager.psm1 b/src/common/PackageManager.psm1 index c32a9067..2df6b60c 100644 --- a/src/common/PackageManager.psm1 +++ b/src/common/PackageManager.psm1 @@ -43,6 +43,12 @@ function Local:Install-Requirements { 'PSAvoidUsingInvokeExpression', Justification = 'Required to install Chocolatey, there is no other way to do this.' )] + [SuppressAnalyserAttribute( + 'UseOfUndefinedFunction', + 'refreshenv', + Justification = 'Will be defined by the imported module.' + )] + [CmdletBinding()] param() if ($Script:CompletedSetup) { diff --git a/src/hudu/New-ExcelSheet.ps1 b/src/hudu/New-ExcelSheet.ps1 index 52c13ce9..7f5cb1ed 100644 --- a/src/hudu/New-ExcelSheet.ps1 +++ b/src/hudu/New-ExcelSheet.ps1 @@ -7,7 +7,7 @@ Using module ../common/Ensure.psm1 Using module ./Common.psm1 Using module ImportExcel -using namespace OfficeOpenXml; +using namespace OfficeOpenXml <# .SYNOPSIS diff --git a/src/microsoft/Security.ps1 b/src/microsoft/Security.ps1 index b1c03315..c94b74ec 100644 --- a/src/microsoft/Security.ps1 +++ b/src/microsoft/Security.ps1 @@ -1,6 +1,11 @@ +Using module ../../common/Environment.psm1 +Using module ../../common/Connect.psm1 +Using module ./Common.psm1 +Using module Microsoft.Online.SharePoint.PowerShell + Param( [Parameter(Mandatory)] - [ValidateSet("SecurityAlerts", "ConditionalAccess", "Sharepoint", "Exchange")] + [ValidateSet('SecurityAlerts', 'ConditionalAccess', 'Sharepoint', 'Exchange')] [String]$Action ) @@ -24,39 +29,13 @@ function Disable-Outlook_StorageProviders { #region - Alerts and Notifications -function Get-AlertsUser { - $User = (Get-User | Where-Object { $_.Name -like 'Alerts*' } | Select-Object -First 1) - - if ($User) { - return $User - } else { - # TODO :: Auto-create with memorable-pass - Write-Warning "No Alerts user found. Please create one manually." - return $null - - # $params = @{ - # Name = "Alerts" - # DisplayName = "Alerts" - # UserPrincipalName = "Alerts@$(Get-OrganizationConfig).PrimarySmtpAddress.Domain" - # FirstName = "Alerts" - # LastName = "Alerts" - # Password = (ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force) - # ResetPasswordOnNextLogon = $false - # PasswordNeverExpires = $true - # UsageLocation = "US" - # ForceChangePasswordNextLogon = $false - # } - # New-User @params - } -} - function Set-SecurityAndCompilenceAlerts([PSObject]$AlertsUser) { $Alerts = Get-ProtectionAlert $AlertNames = $Alerts | Select-Object -ExpandProperty Name $Alerts = $Alerts | Where-Object { ($_.NotifyUser -ne $AlertsUser.WindowsLiveID) -and !$_.Disabled } if ($null -eq $Alerts -or $Alerts.Count -eq 0) { - Write-Host "All Security and Complience alerts are already configured to notify the Alerts user." + Write-Host 'All Security and Complience alerts are already configured to notify the Alerts user.' return } @@ -83,8 +62,7 @@ function Set-SecurityAndCompilenceAlerts([PSObject]$AlertsUser) { Write-Warning "Unable to create custom alert for $($Alert.Name)." $UnableToCreate += $Alert.Name } - } - else { + } else { Set-ProtectionAlert -Identity $Alert.Name -NotifyUser $AlertsUser.WindowsLiveID | Out-Null } } @@ -103,53 +81,50 @@ function New-ConditionalAccessPrivilegedIdentityManagementPolicy { Connect-Service AzureAD; #region - Const Variables - $Local:PolicyName = "Privileged Identity Managementt" - $Local:DirectoryRoles = @("Application administrator", "Authentication administrator", "Billing administrator", "Cloud application administrator", "Conditional Access administrator", "Exchange administrator", "Global administrator", "Global reader", "Helpdesk administrator", "Password administrator", "Privileged authentication administrator", "Privileged role administrator", "Security administrator", "SharePoint administrator", "User administrator") + $Local:PolicyName = 'Privileged Identity Managementt' + $Local:DirectoryRoles = @('Application administrator', 'Authentication administrator', 'Billing administrator', 'Cloud application administrator', 'Conditional Access administrator', 'Exchange administrator', 'Global administrator', 'Global reader', 'Helpdesk administrator', 'Password administrator', 'Privileged authentication administrator', 'Privileged role administrator', 'Security administrator', 'SharePoint administrator', 'User administrator') #endregion $Local:ExistingPolicy = Get-AzureADMSConditionalAccessPolicy | Where-Object { $_.DisplayName -eq $Local:PolicyName } # TODO :: Check if policy is configured correctly if ($Local:ExistingPolicy) { - Write-Host "Privileged Identity Management policy already exists. Skipping..." + Write-Host 'Privileged Identity Management policy already exists. Skipping...' return } [Microsoft.Open.MSGraph.Model.ConditionalAccessConditionSet]$Local:Conditions = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessConditionSet # Apply to all cloud applications $Local:Conditions.Applications = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessApplicationCondition - $Local:Conditions.Applications.IncludeApplications = "All" + $Local:Conditions.Applications.IncludeApplications = 'All' # Apply to administator roles $Local:Conditions.Users = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessUserCondition $Local:Conditions.Users.IncludeRoles = Get-AzureADMSRoleDefinition | Where-Object { $Local:DirectoryRoles -contains $_.DisplayName } | Select-Object -ExpandProperty Id [Microsoft.Open.MSGraph.Model.ConditionalAccessGrantControls]$Local:GrantControls = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessGrantControls # Enforce MFA - $Local:GrantControls._Operator = "OR" - $Local:GrantControls.BuiltInControls = @("mfa") + $Local:GrantControls._Operator = 'OR' + $Local:GrantControls.BuiltInControls = @('mfa') [Microsoft.Open.MSGraph.Model.ConditionalAccessSessionControls]$Local:SessionControls = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessSessionControls # Disable persistent browser $Local:SessionControls.PersistentBrowser = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessPersistentBrowser $Local:SessionControls.PersistentBrowser.IsEnabled = $true - $Local:SessionControls.PersistentBrowser.Mode = "Never" + $Local:SessionControls.PersistentBrowser.Mode = 'Never' # Require Re-authentication every 4 hours $Local:SessionControls.SignInFrequency = New-Object -TypeName Microsoft.Open.MSGraph.Model.ConditionalAccessSignInFrequency $Local:SessionControls.SignInFrequency.IsEnabled = $true - $Local:SessionControls.SignInFrequency.Value = "4" - $Local:SessionControls.SignInFrequency.Type = "hours" + $Local:SessionControls.SignInFrequency.Value = '4' + $Local:SessionControls.SignInFrequency.Type = 'hours' - New-AzureADMSConditionalAccessPolicy -DisplayName $Local:PolicyName -State "Enabled" -Conditions $Local:Conditions -GrantControls $Local:GrantControls -SessionControls $Local:SessionControls -ErrorAction Stop | Out-Null + New-AzureADMSConditionalAccessPolicy -DisplayName $Local:PolicyName -State 'Enabled' -Conditions $Local:Conditions -GrantControls $Local:GrantControls -SessionControls $Local:SessionControls -ErrorAction Stop | Out-Null } #endregion - Conditional Access Policies -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { switch ($Action) { 'SecurityAlerts' { - Invoke-EnsureModule MSOnline, AzureAD; - $AlertsUser = Get-AlertsUser if ($AlertsUser) { $Continue = $Host.UI.PromptForChoice("Alerts User: $($AlertsUser.WindowsLiveID)", 'Is this the correct alerts user?', @('&Yes', '&No'), 0) diff --git a/src/microsoft/admin/Invoke-ForCustomer.ps1 b/src/microsoft/admin/Invoke-ForCustomer.ps1 index 786d0828..81717a05 100644 --- a/src/microsoft/admin/Invoke-ForCustomer.ps1 +++ b/src/microsoft/admin/Invoke-ForCustomer.ps1 @@ -1,7 +1,6 @@ -Using module Microsoft.Graph.Authentication; -Using module PartnerCenter; - -Using module ../../common/Environment.psm1; +Using module ../../common/Environment.psm1 +Using module Microsoft.Graph.Authentication +Using module PartnerCenter [CmdletBinding(DefaultParameterSetName = 'ScriptBlock')] param ( @@ -226,8 +225,7 @@ function Get-AuthenticationTokens { Invoke-Info 'Customer Access Token has been successfully retrieved.'; return $Local:AccessToken; - } - else { + } else { return $Local:PartnerAccessToken; } } @@ -272,8 +270,7 @@ function Invoke-InCustomerContext { Invoke-Info "Executing script in the context of $CustomerTenantId's tenant..."; if ($ScriptBlock) { Invoke-Command -ScriptBlock $ScriptBlock; - } - elseif ($ScriptFile) { + } elseif ($ScriptFile) { Invoke-Expression -Command $ScriptFile @Parameters; } Invoke-Info "Script execution completed in the context of $CustomerTenantId's tenant."; @@ -308,8 +305,7 @@ function Select-Customer { if (-not [string]::IsNullOrWhiteSpace($Local:ExistingToken.AccessToken)) { [SecureString]$Local:SecureToken = ConvertTo-SecureString -String $Local:ExistingToken.AccessToken -AsPlainText -Force; Connect-Service 'Graph' -Scopes 'Directory.Read.All' -AccessToken:$Local:SecureToken; - } - else { Connect-Service 'Graph' -Scopes 'Directory.Read.All'; } + } else { Connect-Service 'Graph' -Scopes 'Directory.Read.All'; } [Microsoft.Graph.PowerShell.Models.IMicrosoftGraphContract[]]$Customers = Get-MgContract -All; return Get-UserSelection ` @@ -337,11 +333,9 @@ Invoke-RunMain $PSCmdlet -NotStrict -Main { $Private:Customer = Select-Customer; try { Invoke-InCustomerContext -CustomerTenantId:($Private:Customer.CustomerId); - } - catch { + } catch { Invoke-FailedExit -ExitCode 999 -ErrorRecord $_; - } - finally { + } finally { if ($PreserveTokens) { [Environment]::SetEnvironmentVariable('MULTITENANT_ACCESS_TOKENS', ($Script:AccessTokens | ConvertTo-Json -Depth 5)); } diff --git a/src/microsoft/admin/New-PartnerApplication.ps1 b/src/microsoft/admin/New-PartnerApplication.ps1 index 67d5c842..fd88c852 100644 --- a/src/microsoft/admin/New-PartnerApplication.ps1 +++ b/src/microsoft/admin/New-PartnerApplication.ps1 @@ -22,8 +22,19 @@ #Requires -Version 5.1 #Requires -PSEdition Desktop -Using module ../../common/Environment.psm1; - +Using module ../../common/Analyser.psm1 +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Exit.psm1 +Using module AzureAD +Using module PartnerCenter + +Using namespace Microsoft.Open.AzureAD.Model + +[SupressAnalyser( + 'UseOfUndefinedFunction', + 'Connect-AzureAD','Get-AzureADTenantDetail','New-AzureADApplication','New-AzureADApplicationPasswordCredential' +)] Param( [Parameter(Mandatory)] [string]$DisplayName, @@ -32,22 +43,7 @@ Param( [string]$TenantId ) -# Check if the Azure AD PowerShell module has already been loaded. -if ( ! ( Get-Module AzureAD ) ) { - # Check if the Azure AD PowerShell module is installed. - if ( Get-Module -ListAvailable -Name AzureAD ) { - # The Azure AD PowerShell module is not load and it is installed. This module - # must be loaded for other operations performed by this script. - Write-Host -ForegroundColor Green 'Loading the Azure AD PowerShell module...' - Import-Module AzureAD - } else { - Install-Module AzureAD - } -} - try { - Write-Host -ForegroundColor Green 'When prompted please enter the appropriate credentials... Warning: Window might have pop-under in VSCode' - if ([string]::IsNullOrEmpty($TenantId)) { Connect-AzureAD | Out-Null @@ -57,48 +53,47 @@ try { } } catch [Microsoft.Azure.Common.Authentication.AadAuthenticationCanceledException] { # The authentication attempt was canceled by the end-user. Execution of the script should be halted. - Write-Host -ForegroundColor Yellow 'The authentication attempt was canceled. Execution of the script will be halted...' - Exit + Invoke-Warn 'The authentication attempt was canceled. Execution of the script will be halted...'; + Invoke-FailedExit -ExitCode 1 -ErrorRecord $_; } catch { # An unexpected error has occurred. The end-user should be notified so that the appropriate action can be taken. - Write-Error 'An unexpected error has occurred. Please review the following error message and try again.' ` - "$($Error[0].Exception)" + Invoke-FailedExit -ExitCode 1 -ErrorRecord $_; } -$adAppAccess = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{ +$adAppAccess = [RequiredResourceAccess]@{ ResourceAppId = '00000002-0000-0000-c000-000000000000'; ResourceAccess = - [Microsoft.Open.AzureAD.Model.ResourceAccess]@{ + [ResourceAccess]@{ Id = '5778995a-e1bf-45b8-affa-663a9f3f4d04'; Type = 'Role' }, - [Microsoft.Open.AzureAD.Model.ResourceAccess]@{ + [ResourceAccess]@{ Id = 'a42657d6-7f20-40e3-b6f0-cee03008a62a'; Type = 'Scope' }, - [Microsoft.Open.AzureAD.Model.ResourceAccess]@{ + [ResourceAccess]@{ Id = '311a71cc-e848-46a1-bdf8-97ff7156d8e6'; Type = 'Scope' } } -$graphAppAccess = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{ +$graphAppAccess = [RequiredResourceAccess]@{ ResourceAppId = '00000003-0000-0000-c000-000000000000'; ResourceAccess = - [Microsoft.Open.AzureAD.Model.ResourceAccess]@{ + [ResourceAccess]@{ Id = 'bf394140-e372-4bf9-a898-299cfc7564e5'; Type = 'Role' }, - [Microsoft.Open.AzureAD.Model.ResourceAccess]@{ + [ResourceAccess]@{ Id = '7ab1d382-f21e-4acd-a863-ba3e13f7da61'; Type = 'Role' } } -$partnerCenterAppAccess = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@{ +$partnerCenterAppAccess = [RequiredResourceAccess]@{ ResourceAppId = 'fa3d9a0c-3fb0-42cc-9193-47c7ecd2edbd'; ResourceAccess = - [Microsoft.Open.AzureAD.Model.ResourceAccess]@{ + [ResourceAccess]@{ Id = '1cebfa2a-fb4d-419e-b5f9-839b4383e05a'; Type = 'Scope' } @@ -106,37 +101,34 @@ $partnerCenterAppAccess = [Microsoft.Open.AzureAD.Model.RequiredResourceAccess]@ $SessionInfo = Get-AzureADCurrentSessionInfo -Write-Host -ForegroundColor Green 'Creating the Azure AD application and related resources...' +Invoke-Info 'Creating the Azure AD application and related resources...'; $app = New-AzureADApplication -AvailableToOtherTenants $true -DisplayName $DisplayName -IdentifierUris "https://$($SessionInfo.TenantDomain)/$((New-Guid).ToString())" -RequiredResourceAccess $adAppAccess, $graphAppAccess, $partnerCenterAppAccess -ReplyUrls @('urn:ietf:wg:oauth:2.0:oob', 'https://localhost', 'http://localhost', 'http://localhost:8400') $password = New-AzureADApplicationPasswordCredential -ObjectId $app.ObjectId $spn = New-AzureADServicePrincipal -AppId $app.AppId -DisplayName $DisplayName - $adminAgentsGroup = Get-AzureADGroup -Filter "DisplayName eq 'AdminAgents'" Add-AzureADGroupMember -ObjectId $adminAgentsGroup.ObjectId -RefObjectId $spn.ObjectId -Write-Host 'Installing PartnerCenter Module.' -ForegroundColor Green -Install-Module PartnerCenter -Force -AllowClobber -Scope CurrentUser -Write-Host 'Sleeping for 30 seconds to allow app creation on O365' -ForegroundColor green +Invoke-Info 'Sleeping for 30 seconds to allow app creation on O365' Start-Sleep 30 -Write-Host 'Please approve General consent form.' -ForegroundColor Green +Invoke-Info 'Please approve General consent form.' $PasswordToSecureString = $password.value | ConvertTo-SecureString -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential($($app.AppId), $PasswordToSecureString) $token = New-PartnerAccessToken -ApplicationId "$($app.AppId)" -Scopes 'https://api.partnercenter.microsoft.com/user_impersonation' -ServicePrincipal -Credential $credential -Tenant $($spn.AppOwnerTenantID) -UseAuthorizationCode -Write-Host 'Please approve Exchange consent form.' -ForegroundColor Green +Invoke-Info 'Please approve Exchange consent form.'; $Exchangetoken = New-PartnerAccessToken -ApplicationId 'a0c73c16-a7e3-4564-9a95-2bdf47383716' -Scopes 'https://outlook.office365.com/.default' -Tenant $($spn.AppOwnerTenantID) -UseDeviceAuthentication -Write-Host 'Please approve Azure consent form.' -ForegroundColor Green +Invoke-Info 'Please approve Azure consent form.'; $Azuretoken = New-PartnerAccessToken -ApplicationId "$($app.AppId)" -Scopes 'https://management.azure.com/user_impersonation' -ServicePrincipal -Credential $credential -Tenant $($spn.AppOwnerTenantID) -UseAuthorizationCode -Write-Host "Last initation required: Please browse to https://login.microsoftonline.com/$($spn.AppOwnerTenantID)/adminConsent?client_id=$($app.AppId)" -Write-Host 'Press any key after auth. An error report about incorrect URIs is expected!' -[void][System.Console]::ReadKey($true) -Write-Host '######### Secrets #########' -Write-Host "`$ApplicationId = '$($app.AppId)'" -Write-Host "`$ApplicationSecret = '$($password.Value)'" -Write-Host "`$TenantID = '$($spn.AppOwnerTenantID)'" -Write-Host "`$RefreshToken = '$($token.refreshtoken)'" -ForegroundColor Blue -Write-Host "`$ExchangeRefreshToken = '$($ExchangeToken.Refreshtoken)'" -ForegroundColor Green -Write-Host "`$AzureRefreshToken = '$($Azuretoken.Refreshtoken)'" -ForegroundColor Magenta -Write-Host '######### Secrets #########' -Write-Host ' SAVE THESE IN A SECURE LOCATION ' +Invoke-Info "Last initation required: Please browse to https://login.microsoftonline.com/$($spn.AppOwnerTenantID)/adminConsent?client_id=$($app.AppId)" +Invoke-Info 'Press any key after auth. An error report about incorrect URIs is expected!' +[void][System.Console]::ReadKey($true); +Invoke-Info '######### Secrets #########'; +Invoke-Info "`$ApplicationId = '$($app.AppId)'"; +Invoke-Info "`$ApplicationSecret = '$($password.Value)'"; +Invoke-Info "`$TenantID = '$($spn.AppOwnerTenantID)'"; +Invoke-Info "`$RefreshToken = '$($token.refreshtoken)'"; +Invoke-Info "`$ExchangeRefreshToken = '$($ExchangeToken.Refreshtoken)'"; +Invoke-Info "`$AzureRefreshToken = '$($Azuretoken.Refreshtoken)'"; +Invoke-Info '######### Secrets #########'; +Invoke-Info ' SAVE THESE IN A SECURE LOCATION '; diff --git a/src/microsoft/admin/Update-DKIM.ps1 b/src/microsoft/admin/Update-DKIM.ps1 index a0e68df3..b8fb1dd5 100644 --- a/src/microsoft/admin/Update-DKIM.ps1 +++ b/src/microsoft/admin/Update-DKIM.ps1 @@ -1,39 +1,40 @@ #Requires -Version 7.1 -Using namespace Microsoft.Graph.PowerShell.Models; +Using module ../../common/Environment.psm1 +Using module ../../common/Connect.psm1 +Using module Microsoft.Graph.Identity.DirectoryManagement -foreach ($domain in $domains) { - # Get the domain name - $domainName = $domain.Name +Using namespace Microsoft.Graph.PowerShell.Models; - # Update DKIM records - New-DkimSigningConfig -DomainName $domainName -Enabled $true +# foreach ($domain in $domains) { +# # Get the domain name +# $domainName = $domain.Name - # Verify DKIM records - $dkimConfig = Get-DkimSigningConfig -Identity $domainName +# # Update DKIM records +# New-DkimSigningConfig -DomainName $domainName -Enabled $true - if ($dkimConfig.Status -eq "Enabled") { - Write-Output "DKIM is enabled for $domainName" - } else { - Write-Output "Failed to enable DKIM for $domainName" - } -} +# # Verify DKIM records +# $dkimConfig = Get-DkimSigningConfig -Identity $domainName -Import-Module $PSScriptRoot/../../common/Environment.psm1; +# if ($dkimConfig.Status -eq "Enabled") { +# Write-Output "DKIM is enabled for $domainName" +# } else { +# Write-Output "Failed to enable DKIM for $domainName" +# } +# } Invoke-RunMain $PSCmdlet { - Invoke-EnsureModule @('Microsoft.Graph'); Connect-Service -Services @('Graph') -Scopes @('Domain.ReadWrite.All'); [MicrosoftGraphDomain]$Local:AllDomains = Get-MgDomain; [MicrosoftGraphDomain]$Local:RootDomain = $Local:AllDomains | Where-Object { $_.IsInitial -eq $true }; [MicrosoftGraphDomain]$Local:CustomDomains = $Local:AllDomains | Where-Object { $_.IsInitial -eq $false -and $_.IsVerified -eq $true }; - New-MgBetaDomainServiceConfigurationRecord ` - -DomainName $Local:RootDomain.Id - -RecordType 'CNAME' - -RecordData 'selector1._domainkey' - -RecordValue 'selector1-._domainkey.' + New-MgDomainServiceConfigurationRecord ` + -DomainName $Local:RootDomain.Id ` + -RecordType 'CNAME' ` + -RecordData 'selector1._domainkey' ` + -RecordValue 'selector1-._domainkey.' ` -Ttl 3600; $Local:CustomDomains | ForEach-Object { @@ -42,7 +43,7 @@ Invoke-RunMain $PSCmdlet { $Local:ExistingRecord = $Local:CustomDomain - [MicrosoftGraphDomain]$Local:DKIM = New-MgDomainDkimSigningConfig -DomainName $Local:CustomDomain.Id -Enabled $true; + # [MicrosoftGraphDomain]$Local:DKIM = New-MgDomainDkimSigningConfig -DomainName $Local:CustomDomain.Id -Enabled $true; if ($Local:DKIM.Status -eq 'Enabled') { Invoke-Info "DKIM is enabled for $($Local:CustomDomain.Id)."; diff --git a/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 b/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 index 7d9a6b9d..a84e2252 100644 --- a/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 +++ b/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 @@ -1,3 +1,7 @@ +Using module ../../common/Environment.psm1 +Using module ../../common/Connect.psm1 +Using module Microsoft.Graph.Identity.SignIns + function Disable-EnterpriseConsent_UserConsent { Connect-Service Graph -Scopes 'Policy.ReadWrite.Authorization'; @@ -14,7 +18,6 @@ function Set-EnterpriseConsent_ForwardRequestsToAlerts { } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { }; diff --git a/src/microsoft/entra/Get-MFAChanges.ps1 b/src/microsoft/entra/Get-MFAChanges.ps1 index bc0d127f..8cbf71ab 100644 --- a/src/microsoft/entra/Get-MFAChanges.ps1 +++ b/src/microsoft/entra/Get-MFAChanges.ps1 @@ -1,5 +1,14 @@ #Requires -Version 5.1 +Using module ../../common/Environment.psm1 +Using module ../../common/Connect.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Ensure.psm1 +Using module ../../common/Scope.psm1 +Using module ../../common/Exit.psm1 + +Using module ImportExcel + [CmdletBinding(SupportsShouldProcess)] Param( [Parameter(Mandatory)] @@ -11,13 +20,13 @@ Param( [Parameter()] [ValidateNotNullOrEmpty()] - [String]$ExcelFileName = "MFA Numbers.xlsx" + [String]$ExcelFileName = 'MFA Numbers.xlsx' ) $Script:Columns = @{ DisplayName = 1; - Email = 2; - Phone = 3; + Email = 2; + Phone = 3; }; # Section Start - Main Functions @@ -40,8 +49,6 @@ function Invoke-SetupEnvironment( process { Invoke-EnsureUser; - Invoke-EnsureModule -Modules @('AzureAD', 'MSOnline', 'ImportExcel'); - Connect-Service -Services 'Msol', 'AzureAD'; # Get the first client folder that exists @@ -82,13 +89,13 @@ function Get-CurrentData { process { [Object[]]$Local:LicensedUsers = Get-MsolUser -All | Where-Object { $_.isLicensed -eq $true } | Sort-Object DisplayName; [PSCustomObject[]]$Local:ExpandedUsers = $Local:LicensedUsers ` - | Select-Object ` - DisplayName, ` - @{ N = 'Email'; E = { $_.UserPrincipalName } }, ` - MobilePhone, ` - @{ N = 'MFA_App'; E = { $_.StringAuthenticationPhoneAppDetails } }, ` - @{ N = 'MFA_Email'; E = { $_.StrongAuthenticationUserDetails.Email } }, ` - @{ N = 'MFA_Phone'; E = { $_.StrongAuthenticationUserDetails.PhoneNumber } }; + | Select-Object ` + DisplayName, ` + @{ N = 'Email'; E = { $_.UserPrincipalName } }, ` + MobilePhone, ` + @{ N = 'MFA_App'; E = { $_.StringAuthenticationPhoneAppDetails } }, ` + @{ N = 'MFA_Email'; E = { $_.StrongAuthenticationUserDetails.Email } }, ` + @{ N = 'MFA_Phone'; E = { $_.StrongAuthenticationUserDetails.PhoneNumber } }; return $Local:ExpandedUsers; } @@ -100,29 +107,29 @@ function Get-Excel { process { $Local:Import = if (Test-Path $Script:ExcelFile) { - Invoke-Info "Excel file found, importing data..."; + Invoke-Info 'Excel file found, importing data...'; try { Import-Excel $Script:ExcelFile } catch { - Invoke-Error "Failed to import Excel file."; + Invoke-Error 'Failed to import Excel file.'; $Local:Message = $_.Exception.Message $Local:WriteMessage = switch -Regex ($Local:Message) { - "Duplicate column headers" { + 'Duplicate column headers' { [System.Text.RegularExpressions.Match]$Local:Match = Select-String "Duplicate column headers found on row '(?[0-9]+)' in columns '(?:(?[0-9]+)(?:[ ]?))+'." -InputObject $_ [String]$Row = $Match.Matches.Groups[1].Captures; [String]$Columns = $Match.Matches.Groups[2].Captures; - "There were duplicate columns found on row $Row in columns $($Columns -join ", "); Please remove any duplicate columns and try again"; + "There were duplicate columns found on row $Row in columns $($Columns -join ', '); Please remove any duplicate columns and try again"; } - default { "Unknown error; Please examine the error message and try again"; } + default { 'Unknown error; Please examine the error message and try again'; } } Invoke-Error $WriteMessage; exit 1004; } } else { - Invoke-Info "Excel file not found, creating new file..."; + Invoke-Info 'Excel file not found, creating new file...'; New-Object -TypeName System.Collections.ArrayList; } @@ -146,7 +153,7 @@ function Get-EmailToCell([Parameter(Mandatory)][ValidateNotNullOrEmpty()][Office [Int]$Local:ColumnIndex = 2; foreach ($Local:Row in 2..$Local:SheetRows) { [String]$Local:Email = $WorkSheet.Cells[$Local:Row, $Local:ColumnIndex].Value; - $Local:Email | Assert-NotNull -Message "Email was null"; + $Local:Email | Assert-NotNull -Message 'Email was null'; $Local:EmailTable.Add($Local:Email, $Local:Row); } @@ -162,7 +169,7 @@ function Update-History([OfficeOpenXml.ExcelWorksheet]$ActiveWorkSheet, [OfficeO process { # This is a new worksheet, no history to update if ($ActiveWorkSheet.Dimension.Columns -lt 4) { - Invoke-Info "No data found in worksheet $($ActiveWorkSheet.Name), skipping history update." + Invoke-Info "No data found in worksheet $($ActiveWorkSheet.Name), skipping history update." return } @@ -362,7 +369,7 @@ function Invoke-CleanupWorksheet( } # With the columns we want to display, we can now format the rows. - [String[]]$Local:Lines = ""; + [String[]]$Local:Lines = ''; $Rows | ForEach-Object { [String[]]$Local:Row = $_; for ($Local:Index = $Local:CurrentLongest - 1; $Local:Index -le ($Local:LongestColumns.Count - 1); $Local:Index++) { @@ -486,7 +493,7 @@ function Add-Users([PSCustomObject[]]$NewData, [OfficeOpenXml.ExcelWorksheet]$Wo # Each value is a boolean which is only true if they are a new user. # This should be sorted by displayName, so that we can insert them in the correct order. [HashTable]$Local:TableWithInsertions = @{}; - $Local:EmailTable.GetEnumerator().ForEach({$Local:TableWithInsertions.Add($_.Key, $false); }); + $Local:EmailTable.GetEnumerator().ForEach({ $Local:TableWithInsertions.Add($_.Key, $false); }); $Local:NewUsers | ForEach-Object { $Local:TableWithInsertions.Add($_.Email, $true); }; [Object[]]$Local:TableWithInsertions = $Local:TableWithInsertions.GetEnumerator() | Sort-Object -Property Key; @@ -589,7 +596,7 @@ function Update-Data([PSCustomObject[]]$NewData, [OfficeOpenXml.ExcelWorksheet]$ # Only insert new column if required. If ($AddNewData) { - [String]$Local:NewColumnName = Get-Date -Format "MMM-yy"; + [String]$Local:NewColumnName = Get-Date -Format 'MMM-yy'; [Int]$Local:NewColumnIndex = [Math]::Max(3, $WorkSheet.Dimension.Columns + 1); $WorkSheet.Cells[1, $Local:NewColumnIndex].Value = $Local:NewColumnName; } @@ -612,7 +619,7 @@ function Update-Data([PSCustomObject[]]$NewData, [OfficeOpenXml.ExcelWorksheet]$ If ($AddNewData) { $Local:Cell = $WorkSheet.Cells[$Local:Row, $Local:NewColumnIndex]; $Local:Cell.Value = $Local:User.MFA_Phone; - $Local:Cell.Style.Numberformat.Format = "@"; + $Local:Cell.Style.Numberformat.Format = '@'; $Local:Cell.Style.Fill.PatternType = [OfficeOpenXml.Style.ExcelFillStyle]::None; } } @@ -677,7 +684,7 @@ function Set-Styles( [String]$Local:LastColumn = $Local:LastColumn -replace '[0-9]', ''; Set-ExcelRange -Worksheet $WorkSheet -Range "A1:$($Local:LastColumn)1" -Bold -HorizontalAlignment Center; - if ($WorkSheet.Dimension.Columns -ge 4) { Set-ExcelRange -Worksheet $WorkSheet -Range "D1:$($Local:LastColumn)1" -NumberFormat "MMM-yy" }; + if ($WorkSheet.Dimension.Columns -ge 4) { Set-ExcelRange -Worksheet $WorkSheet -Range "D1:$($Local:LastColumn)1" -NumberFormat 'MMM-yy' }; Set-ExcelRange -Worksheet $WorkSheet -Range "A2:$($Local:LastColumn)$(($WorkSheet.Dimension.Rows))" -AutoSize -ResetFont -BackgroundPattern Solid; # Set-ExcelRange -Worksheet $WorkSheet -Range "A2:$($lastColumn)$($WorkSheet.Dimension.Rows)" # [System.Drawing.Color]::LightSlateGray # Set-ExcelRange -Worksheet $WorkSheet -Range "D2:$($lastColumn)$($WorkSheet.Dimension.Rows)" -NumberFormat "[<=9999999999]####-###-###;+(##) ###-###-###" @@ -695,9 +702,9 @@ function New-BaseWorkSheet([Parameter(Mandatory)][ValidateNotNullOrEmpty()][Offi $WorkSheet.InsertRow(1, 1) $Local:Cells = $WorkSheet.Cells - $Local:Cells[1, 1].Value = "Name" - $Local:Cells[1, 2].Value = "Email" - $Local:Cells[1, 3].Value = "Phone" + $Local:Cells[1, 1].Value = 'Name' + $Local:Cells[1, 2].Value = 'Email' + $Local:Cells[1, 3].Value = 'Phone' } function Get-ActiveWorkSheet( @@ -712,10 +719,10 @@ function Get-ActiveWorkSheet( [OfficeOpenXml.ExcelWorksheet]$Local:ActiveWorkSheet = $ExcelData.Workbook.Worksheets | Where-Object { $_.Name -eq 'Working' }; if ($null -eq $Local:ActiveWorkSheet) { [OfficeOpenXml.ExcelWorksheet]$Local:ActiveWorkSheet = $ExcelData.Workbook.Worksheets.Add('Working') - } else { $Local:ActiveWorkSheet.Name = "Working" } + } else { $Local:ActiveWorkSheet.Name = 'Working' } # Move the worksheets to the correct position - $ExcelData.Workbook.Worksheets.MoveToStart("Working") + $ExcelData.Workbook.Worksheets.MoveToStart('Working') New-BaseWorkSheet -WorkSheet $Local:ActiveWorkSheet; @@ -733,13 +740,13 @@ function Get-HistoryWorkSheet( process { [OfficeOpenXml.ExcelWorksheet]$Local:HistoryWorkSheet = $ExcelData.Workbook.Worksheets[2] - if ($null -eq $HistoryWorkSheet -or $HistoryWorkSheet.Name -ne "History") { - Write-Host -ForegroundColor Cyan "Creating new worksheet for history" - $HistoryWorkSheet = $ExcelData.Workbook.Worksheets.Add("History") + if ($null -eq $HistoryWorkSheet -or $HistoryWorkSheet.Name -ne 'History') { + Write-Host -ForegroundColor Cyan 'Creating new worksheet for history' + $HistoryWorkSheet = $ExcelData.Workbook.Worksheets.Add('History') } # Move the worksheets to the correct position - $ExcelData.Workbook.Worksheets.MoveAfter("History", "Working") + $ExcelData.Workbook.Worksheets.MoveAfter('History', 'Working') New-BaseWorkSheet -WorkSheet $Local:HistoryWorkSheet; diff --git a/src/microsoft/entra/Invoke-TravelAccess.ps1 b/src/microsoft/entra/Invoke-TravelAccess.ps1 deleted file mode 100644 index be34b294..00000000 --- a/src/microsoft/entra/Invoke-TravelAccess.ps1 +++ /dev/null @@ -1,49 +0,0 @@ -param( - [Parameter(Mandatory)] - [ValidateSet('Grant', 'Revoke', 'Check')] - [String]$Action -) - -function Get-TravelGroup { - # If there is a staff group such as Staff UK, add that - # Otherwise only get the travel group -} - -function Add-TravelAccess { - -} - -function Remove-TravelAccess { - # Remove group from user - -} - -function Test-TravelAccess { - # Try to use graph api to use whatif with a generated ip from country-ip -} - -Import-Module $PSScriptRoot/../../common/Environment.psm1; -Invoke-RunMain $PSCmdlet { - # Get exact users by recursive input quary - - switch ($Action) { - 'Grant' { - $users = Invoke-GetUsers -Query "Department -eq 'Travel'"; - $users | ForEach-Object { - Invoke-GrantAccess -User $_ -Resource 'Travel'; - } - } - 'Revoke' { - $users = Invoke-GetUsers -Query "Department -eq 'Travel'"; - $users | ForEach-Object { - Invoke-RevokeAccess -User $_ -Resource 'Travel'; - } - } - 'Check' { - $users = Invoke-GetUsers -Query "Department -eq 'Travel'"; - $users | ForEach-Object { - Invoke-CheckAccess -User $_ -Resource 'Travel'; - } - } - } -}; diff --git a/src/microsoft/entra/New-User.ps1 b/src/microsoft/entra/New-User.ps1 index 4a26fb05..f92f4742 100644 --- a/src/microsoft/entra/New-User.ps1 +++ b/src/microsoft/entra/New-User.ps1 @@ -1,3 +1,9 @@ +Using module ../../common/Environment.psm1 +Using module ../../common/Connect.psm1 +Using module ../../common/Input.psm1 + +Using module Microsoft.Graph.Identity.DirectoryManagement + function Get-RandomPassword { # Generate a random password using RPGen } @@ -11,9 +17,8 @@ function New-User { # Use a auto complete input box to allow the user to select the licenses } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { - Invoke-EnsureModule -Modules 'Graph' -Scopes ''; + Connect-Service -Services @('Graph') -Scopes @('User.ReadWrite.All', 'Directory.ReadWrite.All'); #region - Get user details diff --git a/src/microsoft/entra/OffboardUser.ps1 b/src/microsoft/entra/OffboardUser.ps1 index c5a15ae3..282e14e6 100644 --- a/src/microsoft/entra/OffboardUser.ps1 +++ b/src/microsoft/entra/OffboardUser.ps1 @@ -1,3 +1,8 @@ +Using module ../../common/Environment.psm1 +Using module ../Common.psm1 +Using module ExchangeOnlineManagement +Using module Microsoft.Graph.Users + Using namespace Microsoft.Graph.PowerShell.Models; function Update-Mailbox { @@ -21,9 +26,7 @@ function Update-User { # Remove all licenses (This may need to be done after everything else) } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { - Invoke-EnsureModule "$PSScriptRoot/../Common.psm1", 'ExchangeOnlineManagement', 'Microsoft.Graph'; Connect-Service 'Graph','ExchangeOnline' -Scopes @('User.ReadWrite.All', 'Directory.ReadWrite.All'); # TODO :: Filter by licensed and enabled diff --git a/src/microsoft/entra/StaffLocation.ps1 b/src/microsoft/entra/StaffLocation.ps1 index a114cafe..1e204251 100644 --- a/src/microsoft/entra/StaffLocation.ps1 +++ b/src/microsoft/entra/StaffLocation.ps1 @@ -24,8 +24,8 @@ param() Class CountryNames : System.Management.Automation.IValidateSetValuesGenerator { [String[]]GetValidValues() { return [CultureInfo]::GetCultures([System.Globalization.CultureTypes]::SpecificCultures) ` - | ForEach-Object { (New-Object System.Globalization.RegionInfo $_.Name).EnglishName } ` - | Select-Object -Unique | Sort-Object; + | ForEach-Object { (New-Object System.Globalization.RegionInfo $_.Name).EnglishName } ` + | Select-Object -Unique | Sort-Object; } } @@ -92,7 +92,7 @@ function Set-SecurityGroup { -MailEnabled:$True ` -SecurityEnabled:$True ` -MailNickname:$GroupName ` - -Description:"Staff Security Group"; + -Description:'Staff Security Group'; Invoke-Info "Security Group $GroupName has been updated."; @@ -179,8 +179,8 @@ function Set-ConditionalAccessPolicy { # -Question 'Please enter the name which will be used to create the security group, named location and conditional access policy.'; [String[]]$Local:PossibleCountries = [CultureInfo]::GetCultures([System.Globalization.CultureTypes]::SpecificCultures) ` - | ForEach-Object { (New-Object System.Globalization.RegionInfo $_.Name).EnglishName } ` - | Select-Object -Unique | Sort-Object; + | ForEach-Object { (New-Object System.Globalization.RegionInfo $_.Name).EnglishName } ` + | Select-Object -Unique | Sort-Object; Invoke-Info 'Please select the primary country first and then select the secondary countries.'; [String[]]$Local:Countries = @(); @@ -209,7 +209,7 @@ function Set-ConditionalAccessPolicy { [Boolean]$Local:ValidatedPolicy = Test-ConditionalAccessPolicy -PolicyName:$Local:PolicyName; if ($Local:ValidatedGroup -and $Local:ValidatedLocation -and $Local:ValidatedPolicy) { - Invoke-Info "Staff Location is setup correctly."; + Invoke-Info 'Staff Location is setup correctly.'; } else { Invoke-Info " Component Test Results: @@ -217,7 +217,7 @@ function Set-ConditionalAccessPolicy { - Named Location: $Local:LocationName - Conditional Access Policy: $Local:PolicyName ".Trim(); - Invoke-Info "Staff Location is not setup correctly."; + Invoke-Info 'Staff Location is not setup correctly.'; Invoke-Info "Please run the script with the 'Set' action to create the missing components."; } } @@ -249,7 +249,7 @@ dynamicparam { $Parameters = $Local:ScriptBlock.Ast.ParamBlock.Parameters; if ($Parameters.Count -eq 0) { - Write-Host "No parameters found."; + Write-Host 'No parameters found.'; return; } else { Write-Host "Found $($Parameters.Count) parameters."; diff --git a/src/microsoft/intune/Setup.ps1 b/src/microsoft/intune/Setup.ps1 index 2f63c475..f2b5a36d 100644 --- a/src/microsoft/intune/Setup.ps1 +++ b/src/microsoft/intune/Setup.ps1 @@ -3,7 +3,15 @@ Before use, must opt into beta shcemas, after logging into MSGraph run Update-MSGraphEnvironment -SchemaVersion 'beta'; #> -#Requires -Modules Microsoft.Graph.Authentication,Microsoft.Graph.Beta.DeviceManagement,Microsoft.Graph.Beta.Groups +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Connect.psm1 +Using module ../../common/Scope.psm1 +Using module ../../common/Exit.psm1 + +Using module Microsoft.Graph.Authentication +Using module Microsoft.Graph.Beta.DeviceManagement +Using module Microsoft.Graph.Beta.Groups using namespace Microsoft.Graph.Beta.PowerShell.Models; @@ -13,7 +21,7 @@ param() #region - Utilities functions function Get-IntuneGroup { - $Local:GroupName = "Intune Users"; + $Local:GroupName = 'Intune Users'; $Local:IntuneGroup = Get-MgBetaGroup -Filter "displayName eq '$Local:GroupName'" -All:$true; if (-not $Local:IntuneGroup) { @@ -21,7 +29,7 @@ function Get-IntuneGroup { $Local:IntuneGroup = New-MgBetaGroup ` -DisplayName $Local:GroupName ` -MailEnabled:$False ` - -MailNickname "intune" ` + -MailNickname 'intune' ` -SecurityEnabled:$True ` -Description 'Group for users that are managed by Intune.'; } @@ -91,8 +99,7 @@ function Local:Set-Configuration( $Local:ConfigurationIsDifferent = $true; break; - } - else { + } else { Invoke-Debug "Property '$($Local:Property.Name)' is the same, skipping."; } } @@ -105,8 +112,7 @@ function Local:Set-Configuration( [String]$Local:ConfigurationId = $Local:ExistingConfiguration.Id; [String]$Local:JsonConfiguration = $Configuration | ConvertTo-Json -Depth 99; $UpdateConfiguration.InvokeReturnAsIs(@($Local:ConfigurationId, $Local:JsonConfiguration)); - } - else { + } else { Invoke-Info "Creating configuration '$Local:ConfigurationName'."; if ($null -ne $NewConfigurationExtra) { @@ -215,9 +221,9 @@ function Get-CommonCompliance( [Switch]$WithHarden ) { $Local:Common = @{ - "${PassVar}Required" = $true; - "${PassVar}RequiredType" = 'deviceDefault'; - "${PassVar}MinutesOfInactivityBeforeLock" = 15; + "${PassVar}Required" = $true; + "${PassVar}RequiredType" = 'deviceDefault'; + "${PassVar}MinutesOfInactivityBeforeLock" = 15; }; if ($WithExpiration) { @@ -235,89 +241,89 @@ function Get-CommonCompliance( function New-DeviceCompliancePolicy_Windows { New-CompliancePolicy 'Windows' '#microsoft.graph.windows10CompliancePolicy' (@{ - passwordRequiredToUnlockFromIdle = $true; - passwordMinimumCharacterSetCount = $null; - - requireHealthyDeviceReport = $true; - osMinimumVersion = $null; - osMaximumVersion = $null; - mobileOsMinimumVersion = $null; - mobileOsMaximumVersion = $null; - validOperatingSystemBuildRanges = @(); - - tpmRequired = $true; - bitLockerEnabled = $true; - secureBootEnabled = $true; - codeIntegrityEnabled = $true; - storageRequireEncryption = $true; - earlyLaunchAntiMalwareDriverEnabled = $false; - # TODO: Figure out how to enable these - #memoryIntegrityEnabled = $true; - #kernelDmaProtectionEnabled = $true; - #virtualizationBasedSecurityEnabled = $true; - #firmwareProtectionEnabled = $true; - - activeFirewallRequired = $true; - defenderEnabled = $true; - defenderVersion = $null; - signatureOutOfDate = $true; - rtpEnabled = $false; # SentinalOne is used - antivirusRequired = $true; - antiSpywareRequired = $true; - - deviceThreatProtectionEnabled = $true; - deviceThreatProtectionRequiredSecurityLevel = 'low'; - - deviceCompliancePolicyScript = $null - configurationManagerComplianceRequired = $false; - } + (Get-CommonCompliance -PassVar 'password' -WithExpiration -WithHarden)); + passwordRequiredToUnlockFromIdle = $true; + passwordMinimumCharacterSetCount = $null; + + requireHealthyDeviceReport = $true; + osMinimumVersion = $null; + osMaximumVersion = $null; + mobileOsMinimumVersion = $null; + mobileOsMaximumVersion = $null; + validOperatingSystemBuildRanges = @(); + + tpmRequired = $true; + bitLockerEnabled = $true; + secureBootEnabled = $true; + codeIntegrityEnabled = $true; + storageRequireEncryption = $true; + earlyLaunchAntiMalwareDriverEnabled = $false; + # TODO: Figure out how to enable these + #memoryIntegrityEnabled = $true; + #kernelDmaProtectionEnabled = $true; + #virtualizationBasedSecurityEnabled = $true; + #firmwareProtectionEnabled = $true; + + activeFirewallRequired = $true; + defenderEnabled = $true; + defenderVersion = $null; + signatureOutOfDate = $true; + rtpEnabled = $false; # SentinalOne is used + antivirusRequired = $true; + antiSpywareRequired = $true; + + deviceThreatProtectionEnabled = $true; + deviceThreatProtectionRequiredSecurityLevel = 'low'; + + deviceCompliancePolicyScript = $null + configurationManagerComplianceRequired = $false; + } + (Get-CommonCompliance -PassVar 'password' -WithExpiration -WithHarden)); } function New-DeviceCompliancePolicy_Android { New-CompliancePolicy 'Android' '#microsoft.graph.androidWorkProfileCompliancePolicy' (@{ - requiredPasswordComplexity = 'medium' - - securityPreventInstallAppsFromUnknownSources = $false - securityDisableUsbDebugging = $false - securityRequireVerifyApps = $false - securityBlockJailbrokenDevices = $false - securityRequireSafetyNetAttestationBasicIntegrity = $true - securityRequireSafetyNetAttestationCertifiedDevice = $true - securityRequireGooglePlayServices = $true - securityRequireUpToDateSecurityProviders = $true - securityRequireCompanyPortalAppIntegrity = $true - - deviceThreatProtectionEnabled = $true - deviceThreatProtectionRequiredSecurityLevel = 'low' - advancedThreatProtectionRequiredSecurityLevel = 'low' - - osMinimumVersion = '11' - storageRequireEncryption = $true - } + (Get-CommonCompliance -PassVar 'password')); + requiredPasswordComplexity = 'medium' + + securityPreventInstallAppsFromUnknownSources = $false + securityDisableUsbDebugging = $false + securityRequireVerifyApps = $false + securityBlockJailbrokenDevices = $false + securityRequireSafetyNetAttestationBasicIntegrity = $true + securityRequireSafetyNetAttestationCertifiedDevice = $true + securityRequireGooglePlayServices = $true + securityRequireUpToDateSecurityProviders = $true + securityRequireCompanyPortalAppIntegrity = $true + + deviceThreatProtectionEnabled = $true + deviceThreatProtectionRequiredSecurityLevel = 'low' + advancedThreatProtectionRequiredSecurityLevel = 'low' + + osMinimumVersion = '11' + storageRequireEncryption = $true + } + (Get-CommonCompliance -PassVar 'password')); } function New-DeviceCompliancePolicy_MacOS { New-CompliancePolicy 'MacOS' '#microsoft.graph.macOSCompliancePolicy' (@{ - systemIntegrityProtectionEnabled = $true - deviceThreatProtectionEnabled = $true - storageRequireEncryption = $true - firewallEnabled = $true - firewallBlockAllIncoming = $false - firewallEnableStealthMode = $true - gatekeeperAllowedAppSource = 'macAppStoreAndIdentifiedDevelopers' - } + (Get-CommonCompliance -PassVar 'password' -WithExpiration -WithHarden)); + systemIntegrityProtectionEnabled = $true + deviceThreatProtectionEnabled = $true + storageRequireEncryption = $true + firewallEnabled = $true + firewallBlockAllIncoming = $false + firewallEnableStealthMode = $true + gatekeeperAllowedAppSource = 'macAppStoreAndIdentifiedDevelopers' + } + (Get-CommonCompliance -PassVar 'password' -WithExpiration -WithHarden)); } function New-DeviceCompliancePolicy_iOS { New-CompliancePolicy 'iOS' '#microsoft.graph.iosCompliancePolicy' (@{ - passcodeMinutesOfInactivityBeforeScreenTimeout = 15 - - securityBlockJailbrokenDevices = $true - deviceThreatProtectionEnabled = $true - deviceThreatProtectionRequiredSecurityLevel = 'low' - advancedThreatProtectionRequiredSecurityLevel = 'low' - managedEmailProfileRequired = $false - } + (Get-CommonCompliance -PassVar 'passcode' -WithExpiration -Expiration:65535 -WithHarden)); + passcodeMinutesOfInactivityBeforeScreenTimeout = 15 + + securityBlockJailbrokenDevices = $true + deviceThreatProtectionEnabled = $true + deviceThreatProtectionRequiredSecurityLevel = 'low' + advancedThreatProtectionRequiredSecurityLevel = 'low' + managedEmailProfileRequired = $false + } + (Get-CommonCompliance -PassVar 'passcode' -WithExpiration -Expiration:65535 -WithHarden)); } #endregion - Device Compliance Policies @@ -381,28 +387,28 @@ $Script:DeviceConfigurationProfiles = @( # activeDirectoryDomainName = (Get-MgDomain | Where-Object { $_.IsDefault -eq $True } | Select-Object -ExpandProperty Id); # }) (New-DeviceConfigurationProfile 'Windows' 'Debloat' @{ - '@odata.type' = '#microsoft.graph.windows10GeneralConfiguration'; - searchDisableUseLocation = $True; - searchDisableLocation = $True; - searchBlockWebResults = $True; + '@odata.type' = '#microsoft.graph.windows10GeneralConfiguration'; + searchDisableUseLocation = $True; + searchDisableLocation = $True; + searchBlockWebResults = $True; - diagnosticsDataSubmissionMode = 'basic'; + diagnosticsDataSubmissionMode = 'basic'; - inkWorkspaceAccess = 'disabled'; - inkWorkspaceAccessState = 'blocked'; - inkWorkspaceBlockSuggestedApps = $True; + inkWorkspaceAccess = 'disabled'; + inkWorkspaceAccessState = 'blocked'; + inkWorkspaceBlockSuggestedApps = $True; - lockScreenBlockCortana = $True; + lockScreenBlockCortana = $True; lockScreenBlockToastNotifications = $True; - settingsBlockGamingPage = $True; + settingsBlockGamingPage = $True; - cortanaBlocked = $True; - windowsSpotlightBlocked = $True; - smartScreenBlockPromptOverride = $True; - internetSharingBlocked = $True; - gameDvrBlocked = $True; - uninstallBuiltInApps = $True; + cortanaBlocked = $True; + windowsSpotlightBlocked = $True; + smartScreenBlockPromptOverride = $True; + internetSharingBlocked = $True; + gameDvrBlocked = $True; + uninstallBuiltInApps = $True; }) # (New-DeviceConfigurationProfile 'Windows' 'Identity Protection' @{ @@ -450,7 +456,6 @@ function Set-CustomPolicies { #endregion - Conditional Access Policies -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service -Services 'Graph' -Scopes DeviceManagementServiceConfig.ReadWrite.All,deviceManagementConfiguration.ReadWrite.All, Group.ReadWrite.All; @@ -461,13 +466,13 @@ Invoke-RunMain $PSCmdlet { # Set the Connectors Invoke-Info 'Setting up the Intune Connectors...'; Invoke-MgGraphRequest -Method POST -Uri 'beta/deviceManagement/dataProcessorServiceForWindowsFeaturesOnboarding' -Body (@{ - "@odata.type" = "#microsoft.graph.dataProcessorServiceForWindowsFeaturesOnboarding"; - hasValidWindowsLicense = $True; - areDataProcessorServiceForWindowsFeaturesEnabled = $True; - }) + '@odata.type' = '#microsoft.graph.dataProcessorServiceForWindowsFeaturesOnboarding'; + hasValidWindowsLicense = $True; + areDataProcessorServiceForWindowsFeaturesEnabled = $True; + }) # Setup the Intune Group - [MicrosoftGraphGroup]$Local:IntuneGroup = Get-IntuneGroup + [MicrosoftGraphGroup]$Local:IntuneGroup = Get-IntuneGroup; Invoke-Info 'Setting up Intune device compliance policies...'; [PSCustomObject[]]$Local:DeviceCompliancePolicies = @((New-DeviceCompliancePolicy_Windows), (New-DeviceCompliancePolicy_Android), (New-DeviceCompliancePolicy_MacOS), (New-DeviceCompliancePolicy_iOS)); diff --git a/src/microsoft/reports/Exchange.ps1 b/src/microsoft/reports/Exchange.ps1 index 8bed053d..013e7185 100644 --- a/src/microsoft/reports/Exchange.ps1 +++ b/src/microsoft/reports/Exchange.ps1 @@ -1,3 +1,7 @@ +Using module ../../common/Environment.psm1 +Using module ../../common/Connect.psm1 +Using module ExchangeOnlineManagement + function Get-SharedMailboxes { Get-Mailbox -RecipientTypeDetails SharedMailbox -ResultSize:Unlimited | ForEach-Object { Get-MailboxPermission -Identity $_.WindowsEmailAddress } | Select-Object Identity, User, AccessRights | Where-Object { ($_.user -like '*@*') } | Export-Csv sharedfolders.csv -NoTypeInformation Get-Mailbox -RecipientTypeDetails SharedMailbox -ResultSize:Unlimited | Where-Object { $_.DisplayName -notlike 'zArchived - *' } | ForEach-Object { Get-MailboxFolderPermission -Identity $_.PrimarySmtpAddress } | Select-Object Identity, User, AccessRights | Export-Csv sharedfolders.csv -NoTypeInformation -Append diff --git a/src/misc/Export-KaseyaQuotes.ps1 b/src/misc/Export-KaseyaQuotes.ps1 index 4f74c9bc..a7bd1152 100644 --- a/src/misc/Export-KaseyaQuotes.ps1 +++ b/src/misc/Export-KaseyaQuotes.ps1 @@ -1,3 +1,8 @@ +Using module ../common/Environment.psm1 +Using module ../common/Input.psm1 +Using module ../common/Logging.psm1 +Using module ../common/Exit.psm1 + [CmdletBinding()] param( [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, HelpMessage = 'Where to save the output file.')] @@ -33,22 +38,19 @@ function Invoke-ApiRequest { do { if ($null -ne $Parameters -and $Parameters.Count -gt 0) { $Private:UsingUri = $Local:Uri + '?' + ($Parameters.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" }) -join '&'; - } - else { + } else { $Private:UsingUri = $Local:Uri; } Invoke-Debug "Requesting Uri {{$Private:UsingUri}} with headers {{$($Local:Headers | ConvertTo-Json)}}"; try { $Local:Response = Invoke-WebRequest -UseBasicParsing -Uri $Local:UsingUri -Headers $Local:Headers; - } - catch [Microsoft.PowerShell.Commands.HttpResponseException] { + } catch [Microsoft.PowerShell.Commands.HttpResponseException] { if ($_.Exception.Response.StatusCode -eq 429) { Invoke-Info 'Rate limit reached, waiting 60 seconds before retrying...'; Start-Sleep -Seconds 60; continue; - } - else { + } else { Invoke-Error "There was an error with the API request. Please try again: $($_.Exception.Response.Content)"; break; } @@ -57,13 +59,11 @@ function Invoke-ApiRequest { if ($Local:Response.StatusCode -eq 200) { return $Local:Response.Content | ConvertFrom-Json; - } - else { + } else { Invoke-Error "There was an error with the API request. Please try again: $($_.Exception.Response.Content)"; Invoke-FailedExit -ExitCode 9999; } - } - else { + } else { $Private:Responses = @(); while ($True) { $Private:NextPage = "${Local:Uri}?page=$($Private:Responses.Count + 1)&pagesize=100"; @@ -74,14 +74,12 @@ function Invoke-ApiRequest { Invoke-Debug "Requesting Uri {{$Private:NextPage}} with headers {{$($Local:Headers | ConvertTo-Json)}}"; try { $Private:Response = Invoke-WebRequest -UseBasicParsing -Uri $Private:NextPage -Headers $Local:Headers - } - catch [Microsoft.PowerShell.Commands.HttpResponseException] { + } catch [Microsoft.PowerShell.Commands.HttpResponseException] { if ($_.Exception.Response.StatusCode -eq 429) { Invoke-Info 'Rate limit reached, waiting 60 seconds before retrying...'; Start-Sleep -Seconds 60; continue; - } - else { + } else { Invoke-Error "There was an error with the API request. Please try again: $($_.Exception.Response.Content)"; Invoke-FailedExit -ExitCode 9999 -ErrorRecord $_; } @@ -106,7 +104,6 @@ function Invoke-ApiRequest { } } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { trap { Remove-Variable -Scope Global -Name 'Quotes' -ErrorAction SilentlyContinue; @@ -137,8 +134,7 @@ Invoke-RunMain $PSCmdlet { if ($null -ne $InputData -and $InputData.ContainsKey($VariableName)) { Invoke-Debug "Setting variable $VariableName from input data."; Set-Variable -Scope Global -Name $VariableName -Value $InputData[$VariableName]; - } - else { + } else { Invoke-Debug "Setting variable $VariableName from lazy block."; Set-Variable -Scope Global -Name $VariableName -Value (&$LazyBlock); } @@ -238,8 +234,7 @@ Invoke-RunMain $PSCmdlet { Categories = $Global:Categories; Customers = $Global:Customers; } | ConvertTo-Json -Depth 9 | Out-File -FilePath $OutputPath -Force; - } - else { + } else { $Global:Quotes | ForEach-Object { Invoke-Debug "Processing quote $($_.id)"; diff --git a/src/misc/Setup-SecretManagement.ps1 b/src/misc/Setup-SecretManagement.ps1 index 02e6ef76..cf2c9b43 100644 --- a/src/misc/Setup-SecretManagement.ps1 +++ b/src/misc/Setup-SecretManagement.ps1 @@ -1,5 +1,10 @@ #Requires -Version 7.4 +Using module ../common/Environment.psm1 +Using module ../common/Ensure.psm1 +Using module ../common/Input.psm1 +Using module Microsoft.Powershell.SecretManagement + [CmdletBinding()] param() @@ -21,7 +26,6 @@ function Install-1Password { Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureUser; - Invoke-EnsureModule -Modules @('Microsoft.Powershell.SecretManagement'); Install-ModuleFromGitHub -GitHubRepo 'cdhunt/SecretManagement.1Password' -Branch 'vNext' -Scope CurrentUser; Install-1Password; diff --git a/utils/Invoke-Linter.ps1 b/utils/Invoke-Linter.ps1 index 93c09282..58c4ddf4 100644 --- a/utils/Invoke-Linter.ps1 +++ b/utils/Invoke-Linter.ps1 @@ -1,11 +1,12 @@ -Import-Module $PSScriptRoot/../src/common/Environment.psm1; -Invoke-RunMain $PSCommandPath { +Using module ../src/common/Environment.psm1 + +Invoke-RunMain $PSCmdlet { Invoke-EnsureModule -Modules 'PSScriptAnalyzer'; $Local:Results = Invoke-ScriptAnalyzer ` -Path $PSSCriptRoot/../src ` -Recurse ` - -ExcludeRule PSReviewUnusedParameter; + -Settings ..\PSScriptAnalyzerSettings.psd1; if ($Local:Results.Count -gt 0) { $Local:Results | Format-Table -AutoSize; From 32a8c0b8f219cd026babfbf3fef5ec71792e47d7 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 18:10:20 +1000 Subject: [PATCH 118/341] refactor(Compiler): Encode as base64 instead of hex for better file sizes --- src/Compiler/Module/Compiled/Remote.cs | 10 +++++++++- src/Compiler/Resources/ScriptTemplate.ps1 | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 8a2642e7..63d94d43 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -37,7 +37,14 @@ MemoryStream memoryStream }; } - public override string StringifyContent() => $"'{Convert.ToHexString(MemoryStream.ToArray())}'"; + public override string StringifyContent() { + // Convert to a powershell byte array + var bytes = new byte[MemoryStream.Length]; + MemoryStream.Read(bytes, 0, bytes.Length); + var base64 = Convert.ToBase64String(bytes); + return $"'{base64}'"; + } + public IEnumerable GetExported(object? data, CommandTypes commandTypes) { switch (data) @@ -82,6 +89,7 @@ public override IEnumerable GetExportedFunctions() exportedFunctions.AddRange(functionsToExport); exportedFunctions.AddRange(cmdletsToExport); + exportedFunctions.AddRange(aliasesToExport); return exportedFunctions; } diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index 0320e86a..61022f24 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -44,12 +44,12 @@ begin { $Script:ScriptPath = $Local:InnerModulePath; } } - 'ZipHex' { + 'Zip' { if ((Get-ChildItem -Path $Local:ModuleFolderPath).Count -ne 0) { return; } [String]$Local:TempFile = [System.IO.Path]::GetTempFileName(); - [Byte[]]$Local:Bytes = [System.Convert]::FromHexString($Content); + [Byte[]]$Local:Bytes = [System.Convert]::FromBase64String($Content); [System.IO.File]::WriteAllBytes($Local:TempFile, $Local:Bytes); Write-Verbose "Expanding module file: $Local:TempFile" From 33b15f0109154493dc2bf92058cfea93f74a1eb3 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 18:11:02 +1000 Subject: [PATCH 119/341] fix(Compiler): Keep directory tree for output --- src/Compiler/Program.cs | 96 ++++++++++++++++++++++++++++------------- 1 file changed, 66 insertions(+), 30 deletions(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 4cb52af5..143b507f 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -68,6 +68,9 @@ public static void Main(string[] args) CleanInput(opts); IsDebugging = SetupLogger(opts) <= LogLevel.Debug; + var filesToCompile = GetFilesToCompile(opts.Input!); + EnsureDirectoryStructure(opts.Input!, opts.Output, filesToCompile); + ConcurrentBag<(string, Exception)> compilerErrors = []; // TODO - Super parent, Submit completed scripts so they can be resolved by other scripts CancelSource.Token.Register(() => Logger.Error("Compilation was cancelled.")); @@ -80,8 +83,9 @@ public static void Main(string[] args) if (compiledScript == null && opts.FailFast) { CancelSource.Cancel(); } if (compiledScript == null) return; OutputToFile( + opts.Input!, opts.Output, - Path.ChangeExtension(compiledScript.ModuleSpec.Name, "ps1"), + script, compiledScript.GetPowerShellObject(), opts.Force ); @@ -152,8 +156,9 @@ public static void Main(string[] args) public static void CleanInput(Options opts) { - opts.Input = Path.GetFullPath(opts.Input!.Trim()); + ArgumentException.ThrowIfNullOrWhiteSpace(opts.Input, nameof(opts.Input)); + opts.Input = Path.GetFullPath(opts.Input!.Trim()); if (opts.Output != null) { opts.Output = Path.GetFullPath(opts.Output.Trim()); @@ -165,26 +170,6 @@ public static void CleanInput(Options opts) } } - public static IEnumerable GetFilesToCompile(string input) - { - if (File.Exists(input)) - { - yield return input; - } - else if (Directory.Exists(input)) - { - foreach (var file in Directory.EnumerateFiles(input, "*.ps1", SearchOption.AllDirectories)) - { - yield return file; - } - } - else - { - Logger.Error("Input must be a file or directory."); - Environment.Exit(1); - } - } - public static LogLevel SetupLogger(Options opts) { var logLevel = LogLevel.FromOrdinal(Math.Abs(Math.Min(opts.Quiet, 3) - Math.Min(opts.Verbosity, 2) + 2)); @@ -270,26 +255,77 @@ public static LogLevel SetupLogger(Options opts) return logLevel; } + public static string GetOutputLocation( + string sourceDirectory, + string outputDirectory, + string targetFile) + { + if (sourceDirectory == targetFile) return Path.Combine(outputDirectory, Path.GetFileName(targetFile)); + + var relativePath = Path.GetRelativePath(sourceDirectory, targetFile); + return Path.Combine(outputDirectory, relativePath); + } + + + public static IEnumerable GetFilesToCompile(string input) + { + if (File.Exists(input)) + { + yield return input; + } + else if (Directory.Exists(input)) + { + foreach (var file in Directory.EnumerateFiles(input, "*.ps1", SearchOption.AllDirectories)) + { + yield return file; + } + } + else + { + Logger.Error("Input must be a file or directory."); + Environment.Exit(1); + } + } + + public static void EnsureDirectoryStructure( + string sourceDirectory, + string? outputDirectory, + IEnumerable scripts + ) + { + if (string.IsNullOrWhiteSpace(outputDirectory)) return; + if (!Directory.Exists(sourceDirectory)) return; + + if (!Directory.Exists(outputDirectory)) Directory.CreateDirectory(outputDirectory); + + foreach (var script in scripts) + { + var outputDir = Path.GetDirectoryName(GetOutputLocation(sourceDirectory, outputDirectory, script)); + if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir!); + } + } + public static async void OutputToFile( - string? directory, + string sourceDirectory, + string? outputDirectory, string fileName, string content, bool overwrite) { - if (string.IsNullOrWhiteSpace(directory)) + if (string.IsNullOrWhiteSpace(outputDirectory)) { // Output to console to allow for piping Console.OpenStandardOutput().Write(Encoding.UTF8.GetBytes(content)); return; } - var output = Path.Combine(directory, fileName); - if (File.Exists(output)) + var outputPath = GetOutputLocation(sourceDirectory, outputDirectory, fileName); + if (File.Exists(outputPath)) { var removeFile = overwrite; if (!removeFile) { - Logger.Info($"File {output} already exists. Overwrite? (Y/n)"); + Logger.Info($"File {outputPath} already exists. Overwrite? (Y/n)"); var response = Console.ReadLine(); removeFile = string.IsNullOrWhiteSpace(response) || response.Equals("y", StringComparison.CurrentCultureIgnoreCase); } @@ -297,12 +333,12 @@ public static async void OutputToFile( if (removeFile) { Logger.Trace("Removing file"); - File.Delete(output); + File.Delete(outputPath); } } - Logger.Info($"Writing to file {output}"); - using var fileStream = File.Open(output, FileMode.CreateNew, FileAccess.Write, FileShare.None); + Logger.Info($"Writing to file {outputPath}"); + using var fileStream = File.Open(outputPath, FileMode.CreateNew, FileAccess.Write, FileShare.None); await fileStream.WriteAsync(Encoding.UTF8.GetBytes(content)); } From e4ca161043fa5b6846346780d95c6ef7842c4aab Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 18:11:37 +1000 Subject: [PATCH 120/341] fix(Compiler): Missing dll for some powershell modules during resolving --- src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs | 8 ++++++-- src/Compiler/Compiler.csproj | 3 ++- tests/Compiler/Compiler.Test.csproj | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index 180b1373..fb840f0e 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -1,5 +1,6 @@ using System.Management.Automation; using System.Management.Automation.Language; +using System.Management.Automation.Runspaces; using Compiler.Module.Compiled; using NLog; @@ -77,8 +78,11 @@ public static string SanatiseName(string name) public static IEnumerable GetDefaultSessionFunctions() { var defaultFunctions = new List(); - defaultFunctions.AddRange(PowerShell.Create().Runspace.SessionStateProxy.InvokeCommand - .GetCommands("*", CommandTypes.Application | CommandTypes.Function | CommandTypes.Alias | CommandTypes.Cmdlet, true) + + var sessionState = InitialSessionState.CreateDefault(); + var pwsh = PowerShell.Create(sessionState); + defaultFunctions.AddRange(pwsh.Runspace.SessionStateProxy.InvokeCommand + .GetCommands("*", CommandTypes.All, true) .Select(command => command.Name)); var modulesPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "WindowsPowerShell", "v1.0", "Modules"); diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index e4e55298..0e244d30 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -4,12 +4,13 @@ Program Exe - net8 + net8.0-windows enable enable true portable + true preview Properties diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index 303e9c84..2df648fb 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -1,7 +1,7 @@ - net8.0 + net8.0-windows enable enable From ef5b861be6cde346009c2b4f8c5a9c79d02e11e8 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 18:11:54 +1000 Subject: [PATCH 121/341] chore(Compiler): no longer required --- src/Compiler/AstHelper.cs | 2 -- src/Compiler/Module/Resolvable/Remote.cs | 1 - 2 files changed, 3 deletions(-) diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index 1fd0ee0c..b54ef9b6 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -90,8 +90,6 @@ public static Dictionary> FindDeclaredModules return namespaces; } - public static List FindCalledFunctions(Ast ast) => [.. ast.FindAll(testAst => testAst is CommandAst, true).Cast().Where(command => command.GetCommandName() != null)]; - public static List FindAvailableFunctions(Ast ast, bool onlyExported) { var allDefinedFunctions = ast diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index ef792332..fc558c3e 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -1,7 +1,6 @@ using System.Collections; using System.IO.Compression; using System.Management.Automation; -using Compiler.Analyser; using Compiler.Module.Compiled; using Compiler.Requirements; using NLog; From 2fda258a5c3c4c2de3674717c7dd0932f8bb7a7e Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 6 Aug 2024 18:26:55 +1000 Subject: [PATCH 122/341] chore(Compiler): Update DotNet setup action to version 4 and add cache dependency path for packages.lock.json --- .github/workflows/build.yaml | 3 +- src/Compiler/Compiler.csproj | 1 + src/Compiler/packages.lock.json | 849 ++++++++++++++++++++++++++++++++ 3 files changed, 852 insertions(+), 1 deletion(-) create mode 100644 src/Compiler/packages.lock.json diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 539a2d42..1a159de0 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,10 +11,11 @@ jobs: - uses: actions/checkout@v4 - name: Setup DotNet - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: cache: true dotnet-version: 8.0.x + cache-dependency-path: "src/Compiler/packages.lock.json" - name: Install dependencies run: dotnet restore diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 0e244d30..38ce69eb 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -20,6 +20,7 @@ false True $(DefineConstants);PSV7;CORECLR + true + true portable false - ../../Output/Debug/ DEBUG;TRACE prompt 4 @@ -52,7 +48,6 @@ embedded true - ../../Output/Release/ TRACE prompt 4 @@ -64,15 +59,13 @@ + - - - diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 2ffa87c2..8c1725ea 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0-windows7.0": { + "net8.0": { "CommandLineParser": { "type": "Direct", "requested": "[2.9.1, )", @@ -106,6 +106,12 @@ "System.Text.Encoding.CodePages": "8.0.0" } }, + "System.Windows.Forms": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "WL3QPG1q88aIWO0JPOlkCeyNE+FK4ufSKY5j6J6qAFQyfCFiiOYxi8RAhev9H0CS/wmKbIK8qr8xZBod85oWKw==" + }, "JetBrains.Annotations": { "type": "Transitive", "resolved": "2021.2.0", diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index 2df648fb..be54fe2c 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -1,7 +1,7 @@ - net8.0-windows + net8.0 enable enable @@ -14,8 +14,6 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - - From e030bd431c84fe1752a653beb6db12bf7f5f04e3 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 9 Aug 2024 18:39:36 +1000 Subject: [PATCH 127/341] refactor(ci): Upload artifact of compiler and some other fixes --- .github/workflows/build.yaml | 9 +- .github/workflows/compiler.yaml | 15 -- .github/workflows/documentation.yaml | 18 +- .github/workflows/linter.yaml | 10 +- src/Compiler/Compiler.csproj | 12 +- src/Compiler/packages.lock.json | 360 +++++++++++++++++++++++++++ 6 files changed, 393 insertions(+), 31 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ca5aadd0..ab71847a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -4,7 +4,7 @@ on: ["push", "pull_request"] jobs: build: - runs-on: ubuntu-latest + runs-on: windows-latest permissions: contents: read steps: @@ -21,4 +21,9 @@ jobs: run: dotnet restore --locked-mode - name: Build - run: dotnet build + run: dotnet publish .\src\Compiler\Compiler.csproj --sc -c Release + + - uses: actions/upload-artifact@v4 + with: + name: Compiler + path: .\src\Compiler\bin\Release\win-x64\publish\Compiler.exe diff --git a/.github/workflows/compiler.yaml b/.github/workflows/compiler.yaml index 9e361ae6..3b04ba8c 100644 --- a/.github/workflows/compiler.yaml +++ b/.github/workflows/compiler.yaml @@ -40,21 +40,6 @@ jobs: src_deleted: - deleted: 'src/**' - protect-directory: - runs-on: ubuntu-latest - needs: changes - # Only run if changes have been made to the 'compiled' directory - if: ${{ needs.changes.outputs.compiled == 'true' && github.actor != 'github-actions' }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - # Don't run if the push was forced, as this is likely a cleanup. - - if: ${{ github.event_name != 'push' && !github.event.forced }} - run: | - echo "Manual changes to 'compiled' directory are not allowed." - exit 1 - cleanup-directory: runs-on: ubuntu-latest needs: changes diff --git a/.github/workflows/documentation.yaml b/.github/workflows/documentation.yaml index 853bac57..516f3808 100644 --- a/.github/workflows/documentation.yaml +++ b/.github/workflows/documentation.yaml @@ -2,10 +2,14 @@ name: Documentaion on: push: - branches: [ master ] - paths: [ 'docs/**', 'src/**', 'utils/Generate-Documentation.ps1', '.github/workflows/documentation.yaml' ] - pull_request: - paths: [ 'docs/**', 'src/**' ] + branches: [master] + paths: + [ + "docs/**", + "src/**", + "utils/Generate-Documentation.ps1", + ".github/workflows/documentation.yaml", + ] jobs: update_docs: @@ -23,7 +27,9 @@ jobs: - name: Generate Documentation shell: pwsh - run: .\utils\Generate-Documentation.ps1 + run: | + Install-Module -Name platyPS -Scope CurrentUser + .\utils\Generate-Documentation.ps1 - name: Check for changes id: changes @@ -43,7 +49,7 @@ jobs: name: Deploy Documentation runs-on: ubuntu-latest needs: update_docs - if : ${{ github.event_name == 'push' && needs.update_docs.outputs.changes.docs == 'true' }} + if: ${{ github.event_name == 'push' && needs.update_docs.outputs.changes.docs == 'true' }} permissions: contents: read pull-requests: read diff --git a/.github/workflows/linter.yaml b/.github/workflows/linter.yaml index 23fcf142..10830bf5 100644 --- a/.github/workflows/linter.yaml +++ b/.github/workflows/linter.yaml @@ -18,11 +18,15 @@ jobs: - name: Run PSScriptAnalyzer uses: microsoft/psscriptanalyzer-action@main with: - settings: .\PSScriptAnalyzerSettings.psd1 + path: src + recurse: true + ignorePattern: "n-sight/cleaners" + settings: PSScriptAnalyzerSettings.psd1 output: results.sarif - name: Upload SARIF results uses: github/codeql-action/upload-sarif@v3 + if: ${{ always() }} with: sarif_file: results.sarif @@ -43,7 +47,7 @@ jobs: uses: super-linter/super-linter@v6.7.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - EDITORCONFIG_FILE_NAME: ".editorconfig" - POWERSHELL_CONFIG_FILE: "PSScriptAnalyzerSettings.psd1" + EDITORCONFIG_FILE_NAME: .\.editorconfig + POWERSHELL_CONFIG_FILE: .\PSScriptAnalyzerSettings.psd1 FILTER_REGEX_EXCLUDE: ".*compiled/.*|.*docs/.*|LICENSE" SAVE_SUPER_LINTER_OUTPUT: true diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 01397fe0..18fdd996 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -2,14 +2,14 @@ Program - Exe net8.0 + Exe + true + true + enable enable - true - portable - preview Properties Compiler @@ -46,12 +46,14 @@ + false embedded true TRACE prompt - 4 + 3 false + true diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 8c1725ea..525edc90 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -8,6 +8,12 @@ "resolved": "2.9.1", "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.7, )", + "resolved": "8.0.7", + "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.2, )", @@ -850,6 +856,360 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } + }, + "net8.0/win-x64": { + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.4", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", + "Microsoft.PowerShell.Commands.Management": "7.4.2", + "Microsoft.PowerShell.Commands.Utility": "7.4.2", + "Microsoft.PowerShell.ConsoleHost": "7.4.2", + "Microsoft.PowerShell.Security": "7.4.2", + "Microsoft.WSMan.Management": "7.4.2", + "Microsoft.Windows.Compatibility": "8.0.4", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.2", + "System.Net.Http.WinHttpHandler": "8.0.0", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.4", + "System.Management.Automation": "7.4.2", + "System.Text.Json": "6.0.9", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.2", + "System.Management.Automation": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } } } } \ No newline at end of file From 03ac25331090285c1acc9f1021d96b6ab72c6069 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 13 Aug 2024 15:44:56 +1000 Subject: [PATCH 128/341] fix(ci): super linter is really broken rn --- .github/workflows/linter.yaml | 48 +++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/.github/workflows/linter.yaml b/.github/workflows/linter.yaml index 10830bf5..d4ef821e 100644 --- a/.github/workflows/linter.yaml +++ b/.github/workflows/linter.yaml @@ -15,13 +15,18 @@ jobs: security-events: write actions: read steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Run PSScriptAnalyzer uses: microsoft/psscriptanalyzer-action@main with: - path: src + path: .\ recurse: true ignorePattern: "n-sight/cleaners" - settings: PSScriptAnalyzerSettings.psd1 + settings: .\PSScriptAnalyzerSettings.psd1 output: results.sarif - name: Upload SARIF results @@ -30,24 +35,23 @@ jobs: with: sarif_file: results.sarif - lint: - name: Lint - runs-on: ubuntu-latest - permissions: - contents: read - packages: read - statuses: write - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 0 + # lint: + # name: Lint + # runs-on: ubuntu-latest + # permissions: + # contents: read + # packages: read + # statuses: write + # steps: + # - name: Checkout repository + # uses: actions/checkout@v4 + # with: + # fetch-depth: 0 - - name: Super-Linter - uses: super-linter/super-linter@v6.7.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - EDITORCONFIG_FILE_NAME: .\.editorconfig - POWERSHELL_CONFIG_FILE: .\PSScriptAnalyzerSettings.psd1 - FILTER_REGEX_EXCLUDE: ".*compiled/.*|.*docs/.*|LICENSE" - SAVE_SUPER_LINTER_OUTPUT: true + # - name: Super-Linter + # uses: super-linter/super-linter@v6.8.0 + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # POWERSHELL_CONFIG_FILE: .\PSScriptAnalyzerSettings.psd1 + # FILTER_REGEX_EXCLUDE: ".*compiled/.*|.*docs/.*|LICENSE" + # SAVE_SUPER_LINTER_OUTPUT: true From d9789051b90944cf3b92b9413ef707399db5e669 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 13 Aug 2024 15:48:27 +1000 Subject: [PATCH 129/341] refactor(ci): ignore compiled --- .github/workflows/linter.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linter.yaml b/.github/workflows/linter.yaml index d4ef821e..b1e616b3 100644 --- a/.github/workflows/linter.yaml +++ b/.github/workflows/linter.yaml @@ -25,7 +25,7 @@ jobs: with: path: .\ recurse: true - ignorePattern: "n-sight/cleaners" + ignorePattern: '"n-sight/cleaners", "compiled/"' settings: .\PSScriptAnalyzerSettings.psd1 output: results.sarif From cf8bb7523f44dda1223e49090c099585abf660a8 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 26 Aug 2024 14:38:41 +1000 Subject: [PATCH 130/341] style(Compiler): Formatting and license headers --- .editorconfig | 374 ++++++++++++++++++ src/Compiler/Analyser/Analyser.cs | 24 +- src/Compiler/Analyser/Issue.cs | 4 +- src/Compiler/Analyser/Rules/Rule.cs | 6 +- src/Compiler/Analyser/Rules/RuleVisitor.cs | 26 +- .../Analyser/Rules/UseOfUndefinedFunction.cs | 26 +- src/Compiler/Analyser/Suppression.cs | 20 +- src/Compiler/AstHelper.cs | 107 ++--- src/Compiler/Module/Compiled/Compiled.cs | 55 ++- src/Compiler/Module/Compiled/Local.cs | 25 +- src/Compiler/Module/Compiled/Remote.cs | 61 ++- src/Compiler/Module/Compiled/Script.cs | 82 ++-- src/Compiler/Module/Module.cs | 13 +- src/Compiler/Module/Resolvable/Local.cs | 85 ++-- src/Compiler/Module/Resolvable/Remote.cs | 88 ++--- src/Compiler/Module/Resolvable/Resolvable.cs | 43 +- src/Compiler/Module/Resolvable/Script.cs | 53 ++- src/Compiler/Program.cs | 124 +++--- src/Compiler/Requirements/ModuleSpec.cs | 155 ++++---- src/Compiler/Requirements/PSEdition.cs | 23 +- src/Compiler/Requirements/PSVersion.cs | 36 +- src/Compiler/Requirements/Requirements.cs | 90 +++-- src/Compiler/Requirements/RunAsAdmin.cs | 17 +- src/Compiler/Requirements/UsingNamespace.cs | 21 +- src/Compiler/Text/Document.cs | 47 +-- src/Compiler/Text/Span.cs | 197 ++++----- src/Compiler/Text/Updater.cs | 11 +- src/Compiler/Text/Updater/AstUpdater.cs | 23 +- src/Compiler/Text/Updater/Built/HereString.cs | 24 +- src/Compiler/Text/Updater/ExactUpdater.cs | 90 ++--- src/Compiler/Text/Updater/IndentUpdater.cs | 19 +- src/Compiler/Text/Updater/PatternUpdater.cs | 70 ++-- src/Compiler/Text/Updater/RegexUpdater.cs | 55 +-- 33 files changed, 1153 insertions(+), 941 deletions(-) diff --git a/.editorconfig b/.editorconfig index c4c9a485..bd7b66e6 100644 --- a/.editorconfig +++ b/.editorconfig @@ -2,10 +2,13 @@ root = true indent_style = space indent_size = 4 +tab_width = 4 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true +max_line_length = 130 +rulers = 80,100,120 [*.{cmd,bat,cmd,vbs,bas}] end_of_line = crlf @@ -15,3 +18,374 @@ indent_size = 2 [*.{xml,xsd,wsb,csproj}] indent_size = 2 + +#region C# +[*.sln] +indent_style = tab + +[*.{csproj,vbproj,vcxproj.filters,proj,projiFems,shproj,props,targets,nuspec,resx,ruleset,vsixmanifest,vsct}] +indent_size = 2 + +########################################## +# Default .NET Code Style Severities +# https://learn.microsoft.com/dotnet/fundamentals/code-analysis/configuration-options#scope +########################################## +[*.{cs,csx,cake,vb,vbx}] +# Default Severity for all .NET Code Style rules below +dotnet_analyzer_diagnostic.severity = warning + +########################################## +# Language Rules - .NET +# https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/language-rules +########################################## +[*.{cs,csx,cake,vb,vbx}] + +# Expression-level preferences +dotnet_style_object_initializer = true +dotnet_style_collection_initializer = true +dotnet_style_coalesce_expression = true +dotnet_style_null_propagation = true +dotnet_style_prefer_auto_properties = true +dotnet_style_explicit_tuple_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_conditional_expression_over_assignment = true +dotnet_style_prefer_conditional_expression_over_return = false +dotnet_diagnotic.IDE0046.severity = suggestion +dotnet_style_prefer_compound_assignment = true +dotnet_style_prefer_simplified_interpolation = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_namespace_match_folder = true +dotnet_diagnostic.IDE0130.severity = suggestion +dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed + +# Field Preferences +dotnet_style_readonly_field = true +dotnet_diagnostic.CA1051.severity = none + +# Language keyword vs. framework types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always + +# Parameter preferences +dotnet_code_quality_unused_parameters = all + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +# "this."" preferences +dotnet_style_qualification_for_field = true +dotnet_style_qualification_for_property = true +dotnet_style_qualification_for_method = true +dotnet_style_qualification_for_event = true + +########################################## +# Language Rules - C# +# https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/language-rules +########################################## +[*.{cs,csx,cake}] +# File header preferences +file_header_template = Copyright (c) James Draycott. All Rights Reserved.\nLicensed under the GPL3 License, See LICENSE in the project root for license information. + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace + +# Code-block preferences +csharp_prefer_braces = false +csharp_prefer_simple_using_statement = true +dotnet_diagnostic.IDE0063.severity = suggestion +csharp_style_namespace_declarations = file_scoped +csharp_style_prefer_method_group_conversion = true +csharp_style_prefer_top_level_statements = true + +# Expression-bodied members +csharp_style_expression_bodied_constructors = true +csharp_style_expression_bodied_methods = true +csharp_style_expression_bodied_operators = true +csharp_style_expression_bodied_properties = true +csharp_style_expression_bodied_indexers = true +csharp_style_expression_bodied_accessors = true +csharp_style_expression_bodied_lambdas = true +csharp_style_expression_bodied_local_functions = true + +# Expression-level preferences +csharp_style_unused_value_expression_statement_preference = discard_variable +dotnet_diagnostic.IDE0058.severity = none +csharp_style_unused_value_assignment_preference = discard_variable +dotnet_diagnostic.IDE0059.severity = suggestion +csharp_style_throw_expression = true +csharp_style_inlined_variable_declaration = true +csharp_prefer_simple_default_expression = true +csharp_style_pattern_local_over_anonymous_function = true +csharp_style_prefer_local_over_anonymous_function = true +csharp_style_deconstructed_variable_declaration = true +csharp_style_prefer_index_operator = true +csharp_style_prefer_range_operator = true +csharp_style_implicit_object_creation_when_type_is_apparent = true +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_tuple_swap = true +csharp_style_prefer_utf8_string_literals = true + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async +csharp_prefer_static_local_function = true +csharp_style_prefer_readonly_struct = true +csharp_style_prefer_readonly_struct_member = true + +# "null" checking preferences +csharp_style_conditional_delegate_call = true + +# Pattern-matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_switch_expression = true +csharp_style_prefer_pattern_matching = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_extended_property_pattern = true + +# 'var' preferences +csharp_style_var_for_built_in_types = true +csharp_style_var_when_type_is_apparent = true +csharp_style_var_elsewhere = true + +# Undocumented +# https://github.com/dotnet/docs/issues/28791 +csharp_style_prefer_primary_constructors = true + +########################################## +# .NET Coding Conventions - .NET +# https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/dotnet-formatting-options +########################################## +[*.{cs,csx,cake,vb,vbx}] +# .NET code refactoring options +# https://learn.microsoft.com/visualstudio/ide/reference/code-styles-refactoring-options +dotnet_style_operator_placement_when_wrapping = beginning_of_line + +########################################## +# Formatting Rules - .NET +# https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/dotnet-formatting-options +########################################## +[*.{cs,csx,cake,vb,vbx}] +# Using directive options +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = false + +########################################## +# Formatting Rules - C# +# https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/csharp-formatting-options +########################################## +[*.{cs,csx,cake}] +# Newline options +# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#new-line-options +csharp_new_line_before_open_brace = none +csharp_new_line_before_else = false +csharp_new_line_before_catch = false +csharp_new_line_before_finally = false +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Indentation options +# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#indentation-options +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = no_change +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents_when_block = false + + +# Spacing options +# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#spacing-options +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_after_comma = true +csharp_space_before_comma = false +csharp_space_after_dot = false +csharp_space_before_dot = false +csharp_space_after_semicolon_in_for_statement = true +csharp_space_before_semicolon_in_for_statement = false +csharp_space_around_declaration_statements = false +csharp_space_before_open_square_brackets = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_square_brackets = false + +# Wrap options +# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/formatting-rules#wrap-options +csharp_preserve_single_line_statements = true +csharp_preserve_single_line_blocks = true + +########################################## +# .NET Naming Rules +# https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/naming-rules +########################################## +[*.{cs,csx,cake,vb,vbx}] + +########################################## +# Styles +########################################## + +# camel_case_style - Define the camelCase style +dotnet_naming_style.camel_case_style.capitalization = camel_case +# pascal_case_style - Define the PascalCase style +dotnet_naming_style.pascal_case_style.capitalization = pascal_case +# first_upper_style - The first character must start with an upper-case character +dotnet_naming_style.first_upper_style.capitalization = first_word_upper +# prefix_interface_with_i_style - Interfaces must be PascalCase and the first character of an interface must be an 'I' +dotnet_naming_style.prefix_interface_with_i_style.capitalization = pascal_case +dotnet_naming_style.prefix_interface_with_i_style.required_prefix = I +dotnet_naming_style.disallowed_style.capitalization = pascal_case +dotnet_naming_style.internal_error_style.capitalization = pascal_case + +########################################## +# .NET Design Guideline Field Naming Rules +# Naming rules for fields follow the .NET Framework design guidelines +# https://learn.microsoft.com/dotnet/standard/design-guidelines/ +########################################## + +# All public/protected/protected_internal constant fields must be PascalCase +# https://learn.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.public_protected_constant_fields_group.applicable_accessibilities = public, protected_internal, protected +dotnet_naming_symbols.public_protected_constant_fields_group.required_modifiers = const +dotnet_naming_symbols.public_protected_constant_fields_group.applicable_kinds = field +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.symbols = public_protected_constant_fields_group +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.severity = warning + +# All public/protected/protected_internal static readonly fields must be PascalCase +# https://learn.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_accessibilities = public, protected_internal, protected +dotnet_naming_symbols.public_protected_static_readonly_fields_group.required_modifiers = static, readonly +dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_kinds = field +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.symbols = public_protected_static_readonly_fields_group +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.severity = warning + +# No other public/protected/protected_internal fields are allowed +# https://learn.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.other_public_protected_fields_group.applicable_accessibilities = public, protected_internal, protected +dotnet_naming_symbols.other_public_protected_fields_group.applicable_kinds = field +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.symbols = other_public_protected_fields_group +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.style = disallowed_style +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.severity = error + +########################################## +# StyleCop Field Naming Rules +# Naming rules for fields follow the StyleCop analyzers +# This does not override any rules using disallowed_style above +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers +########################################## + +# All constant fields must be PascalCase +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1303.md +dotnet_naming_symbols.stylecop_constant_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private +dotnet_naming_symbols.stylecop_constant_fields_group.required_modifiers = const +dotnet_naming_symbols.stylecop_constant_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.symbols = stylecop_constant_fields_group +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.severity = warning + +# All static readonly fields must be PascalCase +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1311.md +dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private +dotnet_naming_symbols.stylecop_static_readonly_fields_group.required_modifiers = static, readonly +dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.symbols = stylecop_static_readonly_fields_group +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.severity = warning + +# No non-private instance fields are allowed +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1401.md +dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected +dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_kinds = field +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.symbols = stylecop_fields_must_be_private_group +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.style = disallowed_style +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.severity = error + +# Private fields must be PascalCase +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1306.md +dotnet_naming_symbols.stylecop_private_fields_group.applicable_accessibilities = private +dotnet_naming_symbols.stylecop_private_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.symbols = stylecop_private_fields_group +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.style = pascal_case_style +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.severity = warning + +# Local variables must be camelCase +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1312.md +dotnet_naming_symbols.stylecop_local_fields_group.applicable_accessibilities = local +dotnet_naming_symbols.stylecop_local_fields_group.applicable_kinds = local +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.symbols = stylecop_local_fields_group +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.style = camel_case_style +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.severity = silent + +# This rule should never fire. However, it's included for at least two purposes: +# First, it helps to understand, reason about, and root-case certain types of issues, such as bugs in .editorconfig parsers. +# Second, it helps to raise immediate awareness if a new field type is added (as occurred recently in C#). +dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_accessibilities = * +dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_kinds = field +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.symbols = sanity_check_uncovered_field_case_group +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.style = internal_error_style +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.severity = error + + +########################################## +# Other Naming Rules +########################################## + +# All of the following must be PascalCase: +# - Namespaces +# https://learn.microsoft.com/dotnet/standard/design-guidelines/names-of-namespaces +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md +# - Classes and Enumerations +# https://learn.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md +# - Delegates +# https://learn.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces#names-of-common-types +# - Constructors, Properties, Events, Methods +# https://learn.microsoft.com/dotnet/standard/design-guidelines/names-of-type-members +dotnet_naming_symbols.element_group.applicable_kinds = namespace, class, enum, struct, delegate, event, method, property +dotnet_naming_rule.element_rule.symbols = element_group +dotnet_naming_rule.element_rule.style = pascal_case_style +dotnet_naming_rule.element_rule.severity = warning + +# Interfaces use PascalCase and are prefixed with uppercase 'I' +# https://learn.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +dotnet_naming_symbols.interface_group.applicable_kinds = interface +dotnet_naming_rule.interface_rule.symbols = interface_group +dotnet_naming_rule.interface_rule.style = prefix_interface_with_i_style +dotnet_naming_rule.interface_rule.severity = warning + +# Generics Type Parameters use PascalCase +# https://learn.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +dotnet_naming_symbols.type_parameter_group.applicable_kinds = type_parameter +dotnet_naming_rule.type_parameter_rule.symbols = type_parameter_group +dotnet_naming_rule.type_parameter_rule.style = pascal_case_style +dotnet_naming_rule.type_parameter_rule.severity = warning + +# Function parameters use camelCase +# https://learn.microsoft.com/dotnet/standard/design-guidelines/naming-parameters +dotnet_naming_symbols.parameters_group.applicable_kinds = parameter +dotnet_naming_rule.parameters_rule.symbols = parameters_group +dotnet_naming_rule.parameters_rule.style = camel_case_style +dotnet_naming_rule.parameters_rule.severity = warning +#endregion diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index d4f53bea..a926b585 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -1,11 +1,15 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; using Compiler.Analyser.Rules; using Compiler.Module.Compiled; using NLog; namespace Compiler.Analyser; -public static class Analyser -{ +public static class Analyser { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -15,14 +19,14 @@ public static class Analyser private static readonly HashSet Cache = []; - public static void Analyse(CompiledLocalModule module, IEnumerable availableImports) - { + [Pure] + [return: NotNull] + public static List Analyse(CompiledLocalModule module, IEnumerable availableImports) { var key = module.ComputedHash; if (availableImports.Any()) key += availableImports.Select(x => x.ComputedHash).Aggregate((x, y) => x + y); - lock (Cache) - { - if (Cache.Contains(key)) return; + lock (Cache) { + if (Cache.Contains(key)) return []; } Logger.Trace($"Analyzing module {module.ModuleSpec.Name}"); @@ -31,9 +35,9 @@ public static void Analyse(CompiledLocalModule module, IEnumerable ava module.Ast.Visit(visitor); visitor.Issues.ForEach(Program.Issues.Add); - lock (Cache) - { - Cache.Add(key); + lock (Cache) { + _ = Cache.Add(key); } + } } diff --git a/src/Compiler/Analyser/Issue.cs b/src/Compiler/Analyser/Issue.cs index d0f8ebde..37154370 100644 --- a/src/Compiler/Analyser/Issue.cs +++ b/src/Compiler/Analyser/Issue.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation.Language; namespace Compiler.Analyser; @@ -34,4 +37,3 @@ public enum IssueSeverity Error, Warning } - diff --git a/src/Compiler/Analyser/Rules/Rule.cs b/src/Compiler/Analyser/Rules/Rule.cs index 8ca8b8b1..7b27bedc 100644 --- a/src/Compiler/Analyser/Rules/Rule.cs +++ b/src/Compiler/Analyser/Rules/Rule.cs @@ -1,10 +1,12 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation.Language; using Compiler.Module.Compiled; namespace Compiler.Analyser.Rules; -public abstract class Rule -{ +public abstract class Rule { /// /// Determines if the rule should be processed for this Ast node. /// diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs index d61a4e04..2ee27f6b 100644 --- a/src/Compiler/Analyser/Rules/RuleVisitor.cs +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -1,37 +1,33 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation.Language; using Compiler.Module.Compiled; -using NLog; namespace Compiler.Analyser.Rules; public sealed class RuleVisitor( IEnumerable rules, - IEnumerable imports) : AstVisitor -{ - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - + IEnumerable imports) : AstVisitor { private readonly IEnumerable _rules = rules; private readonly IEnumerable _imports = imports; public readonly List Issues = []; - public override AstVisitAction DefaultVisit(Ast ast) - { + public override AstVisitAction DefaultVisit(Ast ast) { var supressions = GetSupressions(ast); - foreach (var rule in _rules) - { + foreach (var rule in this._rules) { if (!rule.ShouldProcess(ast, supressions)) continue; - Issues.AddRange(rule.Analyse(ast, _imports)); + this.Issues.AddRange(rule.Analyse(ast, this._imports)); } return AstVisitAction.Continue; } - public static IEnumerable GetSupressions(Ast ast) - { + public static IEnumerable GetSupressions(Ast ast) { var paramBlock = AstHelper.FindClosestParamBlock(ast); - if (paramBlock == null) return []; - - return SuppressAnalyserAttribute.FromAttributes(paramBlock.Attributes).Select(attr => attr.GetSupression()); + return paramBlock == null + ? (IEnumerable)([]) + : SuppressAnalyserAttribute.FromAttributes(paramBlock.Attributes).Select(attr => attr.GetSupression()); } } diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index fec7517a..2cce932f 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation; using System.Management.Automation.Language; using System.Management.Automation.Runspaces; @@ -6,8 +9,7 @@ namespace Compiler.Analyser.Rules; -public class UseOfUndefinedFunction : Rule -{ +public class UseOfUndefinedFunction : Rule { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); /// @@ -18,22 +20,19 @@ public class UseOfUndefinedFunction : Rule public override bool ShouldProcess( Ast node, - IEnumerable supressions) - { + IEnumerable supressions) { if (node is not CommandAst commandAst) return false; if (commandAst.GetCommandName() == null) return false; var callName = SanatiseName(commandAst.GetCommandName()); - return !supressions.Any(supression => - { - switch (supression.Data) - { + return !supressions.Any(supression => { + switch (supression.Data) { case IEnumerable functions: return functions.Contains(callName); case string function: return function == callName; default: - Logger.Warn($"Supression data is not a string or IEnumerable for rule {GetType().Name}"); + Logger.Warn($"Supression data is not a string or IEnumerable for rule {this.GetType().Name}"); return false; } }); @@ -41,8 +40,7 @@ public override bool ShouldProcess( public override IEnumerable Analyse( Ast node, - IEnumerable imports) - { + IEnumerable imports) { var commandAst = (CommandAst)node; var callName = SanatiseName(commandAst.GetCommandName()); if (BuiltinsFunctions.Contains(callName)) yield break; @@ -57,8 +55,7 @@ public override IEnumerable Analyse( ); } - public static string SanatiseName(string name) - { + public static string SanatiseName(string name) { var withOutExtension = name.Contains('.') ? name.Split('.').First() : name; var withoutScope = withOutExtension.Contains(':') ? withOutExtension.Split(':').Last() : withOutExtension; @@ -75,8 +72,7 @@ public static string SanatiseName(string name) /// - A few manual inclusions to cover some edge cases. /// /// - public static IEnumerable GetDefaultSessionFunctions() - { + public static IEnumerable GetDefaultSessionFunctions() { var defaultFunctions = new List(); var sessionState = InitialSessionState.CreateDefault(); diff --git a/src/Compiler/Analyser/Suppression.cs b/src/Compiler/Analyser/Suppression.cs index fa9f4b1d..27ad01db 100644 --- a/src/Compiler/Analyser/Suppression.cs +++ b/src/Compiler/Analyser/Suppression.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Diagnostics.CodeAnalysis; using System.Management.Automation.Language; @@ -14,28 +17,23 @@ public sealed class SuppressAnalyserAttribute( string CheckType, object? Data, string Justification -) : Attribute -{ +) : Attribute { [return: NotNull] - public Suppression GetSupression() - { + public Suppression GetSupression() { var assemblyName = "Compiler.Analyser.Rules." + CheckType; var type = Type.GetType(assemblyName, false, true) ?? throw new ArgumentException($"Could not find rule for suppression {CheckType}"); return new Suppression(type, Data, Justification); } - public static IEnumerable FromAttributes(IEnumerable attributes) - { - foreach (var attr in attributes) - { + public static IEnumerable FromAttributes(IEnumerable attributes) { + foreach (var attr in attributes) { var suppression = FromAttributeAst(attr); if (suppression is not null) yield return suppression; } } - public static SuppressAnalyserAttribute? FromAttributeAst([NotNull] AttributeAst attrAst) - { - ArgumentNullException.ThrowIfNull(attrAst, nameof(attrAst)); + public static SuppressAnalyserAttribute? FromAttributeAst([NotNull] AttributeAst attrAst) { + ArgumentNullException.ThrowIfNull(attrAst); if (attrAst.TypeName.GetReflectionType() != typeof(SuppressAnalyserAttribute)) return null; diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index d1cdc639..ed4e73e0 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -1,25 +1,23 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Diagnostics.CodeAnalysis; using System.Management.Automation; using System.Management.Automation.Language; using System.Text; -using CommandLine; using NLog; using Pastel; namespace Compiler; -public static class AstHelper -{ +public static class AstHelper { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public static Dictionary> FindDeclaredModules(Ast ast) - { + public static Dictionary> FindDeclaredModules(Ast ast) { var modules = new Dictionary>(); - foreach (var usingStatement in ast.FindAll(testAst => testAst is UsingStatementAst usingAst && usingAst.UsingStatementKind == UsingStatementKind.Module, true)) - { - switch (usingStatement) - { + foreach (var usingStatement in ast.FindAll(testAst => testAst is UsingStatementAst usingAst && usingAst.UsingStatementKind == UsingStatementKind.Module, true)) { + switch (usingStatement) { case UsingStatementAst usingStatementAst when usingStatementAst.Name is not null: modules.Add(usingStatementAst.Name.Value, new Dictionary { { "AST", usingStatementAst } @@ -31,18 +29,16 @@ public static Dictionary> FindDeclaredModules { "AST", usingStatementAst } }; var pairs = usingStatementAst.ModuleSpecification.KeyValuePairs.GetEnumerator(); - while (pairs.MoveNext()) - { - var key = pairs.Current.Item1.SafeGetValue().Cast(); + while (pairs.MoveNext()) { + var key = (string)pairs.Current.Item1.SafeGetValue(); var value = pairs.Current.Item2.SafeGetValue(); table.Add(key, value); } if (!table.TryGetValue("ModuleName", out var moduleName)) throw new Exception("ModuleSpecification does not contain a 'ModuleName' key."); - if (table.TryGetValue("Guid", out var guid)) table["Guid"] = Guid.Parse(guid.Cast()); - foreach (var versionKey in new[] { "ModuleVersion", "MaximumVersion", "RequiredVersion" }) - { - if (table.TryGetValue(versionKey, out var version)) table[versionKey] = Version.Parse(version.Cast()); + if (table.TryGetValue("Guid", out var guid)) table["Guid"] = Guid.Parse((string)guid); + foreach (var versionKey in new[] { "ModuleVersion", "MaximumVersion", "RequiredVersion" }) { + if (table.TryGetValue(versionKey, out var version)) table[versionKey] = Version.Parse((string)version); } modules.Add((string)moduleName, table); @@ -53,12 +49,10 @@ public static Dictionary> FindDeclaredModules } } - if (ast is ScriptBlockAst scriptBlockAst) - { + if (ast is ScriptBlockAst scriptBlockAst) { if (scriptBlockAst.ScriptRequirements is null) return modules; - scriptBlockAst.ScriptRequirements.RequiredModules.ToList().ForEach(module => - { + scriptBlockAst.ScriptRequirements.RequiredModules.ToList().ForEach(module => { Logger.Debug($"Found required module: {module.Name}"); var table = new Dictionary(); @@ -74,15 +68,13 @@ public static Dictionary> FindDeclaredModules return modules; } - public static List<(string, UsingStatementAst)> FindDeclaredNamespaces(Ast ast) - { + public static List<(string, UsingStatementAst)> FindDeclaredNamespaces(Ast ast) { var namespaces = new List<(string, UsingStatementAst)>(); ast.FindAll(testAst => testAst is UsingStatementAst usingAst && usingAst.UsingStatementKind == UsingStatementKind.Namespace, true) .Cast() .ToList() - .ForEach(usingStatement => - { + .ForEach(usingStatement => { if (usingStatement.Name is null) throw new Exception("UsingStatementAst does not contain a Name."); namespaces.Add((usingStatement.Name.Value, usingStatement)); }); @@ -90,34 +82,29 @@ public static Dictionary> FindDeclaredModules return namespaces; } - public static List FindAvailableFunctions(Ast ast, bool onlyExported) - { + public static List FindAvailableFunctions(Ast ast, bool onlyExported) { var allDefinedFunctions = ast .FindAll(testAst => testAst is FunctionDefinitionAst, true) .Cast() .ToList(); // If there is no export command or we are not filtering for only exported functions, return all functions. - if (ast.Find(testAst => !onlyExported || testAst is CommandAst commandAst && commandAst.CommandElements[0].Extent.Text == "Export-ModuleMember", true) is not CommandAst command) - { + if (ast.Find(testAst => !onlyExported || (testAst is CommandAst commandAst && commandAst.CommandElements[0].Extent.Text == "Export-ModuleMember"), true) is not CommandAst command) { return allDefinedFunctions; } // TODO - Support using * to export all of a type. var wantingToExport = new List<(string, List)>(); var namedParameters = ast.FindAll(testAst => testAst is CommandParameterAst commandParameter && commandParameter.Parent == command, true).Cast().ToList(); - foreach (var (namedParameter, index) in namedParameters.Select((value, i) => (value, i))) - { - if (namedParameter.ParameterName != "Function" && namedParameter.ParameterName != "Alias") - { + foreach (var (namedParameter, index) in namedParameters.Select((value, i) => (value, i))) { + if (namedParameter.ParameterName is not "Function" and not "Alias") { continue; } - ExpressionAst? value = namedParameter.Argument; + var value = namedParameter.Argument; value ??= command.CommandElements[command.CommandElements.IndexOf(namedParameter) + 1] as ExpressionAst; - var objects = value switch - { + var objects = value switch { StringConstantExpressionAst stringConstantExpressionAst => [stringConstantExpressionAst.Value], ArrayLiteralAst arrayLiteralAst => arrayLiteralAst.Elements.Select(element => element.SafeGetValue()), _ => throw new NotImplementedException($"Export-ModuleMember parameter must be a string or array of strings, got: {value}"), @@ -127,8 +114,7 @@ public static List FindAvailableFunctions(Ast ast, bool o } return allDefinedFunctions - .Where(function => - { + .Where(function => { // If the name is scoped to a namespace, remove the namespace. var name = function.Name.Contains(':') ? function.Name.Split(':').Last() : function.Name; return wantingToExport.Any(wanting => wanting.Item2.Contains(name)); @@ -141,12 +127,15 @@ public static List FindAvailableFunctions(Ast ast, bool o /// /// The content to parse into the AST. /// + /// + /// The file path of the content, or None if it is not from a file. + /// /// /// A list of ErrorIds to ignore if they are encountered. /// - /// - /// - public static ScriptBlockAst GetAstReportingErrors( + /// + /// The AST of the content if it was successfully parsed. + /// [NotNull] string astContent, string? filePath, [NotNull] IEnumerable ignoredErrors) @@ -156,7 +145,6 @@ public static ScriptBlockAst GetAstReportingErrors( var ast = System.Management.Automation.Language.Parser.ParseInput(astContent, filePath, out _, out var parserErrors); parserErrors = [.. parserErrors.Where(error => !ignoredErrors.Contains(error.ErrorId))]; - if (parserErrors.Length != 0) { foreach (var error in parserErrors) { @@ -171,6 +159,7 @@ public static ScriptBlockAst GetAstReportingErrors( } throw new ParseException($"Failed to parse {filePath}, encountered {parserErrors.Length} errors."); + if (parserErrors.Length != 0) { } return ast; @@ -184,29 +173,26 @@ public static void PrintPrettyAstError( { ArgumentNullException.ThrowIfNull(extent); ArgumentNullException.ThrowIfNull(parentAst); - ArgumentException.ThrowIfNullOrEmpty(message); + ArgumentNullException.ThrowIfNull(message); var startingLine = extent.StartLineNumber; var endingLine = extent.EndLineNumber; var startingColumn = extent.StartColumnNumber - 1; var endingColumn = extent.EndColumnNumber - 1; - var firstColumnIndent = Math.Max(endingLine.ToString().Length + 1, 5); + var firstColumnIndent = Math.Max(endingLine.ToString(CultureInfo.InvariantCulture).Length + 1, 5); var firstColumnIndentString = new string(' ', firstColumnIndent); var colouredPipe = "|".Pastel(ConsoleColor.Cyan); - while (parentAst.Parent != null) - { + while (parentAst.Parent != null) { parentAst = parentAst.Parent; }; var extentRegion = parentAst.Extent.Text.Split('\n')[(startingLine - 1)..endingLine]; var printableLines = new string[extentRegion.Length]; - for (var i = 0; i < extentRegion.Length; i++) - { + for (var i = 0; i < extentRegion.Length; i++) { var line = extentRegion[i]; - line = i switch - { + line = i switch { 0 when i == extentRegion.Length - 1 => string.Concat(line[0..startingColumn], line[startingColumn..endingColumn].Pastel(ConsoleColor.DarkRed), line[endingColumn..]), 0 => string.Concat(line[0..startingColumn], line[startingColumn..].Pastel(ConsoleColor.DarkRed)), var _ when i == extentRegion.Length - 1 => string.Concat(line[0..endingColumn].Pastel(ConsoleColor.DarkRed), line[endingColumn..]), @@ -214,7 +200,7 @@ public static void PrintPrettyAstError( }; var sb = new StringBuilder() - .Append((i + startingLine).ToString().PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)) + .Append((i + startingLine).ToString(CultureInfo.InvariantCulture).PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)) .Append(colouredPipe) .Append(' ') .Append(line); @@ -223,12 +209,9 @@ public static void PrintPrettyAstError( } string errorPointer; - if (startingLine == endingLine) - { + if (startingLine == endingLine) { errorPointer = string.Concat([new(' ', startingColumn), new('~', endingColumn - startingColumn)]); - } - else - { + } else { var squigleEndColumn = extentRegion.Max(line => line.TrimEnd().Length); var leastWhitespaceBeforeText = extentRegion.Min(line => line.Length - line.TrimStart().Length); errorPointer = string.Concat([new(' ', leastWhitespaceBeforeText), new('~', squigleEndColumn - leastWhitespaceBeforeText)]); @@ -236,7 +219,7 @@ public static void PrintPrettyAstError( var fileName = parentAst.Extent.File is null ? "Unknown file" : parentAst.Extent.File; - Console.WriteLine($""" + return $""" {"File".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} {fileName.Pastel(ConsoleColor.Gray)} {"Line".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} {string.Join('\n', printableLines)} @@ -245,11 +228,9 @@ public static void PrintPrettyAstError( """); } - public static ParamBlockAst? FindClosestParamBlock(Ast ast) - { + public static ParamBlockAst? FindClosestParamBlock(Ast ast) { var parent = ast; - while (parent != null) - { + while (parent != null) { if (parent is ScriptBlockAst scriptBlock && scriptBlock.ParamBlock != null) return scriptBlock.ParamBlock; parent = parent.Parent; } @@ -258,13 +239,11 @@ public static void PrintPrettyAstError( } [return: NotNullIfNotNull(nameof(ast))] - public static Ast FindRoot([NotNull] Ast ast) - { + public static Ast FindRoot([NotNull] Ast ast) { ArgumentNullException.ThrowIfNull(ast); var parent = ast; - while (parent.Parent != null) - { + while (parent.Parent != null) { parent = parent.Parent; } diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 58603972..820271b4 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -1,11 +1,13 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Diagnostics.Contracts; using System.Security.Cryptography; using Compiler.Requirements; namespace Compiler.Module.Compiled; -public abstract class Compiled -{ +public abstract class Compiled { internal List Parents = []; public readonly ModuleSpec ModuleSpec; @@ -28,18 +30,17 @@ public abstract class Compiled public abstract ContentType Type { get; } [Pure] - protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] hashableBytes) - { - ModuleSpec = moduleSpec; - Requirements = requirements; + protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] hashableBytes) { + this.ModuleSpec = moduleSpec; + this.Requirements = requirements; var byteList = new List(hashableBytes); AddRequirementHashBytes(byteList, requirements); - ComputedHash = Convert.ToHexString(SHA1.HashData(byteList.ToArray())); + this.ComputedHash = Convert.ToHexString(SHA1.HashData(byteList.ToArray())); } - public string GetNameHash() => $"{ModuleSpec.Name}-{ComputedHash[..6]}"; + public string GetNameHash() => $"{this.ModuleSpec.Name}-{this.ComputedHash[..6]}"; public abstract string StringifyContent(); @@ -53,55 +54,49 @@ protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] /// public virtual string GetPowerShellObject() => $$""" @{ - Name = '{{ModuleSpec.Name}}'; - Version = '{{Version}}'; - Hash = '{{ComputedHash[..6]}}'; - Type = '{{Type}}'; - Content = {{StringifyContent()}} + Name = '{{this.ModuleSpec.Name}}'; + Version = '{{this.Version}}'; + Hash = '{{this.ComputedHash[..6]}}'; + Type = '{{this.Type}}'; + Content = {{this.StringifyContent()}} } """; - public static void AddRequirementHashBytes(List hashableBytes, RequirementGroup requirementGroup) - { + public static void AddRequirementHashBytes(List hashableBytes, RequirementGroup requirementGroup) { var requirements = requirementGroup.GetRequirements(); requirements.ToList().ForEach(requirement => hashableBytes.AddRange(requirement.Hash)); } - protected Compiled GetRootParent() - { - if (Parents.Count == 0) return this; + protected Compiled GetRootParent() { + if (this.Parents.Count == 0) return this; // All parents should point to the same root parent eventually. - var parent = Parents[0]; - while (parent.Parents.Count > 0) - { + var parent = this.Parents[0]; + while (parent.Parents.Count > 0) { parent = parent.Parents[0]; } return parent; } - protected Compiled[] GetSiblings() - { - var rootParent = GetRootParent(); + protected Compiled[] GetSiblings() { + var rootParent = this.GetRootParent(); if (rootParent is not CompiledScript script) return []; return script.Graph.Vertices.Where(compiled => compiled != this).ToArray(); } - protected Compiled? FindSibling(ModuleSpec moduleSpec) - { - if (ReferenceEquals(moduleSpec, ModuleSpec)) return this; + protected Compiled? FindSibling(ModuleSpec moduleSpec) { + if (ReferenceEquals(moduleSpec, this.ModuleSpec)) return this; - var siblings = GetSiblings(); + var siblings = this.GetSiblings(); if (siblings.Length == 0) return null; return siblings.FirstOrDefault(compiled => compiled.ModuleSpec == moduleSpec); } } -public enum ContentType -{ +public enum ContentType { UTF8String, Zip diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index 4a48dc55..2e0dcfcb 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.Management.Automation.Language; using System.Text; @@ -7,8 +10,7 @@ namespace Compiler.Module.Compiled; -public class CompiledLocalModule : Compiled -{ +public class CompiledLocalModule : Compiled { public override ContentType Type { get; } = ContentType.UTF8String; // Local modules are always version 0.0.1, as they are not versioned. @@ -22,19 +24,16 @@ public CompiledLocalModule( PathedModuleSpec moduleSpec, CompiledDocument document, RequirementGroup requirements - ) : base(moduleSpec, requirements, Encoding.UTF8.GetBytes(document.GetContent())) - { - Document = document; - Ast = AstHelper.GetAstReportingErrors(string.Join('\n', Document.Lines), moduleSpec.FullPath, ["ModuleNotFoundDuringParse"]); + ) : base(moduleSpec, requirements, Encoding.UTF8.GetBytes(document.GetContent())) { + this.Document = document; + this.Ast = AstHelper.GetAstReportingErrors(string.Join('\n', this.Document.Lines), Some(moduleSpec.FullPath), ["ModuleNotFoundDuringParse"]).ThrowIfFail(); } public override string StringifyContent() => new StringBuilder() .AppendLine("<#ps1#> @'") - .AppendJoin('\n', Requirements.GetRequirements().Select(requirement => - { - var hash = (requirement switch - { - ModuleSpec req => FindSibling(req)!.ComputedHash, + .AppendJoin('\n', this.Requirements.GetRequirements().Select(requirement => { + var hash = (requirement switch { + ModuleSpec req => this.FindSibling(req)!.ComputedHash, _ => requirement.HashString })[..6]; @@ -42,9 +41,9 @@ RequirementGroup requirements return requirement.GetInsertableLine(data); })) .AppendLine() - .AppendLine(Document.GetContent()) + .AppendLine(this.Document.GetContent()) .Append("'@;") .ToString(); - public override IEnumerable GetExportedFunctions() => AstHelper.FindAvailableFunctions(Ast, true).Select(function => function.Name); + public override IEnumerable GetExportedFunctions() => AstHelper.FindAvailableFunctions(this.Ast, true).Select(function => function.Name); } diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 63d94d43..fbc6c217 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.IO.Compression; using System.Management.Automation; @@ -8,11 +11,10 @@ namespace Compiler.Module.Compiled; -public class CompiledRemoteModule : Compiled -{ +public class CompiledRemoteModule : Compiled { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private Hashtable? _powerShellManifest; - private ZipArchive? _zipArchive; + private Hashtable? PowerShellManifest; + private ZipArchive? ZipArchive; public readonly MemoryStream MemoryStream; @@ -24,13 +26,11 @@ internal CompiledRemoteModule( ModuleSpec moduleSpec, RequirementGroup requirements, MemoryStream memoryStream - ) : base(moduleSpec, requirements, memoryStream.ToArray()) - { - MemoryStream = memoryStream; + ) : base(moduleSpec, requirements, memoryStream.ToArray()) { + this.MemoryStream = memoryStream; - var manifest = GetPowerShellManifest(); - Version = manifest["ModuleVersion"] switch - { + var manifest = this.GetPowerShellManifest(); + this.Version = manifest["ModuleVersion"] switch { string version => Version.Parse(version), null => new Version(0, 0, 1), _ => throw new Exception($"ModuleVersion must be a string, but was {manifest["ModuleVersion"]?.GetType()}") @@ -39,26 +39,23 @@ MemoryStream memoryStream public override string StringifyContent() { // Convert to a powershell byte array - var bytes = new byte[MemoryStream.Length]; - MemoryStream.Read(bytes, 0, bytes.Length); + var bytes = new byte[this.MemoryStream.Length]; + this.MemoryStream.Read(bytes, 0, bytes.Length); var base64 = Convert.ToBase64String(bytes); return $"'{base64}'"; } - public IEnumerable GetExported(object? data, CommandTypes commandTypes) - { - switch (data) - { + public IEnumerable GetExported(object? data, CommandTypes commandTypes) { + switch (data) { case object[] strings: return strings.Cast(); case string starString when starString == "*": - var version = GetPowerShellManifest()["ModuleVersion"]!.ToString()!; - var tempModuleRootPath = Path.Combine(Path.GetTempPath(), $"PowerShellGet\\_Export_{ModuleSpec.Name}"); - var tempOutput = Path.Combine(tempModuleRootPath, ModuleSpec.Name, version); - if (!Directory.Exists(tempOutput)) - { + var version = this.GetPowerShellManifest()["ModuleVersion"]!.ToString()!; + var tempModuleRootPath = Path.Combine(Path.GetTempPath(), $"PowerShellGet\\_Export_{this.ModuleSpec.Name}"); + var tempOutput = Path.Combine(tempModuleRootPath, this.ModuleSpec.Name, version); + if (!Directory.Exists(tempOutput)) { Directory.CreateDirectory(tempOutput); - using var archive = GetZipArchive(); + using var archive = this.GetZipArchive(); archive.ExtractToDirectory(tempOutput); } @@ -67,7 +64,7 @@ public IEnumerable GetExported(object? data, CommandTypes commandTypes) var pwsh = PowerShell.Create(sessionState); return pwsh.Runspace.SessionStateProxy.InvokeCommand .GetCommands("*", commandTypes, true) - .Where(command => command.ModuleName == ModuleSpec.Name) + .Where(command => command.ModuleName == this.ModuleSpec.Name) .Select(command => command.Name); case string str: return [str]; @@ -78,14 +75,13 @@ public IEnumerable GetExported(object? data, CommandTypes commandTypes) } } - public override IEnumerable GetExportedFunctions() - { - var manifest = GetPowerShellManifest(); + public override IEnumerable GetExportedFunctions() { + var manifest = this.GetPowerShellManifest(); var exportedFunctions = new List(); - var functionsToExport = GetExported(manifest["FunctionsToExport"], CommandTypes.Function); - var cmdletsToExport = GetExported(manifest["CmdletsToExport"], CommandTypes.Cmdlet); - var aliasesToExport = GetExported(manifest["AliasesToExport"], CommandTypes.Alias); + var functionsToExport = this.GetExported(manifest["FunctionsToExport"], CommandTypes.Function); + var cmdletsToExport = this.GetExported(manifest["CmdletsToExport"], CommandTypes.Cmdlet); + var aliasesToExport = this.GetExported(manifest["AliasesToExport"], CommandTypes.Alias); exportedFunctions.AddRange(functionsToExport); exportedFunctions.AddRange(cmdletsToExport); @@ -94,11 +90,8 @@ public override IEnumerable GetExportedFunctions() return exportedFunctions; } - private ZipArchive GetZipArchive() => _zipArchive ??= new ZipArchive(MemoryStream, ZipArchiveMode.Read, true); + private ZipArchive GetZipArchive() => this.ZipArchive ??= new ZipArchive(this.MemoryStream, ZipArchiveMode.Read, true); - private Hashtable GetPowerShellManifest() - { - if (_powerShellManifest != null) return _powerShellManifest; var archive = GetZipArchive(); var psd1Entry = archive.GetEntry($"{ModuleSpec.Name}.psd1"); @@ -108,6 +101,8 @@ private Hashtable GetPowerShellManifest() _powerShellManifest = []; return _powerShellManifest; } + private Hashtable GetPowerShellManifest() { + if (this.PowerShellManifest != null) return this.PowerShellManifest; using var psd1Stream = psd1Entry.Open(); if (Program.RunPowerShell(new StreamReader(psd1Stream).ReadToEnd())[0].BaseObject is not Hashtable psd1) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 2346b994..63033c9b 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation.Language; using System.Reflection; using System.Text; @@ -10,8 +13,7 @@ namespace Compiler.Module.Compiled; -public class CompiledScript : CompiledLocalModule -{ +public class CompiledScript : CompiledLocalModule { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public readonly ParamBlockAst? ScriptParamBlock; @@ -24,57 +26,52 @@ public CompiledScript( ResolvableParent resolvableParent, ParamBlockAst? scriptParamBlock, RequirementGroup requirements - ) : base(moduleSpec, CompiledDocument.FromBuilder(editor, 0), requirements) - { - ScriptParamBlock = scriptParamBlock; - Graph = new BidirectionalGraph>(); - Graph.AddVertex(this); + ) : base(moduleSpec, CompiledDocument.FromBuilder(editor, 0), requirements) { + this.ScriptParamBlock = scriptParamBlock; + this.Graph = new BidirectionalGraph>(); + _ = this.Graph.AddVertex(this); var loadOrder = resolvableParent.Graph.TopologicalSort(); var reversedLoadOrder = loadOrder.Reverse(); - reversedLoadOrder.ToList().ForEach(resolvable => - { + reversedLoadOrder.ToList().ForEach(resolvable => { Logger.Trace($"Compiling {resolvable.ModuleSpec.Name}"); var compiledRequirements = resolvableParent.Graph .OutEdges(resolvable) - .Select(edge => Graph.Vertices.First(module => module.ModuleSpec == edge.Target.ModuleSpec)); + .Select(edge => this.Graph.Vertices.First(module => module.ModuleSpec == edge.Target.ModuleSpec)); - Compiled compiledModule; - if (resolvable.ModuleSpec == moduleSpec) { compiledModule = this; } - else { compiledModule = resolvable.IntoCompiled(); } + var compiledModule = resolvable.ModuleSpec == moduleSpec ? this : resolvable.IntoCompiled(); - if (compiledRequirements.Any()) { Graph.AddVerticesAndEdgeRange(compiledRequirements.Select(requirement => new Edge(compiledModule, requirement))); } - else { Graph.AddVertex(compiledModule); } + if (compiledRequirements.Any()) { + _ = this.Graph.AddVerticesAndEdgeRange(compiledRequirements.Select(requirement => new Edge(compiledModule, requirement))); + } else { + _ = this.Graph.AddVertex(compiledModule); + } }); // Iterate over the graph and add the parent-child relationships. - Graph.Edges.ToList().ForEach(edge => - { + this.Graph.Edges.ToList().ForEach(edge => { edge.Target.Parents.Add(edge.Source); }); Logger.Trace("Analyzing compiled modules."); - Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => - { - var imports = Graph.OutEdges(compiled).Select(edge => edge.Target); - Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports]); + this.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { + var imports = this.Graph.OutEdges(compiled).Select(edge => edge.Target); + Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports]) + .ForEach(issue => Program.Errors.Add(issue.AsException())); }); } - public override string GetPowerShellObject() - { + public override string GetPowerShellObject() { var info = Assembly.GetExecutingAssembly().GetName(); using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.ScriptTemplate.ps1")!; using var streamReader = new StreamReader(templateStream, Encoding.UTF8); var template = streamReader.ReadToEnd(); - var EMBEDDED_MODULES = new StringBuilder(); - EMBEDDED_MODULES.AppendLine("$Script:EMBEDDED_MODULES = @("); - Graph.Vertices.ToList().ForEach(module => - { - var moduleObject = module switch - { + var embeddedModules = new StringBuilder(); + embeddedModules.AppendLine("$Script:EMBEDDED_MODULES = @("); + this.Graph.Vertices.ToList().ForEach(module => { + var moduleObject = module switch { CompiledScript script when script == this => base.GetPowerShellObject(), _ => module.GetPowerShellObject() }; @@ -82,18 +79,17 @@ public override string GetPowerShellObject() var lineCount = moduleObject.Count(character => character == '\n'); // Only skip the lines of the content of the module object. var skipLines = Enumerable.Range(6, lineCount - 6); - EMBEDDED_MODULES.AppendLine(IndentString(moduleObject, 8, skipLines)); + embeddedModules.AppendLine(IndentString(moduleObject, 8, skipLines)); }); - EMBEDDED_MODULES.AppendLine(IndentString(");", 4)); + embeddedModules.AppendLine(IndentString(");", 4)); - var PARAM_BLOCK = new StringBuilder(); - if (ScriptParamBlock != null) - { - ScriptParamBlock.Attributes.ToList().ForEach(attribute => PARAM_BLOCK.AppendLine(attribute.Extent.Text)); - PARAM_BLOCK.Append(ScriptParamBlock.Extent.Text); + var paramBlock = new StringBuilder(); + if (this.ScriptParamBlock != null) { + this.ScriptParamBlock.Attributes.ToList().ForEach(attribute => paramBlock.AppendLine(attribute.Extent.Text)); + paramBlock.Append(this.ScriptParamBlock.Extent.Text); } - var IMPORT_ORDER = Graph.TopologicalSort() + var importOrder = this.Graph.TopologicalSort() .Skip(1) // Skip the root node. .Reverse() .Select(module => $"'{module.GetNameHash()}'") @@ -102,9 +98,9 @@ public override string GetPowerShellObject() // TODO - Implement a way to replace #!DEFINE macros in the template. // This could also be how we can implement secure variables during compilation. template = template - .Replace("#!DEFINE EMBEDDED_MODULES", EMBEDDED_MODULES.ToString()) - .Replace("#!DEFINE PARAM_BLOCK", PARAM_BLOCK.ToString()) - .Replace("#!DEFINE IMPORT_ORDER", $"$Script:REMOVE_ORDER = @({IMPORT_ORDER});"); + .Replace("#!DEFINE EMBEDDED_MODULES", embeddedModules.ToString()) + .Replace("#!DEFINE PARAM_BLOCK", paramBlock.ToString()) + .Replace("#!DEFINE IMPORT_ORDER", $"$Script:REMOVE_ORDER = @({importOrder});"); return template; } @@ -127,14 +123,12 @@ public override string GetPowerShellObject() /// /// The indented string. /// - private static string IndentString(string str, int indentBy, IEnumerable? skipLines = null) - { + private static string IndentString(string str, int indentBy, IEnumerable? skipLines = null) { if (!Program.IsDebugging) { return str; } var indent = new string(' ', indentBy); var lines = str.Split('\n'); - var indentedLines = lines.Select((line, index) => - { + var indentedLines = lines.Select((line, index) => { if (string.IsNullOrWhiteSpace(line)) { return line; } // Skip empty lines. if (skipLines != null && skipLines.Contains(index)) { return line; } return indent + line; diff --git a/src/Compiler/Module/Module.cs b/src/Compiler/Module/Module.cs index 07a1481e..d1d17b1c 100644 --- a/src/Compiler/Module/Module.cs +++ b/src/Compiler/Module/Module.cs @@ -1,20 +1,23 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using Compiler.Requirements; namespace Compiler.Module; -public abstract partial class Module(ModuleSpec moduleSpec) -{ +#pragma warning disable CA1716 +public abstract partial class Module(ModuleSpec moduleSpec) { +#pragma warning restore CA1716 public virtual ModuleSpec ModuleSpec { get; } = moduleSpec; public RequirementGroup Requirements { get; } = new(); public abstract ModuleMatch GetModuleMatchFor(ModuleSpec requirement); - public override int GetHashCode() => ModuleSpec.GetHashCode(); + public override int GetHashCode() => this.ModuleSpec.GetHashCode(); } -public enum ModuleMatch : short -{ +public enum ModuleMatch : short { /// /// This module has incompatible restrictions. /// diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 767b8f35..dbd61fb7 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -1,15 +1,18 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation.Language; using System.Text.RegularExpressions; using Compiler.Module.Compiled; using Compiler.Requirements; using Compiler.Text; using Compiler.Text.Updater.Built; +using LanguageExt; namespace Compiler.Module.Resolvable; -public partial class ResolvableLocalModule : Resolvable -{ - internal readonly ScriptBlockAst _ast; +public partial class ResolvableLocalModule : Resolvable { + internal readonly ScriptBlockAst Ast; public readonly TextEditor Editor; @@ -18,9 +21,18 @@ public partial class ResolvableLocalModule : Resolvable /// /// Creates a new LocalModule from the moduleSpec and a path to the root to find the path. /// - /// - /// - /// Thrown when the path is not a valid module path. + /// + /// The root to resolve the path from, must be an absolute path. + /// + /// + /// The module spec to create the module from. + /// + /// + /// Thrown when the path is not a valid module path or the parent path is not an absolute path. + /// + /// + /// Thrown when the ast cannot be generated from the file. + /// public ResolvableLocalModule( string parentPath, ModuleSpec moduleSpec @@ -28,40 +40,52 @@ ModuleSpec moduleSpec moduleSpec is PathedModuleSpec pathedModuleSpec ? pathedModuleSpec : new PathedModuleSpec(Path.GetFullPath(Path.Combine(parentPath, moduleSpec.Name))) - ) - { + ) { if (!Path.IsPathRooted(parentPath)) throw new InvalidModulePathException("The parent path must be an absolute path."); if (!Directory.Exists(parentPath)) throw new InvalidModulePathException("The parent path must be a file."); } - public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) - { + /// + /// Creates a new LocalModule from the moduleSpec. + /// + /// + /// + /// Thrown when the path is not a valid module path. + /// + /// + /// Thrown when the ast cannot be generated from the file. + /// + public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) { if (!File.Exists(moduleSpec.FullPath)) throw new InvalidModulePathException($"The module path must be a file, got {moduleSpec.FullPath}"); - Editor = new TextEditor(new TextDocument(File.ReadAllLines(moduleSpec.FullPath))); - _ast = AstHelper.GetAstReportingErrors(string.Join('\n', Editor.Document.Lines), moduleSpec.FullPath, ["ModuleNotFoundDuringParse"]); + + this.Editor = new TextEditor(new TextDocument(File.ReadAllLines(moduleSpec.FullPath))); + this.Ast = AstHelper.GetAstReportingErrors(string.Join('\n', this.Editor.Document.Lines), Some(moduleSpec.FullPath), ["ModuleNotFoundDuringParse"]).Match( + ast => ast, + err => throw err + ); + + this.QueueResolve(); // Remove empty lines - Editor.AddRegexEdit(0, EntireEmptyLineRegex(), _ => { return null; }); + this.Editor.AddRegexEdit(0, EntireEmptyLineRegex(), _ => { return null; }); // Document Blocks - Editor.AddPatternEdit( + this.Editor.AddPatternEdit( 5, DocumentationStartRegex(), DocumentationEndRegex(), (lines) => { return []; }); // Entire Line Comments - Editor.AddRegexEdit(10, EntireLineCommentRegex(), _ => { return null; }); + this.Editor.AddRegexEdit(10, EntireLineCommentRegex(), _ => { return null; }); // Comments at the end of a line, after some code. - Editor.AddRegexEdit(priority: 15, EndOfLineComment(), _ => { return null; }); + this.Editor.AddRegexEdit(priority: 15, EndOfLineComment(), _ => { return null; }); // Remove #Requires statements - Editor.AddRegexEdit(20, RequiresStatementRegex(), _ => { return null; }); - - Editor.AddEdit(static () => new HereStringUpdater()); + this.Editor.AddRegexEdit(20, RequiresStatementRegex(), _ => { return null; }); - ThreadPool.QueueUserWorkItem(_ => ResolveRequirements()); + this.Editor.AddEdit(static () => new HereStringUpdater()); } /// @@ -75,11 +99,9 @@ public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) /// /// The module match for the given requirement. /// - public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) - { + public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) { // Local files have nothing but a name. - if (ModuleSpec.Name == requirement.Name) - { + if (this.ModuleSpec.Name == requirement.Name) { return ModuleMatch.Same; } @@ -135,21 +157,20 @@ public override void ResolveRequirements() } public override Compiled.Compiled IntoCompiled() => new CompiledLocalModule( - ModuleSpec, - CompiledDocument.FromBuilder(Editor, 0), - Requirements + this.ModuleSpec, + CompiledDocument.FromBuilder(this.Editor, 0), + this.Requirements ); - public override bool Equals(object? obj) - { + public override bool Equals(object? obj) { if (obj is null) return false; if (ReferenceEquals(this, obj)) return true; return obj is ResolvableLocalModule other && - ModuleSpec.CompareTo(other.ModuleSpec) == ModuleMatch.Same && - Editor.Document.Lines == other.Editor.Document.Lines; + this.ModuleSpec.CompareTo(other.ModuleSpec) == ModuleMatch.Same && + this.Editor.Document.Lines == other.Editor.Document.Lines; } - public override int GetHashCode() => ModuleSpec.GetHashCode(); + public override int GetHashCode() => this.ModuleSpec.GetHashCode(); #region Regex Patterns [GeneratedRegex(@"^(?!\n)*$")] diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index fc558c3e..869c7cf8 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.IO.Compression; using System.Management.Automation; @@ -7,22 +10,18 @@ namespace Compiler.Module.Resolvable; -public class ResolvableRemoteModule : Resolvable -{ +public class ResolvableRemoteModule : Resolvable { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private MemoryStream? _memoryStream; - private string? _cachedFile; + private MemoryStream? MemoryStream; + private string? CachedFile; - public ResolvableRemoteModule(ModuleSpec moduleSpec) : base(moduleSpec) - { - ThreadPool.QueueUserWorkItem(_ => ResolveRequirements()); - } + public ResolvableRemoteModule(ModuleSpec moduleSpec) : base(moduleSpec) => this.QueueResolve(); private string CachePath => Path.Join( Path.GetTempPath(), "PowerShellGet", - ModuleSpec.Name + this.ModuleSpec.Name ); public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) => ModuleSpec.CompareTo(requirement); @@ -67,57 +66,55 @@ public override void ResolveRequirements() } public override Compiled.Compiled IntoCompiled() => new CompiledRemoteModule( - ModuleSpec, - Requirements, - _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false) + this.ModuleSpec, + this.Requirements, + this.MemoryStream ??= new MemoryStream(File.ReadAllBytes(this.FindCachedResult() ?? this.CacheResult().ThrowIfFail()), false) ); - public override bool Equals(object? obj) - { + public override bool Equals(object? obj) { if (obj is null) return false; if (ReferenceEquals(this, obj)) return true; return obj is ResolvableRemoteModule other && - ModuleSpec.CompareTo(other.ModuleSpec) == ModuleMatch.Same; + this.ModuleSpec.CompareTo(other.ModuleSpec) == ModuleMatch.Same; } - public string? FindCachedResult() - { - if (_cachedFile != null) return _cachedFile; + public string? FindCachedResult() { + if (this.CachedFile != null) return this.CachedFile; - if (!Directory.Exists(CachePath)) return null; + if (!Directory.Exists(this.CachePath)) return null; - var files = Directory.GetFiles(CachePath, "*.nupkg"); + var files = Directory.GetFiles(this.CachePath, "*.nupkg"); if (files.Length == 0) return null; - var versions = files.Where(file => - { + var versions = files.Where(file => { var fileName = Path.GetFileName(file); - return fileName.StartsWith(ModuleSpec.Name); - }).Select(file => - { + return fileName.StartsWith(this.ModuleSpec.Name, StringComparison.OrdinalIgnoreCase); + }).Select(file => { var fileName = Path.GetFileName(file); - var version = fileName.Substring(ModuleSpec.Name.Length + 1, fileName.Length - ModuleSpec.Name.Length - 1 - ".nupkg".Length); + var version = fileName.Substring(this.ModuleSpec.Name.Length + 1, fileName.Length - this.ModuleSpec.Name.Length - 1 - ".nupkg".Length); - try { return new Version(version); } - catch { throw new Exception($"Failed to parse version {version} from file {file}"); } + try { + return new Version(version); + } catch { + throw new Exception($"Failed to parse version {version} from file {file}"); + } }); - var selectedVersion = versions.Where(version => - { - var otherSpec = new ModuleSpec(ModuleSpec.Name, ModuleSpec.Guid, requiredVersion: version); - var matchType = otherSpec.CompareTo(ModuleSpec); + var selectedVersion = versions.Where(version => { + var otherSpec = new ModuleSpec(this.ModuleSpec.Name, this.ModuleSpec.Id, requiredVersion: version); + var matchType = otherSpec.CompareTo(this.ModuleSpec); - return matchType == ModuleMatch.Same || matchType == ModuleMatch.Stricter; + return matchType is ModuleMatch.Same or ModuleMatch.Stricter; }).OrderByDescending(version => version).FirstOrDefault(); - return selectedVersion == null ? null : _cachedFile = Path.Join(CachePath, $"{ModuleSpec.Name}.{selectedVersion}.nupkg"); + return selectedVersion == null ? null : this.CachedFile = Path.Join(this.CachePath, $"{this.ModuleSpec.Name}.{selectedVersion}.nupkg"); } public string CacheResult() { - var versionString = ConvertVersionParameters(ModuleSpec.RequiredVersion?.ToString(), ModuleSpec.MinimumVersion?.ToString(), ModuleSpec.MaximumVersion?.ToString()); - var PowerShellCode = /*ps1*/ $$""" - Set-PSResourceRepository -Name PSGallery -Trusted -Confirm:$False; + var versionString = ConvertVersionParameters(this.ModuleSpec.RequiredVersion?.ToString(), this.ModuleSpec.MinimumVersion?.ToString(), this.ModuleSpec.MaximumVersion?.ToString()); + var powerShellCode = /*ps1*/ $$""" + Set-StrictMode -Version 3; try { $Module = Find-PSResource -Name '{{ModuleSpec.Name}}' {{(versionString != null ? $"-Version '{versionString}'" : "")}}; @@ -134,12 +131,14 @@ public string CacheResult() return $env:TEMP | Join-Path -ChildPath "PowerShellGet/{{ModuleSpec.Name}}/{{ModuleSpec.Name}}.$($Module.Version).nupkg"; """; - Logger.Debug("Running PowerShell code to download module from the PowerShell Gallery."); - Logger.Debug(PowerShellCode); + Logger.Debug( + "Running PowerShell code to download module from the PowerShell Gallery." + + Environment.NewLine + + powerShellCode + ); - if (!Directory.Exists(CachePath)) - { - Directory.CreateDirectory(CachePath); + if (!Directory.Exists(this.CachePath)) { + Directory.CreateDirectory(this.CachePath); } var pwsh = PowerShell.Create(RunspaceMode.NewRunspace); @@ -161,8 +160,7 @@ public string CacheResult() private static string? ConvertVersionParameters( string? requiredVersion, string? minimumVersion, - string? maximumVersion) => (requiredVersion, minimumVersion, maximumVersion) switch - { + string? maximumVersion) => (requiredVersion, minimumVersion, maximumVersion) switch { (null, null, null) => null, (string ver, null, null) => ver, (_, string min, null) => $"[{min},)", @@ -170,5 +168,5 @@ public string CacheResult() (_, string min, string max) => $"[{min},{max}]" }; - public override int GetHashCode() => ModuleSpec.GetHashCode(); + public override int GetHashCode() => this.ModuleSpec.GetHashCode(); } diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index 02883e92..52e7e0bd 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -1,11 +1,13 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using Compiler.Requirements; using NLog; using QuikGraph; namespace Compiler.Module.Resolvable; -public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleSpec) -{ +public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleSpec) { /// /// Resolves the requirements of the module. /// @@ -19,8 +21,7 @@ public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleS /// This is useful for resolving a group of modules that have dependencies between each other. /// While resolving, the resolvables will check for circular dependencies and resolve them in the correct order. /// -public class ResolvableParent -{ +public class ResolvableParent { public record ResolvedMatch(Resolvable Resolvable, ModuleMatch Match); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -33,24 +34,18 @@ public ResolvableParent(Resolvable rootModule) Graph.AddVertex(rootModule); #region Deduplication and merging of Resolvables using events - Graph.VertexAdded += vertex => Logger.Debug($"Vertex added: {vertex.ModuleSpec.Name}"); - Graph.VertexRemoved += vertex => Logger.Debug($"Vertex removed: {vertex.ModuleSpec.Name}"); - Graph.EdgeRemoved += edge => - { + this.Graph.VertexAdded += vertex => Logger.Debug($"Vertex added: {vertex.ModuleSpec.Name}"); + this.Graph.VertexRemoved += vertex => Logger.Debug($"Vertex removed: {vertex.ModuleSpec.Name}"); + this.Graph.EdgeRemoved += edge => { Logger.Debug($"Edge removed: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); - lock (edge.Source.Requirements) - { - var didRemove = edge.Source.Requirements.RemoveRequirement(edge.Target.ModuleSpec); - if (!didRemove) Logger.Warn($"Failed to remove requirement {edge.Target.ModuleSpec} from {edge.Source.ModuleSpec}."); + lock (edge.Source.Requirements) { + edge.Source.Requirements.RemoveRequirement(edge.Target.ModuleSpec); } }; - Graph.EdgeAdded += edge => - { + this.Graph.EdgeAdded += edge => { Logger.Debug($"Edge added: {edge.Source.ModuleSpec.Name} -> {edge.Target.ModuleSpec.Name}"); - lock (edge.Source.Requirements) - { - var didAdd = edge.Source.Requirements.AddRequirement(edge.Target.ModuleSpec); - if (!didAdd) Logger.Warn($"Failed to add requirement {edge.Target.ModuleSpec} to {edge.Source.ModuleSpec}."); + lock (edge.Source.Requirements) { + edge.Source.Requirements.AddRequirement(edge.Target.ModuleSpec); } }; #endregion @@ -61,11 +56,11 @@ public ResolvableParent(Resolvable rootModule) /// /// /// - public ResolvedMatch? FindResolvable(ModuleSpec moduleSpec) - { - var resolvable = Graph.Vertices.FirstOrDefault(resolvable => resolvable.ModuleSpec.CompareTo(moduleSpec) != ModuleMatch.None); + public ResolvedMatch? FindResolvable(ModuleSpec moduleSpec) { + var resolvable = this.Graph.Vertices.FirstOrDefault(resolvable => resolvable.ModuleSpec.CompareTo(moduleSpec) != ModuleMatch.None); if (resolvable == null) return null; + Logger.Debug($"Found resolvable {resolvable.ModuleSpec.Name} for {moduleSpec.Name}."); return new(resolvable, resolvable.ModuleSpec.CompareTo(moduleSpec)); } @@ -80,8 +75,7 @@ public void Resolve() Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); // If the parent module has already been resolved this will be an orphan. - if (parentResolvable != null && !Graph.ContainsVertex(parentResolvable)) - { + if (parentResolvable != null && !this.Graph.ContainsVertex(parentResolvable)) { Logger.Debug("Parent module had already been resolved, skipping orphan."); continue; } @@ -89,8 +83,7 @@ public void Resolve() var workingResolvable = LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); // If it was null or there are out edges it means this module has already been resolved. - if (workingResolvable == null || Graph.TryGetOutEdges(workingResolvable, out var outEdges) && outEdges.Any()) - { + if (workingResolvable.IsNone || (this.Graph.TryGetOutEdges(workingResolvable.ValueUnsafe()!, out var outEdges) && outEdges.Any())) { Logger.Debug("Module has already been resolved, skipping."); continue; } diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index 9e7a887e..7f8a4680 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -1,50 +1,50 @@ -using System.Diagnostics.Contracts; +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation.Language; using Compiler.Requirements; namespace Compiler.Module.Resolvable; -public partial class ResolvableScript : ResolvableLocalModule -{ +public partial class ResolvableScript : ResolvableLocalModule { private readonly ResolvableParent ResolvableParent; - public ResolvableScript(PathedModuleSpec moduleSpec) : base(moduleSpec) - { - ResolvableParent = new ResolvableParent(this); - ResolvableParent.Resolve(); + public ResolvableScript(PathedModuleSpec moduleSpec, ResolvableParent superParent) : base(moduleSpec) { + this.ResolvableParent = superParent; #region Requirement Compatability checking PSVersionRequirement? highestPSVersion = null; PSEditionRequirement? foundPSEdition = null; RunAsAdminRequirement? foundRunAsAdmin = null; - foreach (var resolvable in ResolvableParent.Graph.Vertices) - { + foreach (var resolvable in this.ResolvableParent.Graph.Vertices) { var versionRequirement = resolvable.Requirements.GetRequirements().FirstOrDefault(); if (versionRequirement != null && versionRequirement.Version > highestPSVersion?.Version) highestPSVersion = versionRequirement; var editionRequirement = resolvable.Requirements.GetRequirements().FirstOrDefault(); - if (editionRequirement != null && foundPSEdition != null && editionRequirement.Edition != foundPSEdition.Edition) throw new Exception("Multiple PSEditions found in resolved modules."); + if (editionRequirement != null + && foundPSEdition != null + && editionRequirement.Edition != foundPSEdition.Edition + ) throw new Exception("Multiple PSEditions found in resolved modules."); + foundPSEdition ??= editionRequirement; foundRunAsAdmin ??= resolvable.Requirements.GetRequirements().FirstOrDefault(); } - if (highestPSVersion != null) Requirements.AddRequirement(highestPSVersion); - if (foundPSEdition != null) Requirements.AddRequirement(foundPSEdition); - if (foundRunAsAdmin != null) Requirements.AddRequirement(foundRunAsAdmin); + if (highestPSVersion != null) _ = this.Requirements.AddRequirement(highestPSVersion); + if (foundPSEdition != null) _ = this.Requirements.AddRequirement(foundPSEdition); + if (foundRunAsAdmin != null) _ = this.Requirements.AddRequirement(foundRunAsAdmin); #endregion } - public override Compiled.Compiled IntoCompiled() - { - lock (Requirements) - { + public override Compiled.Compiled IntoCompiled() { + lock (this.Requirements) { return new Compiled.CompiledScript( - ModuleSpec, - Editor, - ResolvableParent, - ExtractParameterBlock(), - Requirements + this.ModuleSpec, + this.Editor, + this.ResolvableParent, + this.ExtractParameterBlock(), + this.Requirements ); } } @@ -55,11 +55,8 @@ public override Compiled.Compiled IntoCompiled() /// /// The parameter block of the script, if it exists. /// - public ParamBlockAst? ExtractParameterBlock() - { - var scriptParamBlockAst = _ast.ParamBlock; - if (scriptParamBlockAst == null) return null; - - return scriptParamBlockAst; + public ParamBlockAst? ExtractParameterBlock() { + var scriptParamBlockAst = this.Ast.ParamBlock; + return scriptParamBlockAst ?? null; } } diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index aaf49c0d..27f2fe8c 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.Management.Automation; @@ -14,8 +17,7 @@ namespace Compiler; -public class Program -{ +public class Program { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); internal static bool IsDebugging; @@ -24,8 +26,7 @@ public class Program internal static readonly CancellationTokenSource CancelSource = new(); - public static readonly Lazy RunspacePool = new(() => - { + public static readonly Lazy RunspacePool = new(() => { var sessionState = InitialSessionState.CreateDefault2(); sessionState.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Bypass; sessionState.ImportPSModule(new[] { "Microsoft.PowerShell.PSResourceGet" }); @@ -37,8 +38,7 @@ public class Program return rsPool; }); - public class Options - { + public class Options { [Option('v', "verbosity", FlagCounter = true, HelpText = "Set the verbosity level of the output.")] public int Verbosity { get; set; } @@ -157,32 +157,26 @@ public static void Main(string[] args) } }, ct); - public static void CleanInput(Options opts) - { + public static void CleanInput(Options opts) { ArgumentException.ThrowIfNullOrWhiteSpace(opts.Input, nameof(opts.Input)); opts.Input = Path.GetFullPath(opts.Input!.Trim()); - if (opts.Output != null) - { + if (opts.Output != null) { opts.Output = Path.GetFullPath(opts.Output.Trim()); - if (File.Exists(opts.Output)) - { + if (File.Exists(opts.Output)) { Logger.Error("Output must be a directory."); Environment.Exit(1); } } } - public static LogLevel SetupLogger(Options opts) - { + public static LogLevel SetupLogger(Options opts) { var logLevel = LogLevel.FromOrdinal(Math.Abs(Math.Min(opts.Quiet, 3) - Math.Min(opts.Verbosity, 2) + 2)); - LogManager.Setup().LoadConfiguration(builder => - { + LogManager.Setup().LoadConfiguration(builder => { var layout = "${pad:padding=5:inner=${level:uppercase=true}}|${message}"; if (logLevel <= LogLevel.Debug) layout = "[${threadid}] " + layout; - var console = new ColoredConsoleTarget("console") - { + var console = new ColoredConsoleTarget("console") { Layout = layout, DetectConsoleAvailable = true, EnableAnsiOutput = true, @@ -205,53 +199,54 @@ public static LogLevel SetupLogger(Options opts) } }, WordHighlightingRules = { - new ConsoleWordHighlightingRule - { + new ConsoleWordHighlightingRule { Regex = "\\b(?:error|exception|fail|fatal|warn|warning)\\b", ForegroundColor = ConsoleOutputColor.DarkRed }, - new ConsoleWordHighlightingRule - { + new ConsoleWordHighlightingRule { Regex = "\\b(?:info|log|message|success)\\b", ForegroundColor = ConsoleOutputColor.Green }, - new ConsoleWordHighlightingRule - { + new ConsoleWordHighlightingRule { Regex = "\\b(?:debug)\\b", ForegroundColor = ConsoleOutputColor.Blue }, - new ConsoleWordHighlightingRule - { + new ConsoleWordHighlightingRule { Regex = "\\b(?:trace)\\b", ForegroundColor = ConsoleOutputColor.Gray } } }; - var errorConsole = new ColoredConsoleTarget("errorConsole") - { + var errorConsole = new ColoredConsoleTarget("errorConsole") { Layout = layout, DetectConsoleAvailable = console.DetectConsoleAvailable, EnableAnsiOutput = console.EnableAnsiOutput, StdErr = true, RowHighlightingRules = { - new ConsoleRowHighlightingRule - { + new ConsoleRowHighlightingRule { Condition = "level == LogLevel.Fatal", ForegroundColor = ConsoleOutputColor.Red }, - new ConsoleRowHighlightingRule - { + new ConsoleRowHighlightingRule { Condition = "level == LogLevel.Error", ForegroundColor = ConsoleOutputColor.DarkRed }, } }; - if (logLevel != LogLevel.Off) - { - if (logLevel <= LogLevel.Fatal) builder.ForLogger().FilterLevels(LogLevel.FromOrdinal(Math.Max(logLevel.Ordinal, LogLevel.Error.Ordinal)), LogLevel.Fatal).WriteTo(errorConsole); - if (logLevel <= LogLevel.Warn) builder.ForLogger().FilterLevels(logLevel, LogLevel.FromOrdinal(Math.Max(logLevel.Ordinal, LogLevel.Warn.Ordinal))).WriteTo(console); + if (logLevel != LogLevel.Off) { + if (logLevel <= LogLevel.Fatal) { + builder.ForLogger() + .FilterLevels(LogLevel.FromOrdinal(Math.Max(logLevel.Ordinal, LogLevel.Error.Ordinal)), LogLevel.Fatal) + .WriteTo(errorConsole); + } + + if (logLevel <= LogLevel.Warn) { + builder.ForLogger() + .FilterLevels(logLevel, LogLevel.FromOrdinal(Math.Max(logLevel.Ordinal, LogLevel.Warn.Ordinal))) + .WriteTo(console); + } } }); @@ -261,8 +256,7 @@ public static LogLevel SetupLogger(Options opts) public static string GetOutputLocation( string sourceDirectory, string outputDirectory, - string targetFile) - { + string targetFile) { if (sourceDirectory == targetFile) return Path.Combine(outputDirectory, Path.GetFileName(targetFile)); var relativePath = Path.GetRelativePath(sourceDirectory, targetFile); @@ -270,21 +264,14 @@ public static string GetOutputLocation( } - public static IEnumerable GetFilesToCompile(string input) - { - if (File.Exists(input)) - { + public static IEnumerable GetFilesToCompile(string input) { + if (File.Exists(input)) { yield return input; - } - else if (Directory.Exists(input)) - { - foreach (var file in Directory.EnumerateFiles(input, "*.ps1", SearchOption.AllDirectories)) - { + } else if (Directory.Exists(input)) { + foreach (var file in Directory.EnumerateFiles(input, "*.ps1", SearchOption.AllDirectories)) { yield return file; } - } - else - { + } else { Logger.Error("Input must be a file or directory."); Environment.Exit(1); } @@ -294,15 +281,13 @@ public static void EnsureDirectoryStructure( string sourceDirectory, string? outputDirectory, IEnumerable scripts - ) - { + ) { if (string.IsNullOrWhiteSpace(outputDirectory)) return; if (!Directory.Exists(outputDirectory)) Directory.CreateDirectory(outputDirectory); if (!Directory.Exists(sourceDirectory)) return; - foreach (var script in scripts) - { + foreach (var script in scripts) { var outputDir = Path.GetDirectoryName(GetOutputLocation(sourceDirectory, outputDirectory, script)); if (!Directory.Exists(outputDir)) Directory.CreateDirectory(outputDir!); } @@ -313,28 +298,23 @@ public static async void OutputToFile( string? outputDirectory, string fileName, string content, - bool overwrite) - { - if (string.IsNullOrWhiteSpace(outputDirectory)) - { + bool overwrite) { + if (string.IsNullOrWhiteSpace(outputDirectory)) { // Output to console to allow for piping Console.OpenStandardOutput().Write(Encoding.UTF8.GetBytes(content)); return; } var outputPath = GetOutputLocation(sourceDirectory, outputDirectory, fileName); - if (File.Exists(outputPath)) - { + if (File.Exists(outputPath)) { var removeFile = overwrite; - if (!removeFile) - { + if (!removeFile) { Logger.Info($"File {outputPath} already exists. Overwrite? (Y/n)"); var response = Console.ReadLine(); - removeFile = string.IsNullOrWhiteSpace(response) || response.Equals("y", StringComparison.CurrentCultureIgnoreCase); + removeFile = string.IsNullOrWhiteSpace(response) || response.Equals("y", StringComparison.OrdinalIgnoreCase); } - if (removeFile) - { + if (removeFile) { Logger.Trace("Removing file"); File.Delete(outputPath); } @@ -345,8 +325,7 @@ public static async void OutputToFile( await fileStream.WriteAsync(Encoding.UTF8.GetBytes(content)); } - internal static PowerShell GetPowerShellSession() - { + internal static PowerShell GetPowerShellSession() { var pwsh = PowerShell.Create(RunspacePool.Value.InitialSessionState); pwsh.RunspacePool = RunspacePool.Value; return pwsh; @@ -362,15 +341,13 @@ internal static Collection RunPowerShell(string script, params object[ pwsh.Streams.Verbose.ToList().ForEach(log => Logger.Debug(log.Message)); pwsh.Streams.Debug.ToList().ForEach(log => Logger.Debug(log.Message)); - pwsh.Streams.Information.ToList().ForEach(log => Logger.Info(log.MessageData)); + pwsh.Streams.Information.ToList().ForEach(log => Logger.Info(CultureInfo.CurrentCulture, log.MessageData)); pwsh.Streams.Warning.ToList().ForEach(log => Logger.Warn(log.Message)); - if (pwsh.HadErrors) - { var ast = AstHelper.GetAstReportingErrors(script, null, []); + if (pwsh.HadErrors) { - pwsh.Streams.Error.ToList().ForEach(log => - { + var errors = pwsh.Streams.Error.Select(log => { Logger.Debug(log.InvocationInfo.ScriptLineNumber); Logger.Debug(log.InvocationInfo.OffsetInLine); Logger.Debug(log.InvocationInfo.Line); @@ -401,8 +378,7 @@ internal static Collection RunPowerShell(string script, params object[ return result; } - ~Program() - { + ~Program() { RunspacePool.Value.Close(); RunspacePool.Value.Dispose(); LogManager.Shutdown(); diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index 0952ad41..18652cd9 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -1,5 +1,9 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.Diagnostics.CodeAnalysis; +using System.Globalization; using System.Security.Cryptography; using System.Text; using System.Text.Json; @@ -8,140 +12,123 @@ namespace Compiler.Requirements; -public sealed class PathedModuleSpec : ModuleSpec -{ +public sealed class PathedModuleSpec : ModuleSpec { public readonly string FullPath; public PathedModuleSpec( string fullPath, - Guid? guid = null, + Guid? id = null, Version? minimumVersion = null, Version? maximumVersion = null, Version? requiredVersion = null - ) : base(Path.GetFileNameWithoutExtension(fullPath), guid, minimumVersion, maximumVersion, requiredVersion) - { - FullPath = fullPath; - Weight = 73; - Hash = SHA1.HashData(File.ReadAllBytes(fullPath)); + ) : base(Path.GetFileNameWithoutExtension(fullPath), id, minimumVersion, maximumVersion, requiredVersion) { + this.FullPath = fullPath; + this.Weight = 73; + this.Hash = SHA256.HashData(File.ReadAllBytes(fullPath)); } // TODO - this may not be the best way to do this. - public override ModuleMatch CompareTo(ModuleSpec other) - { - if (other is not PathedModuleSpec && other.Guid == null && other.MinimumVersion == null && other.MaximumVersion == null && other.RequiredVersion == null) - { + public override ModuleMatch CompareTo(ModuleSpec other) { + if (other is not PathedModuleSpec && other.Id == null && other.MinimumVersion == null && other.MaximumVersion == null && other.RequiredVersion == null) { var otherMaybeFileName = Path.GetFileNameWithoutExtension(other.Name); - if (Name == otherMaybeFileName) return ModuleMatch.PreferOurs; + if (this.Name == otherMaybeFileName) return ModuleMatch.PreferOurs; } return base.CompareTo(other); } } -public class ModuleSpec : Requirement -{ - private readonly static Logger Logger = LogManager.GetCurrentClassLogger(); +public class ModuleSpec : Requirement { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public string Name { get; } - public Guid? Guid { get; } + public Guid? Id { get; } public Version? MinimumVersion { get; } public Version? MaximumVersion { get; } public Version? RequiredVersion { get; } public ModuleSpec( string name, - Guid? guid = null, + Guid? id = null, Version? minimumVersion = null, Version? maximumVersion = null, Version? requiredVersion = null - ) : base() - { - SupportsMultiple = true; - Weight = 70; - - Name = name; - Guid = guid; - MinimumVersion = minimumVersion; - MaximumVersion = maximumVersion; - RequiredVersion = requiredVersion; - - Hash = SHA1.HashData(Encoding.UTF8.GetBytes(string.Concat(Name, Guid, MinimumVersion, MaximumVersion, RequiredVersion))); + ) : base() { + this.SupportsMultiple = true; + this.Weight = 70; + + this.Name = name; + this.Id = id; + this.MinimumVersion = minimumVersion; + this.MaximumVersion = maximumVersion; + this.RequiredVersion = requiredVersion; + + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(string.Concat(this.Name, this.Id, this.MinimumVersion, this.MaximumVersion, this.RequiredVersion))); } // TODO - Maybe use IsCompatibleWith to do some other check stuff - public ModuleSpec MergeSpecs(ModuleSpec[] merge) - { - var guid = Guid; - var minVersion = MinimumVersion; - var maxVersion = MaximumVersion; - var reqVersion = RequiredVersion; - - foreach (var match in merge) - { - if (match.Guid != null && guid == null) - { - Logger.Debug($"Merging {Name} with {match.Name} - {guid?.ToString() ?? "null"} -> {match.Guid}"); - guid = match.Guid; + public ModuleSpec MergeSpecs(ModuleSpec[] merge) { + var guid = this.Id; + var minVersion = this.MinimumVersion; + var maxVersion = this.MaximumVersion; + var reqVersion = this.RequiredVersion; + + foreach (var match in merge) { + if (match.Id != null && guid == null) { + Logger.Debug($"Merging {this.Name} with {match.Name} - {guid?.ToString() ?? "null"} -> {match.Id}"); + guid = match.Id; } - if (match.MinimumVersion != null && (minVersion == null || match.MinimumVersion > minVersion)) - { - Logger.Debug($"Merging {Name} with {match.Name} - {minVersion?.ToString() ?? "null"} -> {match.MinimumVersion}"); + if (match.MinimumVersion != null && (minVersion == null || match.MinimumVersion > minVersion)) { + Logger.Debug($"Merging {this.Name} with {match.Name} - {minVersion?.ToString() ?? "null"} -> {match.MinimumVersion}"); minVersion = match.MinimumVersion; } - if (match.MaximumVersion != null && (maxVersion == null || match.MaximumVersion < maxVersion)) - { - Logger.Debug($"Merging {Name} with {match.Name} - {maxVersion?.ToString() ?? "null"} -> {match.MaximumVersion}"); + if (match.MaximumVersion != null && (maxVersion == null || match.MaximumVersion < maxVersion)) { + Logger.Debug($"Merging {this.Name} with {match.Name} - {maxVersion?.ToString() ?? "null"} -> {match.MaximumVersion}"); maxVersion = match.MaximumVersion; } - if (match.RequiredVersion != null && reqVersion == null) - { - Logger.Debug($"Merging {Name} with {match.Name} - {RequiredVersion?.ToString() ?? "null"} -> {match.RequiredVersion}"); + if (match.RequiredVersion != null && reqVersion == null) { + Logger.Debug($"Merging {this.Name} with {match.Name} - {this.RequiredVersion?.ToString() ?? "null"} -> {match.RequiredVersion}"); reqVersion = match.RequiredVersion; } } - return new ModuleSpec(Name, guid, minVersion, maxVersion, reqVersion); + return new ModuleSpec(this.Name, guid, minVersion, maxVersion, reqVersion); } - public override string GetInsertableLine(Hashtable data) - { + public override string GetInsertableLine(Hashtable data) { var nameSuffix = data.ContainsKey("NameSuffix") ? $"-{data["NameSuffix"]}" : string.Empty; - var moduleName = $"{Name}{nameSuffix}"; + var moduleName = $"{this.Name}{nameSuffix}"; - if (Guid == null && RequiredVersion == null && MinimumVersion == null && MaximumVersion == null) - { + if (this.Id == null && this.RequiredVersion == null && this.MinimumVersion == null && this.MaximumVersion == null) { return $"Using module '{moduleName}'"; } var sb = new StringBuilder("Using module @{"); - sb.Append($"ModuleName = '{moduleName}';"); - if (Guid != null) sb.Append($"GUID = {Guid};"); + sb.Append(CultureInfo.InvariantCulture, $"ModuleName = '{moduleName}';"); + if (this.Id != null) sb.Append(CultureInfo.InvariantCulture, $"GUID = {this.Id};"); - switch (RequiredVersion, MinimumVersion, MaximumVersion) - { + switch (this.RequiredVersion, this.MinimumVersion, this.MaximumVersion) { case (null, null, null): break; - case (null, var min, var max) when min != null && max != null: sb.Append($"ModuleVersion = '{min}';MaximumVersion = '{max}';"); break; - case (null, var min, _) when min != null: sb.Append($"ModuleVersion = '{min}';"); break; - case (null, _, var max) when max != null: sb.Append($"MaximumVersion = '{max}';"); break; - case (var req, _, _): sb.Append($"RequiredVersion = '{req}';"); break; + case (null, var min, var max) when min != null && max != null: sb.Append(CultureInfo.InvariantCulture, $"ModuleVersion = '{min}';MaximumVersion = '{max}';"); break; + case (null, var min, _) when min != null: sb.Append(CultureInfo.InvariantCulture, $"ModuleVersion = '{min}';"); break; + case (null, _, var max) when max != null: sb.Append(CultureInfo.InvariantCulture, $"MaximumVersion = '{max}';"); break; + case (var req, _, _): sb.Append(CultureInfo.InvariantCulture, $"RequiredVersion = '{req}';"); break; } sb.Append('}'); return sb.ToString(); } - public virtual ModuleMatch CompareTo(ModuleSpec other) - { + public virtual ModuleMatch CompareTo(ModuleSpec other) { if (ReferenceEquals(this, other)) return ModuleMatch.Same; - if (Name != other.Name) return ModuleMatch.None; - if (Guid != null && other.Guid != null && Guid != other.Guid) return ModuleMatch.None; + if (this.Name != other.Name) return ModuleMatch.None; + if (this.Id != null && other.Id != null && this.Id != other.Id) return ModuleMatch.None; var isStricter = false; var isLooser = false; - switch ((MinimumVersion, other.MinimumVersion)) - { + switch ((this.MinimumVersion, other.MinimumVersion)) { case (null, null): break; case (null, _): @@ -158,8 +145,7 @@ public virtual ModuleMatch CompareTo(ModuleSpec other) break; } - switch ((MaximumVersion, other.MaximumVersion)) - { + switch ((this.MaximumVersion, other.MaximumVersion)) { case (null, null): break; case (null, _): @@ -176,14 +162,13 @@ public virtual ModuleMatch CompareTo(ModuleSpec other) break; } - if (MinimumVersion != null && other.MaximumVersion != null && MinimumVersion > other.MaximumVersion) return ModuleMatch.Incompatible; - if (other.MinimumVersion != null && MaximumVersion != null && other.MinimumVersion > MaximumVersion) return ModuleMatch.Incompatible; + if (this.MinimumVersion != null && other.MaximumVersion != null && this.MinimumVersion > other.MaximumVersion) return ModuleMatch.Incompatible; + if (other.MinimumVersion != null && this.MaximumVersion != null && other.MinimumVersion > this.MaximumVersion) return ModuleMatch.Incompatible; - switch ((RequiredVersion, other.RequiredVersion)) - { + switch ((this.RequiredVersion, other.RequiredVersion)) { case (null, null): break; - case (null, var b) when (MinimumVersion != null && b < MinimumVersion) || (MaximumVersion != null && b > MaximumVersion): + case (null, var b) when (this.MinimumVersion != null && b < this.MinimumVersion) || (this.MaximumVersion != null && b > this.MaximumVersion): return ModuleMatch.Incompatible; case (var a, null) when (other.MinimumVersion != null && a < other.MinimumVersion) || (other.MaximumVersion != null && a > other.MaximumVersion): return ModuleMatch.Incompatible; @@ -210,20 +195,18 @@ public virtual ModuleMatch CompareTo(ModuleSpec other) [ExcludeFromCodeCoverage(Justification = "Just a bool flag.")] public override bool IsCompatibleWith(Requirement other) => true; - public override int GetHashCode() => HashCode.Combine(Name, Guid, MinimumVersion, MaximumVersion, RequiredVersion); + public override int GetHashCode() => HashCode.Combine(this.Name, this.Id, this.MinimumVersion, this.MaximumVersion, this.RequiredVersion); - public override int CompareTo(Requirement? other) - { + public override int CompareTo(Requirement? other) { if (other is not ModuleSpec) return 0; - return CompareTo((ModuleSpec)other).CompareTo(ModuleMatch.Same); + return this.CompareTo((ModuleSpec)other).CompareTo(ModuleMatch.Same); } - public override bool Equals(object? obj) - { + public override bool Equals(object? obj) { if (obj is null) return false; if (obj is not ModuleSpec other) return false; if (ReferenceEquals(this, other)) return true; - return Name == other.Name && Guid == other.Guid && MinimumVersion == other.MinimumVersion && MaximumVersion == other.MaximumVersion && RequiredVersion == other.RequiredVersion; + return this.Name == other.Name && this.Id == other.Id && this.MinimumVersion == other.MinimumVersion && this.MaximumVersion == other.MaximumVersion && this.RequiredVersion == other.RequiredVersion; } public override string ToString() => JsonSerializer.Serialize(this, SerializerOptions); diff --git a/src/Compiler/Requirements/PSEdition.cs b/src/Compiler/Requirements/PSEdition.cs index ecabcd40..27d7cd3d 100644 --- a/src/Compiler/Requirements/PSEdition.cs +++ b/src/Compiler/Requirements/PSEdition.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.Security.Cryptography; using System.Text; @@ -9,32 +12,28 @@ public enum PSEdition { Desktop, Core } /// /// Represents a PowerShell edition requirement. /// -public sealed class PSEditionRequirement : Requirement -{ +public sealed class PSEditionRequirement : Requirement { public PSEdition Edition { get; } - public PSEditionRequirement(PSEdition edition) : base() - { - Edition = edition; - Hash = SHA1.HashData(Encoding.UTF8.GetBytes(Edition.ToString())); + public PSEditionRequirement(PSEdition edition) : base() { + this.Edition = edition; + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(this.Edition.ToString())); } /// Gets the insertable line for the requirement. /// /// /// The insertable line for the requirement. - public override string GetInsertableLine(Hashtable _) => $"#Requires -PSEdition {Edition}"; + public override string GetInsertableLine(Hashtable data) => $"#Requires -PSEdition {this.Edition}"; /// /// Determines whether this requirement is compatible with another requirement. /// /// The other requirement. /// true if this requirement is compatible with the other requirement; otherwise, false. - public override bool IsCompatibleWith(Requirement other) - { - if (other is PSEditionRequirement otherEdition) - { - return Edition == otherEdition.Edition; + public override bool IsCompatibleWith(Requirement other) { + if (other is PSEditionRequirement otherEdition) { + return this.Edition == otherEdition.Edition; } return true; diff --git a/src/Compiler/Requirements/PSVersion.cs b/src/Compiler/Requirements/PSVersion.cs index 0bff2c24..6d1dfa8c 100644 --- a/src/Compiler/Requirements/PSVersion.cs +++ b/src/Compiler/Requirements/PSVersion.cs @@ -1,44 +1,42 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.Diagnostics.CodeAnalysis; +using System.Globalization; using System.Security.Cryptography; using System.Text; namespace Compiler.Requirements; -public sealed class PSVersionRequirement : Requirement -{ +public sealed class PSVersionRequirement : Requirement { public Version Version { get; } - public PSVersionRequirement(Version version) : base() - { - SupportsMultiple = false; + public PSVersionRequirement(Version version) : base() { + this.SupportsMultiple = false; - Version = version; - Hash = SHA1.HashData(Encoding.UTF8.GetBytes(Version.ToString())); + this.Version = version; + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(this.Version.ToString())); } - public override string GetInsertableLine(Hashtable _) - { + public override string GetInsertableLine(Hashtable data) { var sb = new StringBuilder(); sb.Append("#Requires -Version "); - sb.Append(Version.Major); + sb.Append(this.Version.Major); - var hasBuild = Version.Build > 0; - if (Version.Minor > 0 || hasBuild) - { - sb.Append($".{Version.Minor}"); + var hasBuild = this.Version.Build > 0; + if (this.Version.Minor > 0 || hasBuild) { + sb.Append(CultureInfo.InvariantCulture, $".{this.Version.Minor}"); - if (hasBuild) - { - sb.Append($".{Version.Build}"); + if (hasBuild) { + sb.Append(CultureInfo.InvariantCulture, $".{this.Version.Build}"); } } return sb.ToString(); } - public override bool IsCompatibleWith([NotNull] Requirement other) => (this, other) switch - { + public override bool IsCompatibleWith([NotNull] Requirement other) => (this, other) switch { // TODO - Check modules for version compatibility // Short circuit for non-version requirements (_, var otherRequirement) when otherRequirement is not PSVersionRequirement => true, diff --git a/src/Compiler/Requirements/Requirements.cs b/src/Compiler/Requirements/Requirements.cs index 54933b4a..509097ce 100644 --- a/src/Compiler/Requirements/Requirements.cs +++ b/src/Compiler/Requirements/Requirements.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.Collections.Immutable; using System.Text.Json; @@ -5,54 +8,41 @@ namespace Compiler.Requirements; -public sealed class RequirementGroup -{ +public sealed class RequirementGroup { public Dictionary> StoredRequirements { get; init; } - public RequirementGroup() - { - StoredRequirements ??= []; - } + public RequirementGroup() => this.StoredRequirements ??= []; - public bool AddRequirement(T value) where T : Requirement - { + public bool AddRequirement(T value) where T : Requirement { var typeName = typeof(T); - if (!StoredRequirements.TryGetValue(typeName, out HashSet? requirementList)) - { - StoredRequirements.Add(typeName, [value]); + if (!this.StoredRequirements.TryGetValue(typeName, out var requirementList)) { + this.StoredRequirements.Add(typeName, [value]); return true; - } - else - { + } else { return requirementList.Add(value); } } - public ImmutableList GetRequirements() where T : Requirement - { + public ImmutableList GetRequirements() where T : Requirement { var typeName = typeof(T); - if (StoredRequirements.TryGetValue(typeName, out HashSet? value)) - { + if (this.StoredRequirements.TryGetValue(typeName, out var value)) { return value.Cast().ToImmutableList(); } return []; } - public bool RemoveRequirement(T value) where T : Requirement - { + public bool RemoveRequirement(T value) where T : Requirement { var typeName = typeof(T); - if (StoredRequirements.TryGetValue(typeName, out HashSet? collection)) - { + if (this.StoredRequirements.TryGetValue(typeName, out var collection)) { return collection.Remove(value); } return false; } - public ImmutableList GetRequirements() - { - var rawRequirements = StoredRequirements.Values; + public ImmutableList GetRequirements() { + var rawRequirements = this.StoredRequirements.Values; if (rawRequirements.Count == 0) return []; var flattenedList = rawRequirements.ToList().SelectMany(x => x); @@ -64,13 +54,8 @@ public ImmutableList GetRequirements() /// /// Represents a requirement, which is a condition that must be met in order to run the script. /// -/// -/// True if the requirement supports multiple instances, false otherwise. -/// -public abstract class Requirement : IComparable -{ - protected static readonly JsonSerializerOptions SerializerOptions = new() - { +public abstract class Requirement : IComparable { + protected static readonly JsonSerializerOptions SerializerOptions = new() { WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase) } @@ -101,7 +86,7 @@ public abstract class Requirement : IComparable /// Used only for serialization purposes. /// [JsonInclude] - internal string HashString => Convert.ToHexString(Hash); + internal string HashString => Convert.ToHexString(this.Hash); /// /// Checks if the requirement is compatible with another requirement. @@ -117,18 +102,45 @@ public abstract class Requirement : IComparable public virtual int CompareTo(Requirement? other) => 0; public override string ToString() => JsonSerializer.Serialize(this, SerializerOptions); + + public override bool Equals(object? obj) { + if (ReferenceEquals(this, obj)) return true; + if (obj is null) return false; + + return obj is Requirement requirement + && this.SupportsMultiple == requirement.SupportsMultiple + && this.Weight == requirement.Weight + && this.Hash.SequenceEqual(requirement.Hash); + } + + public override int GetHashCode() => HashCode.Combine(this.SupportsMultiple, this.Weight, this.Hash); + + public static bool operator ==(Requirement left, Requirement right) { + if (left is null) return right is null; + + return left.Equals(right); + } + + public static bool operator !=(Requirement left, Requirement right) => !(left == right); + + public static bool operator <(Requirement left, Requirement right) => left is null ? right is not null : left.CompareTo(right) < 0; + + public static bool operator <=(Requirement left, Requirement right) => left is null || left.CompareTo(right) <= 0; + + public static bool operator >(Requirement left, Requirement right) => left is not null && left.CompareTo(right) > 0; + + public static bool operator >=(Requirement left, Requirement right) => left is null ? right is null : left.CompareTo(right) >= 0; } /// /// Sorts requirements by their weight. /// -public sealed class RequirementWeightSorter : IComparer -{ - public int Compare(Requirement? x, Requirement? y) - { +public sealed class RequirementWeightSorter : IComparer { + public int Compare(Requirement? x, Requirement? y) { if (ReferenceEquals(x, y)) return 0; - if (x == null) return y == null ? 0 : -1; - if (y == null) return x == null ? 0 : 1; + + if (x is null) return y is null ? 0 : -1; + if (y is null) return x is null ? 0 : 1; var weight = x.Weight.CompareTo(y?.Weight); if (weight != 0) return weight; diff --git a/src/Compiler/Requirements/RunAsAdmin.cs b/src/Compiler/Requirements/RunAsAdmin.cs index 5c2c9d55..f6aac1f1 100644 --- a/src/Compiler/Requirements/RunAsAdmin.cs +++ b/src/Compiler/Requirements/RunAsAdmin.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography; @@ -5,18 +8,16 @@ namespace Compiler.Requirements; -public sealed class RunAsAdminRequirement : Requirement -{ - const string STRING = "#Requires -RunAsAdministrator"; +public sealed class RunAsAdminRequirement : Requirement { + private const string STRING = "#Requires -RunAsAdministrator"; - public RunAsAdminRequirement() : base() - { - SupportsMultiple = false; - Hash = SHA1.HashData(Encoding.UTF8.GetBytes(STRING)); + public RunAsAdminRequirement() : base() { + this.SupportsMultiple = false; + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(STRING)); } [ExcludeFromCodeCoverage(Justification = "It's just a string.")] - public override string GetInsertableLine(Hashtable _) => STRING; + public override string GetInsertableLine(Hashtable data) => STRING; [ExcludeFromCodeCoverage(Justification = "Just a sick as fuck bool man!")] public override bool IsCompatibleWith(Requirement other) => true; diff --git a/src/Compiler/Requirements/UsingNamespace.cs b/src/Compiler/Requirements/UsingNamespace.cs index 72741cc6..04665947 100644 --- a/src/Compiler/Requirements/UsingNamespace.cs +++ b/src/Compiler/Requirements/UsingNamespace.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using System.Security.Cryptography; using System.Text; @@ -7,24 +10,22 @@ namespace Compiler.Requirements; /// /// Represents a requirement to include a using namespace statement in the code. /// -public sealed class UsingNamespace : Requirement -{ +public sealed class UsingNamespace : Requirement { public string Namespace { get; } - public UsingNamespace(string @namespace) : base() - { - SupportsMultiple = true; - Weight = 75; + public UsingNamespace(string @namespace) : base() { + this.SupportsMultiple = true; + this.Weight = 75; - Namespace = @namespace; - Hash = SHA1.HashData(Encoding.UTF8.GetBytes(Namespace)); + this.Namespace = @namespace; + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(this.Namespace)); } /// /// Gets the insertable line for the requirement. /// /// The insertable line. - public override string GetInsertableLine(Hashtable _) => $"Using namespace {Namespace};"; + public override string GetInsertableLine(Hashtable data) => $"Using namespace {this.Namespace};"; /// /// Checks if the requirement is compatible with another requirement. @@ -37,5 +38,5 @@ public UsingNamespace(string @namespace) : base() /// Gets the hash code of the requirement. /// /// The hash code. - public override int GetHashCode() => Namespace.GetHashCode(); + public override int GetHashCode() => this.Namespace.GetHashCode(); } diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index 1b865b56..fe5d6c71 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -1,22 +1,22 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Text.RegularExpressions; using Compiler.Text.Updater; using NLog; namespace Compiler.Text; -public partial class TextDocument(string[] lines) -{ +public partial class TextDocument(string[] lines) { public readonly List Lines = new(lines); } -public class CompiledDocument(string[] lines) : TextDocument(lines) -{ +public class CompiledDocument(string[] lines) : TextDocument(lines) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public string GetContent() => string.Join('\n', Lines); + public string GetContent() => string.Join('\n', this.Lines); - public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) - { + public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) { Logger.Trace($"Creating CompiledDocument from {builder}"); builder.AddEdit(() => new IndentUpdater(indentBy)); @@ -24,8 +24,7 @@ public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) var lines = builder.Document.Lines; var spanUpdates = new List(); var sortedUpdaters = builder.TextUpdaters.OrderBy(updater => updater.Priority).ToList(); - foreach (var textUpdater in sortedUpdaters) - { + foreach (var textUpdater in sortedUpdaters) { // Logger.Debug($"Applying updater {textUpdater} with priority {textUpdater.Priority}"); spanUpdates.ForEach(textUpdater.PushByUpdate); textUpdater.Apply(ref lines).ToList().ForEach(spanUpdates.Add); @@ -35,36 +34,32 @@ public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) } } -public class TextEditor(TextDocument document) -{ +public class TextEditor(TextDocument document) { public readonly TextDocument OriginalCopy = document; public readonly TextDocument Document = document; public readonly List TextUpdaters = []; - public void AddEdit(Func updater) - { - TextUpdaters.Add(updater()); - } + public void AddEdit(Func updater) => this.TextUpdaters.Add(updater()); public void AddPatternEdit( Regex openingPattern, Regex closingPattern, Func updater - ) => AddPatternEdit(50, openingPattern, closingPattern, updater); + ) => this.AddPatternEdit(50, openingPattern, closingPattern, updater); public void AddPatternEdit( uint priority, Regex openingPattern, Regex closingPattern, Func updater - ) => AddPatternEdit(priority, openingPattern, closingPattern, UpdateOptions.None, updater); + ) => this.AddPatternEdit(priority, openingPattern, closingPattern, UpdateOptions.None, updater); public void AddPatternEdit( Regex openingPattern, Regex closingPattern, UpdateOptions options, Func updater - ) => AddPatternEdit(50, openingPattern, closingPattern, options, updater); + ) => this.AddPatternEdit(50, openingPattern, closingPattern, options, updater); public void AddPatternEdit( uint priority, @@ -72,7 +67,7 @@ public void AddPatternEdit( Regex closingPattern, UpdateOptions options, Func updater - ) => AddEdit(() => new PatternUpdater( + ) => this.AddEdit(() => new PatternUpdater( priority, openingPattern, closingPattern, @@ -83,26 +78,26 @@ Func updater public void AddRegexEdit( Regex pattern, Func updater - ) => AddRegexEdit(50, pattern, updater); + ) => this.AddRegexEdit(50, pattern, updater); public void AddRegexEdit( Regex pattern, UpdateOptions options, Func updater - ) => AddRegexEdit(50, pattern, options, updater); + ) => this.AddRegexEdit(50, pattern, options, updater); public void AddRegexEdit( uint priority, Regex pattern, Func updater - ) => AddRegexEdit(priority, pattern, UpdateOptions.None, updater); + ) => this.AddRegexEdit(priority, pattern, UpdateOptions.None, updater); public void AddRegexEdit( uint priority, Regex pattern, UpdateOptions options, Func updater - ) => AddEdit(() => new RegexUpdater( + ) => this.AddEdit(() => new RegexUpdater( priority, pattern, options, @@ -115,7 +110,7 @@ public void AddExactEdit( int endingIndex, int endingColumn, Func updater - ) => AddExactEdit(50, startingIndex, startingColumn, endingIndex, endingColumn, updater); + ) => this.AddExactEdit(50, startingIndex, startingColumn, endingIndex, endingColumn, updater); public void AddExactEdit( uint priority, @@ -124,7 +119,7 @@ public void AddExactEdit( int endingIndex, int endingColumn, Func updater - ) => AddExactEdit( + ) => this.AddExactEdit( priority, startingIndex, startingColumn, @@ -142,7 +137,7 @@ public void AddExactEdit( int endingColumn, UpdateOptions options, Func updater - ) => AddEdit(() => new ExactUpdater( + ) => this.AddEdit(() => new ExactUpdater( priority, startingIndex, startingColumn, diff --git a/src/Compiler/Text/Span.cs b/src/Compiler/Text/Span.cs index 0319a577..d9812866 100644 --- a/src/Compiler/Text/Span.cs +++ b/src/Compiler/Text/Span.cs @@ -1,4 +1,6 @@ -using System.Diagnostics.CodeAnalysis; +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation; using System.Text; using JetBrains.Annotations; @@ -10,8 +12,7 @@ namespace Compiler.Text; /// Specifies the options for updating a document. /// [Flags] -public enum UpdateOptions -{ +public enum UpdateOptions { None = 0, MatchEntireDocument = 1, InsertInline = 2 @@ -22,10 +23,8 @@ public class TextSpan( [NonNegativeValue] int startingColumn, [NonNegativeValue] int endingIndex, [NonNegativeValue] int endingColumn -) -{ - [ExcludeFromCodeCoverage(Justification = "Logging")] - private static Logger Logger { get => LogManager.GetCurrentClassLogger(); } +) { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); [ValidateRange(0, int.MaxValue)] public int StartingIndex = startingIndex; [ValidateRange(0, int.MaxValue)] public int StartingColumn = startingColumn; @@ -34,71 +33,58 @@ [NonNegativeValue] int endingColumn public static TextSpan WrappingEntireDocument(TextDocument document) => WrappingEntireDocument([.. document.Lines]); - public static TextSpan WrappingEntireDocument(string[] lines) - { - if (lines.Length == 0) - { + public static TextSpan WrappingEntireDocument(string[] lines) { + if (lines.Length == 0) { return new TextSpan(0, 0, 0, 0); } return new TextSpan(0, 0, lines.Length - 1, lines[^1].Length); } - public bool Contains(int index, int column) - { - if (index < StartingIndex || index > EndingIndex) - { + public bool Contains(int index, int column) { + if (index < this.StartingIndex || index > this.EndingIndex) { return false; } - if (index == StartingIndex && column < StartingColumn) - { + if (index == this.StartingIndex && column < this.StartingColumn) { return false; } - if (index == EndingIndex && column > EndingColumn) - { + if (index == this.EndingIndex && column > this.EndingColumn) { return false; } return true; } - public string GetContent(TextDocument document) => GetContent([.. document.Lines]); + public string GetContent(TextDocument document) => this.GetContent([.. document.Lines]); [Pure] - public string GetContent(string[] lines) - { + public string GetContent(string[] lines) { if (lines.Length == 0) return string.Empty; - if (StartingIndex < 0 || StartingIndex >= lines.Length) - { - Logger.Error("Starting index {0} is out of range for document with {1} lines", StartingIndex, lines.Length); - throw new ArgumentOutOfRangeException(nameof(StartingIndex)); + if (this.StartingIndex < 0 || this.StartingIndex >= lines.Length) { + throw new ArgumentOutOfRangeException(nameof(lines), $"Starting index {this.StartingIndex} is out of range for document with {lines.Length} lines"); } - if (StartingIndex == EndingIndex) - { - if (StartingColumn == 0 && EndingColumn == lines[StartingIndex].Length) - { - return lines[StartingIndex]; + if (this.StartingIndex == this.EndingIndex) { + if (this.StartingColumn == 0 && this.EndingColumn == lines[this.StartingIndex].Length) { + return lines[this.StartingIndex]; } - if (StartingColumn == EndingColumn) - { + if (this.StartingColumn == this.EndingColumn) { return string.Empty; } - return lines[StartingIndex][StartingColumn..EndingColumn]; + return lines[this.StartingIndex][this.StartingColumn..this.EndingColumn]; } var builder = new StringBuilder(); - builder.Append(lines[StartingIndex][StartingColumn..] + '\n'); - for (int i = StartingIndex + 1; i < EndingIndex; i++) - { + builder.Append(lines[this.StartingIndex][this.StartingColumn..] + '\n'); + for (var i = this.StartingIndex + 1; i < this.EndingIndex; i++) { builder.Append(lines[i] + '\n'); } - builder.Append(lines[EndingIndex][..EndingColumn]); + builder.Append(lines[this.EndingIndex][..this.EndingColumn]); return builder.ToString(); } @@ -119,126 +105,94 @@ public int SetContent( ref List lines, UpdateOptions options, string[] content - ) - { - if (StartingIndex < 0 || StartingIndex >= lines.Count) - { - Logger.Error("Starting index {0} is out of range for document with {1} lines", StartingIndex, lines.Count); - throw new ArgumentOutOfRangeException(nameof(StartingIndex), $"Starting index {StartingIndex} is out of range for document with {lines.Count} lines"); + ) { + if (this.StartingIndex < 0 || this.StartingIndex >= lines.Count) { + throw new ArgumentOutOfRangeException(nameof(lines), $"Starting index {this.StartingIndex} is out of range for document with {lines.Count} lines"); } - if (EndingIndex < 0 || EndingIndex >= lines.Count) - { - Logger.Error("Ending index {0} is out of range for document with {1} lines", EndingIndex, lines.Count); - throw new ArgumentOutOfRangeException(nameof(EndingIndex), $"Ending index {EndingIndex} is out of range for document with {lines.Count} lines"); + if (this.EndingIndex < 0 || this.EndingIndex >= lines.Count) { + throw new ArgumentOutOfRangeException(nameof(lines), $"Ending index {this.EndingIndex} is out of range for document with {lines.Count} lines"); } - if (StartingIndex > EndingIndex) - { - Logger.Error("Starting index {0} is greater than ending index {1}", StartingIndex, EndingIndex); - throw new ArgumentOutOfRangeException(nameof(StartingIndex), $"Starting index {StartingIndex} is greater than ending index {EndingIndex}"); + if (this.StartingIndex > this.EndingIndex) { + throw new ArgumentOutOfRangeException(nameof(lines), $"Starting index {this.StartingIndex} is greater than ending index {this.EndingIndex}"); } - if (StartingIndex == EndingIndex && StartingColumn > EndingColumn) - { - Logger.Error("Starting column {0} is greater than ending column {1} on the same line", StartingColumn, EndingColumn); - throw new ArgumentOutOfRangeException(nameof(StartingColumn), $"Starting column {StartingColumn} is greater than ending column {EndingColumn} on the same line"); + if (this.StartingIndex == this.EndingIndex && this.StartingColumn > this.EndingColumn) { + throw new ArgumentOutOfRangeException(nameof(lines), $"Starting column {this.StartingColumn} is greater than ending column {this.EndingColumn} on the same line"); } - var startingLine = lines[StartingIndex]; - if (startingLine.Length < StartingColumn) - { - Logger.Error("Starting column {0} is out of range for line with {1} characters", StartingColumn, startingLine.Length); - throw new ArgumentOutOfRangeException(nameof(StartingColumn), $"Starting column {StartingColumn} is out of range for line with {startingLine.Length} characters. Line: {startingLine}"); + var startingLine = lines[this.StartingIndex]; + if (startingLine.Length < this.StartingColumn) { + throw new ArgumentOutOfRangeException(nameof(lines), $"Starting column {this.StartingColumn} is out of range for line with {startingLine.Length} characters. Line: {startingLine}"); } - var endingLine = lines[EndingIndex]; - if (endingLine.Length < EndingColumn) - { - Logger.Error("Ending column {0} is out of range for line with {1} characters", EndingColumn, endingLine.Length); - throw new ArgumentOutOfRangeException(nameof(EndingColumn), $"Ending column {EndingColumn} is out of range for line with {endingLine.Length} characters. Line: {endingLine}"); + var endingLine = lines[this.EndingIndex]; + if (endingLine.Length < this.EndingColumn) { + throw new ArgumentOutOfRangeException(nameof(lines), $"Ending column {this.EndingColumn} is out of range for line with {endingLine.Length} characters. Line: {endingLine}"); } var offset = 0; - var firstLineBefore = startingLine[..StartingColumn]; - var lastLineAfter = endingLine[EndingColumn..]; + var firstLineBefore = startingLine[..this.StartingColumn]; + var lastLineAfter = endingLine[this.EndingColumn..]; - if (StartingIndex == EndingIndex) - { - lines.RemoveAt(StartingIndex); + if (this.StartingIndex == this.EndingIndex) { + lines.RemoveAt(this.StartingIndex); offset--; // Short circuit if the new content is empty, there will be no need to update the document. - if (string.IsNullOrEmpty(firstLineBefore) && string.IsNullOrEmpty(lastLineAfter) && content.Length == 0) - { + if (string.IsNullOrEmpty(firstLineBefore) && string.IsNullOrEmpty(lastLineAfter) && content.Length == 0) { return offset; } - } - else - { + } else { // Remove all lines in the span to get a clean slate. - for (int i = StartingIndex; i <= EndingIndex; i++) - { - lines.RemoveAt(StartingIndex); + for (var i = this.StartingIndex; i <= this.EndingIndex; i++) { + lines.RemoveAt(this.StartingIndex); offset--; } } - if (options.HasFlag(UpdateOptions.InsertInline)) - { + if (options.HasFlag(UpdateOptions.InsertInline)) { var lineContent = new StringBuilder(); - if (!string.IsNullOrEmpty(firstLineBefore)) - { + if (!string.IsNullOrEmpty(firstLineBefore)) { lineContent.Append(firstLineBefore); } - if (content.Length > 1) - { + if (content.Length > 1) { lineContent.Append(content[0]); - lines.InsertRange(StartingIndex, content.Skip(1)); + lines.InsertRange(this.StartingIndex, content.Skip(1)); offset += content.Length - 1; - } - else - { + } else { lineContent.Append(content[0]); } - if (!string.IsNullOrEmpty(lastLineAfter)) - { - if (StartingIndex != EndingIndex || content.Length > 1) - { - lines[EndingIndex + offset] += lastLineAfter; - } - else - { + if (!string.IsNullOrEmpty(lastLineAfter)) { + if (this.StartingIndex != this.EndingIndex || content.Length > 1) { + lines[this.EndingIndex + offset] += lastLineAfter; + } else { lineContent.Append(lastLineAfter); } } - lines.Insert(StartingIndex, lineContent.ToString()); + lines.Insert(this.StartingIndex, lineContent.ToString()); offset++; - } - else - { + } else { var insertingAfterStartingIndex = false; - if (!string.IsNullOrEmpty(firstLineBefore)) - { - lines.Insert(StartingIndex, firstLineBefore); + if (!string.IsNullOrEmpty(firstLineBefore)) { + lines.Insert(this.StartingIndex, firstLineBefore); insertingAfterStartingIndex = true; offset++; } - if (content.Length > 0) - { - lines.InsertRange(StartingIndex + (insertingAfterStartingIndex ? 1 : 0), content); + if (content.Length > 0) { + lines.InsertRange(this.StartingIndex + (insertingAfterStartingIndex ? 1 : 0), content); offset += content.Length; } - if (!string.IsNullOrEmpty(lastLineAfter)) - { - lines.Insert(EndingIndex + offset + 1, lastLineAfter); + if (!string.IsNullOrEmpty(lastLineAfter)) { + lines.Insert(this.EndingIndex + offset + 1, lastLineAfter); offset++; } } @@ -246,25 +200,20 @@ string[] content return offset; } - public int RemoveContent(ref List lines) - { - return SetContent(ref lines, UpdateOptions.None, []); - } + public int RemoveContent(ref List lines) => this.SetContent(ref lines, UpdateOptions.None, []); - public override bool Equals(object? obj) - { - if (obj is TextSpan span) - { - return span.StartingIndex == StartingIndex && - span.StartingColumn == StartingColumn && - span.EndingIndex == EndingIndex && - span.EndingColumn == EndingColumn; + public override bool Equals(object? obj) { + if (obj is TextSpan span) { + return span.StartingIndex == this.StartingIndex && + span.StartingColumn == this.StartingColumn && + span.EndingIndex == this.EndingIndex && + span.EndingColumn == this.EndingColumn; } return false; } - public override int GetHashCode() => HashCode.Combine(StartingIndex, StartingColumn, EndingIndex, EndingColumn); + public override int GetHashCode() => HashCode.Combine(this.StartingIndex, this.StartingColumn, this.EndingIndex, this.EndingColumn); - public override string ToString() => $"({StartingIndex}, {StartingColumn}) - ({EndingIndex}, {EndingColumn})"; + public override string ToString() => $"({this.StartingIndex}, {this.StartingColumn}) - ({this.EndingIndex}, {this.EndingColumn})"; } diff --git a/src/Compiler/Text/Updater.cs b/src/Compiler/Text/Updater.cs index 67c1aed9..4ba7466f 100644 --- a/src/Compiler/Text/Updater.cs +++ b/src/Compiler/Text/Updater.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Diagnostics.CodeAnalysis; using Compiler.Text.Updater; @@ -5,13 +8,11 @@ namespace Compiler.Text; public record SpanUpdateInfo( TextSpan TextSpan, - int Offset) -{ - public override string ToString() => $"{nameof(PatternUpdater)}({TextSpan} +- {Offset})"; + int Offset) { + public override string ToString() => $"{nameof(PatternUpdater)}({this.TextSpan} +- {this.Offset})"; } -public abstract class TextSpanUpdater(uint priority = 50) -{ +public abstract class TextSpanUpdater(uint priority = 50) { public readonly uint Priority = priority; /// diff --git a/src/Compiler/Text/Updater/AstUpdater.cs b/src/Compiler/Text/Updater/AstUpdater.cs index 023c1687..f3bde33f 100644 --- a/src/Compiler/Text/Updater/AstUpdater.cs +++ b/src/Compiler/Text/Updater/AstUpdater.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Management.Automation.Language; namespace Compiler.Text.Updater; @@ -6,21 +9,16 @@ public class AstUpdater( uint priority, Func astPredicate, Func updater, - UpdateOptions options) : TextSpanUpdater(priority) -{ - public override SpanUpdateInfo[] Apply(ref List lines) - { var ast = AstHelper.GetAstReportingErrors(string.Join('\n', lines), "AstUpdater", []); + UpdateOptions options) : TextSpanUpdater(priority) { + public override SpanUpdateInfo[] Apply(ref List lines) { if (ast == null || string.IsNullOrWhiteSpace(ast.Extent.Text)) return []; IEnumerable nodesToUpdate; - if (options.HasFlag(UpdateOptions.MatchEntireDocument)) - { + if (options.HasFlag(UpdateOptions.MatchEntireDocument)) { nodesToUpdate = ast.FindAll(astPredicate, true); if (!nodesToUpdate.Any()) return []; - } - else - { + } else { var node = ast.Find(astPredicate, true); if (node == null) return []; nodesToUpdate = [node]; @@ -28,8 +26,7 @@ public override SpanUpdateInfo[] Apply(ref List lines) var offset = 0; var updateSpans = new List(); - foreach (var node in nodesToUpdate) - { + foreach (var node in nodesToUpdate) { var thisOffset = 0; var extent = node.Extent; var span = new TextSpan( @@ -44,9 +41,7 @@ public override SpanUpdateInfo[] Apply(ref List lines) ArgumentNullException.ThrowIfNull(newContent); // Remove the entire line if the replacement is empty and the match is the entire line. - if (newContent == null && span.StartingColumn == 0 && span.EndingColumn == lines[span.StartingIndex].Length) - { thisOffset += span.RemoveContent(ref lines); } - else { thisOffset += span.SetContent(ref lines, options, newContent!); } + if (newContent == null && span.StartingColumn == 0 && span.EndingColumn == lines[span.StartingIndex].Length) { thisOffset += span.RemoveContent(ref lines); } else { thisOffset += span.SetContent(ref lines, options, newContent!); } updateSpans.Add(new SpanUpdateInfo(span, thisOffset)); offset += thisOffset; diff --git a/src/Compiler/Text/Updater/Built/HereString.cs b/src/Compiler/Text/Updater/Built/HereString.cs index 213c042e..a754135e 100644 --- a/src/Compiler/Text/Updater/Built/HereString.cs +++ b/src/Compiler/Text/Updater/Built/HereString.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; using System.Management.Automation.Language; @@ -9,16 +12,13 @@ public partial class HereStringUpdater() : AstUpdater( static ast => ast is StringConstantExpressionAst stringConstantAst && stringConstantAst.StringConstantType is StringConstantType.SingleQuotedHereString or StringConstantType.DoubleQuotedHereString, static hereString => InternalApply(hereString), UpdateOptions.InsertInline -) -{ +) { [Pure] - public static string[] InternalApply([NotNull] Ast ast) - { + public static string[] InternalApply([NotNull] Ast ast) { ArgumentNullException.ThrowIfNull(ast); if (ast is not StringConstantExpressionAst stringConstant) return []; - var linesAfterMaybeUpdate = stringConstant.StringConstantType switch - { + var linesAfterMaybeUpdate = stringConstant.StringConstantType switch { StringConstantType.SingleQuotedHereString => UpdateTerminators(stringConstant), StringConstantType.DoubleQuotedHereString => stringConstant.Extent.Text.Split('\n'), // This should never happen, but if it does, throw an exception. @@ -41,15 +41,12 @@ public static string[] InternalApply([NotNull] Ast ast) /// An array of strings with the indentation removed. /// [Pure] - internal static string[] UpdateIndentation([NotNull] IEnumerable lines) - { + internal static string[] UpdateIndentation([NotNull] IEnumerable lines) { // Get the multiline indent level from the last line of the string. // This is used so we don't remove any whitespace that is part of the actual string formatting. var indentLevel = lines.Last().TakeWhile(char.IsWhiteSpace).Count(); - var updatedLines = lines.Select((line, index) => - { - if (index < 1 || string.IsNullOrWhiteSpace(line)) - { + var updatedLines = lines.Select((line, index) => { + if (index < 1 || string.IsNullOrWhiteSpace(line)) { return line; } @@ -72,8 +69,7 @@ internal static string[] UpdateIndentation([NotNull] IEnumerable lines) /// A string with the same content as the AST, but with double quoted terminators. /// [Pure] - internal static string[] UpdateTerminators([NotNull] StringConstantExpressionAst stringConstant) - { + internal static string[] UpdateTerminators([NotNull] StringConstantExpressionAst stringConstant) { ArgumentNullException.ThrowIfNull(stringConstant); return ["@\"", stringConstant.Value, "\"@"]; diff --git a/src/Compiler/Text/Updater/ExactUpdater.cs b/src/Compiler/Text/Updater/ExactUpdater.cs index 94839d0b..36f74095 100644 --- a/src/Compiler/Text/Updater/ExactUpdater.cs +++ b/src/Compiler/Text/Updater/ExactUpdater.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Diagnostics.CodeAnalysis; using NLog; @@ -11,94 +14,81 @@ public class ExactUpdater( int endingColumn, UpdateOptions options, Func updater -) : TextSpanUpdater(priority) -{ +) : TextSpanUpdater(priority) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public Func Updater = updater; public TextSpan Span { get; } = new TextSpan(startingIndex, startingColumn, endingIndex, endingColumn); - override public SpanUpdateInfo[] Apply([NotNull] ref List lines) - { + public override SpanUpdateInfo[] Apply([NotNull] ref List lines) { ArgumentNullException.ThrowIfNull(lines); - if (Span.StartingIndex < 0 || Span.EndingIndex >= lines.Count) - { + if (this.Span.StartingIndex < 0 || this.Span.EndingIndex >= lines.Count) { return []; } - if (Span.StartingIndex > Span.EndingIndex) - { - Logger.Error($"Starting index must be less than ending index, got {Span.StartingIndex} and {Span.EndingIndex}."); + if (this.Span.StartingIndex > this.Span.EndingIndex) { + Logger.Error($"Starting index must be less than ending index, got {this.Span.StartingIndex} and {this.Span.EndingIndex}."); return []; } - if (Span.StartingIndex == Span.EndingIndex && Span.StartingColumn > Span.EndingColumn) - { - Logger.Error($"Starting column must be less than ending column, got {Span.StartingColumn} and {Span.EndingColumn}."); + if (this.Span.StartingIndex == this.Span.EndingIndex && this.Span.StartingColumn > this.Span.EndingColumn) { + Logger.Error($"Starting column must be less than ending column, got {this.Span.StartingColumn} and {this.Span.EndingColumn}."); return []; } - switch (lines) - { + switch (lines) { case var l when l.Count == 0: Logger.Error("Document lines must not be null."); return []; - case var l when l.Count <= Span.StartingIndex: - Logger.Error($"Starting index must be less than the number of lines, got index {Span.StartingIndex} for length {l.Count}."); + case var l when l.Count <= this.Span.StartingIndex: + Logger.Error($"Starting index must be less than the number of lines, got index {this.Span.StartingIndex} for length {l.Count}."); return []; - case var l when l.Count <= Span.EndingIndex: - Logger.Error($"Ending index must be less than the number of lines, got index {Span.EndingIndex} for length {l.Count}."); + case var l when l.Count <= this.Span.EndingIndex: + Logger.Error($"Ending index must be less than the number of lines, got index {this.Span.EndingIndex} for length {l.Count}."); return []; } - var startingLine = lines[Span.StartingIndex]; - var endingLine = lines[Span.EndingIndex]; - switch ((startingLine, endingLine)) - { - case var (start, _) when Span.StartingColumn > start.Length: - Logger.Error($"Starting column must be less than the length of the line, got index {Span.StartingColumn} for length {start.Length}."); + var startingLine = lines[this.Span.StartingIndex]; + var endingLine = lines[this.Span.EndingIndex]; + switch ((startingLine, endingLine)) { + case var (start, _) when this.Span.StartingColumn > start.Length: + Logger.Error($"Starting column must be less than the length of the line, got index {this.Span.StartingColumn} for length {start.Length}."); return []; - case var (_, end) when Span.EndingColumn > end.Length: - Logger.Error($"Ending column must be less than the length of the line, got index {Span.EndingColumn} for length {end.Length}."); + case var (_, end) when this.Span.EndingColumn > end.Length: + Logger.Error($"Ending column must be less than the length of the line, got index {this.Span.EndingColumn} for length {end.Length}."); return []; - case var _ when Span.StartingIndex == Span.EndingIndex && Span.StartingColumn > Span.EndingColumn: - Logger.Error($"Starting column must be less than ending column, got index {Span.StartingColumn} for length {Span.EndingColumn}."); + case var _ when this.Span.StartingIndex == this.Span.EndingIndex && this.Span.StartingColumn > this.Span.EndingColumn: + Logger.Error($"Starting column must be less than ending column, got index {this.Span.StartingColumn} for length {this.Span.EndingColumn}."); return []; } string[] newLines; int offset; - if (Span.StartingIndex == Span.EndingIndex) - { - var updatingLine = lines[Span.StartingIndex][Span.StartingColumn..Span.EndingColumn]; - newLines = Updater([updatingLine]); - offset = Span.SetContent(ref lines, options, newLines); - } - else - { - var updatingLines = lines.Skip(Span.StartingIndex).Take(Span.EndingIndex - Span.StartingIndex + 1).ToArray(); + if (this.Span.StartingIndex == this.Span.EndingIndex) { + var updatingLine = lines[this.Span.StartingIndex][this.Span.StartingColumn..this.Span.EndingColumn]; + newLines = this.Updater([updatingLine]); + offset = this.Span.SetContent(ref lines, options, newLines); + } else { + var updatingLines = lines.Skip(this.Span.StartingIndex).Take(this.Span.EndingIndex - this.Span.StartingIndex + 1).ToArray(); // Trim the starting and ending lines to the correct columns. - updatingLines[0] = lines[Span.StartingIndex][Span.StartingColumn..]; - updatingLines[^1] = lines[Span.EndingIndex][..Span.EndingColumn]; + updatingLines[0] = lines[this.Span.StartingIndex][this.Span.StartingColumn..]; + updatingLines[^1] = lines[this.Span.EndingIndex][..this.Span.EndingColumn]; - newLines = Updater(updatingLines); - offset = Span.SetContent(ref lines, options, newLines); + newLines = this.Updater(updatingLines); + offset = this.Span.SetContent(ref lines, options, newLines); } - return [new SpanUpdateInfo(Span, offset)]; + return [new SpanUpdateInfo(this.Span, offset)]; } - override public void PushByUpdate(SpanUpdateInfo updateInfo) - { - if (Span.StartingIndex >= updateInfo.TextSpan.StartingIndex) - { - Span.StartingIndex += updateInfo.Offset; + public override void PushByUpdate(SpanUpdateInfo updateInfo) { + if (this.Span.StartingIndex >= updateInfo.TextSpan.StartingIndex) { + this.Span.StartingIndex += updateInfo.Offset; } - if (Span.EndingIndex >= updateInfo.TextSpan.StartingIndex) - { - Span.EndingIndex += updateInfo.Offset; + if (this.Span.EndingIndex >= updateInfo.TextSpan.StartingIndex) { + this.Span.EndingIndex += updateInfo.Offset; } } diff --git a/src/Compiler/Text/Updater/IndentUpdater.cs b/src/Compiler/Text/Updater/IndentUpdater.cs index c902fd93..6c2a6c4a 100644 --- a/src/Compiler/Text/Updater/IndentUpdater.cs +++ b/src/Compiler/Text/Updater/IndentUpdater.cs @@ -1,23 +1,22 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + namespace Compiler.Text.Updater; -public class IndentUpdater(int indentBy) : TextSpanUpdater(70) -{ +public class IndentUpdater(int indentBy) : TextSpanUpdater(70) { private readonly int IndentBy = indentBy; - public override SpanUpdateInfo[] Apply(ref List lines) - { + public override SpanUpdateInfo[] Apply(ref List lines) { var updateSpans = new List(); - var indentString = new string(' ', IndentBy); - for (var i = 0; i < lines.Count; i++) - { + var indentString = new string(' ', this.IndentBy); + for (var i = 0; i < lines.Count; i++) { // Don't indent empty lines. - if (lines[i].Length == 0) - { + if (lines[i].Length == 0) { continue; } lines[i] = $"{indentString}{lines[i]}"; - updateSpans.Add(new SpanUpdateInfo(new(i, i, 0, 0), IndentBy)); + updateSpans.Add(new SpanUpdateInfo(new(i, i, 0, 0), this.IndentBy)); } return [.. updateSpans]; diff --git a/src/Compiler/Text/Updater/PatternUpdater.cs b/src/Compiler/Text/Updater/PatternUpdater.cs index 3bd29b99..cf2615d7 100644 --- a/src/Compiler/Text/Updater/PatternUpdater.cs +++ b/src/Compiler/Text/Updater/PatternUpdater.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Text; using System.Text.RegularExpressions; using CommandLine; @@ -11,25 +14,21 @@ public class PatternUpdater( Regex endingPattern, UpdateOptions options, Func updater -) : TextSpanUpdater(priority) -{ +) : TextSpanUpdater(priority) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public Func Updater { get; } = updater; public Regex StartingPattern { get; } = startingPattern; public Regex EndingPattern { get; } = endingPattern; - override public SpanUpdateInfo[] Apply(ref List lines) - { + public override SpanUpdateInfo[] Apply(ref List lines) { var spanUpdateInfo = new List(); var skipRanges = new HashSet(); var offset = 0; - while (true) - { - var (startIndex, endIndex) = FindStartToEndBlock([.. lines], offset, skipRanges); - if (startIndex == -1 || endIndex == -1) - { + while (true) { + var (startIndex, endIndex) = this.FindStartToEndBlock([.. lines], offset, skipRanges); + if (startIndex == -1 || endIndex == -1) { break; } @@ -41,7 +40,7 @@ override public SpanUpdateInfo[] Apply(ref List lines) ); var updatingLines = lines[startIndex..(endIndex + 1)].ToArray(); - var newLines = Updater(updatingLines); + var newLines = this.Updater(updatingLines); var thisOffset = span.SetContent(ref lines, options, newLines); offset += thisOffset; @@ -56,41 +55,33 @@ override public SpanUpdateInfo[] Apply(ref List lines) string[] lines, int offset, HashSet skipRanges - ) - { - if (lines == null || lines.Length == 0) - { + ) { + if (lines == null || lines.Length == 0) { return (-1, -1); } var offsetSkipRanges = new HashSet>(); - foreach (var range in skipRanges) - { + foreach (var range in skipRanges) { var clampedStart = Math.Clamp(range.Start.Value + offset, 0, lines.Length - 1); var clampedEnd = Math.Clamp(range.End.Value + offset, 0, lines.Length - 1); - if (clampedStart < clampedEnd) - { + if (clampedStart < clampedEnd) { offsetSkipRanges.Add(Enumerable.Range(clampedStart, clampedEnd - clampedStart + 1)); } } - int startIndex = -1; - int endIndex = -1; - int openLevel = 0; + var startIndex = -1; + var endIndex = -1; + var openLevel = 0; - for (int i = 0; i < lines.Length; i++) - { + for (var i = 0; i < lines.Length; i++) { var clonedLine = lines[i].Clone().Cast()!; - if (offsetSkipRanges.Any(range => range.Contains(i))) - { + if (offsetSkipRanges.Any(range => range.Contains(i))) { continue; } - var openingMatch = StartingPattern.Matches(clonedLine); - if (openingMatch.Count > 0) - { - if (openLevel == 0) - { + var openingMatch = this.StartingPattern.Matches(clonedLine); + if (openingMatch.Count > 0) { + if (openLevel == 0) { startIndex = i; } @@ -99,11 +90,9 @@ HashSet skipRanges // If we found at least one startPattern we will want to remove them from the string, // This is so that the endingPattern does not match the same elements, and we can find the correct end. - if (openingMatch.Count > 0) - { + if (openingMatch.Count > 0) { var lineOffset = 0; - foreach (Match match in openingMatch) - { + foreach (Match match in openingMatch) { clonedLine = new StringBuilder() .Append(clonedLine[..(match.Index + lineOffset)]) .Append(clonedLine[(match.Index + lineOffset + match.Length)..]) @@ -112,15 +101,12 @@ HashSet skipRanges } } - if (openLevel > 0) - { - var closingMatch = EndingPattern.Matches(clonedLine); - if (closingMatch.Count > 0) - { + if (openLevel > 0) { + var closingMatch = this.EndingPattern.Matches(clonedLine); + if (closingMatch.Count > 0) { openLevel -= closingMatch.Count; - if (openLevel == 0) - { + if (openLevel == 0) { endIndex = i; break; } @@ -131,5 +117,5 @@ HashSet skipRanges return (startIndex, endIndex); } - public override string ToString() => $"{nameof(PatternUpdater)}({StartingPattern} -> {EndingPattern})"; + public override string ToString() => $"{nameof(PatternUpdater)}({this.StartingPattern} -> {this.EndingPattern})"; } diff --git a/src/Compiler/Text/Updater/RegexUpdater.cs b/src/Compiler/Text/Updater/RegexUpdater.cs index 79849db7..144e31d1 100644 --- a/src/Compiler/Text/Updater/RegexUpdater.cs +++ b/src/Compiler/Text/Updater/RegexUpdater.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Text.RegularExpressions; using NLog; @@ -8,21 +11,15 @@ public class RegexUpdater( Regex pattern, UpdateOptions options, Func updater -) : TextSpanUpdater(priority) -{ +) : TextSpanUpdater(priority) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); public readonly Func Updater = updater; - public Regex Pattern - { - get - { - if (options.HasFlag(UpdateOptions.MatchEntireDocument)) - { + public Regex Pattern { + get { + if (options.HasFlag(UpdateOptions.MatchEntireDocument)) { return new Regex(pattern.ToString(), pattern.Options | RegexOptions.Multiline | RegexOptions.Singleline); - } - else - { + } else { return new Regex(pattern.ToString(), pattern.Options | RegexOptions.Multiline); } } @@ -33,21 +30,18 @@ public Regex Pattern /// /// The text document to apply the pattern to. /// An array of objects representing the updates made to the document. - override public SpanUpdateInfo[] Apply(ref List lines) - { + public override SpanUpdateInfo[] Apply(ref List lines) { var spanUpdateInfo = new List(); var offset = 0; var multilinedContent = string.Join('\n', lines); - var matches = Pattern.Matches(multilinedContent); + var matches = this.Pattern.Matches(multilinedContent); - if (matches.Count == 0) - { + if (matches.Count == 0) { return []; } - foreach (Match match in matches) - { + foreach (Match match in matches) { var thisOffset = 0; var multilineEndingIndex = match.Index + match.Length; var contentBeforeThisLine = multilinedContent[..match.Index].LastIndexOf(value: '\n'); @@ -58,14 +52,9 @@ override public SpanUpdateInfo[] Apply(ref List lines) int startingColumn; int endingColumn; startingColumn = match.Index - (contentBeforeThisLine + 1); - if (isMultiLine) - { - endingColumn = multilineEndingIndex - (multilinedContent[..multilineEndingIndex].LastIndexOf('\n') + 1); - } - else - { - endingColumn = startingColumn + match.Length; - } + endingColumn = isMultiLine + ? multilineEndingIndex - (multilinedContent[..multilineEndingIndex].LastIndexOf('\n') + 1) + : startingColumn + match.Length; var span = new TextSpan( startingLineIndex, @@ -74,19 +63,15 @@ override public SpanUpdateInfo[] Apply(ref List lines) endingColumn ); - var newContent = Updater(match); + var newContent = this.Updater(match); // Remove the entire line if the replacement is empty and the match is the entire line. - if (newContent == null && startingColumn == 0 && match.Length == lines[startingLineIndex].Length) - { + if (newContent == null && startingColumn == 0 && match.Length == lines[startingLineIndex].Length) { thisOffset += span.RemoveContent(ref lines); - } - else - { + } else { var newLines = newContent == null ? [] : isMultiLine ? newContent.Split('\n') : [newContent]; thisOffset += span.SetContent(ref lines, options, newLines); - if (isMultiLine) - { + if (isMultiLine) { thisOffset += newLines.Length - 1; } } @@ -98,5 +83,5 @@ override public SpanUpdateInfo[] Apply(ref List lines) return [.. spanUpdateInfo]; } - public override string ToString() => $"{nameof(RegexUpdater)}({Pattern})"; + public override string ToString() => $"{nameof(RegexUpdater)}({this.Pattern})"; } From d8718e84a5108c063c4797b0994ee3b7cf344f7c Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 30 Aug 2024 16:45:02 +1000 Subject: [PATCH 131/341] feat(Compiler): Big refactor, cleanup and a few fixes. * Implement Async module build and dependency system with caching between root scripts. * Fix Style violations * Added ability to enrich errors without needing to pass the ModuleSpec to every method * Add CodeAnalysis Attributes to alot of stuff * Add some documentation (still pretty bad) * Move Ast creation out of modules and to the document * Replace usage of the base Exception class with more appropriate exceptions. * Update a good amount of methods to use Fin and Option instead of being able to throw an Exception. * Fix error when multiple remote modules tried to download at the same time * Insert empty param block with CmdletBinding attribute if there isn't one already --- src/Compiler/Analyser/Analyser.cs | 6 +- src/Compiler/Analyser/Issue.cs | 78 ++- src/Compiler/Analyser/Rules/Rule.cs | 2 +- src/Compiler/Analyser/Rules/RuleVisitor.cs | 13 +- .../Analyser/Rules/UseOfUndefinedFunction.cs | 7 +- src/Compiler/Analyser/Suppression.cs | 96 ++- src/Compiler/AstHelper.cs | 55 +- src/Compiler/Compiler.csproj | 11 +- src/Compiler/Errors.cs | 101 +++ src/Compiler/Module/Compiled/Compiled.cs | 23 +- src/Compiler/Module/Compiled/Local.cs | 14 +- src/Compiler/Module/Compiled/Remote.cs | 47 +- src/Compiler/Module/Compiled/Script.cs | 68 +- src/Compiler/Module/Resolvable/Local.cs | 129 ++-- src/Compiler/Module/Resolvable/Remote.cs | 150 ++--- src/Compiler/Module/Resolvable/Resolvable.cs | 396 ++++++++++-- src/Compiler/Module/Resolvable/Script.cs | 41 +- src/Compiler/Program.cs | 219 ++++--- src/Compiler/Requirements/ModuleSpec.cs | 25 +- src/Compiler/Requirements/Requirements.cs | 4 +- src/Compiler/Text/Document.cs | 75 +-- src/Compiler/Text/Span.cs | 115 +++- src/Compiler/Text/Updater.cs | 8 +- src/Compiler/Text/Updater/AstUpdater.cs | 84 +-- src/Compiler/Text/Updater/ExactUpdater.cs | 150 ++--- src/Compiler/Text/Updater/IndentUpdater.cs | 13 +- src/Compiler/Text/Updater/PatternUpdater.cs | 16 +- src/Compiler/Text/Updater/RegexUpdater.cs | 76 ++- src/Compiler/Utils.cs | 297 +++++++++ src/Compiler/packages.lock.json | 377 ++++++++++- tests/Compiler/AstHelpersTests.cs | 39 +- tests/Compiler/Compiler.Test.csproj | 5 +- tests/Compiler/Compiler.cs | 16 +- tests/Compiler/GlobalSuppressions.cs | 12 + tests/Compiler/Module/Compiled/Compiled.cs | 33 +- tests/Compiler/Module/Resolvable/Local.cs | 17 +- tests/Compiler/Module/Resolvable/Script.cs | 44 +- tests/Compiler/Requirements/ModuleSpec.cs | 49 +- tests/Compiler/Requirements/PSEdition.cs | 27 +- tests/Compiler/Requirements/PSVersion.cs | 33 +- tests/Compiler/Requirements/Requirements.cs | 172 ++--- tests/Compiler/Requirements/RunAsAdmin.cs | 20 +- tests/Compiler/Text/Document.cs | 11 +- tests/Compiler/Text/Span.cs | 398 ++++++------ tests/Compiler/Text/Updater.cs | 180 ------ tests/Compiler/Text/Updater/Exact.cs | 96 +++ tests/Compiler/Text/Updater/Pattern.cs | 60 ++ tests/Compiler/Text/Updater/Regex.cs | 72 +++ tests/Compiler/packages.lock.json | 603 ++++++++++++++++++ 49 files changed, 3234 insertions(+), 1349 deletions(-) create mode 100644 src/Compiler/Errors.cs create mode 100644 src/Compiler/Utils.cs create mode 100644 tests/Compiler/GlobalSuppressions.cs delete mode 100644 tests/Compiler/Text/Updater.cs create mode 100644 tests/Compiler/Text/Updater/Exact.cs create mode 100644 tests/Compiler/Text/Updater/Pattern.cs create mode 100644 tests/Compiler/Text/Updater/Regex.cs create mode 100644 tests/Compiler/packages.lock.json diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index a926b585..2ed92e42 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -31,13 +31,13 @@ public static List Analyse(CompiledLocalModule module, IEnumerable Module = default +) : Error() { + public override bool IsExceptional { get; } = Severity == IssueSeverity.Error; + + public override bool IsExpected { get; } = Severity == IssueSeverity.Warning; + + public override string Message { get; } = Message; + + public override string ToString() => AstHelper.GetPrettyAstError( + this.Extent, + this.Parent, + Some(this.Message), + this.Module.Map(mod => mod is PathedModuleSpec pathed ? pathed.FullPath : mod.Name) + ); + + [Pure] + [return: NotNull] + public override ErrorException ToErrorException() => new WrappedErrorExceptionalException(this); -public sealed class IssueException( - string message, - IScriptExtent extent, - Ast parent, - Exception? inner) : Exception(message, inner) -{ - public readonly Issue Issue = new(IssueSeverity.Error, message, extent, parent); - - public IssueException( - string message, - IScriptExtent extent, - Ast parent) : this(message, extent, parent, null) { } + [Pure] + [return: NotNull] + public Issue Enrich([NotNull] ModuleSpec module) => this with { + Module = Some(module) + }; + + [Pure] + [return: NotNull] + public static Issue Error( + [NotNull] string message, + [NotNull] IScriptExtent extent, + [NotNull] Ast parent, + [NotNull] Option module = default) => new(IssueSeverity.Error, message, extent, parent, module); + + [Pure] + [return: NotNull] + public static Issue Warning( + [NotNull] string message, + [NotNull] IScriptExtent extent, + [NotNull] Ast parent, + [NotNull] Option module = default) => new(IssueSeverity.Warning, message, extent, parent, module); + + public override bool Is() => false; } -public enum IssueSeverity -{ +public enum IssueSeverity { Error, Warning } + diff --git a/src/Compiler/Analyser/Rules/Rule.cs b/src/Compiler/Analyser/Rules/Rule.cs index 7b27bedc..ac6b0dfe 100644 --- a/src/Compiler/Analyser/Rules/Rule.cs +++ b/src/Compiler/Analyser/Rules/Rule.cs @@ -23,6 +23,6 @@ IEnumerable supressions public abstract IEnumerable Analyse( Ast node, - IEnumerable imports + IEnumerable importedModules ); } diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs index 2ee27f6b..b214d3a8 100644 --- a/src/Compiler/Analyser/Rules/RuleVisitor.cs +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -7,18 +7,23 @@ namespace Compiler.Analyser.Rules; public sealed class RuleVisitor( + Compiled module, IEnumerable rules, IEnumerable imports) : AstVisitor { - private readonly IEnumerable _rules = rules; - private readonly IEnumerable _imports = imports; + + private readonly Compiled Module = module; + private readonly IEnumerable Rules = rules; + private readonly IEnumerable Imports = imports; public readonly List Issues = []; public override AstVisitAction DefaultVisit(Ast ast) { var supressions = GetSupressions(ast); - foreach (var rule in this._rules) { + foreach (var rule in this.Rules) { if (!rule.ShouldProcess(ast, supressions)) continue; - this.Issues.AddRange(rule.Analyse(ast, this._imports)); + foreach (var issue in rule.Analyse(ast, this.Imports)) { + this.Issues.Add(issue.Enrich(this.Module.ModuleSpec)); + } } return AstVisitAction.Continue; diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index 2cce932f..05a033eb 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -40,15 +40,14 @@ public override bool ShouldProcess( public override IEnumerable Analyse( Ast node, - IEnumerable imports) { + IEnumerable importedModules) { var commandAst = (CommandAst)node; var callName = SanatiseName(commandAst.GetCommandName()); if (BuiltinsFunctions.Contains(callName)) yield break; if (AstHelper.FindAvailableFunctions(AstHelper.FindRoot(node), false).Select(definition => SanatiseName(definition.Name)).Any(name => name == callName)) yield break; - if (imports.Any(module => module.GetExportedFunctions().Contains(callName))) yield break; + if (importedModules.Any(module => module.GetExportedFunctions().Contains(callName))) yield break; - yield return new Issue( - IssueSeverity.Warning, + yield return Issue.Warning( $"Undefined function '{callName}'", commandAst.CommandElements[0].Extent, commandAst diff --git a/src/Compiler/Analyser/Suppression.cs b/src/Compiler/Analyser/Suppression.cs index 27ad01db..c0d05d12 100644 --- a/src/Compiler/Analyser/Suppression.cs +++ b/src/Compiler/Analyser/Suppression.cs @@ -41,62 +41,50 @@ public static IEnumerable FromAttributes(IEnumerable< object? data = null; string? justification = null; - if (attrAst != null) - { - var positionalArguments = attrAst.PositionalArguments; - var namedArguments = attrAst.NamedArguments; - - int lastPositionalArgumentsOffset = -1; - - if (positionalArguments != null && positionalArguments.Count != 0) - { - int count = positionalArguments.Count; - lastPositionalArgumentsOffset = positionalArguments[^1].Extent.StartOffset; - switch (count) - { - case 3: - if (positionalArguments[2] is not StringConstantExpressionAst justificationAst) throw new ArgumentException("Justification must be a string constant"); - justification = justificationAst.Value; - goto case 2; - case 2: - data = positionalArguments[1].SafeGetValue(); - goto case 1; - case 1: - if (positionalArguments[0] is not StringConstantExpressionAst checkTypeAst) throw new ArgumentException("CheckType must be a string constant"); - checkType = checkTypeAst.Value; - goto default; - default: - break; - } + var positionalArguments = attrAst.PositionalArguments; + var namedArguments = attrAst.NamedArguments; + + var lastPositionalArgumentsOffset = -1; + + if (positionalArguments != null && positionalArguments.Count != 0) { + var count = positionalArguments.Count; + lastPositionalArgumentsOffset = positionalArguments[^1].Extent.StartOffset; + switch (count) { + case 3: + if (positionalArguments[2] is not StringConstantExpressionAst justificationAst) throw new ArgumentException("Justification must be a string constant"); + justification = justificationAst.Value; + goto case 2; + case 2: + data = positionalArguments[1].SafeGetValue(); + goto case 1; + case 1: + if (positionalArguments[0] is not StringConstantExpressionAst checkTypeAst) throw new ArgumentException("CheckType must be a string constant"); + checkType = checkTypeAst.Value; + goto default; + default: + break; } + } + + if (namedArguments != null && namedArguments.Count != 0) { + foreach (var name in namedArguments) { + if (name.Extent.StartOffset < lastPositionalArgumentsOffset) throw new ArgumentException("Named arguments must come after positional arguments"); + + var argumentName = name.ArgumentName; + if (argumentName.Equals("checkType", StringComparison.OrdinalIgnoreCase)) { + if (!string.IsNullOrWhiteSpace(checkType)) throw new ArgumentException("Named and positional arguments conflict for checkType"); + + if (name.Argument is not StringConstantExpressionAst checkTypeAst) throw new ArgumentException("CheckType must be a string constant"); + checkType = checkTypeAst.Value; + } else if (argumentName.Equals("data", StringComparison.OrdinalIgnoreCase)) { + if (data is not null) throw new ArgumentException("Named and positional arguments conflict for data"); + + data = name.Argument.SafeGetValue(); + } else if (argumentName.Equals("justification", StringComparison.OrdinalIgnoreCase)) { + if (!string.IsNullOrWhiteSpace(justification)) throw new ArgumentException("Named and positional arguments conflict for justification"); - if (namedArguments != null && namedArguments.Count != 0) - { - foreach (var name in namedArguments) - { - if (name.Extent.StartOffset < lastPositionalArgumentsOffset) throw new ArgumentException("Named arguments must come after positional arguments"); - - var argumentName = name.ArgumentName; - if (argumentName.Equals("checkType", StringComparison.OrdinalIgnoreCase)) - { - if (!string.IsNullOrWhiteSpace(checkType)) throw new ArgumentException("Named and positional arguments conflict for checkType"); - - if (name.Argument is not StringConstantExpressionAst checkTypeAst) throw new ArgumentException("CheckType must be a string constant"); - checkType = checkTypeAst.Value; - } - else if (argumentName.Equals("data", StringComparison.OrdinalIgnoreCase)) - { - if (data is not null) throw new ArgumentException("Named and positional arguments conflict for data"); - - data = name.Argument.SafeGetValue(); - } - else if (argumentName.Equals("justification", StringComparison.OrdinalIgnoreCase)) - { - if (!string.IsNullOrWhiteSpace(justification)) throw new ArgumentException("Named and positional arguments conflict for justification"); - - if (name.Argument is not StringConstantExpressionAst justificationAst) throw new ArgumentException("Justification must be a string constant"); - justification = justificationAst.Value; - } + if (name.Argument is not StringConstantExpressionAst justificationAst) throw new ArgumentException("Justification must be a string constant"); + justification = justificationAst.Value; } } } diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index ed4e73e0..3a84d47e 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -2,9 +2,12 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Diagnostics.CodeAnalysis; -using System.Management.Automation; +using System.Globalization; using System.Management.Automation.Language; using System.Text; +using Compiler.Analyser; +using LanguageExt; +using LanguageExt.UnsafeValueAccess; using NLog; using Pastel; @@ -35,7 +38,7 @@ public static Dictionary> FindDeclaredModules table.Add(key, value); } - if (!table.TryGetValue("ModuleName", out var moduleName)) throw new Exception("ModuleSpecification does not contain a 'ModuleName' key."); + if (!table.TryGetValue("ModuleName", out var moduleName)) throw new InvalidDataException("ModuleSpecification does not contain a 'ModuleName' key."); if (table.TryGetValue("Guid", out var guid)) table["Guid"] = Guid.Parse((string)guid); foreach (var versionKey in new[] { "ModuleVersion", "MaximumVersion", "RequiredVersion" }) { if (table.TryGetValue(versionKey, out var version)) table[versionKey] = Version.Parse((string)version); @@ -75,7 +78,8 @@ public static Dictionary> FindDeclaredModules .Cast() .ToList() .ForEach(usingStatement => { - if (usingStatement.Name is null) throw new Exception("UsingStatementAst does not contain a Name."); + // I don't think this is possible, but just in case. + if (usingStatement.Name is null) throw new InvalidDataException("UsingStatementAst does not contain a Name."); namespaces.Add((usingStatement.Name.Value, usingStatement)); }); @@ -136,41 +140,34 @@ public static List FindAvailableFunctions(Ast ast, bool o /// /// The AST of the content if it was successfully parsed. /// + [return: NotNull] + public static Fin GetAstReportingErrors( [NotNull] string astContent, - string? filePath, - [NotNull] IEnumerable ignoredErrors) - { - ArgumentNullException.ThrowIfNull(ignoredErrors, nameof(ignoredErrors)); + [NotNull] Option filePath, + [NotNull] IEnumerable ignoredErrors) { + ArgumentNullException.ThrowIfNull(astContent); + ArgumentNullException.ThrowIfNull(filePath); + ArgumentNullException.ThrowIfNull(ignoredErrors); - var ast = System.Management.Automation.Language.Parser.ParseInput(astContent, filePath, out _, out var parserErrors); + var ast = Parser.ParseInput(astContent, filePath.ValueUnsafe(), out _, out var parserErrors); parserErrors = [.. parserErrors.Where(error => !ignoredErrors.Contains(error.ErrorId))]; - { - foreach (var error in parserErrors) - { - Program.Issues.Add( - new Analyser.Issue( - Analyser.IssueSeverity.Error, - error.Message, - error.Extent, - ast - ) - ); - } - - throw new ParseException($"Failed to parse {filePath}, encountered {parserErrors.Length} errors."); if (parserErrors.Length != 0) { + var issues = parserErrors.Select(error => Issue.Error(error.Message, error.Extent, ast)); + var errors = Error.Many(issues.ToArray()); + return Fin.Fail(errors); } return ast; } - // TODO, ability to translate the virtual cleaned line numbers to the actual line numbers in the file. - public static void PrintPrettyAstError( + // TODO - ability to translate the virtual cleaned line numbers to the actual line numbers in the file. + [return: NotNull] + public static string GetPrettyAstError( [NotNull] IScriptExtent extent, [NotNull] Ast parentAst, - [NotNull] string message) - { + [NotNull] Option message, + [NotNull] Option realFilePath = default) { ArgumentNullException.ThrowIfNull(extent); ArgumentNullException.ThrowIfNull(parentAst); ArgumentNullException.ThrowIfNull(message); @@ -217,15 +214,15 @@ public static void PrintPrettyAstError( errorPointer = string.Concat([new(' ', leastWhitespaceBeforeText), new('~', squigleEndColumn - leastWhitespaceBeforeText)]); } - var fileName = parentAst.Extent.File is null ? "Unknown file" : parentAst.Extent.File; + var fileName = realFilePath.UnwrapOrElse(() => parentAst.Extent.File is null ? "Unknown file" : parentAst.Extent.File); return $""" {"File".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} {fileName.Pastel(ConsoleColor.Gray)} {"Line".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} {string.Join('\n', printableLines)} {firstColumnIndentString}{colouredPipe} {errorPointer.Pastel(ConsoleColor.DarkRed)} - {firstColumnIndentString}{colouredPipe} {message.Pastel(ConsoleColor.DarkRed)} - """); + {firstColumnIndentString}{colouredPipe} {message.UnwrapOrElse(static () => "Unknown Error").Pastel(ConsoleColor.DarkRed)} + """; } public static ParamBlockAst? FindClosestParamBlock(Ast ast) { diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 18fdd996..a7bb9b88 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -3,12 +3,10 @@ Program net8.0 - Exe - true - true - enable enable + Exe + win-x64;linux-x64 preview Properties @@ -54,6 +52,8 @@ 3 false true + true + true @@ -61,6 +61,9 @@ + + + diff --git a/src/Compiler/Errors.cs b/src/Compiler/Errors.cs new file mode 100644 index 00000000..31eecc0b --- /dev/null +++ b/src/Compiler/Errors.cs @@ -0,0 +1,101 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using Compiler.Requirements; +using LanguageExt; + +namespace Compiler; + +public record EnrichableExceptional( + string ActualMessage, + int Code, + [NotNull] Option Module = default +) : Exceptional( + ActualMessage, + Code +) { + public EnrichableExceptional Enrich(ModuleSpec module) => this with { + Module = Some(module) + }; + + public override string Message { + get { + var module = this.Module.Match( + some => $" in module {some.Name}", + () => "" + ); + + return $"{this.ActualMessage}{module}"; + } + } + + public override Exception ToException() => base.ToErrorException(); +}; + +public sealed record InvalidModulePathError : EnrichableExceptional { + private InvalidModulePathError(string message) : base(message, 620) { } + + public static InvalidModulePathError NotAFile(string notFilePath) => new($"The module path must be a file, received {notFilePath}"); + + public static InvalidModulePathError ParentNotADirectory(string parentPath) => new($"The parent path must be a directory, received {parentPath}"); + + public static InvalidModulePathError NotAnAbsolutePath(string providedPath) => new($"The parent path must be an absolute path, received {providedPath}"); +} + +public sealed class EnrichedException([NotNull] Exception exception, [NotNull] ModuleSpec module) : Exception { + public readonly Exception Exception = exception; + + public readonly ModuleSpec Module = module; + + public override string Message => $"{this.Exception.Message} in module {this.Module.Name}"; + + public override string StackTrace => this.Exception.StackTrace ?? ""; + + public override IDictionary Data => this.Exception.Data; + + public override bool Equals(object? obj) => this.Exception.Equals(obj); + + public override Exception GetBaseException() => this.Exception.GetBaseException(); + + public override int GetHashCode() => this.Exception.GetHashCode(); + + public override string ToString() => $"{this.Exception}\nIn module {this.Module.Name}"; +} + +public sealed record MultipleInstancesOfSingleRequirementError( + IEnumerable Instances +) : EnrichableExceptional( + $""" + Multiple instances of type {nameof(T)} were found in the resolved modules. + {string.Join(", ", Instances)} + """, + 621 +) where T : Requirement; + +public sealed record IncompatableRequirementsError( + IEnumerable ConflictingRequirements +) : EnrichableExceptional( + $""" + Some of the requirements are incompatible with each other. + {string.Join(", ", ConflictingRequirements)} + """, + 622 +); + +public static class ErrorUtils { + public static T Enrich( + this T error, + ModuleSpec module + ) where T : Error => error switch { + EnrichableExceptional enrichable => (enrichable.Enrich(module) as T)!, // Safety: The EnrichableExceptional return will always be a T. + ManyErrors errors => (new ManyErrors(errors.Errors.Select(error => error.Enrich(module))) as T)!, // Safety: T will always be ManyErrors. + _ => error + }; + + public static EnrichedException Enrich( + this Exception exception, + ModuleSpec module + ) => new(exception, module); // Safety: T will always be an Exception. +} diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 820271b4..3416e8c4 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -1,6 +1,7 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; using System.Security.Cryptography; using Compiler.Requirements; @@ -36,7 +37,7 @@ protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] var byteList = new List(hashableBytes); AddRequirementHashBytes(byteList, requirements); - this.ComputedHash = Convert.ToHexString(SHA1.HashData(byteList.ToArray())); + this.ComputedHash = Convert.ToHexString(SHA256.HashData(byteList.ToArray())); } @@ -79,6 +80,14 @@ protected Compiled GetRootParent() { return parent; } + /// + /// Finds all modules which are dependencies of this modules absolute parent. + /// + /// + /// An array of compiled modules. + /// + [Pure] + [return: NotNull] protected Compiled[] GetSiblings() { var rootParent = this.GetRootParent(); if (rootParent is not CompiledScript script) return []; @@ -86,7 +95,17 @@ protected Compiled[] GetSiblings() { return script.Graph.Vertices.Where(compiled => compiled != this).ToArray(); } - protected Compiled? FindSibling(ModuleSpec moduleSpec) { + /// + /// Finds a sibling of this module, if it exists. + /// + /// + /// The module spec of the sibling to find. + /// + /// + /// The sibling if it exists, otherwise null. + /// + [Pure] + protected Compiled? FindSibling([NotNull] ModuleSpec moduleSpec) { if (ReferenceEquals(moduleSpec, this.ModuleSpec)) return this; var siblings = this.GetSiblings(); diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index 2e0dcfcb..b3ec365b 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -2,10 +2,10 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; -using System.Management.Automation.Language; using System.Text; using Compiler.Requirements; using Compiler.Text; +using LanguageExt; namespace Compiler.Module.Compiled; @@ -18,16 +18,11 @@ public class CompiledLocalModule : Compiled { public readonly CompiledDocument Document; - public readonly ScriptBlockAst Ast; - - public CompiledLocalModule( + internal CompiledLocalModule( PathedModuleSpec moduleSpec, CompiledDocument document, RequirementGroup requirements - ) : base(moduleSpec, requirements, Encoding.UTF8.GetBytes(document.GetContent())) { - this.Document = document; - this.Ast = AstHelper.GetAstReportingErrors(string.Join('\n', this.Document.Lines), Some(moduleSpec.FullPath), ["ModuleNotFoundDuringParse"]).ThrowIfFail(); - } + ) : base(moduleSpec, requirements, Encoding.UTF8.GetBytes(document.GetContent())) => this.Document = document; public override string StringifyContent() => new StringBuilder() .AppendLine("<#ps1#> @'") @@ -45,5 +40,6 @@ RequirementGroup requirements .Append("'@;") .ToString(); - public override IEnumerable GetExportedFunctions() => AstHelper.FindAvailableFunctions(this.Ast, true).Select(function => function.Name); + public override IEnumerable GetExportedFunctions() => + AstHelper.FindAvailableFunctions(this.Document.Ast, true).Select(function => function.Name); } diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index fbc6c217..d97b8bfa 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -2,11 +2,13 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; +using System.Diagnostics.Contracts; using System.IO.Compression; using System.Management.Automation; using System.Management.Automation.Runspaces; using CommandLine; using Compiler.Requirements; +using LanguageExt; using NLog; namespace Compiler.Module.Compiled; @@ -33,7 +35,7 @@ MemoryStream memoryStream this.Version = manifest["ModuleVersion"] switch { string version => Version.Parse(version), null => new Version(0, 0, 1), - _ => throw new Exception($"ModuleVersion must be a string, but was {manifest["ModuleVersion"]?.GetType()}") + var other => throw new InvalidDataException($"ModuleVersion must be a string, but was {other.GetType()}") }; } @@ -71,7 +73,7 @@ public IEnumerable GetExported(object? data, CommandTypes commandTypes) case null: return []; default: - throw new Exception($"FunctionsToExport must be a string or an array of strings, but was {data.GetType()}"); + throw new InvalidDataException($"FunctionsToExport must be a string or an array of strings, but was {data.GetType()}"); } } @@ -92,26 +94,35 @@ public override IEnumerable GetExportedFunctions() { private ZipArchive GetZipArchive() => this.ZipArchive ??= new ZipArchive(this.MemoryStream, ZipArchiveMode.Read, true); - - var archive = GetZipArchive(); - var psd1Entry = archive.GetEntry($"{ModuleSpec.Name}.psd1"); - if (psd1Entry == null) - { - Logger.Debug($"Failed to find the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); - _powerShellManifest = []; - return _powerShellManifest; - } private Hashtable GetPowerShellManifest() { if (this.PowerShellManifest != null) return this.PowerShellManifest; - using var psd1Stream = psd1Entry.Open(); - if (Program.RunPowerShell(new StreamReader(psd1Stream).ReadToEnd())[0].BaseObject is not Hashtable psd1) - { - Logger.Debug($"Failed to parse the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); - _powerShellManifest = []; - return _powerShellManifest; + var archive = this.GetZipArchive(); + ZipArchiveEntry? psd1Entry; + try { + psd1Entry = archive.GetEntry($"{this.ModuleSpec.Name}.psd1"); + } catch (InvalidDataException err) { + Logger.Error($"Unable to open entry for {this.ModuleSpec.Name} to find the PSD1 file: {err.Message}"); + return this.PowerShellManifest = []; } - return _powerShellManifest = psd1; + if (psd1Entry == null) { + this.PowerShellManifest = []; + return this.PowerShellManifest; + } + + using var psd1Stream = psd1Entry.Open(); + using var psd1Reader = new StreamReader(psd1Stream); + var psd1String = psd1Reader.ReadToEnd(); + + return Program.RunPowerShell(psd1String) + .Map(objects => (Hashtable)objects[0].BaseObject) + .Match( + Succ: psd1 => this.PowerShellManifest = psd1, + Fail: err => { + Logger.Debug($"Failed to parse the PSD1 file for module {this.ModuleSpec.Name}, assuming no requirements."); + return this.PowerShellManifest = []; + } + ); } } diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 63033c9b..21152d87 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -1,15 +1,18 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Management.Automation; using System.Management.Automation.Language; using System.Reflection; using System.Text; using Compiler.Module.Resolvable; using Compiler.Requirements; using Compiler.Text; +using LanguageExt; using NLog; using QuikGraph; using QuikGraph.Algorithms; +using QuikGraph.Graphviz; namespace Compiler.Module.Compiled; @@ -20,45 +23,60 @@ public class CompiledScript : CompiledLocalModule { public readonly BidirectionalGraph> Graph; - public CompiledScript( - PathedModuleSpec moduleSpec, - TextEditor editor, + /// + /// Creates a new compiled script. + /// + /// + /// + /// + /// + /// + internal CompiledScript( + ResolvableScript thisResolvable, + CompiledDocument document, ResolvableParent resolvableParent, ParamBlockAst? scriptParamBlock, RequirementGroup requirements - ) : base(moduleSpec, CompiledDocument.FromBuilder(editor, 0), requirements) { + ) : base(thisResolvable.ModuleSpec, document, requirements) { this.ScriptParamBlock = scriptParamBlock; + this.Graph = new BidirectionalGraph>(); - _ = this.Graph.AddVertex(this); + this.Graph.AddVertex(this); + // Add the parent-child relationships to each module. + this.Graph.EdgeAdded += edge => edge.Target.Parents.Add(edge.Source); + var thisGraph = resolvableParent.GetGraphFromRoot(thisResolvable); + var dotGraph = thisGraph.ToGraphviz(alg => { + alg.FormatVertex += (sender, args) => args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; + }); + Logger.Debug($"Graph for {thisResolvable.ModuleSpec.Name}:\n{dotGraph}"); - var loadOrder = resolvableParent.Graph.TopologicalSort(); + var loadOrder = thisGraph.TopologicalSort(); var reversedLoadOrder = loadOrder.Reverse(); - reversedLoadOrder.ToList().ForEach(resolvable => { - Logger.Trace($"Compiling {resolvable.ModuleSpec.Name}"); - - var compiledRequirements = resolvableParent.Graph + reversedLoadOrder.ToList().ForEach(async resolvable => { + var compiledRequirements = await Task.WhenAll(thisGraph .OutEdges(resolvable) - .Select(edge => this.Graph.Vertices.First(module => module.ModuleSpec == edge.Target.ModuleSpec)); - - var compiledModule = resolvable.ModuleSpec == moduleSpec ? this : resolvable.IntoCompiled(); - - if (compiledRequirements.Any()) { - _ = this.Graph.AddVerticesAndEdgeRange(compiledRequirements.Select(requirement => new Edge(compiledModule, requirement))); + .Select(async edge => { + return this.Graph.Vertices.FirstOrDefault(module => module.ModuleSpec == edge.Target.ModuleSpec) + ?? (await resolvableParent.WaitForCompiled(edge.Target.ModuleSpec)).ThrowIfFail(); + })); + + var compiledModule = resolvable.ModuleSpec == thisResolvable.ModuleSpec + ? this + : (await resolvableParent.WaitForCompiled(resolvable.ModuleSpec)).ThrowIfFail(); + + if (compiledRequirements.Length != 0) { + this.Graph.AddVerticesAndEdgeRange( + compiledRequirements.Select(requirement => new Edge(compiledModule, requirement)) + ); } else { - _ = this.Graph.AddVertex(compiledModule); + this.Graph.AddVertex(compiledModule); } }); - // Iterate over the graph and add the parent-child relationships. - this.Graph.Edges.ToList().ForEach(edge => { - edge.Target.Parents.Add(edge.Source); - }); - - Logger.Trace("Analyzing compiled modules."); this.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { var imports = this.Graph.OutEdges(compiled).Select(edge => edge.Target); Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports]) - .ForEach(issue => Program.Errors.Add(issue.AsException())); + .ForEach(issue => Program.Errors.Add(issue.ToErrorException())); }); } @@ -87,6 +105,8 @@ public override string GetPowerShellObject() { if (this.ScriptParamBlock != null) { this.ScriptParamBlock.Attributes.ToList().ForEach(attribute => paramBlock.AppendLine(attribute.Extent.Text)); paramBlock.Append(this.ScriptParamBlock.Extent.Text); + } else { + paramBlock.AppendLine("[CmdletBinding()]\nparam()"); } var importOrder = this.Graph.TopologicalSort() diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index dbd61fb7..884a3d8d 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -8,10 +8,14 @@ using Compiler.Text; using Compiler.Text.Updater.Built; using LanguageExt; +using LanguageExt.Traits; +using NLog; namespace Compiler.Module.Resolvable; public partial class ResolvableLocalModule : Resolvable { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + internal readonly ScriptBlockAst Ast; public readonly TextEditor Editor; @@ -33,6 +37,11 @@ public partial class ResolvableLocalModule : Resolvable { /// /// Thrown when the ast cannot be generated from the file. /// + /// + /// Thrown when the path is not a valid module path. + /// This may be because the path is not a file or + /// the parent path is not an absolute path. + /// public ResolvableLocalModule( string parentPath, ModuleSpec moduleSpec @@ -41,8 +50,8 @@ moduleSpec is PathedModuleSpec pathedModuleSpec ? pathedModuleSpec : new PathedModuleSpec(Path.GetFullPath(Path.Combine(parentPath, moduleSpec.Name))) ) { - if (!Path.IsPathRooted(parentPath)) throw new InvalidModulePathException("The parent path must be an absolute path."); - if (!Directory.Exists(parentPath)) throw new InvalidModulePathException("The parent path must be a file."); + if (!Path.IsPathRooted(parentPath)) throw InvalidModulePathError.NotAnAbsolutePath(parentPath); + if (!Directory.Exists(parentPath)) throw InvalidModulePathError.ParentNotADirectory(parentPath); } /// @@ -56,13 +65,18 @@ moduleSpec is PathedModuleSpec pathedModuleSpec /// Thrown when the ast cannot be generated from the file. /// public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) { - if (!File.Exists(moduleSpec.FullPath)) throw new InvalidModulePathException($"The module path must be a file, got {moduleSpec.FullPath}"); + if (!File.Exists(moduleSpec.FullPath)) { + throw InvalidModulePathError.NotAFile(moduleSpec.FullPath); + } else { + Logger.Debug($"Loading Local Module: {moduleSpec.FullPath}"); + } this.Editor = new TextEditor(new TextDocument(File.ReadAllLines(moduleSpec.FullPath))); - this.Ast = AstHelper.GetAstReportingErrors(string.Join('\n', this.Editor.Document.Lines), Some(moduleSpec.FullPath), ["ModuleNotFoundDuringParse"]).Match( - ast => ast, - err => throw err - ); + this.Ast = AstHelper.GetAstReportingErrors( + string.Join('\n', this.Editor.Document.Lines), + Some(moduleSpec.FullPath), + ["ModuleNotFoundDuringParse"] + ).Catch(err => err.Enrich(this.ModuleSpec)).As().ThrowIfFail(); this.QueueResolve(); @@ -108,59 +122,59 @@ public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) { return ModuleMatch.None; } - public override void ResolveRequirements() - { - lock (Requirements) - { - AstHelper.FindDeclaredModules(_ast).ToList().ForEach(module => - { - if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) - { - Editor.AddExactEdit( - ast.Extent.StartLineNumber - 1, - ast.Extent.StartColumnNumber - 1, - ast.Extent.EndLineNumber - 1, - ast.Extent.EndColumnNumber - 1, - _ => [] - ); - } - - module.Value.TryGetValue("Guid", out var guid); - module.Value.TryGetValue("MinimumVersion", out var minimumVersion); - module.Value.TryGetValue("MaximumVersion", out var maximumVersion); - module.Value.TryGetValue("RequiredVersion", out var requiredVersion); - var spec = new ModuleSpec( - module.Key, - (Guid?)guid, - (Version?)minimumVersion, - (Version?)maximumVersion, - (Version?)requiredVersion + public override Option ResolveRequirements() { + AstHelper.FindDeclaredModules(this.Ast).ToList().ForEach(module => { + if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) { + this.Editor.AddExactEdit( + ast.Extent.StartLineNumber - 1, + ast.Extent.StartColumnNumber - 1, + ast.Extent.EndLineNumber - 1, + ast.Extent.EndColumnNumber - 1, + _ => [] ); - - Requirements.AddRequirement(spec); - }); - - AstHelper.FindDeclaredNamespaces(_ast).ToList().ForEach(statement => - { - Editor.AddExactEdit( - statement.Item2.Extent.StartLineNumber - 1, - statement.Item2.Extent.StartColumnNumber - 1, - statement.Item2.Extent.EndLineNumber - 1, - statement.Item2.Extent.EndColumnNumber - 1, - _ => [] - ); - - var ns = new UsingNamespace(statement.Item1); - Requirements.AddRequirement(ns); - }); - } + } + + module.Value.TryGetValue("Guid", out var guid); + module.Value.TryGetValue("MinimumVersion", out var minimumVersion); + module.Value.TryGetValue("MaximumVersion", out var maximumVersion); + module.Value.TryGetValue("RequiredVersion", out var requiredVersion); + var spec = new ModuleSpec( + module.Key, + (Guid?)guid, + (Version?)minimumVersion, + (Version?)maximumVersion, + (Version?)requiredVersion + ); + + lock (this.Requirements) { + this.Requirements.AddRequirement(spec); + } + }); + + AstHelper.FindDeclaredNamespaces(this.Ast).ToList().ForEach(statement => { + this.Editor.AddExactEdit( + statement.Item2.Extent.StartLineNumber - 1, + statement.Item2.Extent.StartColumnNumber - 1, + statement.Item2.Extent.EndLineNumber - 1, + statement.Item2.Extent.EndColumnNumber - 1, + _ => [] + ); + + var ns = new UsingNamespace(statement.Item1); + lock (this.Requirements) { + this.Requirements.AddRequirement(ns); + } + }); + + return None; } - public override Compiled.Compiled IntoCompiled() => new CompiledLocalModule( - this.ModuleSpec, - CompiledDocument.FromBuilder(this.Editor, 0), - this.Requirements - ); + public override Fin IntoCompiled() => CompiledDocument.FromBuilder(this.Editor, 0) + .AndThenTry(doc => new CompiledLocalModule( + this.ModuleSpec, + doc, + this.Requirements + ) as Compiled.Compiled); public override bool Equals(object? obj) { if (obj is null) return false; @@ -193,4 +207,3 @@ public override bool Equals(object? obj) { #endregion } -public class InvalidModulePathException(string message) : Exception(message); diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 869c7cf8..9fc15c99 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -3,15 +3,17 @@ using System.Collections; using System.IO.Compression; -using System.Management.Automation; +using System.Security.Cryptography; using Compiler.Module.Compiled; using Compiler.Requirements; +using LanguageExt; +using LanguageExt.Traits; using NLog; - namespace Compiler.Module.Resolvable; public class ResolvableRemoteModule : Resolvable { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private static readonly object UsingPSRepoLock = new(); private MemoryStream? MemoryStream; private string? CachedFile; @@ -24,52 +26,69 @@ public class ResolvableRemoteModule : Resolvable { this.ModuleSpec.Name ); - public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) => ModuleSpec.CompareTo(requirement); - - public override void ResolveRequirements() - { - lock (Requirements) - { - var memoryStream = _memoryStream ??= new MemoryStream(File.ReadAllBytes(FindCachedResult() ?? CacheResult()), false); - using var archive = new ZipArchive(memoryStream, ZipArchiveMode.Read, true); - var psd1Entry = archive.GetEntry($"{ModuleSpec.Name}.psd1"); - if (psd1Entry == null) - { - Logger.Debug($"Failed to find the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); - return; - } - - // Read the PSD1 file and parse it as a hashtable. - using var psd1Stream = psd1Entry.Open(); - if (PowerShell.Create().AddScript(new StreamReader(psd1Stream).ReadToEnd()).Invoke()[0].BaseObject is not Hashtable psd1) - { - Logger.Debug($"Failed to parse the PSD1 file for module {ModuleSpec.Name}, assuming no requirements."); - return; - } - - if (psd1["PowerShellVersion"] is string psVersion) Requirements.AddRequirement(new PSVersionRequirement(Version.Parse(psVersion))); - if (psd1["RequiredModules"] is object[] requiredModules) - { - foreach (var requiredModule in requiredModules.Cast()) - { - var moduleName = requiredModule["ModuleName"]!.ToString(); - _ = Version.TryParse((string?)requiredModule["ModuleVersion"], out var minimumVersion); - _ = Version.TryParse((string?)requiredModule["MaximumVersion"], out var maximumVersion); - _ = Version.TryParse((string?)requiredModule["RequiredVersion"], out var requiredVersion); - _ = Guid.TryParse((string?)requiredModule["Guid"], out var guid); - - var requiredModuleSpec = new ModuleSpec(moduleName!, guid, minimumVersion, maximumVersion, requiredVersion); - Requirements.AddRequirement(requiredModuleSpec); + public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) => this.ModuleSpec.CompareTo(requirement); + + public override Option ResolveRequirements() { + this.MemoryStream ??= new MemoryStream(File.ReadAllBytes(this.FindCachedResult() ?? this.CacheResult().Match( + Fail: error => throw error, + Succ: path => path + )), false); + + return this.MemoryStream.AsOption() + .Filter(static memoryStream => memoryStream == null || memoryStream.Length != 0) + .Map(static memoryStream => new ZipArchive(memoryStream, ZipArchiveMode.Read, true)) + .Map(archive => archive.GetEntry($"{this.ModuleSpec.Name}.psd1")) + .Filter(static entry => entry != null) + .Select(entry => entry!.Open()) + .Filter(static stream => stream != null) + .Map(static stream => new StreamReader(stream!)) + .Map(static reader => reader.ReadToEnd()) + .Filter(static psd1String => !string.IsNullOrWhiteSpace(psd1String)) + .ToFin() + .Bind(psd1String => Program.RunPowerShell(psd1String)) + .Map(static objects => (Hashtable)objects.First().BaseObject) + .Match( + Fail: static error => Some(error), + Succ: psd1 => { + if (psd1["PowerShellVersion"] is string psVersion) + this.Requirements.AddRequirement(new PSVersionRequirement(Version.Parse(psVersion))); + if (psd1["RequiredModules"] is object[] requiredModules) { + foreach (var requiredModule in requiredModules.Cast()) { + var moduleName = requiredModule["ModuleName"]!.ToString(); + _ = Version.TryParse((string?)requiredModule["ModuleVersion"], out var minimumVersion); + _ = Version.TryParse((string?)requiredModule["MaximumVersion"], out var maximumVersion); + _ = Version.TryParse((string?)requiredModule["RequiredVersion"], out var requiredVersion); + _ = Guid.TryParse((string?)requiredModule["Guid"], out var guid); + + var requiredModuleSpec = new ModuleSpec(moduleName!, guid, minimumVersion, maximumVersion, requiredVersion); + this.Requirements.AddRequirement(requiredModuleSpec); + } + } + + return None; } - } - } + ); } - public override Compiled.Compiled IntoCompiled() => new CompiledRemoteModule( - this.ModuleSpec, - this.Requirements, - this.MemoryStream ??= new MemoryStream(File.ReadAllBytes(this.FindCachedResult() ?? this.CacheResult().ThrowIfFail()), false) - ); + public override Fin IntoCompiled() { + if (this.MemoryStream == null) { + var memoryStreamResult = this.FindCachedResult().AsOption().ToFin() + .BiBind( + Succ: value => FinSucc(value), + Fail: _ => this.CacheResult().Catch(err => err.Enrich(this.ModuleSpec)).As()) + .AndThen(File.ReadAllBytes) + .AndThen(bytes => new MemoryStream([.. bytes], false)); + + if (memoryStreamResult.IsErr(out var error, out _)) return error; + this.MemoryStream = memoryStreamResult.Unwrap(); + } + + return new CompiledRemoteModule( + this.ModuleSpec, + this.Requirements, + this.MemoryStream + ); + } public override bool Equals(object? obj) { if (obj is null) return false; @@ -89,14 +108,14 @@ public override bool Equals(object? obj) { var versions = files.Where(file => { var fileName = Path.GetFileName(file); return fileName.StartsWith(this.ModuleSpec.Name, StringComparison.OrdinalIgnoreCase); - }).Select(file => { + }).Bind(file => { var fileName = Path.GetFileName(file); var version = fileName.Substring(this.ModuleSpec.Name.Length + 1, fileName.Length - this.ModuleSpec.Name.Length - 1 - ".nupkg".Length); try { - return new Version(version); + return Some(new Version(version)); } catch { - throw new Exception($"Failed to parse version {version} from file {file}"); + return Option.None; // Ignore invalid versions. } }); @@ -110,25 +129,17 @@ public override bool Equals(object? obj) { return selectedVersion == null ? null : this.CachedFile = Path.Join(this.CachePath, $"{this.ModuleSpec.Name}.{selectedVersion}.nupkg"); } - public string CacheResult() - { + public Fin CacheResult() { var versionString = ConvertVersionParameters(this.ModuleSpec.RequiredVersion?.ToString(), this.ModuleSpec.MinimumVersion?.ToString(), this.ModuleSpec.MaximumVersion?.ToString()); var powerShellCode = /*ps1*/ $$""" Set-StrictMode -Version 3; - try { - $Module = Find-PSResource -Name '{{ModuleSpec.Name}}' {{(versionString != null ? $"-Version '{versionString}'" : "")}}; - } catch { - exit 10; - } + Set-PSResourceRepository -Name PSGallery -Trusted -Confirm:$False; - try { - $Module | Save-PSResource -Path '{{CachePath}}' -AsNupkg -SkipDependencyCheck; - } catch { - exit 11; - } + $Module = Find-PSResource -Name '{{this.ModuleSpec.Name}}' {{(versionString != null ? $"-Version '{versionString}'" : "")}}; + $Module | Save-PSResource -Path '{{this.CachePath}}' -AsNupkg -SkipDependencyCheck; - return $env:TEMP | Join-Path -ChildPath "PowerShellGet/{{ModuleSpec.Name}}/{{ModuleSpec.Name}}.$($Module.Version).nupkg"; + return "$env:TEMP/PowerShellGet/{{this.ModuleSpec.Name}}/{{this.ModuleSpec.Name}}.$($Module.Version).nupkg"; """; Logger.Debug( @@ -141,19 +152,12 @@ public string CacheResult() Directory.CreateDirectory(this.CachePath); } - var pwsh = PowerShell.Create(RunspaceMode.NewRunspace); - pwsh.RunspacePool = Program.RunspacePool.Value; - pwsh.AddScript(PowerShellCode); - var result = pwsh.Invoke(); - - if (pwsh.HadErrors) - { - throw new Exception("Failed to download module from the PowerShell Gallery.", pwsh.Streams.Error[0]?.Exception); + // Only one process can download a module at a time. + lock (UsingPSRepoLock) { + return Program.RunPowerShell(powerShellCode) + .Map(objects => objects.First().ToString()) + .Tap(path => this.CachedFile = path); } - - var returnedResult = result.First().ToString(); - Logger.Debug($"Downloaded module {ModuleSpec.Name} from the PowerShell Gallery to {returnedResult}."); - return returnedResult; } // Based on https://github.com/PowerShell/PowerShellGet/blob/c6aea39ea05491c648efd7aebdefab1ae7c5b213/src/PowerShellGet.psm1#L111-L144 diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index 52e7e0bd..6b95e4ed 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -1,19 +1,102 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; +using System.Management.Automation; +using Compiler.Module.Compiled; using Compiler.Requirements; +using LanguageExt; +using LanguageExt.UnsafeValueAccess; using NLog; using QuikGraph; +using QuikGraph.Graphviz; namespace Compiler.Module.Resolvable; public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleSpec) { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public ManualResetEvent RequirementsWaitHandle { get; } = new ManualResetEvent(false); + + public bool RequirementsResolved { get; private set; } + /// /// Resolves the requirements of the module. /// - public abstract void ResolveRequirements(); + /// + /// None if the requirements were resolved successfully, otherwise an exception. + /// + [return: NotNull] - public abstract Compiled.Compiled IntoCompiled(); + public abstract Option ResolveRequirements(); + [return: NotNull] + public abstract Fin IntoCompiled(); + + protected void QueueResolve() => ThreadPool.QueueUserWorkItem(_ => { + try { + this.ResolveRequirements().Match( + exception => { + Program.Errors.Add(exception); + Program.CancelSource.Cancel(true); + }, + () => Logger.Debug($"Finished resolving requirements for module {this.ModuleSpec.Name}.") + ); + } catch (Exception err) { + Program.Errors.Add(Error.New($"Failed to resolve requirements for module {this.ModuleSpec.Name}.", err)); + Program.CancelSource.Cancel(true); + return; + } + + this.RequirementsWaitHandle.Set(); + this.RequirementsResolved = true; + }, Program.CancelSource.Token); + + /// + /// Create an instance of the Resolvable class, + /// catching exceptions and enriching them with the module spec. + /// + /// Will try to create a local module if the parent is a local module, + /// otherwise it will create a remote module. + /// + /// If there is an while creating the local module it will fall back to a remote module. + /// + /// + /// + /// + /// + [return: NotNull] + internal static Fin TryCreate( + [NotNull] Option parentResolvable, + [NotNull] ModuleSpec moduleSpec, + Collection? mergeWith = default + ) { + if (mergeWith is not null && mergeWith.Count != 0) { + moduleSpec = moduleSpec.MergeSpecs([.. mergeWith]); + } + + if (parentResolvable.IsSome(out var parent) && parent is ResolvableLocalModule localParent) { + var parentPath = Path.GetDirectoryName(localParent.ModuleSpec.FullPath)!; + try { + Logger.Debug($"Looking for {moduleSpec.Name} module in {parentPath}."); + return FinSucc(new ResolvableLocalModule(parentPath, moduleSpec) as Resolvable); + } catch (ExceptionalException err) when (err.ToError() is InvalidModulePathError) { + // Silent fall through to remote. + } catch (ExceptionalException err) { + Logger.Debug("Caught Exceptional with Error type {0}", err.ToError().GetType()); + return FinFail(err.Enrich(moduleSpec)); + } catch (Exception err) { + Logger.Debug($"Caught exception while trying to create local module, {err.GetType()}"); + return FinFail(err.Enrich(moduleSpec)); + } + } + + try { + return FinSucc(new ResolvableRemoteModule(moduleSpec) as Resolvable); + } catch (Exception err) { + return FinFail(err); + } + } } /// @@ -24,15 +107,22 @@ public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleS public class ResolvableParent { public record ResolvedMatch(Resolvable Resolvable, ModuleMatch Match); + public record ResolvableInfo( + [NotNull] Option> Compiled, + [NotNull] Option> OnCompletion, + [NotNull] Option WaitHandle + ); + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public readonly BidirectionalGraph> Graph; + private readonly Dictionary Resolvables = []; - public ResolvableParent(Resolvable rootModule) - { - Graph = new BidirectionalGraph>(); - Graph.AddVertex(rootModule); + /// + /// A graph of resolvable roots and their dependencies. + /// + public readonly BidirectionalGraph> Graph = new(); + public ResolvableParent() { #region Deduplication and merging of Resolvables using events this.Graph.VertexAdded += vertex => Logger.Debug($"Vertex added: {vertex.ModuleSpec.Name}"); this.Graph.VertexRemoved += vertex => Logger.Debug($"Vertex removed: {vertex.ModuleSpec.Name}"); @@ -51,6 +141,35 @@ public ResolvableParent(Resolvable rootModule) #endregion } + public BidirectionalGraph> GetGraphFromRoot(Resolvable resolvable) { + var graph = new BidirectionalGraph>(); + graph.AddVertex(resolvable); + + var iterating = new Queue([resolvable]); + do { + var currentResolvable = iterating.Dequeue(); + lock (this.Graph) { + this.Graph.TryGetOutEdges(currentResolvable, out var outEdges); + outEdges.ToList().ForEach(edge => { + graph.AddVerticesAndEdge(edge); + iterating.Enqueue(edge.Target); + }); + } + } while (iterating.Count > 0); + + return graph; + } + + public void QueueResolve([NotNull] Resolvable rootModule, Action? onCompletion = null) { + lock (this.Graph) { + this.Graph.AddVertex(rootModule); + } + + lock (this.Resolvables) { + this.Resolvables[rootModule.ModuleSpec] = new(None, onCompletion.AsOption(), None); + } + } + /// /// Locates a module which matches the given spec within the group. /// @@ -64,13 +183,99 @@ public ResolvableParent(Resolvable rootModule) return new(resolvable, resolvable.ModuleSpec.CompareTo(moduleSpec)); } - public void Resolve() - { - lock (Graph) - { - var iterating = new Queue<(Resolvable?, ModuleSpec)>(Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); - do - { + public async Task> WaitForCompiled(ModuleSpec moduleSpec) { + var resolvableMatch = this.FindResolvable(moduleSpec); + if (resolvableMatch == null) { + return FinFail(Error.New($"No resolvable found for {moduleSpec}.")); + } + + var (resolvable, match) = resolvableMatch; + if (match == ModuleMatch.None) { + return FinFail(Error.New($"No matching resolvable found for {moduleSpec}.")); + } + + if (!resolvable.RequirementsResolved) { + await resolvable.RequirementsWaitHandle.WaitOneAsync(-1, Program.CancelSource.Token); + } + + if (!this.Resolvables.TryGetValue(moduleSpec, out var resolvableInfo)) { + return FinFail(Error.New($"No resolvable info found for {moduleSpec}.")); + } + + var (compiledOpt, onCompletion, waitHandle) = resolvableInfo; + if (compiledOpt.IsSome(out var compiledFin)) { + if (compiledFin.IsErr(out var err, out var compiled)) { + return FinFail(err); + } + + return FinSucc(compiled); + } + + // if the compiled is none and the error is none then we need to wait for the wait handle if it exists, + // otherwise we need to start the compilation. + if (waitHandle.IsSome(out var handle)) { + Logger.Debug($"Waiting for IntoCompiled to finish for {moduleSpec.Name}."); + await handle.WaitOneAsync(-1, Program.CancelSource.Token); + + resolvableInfo = this.Resolvables.GetValueOrDefault(moduleSpec)!; // Safety: We know its valid due to previous calls. + (compiledOpt, _, _) = resolvableInfo; + + // Safety: We know its going to be some here due waitHandle being some and having triggered. + if (compiledOpt.Unwrap().IsErr(out var err, out var compiled)) { + return FinFail(err); + } + + return FinSucc(compiled); + } else { + var newWaitHandle = new ManualResetEvent(false); + lock (this.Resolvables) { + this.Resolvables[moduleSpec] = resolvableInfo with { + WaitHandle = newWaitHandle + }; + } + + var newlyCompiledModule = resolvable.IntoCompiled(); + newlyCompiledModule.IfFail(err => Logger.Error(err.Message)); + + lock (this.Resolvables) { + this.Resolvables[moduleSpec] = resolvableInfo with { + Compiled = newlyCompiledModule + }; + } + + newlyCompiledModule.IfSucc(module => onCompletion.IfSome( + onCompletion => onCompletion((module as CompiledScript)!) // Safety: We know it's a compiled script + )); + + newWaitHandle.Set(); + return newlyCompiledModule; + } + } + + public void StartCompilation() { + this.ResolveDepedencyGraph(); + + // Get a list of the scripts which are roots and have no scripts depending on them. + var topLevelScripts = this.Graph.Vertices.Where(resolvable => !this.Graph.TryGetInEdges(resolvable, out var inEdges) || !inEdges.Any()); + topLevelScripts.AsParallel().ForAll(async resolvable => { + Logger.Trace($"Compiling top level script {resolvable.ModuleSpec.Name}"); + + var compiledModule = await this.WaitForCompiled(resolvable.ModuleSpec); + compiledModule.IfFail(Program.Errors.Add); + + Logger.Debug($"Finished compiling top level script {resolvable.ModuleSpec.Name}"); + }); + + Logger.Trace("Finished compiling all top level scripts."); + } + + /// + /// Creates all the links between the modules and their dependencies. + /// + private void ResolveDepedencyGraph() { + lock (this.Graph) { + var iterating = new Queue<(Resolvable?, ModuleSpec)>(this.Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); + while (iterating.Count > 0) { var (parentResolvable, workingModuleSpec) = iterating.Dequeue(); Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); @@ -80,7 +285,21 @@ public void Resolve() continue; } - var workingResolvable = LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); + var resolvableResult = this.LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); + + Option workingResolvable = None; + switch (resolvableResult) { + case var fail when fail.IsFail: + Logger.Error($"Failed to link {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); + fail.IfFail(Program.Errors.Add); + continue; + case var succ when succ.IsSucc: + Logger.Debug($"Linked {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); + workingResolvable = succ.Unwrap(); + break; + default: + break; + } // If it was null or there are out edges it means this module has already been resolved. if (workingResolvable.IsNone || (this.Graph.TryGetOutEdges(workingResolvable.ValueUnsafe()!, out var outEdges) && outEdges.Any())) { @@ -88,11 +307,30 @@ public void Resolve() continue; } - lock (workingResolvable.Requirements) - { - workingResolvable.Requirements.GetRequirements().ToList().ForEach(requirement => iterating.Enqueue((workingResolvable, requirement))); + var safeWorkingResolvable = workingResolvable.ValueUnsafe()!; + // TODO Maybe push to the end of the queue or something. + if (!safeWorkingResolvable.RequirementsResolved) { + if (iterating.Count == 0) { + Logger.Debug("Requirements not resolved, waiting for them to be resolved."); + safeWorkingResolvable.RequirementsWaitHandle.WaitOne(); + } else { + Logger.Debug("Requirements not resolved, pushing to the end of the queue."); + iterating.Enqueue((parentResolvable, workingModuleSpec)); + continue; + } + } + + lock (safeWorkingResolvable.Requirements) { + safeWorkingResolvable.Requirements.GetRequirements().ToList().ForEach(requirement => iterating.Enqueue((safeWorkingResolvable, requirement))); } - } while (iterating.Count > 0); + } + + var dotGraph = this.Graph.ToGraphviz(alg => { + alg.FormatVertex += (sender, args) => { + args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; + }; + }); + Console.WriteLine(dotGraph); } } @@ -115,70 +353,100 @@ public void Resolve() /// /// If the module is incompatible with the current module. /// - public Resolvable? LinkFindingPossibleResolved( + [return: NotNull] + public Fin> LinkFindingPossibleResolved( Resolvable? parentResolvable, - ModuleSpec moduleToResolve) - { - var resolveableMatch = FindResolvable(moduleToResolve); + [NotNull] ModuleSpec moduleToResolve) { + ArgumentNullException.ThrowIfNull(moduleToResolve); + + var resolveableMatch = this.FindResolvable(moduleToResolve); Resolvable? resultingResolvable = null; - if (resolveableMatch != null) - { + if (resolveableMatch != null) { Logger.Debug($"Found existing resolvable for {moduleToResolve.Name}."); resolveableMatch.Deconstruct(out var foundResolvable, out var match); - // If the module is not a same match we need to merge and propagate the requirements. - // If its an incompatible match we need to throw an error. - resultingResolvable = match switch - { - ModuleMatch.PreferOurs or ModuleMatch.Same or ModuleMatch.Looser => foundResolvable, - ModuleMatch.MergeRequired or ModuleMatch.Stricter => foundResolvable switch - { - ResolvableLocalModule local => new ResolvableLocalModule(Path.GetDirectoryName(local.ModuleSpec.FullPath)!, moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])), - _ => new ResolvableRemoteModule(moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])) - }, - ModuleMatch.Incompatible => throw new Exception($"Incompatible module versions found for {moduleToResolve.Name}."), - _ => throw new Exception("This should never happen.") + switch (match) { + case ModuleMatch.PreferOurs or ModuleMatch.Same or ModuleMatch.Looser: + resultingResolvable = foundResolvable; + break; + case ModuleMatch.Incompatible: + return FinFail>(Error.New($"Incompatible module versions found for {moduleToResolve.Name}.")); + case ModuleMatch.MergeRequired or ModuleMatch.Stricter: + var (mergeFrom, mergeWith) = match switch { + ModuleMatch.MergeRequired => (moduleToResolve, new List { foundResolvable.ModuleSpec }), + ModuleMatch.Stricter => (foundResolvable.ModuleSpec, [moduleToResolve]), + _ => (moduleToResolve, []), + }; + + var fin = Resolvable.TryCreate( + parentResolvable.AsOption(), + mergeFrom, + [.. mergeWith] + ); + + if (fin.IsErr(out var err, out _) && err is InvalidModulePathError) { + Logger.Debug($"Failed to find local module {moduleToResolve.Name}, trying remote."); + } else if (err is not null) { + return FinFail>(err); + } + + resultingResolvable = fin.UnwrapOrElse(() => { + return new ResolvableRemoteModule(moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])); + }); + break; + case ModuleMatch.None or ModuleMatch.PreferTheirs or ModuleMatch.Looser: + goto default; + default: + break; }; + if (resultingResolvable == null) { + return FinFail>(Error.New($"Failed to resolve {moduleToResolve.Name}.")); + } + // Propogate the merge if the module isn't the same. - if (!ReferenceEquals(foundResolvable, resultingResolvable)) - { + if (!ReferenceEquals(foundResolvable, resultingResolvable)) { Logger.Debug($"Propogating merge of {foundResolvable.ModuleSpec} with {moduleToResolve}, resulting in {resultingResolvable.ModuleSpec}."); - Graph.TryGetInEdges(foundResolvable, out var inEdges); - Graph.TryGetOutEdges(foundResolvable, out var outEdges); + this.Graph.TryGetInEdges(foundResolvable, out var inEdges); + this.Graph.TryGetOutEdges(foundResolvable, out var outEdges); - if (!Graph.RemoveVertex(foundResolvable)) Logger.Warn($"Failed to remove vertex {foundResolvable.ModuleSpec}."); - inEdges.ToList().ForEach(edge => Graph.AddVerticesAndEdge(new Edge(edge.Source, resultingResolvable))); - outEdges.ToList().ForEach(edge => Graph.AddVerticesAndEdge(new Edge(resultingResolvable, edge.Target))); - } - } - else - { - if (parentResolvable is ResolvableLocalModule local) - { - try { resultingResolvable = new ResolvableLocalModule(Path.GetDirectoryName(local.ModuleSpec.FullPath)!, moduleToResolve); } - catch { /*This just happens when its not a file and might actually be a remote module*/ } + inEdges.ToList().ForEach(edge => this.Graph.AddVerticesAndEdge(new Edge(edge.Source, resultingResolvable))); + outEdges.ToList().ForEach(edge => this.Graph.AddVerticesAndEdge(new Edge(resultingResolvable, edge.Target))); + + lock (this.Resolvables) { + if (this.Resolvables.TryGetValue(foundResolvable.ModuleSpec, out var resolvableInfo)) { + this.Resolvables[resultingResolvable.ModuleSpec] = resolvableInfo; + } + } } - resultingResolvable ??= new ResolvableRemoteModule(moduleToResolve); + } else { + var newResolvable = Resolvable.TryCreate(parentResolvable.AsOption(), moduleToResolve); + if (newResolvable.IsErr(out var err, out _)) return FinFail>(err); + resultingResolvable = newResolvable.Unwrap(); } - if (parentResolvable != null) - { - if (Graph.Edges.Where(edge => edge.Source == parentResolvable && edge.Target == resultingResolvable).Any()) - { + if (parentResolvable != null) { + if (this.Graph.Edges.Any(edge => edge.Source == parentResolvable && edge.Target == resultingResolvable)) { Logger.Debug("Edge already exists, skipping."); - return null; + return FinSucc>(None); } - lock (parentResolvable.Requirements) - { - if (!parentResolvable.Requirements.RemoveRequirement(moduleToResolve)) Logger.Warn($"Failed to remove requirement {moduleToResolve} from {parentResolvable.ModuleSpec}."); + lock (parentResolvable.Requirements) { + if (!parentResolvable.Requirements.RemoveRequirement(moduleToResolve)) + Logger.Warn($"Failed to remove requirement {moduleToResolve} from {parentResolvable.ModuleSpec}."); + } + this.Graph.AddVerticesAndEdge(new Edge(parentResolvable, resultingResolvable)); + } else { + this.Graph.AddVertex(resultingResolvable); + } + + if (!this.Resolvables.TryGetValue(resultingResolvable.ModuleSpec, out var _)) { + lock (this.Resolvables) { + this.Resolvables[resultingResolvable.ModuleSpec] = new(None, None, None); } - Graph.AddVerticesAndEdge(new Edge(parentResolvable, resultingResolvable)); } - else { Graph.AddVertex(resultingResolvable); } - return resultingResolvable; + return FinSucc(Some(resultingResolvable)); } } diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index 7f8a4680..46a5b462 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -1,15 +1,18 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Diagnostics.CodeAnalysis; using System.Management.Automation.Language; using Compiler.Requirements; +using Compiler.Text; +using LanguageExt; namespace Compiler.Module.Resolvable; public partial class ResolvableScript : ResolvableLocalModule { private readonly ResolvableParent ResolvableParent; - public ResolvableScript(PathedModuleSpec moduleSpec, ResolvableParent superParent) : base(moduleSpec) { + public ResolvableScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] ResolvableParent superParent) : base(moduleSpec) { this.ResolvableParent = superParent; #region Requirement Compatability checking @@ -18,36 +21,34 @@ public ResolvableScript(PathedModuleSpec moduleSpec, ResolvableParent superParen RunAsAdminRequirement? foundRunAsAdmin = null; foreach (var resolvable in this.ResolvableParent.Graph.Vertices) { var versionRequirement = resolvable.Requirements.GetRequirements().FirstOrDefault(); - if (versionRequirement != null && versionRequirement.Version > highestPSVersion?.Version) highestPSVersion = versionRequirement; + if (versionRequirement is not null && versionRequirement.Version > highestPSVersion?.Version) highestPSVersion = versionRequirement; var editionRequirement = resolvable.Requirements.GetRequirements().FirstOrDefault(); - if (editionRequirement != null - && foundPSEdition != null - && editionRequirement.Edition != foundPSEdition.Edition - ) throw new Exception("Multiple PSEditions found in resolved modules."); + if (editionRequirement is not null && foundPSEdition is not null) { + if (!editionRequirement.IsCompatibleWith(foundPSEdition)) { + throw new IncompatableRequirementsError([editionRequirement, foundPSEdition]); + } + } foundPSEdition ??= editionRequirement; foundRunAsAdmin ??= resolvable.Requirements.GetRequirements().FirstOrDefault(); } - if (highestPSVersion != null) _ = this.Requirements.AddRequirement(highestPSVersion); - if (foundPSEdition != null) _ = this.Requirements.AddRequirement(foundPSEdition); - if (foundRunAsAdmin != null) _ = this.Requirements.AddRequirement(foundRunAsAdmin); + if (highestPSVersion is not null) this.Requirements.AddRequirement(highestPSVersion); + if (foundPSEdition is not null) this.Requirements.AddRequirement(foundPSEdition); + if (foundRunAsAdmin is not null) this.Requirements.AddRequirement(foundRunAsAdmin); #endregion } - public override Compiled.Compiled IntoCompiled() { - lock (this.Requirements) { - return new Compiled.CompiledScript( - this.ModuleSpec, - this.Editor, - this.ResolvableParent, - this.ExtractParameterBlock(), - this.Requirements - ); - } - } + public override Fin IntoCompiled() => CompiledDocument.FromBuilder(this.Editor, 0) + .AndThenTry(doc => new Compiled.CompiledScript( + this, + doc, + this.ResolvableParent, + this.ExtractParameterBlock(), + this.Requirements + ) as Compiled.Compiled); /// /// Looks for the parameter block of the script, diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 27f2fe8c..2785ac3a 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -1,6 +1,10 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +global using LanguageExt.Common; +global using static LanguageExt.Prelude; +global using LanguageExt.Pipes; + using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.Management.Automation; @@ -14,6 +18,10 @@ using Compiler.Requirements; using NLog; using NLog.Targets; +using System.Globalization; +using Extended.Collections.Generic; +using NuGet.Packaging; +using LanguageExt; namespace Compiler; @@ -22,7 +30,9 @@ public class Program { internal static bool IsDebugging; - internal static readonly ConcurrentBag Issues = []; + internal static readonly AutoResetEvent AutoEvent = new(false); + + internal static readonly ConcurrentBag Errors = []; internal static readonly CancellationTokenSource CancelSource = new(); @@ -58,104 +68,135 @@ public class Options { public bool Force { get; set; } } - public static void Main(string[] args) - { - var parser = new CommandLine.Parser(settings => - { - settings.GetoptMode = true; - }); + private static async Task Main(string[] args) { + var parser = new CommandLine.Parser(settings => settings.GetoptMode = true); - - _ = parser.ParseArguments(args).WithParsed(async opts => - { + var result = parser.ParseArguments(args).MapResult(opts => { CleanInput(opts); IsDebugging = SetupLogger(opts) <= LogLevel.Debug; var filesToCompile = GetFilesToCompile(opts.Input!); EnsureDirectoryStructure(opts.Input!, opts.Output, filesToCompile); + var superParent = new ResolvableParent(); + ConcurrentBag<(string, Exception)> compilerErrors = []; - // TODO - Super parent, Submit completed scripts so they can be resolved by other scripts - CancelSource.Token.Register(() => Logger.Error("Compilation was cancelled.")); - var compilerTask = Parallel.ForEachAsync( - GetFilesToCompile(opts.Input!), - CancelSource.Token, - async (script, ct) => - { - var compiledScript = await CompileScript(script, compilerErrors, ct); - if (compiledScript == null && opts.FailFast) { CancelSource.Cancel(); } - if (compiledScript == null) return; + GetFilesToCompile(opts.Input!).ToList().ForEach(scriptPath => { + var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); + ResolvableScript resolvableScript; + try { + resolvableScript = new ResolvableScript(pathedModuleSpec, superParent); + } catch (Exception e) { + compilerErrors.Add((scriptPath, e)); + return; + } + + superParent.QueueResolve(resolvableScript, compiled => { OutputToFile( opts.Input!, opts.Output, - script, - compiledScript.GetPowerShellObject(), - opts.Force - ); - Logger.Debug($"Compiled {script}"); - } - ); + scriptPath, + compiled.GetPowerShellObject(), + opts.Force); + Logger.Debug($"Compiled {scriptPath}"); + }); + }); - do - { - if (compilerTask.Status == TaskStatus.Canceled || compilerTask.Status == TaskStatus.Canceled || !compilerErrors.IsEmpty) - { - await CancelSource.CancelAsync(); - LogManager.Flush(); - - Logger.Error("There was an error compiling the script, please see the errors below:"); - if (compilerTask.Exception != null) - { - Logger.Error(compilerTask.Exception.Message); - } + try { + superParent.StartCompilation(); + } catch (Exception err) { + Errors.Add(err); + } - foreach (var (scriptPath, e) in compilerErrors) - { - Logger.Error($"Error compiling script {scriptPath}"); - var printing = IsDebugging ? e.ToString() : e.Message; - Logger.Error(printing); - } + Logger.Debug("Finished compilation."); + + if (compilerErrors.IsEmpty) return 0; - break; + foreach (var (scriptPath, e) in compilerErrors) { + Errors.Add(LanguageExt.Common.Error.New($"Error compiling {scriptPath}", e)); + } + + return 1; + }, + errors => { + Console.Error.WriteLine("There was an error parsing the command line arguments."); + foreach (var err in errors) { + Console.Error.WriteLine(err); } + errors.Output(); - Task.Delay(25).Wait(); - } while (compilerTask.Status != TaskStatus.RanToCompletion); - }).WithNotParsed(errors => - { - Console.Error.WriteLine("There was an error parsing the command line arguments."); - foreach (var err in errors) - { - Console.Error.WriteLine(err); + return 1; } - errors.Output(); - Environment.Exit(1); - }); + ); + + if (!Errors.IsEmpty) { + do { + ThreadPool.GetAvailableThreads(out var workerThreads, out _); + ThreadPool.GetMaxThreads(out var maxThreads, out _); + Logger.Debug($"Waiting for all threads to finish, {ThreadPool.PendingWorkItemCount} items left using {ThreadPool.ThreadCount} threads."); + Logger.Debug($"Worker threads: {workerThreads} Max threads: {maxThreads}"); + await Task.Delay(25); + } while (ThreadPool.PendingWorkItemCount != 0); + + // Seriously .NET, why is there no fucking double ended queue. + var printedBefore = false; // This is to prevent a newline before the first error + var errorQueue = new Deque(); + errorQueue.AddRange(Errors); + do { + var err = errorQueue.PopFirst(); + + // Flatten ManyErrors into the indiviuals + if (err is ManyErrors manyErrors) { + errorQueue.PushRangeFirst(manyErrors.Errors); + continue; + } - if (!Issues.IsEmpty) - { - Logger.Warn("There were issues found by the analyser during compilation."); - Issues.ToList().ForEach(issue => issue.Print()); - } + var type = err.IsExceptional ? LogLevel.Error : LogLevel.Warn; - Environment.Exit(0); - } + if (printedBefore) { + if (type == LogLevel.Error) { + Console.Error.WriteLine(); + } else { + Console.WriteLine(); + } + } else { + printedBefore = true; + } - public static async Task CompileScript(string scriptPath, ConcurrentBag<(string, Exception)> compilerErrors, CancellationToken ct) => await Task.Run(() => - { - var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); - var resolvableScript = new ResolvableScript(pathedModuleSpec); + var message = err is Issue + ? err.ToString() + : err.Message + + (IsDebugging + ? (err.Exception.IsSome(out var exception) + ? Environment.NewLine + exception.StackTrace + : "") + : "" + ); - try - { - return (CompiledScript)resolvableScript.IntoCompiled(); - } - catch (Exception e) - { - lock (compilerErrors) { compilerErrors.Add((scriptPath, e)); } - return null; + Logger.Log(type, message); + } while (errorQueue.Count > 0); + + return 1; } - }, ct); + + return result; + } + + public static async Task CompileScript( + string scriptPath, + ResolvableParent superParent, + ConcurrentBag<(string, Exception)> compilerErrors, + CancellationToken ct) => await Task.Run(() => { + var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); + var resolvableScript = new ResolvableScript(pathedModuleSpec, superParent); + + try { + return (CompiledScript)resolvableScript.IntoCompiled(); + } catch (Exception e) { + lock (compilerErrors) { compilerErrors.Add((scriptPath, e)); } + return null; + } + }, ct); public static void CleanInput(Options opts) { ArgumentException.ThrowIfNullOrWhiteSpace(opts.Input, nameof(opts.Input)); @@ -266,9 +307,11 @@ public static string GetOutputLocation( public static IEnumerable GetFilesToCompile(string input) { if (File.Exists(input)) { + Logger.Debug($"Found file {input}"); yield return input; } else if (Directory.Exists(input)) { foreach (var file in Directory.EnumerateFiles(input, "*.ps1", SearchOption.AllDirectories)) { + Logger.Debug($"Found file {file}"); yield return file; } } else { @@ -331,8 +374,7 @@ internal static PowerShell GetPowerShellSession() { return pwsh; } - internal static Collection RunPowerShell(string script, params object[] args) - { + internal static Fin> RunPowerShell(string script, params object[] args) { var pwsh = GetPowerShellSession(); pwsh.AddScript(script); args.ToList().ForEach(arg => pwsh.AddArgument(arg)); @@ -344,8 +386,14 @@ internal static Collection RunPowerShell(string script, params object[ pwsh.Streams.Information.ToList().ForEach(log => Logger.Info(CultureInfo.CurrentCulture, log.MessageData)); pwsh.Streams.Warning.ToList().ForEach(log => Logger.Warn(log.Message)); - var ast = AstHelper.GetAstReportingErrors(script, null, []); if (pwsh.HadErrors) { + var ast = AstHelper.GetAstReportingErrors(script, None, ["ModuleNotFoundDuringParse"]).Match( + ast => ast, + error => { + Logger.Error("Unable to parse ast of script for error reporting."); + throw error; + } + ); var errors = pwsh.Streams.Error.Select(log => { Logger.Debug(log.InvocationInfo.ScriptLineNumber); @@ -366,16 +414,15 @@ internal static Collection RunPowerShell(string script, params object[ ); var errorMessage = log.ErrorDetails?.Message ?? log.Exception?.Message ?? log.FullyQualifiedErrorId; + var extent = new ScriptExtent(startPosition, endPosition); - AstHelper.PrintPrettyAstError( - new ScriptExtent(startPosition, endPosition), - ast, - errorMessage - ); + return Issue.Error(errorMessage, extent, ast); }); + + return FinFail>(LanguageExt.Common.Error.Many(errors.ToArray())); } - return result; + return FinSucc(result); } ~Program() { diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index 18652cd9..865b4908 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -8,13 +8,37 @@ using System.Text; using System.Text.Json; using Compiler.Module; +using LanguageExt; using NLog; namespace Compiler.Requirements; public sealed class PathedModuleSpec : ModuleSpec { + private Option LazyHash = None; + public readonly string FullPath; + public override byte[] Hash { + get { + if (this.LazyHash.IsSome(out var hash)) return hash; + var newHash = SHA256.HashData(File.ReadAllBytes(this.FullPath)); + this.LazyHash = Some(newHash); + return newHash; + } + protected set => this.LazyHash = Some(value); + } + + /// + /// Creates a new PathedModuleSpec from a full path. + /// + /// + /// + /// + /// + /// + /// + /// Thrown when the file cannot be found, or read. + /// public PathedModuleSpec( string fullPath, Guid? id = null, @@ -24,7 +48,6 @@ public PathedModuleSpec( ) : base(Path.GetFileNameWithoutExtension(fullPath), id, minimumVersion, maximumVersion, requiredVersion) { this.FullPath = fullPath; this.Weight = 73; - this.Hash = SHA256.HashData(File.ReadAllBytes(fullPath)); } // TODO - this may not be the best way to do this. diff --git a/src/Compiler/Requirements/Requirements.cs b/src/Compiler/Requirements/Requirements.cs index 509097ce..718bf3cc 100644 --- a/src/Compiler/Requirements/Requirements.cs +++ b/src/Compiler/Requirements/Requirements.cs @@ -72,15 +72,15 @@ public abstract class Requirement : IComparable { /// This weight is used for the order when inserting the requirements. /// [JsonIgnore] - public uint Weight { get; protected set; } = 50; + public uint Weight { get; protected set; } = 50; /// /// Gets the hash of the requirement. /// /// This is implemented by the derived class. /// [JsonIgnore] - public byte[] Hash { get; protected set; } = []; + public virtual byte[] Hash { get; protected set; } = []; /// /// Used only for serialization purposes. diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index fe5d6c71..7840134b 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -1,22 +1,30 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Diagnostics.CodeAnalysis; +using System.Management.Automation.Language; using System.Text.RegularExpressions; using Compiler.Text.Updater; +using LanguageExt; using NLog; namespace Compiler.Text; -public partial class TextDocument(string[] lines) { +public partial class TextDocument([NotNull] string[] lines) { public readonly List Lines = new(lines); } -public class CompiledDocument(string[] lines) : TextDocument(lines) { +public sealed class CompiledDocument( + string[] lines, + ScriptBlockAst ast +) : TextDocument(lines) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public ScriptBlockAst Ast { get; private init; } = ast; + public string GetContent() => string.Join('\n', this.Lines); - public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) { + public static Fin FromBuilder(TextEditor builder, int indentBy = 0) { Logger.Trace($"Creating CompiledDocument from {builder}"); builder.AddEdit(() => new IndentUpdater(indentBy)); @@ -27,10 +35,21 @@ public static CompiledDocument FromBuilder(TextEditor builder, int indentBy = 0) foreach (var textUpdater in sortedUpdaters) { // Logger.Debug($"Applying updater {textUpdater} with priority {textUpdater.Priority}"); spanUpdates.ForEach(textUpdater.PushByUpdate); - textUpdater.Apply(ref lines).ToList().ForEach(spanUpdates.Add); + var updateResult = textUpdater.Apply(lines); + Logger.Debug($"Update result: {updateResult}"); + + updateResult.IfSucc(spanUpdates.AddRange); + if (updateResult.IsErr(out var err, out _)) { + Logger.Error($"Error while applying updater {textUpdater}: {err}"); + return err; + } } - return new CompiledDocument([.. lines]); + return AstHelper.GetAstReportingErrors( + string.Join('\n', lines), + None, + ["ModuleNotFoundDuringParse"] + ).AndThen(ast => new CompiledDocument([.. lines], ast)); } } @@ -67,13 +86,7 @@ public void AddPatternEdit( Regex closingPattern, UpdateOptions options, Func updater - ) => this.AddEdit(() => new PatternUpdater( - priority, - openingPattern, - closingPattern, - options, - updater - )); + ) => this.AddEdit(() => new PatternUpdater(priority, openingPattern, closingPattern, options, updater)); public void AddRegexEdit( Regex pattern, @@ -97,12 +110,7 @@ public void AddRegexEdit( Regex pattern, UpdateOptions options, Func updater - ) => this.AddEdit(() => new RegexUpdater( - priority, - pattern, - options, - updater - )); + ) => this.AddEdit(() => new RegexUpdater(priority, pattern, options, updater)); public void AddExactEdit( int startingIndex, @@ -110,7 +118,16 @@ public void AddExactEdit( int endingIndex, int endingColumn, Func updater - ) => this.AddExactEdit(50, startingIndex, startingColumn, endingIndex, endingColumn, updater); + ) => this.AddExactEdit(startingIndex, startingColumn, endingIndex, endingColumn, UpdateOptions.None, updater); + + public void AddExactEdit( + int startingIndex, + int startingColumn, + int endingIndex, + int endingColumn, + UpdateOptions options, + Func updater + ) => this.AddExactEdit(50, startingIndex, startingColumn, endingIndex, endingColumn, options, updater); public void AddExactEdit( uint priority, @@ -119,15 +136,7 @@ public void AddExactEdit( int endingIndex, int endingColumn, Func updater - ) => this.AddExactEdit( - priority, - startingIndex, - startingColumn, - endingIndex, - endingColumn, - UpdateOptions.None, - updater - ); + ) => this.AddExactEdit(priority, startingIndex, startingColumn, endingIndex, endingColumn, UpdateOptions.None, updater); public void AddExactEdit( uint priority, @@ -137,13 +146,5 @@ public void AddExactEdit( int endingColumn, UpdateOptions options, Func updater - ) => this.AddEdit(() => new ExactUpdater( - priority, - startingIndex, - startingColumn, - endingIndex, - endingColumn, - options, - updater - )); + ) => this.AddEdit(() => new ExactUpdater(priority, startingIndex, startingColumn, endingIndex, endingColumn, options, updater)); } diff --git a/src/Compiler/Text/Span.cs b/src/Compiler/Text/Span.cs index d9812866..5107cbc7 100644 --- a/src/Compiler/Text/Span.cs +++ b/src/Compiler/Text/Span.cs @@ -1,10 +1,12 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; using System.Management.Automation; using System.Text; -using JetBrains.Annotations; -using NLog; +using LanguageExt; +using QuikGraph.Algorithms.Search; namespace Compiler.Text; @@ -18,18 +20,71 @@ public enum UpdateOptions { InsertInline = 2 } -public class TextSpan( - [NonNegativeValue] int startingIndex, - [NonNegativeValue] int startingColumn, - [NonNegativeValue] int endingIndex, - [NonNegativeValue] int endingColumn -) { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); +public record TextSpan { + [NotNull, JetBrains.Annotations.NonNegativeValue] + public int StartingIndex { get; init; } + [NotNull, JetBrains.Annotations.NonNegativeValue] + public int StartingColumn { get; init; } + [NotNull, JetBrains.Annotations.NonNegativeValue] + public int EndingIndex { get; init; } + [NotNull, JetBrains.Annotations.NonNegativeValue] + public int EndingColumn { get; init; } - [ValidateRange(0, int.MaxValue)] public int StartingIndex = startingIndex; - [ValidateRange(0, int.MaxValue)] public int StartingColumn = startingColumn; - [ValidateRange(0, int.MaxValue)] public int EndingIndex = endingIndex; - [ValidateRange(0, int.MaxValue)] public int EndingColumn = endingColumn; + /// + /// Initialises a new instance of the TextSpan class allowing for logical spans of text to be defined. + /// + /// + /// + /// + /// + /// + /// Thrown if any of the parameters are null. + /// + /// + /// Thrown if any of the parameters are negative, + /// or if the starting index is greater than the ending index, + /// or if the starting index is equal to the ending index and the starting column is greater than the ending column. + /// + private TextSpan( + [NotNull, JetBrains.Annotations.NonNegativeValue] int startingIndex, + [NotNull, JetBrains.Annotations.NonNegativeValue] int startingColumn, + [NotNull, JetBrains.Annotations.NonNegativeValue] int endingIndex, + [NotNull, JetBrains.Annotations.NonNegativeValue] int endingColumn + ) { + ArgumentNullException.ThrowIfNull(startingIndex); + ArgumentNullException.ThrowIfNull(startingColumn); + ArgumentNullException.ThrowIfNull(endingIndex); + ArgumentNullException.ThrowIfNull(endingColumn); + + ArgumentOutOfRangeException.ThrowIfNegative(startingIndex); + ArgumentOutOfRangeException.ThrowIfNegative(startingColumn); + ArgumentOutOfRangeException.ThrowIfNegative(endingIndex); + ArgumentOutOfRangeException.ThrowIfNegative(endingColumn); + + ArgumentOutOfRangeException.ThrowIfGreaterThan(startingIndex, endingIndex); + if (startingIndex == endingIndex) ArgumentOutOfRangeException.ThrowIfGreaterThan(startingColumn, endingColumn); + + this.StartingIndex = startingIndex; + this.StartingColumn = startingColumn; + this.EndingIndex = endingIndex; + this.EndingColumn = endingColumn; + } + + /// + /// Creates a new Instance of the TextSpan class, catching any exceptions that may be thrown. + /// + public static Fin New( + [NotNull, JetBrains.Annotations.NonNegativeValue] int startingIndex, + [NotNull, JetBrains.Annotations.NonNegativeValue] int startingColumn, + [NotNull, JetBrains.Annotations.NonNegativeValue] int endingIndex, + [NotNull, JetBrains.Annotations.NonNegativeValue] int endingColumn + ) { + try { + return new TextSpan(startingIndex, startingColumn, endingIndex, endingColumn); + } catch (Exception err) when (err is ArgumentNullException or ArgumentOutOfRangeException) { + return FinFail(err); + } + } public static TextSpan WrappingEntireDocument(TextDocument document) => WrappingEntireDocument([.. document.Lines]); @@ -60,6 +115,7 @@ public bool Contains(int index, int column) { public string GetContent(TextDocument document) => this.GetContent([.. document.Lines]); [Pure] + [return: NotNull] public string GetContent(string[] lines) { if (lines.Length == 0) return string.Empty; @@ -102,10 +158,14 @@ public string GetContent(string[] lines) { /// The number of lines added or removed by the update. /// public int SetContent( - ref List lines, - UpdateOptions options, - string[] content + [NotNull] List lines, + [NotNull] UpdateOptions options, + [NotNull] string[] content ) { + ArgumentNullException.ThrowIfNull(lines); + ArgumentNullException.ThrowIfNull(options); + ArgumentNullException.ThrowIfNull(content); + if (this.StartingIndex < 0 || this.StartingIndex >= lines.Count) { throw new ArgumentOutOfRangeException(nameof(lines), $"Starting index {this.StartingIndex} is out of range for document with {lines.Count} lines"); } @@ -159,13 +219,13 @@ string[] content lineContent.Append(firstLineBefore); } - if (content.Length > 1) { + if (content.Length > 0) { lineContent.Append(content[0]); - lines.InsertRange(this.StartingIndex, content.Skip(1)); - offset += content.Length - 1; - } else { - lineContent.Append(content[0]); + if (content.Length > 1) { + lines.InsertRange(this.StartingIndex, content.Skip(1)); + offset += content.Length - 1; + } } if (!string.IsNullOrEmpty(lastLineAfter)) { @@ -200,18 +260,7 @@ string[] content return offset; } - public int RemoveContent(ref List lines) => this.SetContent(ref lines, UpdateOptions.None, []); - - public override bool Equals(object? obj) { - if (obj is TextSpan span) { - return span.StartingIndex == this.StartingIndex && - span.StartingColumn == this.StartingColumn && - span.EndingIndex == this.EndingIndex && - span.EndingColumn == this.EndingColumn; - } - - return false; - } + public int RemoveContent(List lines) => this.SetContent(lines, UpdateOptions.None, []); public override int GetHashCode() => HashCode.Combine(this.StartingIndex, this.StartingColumn, this.EndingIndex, this.EndingColumn); diff --git a/src/Compiler/Text/Updater.cs b/src/Compiler/Text/Updater.cs index 4ba7466f..ca9f27a7 100644 --- a/src/Compiler/Text/Updater.cs +++ b/src/Compiler/Text/Updater.cs @@ -3,12 +3,14 @@ using System.Diagnostics.CodeAnalysis; using Compiler.Text.Updater; +using LanguageExt; namespace Compiler.Text; public record SpanUpdateInfo( - TextSpan TextSpan, - int Offset) { + [NotNull] TextSpan TextSpan, + [NotNull] int Offset +) { public override string ToString() => $"{nameof(PatternUpdater)}({this.TextSpan} +- {this.Offset})"; } @@ -24,7 +26,7 @@ public abstract class TextSpanUpdater(uint priority = 50) { /// /// The number of lines changed by the update. /// - public abstract SpanUpdateInfo[] Apply(ref List lines); + public abstract Fin Apply(List lines); /// /// Use informaiton from another update to possibly update this ones variables. diff --git a/src/Compiler/Text/Updater/AstUpdater.cs b/src/Compiler/Text/Updater/AstUpdater.cs index f3bde33f..8d916ce6 100644 --- a/src/Compiler/Text/Updater/AstUpdater.cs +++ b/src/Compiler/Text/Updater/AstUpdater.cs @@ -2,6 +2,7 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Management.Automation.Language; +using LanguageExt; namespace Compiler.Text.Updater; @@ -9,44 +10,49 @@ public class AstUpdater( uint priority, Func astPredicate, Func updater, - var ast = AstHelper.GetAstReportingErrors(string.Join('\n', lines), "AstUpdater", []); UpdateOptions options) : TextSpanUpdater(priority) { - public override SpanUpdateInfo[] Apply(ref List lines) { - if (ast == null || string.IsNullOrWhiteSpace(ast.Extent.Text)) return []; - - IEnumerable nodesToUpdate; - if (options.HasFlag(UpdateOptions.MatchEntireDocument)) { - nodesToUpdate = ast.FindAll(astPredicate, true); - if (!nodesToUpdate.Any()) return []; - } else { - var node = ast.Find(astPredicate, true); - if (node == null) return []; - nodesToUpdate = [node]; - } - - var offset = 0; - var updateSpans = new List(); - foreach (var node in nodesToUpdate) { - var thisOffset = 0; - var extent = node.Extent; - var span = new TextSpan( - extent.StartLineNumber - 1, - extent.StartColumnNumber - 1, - extent.EndLineNumber - 1, - extent.EndColumnNumber - 1 - ); - - var isMultiLine = span.StartingIndex != span.EndingIndex; - var newContent = updater(node); - ArgumentNullException.ThrowIfNull(newContent); - - // Remove the entire line if the replacement is empty and the match is the entire line. - if (newContent == null && span.StartingColumn == 0 && span.EndingColumn == lines[span.StartingIndex].Length) { thisOffset += span.RemoveContent(ref lines); } else { thisOffset += span.SetContent(ref lines, options, newContent!); } - - updateSpans.Add(new SpanUpdateInfo(span, thisOffset)); - offset += thisOffset; - } - - return [.. updateSpans]; - } + public override Fin Apply(List lines) => AstHelper.GetAstReportingErrors(string.Join('\n', lines), Some("AstUpdater"), ["ModuleNotFoundDuringParse"]) + .AndThen(ast => { + IEnumerable nodesToUpdate; + if (options.HasFlag(UpdateOptions.MatchEntireDocument)) { + nodesToUpdate = ast.FindAll(astPredicate, true); + if (!nodesToUpdate.Any()) return FinSucc([]); + } else { + var node = ast.Find(astPredicate, true); + if (node == null) return FinSucc([]); + nodesToUpdate = [node]; + } + + var offset = 0; + var updateSpans = new List(); + foreach (var node in nodesToUpdate) { + var thisOffset = 0; + var extent = node.Extent; + var spanResult = TextSpan.New( + extent.StartLineNumber - 1, + extent.StartColumnNumber - 1, + extent.EndLineNumber - 1, + extent.EndColumnNumber - 1 + ); + if (spanResult.IsErr(out var err, out var span)) { + return FinFail(err); + } + + var isMultiLine = span.StartingIndex != span.EndingIndex; + var newContent = updater(node); + ArgumentNullException.ThrowIfNull(newContent); + + // Remove the entire line if the replacement is empty and the match is the entire line. + if (newContent == null && span.StartingColumn == 0 && span.EndingColumn == lines[span.StartingIndex].Length) { + thisOffset += span.RemoveContent(lines); + } else { + thisOffset += span.SetContent(lines, options, newContent!); + } + + updateSpans.Add(new SpanUpdateInfo(span, thisOffset)); + offset += thisOffset; + } + + return updateSpans.ToArray(); + }); } diff --git a/src/Compiler/Text/Updater/ExactUpdater.cs b/src/Compiler/Text/Updater/ExactUpdater.cs index 36f74095..3cca2e30 100644 --- a/src/Compiler/Text/Updater/ExactUpdater.cs +++ b/src/Compiler/Text/Updater/ExactUpdater.cs @@ -2,95 +2,101 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Diagnostics.CodeAnalysis; +using LanguageExt; using NLog; namespace Compiler.Text.Updater; -public class ExactUpdater( - uint priority, - int startingIndex, - int startingColumn, - int endingIndex, - int endingColumn, - UpdateOptions options, - Func updater -) : TextSpanUpdater(priority) { +public class ExactUpdater : TextSpanUpdater { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public Func Updater = updater; - public TextSpan Span { get; } = new TextSpan(startingIndex, startingColumn, endingIndex, endingColumn); - - public override SpanUpdateInfo[] Apply([NotNull] ref List lines) { - ArgumentNullException.ThrowIfNull(lines); - - if (this.Span.StartingIndex < 0 || this.Span.EndingIndex >= lines.Count) { - return []; - } - - if (this.Span.StartingIndex > this.Span.EndingIndex) { - Logger.Error($"Starting index must be less than ending index, got {this.Span.StartingIndex} and {this.Span.EndingIndex}."); - return []; - } + private readonly Func Updater; + + private readonly UpdateOptions UpdateOptions; + + public TextSpan Span; + + /// + /// Creates a new instance. + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// Thrown if the starting column is greater than the ending column and the starting index is the same as the ending index. + /// + public ExactUpdater( + [NotNull] uint priority, + [NotNull] int startingIndex, + [NotNull] int startingColumn, + [NotNull] int endingIndex, + [NotNull] int endingColumn, + [NotNull] UpdateOptions options, + [NotNull] Func updater + ) : base(priority) { + this.Updater = updater; + this.UpdateOptions = options; + this.Span = TextSpan.New(startingIndex, startingColumn, endingIndex, endingColumn).ThrowIfFail(); if (this.Span.StartingIndex == this.Span.EndingIndex && this.Span.StartingColumn > this.Span.EndingColumn) { - Logger.Error($"Starting column must be less than ending column, got {this.Span.StartingColumn} and {this.Span.EndingColumn}."); - return []; - } - - switch (lines) { - case var l when l.Count == 0: - Logger.Error("Document lines must not be null."); - return []; - case var l when l.Count <= this.Span.StartingIndex: - Logger.Error($"Starting index must be less than the number of lines, got index {this.Span.StartingIndex} for length {l.Count}."); - return []; - case var l when l.Count <= this.Span.EndingIndex: - Logger.Error($"Ending index must be less than the number of lines, got index {this.Span.EndingIndex} for length {l.Count}."); - return []; + throw new ArgumentException($"Starting column must be less than ending column, got {this.Span.StartingColumn} and {this.Span.EndingColumn}."); } - - var startingLine = lines[this.Span.StartingIndex]; - var endingLine = lines[this.Span.EndingIndex]; - switch ((startingLine, endingLine)) { - case var (start, _) when this.Span.StartingColumn > start.Length: - Logger.Error($"Starting column must be less than the length of the line, got index {this.Span.StartingColumn} for length {start.Length}."); - return []; - case var (_, end) when this.Span.EndingColumn > end.Length: - Logger.Error($"Ending column must be less than the length of the line, got index {this.Span.EndingColumn} for length {end.Length}."); - return []; - case var _ when this.Span.StartingIndex == this.Span.EndingIndex && this.Span.StartingColumn > this.Span.EndingColumn: - Logger.Error($"Starting column must be less than ending column, got index {this.Span.StartingColumn} for length {this.Span.EndingColumn}."); - return []; - } - - string[] newLines; - int offset; - if (this.Span.StartingIndex == this.Span.EndingIndex) { - var updatingLine = lines[this.Span.StartingIndex][this.Span.StartingColumn..this.Span.EndingColumn]; - newLines = this.Updater([updatingLine]); - offset = this.Span.SetContent(ref lines, options, newLines); - } else { - var updatingLines = lines.Skip(this.Span.StartingIndex).Take(this.Span.EndingIndex - this.Span.StartingIndex + 1).ToArray(); - // Trim the starting and ending lines to the correct columns. - updatingLines[0] = lines[this.Span.StartingIndex][this.Span.StartingColumn..]; - updatingLines[^1] = lines[this.Span.EndingIndex][..this.Span.EndingColumn]; - - newLines = this.Updater(updatingLines); - offset = this.Span.SetContent(ref lines, options, newLines); - } - - return [new SpanUpdateInfo(this.Span, offset)]; } + public override Fin Apply([NotNull] List lines) => lines.AsOption() + .FailIf( + l => l.Count - 1 < this.Span.StartingIndex || this.Span.EndingIndex > l.Count - 1, + l => Error.New($"Span indexes must be within the bounds of the document ({l.Count}), got {this.Span.StartingIndex} and {this.Span.EndingIndex}.")) + .FailIfOpt( + l => this.Span.StartingIndex > this.Span.EndingIndex, + l => Error.New($"Starting index must be less than ending index, got {this.Span.StartingIndex} and {this.Span.EndingIndex}.")) + .FailIfOpt( + l => this.Span.StartingColumn > l[this.Span.StartingIndex].Length, + l => Error.New($"Starting column must be less than the length of the line ({l[this.Span.StartingIndex].Length - 1}), got index {this.Span.StartingColumn}.") + ) + .FailIfOpt( + l => this.Span.EndingColumn > l[this.Span.EndingIndex].Length, + l => Error.New($"Ending column must be less than the length of the line ({l[this.Span.EndingIndex].Length - 1}), got index {this.Span.EndingColumn}.") + ) + .AndThen(opt => opt.UnwrapOr([])) + .AndThen, SpanUpdateInfo[]>(lines => { + string[] newLines; + int offset; + if (this.Span.StartingIndex == this.Span.EndingIndex) { + var updatingLine = lines[this.Span.StartingIndex][this.Span.StartingColumn..this.Span.EndingColumn]; + newLines = this.Updater([updatingLine]); + offset = this.Span.SetContent(lines, this.UpdateOptions, newLines); + } else { + var updatingLines = lines.Skip(this.Span.StartingIndex).Take(this.Span.EndingIndex - this.Span.StartingIndex + 1).ToArray(); + // Trim the starting and ending lines to the correct columns. + updatingLines[0] = lines[this.Span.StartingIndex][this.Span.StartingColumn..]; + updatingLines[^1] = lines[this.Span.EndingIndex][..this.Span.EndingColumn]; + + newLines = this.Updater(updatingLines); + offset = this.Span.SetContent(lines, this.UpdateOptions, newLines); + } + + return [new SpanUpdateInfo(this.Span, offset)]; + }); + public override void PushByUpdate(SpanUpdateInfo updateInfo) { if (this.Span.StartingIndex >= updateInfo.TextSpan.StartingIndex) { - this.Span.StartingIndex += updateInfo.Offset; + this.Span = this.Span with { + StartingIndex = this.Span.StartingIndex + updateInfo.Offset + }; } if (this.Span.EndingIndex >= updateInfo.TextSpan.StartingIndex) { - this.Span.EndingIndex += updateInfo.Offset; + this.Span = this.Span with { + EndingIndex = this.Span.EndingIndex + updateInfo.Offset + }; } } - public override string ToString() => $"{nameof(ExactUpdater)}({startingIndex}[{startingColumn}..]..{endingIndex}[..{endingColumn}])"; + public override string ToString() => + $"{nameof(ExactUpdater)}({this.Span.StartingIndex}[{this.Span.StartingColumn}..]..{this.Span.EndingIndex}[..{this.Span.EndingColumn}])"; } diff --git a/src/Compiler/Text/Updater/IndentUpdater.cs b/src/Compiler/Text/Updater/IndentUpdater.cs index 6c2a6c4a..6077e4a6 100644 --- a/src/Compiler/Text/Updater/IndentUpdater.cs +++ b/src/Compiler/Text/Updater/IndentUpdater.cs @@ -1,12 +1,14 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using LanguageExt; + namespace Compiler.Text.Updater; public class IndentUpdater(int indentBy) : TextSpanUpdater(70) { private readonly int IndentBy = indentBy; - public override SpanUpdateInfo[] Apply(ref List lines) { + public override Fin Apply(List lines) { var updateSpans = new List(); var indentString = new string(' ', this.IndentBy); for (var i = 0; i < lines.Count; i++) { @@ -16,9 +18,14 @@ public override SpanUpdateInfo[] Apply(ref List lines) { } lines[i] = $"{indentString}{lines[i]}"; - updateSpans.Add(new SpanUpdateInfo(new(i, i, 0, 0), this.IndentBy)); + var spanResult = TextSpan.New(i, 0, i, 0); + if (spanResult.IsErr(out var err, out var span)) { + return FinFail(err); + } + + updateSpans.Add(new SpanUpdateInfo(span, this.IndentBy)); } - return [.. updateSpans]; + return FinSucc(updateSpans.ToArray()); } } diff --git a/src/Compiler/Text/Updater/PatternUpdater.cs b/src/Compiler/Text/Updater/PatternUpdater.cs index cf2615d7..85140f27 100644 --- a/src/Compiler/Text/Updater/PatternUpdater.cs +++ b/src/Compiler/Text/Updater/PatternUpdater.cs @@ -21,7 +21,7 @@ Func updater public Regex StartingPattern { get; } = startingPattern; public Regex EndingPattern { get; } = endingPattern; - public override SpanUpdateInfo[] Apply(ref List lines) { + public override LanguageExt.Fin Apply(List lines) { var spanUpdateInfo = new List(); var skipRanges = new HashSet(); var offset = 0; @@ -32,23 +32,21 @@ public override SpanUpdateInfo[] Apply(ref List lines) { break; } - var span = new TextSpan( - startIndex, - 0, - endIndex, - lines[endIndex].Length - ); + var spanResult = TextSpan.New(startIndex, 0, endIndex, lines[endIndex].Length); + if (spanResult.IsErr(out var err, out var span)) { + return FinFail(err); + } var updatingLines = lines[startIndex..(endIndex + 1)].ToArray(); var newLines = this.Updater(updatingLines); - var thisOffset = span.SetContent(ref lines, options, newLines); + var thisOffset = span.SetContent(lines, options, newLines); offset += thisOffset; skipRanges.Add(new Range(startIndex, endIndex)); spanUpdateInfo.Add(new SpanUpdateInfo(span, thisOffset)); } - return [.. spanUpdateInfo]; + return FinSucc(spanUpdateInfo.ToArray()); } private (int, int) FindStartToEndBlock( diff --git a/src/Compiler/Text/Updater/RegexUpdater.cs b/src/Compiler/Text/Updater/RegexUpdater.cs index 144e31d1..29f8639e 100644 --- a/src/Compiler/Text/Updater/RegexUpdater.cs +++ b/src/Compiler/Text/Updater/RegexUpdater.cs @@ -1,7 +1,9 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Diagnostics.CodeAnalysis; using System.Text.RegularExpressions; +using LanguageExt; using NLog; namespace Compiler.Text.Updater; @@ -29,18 +31,22 @@ public Regex Pattern { /// Applies the specified pattern to the given text document and returns an array of objects. /// /// The text document to apply the pattern to. - /// An array of objects representing the updates made to the document. - public override SpanUpdateInfo[] Apply(ref List lines) { - var spanUpdateInfo = new List(); - var offset = 0; + /// + /// An array of objects representing the updates made to the document. + /// + [return: NotNull] + public override Fin Apply([NotNull] List lines) { + ArgumentNullException.ThrowIfNull(lines); var multilinedContent = string.Join('\n', lines); var matches = this.Pattern.Matches(multilinedContent); if (matches.Count == 0) { - return []; + return FinSucc([]); } + var spanUpdateInfo = new List(); + var offset = 0; foreach (Match match in matches) { var thisOffset = 0; var multilineEndingIndex = match.Index + match.Length; @@ -56,21 +62,63 @@ public override SpanUpdateInfo[] Apply(ref List lines) { ? multilineEndingIndex - (multilinedContent[..multilineEndingIndex].LastIndexOf('\n') + 1) : startingColumn + match.Length; - var span = new TextSpan( - startingLineIndex, - startingColumn, - endingLineIndex, - endingColumn - ); + var spanResult = TextSpan.New(startingLineIndex, startingColumn, endingLineIndex, endingColumn); + if (spanResult.IsErr(out var spanError, out var span)) { + return spanError; + } var newContent = this.Updater(match); + // FIXME These shouldn't happen and are likely a bug in the updater. + if (startingLineIndex > lines.Count) { + return FinFail(new ArgumentOutOfRangeException( + nameof(lines), + startingLineIndex, + "Starting line index is greater than the number of lines in the document." + )); + } + if (endingLineIndex > lines.Count) { + return FinFail(new ArgumentOutOfRangeException( + nameof(lines), + endingLineIndex, + "Ending line index is greater than the number of lines in the document." + )); + } + if (startingColumn > lines[startingLineIndex].Length) { + return FinFail(new ArgumentOutOfRangeException( + nameof(lines), + startingColumn, + "Starting column is greater than the length of the line." + )); + } + if (endingColumn > lines[endingLineIndex].Length) { + return FinFail(new ArgumentOutOfRangeException( + nameof(lines), + endingColumn, + "Ending column is greater than the length of the line." + )); + } + if (startingLineIndex > endingLineIndex) { + return FinFail(new ArgumentOutOfRangeException( + nameof(lines), + startingLineIndex, + "Starting line index is greater than the ending line index." + )); + } + if (startingLineIndex == endingLineIndex && startingColumn > endingColumn) { + return FinFail(new ArgumentOutOfRangeException( + nameof(lines), + startingColumn, + "Starting column is greater than the ending column." + )); + } + // Remove the entire line if the replacement is empty and the match is the entire line. if (newContent == null && startingColumn == 0 && match.Length == lines[startingLineIndex].Length) { - thisOffset += span.RemoveContent(ref lines); + thisOffset += span.RemoveContent(lines); } else { var newLines = newContent == null ? [] : isMultiLine ? newContent.Split('\n') : [newContent]; - thisOffset += span.SetContent(ref lines, options, newLines); + thisOffset += span.SetContent(lines, options, newLines); if (isMultiLine) { thisOffset += newLines.Length - 1; } @@ -80,7 +128,7 @@ public override SpanUpdateInfo[] Apply(ref List lines) { offset += thisOffset; } - return [.. spanUpdateInfo]; + return FinSucc(spanUpdateInfo.ToArray()); } public override string ToString() => $"{nameof(RegexUpdater)}({this.Pattern})"; diff --git a/src/Compiler/Utils.cs b/src/Compiler/Utils.cs new file mode 100644 index 00000000..f3d885f0 --- /dev/null +++ b/src/Compiler/Utils.cs @@ -0,0 +1,297 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using System.Runtime.CompilerServices; +using LanguageExt; +using LanguageExt.UnsafeValueAccess; + +namespace Compiler; + +/// +/// Helper methods to make it a little more rust-like. +/// +public static class Utils { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option AsOption(this T? value) where T : class => + value == null ? Option.None : Option.Some(value); + + #region AndThen & AndThenTry + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option AndThen( + [NotNull] this Option option, + [NotNull] Func func + ) => option.Map(func); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option AndThen( + [NotNull] this Option option, + [NotNull] Func> func + ) => option.Bind(func); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option AndThenTry( + [NotNull] this Option option, + [NotNull] Func func + ) => option.Bind(value => { + try { + return Some(func(value)); + } catch { + return None; + } + }); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option AndThenTry( + [NotNull] this Option option, + [NotNull] Func> func + ) => option.Bind(value => { + try { + return func(value); + } catch { + return None; + } + }); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThen( + [NotNull] this Option option, + [NotNull] Func> func, + [NotNull] Func error + ) => option.Map(func).UnwrapOrElse(() => Fin.Fail(error())); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThen( + [NotNull] this Option option, + [NotNull] Func> func + ) => option.AndThen(func, () => Error.New("Option was None")); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThenTry( + [NotNull] this Option option, + [NotNull] Func> func, + [NotNull] Func error + ) => option.AndThenTry(value => { + try { + return func(value); + } catch { + return FinFail(error(value)); + } + }); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThenTry( + [NotNull] this Option option, + [NotNull] Func> func + ) => option.AndThenTry(func, _ => Error.New("An error occurred while trying to map the option")); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThen( + [NotNull] this Fin fin, + [NotNull] Func func + ) => fin.Map(func); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThenTry( + [NotNull] this Fin fin, + [NotNull] Func func + ) => fin.Bind(value => { + try { + return func(value); + } catch (Exception err) { + return FinFail(err); + } + }); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThen( + [NotNull] this Fin fin, + [NotNull] Func> func + ) => fin.Bind(func); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThenTry( + [NotNull] this Fin fin, + [NotNull] Func> func + ) => fin.Bind(value => { + try { + return func(value); + } catch (Exception err) { + return FinFail(err); + } + }); + + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThenTry( + [NotNull] this Fin fin, + [NotNull] Func> func, + [NotNull] Func error + ) => fin.Bind(value => { + try { + return func(value); + } catch (Exception err) { + return FinFail(error(value, err)); + } + }); + #endregion + + #region Tap + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option Tap(this Option option, Action action) => + option.Do(action); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option TapNone(this Option option, Action action) { + if (option.IsNone) action(); + return option; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin Tap(this Fin fin, Action action) { + fin.IfSucc(action); + return fin; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin> TapOpt(this Fin> fin, Action action) => + fin.Tap(option => option.IfSome(action)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin TapFail(this Fin fin, Action action) { + fin.IfFail(action); + return fin; + } + #endregion + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin> FailIf(this Option option, Predicate predicate, Func error) => option.Match( + Some: value => predicate(value) ? Fin>.Fail(error(value)) : Fin>.Succ(Some(value)), + None: Fin>.Succ(None) + ); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin> FailIf(this Option option, Predicate predicate, Error error) => option.Match( + Some: value => predicate(value) ? Fin>.Fail(error) : Fin>.Succ(Some(value)), + None: Fin>.Succ(None) + ); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin FailIf(this Fin fin, Predicate predicate, Func error) => + fin.Bind(value => predicate(value) ? Fin.Fail(error(value)) : Fin.Succ(value)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin FailIf(this Fin fin, Predicate predicate, Error error) => + fin.Bind(value => predicate(value) ? Fin.Fail(error) : Fin.Succ(value)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin> FailIfOpt(this Fin> fin, Predicate predicate, Func error) => fin.Bind(option => option.Match( + Some: value => predicate(value) ? Fin>.Fail(error(value)) : Fin>.Succ(Some(value)), + None: Fin>.Succ(None) + )); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin> FailIfOpt(this Fin> fin, Predicate predicate, Error error) => fin.Bind(option => option.Match( + Some: value => predicate(value) ? Fin>.Fail(error) : Fin>.Succ(Some(value)), + None: Fin>.Succ(None) + )); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin> BindOption(this Fin> fin, Func>> func) => fin.Bind(option => option.Match( + Some: func, + None: Fin>.Succ(None) + )); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option OrElse(this Option option, Func> other) => option.BiBind( + Some: _ => option, + None: () => other() + ); + + #region Unwrap + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T Unwrap(this Option option) where T : notnull => option.ValueUnsafe()!; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T UnwrapOr(this Option option, T defaultValue) => option.Match( + Some: value => value, + None: defaultValue + ); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T UnwrapOrElse(this Option option, Func defaultValue) => option.Match( + Some: value => value, + None: defaultValue() + ); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T Unwrap(this Fin fin) => fin.ThrowIfFail(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T UnwrapOr(this Fin fin, T defaultValue) => fin.Match( + Succ: value => value, + Fail: _ => defaultValue + ); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T UnwrapOrElse(this Fin fin, Func defaultValue) => fin.Match( + Succ: value => value, + Fail: error => defaultValue() + ); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Error UnwrapError(this Fin fin) => (Error)fin; + #endregion + + #region Is Decontruct bools + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsSome( + this Option option, + [NotNullWhen(true)] out T? value + ) where T : notnull { + if (option.IsSome) { + value = option.ValueUnsafe()!; + return true; + } + + value = default; + return false; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsOk( + this Fin fin, + [NotNullWhen(true)] out T? value, + [NotNullWhen(false)] out Error? error +) { + if (fin.IsSucc) { + value = (T)fin!; // This is safe because we know it's a success + error = default; + return true; + } + + error = (Error)fin!; // This is safe because we know it's a failure + value = default; + return false; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsErr( + this Fin fin, + [NotNullWhen(true)] out Error? error, + [NotNullWhen(false)] out T? value + ) => !fin.IsOk(out value, out error); + #endregion +} diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 525edc90..d465878f 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -8,11 +8,17 @@ "resolved": "2.9.1", "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" }, - "Microsoft.NET.ILLink.Tasks": { + "Extended.Collections": { "type": "Direct", - "requested": "[8.0.7, )", - "resolved": "8.0.7", - "contentHash": "iI52ptEKby2ymQ6B7h4TWbFmm85T4VvLgc/HvS45Yr3lgi4IIFbQtjON3bQbX/Vc94jXNSLvrDOp5Kh7SJyFYQ==" + "requested": "[1.1.1, )", + "resolved": "1.1.1", + "contentHash": "PvLjUHQeX6MwjF34eQhU6EE1fCRC5zYcX/u10n+ZUkzgv+hRtZSHj1JzAg7AQ5a6iEcLZ2yCb5VBDzdupErDNQ==" + }, + "LanguageExt.Core": { + "type": "Direct", + "requested": "[5.0.0-beta-07, )", + "resolved": "5.0.0-beta-07", + "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, "Microsoft.PowerShell.SDK": { "type": "Direct", @@ -89,6 +95,15 @@ "resolved": "2.5.0", "contentHash": "sG+mrPpXwxlXknRK5VqWUGiOmDACa9X+3ftlkQIMgOZUqxVOQSe0+HIU9PTjwqazy0pqSf8MPDXYFGl0GYWcKw==" }, + "QuikGraph.Graphviz": { + "type": "Direct", + "requested": "[2.5.0, )", + "resolved": "2.5.0", + "contentHash": "pCKpErtHGxUi72OT+2aIg1pdHdUqpqEM5J/i9rmVsEVDE4X0xb1HBPWdxv/FLZmbBjk0ZogZXZttUL3CnAPpNw==", + "dependencies": { + "QuikGraph": "2.5.0" + } + }, "System.Management.Automation": { "type": "Direct", "requested": "[7.4.2, )", @@ -857,6 +872,360 @@ "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } }, + "net8.0/linux-x64": { + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.4", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", + "Microsoft.PowerShell.Commands.Management": "7.4.2", + "Microsoft.PowerShell.Commands.Utility": "7.4.2", + "Microsoft.PowerShell.ConsoleHost": "7.4.2", + "Microsoft.PowerShell.Security": "7.4.2", + "Microsoft.WSMan.Management": "7.4.2", + "Microsoft.Windows.Compatibility": "8.0.4", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.2", + "System.Net.Http.WinHttpHandler": "8.0.0", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.4", + "System.Management.Automation": "7.4.2", + "System.Text.Json": "6.0.9", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.2", + "System.Management.Automation": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } + }, "net8.0/win-x64": { "Microsoft.PowerShell.SDK": { "type": "Direct", diff --git a/tests/Compiler/AstHelpersTests.cs b/tests/Compiler/AstHelpersTests.cs index 371d3622..eef5df6f 100644 --- a/tests/Compiler/AstHelpersTests.cs +++ b/tests/Compiler/AstHelpersTests.cs @@ -1,43 +1,36 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using Compiler.Analyser; using System.Collections; using System.Management.Automation.Language; namespace Compiler.Test; -public class AstHelperTests -{ +public class AstHelperTests { [TestCaseSource(typeof(TestData), nameof(TestData.ChildAndRoot))] public void FindRoot_ReturnsRootAst( Ast parentAst, Ast childAst, bool _, - bool __) - { - Assert.That(AstHelper.FindRoot(childAst), Is.EqualTo(parentAst)); - } + bool __) => Assert.That(AstHelper.FindRoot(childAst), Is.EqualTo(parentAst)); [TestCaseSource(typeof(TestData), nameof(TestData.ChildAndRoot))] public void FindClosestParamBlock_ReturnsParamBlock( Ast _, Ast childAst, bool hasParamBlock, - bool attributePresentOnClosestParamBlock) - { - if (!hasParamBlock) - { + bool attributePresentOnClosestParamBlock) { + if (!hasParamBlock) { Assert.That(AstHelper.FindClosestParamBlock(childAst), Is.Null); - } - else - { + } else { var result = AstHelper.FindClosestParamBlock(childAst); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(result, Is.Not.Null); Assert.That(result, Is.TypeOf()); - if (attributePresentOnClosestParamBlock) - { + if (attributePresentOnClosestParamBlock) { Assert.That(result?.Attributes, Is.Not.Null); Assert.That(result?.Attributes, Has.Count.EqualTo(1)); @@ -51,14 +44,14 @@ public void FindClosestParamBlock_ReturnsParamBlock( } } -static class TestData -{ +file static class TestData { public static string USING_STATEMENTS = /*ps1*/ $$""" using assembly '{{typeof(AstHelper).Assembly.Location}}' + using namespace Compiler.Analyser """; public static string ATTRIBUTE = /*ps1*/ """ - [SuppressAnalyserAttribute('UseOfUnknownFunction', 'unknown-function', 'Justification')] + [SuppressAnalyser('UseOfUnknownFunction', 'unknown-function', 'Justification')] """; public static string NO_PARAM_GLOBAL = /*ps1*/ $$""" @@ -166,10 +159,8 @@ function Test-Function { public static Ast ATTRIBUTE_NESTED_NO_PARAM_AST = Parser.ParseInput(ATTRIBUTE_NESTED_NO_PARAM, out _, out _); public static Ast ATTRIBUTE_NESTED_PARAM_AST = Parser.ParseInput(ATTRIBUTE_NESTED_PARAM, out _, out _); - public static IEnumerable ChildAndRoot - { - get - { + public static IEnumerable ChildAndRoot { + get { var commandFinder = new Func(ast => ast is CommandAst commandAst && commandAst.GetCommandName() == "unknown-function"); yield return new TestCaseData( diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index be54fe2c..d4ef9c4f 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -1,12 +1,13 @@ + - net8.0 enable enable - false true + true + win-x64;linux-x64 diff --git a/tests/Compiler/Compiler.cs b/tests/Compiler/Compiler.cs index 06c43d8e..facdbf9d 100644 --- a/tests/Compiler/Compiler.cs +++ b/tests/Compiler/Compiler.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using Compiler; [SetUpFixture] @@ -6,14 +9,9 @@ "CA1050:Declare types in namespaces", Justification = "Required for NUnit to run no matter the namespace." )] -public class GlobalSetup -{ +public class GlobalSetup { [OneTimeSetUp] - public static void Setup() - { - Program.SetupLogger(new Program.Options() - { - Verbosity = 3 - }); - } + public static void Setup() => Program.SetupLogger(new Program.Options() { + Verbosity = 3 + }); } diff --git a/tests/Compiler/GlobalSuppressions.cs b/tests/Compiler/GlobalSuppressions.cs new file mode 100644 index 00000000..5391838b --- /dev/null +++ b/tests/Compiler/GlobalSuppressions.cs @@ -0,0 +1,12 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage( + "Naming", + "CA1707:Identifiers should not contain underscores", + Justification = "Naming tests is easier this way", + Scope = "namespaceanddescendants", + Target = "~N:Compiler.Test" +)] diff --git a/tests/Compiler/Module/Compiled/Compiled.cs b/tests/Compiler/Module/Compiled/Compiled.cs index 45192397..891ec10f 100644 --- a/tests/Compiler/Module/Compiled/Compiled.cs +++ b/tests/Compiler/Module/Compiled/Compiled.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using static Compiler.Module.Compiled.Compiled; using Compiler.Requirements; using System.Collections; @@ -5,49 +8,40 @@ namespace Compiler.Test.Module.Compiled; [TestFixture] -public class CompiledTests -{ +public class CompiledTests { [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementHashData)), Repeat(10)] public void AddRequirementHashBytes_AlwaysSameResult( byte[] hashableBytes, RequirementGroup requirementGroup - ) - { + ) { var random = new Random(); List bytesList; var hashResults = new List(); - do - { + do { bytesList = new List(hashableBytes); AddRequirementHashBytes(bytesList, requirementGroup); hashResults.Add([.. hashableBytes]); } while (hashResults.Count < random.Next(2, 5)); var firstResult = hashResults.First(); - Assert.Multiple(() => - { - foreach (var result in hashResults) - { + Assert.Multiple(() => { + foreach (var result in hashResults) { Assert.That(result, Is.EqualTo(firstResult)); } }); } } -file static class TestData -{ - public static IEnumerable AddRequirementHashData - { - get - { +file static class TestData { + public static IEnumerable AddRequirementHashData { + get { var random = new Random(); var hashableBytes = new byte[random.Next(10, 100)]; random.NextBytes(hashableBytes); yield return new TestCaseData( hashableBytes, - new RequirementGroup() - { + new RequirementGroup() { StoredRequirements = { { typeof(ModuleSpec), new HashSet { new ModuleSpec("PSWindowsUpdate"), @@ -67,8 +61,7 @@ public static IEnumerable AddRequirementHashData yield return new TestCaseData( hashableBytes, - new RequirementGroup() - { + new RequirementGroup() { StoredRequirements = { { typeof(ModuleSpec), new HashSet { new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/Environment.psm1") diff --git a/tests/Compiler/Module/Resolvable/Local.cs b/tests/Compiler/Module/Resolvable/Local.cs index 75fd69b8..b98cb360 100644 --- a/tests/Compiler/Module/Resolvable/Local.cs +++ b/tests/Compiler/Module/Resolvable/Local.cs @@ -1,12 +1,12 @@ -using Compiler.Module.Resolvable; -using Compiler.Text; +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; namespace Compiler.Test.Module.Resolvable; [TestFixture] -public class LocalModuleTests -{ +public class LocalModuleTests { // [TestCaseSource(typeof(TestData), nameof(TestData.FixLinesCases))] // public string TestCompileDocument(string testContent) // { @@ -15,8 +15,7 @@ public class LocalModuleTests // return compiledDocument.GetContent(); // } - public class TestData - { + public class TestData { private static readonly string MULTILINE_STRING_LINES = """ @" Doing cool stuff with this indented multiline string! @@ -31,10 +30,8 @@ This is a multiline string with single quotes! "@; """; - public static IEnumerable FixLinesCases - { - get - { + public static IEnumerable FixLinesCases { + get { yield return new TestCaseData( MULTILINE_STRING_LINES ).Returns(""" diff --git a/tests/Compiler/Module/Resolvable/Script.cs b/tests/Compiler/Module/Resolvable/Script.cs index e8386cc4..e7c7c2fd 100644 --- a/tests/Compiler/Module/Resolvable/Script.cs +++ b/tests/Compiler/Module/Resolvable/Script.cs @@ -1,5 +1,7 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; -using System.Text.RegularExpressions; using Compiler.Module.Resolvable; using Compiler.Text; using Compiler.Text.Updater; @@ -7,20 +9,18 @@ namespace Compiler.Test.Module.Resolvable; [TestFixture] -public class CompiledScriptTest -{ - static readonly string TEST_SCRIPT = Path.Combine(Environment.CurrentDirectory, "resources", "test.ps1"); +public class CompiledScriptTest { + private static readonly string TEST_SCRIPT = Path.Combine(Environment.CurrentDirectory, "resources", "test.ps1"); [TestCaseSource(typeof(TestData), nameof(TestData.TestCases))] public string Test( TextSpanUpdater updater, string content - ) - { + ) { var document = new TextEditor(new TextDocument(content.Split('\n')))!; document.AddEdit(() => updater); - var compiled = CompiledDocument.FromBuilder(document); + var compiled = CompiledDocument.FromBuilder(document).ThrowIfFail(); return compiled.GetContent(); } @@ -28,21 +28,16 @@ string content public string? ExtractParameterBlock( bool expectNull, string scriptText - ) - { + ) { var scriptLines = scriptText.Split('\n'); - var script = new ResolvableScript(TestUtils.GetModuleSpecFromContent(scriptText)); + var script = new ResolvableScript(TestUtils.GetModuleSpecFromContent(scriptText), new ResolvableParent()); var result = script.ExtractParameterBlock(); - Assert.Multiple(() => - { - if (expectNull) - { + Assert.Multiple(() => { + if (expectNull) { Assert.That(result, Is.Null); - } - else - { + } else { Assert.That(result, Is.Not.Null); } }); @@ -51,12 +46,9 @@ string scriptText } - public static class TestData - { - public static IEnumerable ExtractParameterBlockCases - { - get - { + public static class TestData { + public static IEnumerable ExtractParameterBlockCases { + get { // yield return new TestCaseData(false, TEST_SCRIPT).Returns(""" // param( // [Parameter()] @@ -80,10 +72,8 @@ public static IEnumerable ExtractParameterBlockCases } } - public static IEnumerable TestCases - { - get - { + public static IEnumerable TestCases { + get { // yield return new TestCaseData( // new PatternUpdater( // 50, diff --git a/tests/Compiler/Requirements/ModuleSpec.cs b/tests/Compiler/Requirements/ModuleSpec.cs index 8c46881e..6fa3bea0 100644 --- a/tests/Compiler/Requirements/ModuleSpec.cs +++ b/tests/Compiler/Requirements/ModuleSpec.cs @@ -1,16 +1,16 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using Compiler.Module; using Compiler.Requirements; using System.Collections; -using System.Security.Policy; namespace Compiler.Test.Requirements; [TestFixture] -public class ModuleSpecTests -{ +public class ModuleSpecTests { [TestCaseSource(typeof(TestData), nameof(TestData.InsetableLinesCases))] - public string GetInsertableLine_ReturnsCorrectLine(ModuleSpec moduleSpec) - { + public string GetInsertableLine_ReturnsCorrectLine(ModuleSpec moduleSpec) { return moduleSpec.GetInsertableLine([]); } @@ -18,8 +18,7 @@ public string GetInsertableLine_ReturnsCorrectLine(ModuleSpec moduleSpec) public ModuleMatch CompareTo( ModuleSpec moduleSpec1, ModuleSpec moduleSpec2 - ) - { + ) { var moduleMatch = moduleSpec1.CompareTo(moduleSpec2); return moduleMatch; } @@ -28,12 +27,10 @@ ModuleSpec moduleSpec2 public ModuleSpec MergeSpec( ModuleSpec baseModuleSpec, ModuleSpec[] otherModuleSpecs - ) - { + ) { var mergedSpec = baseModuleSpec.MergeSpecs(otherModuleSpecs); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(mergedSpec.IsCompatibleWith(baseModuleSpec), Is.True); otherModuleSpecs.ToList().ForEach(otherModuleSpecs => Assert.That(mergedSpec.IsCompatibleWith(otherModuleSpecs), Is.True)); }); @@ -43,8 +40,7 @@ ModuleSpec[] otherModuleSpecs } [TestFixture] -public class PathedModuleSpecTests -{ +public class PathedModuleSpecTests { [TestCaseSource(typeof(TestData), nameof(TestData.MatchTestCases))] [TestCaseSource(typeof(TestData), nameof(TestData.ComparePathedSpecCases))] public ModuleMatch CompareTo( @@ -53,12 +49,9 @@ ModuleSpec moduleSpec2 ) => moduleSpec1.CompareTo(moduleSpec2); } -file class TestData -{ - public static IEnumerable InsetableLinesCases - { - get - { +file sealed class TestData { + public static IEnumerable InsetableLinesCases { + get { var guid = Guid.NewGuid(); yield return new TestCaseData(new ModuleSpec( @@ -99,10 +92,8 @@ public static IEnumerable InsetableLinesCases } } - public static IEnumerable MatchTestCases - { - get - { + public static IEnumerable MatchTestCases { + get { var guid = Guid.NewGuid(); #region Same matches @@ -399,10 +390,8 @@ public static IEnumerable MatchTestCases } } - public static IEnumerable MergeSpecCases - { - get - { + public static IEnumerable MergeSpecCases { + get { var guid = Guid.NewGuid(); yield return new TestCaseData(new ModuleSpec( @@ -546,10 +535,8 @@ public static IEnumerable MergeSpecCases } } - public static IEnumerable ComparePathedSpecCases - { - get - { + public static IEnumerable ComparePathedSpecCases { + get { var testScript1 = Path.GetFullPath($"{TestUtils.RepositoryDirectory()}/resources/test.ps1"); var testScript2 = Path.GetFullPath($"{TestUtils.RepositoryDirectory()}/resources/test2.ps1"); diff --git a/tests/Compiler/Requirements/PSEdition.cs b/tests/Compiler/Requirements/PSEdition.cs index fe942356..ad559b87 100644 --- a/tests/Compiler/Requirements/PSEdition.cs +++ b/tests/Compiler/Requirements/PSEdition.cs @@ -1,26 +1,25 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using Compiler.Requirements; namespace Compiler.Test.Requirements; [TestFixture] -public class PSEditionTests -{ +public class PSEditionTests { [Test, TestCaseSource(typeof(TestData), nameof(TestData.CaseForEachEdition))] - public string GetInsertableStringFromEdition(PSEdition edition) - { + public string GetInsertableStringFromEdition(PSEdition edition) { return new PSEditionRequirement(edition).GetInsertableLine([]); } [Test] - public void AreIncompatableWithEachOther() - { + public void AreIncompatableWithEachOther() { var desktop = new PSEditionRequirement(PSEdition.Desktop); var core = new PSEditionRequirement(PSEdition.Core); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(desktop.IsCompatibleWith(core), Is.False); Assert.That(core.IsCompatibleWith(desktop), Is.False); }); @@ -31,19 +30,15 @@ public void IsCompatible_WithAnyOtherRequirementType(Requirement other) { var desktop = new PSEditionRequirement(PSEdition.Desktop); var core = new PSEditionRequirement(PSEdition.Core); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(desktop.IsCompatibleWith(other), Is.True); Assert.That(core.IsCompatibleWith(other), Is.True); }); } - public static class TestData - { - public static IEnumerable CaseForEachEdition - { - get - { + public static class TestData { + public static IEnumerable CaseForEachEdition { + get { yield return new TestCaseData(PSEdition.Desktop).SetCategory("Desktop").Returns("#Requires -PSEdition Desktop"); yield return new TestCaseData(PSEdition.Core).SetCategory("Core").Returns("#Requires -PSEdition Core"); } diff --git a/tests/Compiler/Requirements/PSVersion.cs b/tests/Compiler/Requirements/PSVersion.cs index d5cc4ed0..e295ee96 100644 --- a/tests/Compiler/Requirements/PSVersion.cs +++ b/tests/Compiler/Requirements/PSVersion.cs @@ -1,19 +1,19 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using Compiler.Requirements; namespace Compiler.Test.Requirements; [TestFixture] -public class PSVersionTests -{ +public class PSVersionTests { [Test, TestCaseSource(typeof(TestData), nameof(TestData.CaseForVersionString))] - public string GetInsertableLine_CheckContent(Version version) - { + public string GetInsertableLine_CheckContent(Version version) { var line = new PSVersionRequirement(version).GetInsertableLine([]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(line, Is.Not.Null); Assert.That(line, Is.Not.Empty); Assert.That(line, Does.StartWith("#Requires -Version")); @@ -26,10 +26,8 @@ public string GetInsertableLine_CheckContent(Version version) public bool IsCompatible_WithOtherVersions( PSVersionRequirement current, PSVersionRequirement otherVersion - ) - { - Assert.Multiple(() => - { + ) { + Assert.Multiple(() => { Assert.That(current, Is.Not.Null); Assert.That(otherVersion, Is.Not.Null); }); @@ -37,22 +35,17 @@ PSVersionRequirement otherVersion return current.IsCompatibleWith(otherVersion); } - public static class TestData - { - public static IEnumerable CaseForVersionString - { - get - { + public static class TestData { + public static IEnumerable CaseForVersionString { + get { yield return new TestCaseData(new Version(7, 0)).SetCategory("OnlyMajor").Returns("#Requires -Version 7"); yield return new TestCaseData(new Version(7, 3)).SetCategory("MajorAndMinor").Returns("#Requires -Version 7.3"); yield return new TestCaseData(new Version(7, 3, 1)).SetCategory("MajorMinorAndRevision").Returns("#Requires -Version 7.3.1"); } } - public static IEnumerable CompatabilityCases - { - get - { + public static IEnumerable CompatabilityCases { + get { yield return new TestCaseData( new PSVersionRequirement(new Version(7, 0)), new PSVersionRequirement(new Version(7, 0)) diff --git a/tests/Compiler/Requirements/Requirements.cs b/tests/Compiler/Requirements/Requirements.cs index 238fccd8..172c95d8 100644 --- a/tests/Compiler/Requirements/Requirements.cs +++ b/tests/Compiler/Requirements/Requirements.cs @@ -1,4 +1,8 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; +using System.Globalization; using System.Security.Cryptography; using System.Text; using Compiler.Requirements; @@ -6,30 +10,22 @@ namespace Compiler.Test.Requirements; [TestFixture] -public class RequirementsTests -{ +public class RequirementsTests { private RequirementGroup Requirements; [SetUp] - public void SetUp() - { - Requirements = new RequirementGroup(); - } + public void SetUp() => this.Requirements = new RequirementGroup(); [TestCaseSource(typeof(TestData), nameof(TestData.CaseForEachRequirementType))] - public void AddRequirement_AddSingleRequirement_ReturnCollection(Requirement requirement) - { - Requirements.AddRequirement(requirement); + public void AddRequirement_AddSingleRequirement_ReturnCollection(Requirement requirement) { + this.Requirements.AddRequirement(requirement); - Assert.That(Requirements.GetRequirements(), Is.EqualTo(new List { requirement })); + Assert.That(this.Requirements.GetRequirements(), Is.EqualTo(new List { requirement })); } - public static class TestData - { - public static IEnumerable CaseForEachRequirementType - { - get - { + public static class TestData { + public static IEnumerable CaseForEachRequirementType { + get { yield return new TestCaseData(new ModuleSpec("TestModule")).SetCategory("ModuleSpec"); yield return new TestCaseData(new PSEditionRequirement(PSEdition.Desktop)).SetCategory("PSEditionRequirement"); yield return new TestCaseData(new PSVersionRequirement(new Version(7, 0))).SetCategory("PSVersionRequirement"); @@ -40,44 +36,36 @@ public static IEnumerable CaseForEachRequirementType } [TestFixture] -public class RequirementGroupTests -{ +public class RequirementGroupTests { [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementTests))] - public void AddRequirement(Requirement[] requirements) - { + public void AddRequirement(Requirement[] requirements) { var requirementGroup = new RequirementGroup(); - foreach (var requirement in requirements) - { + foreach (var requirement in requirements) { requirementGroup.AddRequirement(requirement); } var storedRequirements = requirementGroup.GetRequirements(); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(storedRequirements, Has.Count.EqualTo(requirements.Length)); Assert.That(storedRequirements, Is.EquivalentTo(requirements)); }); } [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementTests))] - public void RemoveRequirement(Requirement[] requirements) - { + public void RemoveRequirement(Requirement[] requirements) { var requirementGroup = new RequirementGroup(); - foreach (var requirement in requirements) - { + foreach (var requirement in requirements) { requirementGroup.AddRequirement(requirement); } var removingCount = (int)Math.Ceiling(requirements.Length / 2.0); // Ensure we remove at least one var removed = 0; - for (var i = 0; i < removingCount; i++) - { + for (var i = 0; i < removingCount; i++) { if (requirementGroup.RemoveRequirement(requirements[i])) removed++; } var storedRequirements = requirementGroup.GetRequirements(); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(removed, Is.EqualTo(removingCount)); Assert.That(storedRequirements, Has.Count.EqualTo(requirements.Length - removed)); Assert.That(storedRequirements, Is.EquivalentTo(requirements.Skip(removingCount))); @@ -85,24 +73,20 @@ public void RemoveRequirement(Requirement[] requirements) } [Test, Repeat(1000)] - public void GetRequirements_ShouldReturnAllRequirementsInOrderOfHashWhenSameWeight() - { + public void GetRequirements_ShouldReturnAllRequirementsInOrderOfHashWhenSameWeight() { var requirementGroup = new RequirementGroup(); var requirementsList = new List(); - for (var i = 0; i < 100; i++) - { - var requirement = new TestData.SampleRequirement(i.ToString()); + for (var i = 0; i < 100; i++) { + var requirement = new TestData.SampleRequirement(i.ToString(CultureInfo.InvariantCulture)); requirementsList.Add(requirement); requirementGroup.AddRequirement(requirement); } var requirements = requirementGroup.GetRequirements(); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(requirements, Has.Count.EqualTo(100)); Assert.That(requirements, Is.Ordered.By(nameof(Requirement.Weight))); - for (var i = 0; i < 100; i++) - { + for (var i = 0; i < 100; i++) { Assert.That(requirements.ElementAt(i), Is.EqualTo(requirementsList[i])); } }); @@ -110,77 +94,69 @@ public void GetRequirements_ShouldReturnAllRequirementsInOrderOfHashWhenSameWeig } [TestFixture] -public class RequirementWeightSorterTests -{ +public class RequirementWeightSorterTests { [Test] - public void Compare_WhenBothRequirementsAreNull_ReturnsZero() - { + public void Compare_WhenBothRequirementsAreNull_ReturnsZero() { var sorter = new RequirementWeightSorter(); - int result = sorter.Compare(null, null); + var result = sorter.Compare(null, null); Assert.That(result, Is.EqualTo(0)); } [Test] - public void Compare_WhenFirstRequirementIsNull_ReturnsNegativeOne() - { + public void Compare_WhenFirstRequirementIsNull_ReturnsNegativeOne() { var sorter = new RequirementWeightSorter(); var requirement = new TestData.TestRequirement(true); - int result = sorter.Compare(null, requirement); + var result = sorter.Compare(null, requirement); Assert.That(result, Is.EqualTo(-1)); } [Test] - public void Compare_WhenSecondRequirementIsNull_ReturnsOne() - { + public void Compare_WhenSecondRequirementIsNull_ReturnsOne() { var sorter = new RequirementWeightSorter(); var requirement = new TestData.TestRequirement(true); - int result = sorter.Compare(requirement, null); + var result = sorter.Compare(requirement, null); Assert.That(result, Is.EqualTo(1)); } [Test] - public void Compare_WhenBothRequirementsHaveSameWeight_ReturnsZero() - { + public void Compare_WhenBothRequirementsHaveSameWeight_ReturnsZero() { var sorter = new RequirementWeightSorter(); var requirement1 = new TestData.TestRequirement(true); var requirement2 = new TestData.TestRequirement(true); - int result = sorter.Compare(requirement1, requirement2); + var result = sorter.Compare(requirement1, requirement2); Assert.That(result, Is.EqualTo(0)); } [Test] - public void Compare_WhenFirstRequirementHasLowerWeight_ReturnsNegativeOne() - { + public void Compare_WhenFirstRequirementHasLowerWeight_ReturnsNegativeOne() { var sorter = new RequirementWeightSorter(); var requirement1 = new TestData.TestRequirement(true, 50); var requirement2 = new TestData.TestRequirement(true, 100); - int result = sorter.Compare(requirement1, requirement2); + var result = sorter.Compare(requirement1, requirement2); Assert.That(result, Is.EqualTo(-1)); } [Test] - public void Compare_WhenFirstRequirementHasHigherWeight_ReturnsOne() - { + public void Compare_WhenFirstRequirementHasHigherWeight_ReturnsOne() { var sorter = new RequirementWeightSorter(); var requirement1 = new TestData.TestRequirement(true, 100); var requirement2 = new TestData.TestRequirement(true, 50); - int result = sorter.Compare(requirement1, requirement2); + var result = sorter.Compare(requirement1, requirement2); Assert.That(result, Is.EqualTo(1)); } [Test] - public void Compare_WhenRequirementsHaveSameWeight_ReturnsZero() - { + public void Compare_WhenRequirementsHaveSameWeight_ReturnsZero() { var sorter = new RequirementWeightSorter(); var requirement1 = new TestData.TestRequirement(true, hash: [1, 2, 3]); var requirement2 = new TestData.TestRequirement(true, hash: [1, 2, 4]); - int result = sorter.Compare(requirement1, requirement2); + var result = sorter.Compare(requirement1, requirement2); Assert.That(result, Is.EqualTo(0)); } @@ -189,13 +165,11 @@ public void Compare_WhenRequirementsHaveSameWeight_ReturnsZero() public void Compare( Requirement requirement1, Requirement requirement2, - int expected) - { + int expected) { var sorter = new RequirementWeightSorter(); - int result = sorter.Compare(requirement1, requirement2); + var result = sorter.Compare(requirement1, requirement2); - switch (result) - { + switch (result) { case var _ when result < 0: Assert.That(result, Is.LessThanOrEqualTo(expected)); break; @@ -209,21 +183,17 @@ public void Compare( } } -file class TestData -{ - private static int _counter = 0; - public static Requirement GetNewRequirement() => new SampleRequirement(_counter++.ToString()); - public static Requirement[] GetNewRequirements(int count) - { +file sealed class TestData { + private static int Counter = 0; + public static Requirement GetNewRequirement() => new SampleRequirement(Counter++.ToString()); + public static Requirement[] GetNewRequirements(int count) { var requirements = new Requirement[count]; for (var i = 0; i < count; i++) { requirements[i] = GetNewRequirement(); } return requirements; } - public static IEnumerable CaseForEachRequirementType - { - get - { + public static IEnumerable CaseForEachRequirementType { + get { yield return new TestCaseData( new RunAsAdminRequirement(), new RunAsAdminRequirement(), @@ -274,10 +244,8 @@ public static IEnumerable CaseForEachRequirementType } } - public static IEnumerable AddRequirementTests - { - get - { + public static IEnumerable AddRequirementTests { + get { yield return new TestCaseData( arg: GetNewRequirements(1) ).SetDescription("Single Requirement"); @@ -292,45 +260,37 @@ public static IEnumerable AddRequirementTests } } - internal sealed class TestRequirement : Requirement - { + internal sealed class TestRequirement : Requirement { public TestRequirement( bool supportsMultiple, uint weight = 50, - byte[]? hash = null) : base() - { - SupportsMultiple = supportsMultiple; - Weight = weight; - Hash = hash ?? SHA1.HashData(Encoding.UTF8.GetBytes(weight.ToString())); + byte[]? hash = null) : base() { + this.SupportsMultiple = supportsMultiple; + this.Weight = weight; + this.Hash = hash ?? SHA256.HashData(Encoding.UTF8.GetBytes(weight.ToString(CultureInfo.InvariantCulture))); } public override string GetInsertableLine(Hashtable data) => throw new NotImplementedException(); public override bool IsCompatibleWith(Requirement other) => throw new NotImplementedException(); } - internal sealed class SampleRequirement : Requirement - { - private readonly string _data; - public SampleRequirement(string data) : base() - { - _data = data; - SupportsMultiple = true; - Hash = SHA1.HashData(Encoding.UTF8.GetBytes(data)); + internal sealed class SampleRequirement : Requirement { + public SampleRequirement(string data) : base() { + this.SupportsMultiple = true; + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(data)); } public override bool IsCompatibleWith(Requirement other) => true; - public override string GetInsertableLine(Hashtable _data) => string.Empty; + public override string GetInsertableLine(Hashtable data) => string.Empty; } - internal sealed class IncompatibleRequirement : Requirement - { - public IncompatibleRequirement() : base() - { - SupportsMultiple = false; - Hash = SHA1.HashData(Encoding.UTF8.GetBytes("Incompatible")); + internal sealed class IncompatibleRequirement : Requirement { + public IncompatibleRequirement() : base() { + this.SupportsMultiple = false; + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes("Incompatible")); } public override bool IsCompatibleWith(Requirement other) => false; - public override string GetInsertableLine(Hashtable _data) => string.Empty; + public override string GetInsertableLine(Hashtable data) => string.Empty; } } diff --git a/tests/Compiler/Requirements/RunAsAdmin.cs b/tests/Compiler/Requirements/RunAsAdmin.cs index 80a7b2e3..e42a473e 100644 --- a/tests/Compiler/Requirements/RunAsAdmin.cs +++ b/tests/Compiler/Requirements/RunAsAdmin.cs @@ -1,3 +1,6 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Security.Cryptography; using System.Text; using Compiler.Requirements; @@ -5,20 +8,17 @@ namespace Compiler.Test.Requirements; [TestFixture] -public class RunAsAdminRequirementTests -{ +public class RunAsAdminRequirementTests { [Test] - public void Hash_ShouldReturnHashOfString() - { + public void Hash_ShouldReturnHashOfString() { var requirement = new RunAsAdminRequirement(); var hash = requirement.Hash; - Assert.That(hash, Is.EqualTo(SHA1.HashData(Encoding.UTF8.GetBytes("#Requires -RunAsAdministrator")))); + Assert.That(hash, Is.EqualTo(SHA256.HashData(Encoding.UTF8.GetBytes("#Requires -RunAsAdministrator")))); } [Test] - public void Hash_ShouldAlwaysBeTheSame() - { + public void Hash_ShouldAlwaysBeTheSame() { var requirement = new RunAsAdminRequirement(); var requirement1 = new RunAsAdminRequirement(); @@ -26,8 +26,7 @@ public void Hash_ShouldAlwaysBeTheSame() } [Test] - public void GetInsertableLine_ShouldReturnString() - { + public void GetInsertableLine_ShouldReturnString() { var requirement = new RunAsAdminRequirement(); var insertableLine = requirement.GetInsertableLine([]); @@ -36,8 +35,7 @@ public void GetInsertableLine_ShouldReturnString() } [Test] - public void IsCompatibleWith_ShouldReturnTrue() - { + public void IsCompatibleWith_ShouldReturnTrue() { var requirement = new RunAsAdminRequirement(); var isCompatible = requirement.IsCompatibleWith(new RunAsAdminRequirement()); diff --git a/tests/Compiler/Text/Document.cs b/tests/Compiler/Text/Document.cs index f936a605..ace7ef43 100644 --- a/tests/Compiler/Text/Document.cs +++ b/tests/Compiler/Text/Document.cs @@ -1,16 +1,17 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using Compiler.Text; namespace Compiler.Test.Text; [TestFixture] -public partial class DocumentTests -{ +public partial class DocumentTests { private TextEditor Editor; [SetUp] - public void SetUp() - { - Editor = new TextEditor(new TextDocument([])); + public void SetUp() { + this.Editor = new TextEditor(new TextDocument([])); } public static partial class TestData; diff --git a/tests/Compiler/Text/Span.cs b/tests/Compiler/Text/Span.cs index 1baf1ee0..00dd4b71 100644 --- a/tests/Compiler/Text/Span.cs +++ b/tests/Compiler/Text/Span.cs @@ -1,44 +1,40 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Collections; using Compiler.Text; namespace Compiler.Test.Text; [TestFixture] -public class TextSpanTests -{ +public class TextSpanTests { private List Lines; - private TextDocument document; + private TextDocument Document; [SetUp] - public void SetUp() - { - Lines = new List([ + public void SetUp() { + this.Lines = new List([ "Hello,", "World!", "I'm the", "Document!" ]); - document = new TextDocument([.. Lines]); + this.Document = new TextDocument([.. this.Lines]); } [Test, TestCaseSource(typeof(TestData), nameof(TestData.WrappingEntireDocumentTextCases))] - public TextSpan WrappingEntireDocument(string[] lines) - { + public TextSpan WrappingEntireDocument(string[] lines) { var span = TextSpan.WrappingEntireDocument(lines); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(span.StartingIndex, Is.EqualTo(0)); Assert.That(span.StartingColumn, Is.EqualTo(0)); Assert.That(span.EndingIndex, Is.EqualTo(Math.Max(0, lines.Length - 1))); - if (lines.Length == 0) - { + if (lines.Length == 0) { Assert.That(span.EndingColumn, Is.EqualTo(0)); - } - else - { + } else { Assert.That(span.EndingColumn, Is.EqualTo(lines[^1].Length)); } }); @@ -49,146 +45,126 @@ public TextSpan WrappingEntireDocument(string[] lines) } [Test] - public void Contains_ReturnsTrue_WhenIndexAndColumnAreWithinSpan() - { - var span = TextSpan.WrappingEntireDocument(document); - bool result = span.Contains(1, 2); + public void Contains_ReturnsTrue_WhenIndexAndColumnAreWithinSpan() { + var span = TextSpan.WrappingEntireDocument(this.Document); + var result = span.Contains(1, 2); Assert.That(result, Is.True); } [Test] - public void GetContent_SingleLineFromBeginingAndEndLines() - { - var spanFirst = new TextSpan(0, 0, 0, Lines[0].Length); - var contentFirst = spanFirst.GetContent(document); - - var spanLast = new TextSpan(3, 0, Lines.Count - 1, Lines[^1].Length); - var contentLast = spanLast.GetContent(document); - - Assert.Multiple(() => - { - Assert.That(contentFirst, Is.EqualTo(Lines[0])); - Assert.That(contentLast, Is.EqualTo(Lines[^1])); + public void GetContent_SingleLineFromBeginingAndEndLines() { + var spanFirst = TextSpan.New(0, 0, 0, this.Lines[0].Length).Unwrap(); + var contentFirst = spanFirst.GetContent(this.Document); + + var spanLast = TextSpan.New(3, 0, this.Lines.Count - 1, this.Lines[^1].Length).Unwrap(); + var contentLast = spanLast.GetContent(this.Document); + + Assert.Multiple(() => { + Assert.That(contentFirst, Is.EqualTo(this.Lines[0])); + Assert.That(contentLast, Is.EqualTo(this.Lines[^1])); }); } [Test] - public void SetContent_UpdatesLinesWithNewContent() - { - var span = TextSpan.WrappingEntireDocument(document); - int lengthChanged = span.SetContent(ref Lines, UpdateOptions.None, ["New Content"]); + public void SetContent_UpdatesLinesWithNewContent() { + var span = TextSpan.WrappingEntireDocument(this.Document); + var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(lengthChanged, Is.EqualTo(-3)); - Assert.That(Lines[0], Is.EqualTo("New Content")); - Assert.That(Lines, Has.Count.EqualTo(1)); + Assert.That(this.Lines[0], Is.EqualTo("New Content")); + Assert.That(this.Lines, Has.Count.EqualTo(1)); }); } [Test] - public void SetContent_UpdateMiddleLine() - { - var span = new TextSpan(1, 0, 1, Lines[1].Length); - int lengthChanged = span.SetContent(ref Lines, UpdateOptions.None, ["New Content"]); + public void SetContent_UpdateMiddleLine() { + var span = TextSpan.New(1, 0, 1, this.Lines[1].Length).Unwrap(); + var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(lengthChanged, Is.EqualTo(0)); - Assert.That(Lines[1], Is.EqualTo("New Content")); + Assert.That(this.Lines[1], Is.EqualTo("New Content")); }); } [Test] - public void SetContent_UpdateFirstLine() - { - var span = new TextSpan(0, 0, 0, Lines[0].Length); - int lengthChanged = span.SetContent(ref Lines, UpdateOptions.None, ["New Content"]); + public void SetContent_UpdateFirstLine() { + var span = TextSpan.New(0, 0, 0, this.Lines[0].Length).Unwrap(); + var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(lengthChanged, Is.EqualTo(expected: 0)); - Assert.That(Lines, Has.Count.EqualTo(4)); - Assert.That(Lines[0], Is.EqualTo("New Content")); + Assert.That(this.Lines, Has.Count.EqualTo(4)); + Assert.That(this.Lines[0], Is.EqualTo("New Content")); }); } [Test] - public void SetContent_UpdateLastLine() - { - var span = new TextSpan(3, 0, 3, Lines[^1].Length); - int lengthChanged = span.SetContent(ref Lines, UpdateOptions.None, ["New Content"]); + public void SetContent_UpdateLastLine() { + var span = TextSpan.New(3, 0, 3, this.Lines[^1].Length).Unwrap(); + var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(lengthChanged, Is.EqualTo(0)); - Assert.That(Lines[3], Is.EqualTo("New Content")); + Assert.That(this.Lines[3], Is.EqualTo("New Content")); }); } [Test] - public void SetContent_InsertsNewLines() - { - var span = new TextSpan(1, 0, 1, Lines[1].Length); - int lengthChanged = span.SetContent(ref Lines, UpdateOptions.None, ["New", "Content"]); + public void SetContent_InsertsNewLines() { + var span = TextSpan.New(1, 0, 1, this.Lines[1].Length).Unwrap(); + var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New", "Content"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(lengthChanged, Is.EqualTo(1)); - Assert.That(Lines[1], Is.EqualTo("New")); - Assert.That(Lines[2], Is.EqualTo("Content")); + Assert.That(this.Lines[1], Is.EqualTo("New")); + Assert.That(this.Lines[2], Is.EqualTo("Content")); }); } [Test] - public void SetContent_AppendAndPrependColumns() - { - var spanStart = new TextSpan(0, Lines[0].Length - 1, 0, Lines[0].Length - 1); - int lengthChangedStart = spanStart.SetContent(ref Lines, UpdateOptions.InsertInline, [" beautiful"]); - var spanEnd = new TextSpan(Lines.Count - 1, 0, Lines.Count - 1, 0); - int lengthChangedEnd = spanEnd.SetContent(ref Lines, UpdateOptions.InsertInline, ["Awesome "]); - - Assert.Multiple(() => - { + public void SetContent_AppendAndPrependColumns() { + var spanStart = TextSpan.New(0, this.Lines[0].Length - 1, 0, this.Lines[0].Length - 1).Unwrap(); + var lengthChangedStart = spanStart.SetContent(this.Lines, UpdateOptions.InsertInline, [" beautiful"]); + var spanEnd = TextSpan.New(this.Lines.Count - 1, 0, this.Lines.Count - 1, 0).Unwrap(); + var lengthChangedEnd = spanEnd.SetContent(this.Lines, UpdateOptions.InsertInline, ["Awesome "]); + + Assert.Multiple(() => { Assert.That(lengthChangedStart, Is.EqualTo(0)); Assert.That(lengthChangedEnd, Is.EqualTo(0)); - Assert.That(Lines[0], Is.EqualTo("Hello beautiful,")); - Assert.That(Lines[^1], Is.EqualTo("Awesome Document!")); + Assert.That(this.Lines[0], Is.EqualTo("Hello beautiful,")); + Assert.That(this.Lines[^1], Is.EqualTo("Awesome Document!")); }); } [Test] - public void SetContent_UpdateMiddleOfLines() - { - var span = new TextSpan(Lines.Count - 2, 3, Lines.Count - 2, 3); - int lengthChanged = span.SetContent(ref Lines, UpdateOptions.InsertInline, [" not"]); + public void SetContent_UpdateMiddleOfLines() { + var span = TextSpan.New(this.Lines.Count - 2, 3, this.Lines.Count - 2, 3).Unwrap(); + var lengthChanged = span.SetContent(this.Lines, UpdateOptions.InsertInline, [" not"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(lengthChanged, Is.EqualTo(0)); - Assert.That(Lines[^2], Is.EqualTo("I'm not the")); + Assert.That(this.Lines[^2], Is.EqualTo("I'm not the")); }); } [Test] - public void RemoveContent_RemovesContentFromLines() - { - var span = new TextSpan(startingIndex: 0, 0, 0, 6); - var lengthChanged = span.RemoveContent(ref Lines); + public void RemoveContent_RemovesContentFromLines() { + var span = TextSpan.New(startingIndex: 0, 0, 0, 6).Unwrap(); + var lengthChanged = span.RemoveContent(this.Lines); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(lengthChanged, Is.EqualTo(-1)); - Assert.That(Lines[0], Is.EqualTo("World!")); - Assert.That(Lines, Has.Count.EqualTo(3)); + Assert.That(this.Lines[0], Is.EqualTo("World!")); + Assert.That(this.Lines, Has.Count.EqualTo(3)); }); } [TestCaseSource(typeof(TestData), nameof(TestData.ContainsTestCases))] - public bool ContainsTest(int index, int column) - { - var span = new TextSpan(0, 2, 2, 6); + public bool ContainsTest(int index, int column) { + var span = TextSpan.New(0, 2, 2, 6).Unwrap(); return span.Contains(index, column); } @@ -197,10 +173,8 @@ public bool ContainsTest(int index, int column) public string GetContent( string[] lines, TextSpan span - ) - { - Assert.Multiple(() => - { + ) { + Assert.Multiple(() => { Assert.That(span, Is.Not.Null); Assert.That(span.StartingIndex, Is.GreaterThanOrEqualTo(0)); Assert.That(span.StartingColumn, Is.GreaterThanOrEqualTo(0)); @@ -212,15 +186,13 @@ TextSpan span } [Test] - public void SetContent_RemovesSingleLineSpan_WhenContentIsEmpty() - { + public void SetContent_RemovesSingleLineSpan_WhenContentIsEmpty() { var lines = new List(["Hello, World!"]); - var span = new TextSpan(0, 0, 0, 13); - var offset = span.SetContent(ref lines, UpdateOptions.None, []); + var span = TextSpan.New(0, 0, 0, 13).Unwrap(); + var offset = span.SetContent(lines, UpdateOptions.None, []); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(offset, Is.EqualTo(-1)); Assert.That(lines, Is.Empty); }); @@ -228,15 +200,13 @@ public void SetContent_RemovesSingleLineSpan_WhenContentIsEmpty() } [Test] - public void SetContent_RemovesMultiLineSpan_WhenContentIsEmpty() - { + public void SetContent_RemovesMultiLineSpan_WhenContentIsEmpty() { var lines = new List(["Line 1", "Line 2", "Line 3"]); - var span = new TextSpan(0, 0, 2, 6); - var offset = span.SetContent(ref lines, UpdateOptions.None, []); + var span = TextSpan.New(0, 0, 2, 6).Unwrap(); + var offset = span.SetContent(lines, UpdateOptions.None, []); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(offset, Is.EqualTo(-3)); Assert.That(lines, Is.Empty); }); @@ -244,15 +214,13 @@ public void SetContent_RemovesMultiLineSpan_WhenContentIsEmpty() } [Test] - public void SetContent_ReplacesSingleLineSpan_WhenContentHasSingleLine() - { + public void SetContent_ReplacesSingleLineSpan_WhenContentHasSingleLine() { var lines = new List(["Hello, World!"]); - var span = new TextSpan(0, 0, 0, 13); - var offset = span.SetContent(ref lines, UpdateOptions.None, ["New Content"]); + var span = TextSpan.New(0, 0, 0, 13).Unwrap(); + var offset = span.SetContent(lines, UpdateOptions.None, ["New Content"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(offset, Is.EqualTo(0)); Assert.That(lines, Has.Count.EqualTo(1)); Assert.That(lines[0], Is.EqualTo("New Content")); @@ -261,15 +229,13 @@ public void SetContent_ReplacesSingleLineSpan_WhenContentHasSingleLine() } [Test] - public void SetContent_ReplacesMultiLineSpan_WhenContentHasMultipleLines() - { + public void SetContent_ReplacesMultiLineSpan_WhenContentHasMultipleLines() { var lines = new List(["Line 1", "Line 2", "Line 3"]); - var span = new TextSpan(0, 0, 2, 6); - var offset = span.SetContent(ref lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); + var span = TextSpan.New(0, 0, 2, 6).Unwrap(); + var offset = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(offset, Is.EqualTo(0)); Assert.That(lines, Has.Count.EqualTo(3)); Assert.That(lines[0], Is.EqualTo("New Line 1")); @@ -280,15 +246,13 @@ public void SetContent_ReplacesMultiLineSpan_WhenContentHasMultipleLines() } [Test] - public void SetContent_InsertsContentAtStart_WhenSpanIsAtStartOfDocument() - { + public void SetContent_InsertsContentAtStart_WhenSpanIsAtStartOfDocument() { var lines = new List(["Line 1", "Line 2", "Line 3"]); - var span = new TextSpan(0, 0, 0, 0); - var offset = span.SetContent(ref lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); + var span = TextSpan.New(0, 0, 0, 0).Unwrap(); + var offset = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(offset, Is.EqualTo(3)); Assert.That(lines, Has.Count.EqualTo(6)); Assert.That(lines[0], Is.EqualTo("New Line 1")); @@ -302,15 +266,13 @@ public void SetContent_InsertsContentAtStart_WhenSpanIsAtStartOfDocument() } [Test] - public void SetContent_InsertsContentAtEnd_WhenSpanIsAtEndOfDocument() - { + public void SetContent_InsertsContentAtEnd_WhenSpanIsAtEndOfDocument() { var lines = new List(["Line 1", "Line 2", "Line 3"]); - var span = new TextSpan(2, 6, 2, 6); - var offset = span.SetContent(ref lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); + var span = TextSpan.New(2, 6, 2, 6).Unwrap(); + var offset = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(offset, Is.EqualTo(3)); Assert.That(lines, Has.Count.EqualTo(6)); Assert.That(lines[0], Is.EqualTo("Line 1")); @@ -323,15 +285,13 @@ public void SetContent_InsertsContentAtEnd_WhenSpanIsAtEndOfDocument() } [Test] - public void SetContent_InsertsContentInMiddle_WhenSpanIsInMiddleOfDocument() - { + public void SetContent_InsertsContentInMiddle_WhenSpanIsInMiddleOfDocument() { var lines = new List(["Line 1", "Line 2", "Line 3"]); - var span = new TextSpan(1, 0, 1, 0); - var offset = span.SetContent(ref lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); + var span = TextSpan.New(1, 0, 1, 0).Unwrap(); + var offset = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(offset, Is.EqualTo(3)); Assert.That(lines, Has.Count.EqualTo(6)); Assert.That(lines[0], Is.EqualTo("Line 1")); @@ -344,15 +304,13 @@ public void SetContent_InsertsContentInMiddle_WhenSpanIsInMiddleOfDocument() } [Test] - public void SetContent_InsertsContentAtEndOfLastString_WhenInlineModeAndContentIsLargerThan1() - { + public void SetContent_InsertsContentAtEndOfLastString_WhenInlineModeAndContentIsLargerThan1() { var lines = new List(["Hello, World!"]); - var span = new TextSpan(0, 0, 0, 0); - var offset = span.SetContent(ref lines, UpdateOptions.InsertInline, ["New", "Super cool", "This is a cool "]); + var span = TextSpan.New(0, 0, 0, 0).Unwrap(); + var offset = span.SetContent(lines, UpdateOptions.InsertInline, ["New", "Super cool", "This is a cool "]); - Assert.Multiple(() => - { + Assert.Multiple(() => { Assert.That(offset, Is.EqualTo(2)); Assert.That(lines, Has.Count.EqualTo(3)); Assert.That(lines[0], Is.EqualTo("New")); @@ -362,28 +320,24 @@ public void SetContent_InsertsContentAtEndOfLastString_WhenInlineModeAndContentI } [Test] - public void GetContent_ContentFromMiddleOfLines_AndPartialLine() - { + public void GetContent_ContentFromMiddleOfLines_AndPartialLine() { var lines = new List(["Starting", "Hello, World!", "Ending"]); - var span = new TextSpan(1, 0, 1, 5); + var span = TextSpan.New(1, 0, 1, 5).Unwrap(); var content = span.GetContent([.. lines]); Assert.That(content, Is.EqualTo("Hello")); } - public static class TestData - { + public static class TestData { private static readonly List EmptyLines = []; private static readonly List SingleLine = new(["Hello, World!, I'm the Document!"]); private static readonly List TwoLines = new(["Hello, World!", "I'm the Document!"]); private static readonly List FourLines = new(["Hello,", "World!", "I'm the", "Document!"]); private static readonly List TenLines = new(["Line1", "Line2", "Line3", "Line4", "Line5", "Line6", "Line7", "Line8", "Line9", "Line10"]); - public static IEnumerable ContainsTestCases - { - get - { + public static IEnumerable ContainsTestCases { + get { yield return new TestCaseData(1, 4).Returns(true).SetDescription("Index and column are within span"); yield return new TestCaseData(0, 2).Returns(true).SetDescription("Index and column are at the start of the span"); yield return new TestCaseData(3, 2).Returns(false).SetDescription("Index is outside the span"); @@ -393,42 +347,100 @@ public static IEnumerable ContainsTestCases } } - public static IEnumerable GetContentTestCases - { - get - { - yield return new TestCaseData(EmptyLines.ToArray(), new TextSpan(0, 0, 0, 0)).SetCategory("Empty span").Returns(string.Empty); - yield return new TestCaseData(TenLines.ToArray(), new TextSpan(startingIndex: 0, startingColumn: 0, 9, 6)).SetCategory("Ten lines").Returns("Line1\nLine2\nLine3\nLine4\nLine5\nLine6\nLine7\nLine8\nLine9\nLine10"); - - yield return new TestCaseData(SingleLine.ToArray(), new TextSpan(0, 0, 0, 32)).SetCategory("Single line").Returns("Hello, World!, I'm the Document!").SetDescription("Full span"); - yield return new TestCaseData(SingleLine.ToArray(), new TextSpan(0, 0, 0, 6)).SetCategory("Single line").Returns("Hello,").SetDescription("Partial span start"); - yield return new TestCaseData(SingleLine.ToArray(), new TextSpan(0, 7, 0, 13)).SetCategory("Single line").Returns("World!").SetDescription("Partial span end"); - yield return new TestCaseData(SingleLine.ToArray(), new TextSpan(0, 2, 0, 10)).SetCategory("Single line").Returns("llo, Wor").SetDescription("Partial span start and end"); - - yield return new TestCaseData(TwoLines.ToArray(), new TextSpan(0, 0, 1, 17)).SetCategory("Two lines").Returns("Hello, World!\nI'm the Document!").SetDescription("Full span"); - yield return new TestCaseData(TwoLines.ToArray(), new TextSpan(0, 7, 1, 7)).SetCategory("Two lines").Returns("World!\nI'm the").SetDescription("Partial first and last"); - yield return new TestCaseData(TwoLines.ToArray(), new TextSpan(0, 0, 0, 13)).SetCategory("Two lines").Returns("Hello, World!").SetDescription("Take first line"); - yield return new TestCaseData(TwoLines.ToArray(), new TextSpan(1, 0, 1, 7)).SetCategory("Two lines").Returns("I'm the").SetDescription("Take last line"); - - - yield return new TestCaseData(FourLines.ToArray(), new TextSpan(0, 0, 3, 9)).SetCategory("Four lines").Returns("Hello,\nWorld!\nI'm the\nDocument!").SetDescription("Full span"); - yield return new TestCaseData(FourLines.ToArray(), new TextSpan(1, 3, 3, 4)).SetCategory("Four lines").Returns("ld!\nI'm the\nDocu").SetDescription("Partial first, middle and partial last"); - yield return new TestCaseData(FourLines.ToArray(), new TextSpan(0, 0, 0, 6)).SetCategory("Four lines").Returns("Hello,").SetDescription("Take first line"); - yield return new TestCaseData(FourLines.ToArray(), new TextSpan(0, 0, 1, 6)).SetCategory("Four lines").Returns("Hello,\nWorld!").SetDescription("Take first two lines"); - yield return new TestCaseData(FourLines.ToArray(), new TextSpan(2, 0, 3, 9)).SetCategory("Four lines").Returns("I'm the\nDocument!").SetDescription("Take last two lines"); - yield return new TestCaseData(FourLines.ToArray(), new TextSpan(3, 0, 3, 9)).SetCategory("Four lines").Returns("Document!").SetDescription("Take last line"); + public static IEnumerable GetContentTestCases { + get { + yield return new TestCaseData( + EmptyLines.ToArray(), + TextSpan.New(0, 0, 0, 0).Unwrap() + ).SetCategory("Empty span").Returns(string.Empty); + + yield return new TestCaseData( + TenLines.ToArray(), + TextSpan.New(0, 0, 9, 6).Unwrap() + ).SetCategory("Ten lines").Returns("Line1\nLine2\nLine3\nLine4\nLine5\nLine6\nLine7\nLine8\nLine9\nLine10"); + + + yield return new TestCaseData( + SingleLine.ToArray(), + TextSpan.New(0, 0, 0, 32).Unwrap() + ).SetCategory("Single line").Returns("Hello, World!, I'm the Document!").SetDescription("Full span"); + + yield return new TestCaseData( + SingleLine.ToArray(), + TextSpan.New(0, 0, 0, 7).Unwrap() + ).SetCategory("Single line").Returns("Hello, ").SetDescription("Partial span start"); + + yield return new TestCaseData( + SingleLine.ToArray(), + TextSpan.New(0, 7, 0, 13).Unwrap() + ).SetCategory("Single line").Returns("World!").SetDescription("Partial span end"); + + yield return new TestCaseData( + SingleLine.ToArray(), + TextSpan.New(0, 2, 0, 10).Unwrap() + ).SetCategory("Single line").Returns("llo, Wor").SetDescription("Partial span start and end"); + + + yield return new TestCaseData( + TwoLines.ToArray(), + TextSpan.New(0, 0, 1, 17).Unwrap() + ).SetCategory("Two lines").Returns("Hello, World!\nI'm the Document!").SetDescription("Full span"); + + yield return new TestCaseData( + TwoLines.ToArray(), + TextSpan.New(0, 7, 1, 7).Unwrap() + ).SetCategory("Two lines").Returns("World!\nI'm the").SetDescription("Partial first and last"); + + yield return new TestCaseData( + TwoLines.ToArray(), + TextSpan.New(0, 0, 0, 13).Unwrap() + ).SetCategory("Two lines").Returns("Hello, World!").SetDescription("Take first line"); + + yield return new TestCaseData( + TwoLines.ToArray(), + TextSpan.New(1, 0, 1, 7).Unwrap() + ).SetCategory("Two lines").Returns("I'm the").SetDescription("Take last line"); + + + yield return new TestCaseData( + FourLines.ToArray(), + TextSpan.New(0, 0, 3, 9).Unwrap() + ).SetCategory("Four lines").Returns("Hello,\nWorld!\nI'm the\nDocument!").SetDescription("Full span"); + + yield return new TestCaseData( + FourLines.ToArray(), + TextSpan.New(1, 3, 3, 4).Unwrap() + ).SetCategory("Four lines").Returns("ld!\nI'm the\nDocu").SetDescription("Partial first, middle and partial last"); + + yield return new TestCaseData( + FourLines.ToArray(), + TextSpan.New(0, 0, 0, 6).Unwrap() + ).SetCategory("Four lines").Returns("Hello,").SetDescription("Take first line"); + + yield return new TestCaseData( + FourLines.ToArray(), + TextSpan.New(0, 0, 1, 6).Unwrap() + ).SetCategory("Four lines").Returns("Hello,\nWorld!").SetDescription("Take first two lines"); + + yield return new TestCaseData( + FourLines.ToArray(), + TextSpan.New(2, 0, 3, 9).Unwrap() + ).SetCategory("Four lines").Returns("I'm the\nDocument!").SetDescription("Take last two lines"); + + yield return new TestCaseData( + FourLines.ToArray(), + TextSpan.New(3, 0, 3, 9).Unwrap() + ).SetCategory("Four lines").Returns("Document!").SetDescription("Take last line"); } } - public static IEnumerable WrappingEntireDocumentTextCases - { - get - { - yield return new TestCaseData(arg: EmptyLines.ToArray()).SetCategory("Empty").Returns(new TextSpan(0, 0, 0, 0)); - yield return new TestCaseData(arg: SingleLine.ToArray()).SetCategory("Single line").Returns(new TextSpan(0, 0, 0, 32)); - yield return new TestCaseData(arg: TwoLines.ToArray()).SetCategory("Two lines").Returns(new TextSpan(0, 0, 1, 17)); - yield return new TestCaseData(arg: FourLines.ToArray()).SetCategory("Four lines").Returns(new TextSpan(0, 0, 3, 9)); - yield return new TestCaseData(arg: TenLines.ToArray()).SetCategory("Ten lines").Returns(new TextSpan(0, 0, 9, 6)); + public static IEnumerable WrappingEntireDocumentTextCases { + get { + yield return new TestCaseData(arg: EmptyLines.ToArray()).SetCategory("Empty").Returns(TextSpan.New(0, 0, 0, 0).Unwrap()); + yield return new TestCaseData(arg: SingleLine.ToArray()).SetCategory("Single line").Returns(TextSpan.New(0, 0, 0, 32).Unwrap()); + yield return new TestCaseData(arg: TwoLines.ToArray()).SetCategory("Two lines").Returns(TextSpan.New(0, 0, 1, 17).Unwrap()); + yield return new TestCaseData(arg: FourLines.ToArray()).SetCategory("Four lines").Returns(TextSpan.New(0, 0, 3, 9).Unwrap()); + yield return new TestCaseData(arg: TenLines.ToArray()).SetCategory("Ten lines").Returns(TextSpan.New(0, 0, 9, 6).Unwrap()); } } } diff --git a/tests/Compiler/Text/Updater.cs b/tests/Compiler/Text/Updater.cs deleted file mode 100644 index 82fa7149..00000000 --- a/tests/Compiler/Text/Updater.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System.Collections; -using System.Diagnostics.CodeAnalysis; -using System.Text.RegularExpressions; -using Compiler.Module.Resolvable; -using Compiler.Text; - -namespace Compiler.Test.Text; - -[TestFixture] -public class PatternTests -{ - [TestCaseSource(typeof(TestData), nameof(TestData.AddPatternEditCases))] - public string AddPatternEdit( - string[] testLines, - [StringSyntax("Regex")] string openingPattern, - [StringSyntax("Regex")] string closingPattern, - UpdateOptions options, - Func updater - ) - { - var editor = new TextEditor(new(testLines)); - - editor.AddPatternEdit(new Regex(openingPattern), new Regex(closingPattern), options, updater); - var compiled = CompiledDocument.FromBuilder(editor); - - return compiled.GetContent(); - } - - public static class TestData - { - private static readonly string[] MULTINE_STRING_LINES = [ - "@\"", - "Doing cool stuff with this multiline string!", - "", - "This is the end of the string!", - "\"@;", - "@'", - "This is a multiline string with single quotes!", - "'@" - ]; - - private static readonly string[] DOCUMENTATION_LINES = [ - "<#", - ".DESCRIPTION", - " This module contains utility functions that have no dependencies on other modules and can be used by any module.", - "#>", - "", - "<#", - ".DESCRIPTION", - " This function is used to measure the time it takes to execute a script block.", - "", - ".EXAMPLE", - " Measure-ElapsedTime {", - " Start-Sleep -Seconds 5;", - " }", - "#>", - ]; - - public static IEnumerable AddPatternEditCases - { - get - { - yield return new TestCaseData( - DOCUMENTATION_LINES, - ResolvableLocalModule.DocumentationStartRegex().ToString(), - ResolvableLocalModule.DocumentationEndRegex().ToString(), - UpdateOptions.None, - (Func)(_ => []) - ).Returns(string.Empty).SetName("Ensure that documentation blocks are removed from content."); - } - - } - } -} - -[TestFixture] -public class RegexTests -{ - public static readonly string[] LINES = ["Hello,", "World!", "I'm the", "Document!"]; - - [TestCaseSource(typeof(TestData), nameof(TestData.AddRegexEditCases))] - public string AddRegexEdit( - [StringSyntax("Regex")] string pattern, - UpdateOptions options, - Func updater - ) - { - var editor = new TextEditor(new(LINES)); - - editor.AddRegexEdit(new Regex(pattern), options, updater); - var compiled = CompiledDocument.FromBuilder(editor); - - return compiled.GetContent(); - } - - public static class TestData - { - public static IEnumerable AddRegexEditCases - { - get - { - yield return new TestCaseData(".+", UpdateOptions.MatchEntireDocument, (Func)(_ => string.Empty)).Returns(string.Empty).SetName("Replace all content with empty string"); - yield return new TestCaseData(".+", UpdateOptions.None, (Func)(_ => string.Empty)).Returns("\n\n\n").SetName("Replace each line with empty string"); - - yield return new TestCaseData(".+", UpdateOptions.MatchEntireDocument, (Func)(_ => "Updated Content")).Returns("Updated Content").SetName("Replace all content with 'Updated Content'"); - yield return new TestCaseData(".+", UpdateOptions.None, (Func)(m => m.Value + " Updated Content")).Returns(string.Join('\n', [ - "Hello, Updated Content", - "World! Updated Content", - "I'm the Updated Content", - "Document! Updated Content" - ])).SetName("Prepend 'Updated Content' to each line"); - } - } - } -} - -[TestFixture] -public class ExactTests -{ - public static readonly string[] LINES = ["Hello,", "World!", "I'm the", "Document!"]; - private TextEditor Editor; - - [SetUp] - public void SetUp() - { - Editor = new TextEditor(new(LINES)); - } - - [Test] - public void AddExactEdit_AllContentWithOneLine() - { - Editor.AddExactEdit(0, 0, 3, 9, _ => ["Updated content!"]); - var compiled = CompiledDocument.FromBuilder(Editor); - - Assert.That(compiled.GetContent(), Is.EqualTo("Updated content!")); - } - - [Test] - public void AddExactEdit_UseContentToUpdate() - { - Editor.AddExactEdit(0, 0, 3, 9, content => - { - return content.Select(line => line + " Updated content!").ToArray(); - }); - var compiled = CompiledDocument.FromBuilder(Editor); - - Assert.That(compiled.GetContent(), Is.EqualTo(string.Join('\n', [ - "Hello, Updated content!", - "World! Updated content!", - "I'm the Updated content!", - "Document! Updated content!" - ]))); - } - - [TestCaseSource(typeof(ExactTests), nameof(ReplaceContentWithEmptyCases))] - public string AddExactEdit_ReplaceContentWithEmpty( - int startingIndex, - int startingColumn, - int endingIndex, - int endingColumn, - Func content - ) - { - Editor.AddExactEdit(startingIndex, startingColumn, endingIndex, endingColumn, content); - var compiled = CompiledDocument.FromBuilder(Editor); - - return compiled.GetContent(); - } - - public static IEnumerable ReplaceContentWithEmptyCases - { - get - { - yield return new TestCaseData(0, 0, 3, 9, (Func)(_ => [])).Returns(string.Empty).SetName("Replace all content with empty"); - yield return new TestCaseData(1, 0, 3, 9, (Func)(_ => [])).Returns("Hello,").SetName("Replace all content with empty except first line"); - yield return new TestCaseData(0, 0, 2, 7, (Func)(_ => [])).Returns("Document!").SetName("Replace all content with empty except last line"); - // yield return new TestCaseData(0, 0, 3, 9, (Func) (_ => ["", "", "", ""])).Returns(""); - } - } -} diff --git a/tests/Compiler/Text/Updater/Exact.cs b/tests/Compiler/Text/Updater/Exact.cs new file mode 100644 index 00000000..ec58a302 --- /dev/null +++ b/tests/Compiler/Text/Updater/Exact.cs @@ -0,0 +1,96 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using Compiler.Text; + +namespace Compiler.Test.Text.Updater; + +[TestFixture] +public sealed class ExactTests { + private static readonly string[] LINES = """ + $string = @" + Hello, + World! + I'm the + Document! + "@; + """.Split('\n'); + + private TextEditor Editor; + + [SetUp] + public void SetUp() => this.Editor = new TextEditor(new(LINES)); + + [TestCaseSource(typeof(ExactTests), nameof(ReplaceContentWithUpdateCases))] + public string AddExactEdit_ReplaceContentWithEmpty( + int startingIndex, + int startingColumn, + int endingIndex, + int endingColumn, + UpdateOptions options, + Func content + ) { + this.Editor.AddExactEdit(startingIndex, startingColumn, endingIndex, endingColumn, options, content); + var compiled = CompiledDocument.FromBuilder(this.Editor).ThrowIfFail(); + + return compiled.GetContent(); + } + + public static IEnumerable ReplaceContentWithUpdateCases { + get { + yield return new TestCaseData(1, 0, 4, 9, UpdateOptions.None, (Func)(_ => [])) + .Returns(""" + $string = @" + "@; + """).SetName("Replace all multiline-content with empty"); + + yield return new TestCaseData(1, 0, 4, 9, UpdateOptions.None, (Func)(_ => [])) + .Returns(""" + $string = @" + "@; + """).SetName("Replace all content with empty except first and last line"); + + yield return new TestCaseData(1, 0, 4, 9, UpdateOptions.None, (Func)(content => { + return content.Select(line => line + " Updated content!").ToArray(); + })).Returns(""" + $string = @" + Hello, Updated content! + World! Updated content! + I'm the Updated content! + Document! Updated content! + "@; + """).SetName("Append 'Updated content!' to middle lines"); + + yield return new TestCaseData(0, 0, 0, 8, UpdateOptions.InsertInline, (Func)(content => { + return content.Select(line => line.Replace("string", "epicString")).ToArray(); + })).Returns(""" + $epicString = @" + Hello, + World! + I'm the + Document! + "@; + """).SetName("Update variable name in first line."); + + yield return new TestCaseData(5, 2, 5, 3, UpdateOptions.InsertInline, (Func)(content => { + return []; + })).Returns(""" + $string = @" + Hello, + World! + I'm the + Document! + "@ + """).SetName("Remove semi-colon from last line."); + + yield return new TestCaseData(1, 0, 4, 9, UpdateOptions.None, (Func)(content => { + return ["Updated content!"]; + })).Returns(""" + $string = @" + Updated content! + "@; + """).SetName("Replace multiline content with 'Updated content!'"); + } + } +} diff --git a/tests/Compiler/Text/Updater/Pattern.cs b/tests/Compiler/Text/Updater/Pattern.cs new file mode 100644 index 00000000..fabf8aa4 --- /dev/null +++ b/tests/Compiler/Text/Updater/Pattern.cs @@ -0,0 +1,60 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using System.Text.RegularExpressions; +using Compiler.Module.Resolvable; +using Compiler.Text; + +namespace Compiler.Test.Text.Updater; + +[TestFixture] +public class PatternTests { + [TestCaseSource(typeof(TestData), nameof(TestData.AddPatternEditCases))] + public string AddPatternEdit( + string[] testLines, + string openingPattern, + string closingPattern, + UpdateOptions options, + Func updater + ) { + var editor = new TextEditor(new(testLines)); + + editor.AddPatternEdit(new Regex(openingPattern), new Regex(closingPattern), options, updater); + var compiled = CompiledDocument.FromBuilder(editor).ThrowIfFail(); + + return compiled.GetContent(); + } + + public static class TestData { + private static readonly string[] DOCUMENTATION_LINES = /*ps1*/ """ + <# + .DESCRIPTION + This module contains utility functions that have no dependencies on other modules and can be used by any module. + #> + + <# + .DESCRIPTION + This function is used to measure the time it takes to execute a script block. + + .EXAMPLE + Measure-ElapsedTime { + Start-Sleep -Seconds 5; + } + #> + """.Split('\n'); + + public static IEnumerable AddPatternEditCases { + get { + yield return new TestCaseData( + DOCUMENTATION_LINES, + ResolvableLocalModule.DocumentationStartRegex().ToString(), + ResolvableLocalModule.DocumentationEndRegex().ToString(), + UpdateOptions.None, + (Func)(_ => []) + ).Returns(string.Empty).SetName("Ensure that documentation blocks are removed from content."); + } + + } + } +} diff --git a/tests/Compiler/Text/Updater/Regex.cs b/tests/Compiler/Text/Updater/Regex.cs new file mode 100644 index 00000000..1e2c43ca --- /dev/null +++ b/tests/Compiler/Text/Updater/Regex.cs @@ -0,0 +1,72 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using System.Text.RegularExpressions; +using Compiler.Text; + +namespace Compiler.Test.Text.Updater; + +[TestFixture] +public sealed class RegexTests { + public static readonly string[] LINES = """ + $string = @" + Hello, + World! + I'm the + Document! + "@; + """.Split('\n'); + + [TestCaseSource(typeof(TestData), nameof(TestData.AddRegexEditCases))] + public string AddRegexEdit( + string pattern, + UpdateOptions options, + Func updater + ) { + var editor = new TextEditor(new(LINES)); + + editor.AddRegexEdit(new Regex(pattern), options, updater); + var compiled = CompiledDocument.FromBuilder(editor).ThrowIfFail(); + + return compiled.GetContent(); + } +} + +file static class TestData { + public static IEnumerable AddRegexEditCases { + get { + yield return new TestCaseData( + ".+", + UpdateOptions.MatchEntireDocument, + (Func)(_ => string.Empty) + ).Returns(string.Empty).SetName("Replace all content with empty string"); + + yield return new TestCaseData( + ".+", + UpdateOptions.None, + (Func)(_ => string.Empty) + ).Returns(new string('\n', 5)).SetName("Replace each line with empty string"); + + + yield return new TestCaseData( + ".+", + UpdateOptions.MatchEntireDocument, + (Func)(_ => "Updated Content") + ).Returns("Updated Content").SetName("Replace all content with 'Updated Content'"); + + yield return new TestCaseData( + "^((?!@\"|\"@).)*$", // Match all lines not containing '@"' or '"@' (multiline string tokens) + UpdateOptions.None, + (Func)(m => m.Value + " Updated Content") + ).Returns(""" + $string = @" + Hello, Updated Content + World! Updated Content + I'm the Updated Content + Document! Updated Content + "@; + """).SetName("Prepend 'Updated Content' to each line"); + } + } +} diff --git a/tests/Compiler/packages.lock.json b/tests/Compiler/packages.lock.json new file mode 100644 index 00000000..370596df --- /dev/null +++ b/tests/Compiler/packages.lock.json @@ -0,0 +1,603 @@ +{ + "version": 1, + "dependencies": { + "net8.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" + }, + "coverlet.msbuild": { + "type": "Direct", + "requested": "[6.0.2, )", + "resolved": "6.0.2", + "contentHash": "8b4jBNH7mcQy1otyQErjjIUuGD74XxKZ1wvDufbY7jhWwckl7wIa+icjwdPYeI0aYMS4Tp63LIZvyMFjWwOMDw==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" + } + }, + "NUnit": { + "type": "Direct", + "requested": "[4.1.0, )", + "resolved": "4.1.0", + "contentHash": "MT/DpAhjtiytzhTgTqIhBuWx4y26PKfDepYUHUM+5uv4TsryHC2jwFo5e6NhWkApCm/G6kZ80dRjdJFuAxq3rg==" + }, + "NUnit.Analyzers": { + "type": "Direct", + "requested": "[4.2.0, )", + "resolved": "4.2.0", + "contentHash": "4fJojPkzdoa4nB2+p6U+fITvPnVvwWSnsmiJ/Dl30xqiL3oxNbYvfeSLVd91hOmEjoUqSwN3Z7j1aFedjqWbUA==" + }, + "NUnit3TestAdapter": { + "type": "Direct", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "s8JpqTe9bI2f49Pfr3dFRfoVSuFQyraTj68c3XXjIS/MRGvvkLnrg6RLqnTjdShX+AdFUCCU/4Xex58AdUfs6A==" + }, + "CommandLineParser": { + "type": "Transitive", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "LanguageExt.Core": { + "type": "Transitive", + "resolved": "5.0.0-beta-07", + "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.21.0", + "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "5.0.0" + } + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Management.Infrastructure": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "cGZi0q5IujCTVYKo9h22Pw+UwfZDV82HXO8HTxMG2HqntPlT3Ls8jY6punLp4YzCypJNpfCAu2kae3TIyuAiJw==", + "dependencies": { + "Microsoft.Management.Infrastructure.Runtime.Unix": "3.0.0", + "Microsoft.Management.Infrastructure.Runtime.Win": "3.0.0" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", + "dependencies": { + "NuGet.Frameworks": "6.5.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.8.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "NLog": { + "type": "Transitive", + "resolved": "5.3.2", + "contentHash": "cQRQZuDMjSyMe9EQBnI9v55YAMMz8GAfFd6fFJ6tc/kXnG7Hze8p1I8MgvWSBG6E36wA8vSxRrlm8uSIG+SENg==" + }, + "NuGet.Commands": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "pI2X+KRQYsVcmjJUIAXT+8fvUCZgNWBQiSizKCOltRqaMjtUHLetfADfz7jfreOBohsDxNzhBnNqPQ8MU/Gjxw==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "NuGet.Credentials": "6.9.1", + "NuGet.ProjectModel": "6.9.1" + } + }, + "NuGet.Common": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "FbuWZBjQ1NJXBDqCwSddN2yvw3Plq3sTCIh0nc66Hu8jrNr+BOaxlKZv78jvJ+pSy8BvurYOdF9sl9KoORjrtg==", + "dependencies": { + "NuGet.Frameworks": "6.9.1" + } + }, + "NuGet.Configuration": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "GM06pcUzWdNsizeGciqCjAhryfI1F/rQPETLDF+8pDRgzVpA+wKAR01/4aFU+IXzugnQ9LqOb5YyCRuR1OVZiQ==", + "dependencies": { + "NuGet.Common": "6.9.1", + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "NuGet.Credentials": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "elTErAznCWoqOLILVDN4FTa3+rpVVdUbHUaOUqJkk9+Z/ZSqyDPbCIhLaqTkPkWqoKa93gqzX9IFwURkMphPnw==", + "dependencies": { + "NuGet.Protocol": "6.9.1" + } + }, + "NuGet.DependencyResolver.Core": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "gVWIEScv1K40H2Fvs6HGaOzRMpG+r1RUqYpBdh7gqQ18kgsswWUSr90jCNtBb7PUYKkMU1oAhxTslj/gQjO+Vw==", + "dependencies": { + "NuGet.Configuration": "6.9.1", + "NuGet.LibraryModel": "6.9.1", + "NuGet.Protocol": "6.9.1" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "DaKh3lenPUvzGccPkbI97BIvA27z+/UsL3ankfoZlX/4vBVDK5N1sheFTQ+GuJf+IgSzsJz/A21SPUpQLHwUtA==" + }, + "NuGet.LibraryModel": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "xlOpbZTc4862vKHkZHLJ5VgDteo+78ftVkajB8rKgSpevnBqwPKv2Y5OfUxct9HCqWYw0ikVfNf/qfjqnQCV1Q==", + "dependencies": { + "NuGet.Common": "6.9.1", + "NuGet.Versioning": "6.9.1" + } + }, + "NuGet.Packaging": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "6FyasOxKInCELJ+pGy8f17ub9st6ofFeNcBNTo7CRiPJlxyhJfKGKNpfe3HHYwvnZhc3Vdfr0kSR+f1BVGDuTA==", + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "NuGet.Configuration": "6.9.1", + "NuGet.Versioning": "6.9.1", + "System.Security.Cryptography.Pkcs": "6.0.4" + } + }, + "NuGet.ProjectModel": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "x98QkS3oloaJfdSsDFOGTH5oeoHHTDoyTO7oyg/7g60be14AQowLqgPQV52Kuscl4lknx/3259RTxyDcbkdifQ==", + "dependencies": { + "NuGet.DependencyResolver.Core": "6.9.1" + } + }, + "NuGet.Protocol": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "h3bdjqUY4jvwM02D/7QM4FR8x/bbf4Pyjrc1Etw7an2OrWKPUSx0vJPdapKzioxIw7GXl/aVUM/DCeIc3S9brA==", + "dependencies": { + "NuGet.Packaging": "6.9.1" + } + }, + "NuGet.Versioning": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "ypnSvEtpNGo48bAWn95J1oHChycCXcevFSbn53fqzLxlXFSZP7dawu8p/7mHAfGufZQSV2sBpW80XQGIfXO8kQ==" + }, + "Pastel": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "jQ0fTkHZvgQsmbr5qU0IdCP1PWuUfmEmekIsTwysWK/iIwmT9Mbm0x5GpjYSTEwHTNVEpjYhBhyKVdzESgRCpg==" + }, + "PowerShellStandard.Library": { + "type": "Transitive", + "resolved": "7.0.0-preview.1", + "contentHash": "vd2iKiQjgB/Lh3270aMgdq/NdVq/qNHsLM8P7k/oD3hALG1UOzePa62TOSK6RlQClfXW1xI9Y1e+haHlUkF3PA==" + }, + "QuikGraph": { + "type": "Transitive", + "resolved": "2.5.0", + "contentHash": "sG+mrPpXwxlXknRK5VqWUGiOmDACa9X+3ftlkQIMgOZUqxVOQSe0+HIU9PTjwqazy0pqSf8MPDXYFGl0GYWcKw==" + }, + "QuikGraph.Graphviz": { + "type": "Transitive", + "resolved": "2.5.0", + "contentHash": "pCKpErtHGxUi72OT+2aIg1pdHdUqpqEM5J/i9rmVsEVDE4X0xb1HBPWdxv/FLZmbBjk0ZogZXZttUL3CnAPpNw==", + "dependencies": { + "QuikGraph": "2.5.0" + } + }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JlYi9XVvIREURRUlGMr1F6vOFLk7YSY4p1vHo4kX3tQ0AGrjqlRWHDi66ImHhy6qwXBG3BJ6Y1QlYQ+Qz6Xgww==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0", + "System.Security.Cryptography.ProtectedData": "8.0.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AJukBuLoe3QeAF+mfaRKQb2dgyrvt340iMBHYv+VdBzCUM06IxGlvl0o/uPOS7lHnXPN6u8fFRHSHudx5aTi8w==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Management.Automation": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==" + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "v/BBylw7XevuAsHXoX9dDUUfmBIcUf7Lkz8K3ZXIKz3YRKpw8YftpSir4n4e/jDTKFoaK37AsC3xnk+GNFI1Ow==", + "dependencies": { + "System.Windows.Extensions": "8.0.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + }, + "System.Windows.Forms": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "WL3QPG1q88aIWO0JPOlkCeyNE+FK4ufSKY5j6J6qAFQyfCFiiOYxi8RAhev9H0CS/wmKbIK8qr8xZBod85oWKw==" + }, + "compiler": { + "type": "Project", + "dependencies": { + "CommandLineParser": "[2.9.1, )", + "LanguageExt.Core": "[5.0.0-beta-07, )", + "NLog": "[5.3.2, )", + "NuGet.Commands": "[6.9.1, )", + "NuGet.Common": "[6.9.1, )", + "Pastel": "[5.1.0, )", + "PowerShellStandard.Library": "[7.0.0-preview.1, )", + "QuikGraph": "[2.5.0, )", + "QuikGraph.Graphviz": "[2.5.0, )", + "System.Management.Automation": "[7.4.2, )", + "System.Windows.Forms": "[4.0.0, )" + } + } + }, + "net8.0/linux-x64": { + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Management.Automation": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } + }, + "net8.0/win-x64": { + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Management.Automation": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } + } + } +} \ No newline at end of file From 3e6729f59f5278602268f78af04d6af536e6dde1 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 2 Sep 2024 18:01:33 +1000 Subject: [PATCH 132/341] refactor(Compiler): Improve FindAvailableFunctions Allow the usage of the * to define exporting everything and add support for multiple Export-ModuleMember commands. --- src/Compiler/AstHelper.cs | 72 ++++++++++++++----------- src/Compiler/Module/Resolvable/Local.cs | 11 ++-- 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index 3a84d47e..bd7cc9b6 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -71,17 +71,13 @@ public static Dictionary> FindDeclaredModules return modules; } - public static List<(string, UsingStatementAst)> FindDeclaredNamespaces(Ast ast) { - var namespaces = new List<(string, UsingStatementAst)>(); + public static List FindDeclaredNamespaces(Ast ast) { + var namespaces = new List(); ast.FindAll(testAst => testAst is UsingStatementAst usingAst && usingAst.UsingStatementKind == UsingStatementKind.Namespace, true) .Cast() .ToList() - .ForEach(usingStatement => { - // I don't think this is possible, but just in case. - if (usingStatement.Name is null) throw new InvalidDataException("UsingStatementAst does not contain a Name."); - namespaces.Add((usingStatement.Name.Value, usingStatement)); - }); + .ForEach(namespaces.Add); return namespaces; } @@ -92,37 +88,48 @@ public static List FindAvailableFunctions(Ast ast, bool o .Cast() .ToList(); - // If there is no export command or we are not filtering for only exported functions, return all functions. - if (ast.Find(testAst => !onlyExported || (testAst is CommandAst commandAst && commandAst.CommandElements[0].Extent.Text == "Export-ModuleMember"), true) is not CommandAst command) { + // Short circuit so we don't have to do any more work if we are not filtering for only exported functions. + if (!onlyExported) { return allDefinedFunctions; } - // TODO - Support using * to export all of a type. - var wantingToExport = new List<(string, List)>(); - var namedParameters = ast.FindAll(testAst => testAst is CommandParameterAst commandParameter && commandParameter.Parent == command, true).Cast().ToList(); - foreach (var (namedParameter, index) in namedParameters.Select((value, i) => (value, i))) { - if (namedParameter.ParameterName is not "Function" and not "Alias") { - continue; - } - - var value = namedParameter.Argument; - value ??= command.CommandElements[command.CommandElements.IndexOf(namedParameter) + 1] as ExpressionAst; + var exportCommands = ast.FindAll(testAst => + testAst is CommandAst commandAst && commandAst.CommandElements[0].Extent.Text == "Export-ModuleMember", true + ).Cast(); - var objects = value switch { - StringConstantExpressionAst stringConstantExpressionAst => [stringConstantExpressionAst.Value], - ArrayLiteralAst arrayLiteralAst => arrayLiteralAst.Elements.Select(element => element.SafeGetValue()), - _ => throw new NotImplementedException($"Export-ModuleMember parameter must be a string or array of strings, got: {value}"), - }; + // If there are no Export-ModuleMember commands, we are exporting everything. + if (!exportCommands.Any()) { + return allDefinedFunctions; + } - wantingToExport.Add((namedParameter.ParameterName, objects.Cast().ToList())); + var wantingToExport = new List<(string, IEnumerable)>(); + foreach (var exportCommand in exportCommands) { + // TODO - Support unnamed export param eg `Export-ModuleMember *` + var namedParameters = exportCommand.CommandElements + .Where(commandElement => commandElement is CommandParameterAst) + .Cast() + .Where(param => param.ParameterName is "Function" or "Alias"); + + foreach (var namedParameter in namedParameters) { + var value = namedParameter.Argument + ?? exportCommand.CommandElements[exportCommand.CommandElements.IndexOf(namedParameter) + 1] as ExpressionAst; + + var objects = value switch { + StringConstantExpressionAst starAst when starAst.Value == "*" => allDefinedFunctions.Select(function => NameWithoutNamespace(function.Name)), + StringConstantExpressionAst stringConstantAst => [stringConstantAst.Value], + ArrayLiteralAst arrayLiteralAst => arrayLiteralAst.Elements.Select(element => element.SafeGetValue()), + _ => [], // We don't know what to do with this value, so we will just ignore it. + }; + + wantingToExport.Add((namedParameter.ParameterName, objects.Cast())); + } } - return allDefinedFunctions - .Where(function => { - // If the name is scoped to a namespace, remove the namespace. - var name = function.Name.Contains(':') ? function.Name.Split(':').Last() : function.Name; - return wantingToExport.Any(wanting => wanting.Item2.Contains(name)); - }).ToList(); + return allDefinedFunctions.Where(function => { + return wantingToExport.Any(wanting => + wanting.Item2.Contains(NameWithoutNamespace(function.Name)) + ); + }).ToList(); } /// @@ -246,4 +253,7 @@ public static Ast FindRoot([NotNull] Ast ast) { return parent; } + + [return: NotNull] + private static string NameWithoutNamespace(string name) => name.Contains(':') ? name.Split(':').Last() : name; } diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 884a3d8d..6ed2f0d6 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -153,14 +153,14 @@ public override Option ResolveRequirements() { AstHelper.FindDeclaredNamespaces(this.Ast).ToList().ForEach(statement => { this.Editor.AddExactEdit( - statement.Item2.Extent.StartLineNumber - 1, - statement.Item2.Extent.StartColumnNumber - 1, - statement.Item2.Extent.EndLineNumber - 1, - statement.Item2.Extent.EndColumnNumber - 1, + statement.Extent.StartLineNumber - 1, + statement.Extent.StartColumnNumber - 1, + statement.Extent.EndLineNumber - 1, + statement.Extent.EndColumnNumber - 1, _ => [] ); - var ns = new UsingNamespace(statement.Item1); + var ns = new UsingNamespace(statement.Name.Value); lock (this.Requirements) { this.Requirements.AddRequirement(ns); } @@ -206,4 +206,3 @@ public override bool Equals(object? obj) { private static partial Regex RequiresStatementRegex(); #endregion } - From 03003798d0d8a2a7913579e5be98f2cdd2f25386 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 2 Sep 2024 18:02:08 +1000 Subject: [PATCH 133/341] test(Compiler): Implement more tests for AstHelper methods. --- tests/Compiler/AstHelper.cs | 591 ++++++++++++++++++++++++++++++ tests/Compiler/AstHelpersTests.cs | 223 ----------- tests/Compiler/packages.lock.json | 6 + 3 files changed, 597 insertions(+), 223 deletions(-) create mode 100644 tests/Compiler/AstHelper.cs delete mode 100644 tests/Compiler/AstHelpersTests.cs diff --git a/tests/Compiler/AstHelper.cs b/tests/Compiler/AstHelper.cs new file mode 100644 index 00000000..56c159c9 --- /dev/null +++ b/tests/Compiler/AstHelper.cs @@ -0,0 +1,591 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using Compiler.Analyser; +using LanguageExt; +using LanguageExt.Common; +using LanguageExt.UnsafeValueAccess; +using Microsoft.PowerShell.Commands; +using System.Collections; +using System.Management.Automation; +using System.Management.Automation.Language; + +namespace Compiler.Test; + +public class AstHelperTests { + [TestCaseSource(typeof(TestData.ChildAndRoot), nameof(TestData.ChildAndRoot.Data))] + public void FindRoot_ReturnsRootAst( + Ast parentAst, + Ast childAst, + bool _, + bool __) => Assert.That(AstHelper.FindRoot(childAst), Is.EqualTo(parentAst)); + + [TestCaseSource(typeof(TestData.ChildAndRoot), nameof(TestData.ChildAndRoot.Data))] + public void FindClosestParamBlock_ReturnsParamBlock( + Ast _, + Ast childAst, + bool hasParamBlock, + bool attributePresentOnClosestParamBlock) { + if (!hasParamBlock) { + Assert.That(AstHelper.FindClosestParamBlock(childAst), Is.Null); + } else { + var result = AstHelper.FindClosestParamBlock(childAst); + + Assert.Multiple(() => { + Assert.That(result, Is.Not.Null); + Assert.That(result, Is.TypeOf()); + + if (attributePresentOnClosestParamBlock) { + Assert.That(result?.Attributes, Is.Not.Null); + Assert.That(result?.Attributes, Has.Count.EqualTo(1)); + + var attributes = SuppressAnalyserAttribute.FromAttributes(result!.Attributes); + var attribute = attributes.First(); + Assert.That(attribute, Is.Not.Null); + Assert.That(attribute, Is.TypeOf()); + } + }); + } + } + + [TestCaseSource(typeof(TestData.AstParser), nameof(TestData.AstParser.Data))] + public void GetAstReportingErrors( + string astContent, + Option filePath, + IEnumerable ignoredErrors, + bool expectError + ) { + var result = AstHelper.GetAstReportingErrors(astContent, filePath, ignoredErrors); + + Assert.Multiple(() => { + if (expectError) { + Assert.That(result.IsFail, Is.True); + Assert.That((Error)result, Is.Not.Null); + } else { + Assert.That(result.IsSucc, Is.True); + Assert.That((ScriptBlockAst)result, Is.Not.Null); + + if (filePath.IsNone) { + Assert.That(((ScriptBlockAst)result).Extent.File, Is.Null); + } else { + Assert.That(((ScriptBlockAst)result).Extent.File, Is.EqualTo(filePath.Unwrap())); + } + + Assert.That(((ScriptBlockAst)result).Extent.Text, Is.EqualTo(astContent)); + } + }); + } + + [TestCaseSource(typeof(TestData.AstFinder), nameof(TestData.AstFinder.Functions))] + public void FindAvailableFunctions( + string astContent, + IEnumerable expectedFunctions, + bool onlyExported + ) { + var ast = Parser.ParseInput(astContent, out _, out _); + var result = AstHelper.FindAvailableFunctions(ast, onlyExported); + + Assert.Multiple(() => { + Assert.That(result, Is.Not.Null); + Assert.That(result, Has.Count.EqualTo(expectedFunctions.Count())); + + Assert.That(result, Has.All.Matches(function => expectedFunctions.Contains(function.Name))); + }); + } + + [TestCaseSource(typeof(TestData.AstFinder), nameof(TestData.AstFinder.Namespaces))] + public void FindDeclaredNamespaces( + string astContent, + IEnumerable expectedNamespaces + ) { + var ast = Parser.ParseInput(astContent, out _, out _); + var result = AstHelper.FindDeclaredNamespaces(ast); + + Assert.Multiple(() => { + Assert.That(result, Is.Not.Null); + Assert.That(result, Has.Count.EqualTo(expectedNamespaces.Count())); + + foreach (var expectedNamespace in expectedNamespaces) { + Assert.That(result, Has.One.Matches(ns => ns.Name.Value == expectedNamespace)); + } + }); + } + + [TestCaseSource(typeof(TestData.AstFinder), nameof(TestData.AstFinder.NameOnlyModules))] + [TestCaseSource(typeof(TestData.AstFinder), nameof(TestData.AstFinder.ModuleSpecifications))] + public void FindDeclaredModules( + string astContent, + Dictionary> expectedModules, + bool skipAstChecking + ) { + var ast = AstHelper.GetAstReportingErrors(astContent, Option.None, ["ModuleNotFoundDuringParse"]).ThrowIfFail(); + var result = AstHelper.FindDeclaredModules(ast); + + Assert.Multiple(() => { + Assert.That(result, Is.Not.Null); + Assert.That(result, Has.Count.EqualTo(expectedModules.Count)); + Assert.That(result.Keys, Is.EquivalentTo(expectedModules.Keys)); + + // We can't create an exact match for the returned ast so check it manually and remove it from the result + foreach (var (moduleName, resultModule) in result) { + if (resultModule.TryGetValue("AST", out var obj) && obj is Ast ast) { + var counterPart = expectedModules[moduleName]; + + if (!skipAstChecking) { + Assert.That(counterPart, Is.Not.Null); + Assert.That(counterPart, Has.Count.EqualTo(resultModule.Count)); + Assert.That(counterPart, Contains.Key("AST")); + Assert.That(ast.Extent.Text, Is.EqualTo(expectedModules[moduleName]["AST"])); + counterPart.Remove("AST"); + } + + resultModule.Remove("AST"); + } + } + + Assert.That(result, Is.EquivalentTo(expectedModules)); + }); + } +} + +file static class TestData { + internal static class ChildAndRoot { + public static string USING_STATEMENTS = /*ps1*/ $$""" + using assembly '{{typeof(AstHelper).Assembly.Location}}' + using namespace Compiler.Analyser + """; + + public static string ATTRIBUTE = /*ps1*/ """ + [SuppressAnalyser('UseOfUnknownFunction', 'unknown-function', 'Justification')] + """; + + public static string NO_PARAM_GLOBAL = /*ps1*/ $$""" + {{USING_STATEMENTS}} + + unknown-function + """; + + public static string NO_PARAM_FUNCTION = /*ps1*/ $$""" + {{USING_STATEMENTS}} + + function Test-Function { + unknown-function + } + + Test-Function + """; + + public static string NO_ATTRIBUTE = /*ps1*/ $$""" + {{USING_STATEMENTS}} + + function Test-Function { + param($param1) + + unknown-function $param1 + } + + Test-Function + """; + + public static string NO_ATTRIBUTE_NESTED = /*ps1*/ $$""" + {{USING_STATEMENTS}} + + function Test-Function { + param($param1) + + & { + unknown-function $param1 + } + } + + Test-Function + """; + + public static string ATTRIBUTE_PARAM = /*ps1*/ $$""" + {{USING_STATEMENTS}} + + function Test-Function { + {{ATTRIBUTE}} + param($param1) + + unknown-function $param1 + } + + Test-Function + """; + + public static string ATTRIBUTE_GLOBAL = /*ps1*/ $$""" + {{USING_STATEMENTS}} + + {{ATTRIBUTE}} + param($param1) + + unknown-function $param1 + """; + + public static string ATTRIBUTE_NESTED_NO_PARAM = /*ps1*/ $$""" + {{USING_STATEMENTS}} + + function Test-Function { + {{ATTRIBUTE}} + param($param1) + + & { + unknown-function $param1 + } + } + + Test-Function + """; + + public static string ATTRIBUTE_NESTED_PARAM = /*ps1*/ $$""" + {{USING_STATEMENTS}} + + function Test-Function { + {{ATTRIBUTE}} + param($param1) + + & { + param() + + unknown-function $param1 + } + } + + Test-Function + """; + + public static Ast NO_PARAM_GLOBAL_AST = Parser.ParseInput(NO_PARAM_GLOBAL, out _, out _); + public static Ast NO_PARAM_FUNCTION_AST = Parser.ParseInput(NO_PARAM_FUNCTION, out _, out _); + public static Ast NO_ATTRIBUTE_AST = Parser.ParseInput(NO_ATTRIBUTE, out _, out _); + public static Ast NO_ATTRIBUTE_NESTED_AST = Parser.ParseInput(NO_ATTRIBUTE_NESTED, out _, out _); + public static Ast ATTRIBUTE_PARAM_AST = Parser.ParseInput(ATTRIBUTE_PARAM, out _, out _); + public static Ast ATTRIBUTE_GLOBAL_AST = Parser.ParseInput(ATTRIBUTE_GLOBAL, out _, out _); + public static Ast ATTRIBUTE_NESTED_NO_PARAM_AST = Parser.ParseInput(ATTRIBUTE_NESTED_NO_PARAM, out _, out _); + public static Ast ATTRIBUTE_NESTED_PARAM_AST = Parser.ParseInput(ATTRIBUTE_NESTED_PARAM, out _, out _); + + public static IEnumerable Data { + get { + var commandFinder = new Func(ast => ast is CommandAst commandAst && commandAst.GetCommandName() == "unknown-function"); + + yield return new TestCaseData( + NO_PARAM_GLOBAL_AST, + NO_PARAM_GLOBAL_AST.Find(commandFinder, true), + false, + false + ); + + yield return new TestCaseData( + NO_PARAM_FUNCTION_AST, + NO_PARAM_FUNCTION_AST.Find(commandFinder, true), + false, + false + ); + + yield return new TestCaseData( + NO_ATTRIBUTE_AST, + NO_ATTRIBUTE_AST.Find(commandFinder, true), + true, + false + ); + + yield return new TestCaseData( + NO_ATTRIBUTE_NESTED_AST, + NO_ATTRIBUTE_NESTED_AST.Find(commandFinder, true), + true, + false + ); + + yield return new TestCaseData( + ATTRIBUTE_PARAM_AST, + ATTRIBUTE_PARAM_AST.Find(commandFinder, true), + true, + true + ); + + yield return new TestCaseData( + ATTRIBUTE_GLOBAL_AST, + ATTRIBUTE_GLOBAL_AST.Find(commandFinder, true), + true, + true + ); + + yield return new TestCaseData( + ATTRIBUTE_NESTED_NO_PARAM_AST, + ATTRIBUTE_NESTED_NO_PARAM_AST.Find(commandFinder, true), + true, + true + ); + + yield return new TestCaseData( + ATTRIBUTE_NESTED_PARAM_AST, + ATTRIBUTE_NESTED_PARAM_AST.Find(commandFinder, true), + true, + false + ); + } + } + } + + + internal static class AstParser { + private static readonly string[] SupressArgs = ["ModuleNotFoundDuringParse"]; + + private static readonly string INVALID_AST = /*ps1*/ """ + some random invalid ast { + """; + + private static readonly string VALID_AST = /*ps1*/ """ + function Test-Function { + param($param1) + + Write-Host $param1 + } + """; + + private static readonly string VALID_AST_WITH_ERROR = /*ps1*/ $$""" + using module UnknownModule + + {{VALID_AST}} + """; + + public static IEnumerable Data { + get { + yield return new TestCaseData( + VALID_AST, + Option.Some("test.ps1"), + Array.Empty(), + false + ).SetName("No Error with file name"); + + yield return new TestCaseData( + VALID_AST, + Option.None, + Array.Empty(), + false + ).SetName("No Error without file name"); + + yield return new TestCaseData( + INVALID_AST, + Option.None, + Array.Empty(), + true + ).SetName("Error with invalid ast"); + + yield return new TestCaseData( + VALID_AST_WITH_ERROR, + Option.None, + Array.Empty(), + true + ).SetName("Error with valid ast and error"); + + yield return new TestCaseData( + VALID_AST_WITH_ERROR, + Option.None, + SupressArgs, + false + ).SetName("Suppressed error with valid ast and error"); + } + } + } + + internal static class AstFinder { + private static readonly string NOTHING_AST = /*ps1*/ """ + # Nothing + """; + + public static IEnumerable Functions { + get { + var incorrectExportArgument = /*ps1*/ """ + function Test-Function { } + Export-ModuleMember -Function (Get-Date) + """; + + var singleFunctionNoExport = /*ps1*/ """ + function Test-Function { } + """; + + var singleFunctionExported = /*ps1*/ $$""" + {{singleFunctionNoExport}} + Export-ModuleMember -Function Test-Function + """; + + var multipleFunctionsNoExport = /*ps1*/ """ + function Test-Function1 { } + function Test-Function2 { } + function Test-Function3 { } + """; + + var multipleFunctionsExported = /*ps1*/ $$""" + {{multipleFunctionsNoExport}} + Export-ModuleMember -Function Test-Function, Test-Function1, Test-Function2, Test-Function3 + """; + + var multipleExportCommands = /*ps1*/ $$""" + {{singleFunctionExported}} + {{multipleFunctionsNoExport}} + """; + + var singleExportArray = new[] { "Test-Function" }; + var multipleExportArray = new[] { "Test-Function1", "Test-Function2", "Test-Function3" }; + var noExportArray = Array.Empty(); + var allFunctionsArray = new[] { "Test-Function", "Test-Function1", "Test-Function2", "Test-Function3" }; + + yield return new TestCaseData(NOTHING_AST, noExportArray, false); + yield return new TestCaseData(NOTHING_AST, noExportArray, true); + yield return new TestCaseData(incorrectExportArgument, noExportArray, true); + + yield return new TestCaseData(singleFunctionNoExport, singleExportArray, false); + yield return new TestCaseData(singleFunctionNoExport, singleExportArray, true); + yield return new TestCaseData(singleFunctionExported, singleExportArray, true); + + yield return new TestCaseData(multipleFunctionsNoExport, multipleExportArray, false); + yield return new TestCaseData(multipleFunctionsNoExport, multipleExportArray, true); + yield return new TestCaseData(multipleFunctionsExported, multipleExportArray, true); + + yield return new TestCaseData(multipleExportCommands, allFunctionsArray, false); + } + } + + public static IEnumerable Namespaces { + get { + var singleNamespace = /*ps1*/ """ + using namespace System.Collections.Generic + """; + + var multipleNamespaces = /*ps1*/ $$""" + {{singleNamespace}} + using namespace System.Management.Automation.Language + using namespace System.Text.RegularExpressions + """; + + var singleNamespaceArray = new[] { "System.Collections.Generic" }; + var multipleNamespaceArray = new[] { "System.Collections.Generic", "System.Management.Automation.Language", "System.Text.RegularExpressions" }; + + yield return new TestCaseData(NOTHING_AST, Array.Empty()); + yield return new TestCaseData(singleNamespace, singleNamespaceArray); + yield return new TestCaseData(singleNamespace, singleNamespaceArray); + yield return new TestCaseData(multipleNamespaces, multipleNamespaceArray); + } + } + + public static IEnumerable NameOnlyModules { + get { + var singleUsingModule = /*ps1*/ """ + using module BitLocker + """; + + var singleRequireModule = /*ps1*/ """ + #Requires -Modules PnpDevice + """; + + var multipleUsingModule = /*ps1*/ $$""" + {{singleUsingModule}} + using module SecureBoot + using module DnsClient + """; + + var multipleRequireModule = /*ps1*/ $$""" + {{singleRequireModule}} + #Requires -Modules AppBackgroundTask,SmbShare,PKI + """; + + var mixedModules = /*ps1*/ $$""" + {{multipleRequireModule}} + {{multipleUsingModule}} + """; + + var singleUsingModuleArray = new Dictionary> { + ["BitLocker"] = new Dictionary { + ["AST"] = "using module BitLocker" + } + }; + + var singleRequireModuleArray = new Dictionary> { + ["PnpDevice"] = [] + }; + + var multipleUsingModuleArray = new Dictionary> { + ["BitLocker"] = new Dictionary { + ["AST"] = "using module BitLocker" + }, + ["SecureBoot"] = new Dictionary { + ["AST"] = "using module SecureBoot" + }, + ["DnsClient"] = new Dictionary { + ["AST"] = "using module DnsClient" + } + }; + + var multipleRequireModuleArray = new Dictionary> { + ["PnpDevice"] = [], + ["AppBackgroundTask"] = [], + ["SmbShare"] = [], + ["PKI"] = [] + }; + + var mixedModulesArray = new Dictionary> { + ["BitLocker"] = new(singleUsingModuleArray["BitLocker"]), + ["SecureBoot"] = new(multipleUsingModuleArray["SecureBoot"]), + ["PnpDevice"] = new(singleRequireModuleArray["PnpDevice"]), + ["DnsClient"] = new(multipleUsingModuleArray["DnsClient"]), + ["AppBackgroundTask"] = new(multipleRequireModuleArray["AppBackgroundTask"]), + ["SmbShare"] = new(multipleRequireModuleArray["SmbShare"]), + ["PKI"] = new(multipleRequireModuleArray["PKI"]) + }; + + yield return new TestCaseData(NOTHING_AST, new Dictionary>(), false); + + yield return new TestCaseData(singleUsingModule, singleUsingModuleArray, false); + yield return new TestCaseData(singleRequireModule, singleRequireModuleArray, false); + + yield return new TestCaseData(multipleUsingModule, multipleUsingModuleArray, false); + yield return new TestCaseData(multipleRequireModule, multipleRequireModuleArray, false); + + yield return new TestCaseData(mixedModules, mixedModulesArray, false); + } + } + + public static IEnumerable ModuleSpecifications { + get { + yield return new TestCaseData( + """ + using module @{ + ModuleName = 'BitLocker'; + Guid = '0ff02bb8-300a-4262-ac08-e06dd810f1b6'; + RequiredVersion = '1.0.0.0' + } + """, + new Dictionary> { + ["BitLocker"] = new Dictionary { + ["ModuleName"] = "BitLocker", + ["Guid"] = Guid.Parse("0ff02bb8-300a-4262-ac08-e06dd810f1b6"), + ["RequiredVersion"] = Version.Parse("1.0.0.0") + } + }, + true + ); + + yield return new TestCaseData( + """ + using module @{ + ModuleName = 'PSReadLine'; + Guid = '5714753b-2afd-4492-a5fd-01d9e2cff8b5'; + ModuleVersion = '2.3.2'; + MaximumVersion = '2.3.5'; + } + """, + new Dictionary> { + ["PSReadLine"] = new Dictionary { + ["ModuleName"] = "PSReadLine", + ["Guid"] = Guid.Parse("5714753b-2afd-4492-a5fd-01d9e2cff8b5"), + ["ModuleVersion"] = Version.Parse("2.3.2"), + ["MaximumVersion"] = Version.Parse("2.3.5") + } + }, + true + ); + } + } + } +} diff --git a/tests/Compiler/AstHelpersTests.cs b/tests/Compiler/AstHelpersTests.cs deleted file mode 100644 index eef5df6f..00000000 --- a/tests/Compiler/AstHelpersTests.cs +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright (c) James Draycott. All Rights Reserved. -// Licensed under the GPL3 License, See LICENSE in the project root for license information. - -using Compiler.Analyser; -using System.Collections; -using System.Management.Automation.Language; - -namespace Compiler.Test; - -public class AstHelperTests { - [TestCaseSource(typeof(TestData), nameof(TestData.ChildAndRoot))] - public void FindRoot_ReturnsRootAst( - Ast parentAst, - Ast childAst, - bool _, - bool __) => Assert.That(AstHelper.FindRoot(childAst), Is.EqualTo(parentAst)); - - [TestCaseSource(typeof(TestData), nameof(TestData.ChildAndRoot))] - public void FindClosestParamBlock_ReturnsParamBlock( - Ast _, - Ast childAst, - bool hasParamBlock, - bool attributePresentOnClosestParamBlock) { - if (!hasParamBlock) { - Assert.That(AstHelper.FindClosestParamBlock(childAst), Is.Null); - } else { - var result = AstHelper.FindClosestParamBlock(childAst); - - Assert.Multiple(() => { - Assert.That(result, Is.Not.Null); - Assert.That(result, Is.TypeOf()); - - if (attributePresentOnClosestParamBlock) { - Assert.That(result?.Attributes, Is.Not.Null); - Assert.That(result?.Attributes, Has.Count.EqualTo(1)); - - var attributes = SuppressAnalyserAttribute.FromAttributes(result!.Attributes); - var attribute = attributes.First(); - Assert.That(attribute, Is.Not.Null); - Assert.That(attribute, Is.TypeOf()); - } - }); - } - } -} - -file static class TestData { - public static string USING_STATEMENTS = /*ps1*/ $$""" - using assembly '{{typeof(AstHelper).Assembly.Location}}' - using namespace Compiler.Analyser - """; - - public static string ATTRIBUTE = /*ps1*/ """ - [SuppressAnalyser('UseOfUnknownFunction', 'unknown-function', 'Justification')] - """; - - public static string NO_PARAM_GLOBAL = /*ps1*/ $$""" - {{USING_STATEMENTS}} - - unknown-function - """; - - public static string NO_PARAM_FUNCTION = /*ps1*/ $$""" - {{USING_STATEMENTS}} - - function Test-Function { - unknown-function - } - - Test-Function - """; - - public static string NO_ATTRIBUTE = /*ps1*/ $$""" - {{USING_STATEMENTS}} - - function Test-Function { - param($param1) - - unknown-function $param1 - } - - Test-Function - """; - - public static string NO_ATTRIBUTE_NESTED = /*ps1*/ $$""" - {{USING_STATEMENTS}} - - function Test-Function { - param($param1) - - & { - unknown-function $param1 - } - } - - Test-Function - """; - - public static string ATTRIBUTE_PARAM = /*ps1*/ $$""" - {{USING_STATEMENTS}} - - function Test-Function { - {{ATTRIBUTE}} - param($param1) - - unknown-function $param1 - } - - Test-Function - """; - - public static string ATTRIBUTE_GLOBAL = /*ps1*/ $$""" - {{USING_STATEMENTS}} - - {{ATTRIBUTE}} - param($param1) - - unknown-function $param1 - """; - - public static string ATTRIBUTE_NESTED_NO_PARAM = /*ps1*/ $$""" - {{USING_STATEMENTS}} - - function Test-Function { - {{ATTRIBUTE}} - param($param1) - - & { - unknown-function $param1 - } - } - - Test-Function - """; - - public static string ATTRIBUTE_NESTED_PARAM = /*ps1*/ $$""" - {{USING_STATEMENTS}} - - function Test-Function { - {{ATTRIBUTE}} - param($param1) - - & { - param() - - unknown-function $param1 - } - } - - Test-Function - """; - - public static Ast NO_PRAM_GLOBAL_AST = Parser.ParseInput(NO_PARAM_GLOBAL, out _, out _); - public static Ast NO_PARAM_FUNCTION_AST = Parser.ParseInput(NO_PARAM_FUNCTION, out _, out _); - public static Ast NO_ATTRIBUTE_AST = Parser.ParseInput(NO_ATTRIBUTE, out _, out _); - public static Ast NO_ATTRIBUTE_NESTED_AST = Parser.ParseInput(NO_ATTRIBUTE_NESTED, out _, out _); - public static Ast ATTRIBUTE_PARAM_AST = Parser.ParseInput(ATTRIBUTE_PARAM, out _, out _); - public static Ast ATTRIBUTE_GLOBAL_AST = Parser.ParseInput(ATTRIBUTE_GLOBAL, out _, out _); - public static Ast ATTRIBUTE_NESTED_NO_PARAM_AST = Parser.ParseInput(ATTRIBUTE_NESTED_NO_PARAM, out _, out _); - public static Ast ATTRIBUTE_NESTED_PARAM_AST = Parser.ParseInput(ATTRIBUTE_NESTED_PARAM, out _, out _); - - public static IEnumerable ChildAndRoot { - get { - var commandFinder = new Func(ast => ast is CommandAst commandAst && commandAst.GetCommandName() == "unknown-function"); - - yield return new TestCaseData( - NO_PRAM_GLOBAL_AST, - NO_PRAM_GLOBAL_AST.Find(commandFinder, true), - false, - false - ); - - yield return new TestCaseData( - NO_PARAM_FUNCTION_AST, - NO_PARAM_FUNCTION_AST.Find(commandFinder, true), - false, - false - ); - - yield return new TestCaseData( - NO_ATTRIBUTE_AST, - NO_ATTRIBUTE_AST.Find(commandFinder, true), - true, - false - ); - - yield return new TestCaseData( - NO_ATTRIBUTE_NESTED_AST, - NO_ATTRIBUTE_NESTED_AST.Find(commandFinder, true), - true, - false - ); - - yield return new TestCaseData( - ATTRIBUTE_PARAM_AST, - ATTRIBUTE_PARAM_AST.Find(commandFinder, true), - true, - true - ); - - yield return new TestCaseData( - ATTRIBUTE_GLOBAL_AST, - ATTRIBUTE_GLOBAL_AST.Find(commandFinder, true), - true, - true - ); - - yield return new TestCaseData( - ATTRIBUTE_NESTED_NO_PARAM_AST, - ATTRIBUTE_NESTED_NO_PARAM_AST.Find(commandFinder, true), - true, - true - ); - - yield return new TestCaseData( - ATTRIBUTE_NESTED_PARAM_AST, - ATTRIBUTE_NESTED_PARAM_AST.Find(commandFinder, true), - true, - false - ); - } - } -} diff --git a/tests/Compiler/packages.lock.json b/tests/Compiler/packages.lock.json index 370596df..590c4163 100644 --- a/tests/Compiler/packages.lock.json +++ b/tests/Compiler/packages.lock.json @@ -47,6 +47,11 @@ "resolved": "2.9.1", "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" }, + "Extended.Collections": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "PvLjUHQeX6MwjF34eQhU6EE1fCRC5zYcX/u10n+ZUkzgv+hRtZSHj1JzAg7AQ5a6iEcLZ2yCb5VBDzdupErDNQ==" + }, "LanguageExt.Core": { "type": "Transitive", "resolved": "5.0.0-beta-07", @@ -390,6 +395,7 @@ "type": "Project", "dependencies": { "CommandLineParser": "[2.9.1, )", + "Extended.Collections": "[1.1.1, )", "LanguageExt.Core": "[5.0.0-beta-07, )", "NLog": "[5.3.2, )", "NuGet.Commands": "[6.9.1, )", From 2fe569ffb349093465a25dfee591e865287b1a8b Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 5 Sep 2024 18:39:50 +1000 Subject: [PATCH 134/341] fix(Compiler): More async, fix race issues & more tests * Move the QueueResolve function to TryCreate so testing is easier. * Add atomic cache for FindCachedResult * Fix issue in version comparisons that was selecting incorrect versions in FindCachedResult * Swap out random usage for test context random in tests. --- src/Compiler/Analyser/Suppression.cs | 12 +- src/Compiler/Module/Compiled/Script.cs | 4 +- src/Compiler/Module/Module.cs | 2 +- src/Compiler/Module/Resolvable/Local.cs | 11 +- src/Compiler/Module/Resolvable/Remote.cs | 96 ++++-- src/Compiler/Module/Resolvable/Resolvable.cs | 162 +++++----- src/Compiler/Module/Resolvable/Script.cs | 4 +- src/Compiler/Program.cs | 93 +++--- src/Compiler/Requirements/ModuleSpec.cs | 18 +- .../{Requirements.cs => Requirement.cs} | 56 +--- src/Compiler/Requirements/RequirementGroup.cs | 50 +++ src/Compiler/Requirements/RunAsAdmin.cs | 2 - src/Compiler/Utils.cs | 1 + tests/Compiler/Compiler.Test.csproj | 10 +- tests/Compiler/GlobalSuppressions.cs | 8 + tests/Compiler/Module/Compiled/Compiled.cs | 4 +- tests/Compiler/Module/Resolvable/Local.cs | 209 ++++++++++--- tests/Compiler/Module/Resolvable/Remote.cs | 200 ++++++++++++ tests/Compiler/Requirements/ModuleSpec.cs | 171 +++++----- tests/Compiler/Requirements/Requirement.cs | 215 +++++++++++++ .../Compiler/Requirements/RequirementGroup.cs | 120 +++++++ tests/Compiler/Requirements/Requirements.cs | 296 ------------------ tests/Compiler/packages.lock.json | 17 + 23 files changed, 1109 insertions(+), 652 deletions(-) rename src/Compiler/Requirements/{Requirements.cs => Requirement.cs} (58%) create mode 100644 src/Compiler/Requirements/RequirementGroup.cs create mode 100644 tests/Compiler/Module/Resolvable/Remote.cs create mode 100644 tests/Compiler/Requirements/Requirement.cs create mode 100644 tests/Compiler/Requirements/RequirementGroup.cs delete mode 100644 tests/Compiler/Requirements/Requirements.cs diff --git a/src/Compiler/Analyser/Suppression.cs b/src/Compiler/Analyser/Suppression.cs index c0d05d12..58160726 100644 --- a/src/Compiler/Analyser/Suppression.cs +++ b/src/Compiler/Analyser/Suppression.cs @@ -14,15 +14,15 @@ [NotNull] string Justification [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] public sealed class SuppressAnalyserAttribute( - string CheckType, - object? Data, - string Justification + string checkType, + object? data, + string justification ) : Attribute { [return: NotNull] public Suppression GetSupression() { - var assemblyName = "Compiler.Analyser.Rules." + CheckType; - var type = Type.GetType(assemblyName, false, true) ?? throw new ArgumentException($"Could not find rule for suppression {CheckType}"); - return new Suppression(type, Data, Justification); + var assemblyName = "Compiler.Analyser.Rules." + checkType; + var type = Type.GetType(assemblyName, false, true) ?? throw new ArgumentException($"Could not find rule for suppression {checkType}"); + return new Suppression(type, data, justification); } public static IEnumerable FromAttributes(IEnumerable attributes) { diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 21152d87..a0034f72 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -52,7 +52,7 @@ RequirementGroup requirements var loadOrder = thisGraph.TopologicalSort(); var reversedLoadOrder = loadOrder.Reverse(); - reversedLoadOrder.ToList().ForEach(async resolvable => { + Task.WhenAll(reversedLoadOrder.Select(async resolvable => { var compiledRequirements = await Task.WhenAll(thisGraph .OutEdges(resolvable) .Select(async edge => { @@ -71,7 +71,7 @@ RequirementGroup requirements } else { this.Graph.AddVertex(compiledModule); } - }); + })).Wait(); this.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { var imports = this.Graph.OutEdges(compiled).Select(edge => edge.Target); diff --git a/src/Compiler/Module/Module.cs b/src/Compiler/Module/Module.cs index d1d17b1c..92d76700 100644 --- a/src/Compiler/Module/Module.cs +++ b/src/Compiler/Module/Module.cs @@ -8,7 +8,7 @@ namespace Compiler.Module; #pragma warning disable CA1716 public abstract partial class Module(ModuleSpec moduleSpec) { #pragma warning restore CA1716 - public virtual ModuleSpec ModuleSpec { get; } = moduleSpec; + public virtual ModuleSpec ModuleSpec { get; init; } = moduleSpec; public RequirementGroup Requirements { get; } = new(); diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 6ed2f0d6..75f0ad71 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -78,8 +78,6 @@ public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) { ["ModuleNotFoundDuringParse"] ).Catch(err => err.Enrich(this.ModuleSpec)).As().ThrowIfFail(); - this.QueueResolve(); - // Remove empty lines this.Editor.AddRegexEdit(0, EntireEmptyLineRegex(), _ => { return null; }); @@ -122,7 +120,7 @@ public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) { return ModuleMatch.None; } - public override Option ResolveRequirements() { + public override Task> ResolveRequirements() { AstHelper.FindDeclaredModules(this.Ast).ToList().ForEach(module => { if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) { this.Editor.AddExactEdit( @@ -166,15 +164,15 @@ public override Option ResolveRequirements() { } }); - return None; + return Option.None.AsTask(); } - public override Fin IntoCompiled() => CompiledDocument.FromBuilder(this.Editor, 0) + public override Task> IntoCompiled() => CompiledDocument.FromBuilder(this.Editor, 0) .AndThenTry(doc => new CompiledLocalModule( this.ModuleSpec, doc, this.Requirements - ) as Compiled.Compiled); + ) as Compiled.Compiled).AsTask(); public override bool Equals(object? obj) { if (obj is null) return false; @@ -206,3 +204,4 @@ public override bool Equals(object? obj) { private static partial Regex RequiresStatementRegex(); #endregion } + diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 9fc15c99..08193827 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -2,8 +2,8 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; +using System.Diagnostics.Contracts; using System.IO.Compression; -using System.Security.Cryptography; using Compiler.Module.Compiled; using Compiler.Requirements; using LanguageExt; @@ -11,25 +11,29 @@ using NLog; namespace Compiler.Module.Resolvable; -public class ResolvableRemoteModule : Resolvable { +public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSpec), IDisposable { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly object UsingPSRepoLock = new(); - private MemoryStream? MemoryStream; - private string? CachedFile; - public ResolvableRemoteModule(ModuleSpec moduleSpec) : base(moduleSpec) => this.QueueResolve(); + // Only public for testing purposes. + public Atom>? CachedFile; - private string CachePath => Path.Join( + public string CachePath => Path.Join( Path.GetTempPath(), "PowerShellGet", this.ModuleSpec.Name ); + ~ResolvableRemoteModule() { + this.MemoryStream?.Dispose(); + } + + [Pure] public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) => this.ModuleSpec.CompareTo(requirement); - public override Option ResolveRequirements() { - this.MemoryStream ??= new MemoryStream(File.ReadAllBytes(this.FindCachedResult() ?? this.CacheResult().Match( + public override async Task> ResolveRequirements() { + this.MemoryStream ??= new MemoryStream(File.ReadAllBytes((await this.FindCachedResult()).ToFin().BindFail(_ => this.CacheResult()).Match( Fail: error => throw error, Succ: path => path )), false); @@ -70,9 +74,9 @@ public override Option ResolveRequirements() { ); } - public override Fin IntoCompiled() { + public override async Task> IntoCompiled() { if (this.MemoryStream == null) { - var memoryStreamResult = this.FindCachedResult().AsOption().ToFin() + var memoryStreamResult = (await this.FindCachedResult()).ToFin() .BiBind( Succ: value => FinSucc(value), Fail: _ => this.CacheResult().Catch(err => err.Enrich(this.ModuleSpec)).As()) @@ -90,20 +94,30 @@ public override Option ResolveRequirements() { ); } + [Pure] public override bool Equals(object? obj) { if (obj is null) return false; if (ReferenceEquals(this, obj)) return true; - return obj is ResolvableRemoteModule other && - this.ModuleSpec.CompareTo(other.ModuleSpec) == ModuleMatch.Same; + return obj is ResolvableRemoteModule other && this.GetModuleMatchFor(other.ModuleSpec) == ModuleMatch.Same; } - public string? FindCachedResult() { - if (this.CachedFile != null) return this.CachedFile; + public async Task> FindCachedResult() { + if (this.CachedFile is not null) { + var either = this.CachedFile.Value; + if (either.IsLeft) return (string)either; + + var waitingForResetEvent = (ManualResetEventSlim)either; + await waitingForResetEvent.WaitHandle.WaitOneAsync(500, Program.CancelSource.Token); + await Task.Delay(10); // I don't know why this is needed, but it is. + if (waitingForResetEvent.IsSet) return (string)this.CachedFile.Value; + } else { + this.CachedFile = Atom>(new ManualResetEventSlim(false)); + } - if (!Directory.Exists(this.CachePath)) return null; + if (!Directory.Exists(this.CachePath)) return None; var files = Directory.GetFiles(this.CachePath, "*.nupkg"); - if (files.Length == 0) return null; + if (files.Length == 0) return None; var versions = files.Where(file => { var fileName = Path.GetFileName(file); @@ -119,14 +133,24 @@ public override bool Equals(object? obj) { } }); - var selectedVersion = versions.Where(version => { - var otherSpec = new ModuleSpec(this.ModuleSpec.Name, this.ModuleSpec.Id, requiredVersion: version); - var matchType = otherSpec.CompareTo(this.ModuleSpec); + Func findBestVersionFunc = (this.ModuleSpec.RequiredVersion, this.ModuleSpec.MinimumVersion, this.ModuleSpec.MaximumVersion) switch { + (Version requiredVersion, _, _) => version => version == requiredVersion, + (_, Version minimumVersion, Version maximumVersion) => version => version >= minimumVersion && version <= maximumVersion, + (_, Version minimumVersion, null) => version => version >= minimumVersion, + (_, null, Version maximumVersion) => version => version <= maximumVersion, + (null, null, null) => (_) => true + }; - return matchType is ModuleMatch.Same or ModuleMatch.Stricter; - }).OrderByDescending(version => version).FirstOrDefault(); + var posibleVersions = versions.Where(version => findBestVersionFunc(version)).ToArray(); + var selectedVersion = posibleVersions.OrderByDescending(version => version).FirstOrDefault(); + if (selectedVersion == null) return None; - return selectedVersion == null ? null : this.CachedFile = Path.Join(this.CachePath, $"{this.ModuleSpec.Name}.{selectedVersion}.nupkg"); + var selectedFile = Path.Join(this.CachePath, $"{this.ModuleSpec.Name}.{selectedVersion}.nupkg"); + var resetEvent = (ManualResetEventSlim)this.CachedFile.Value; + this.CachedFile.Swap(_ => Left(selectedFile)); + resetEvent.Set(); + + return selectedFile; } public Fin CacheResult() { @@ -139,7 +163,7 @@ public Fin CacheResult() { $Module = Find-PSResource -Name '{{this.ModuleSpec.Name}}' {{(versionString != null ? $"-Version '{versionString}'" : "")}}; $Module | Save-PSResource -Path '{{this.CachePath}}' -AsNupkg -SkipDependencyCheck; - return "$env:TEMP/PowerShellGet/{{this.ModuleSpec.Name}}/{{this.ModuleSpec.Name}}.$($Module.Version).nupkg"; + return "{{this.CachePath}}/{{this.ModuleSpec.Name}}.$($Module.Version).nupkg"; """; Logger.Debug( @@ -156,21 +180,41 @@ public Fin CacheResult() { lock (UsingPSRepoLock) { return Program.RunPowerShell(powerShellCode) .Map(objects => objects.First().ToString()) - .Tap(path => this.CachedFile = path); + .Tap(path => { + if (this.CachedFile is null) { + this.CachedFile = Atom>(Left(path)); + } else { + this.CachedFile.Swap(v => { + if (v.IsRight) { + var resetEvent = (ManualResetEventSlim)v; + resetEvent.Set(); + } + + return Left(path); + }); + } + }); } } // Based on https://github.com/PowerShell/PowerShellGet/blob/c6aea39ea05491c648efd7aebdefab1ae7c5b213/src/PowerShellGet.psm1#L111-L144 - private static string? ConvertVersionParameters( + [Pure] + public static string? ConvertVersionParameters( string? requiredVersion, string? minimumVersion, string? maximumVersion) => (requiredVersion, minimumVersion, maximumVersion) switch { (null, null, null) => null, - (string ver, null, null) => ver, + (string ver, _, _) => ver, (_, string min, null) => $"[{min},)", (_, null, string max) => $"(,{max}]", (_, string min, string max) => $"[{min},{max}]" }; + [Pure] public override int GetHashCode() => this.ModuleSpec.GetHashCode(); + + public void Dispose() { + this.MemoryStream?.Dispose(); + GC.SuppressFinalize(this); + } } diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index 6b95e4ed..6deefdd6 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -29,13 +29,14 @@ public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleS /// [return: NotNull] - public abstract Option ResolveRequirements(); + public abstract Task> ResolveRequirements(); + [return: NotNull] - public abstract Fin IntoCompiled(); + public abstract Task> IntoCompiled(); - protected void QueueResolve() => ThreadPool.QueueUserWorkItem(_ => { + protected virtual void QueueResolve() => ThreadPool.QueueUserWorkItem(async _ => { try { - this.ResolveRequirements().Match( + (await this.ResolveRequirements()).Match( exception => { Program.Errors.Add(exception); Program.CancelSource.Cancel(true); @@ -79,7 +80,9 @@ internal static Fin TryCreate( var parentPath = Path.GetDirectoryName(localParent.ModuleSpec.FullPath)!; try { Logger.Debug($"Looking for {moduleSpec.Name} module in {parentPath}."); - return FinSucc(new ResolvableLocalModule(parentPath, moduleSpec) as Resolvable); + var localModule = new ResolvableLocalModule(parentPath, moduleSpec); + localModule.QueueResolve(); + return FinSucc(localModule as Resolvable); } catch (ExceptionalException err) when (err.ToError() is InvalidModulePathError) { // Silent fall through to remote. } catch (ExceptionalException err) { @@ -92,11 +95,24 @@ internal static Fin TryCreate( } try { - return FinSucc(new ResolvableRemoteModule(moduleSpec) as Resolvable); + var remote = new ResolvableRemoteModule(moduleSpec); + remote.QueueResolve(); + + return FinSucc(remote as Resolvable); } catch (Exception err) { return FinFail(err); } } + + internal static Fin TryCreateScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] ResolvableParent parent) { + try { + var script = new ResolvableScript(moduleSpec, parent); + script.QueueResolve(); + return FinSucc(script); + } catch (Exception err) { + return FinFail(err); + } + } } /// @@ -115,7 +131,7 @@ [NotNull] Option WaitHandle private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private readonly Dictionary Resolvables = []; + public readonly Dictionary Resolvables = []; /// /// A graph of resolvable roots and their dependencies. @@ -195,7 +211,7 @@ public void QueueResolve([NotNull] Resolvable rootModule, Action } if (!resolvable.RequirementsResolved) { - await resolvable.RequirementsWaitHandle.WaitOneAsync(-1, Program.CancelSource.Token); + await resolvable.RequirementsWaitHandle.WaitOneAsync(10000, Program.CancelSource.Token); } if (!this.Resolvables.TryGetValue(moduleSpec, out var resolvableInfo)) { @@ -215,17 +231,20 @@ public void QueueResolve([NotNull] Resolvable rootModule, Action // otherwise we need to start the compilation. if (waitHandle.IsSome(out var handle)) { Logger.Debug($"Waiting for IntoCompiled to finish for {moduleSpec.Name}."); - await handle.WaitOneAsync(-1, Program.CancelSource.Token); + await handle.WaitOneAsync(10000, Program.CancelSource.Token); - resolvableInfo = this.Resolvables.GetValueOrDefault(moduleSpec)!; // Safety: We know its valid due to previous calls. - (compiledOpt, _, _) = resolvableInfo; + if (this.Resolvables.TryGetValue(moduleSpec, out resolvableInfo)) { + (compiledOpt, _, _) = resolvableInfo; - // Safety: We know its going to be some here due waitHandle being some and having triggered. - if (compiledOpt.Unwrap().IsErr(out var err, out var compiled)) { - return FinFail(err); + // Safety: We know its going to be some here due waitHandle being some and having triggered. + if (compiledOpt.Unwrap().IsErr(out var err, out var compiled)) { + return FinFail(err); + } + + return FinSucc(compiled); } - return FinSucc(compiled); + return FinFail(Error.New($"Failed to find compiled module for {moduleSpec.Name} after waiting for it.")); } else { var newWaitHandle = new ManualResetEvent(false); lock (this.Resolvables) { @@ -234,7 +253,7 @@ public void QueueResolve([NotNull] Resolvable rootModule, Action }; } - var newlyCompiledModule = resolvable.IntoCompiled(); + var newlyCompiledModule = await resolvable.IntoCompiled(); newlyCompiledModule.IfFail(err => Logger.Error(err.Message)); lock (this.Resolvables) { @@ -252,8 +271,8 @@ public void QueueResolve([NotNull] Resolvable rootModule, Action } } - public void StartCompilation() { - this.ResolveDepedencyGraph(); + public async Task StartCompilation() { + await this.ResolveDepedencyGraph(); // Get a list of the scripts which are roots and have no scripts depending on them. var topLevelScripts = this.Graph.Vertices.Where(resolvable => !this.Graph.TryGetInEdges(resolvable, out var inEdges) || !inEdges.Any()); @@ -272,66 +291,64 @@ public void StartCompilation() { /// /// Creates all the links between the modules and their dependencies. /// - private void ResolveDepedencyGraph() { - lock (this.Graph) { - var iterating = new Queue<(Resolvable?, ModuleSpec)>(this.Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); - while (iterating.Count > 0) { - var (parentResolvable, workingModuleSpec) = iterating.Dequeue(); - Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); - - // If the parent module has already been resolved this will be an orphan. - if (parentResolvable != null && !this.Graph.ContainsVertex(parentResolvable)) { - Logger.Debug("Parent module had already been resolved, skipping orphan."); - continue; - } + private async Task ResolveDepedencyGraph() { + var iterating = new Queue<(Resolvable?, ModuleSpec)>(this.Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); + while (iterating.Count > 0) { + var (parentResolvable, workingModuleSpec) = iterating.Dequeue(); + Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); + + // If the parent module has already been resolved this will be an orphan. + if (parentResolvable != null && !this.Graph.ContainsVertex(parentResolvable)) { + Logger.Debug("Parent module had already been resolved, skipping orphan."); + continue; + } - var resolvableResult = this.LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); - - Option workingResolvable = None; - switch (resolvableResult) { - case var fail when fail.IsFail: - Logger.Error($"Failed to link {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); - fail.IfFail(Program.Errors.Add); - continue; - case var succ when succ.IsSucc: - Logger.Debug($"Linked {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); - workingResolvable = succ.Unwrap(); - break; - default: - break; - } + var resolvableResult = this.LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); - // If it was null or there are out edges it means this module has already been resolved. - if (workingResolvable.IsNone || (this.Graph.TryGetOutEdges(workingResolvable.ValueUnsafe()!, out var outEdges) && outEdges.Any())) { - Logger.Debug("Module has already been resolved, skipping."); + Option workingResolvable = None; + switch (resolvableResult) { + case var fail when fail.IsFail: + Logger.Error($"Failed to link {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); + fail.IfFail(Program.Errors.Add); continue; - } + case var succ when succ.IsSucc: + Logger.Debug($"Linked {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); + workingResolvable = succ.Unwrap(); + break; + default: + break; + } - var safeWorkingResolvable = workingResolvable.ValueUnsafe()!; - // TODO Maybe push to the end of the queue or something. - if (!safeWorkingResolvable.RequirementsResolved) { - if (iterating.Count == 0) { - Logger.Debug("Requirements not resolved, waiting for them to be resolved."); - safeWorkingResolvable.RequirementsWaitHandle.WaitOne(); - } else { - Logger.Debug("Requirements not resolved, pushing to the end of the queue."); - iterating.Enqueue((parentResolvable, workingModuleSpec)); - continue; - } - } + // If it was null or there are out edges it means this module has already been resolved. + if (workingResolvable.IsNone || (this.Graph.TryGetOutEdges(workingResolvable.ValueUnsafe()!, out var outEdges) && outEdges.Any())) { + Logger.Debug("Module has already been resolved, skipping."); + continue; + } - lock (safeWorkingResolvable.Requirements) { - safeWorkingResolvable.Requirements.GetRequirements().ToList().ForEach(requirement => iterating.Enqueue((safeWorkingResolvable, requirement))); + var safeWorkingResolvable = workingResolvable.ValueUnsafe()!; + // TODO Maybe push to the end of the queue or something. + if (!safeWorkingResolvable.RequirementsResolved) { + if (iterating.Count == 0) { + Logger.Debug("Requirements not resolved, waiting for them to be resolved."); + await safeWorkingResolvable.RequirementsWaitHandle.WaitOneAsync(-1, Program.CancelSource.Token); + } else { + Logger.Debug("Requirements not resolved, pushing to the end of the queue."); + iterating.Enqueue((parentResolvable, workingModuleSpec)); + continue; } } - var dotGraph = this.Graph.ToGraphviz(alg => { - alg.FormatVertex += (sender, args) => { - args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; - }; - }); - Console.WriteLine(dotGraph); + lock (safeWorkingResolvable.Requirements) { + safeWorkingResolvable.Requirements.GetRequirements().ToList().ForEach(requirement => iterating.Enqueue((safeWorkingResolvable, requirement))); + } } + + var dotGraph = this.Graph.ToGraphviz(alg => { + alg.FormatVertex += (sender, args) => { + args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; + }; + }); + Console.WriteLine(dotGraph); } /// @@ -384,15 +401,14 @@ public Fin> LinkFindingPossibleResolved( [.. mergeWith] ); - if (fin.IsErr(out var err, out _) && err is InvalidModulePathError) { + if (fin.IsErr(out var err, out var resolvable) && err is InvalidModulePathError) { Logger.Debug($"Failed to find local module {moduleToResolve.Name}, trying remote."); } else if (err is not null) { return FinFail>(err); + } else { + resultingResolvable = resolvable; } - resultingResolvable = fin.UnwrapOrElse(() => { - return new ResolvableRemoteModule(moduleToResolve.MergeSpecs([foundResolvable.ModuleSpec])); - }); break; case ModuleMatch.None or ModuleMatch.PreferTheirs or ModuleMatch.Looser: goto default; diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index 46a5b462..b5a1011d 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -41,14 +41,14 @@ public ResolvableScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] Resolva #endregion } - public override Fin IntoCompiled() => CompiledDocument.FromBuilder(this.Editor, 0) + public override Task> IntoCompiled() => CompiledDocument.FromBuilder(this.Editor, 0) .AndThenTry(doc => new Compiled.CompiledScript( this, doc, this.ResolvableParent, this.ExtractParameterBlock(), this.Requirements - ) as Compiled.Compiled); + ) as Compiled.Compiled).AsTask(); /// /// Looks for the parameter block of the script, diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 2785ac3a..38fd69a6 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -13,7 +13,6 @@ using System.Text; using CommandLine; using Compiler.Analyser; -using Compiler.Module.Compiled; using Compiler.Module.Resolvable; using Compiler.Requirements; using NLog; @@ -71,54 +70,54 @@ public class Options { private static async Task Main(string[] args) { var parser = new CommandLine.Parser(settings => settings.GetoptMode = true); - var result = parser.ParseArguments(args).MapResult(opts => { - CleanInput(opts); - IsDebugging = SetupLogger(opts) <= LogLevel.Debug; + var result = await parser.ParseArguments(args).MapResult( + async opts => { + CleanInput(opts); + IsDebugging = SetupLogger(opts) <= LogLevel.Debug; - var filesToCompile = GetFilesToCompile(opts.Input!); - EnsureDirectoryStructure(opts.Input!, opts.Output, filesToCompile); + var filesToCompile = GetFilesToCompile(opts.Input!); + EnsureDirectoryStructure(opts.Input!, opts.Output, filesToCompile); - var superParent = new ResolvableParent(); + var superParent = new ResolvableParent(); - ConcurrentBag<(string, Exception)> compilerErrors = []; - GetFilesToCompile(opts.Input!).ToList().ForEach(scriptPath => { - var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); - ResolvableScript resolvableScript; - try { - resolvableScript = new ResolvableScript(pathedModuleSpec, superParent); - } catch (Exception e) { - compilerErrors.Add((scriptPath, e)); - return; - } + ConcurrentBag<(string, Exception)> compilerErrors = []; + GetFilesToCompile(opts.Input!).ToList().ForEach(scriptPath => { + var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); + if (Resolvable.TryCreateScript(pathedModuleSpec, superParent).IsErr(out var error, out var resolvableScript)) { + compilerErrors.Add((scriptPath, error)); + return; + } - superParent.QueueResolve(resolvableScript, compiled => { - OutputToFile( - opts.Input!, - opts.Output, - scriptPath, - compiled.GetPowerShellObject(), - opts.Force); - Logger.Debug($"Compiled {scriptPath}"); + superParent.QueueResolve(resolvableScript, compiled => { + OutputToFile( + opts.Input!, + opts.Output, + scriptPath, + compiled.GetPowerShellObject(), + opts.Force); + Logger.Debug($"Compiled {scriptPath}"); + }); }); - }); - try { - superParent.StartCompilation(); - } catch (Exception err) { - Errors.Add(err); - } + try { + await superParent.StartCompilation(); + } catch (Exception err) { + Errors.Add(err); + } - Logger.Debug("Finished compilation."); + Logger.Debug("Finished compilation."); - if (compilerErrors.IsEmpty) return 0; + if (compilerErrors.IsEmpty) return 0; - foreach (var (scriptPath, e) in compilerErrors) { - Errors.Add(LanguageExt.Common.Error.New($"Error compiling {scriptPath}", e)); - } + foreach (var (scriptPath, e) in compilerErrors) { + Errors.Add(LanguageExt.Common.Error.New($"Error compiling {scriptPath}", e)); + } - return 1; - }, - errors => { + return 1; + }, +#pragma warning disable CS1998 + async errors => { +#pragma warning restore CS1998 Console.Error.WriteLine("There was an error parsing the command line arguments."); foreach (var err in errors) { Console.Error.WriteLine(err); @@ -182,22 +181,6 @@ private static async Task Main(string[] args) { return result; } - public static async Task CompileScript( - string scriptPath, - ResolvableParent superParent, - ConcurrentBag<(string, Exception)> compilerErrors, - CancellationToken ct) => await Task.Run(() => { - var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); - var resolvableScript = new ResolvableScript(pathedModuleSpec, superParent); - - try { - return (CompiledScript)resolvableScript.IntoCompiled(); - } catch (Exception e) { - lock (compilerErrors) { compilerErrors.Add((scriptPath, e)); } - return null; - } - }, ct); - public static void CleanInput(Options opts) { ArgumentException.ThrowIfNullOrWhiteSpace(opts.Input, nameof(opts.Input)); diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index 865b4908..dced5628 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -221,8 +221,24 @@ public virtual ModuleMatch CompareTo(ModuleSpec other) { public override int GetHashCode() => HashCode.Combine(this.Name, this.Id, this.MinimumVersion, this.MaximumVersion, this.RequiredVersion); public override int CompareTo(Requirement? other) { + if (other is null) return 1; + if (ReferenceEquals(this, other)) return 0; if (other is not ModuleSpec) return 0; - return this.CompareTo((ModuleSpec)other).CompareTo(ModuleMatch.Same); + + var otherSpec = (other as ModuleSpec)!; + var nameComparison = string.Compare(this.Name, otherSpec.Name, StringComparison.Ordinal); + var idComparison = this.Id?.CompareTo(otherSpec.Id) ?? 0; + var minVersionComparison = this.MinimumVersion?.CompareTo(otherSpec.MinimumVersion) ?? 0; + var maxVersionComparison = this.MaximumVersion?.CompareTo(otherSpec.MaximumVersion) ?? 0; + var reqVersionComparison = this.RequiredVersion?.CompareTo(otherSpec.RequiredVersion) ?? 0; + var weightComparison = this.Weight.CompareTo(otherSpec.Weight); + var supportsMultipleComparison = this.SupportsMultiple.CompareTo(otherSpec.SupportsMultiple); + + return Math.Clamp( + nameComparison + idComparison + minVersionComparison + maxVersionComparison + reqVersionComparison + weightComparison + supportsMultipleComparison, + -1, + 1 + ); } public override bool Equals(object? obj) { diff --git a/src/Compiler/Requirements/Requirements.cs b/src/Compiler/Requirements/Requirement.cs similarity index 58% rename from src/Compiler/Requirements/Requirements.cs rename to src/Compiler/Requirements/Requirement.cs index 718bf3cc..25f97641 100644 --- a/src/Compiler/Requirements/Requirements.cs +++ b/src/Compiler/Requirements/Requirement.cs @@ -2,55 +2,11 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; -using System.Collections.Immutable; using System.Text.Json; using System.Text.Json.Serialization; namespace Compiler.Requirements; -public sealed class RequirementGroup { - public Dictionary> StoredRequirements { get; init; } - - public RequirementGroup() => this.StoredRequirements ??= []; - - public bool AddRequirement(T value) where T : Requirement { - var typeName = typeof(T); - if (!this.StoredRequirements.TryGetValue(typeName, out var requirementList)) { - this.StoredRequirements.Add(typeName, [value]); - return true; - } else { - return requirementList.Add(value); - } - } - - public ImmutableList GetRequirements() where T : Requirement { - var typeName = typeof(T); - if (this.StoredRequirements.TryGetValue(typeName, out var value)) { - return value.Cast().ToImmutableList(); - } - - return []; - } - - public bool RemoveRequirement(T value) where T : Requirement { - var typeName = typeof(T); - if (this.StoredRequirements.TryGetValue(typeName, out var collection)) { - return collection.Remove(value); - } - - return false; - } - - public ImmutableList GetRequirements() { - var rawRequirements = this.StoredRequirements.Values; - if (rawRequirements.Count == 0) return []; - - var flattenedList = rawRequirements.ToList().SelectMany(x => x); - // bubble sort the requirements by their weight - return [.. flattenedList.OrderBy(x => x, new RequirementWeightSorter())]; - } -} - /// /// Represents a requirement, which is a condition that must be met in order to run the script. /// @@ -115,21 +71,21 @@ public override bool Equals(object? obj) { public override int GetHashCode() => HashCode.Combine(this.SupportsMultiple, this.Weight, this.Hash); - public static bool operator ==(Requirement left, Requirement right) { + public static bool operator ==(Requirement? left, Requirement? right) { if (left is null) return right is null; return left.Equals(right); } - public static bool operator !=(Requirement left, Requirement right) => !(left == right); + public static bool operator !=(Requirement? left, Requirement? right) => !(left == right); - public static bool operator <(Requirement left, Requirement right) => left is null ? right is not null : left.CompareTo(right) < 0; + public static bool operator <(Requirement? left, Requirement? right) => left is null ? right is not null : left.CompareTo(right) < 0; - public static bool operator <=(Requirement left, Requirement right) => left is null || left.CompareTo(right) <= 0; + public static bool operator <=(Requirement? left, Requirement? right) => left is null || left.CompareTo(right) <= 0; - public static bool operator >(Requirement left, Requirement right) => left is not null && left.CompareTo(right) > 0; + public static bool operator >(Requirement? left, Requirement? right) => left is not null && left.CompareTo(right) > 0; - public static bool operator >=(Requirement left, Requirement right) => left is null ? right is null : left.CompareTo(right) >= 0; + public static bool operator >=(Requirement? left, Requirement? right) => left is null ? right is null : left.CompareTo(right) >= 0; } /// diff --git a/src/Compiler/Requirements/RequirementGroup.cs b/src/Compiler/Requirements/RequirementGroup.cs new file mode 100644 index 00000000..cc01fe25 --- /dev/null +++ b/src/Compiler/Requirements/RequirementGroup.cs @@ -0,0 +1,50 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections.Immutable; + +namespace Compiler.Requirements; + +public sealed class RequirementGroup { + public Dictionary> StoredRequirements { get; init; } + + public RequirementGroup() => this.StoredRequirements ??= []; + + public bool AddRequirement(T value) where T : Requirement { + var typeName = typeof(T); + if (!this.StoredRequirements.TryGetValue(typeName, out var requirementList)) { + this.StoredRequirements.Add(typeName, [value]); + return true; + } else { + return requirementList.Add(value); + } + } + + public ImmutableList GetRequirements() where T : Requirement { + var typeName = typeof(T); + if (this.StoredRequirements.TryGetValue(typeName, out var value)) { + return value.Cast().ToImmutableList(); + } + + return []; + } + + public bool RemoveRequirement(T value) where T : Requirement { + var typeName = typeof(T); + if (this.StoredRequirements.TryGetValue(typeName, out var collection)) { + return collection.Remove(value); + } + + return false; + } + + public ImmutableList GetRequirements() { + var rawRequirements = this.StoredRequirements.Values; + if (rawRequirements.Count == 0) return []; + + var flattenedList = rawRequirements.ToList().SelectMany(x => x); + // bubble sort the requirements by their weight + return [.. flattenedList.OrderBy(x => x, new RequirementWeightSorter())]; + } +} + diff --git a/src/Compiler/Requirements/RunAsAdmin.cs b/src/Compiler/Requirements/RunAsAdmin.cs index f6aac1f1..15fc3995 100644 --- a/src/Compiler/Requirements/RunAsAdmin.cs +++ b/src/Compiler/Requirements/RunAsAdmin.cs @@ -16,9 +16,7 @@ public RunAsAdminRequirement() : base() { this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(STRING)); } - [ExcludeFromCodeCoverage(Justification = "It's just a string.")] public override string GetInsertableLine(Hashtable data) => STRING; - [ExcludeFromCodeCoverage(Justification = "Just a sick as fuck bool man!")] public override bool IsCompatibleWith(Requirement other) => true; } diff --git a/src/Compiler/Utils.cs b/src/Compiler/Utils.cs index f3d885f0..ac615389 100644 --- a/src/Compiler/Utils.cs +++ b/src/Compiler/Utils.cs @@ -12,6 +12,7 @@ namespace Compiler; /// /// Helper methods to make it a little more rust-like. /// +[ExcludeFromCodeCoverage] public static class Utils { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Option AsOption(this T? value) where T : class => diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index d4ef9c4f..fa679ab4 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -15,8 +15,16 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + diff --git a/tests/Compiler/GlobalSuppressions.cs b/tests/Compiler/GlobalSuppressions.cs index 5391838b..5baf7766 100644 --- a/tests/Compiler/GlobalSuppressions.cs +++ b/tests/Compiler/GlobalSuppressions.cs @@ -10,3 +10,11 @@ Scope = "namespaceanddescendants", Target = "~N:Compiler.Test" )] + +[assembly: SuppressMessage( + "Naming", + "CA1716:Identifiers should not match keywords", + Justification = "Thats just how it is", + Scope = "namespaceanddescendants", + Target = "~N:Compiler.Test" +)] diff --git a/tests/Compiler/Module/Compiled/Compiled.cs b/tests/Compiler/Module/Compiled/Compiled.cs index 891ec10f..e9e7b212 100644 --- a/tests/Compiler/Module/Compiled/Compiled.cs +++ b/tests/Compiler/Module/Compiled/Compiled.cs @@ -14,7 +14,7 @@ public void AddRequirementHashBytes_AlwaysSameResult( byte[] hashableBytes, RequirementGroup requirementGroup ) { - var random = new Random(); + var random = TestContext.CurrentContext.Random; List bytesList; var hashResults = new List(); do { @@ -35,7 +35,7 @@ RequirementGroup requirementGroup file static class TestData { public static IEnumerable AddRequirementHashData { get { - var random = new Random(); + var random = TestContext.CurrentContext.Random; var hashableBytes = new byte[random.Next(10, 100)]; random.NextBytes(hashableBytes); diff --git a/tests/Compiler/Module/Resolvable/Local.cs b/tests/Compiler/Module/Resolvable/Local.cs index b98cb360..e4b1e271 100644 --- a/tests/Compiler/Module/Resolvable/Local.cs +++ b/tests/Compiler/Module/Resolvable/Local.cs @@ -2,52 +2,181 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; +using Compiler.Module; +using Compiler.Module.Resolvable; +using Compiler.Requirements; +using LanguageExt.Common; namespace Compiler.Test.Module.Resolvable; [TestFixture] public class LocalModuleTests { - // [TestCaseSource(typeof(TestData), nameof(TestData.FixLinesCases))] - // public string TestCompileDocument(string testContent) - // { - // var module = new ResolvableLocalModule(TestUtils.GetModuleSpecFromContent(testContent)); - // var compiledDocument = CompiledDocument.FromBuilder(module.Editor); - // return compiledDocument.GetContent(); - // } - - public class TestData { - private static readonly string MULTILINE_STRING_LINES = """ - @" - Doing cool stuff with this indented multiline string! - - This is the end of the string! - "@; - @' - This is a multiline string with single quotes! - '@; - $MyVariable = @" - This is a multiline string with a variable inside: $MyVariable - "@; - """; - - public static IEnumerable FixLinesCases { - get { - yield return new TestCaseData( - MULTILINE_STRING_LINES - ).Returns(""" - @" - Doing cool stuff with this indented multiline string! - - This is the end of the string! - "@; - @' - This is a multiline string with single quotes! - '@; - $MyVariable = @" - This is a multiline string with a variable inside: $MyVariable - "@; - """).SetName("Fix multiline string indents"); + [TestCaseSource(typeof(TestData), nameof(TestData.Constructor_ThrowingData))] + public void Constructor_Throws( + string parentPath, + string filePath + ) { + var moduleSpec = new ModuleSpec(filePath); + var exception = Assert.Catch(() => new ResolvableLocalModule(parentPath, moduleSpec)); + Assert.That(exception.ToError(), Is.InstanceOf()); + } + + [TestCaseSource(typeof(TestData), nameof(TestData.Constructor_ReturnsData))] + public void Constructor_Returns( + string parentPath, + string filePath + ) { + var actualFileLocation = Path.GetFullPath(Path.Combine(parentPath, filePath)); + Directory.CreateDirectory(parentPath); + File.Create(actualFileLocation).Close(); + + var moduleSpec = new ModuleSpec(filePath); + var module = new ResolvableLocalModule(parentPath, moduleSpec); + + Assert.Multiple(() => { + Assert.That(module, Is.Not.Null); + Assert.That(module, Is.InstanceOf()); + Assert.That(module.ModuleSpec.FullPath, Is.EqualTo(actualFileLocation)); + }); + + File.Delete(actualFileLocation); + } + + [Repeat(10), Parallelizable] + [TestCaseSource(typeof(TestData), nameof(TestData.GetModuleMatch_MatchesByOnlyName))] + public ModuleMatch GetModuleMatch_MatchesByOnlyName( + string moduleOne, + string moduleTwo + ) { + if (TestContext.CurrentContext.CurrentRepeatCount % 2 == 0) { + (moduleTwo, moduleOne) = (moduleOne, moduleTwo); + } + + var random = TestContext.CurrentContext.Random; + var moduleSpecOne = new PathedModuleSpec(moduleOne, random.NextGuid()); + var moduleSpecTwo = new PathedModuleSpec(moduleTwo, random.NextGuid()); + var module = new ResolvableLocalModule(moduleSpecOne); + + return module.GetModuleMatchFor(moduleSpecTwo); + } + + [TestCaseSource(typeof(TestData), nameof(TestData.Equals_Data))] + public bool Equals( + ResolvableLocalModule moduleOne, + ResolvableLocalModule? moduleTwo + ) { + Assert.Multiple(() => { + Assert.That(moduleOne, Is.Not.Null); + if (moduleTwo != null) { + Assert.That(moduleOne.Equals(moduleTwo), Is.EqualTo(moduleTwo?.Equals(moduleOne))); } + }); + + return moduleOne.Equals(moduleTwo); + } + + [Test, Repeat(10), Parallelizable] + public void GetHashCode_NeverDiffersFromModuleSpec() { + var (module, _) = TestData.GetRandomModules(true); + + Assert.That(module.GetHashCode(), Is.EqualTo(module.ModuleSpec.GetHashCode())); + } +} + +file static class TestData { + private static readonly string TestPath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "LocalModuleTestData"); + private static readonly string TestParent = Path.Combine(TestPath, "Parent.ps1"); + private static readonly string TestChild = ".\\Child.psm1"; + + public static IEnumerable Constructor_ThrowingData { + get { + yield return new TestCaseData("../Folder/Script.ps1", TestChild) + .SetName("ParentPathIsNotAnAbsolutePath") + .SetDescription("Throws an InvalidModulePathError when the parent path is not an absolute path."); + + yield return new TestCaseData(TestParent, TestChild) + .SetName("ParentPathIsNotADirectory") + .SetDescription("Throws an InvalidModulePathError when the parent path is not a directory."); + + yield return new TestCaseData(Path.Join(TestPath, "Secondary"), TestChild) + .SetName("PathDoesNotExist") + .SetDescription("Throws an InvalidModulePathError when the path does not exist."); + + yield return new TestCaseData(TestPath, TestChild) + .SetName("PathNotAFile") + .SetDescription("Throws an InvalidModulePathError when the path is not a file."); } } + + public static IEnumerable Constructor_ReturnsData { + get { + yield return new TestCaseData(TestPath, TestChild) + .SetName("PathIsAFile") + .SetDescription("Returns a ResolvableLocalModule when the path is a file."); + } + } + + public static IEnumerable GetModuleMatch_MatchesByOnlyName { + get { + var (childOne, childTwo) = GetRandomFilePaths(true); + + yield return new TestCaseData(childOne, childTwo) + .Returns(ModuleMatch.None) + .SetName("NoMatch") + .SetDescription("Returns ModuleMatch.None when there is not a name match"); + + yield return new TestCaseData(childOne, childOne) + .Returns(ModuleMatch.Same) + .SetName("NameMatch") + .SetDescription("Returns ModuleMatch.Same when there is a name match"); + } + } + + public static IEnumerable Equals_Data { + get { + var (moduleOne, moduleTwo) = GetRandomModules(true); + + yield return new TestCaseData(moduleOne, moduleTwo) + .Returns(false) + .SetName("DifferentModuleSpec") + .SetDescription("Returns false when the module specs are different."); + + yield return new TestCaseData(moduleOne, moduleOne) + .Returns(true) + .SetName("SameModuleSpec") + .SetDescription("Returns true when the module specs are the same reference."); + + yield return new TestCaseData(moduleOne, null) + .Returns(false) + .SetName("NullModuleSpec") + .SetDescription("Returns false when the module spec is null."); + } + } + + public static (ResolvableLocalModule, ResolvableLocalModule) GetRandomModules(bool createFiles) { + var (childOne, childTwo) = GetRandomFilePaths(createFiles); + + var moduleSpecOne = new PathedModuleSpec(childOne, Guid.NewGuid()); + var moduleOne = new ResolvableLocalModule(moduleSpecOne); + + var moduleSpecTwo = new PathedModuleSpec(childTwo, Guid.NewGuid()); + var moduleTwo = new ResolvableLocalModule(moduleSpecTwo); + + return (moduleOne, moduleTwo); + } + + private static (string, string) GetRandomFilePaths(bool createFiles) { + var random = TestContext.CurrentContext.Random; + var parent = Path.Combine(TestPath, random.GetString(6)); + var childOne = Path.Combine(parent, random.GetString(6) + ".psm1"); + var childTwo = Path.Combine(parent, random.GetString(6) + ".psm1"); + + if (createFiles) { + Directory.CreateDirectory(parent); + File.Create(childOne).Close(); + File.Create(childTwo).Close(); + } + + return (childOne, childTwo); + } } diff --git a/tests/Compiler/Module/Resolvable/Remote.cs b/tests/Compiler/Module/Resolvable/Remote.cs new file mode 100644 index 00000000..ba0fc4a4 --- /dev/null +++ b/tests/Compiler/Module/Resolvable/Remote.cs @@ -0,0 +1,200 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.IO.Compression; +using System.Security.Cryptography; +using Compiler.Module; +using Compiler.Module.Resolvable; +using Compiler.Requirements; +using LanguageExt; +using LanguageExt.ClassInstances.Pred; +using LanguageExt.Common; +using LanguageExt.UnsafeValueAccess; + +namespace Compiler.Test.Module.Resolvable; + +[TestFixture] +public class ResolvableRemoteModuleTests { + private ResolvableRemoteModule ResolvableRemoteModule; + + [SetUp] + public void Setup() { + var moduleSpec = new ModuleSpec("PSReadLine", requiredVersion: new Version(2, 3, 5)); + this.ResolvableRemoteModule = new ResolvableRemoteModule(moduleSpec); + + if (Directory.Exists(this.ResolvableRemoteModule.CachePath)) { + Directory.Delete(this.ResolvableRemoteModule.CachePath, true); // Clean up any previous caches + } + } + + [TearDown] + public void Teardown() => this.ResolvableRemoteModule.Dispose(); + + [Test] + public void CachePath_IsCorrect() { + var cachePath = this.ResolvableRemoteModule.CachePath; + Assert.That(cachePath, Is.EqualTo(Path.Join(Path.GetTempPath(), "PowerShellGet\\PSReadLine"))); + } + + [Test] + public void GetModuleMatchFor_IsCorrect() { + var moduleMatch = this.ResolvableRemoteModule.GetModuleMatchFor(new ModuleSpec("PSReadLine")); + Assert.That(moduleMatch, Is.EqualTo(ModuleMatch.Stricter)); + } + + [Test] + public async Task ResolveRequirements() { + var result = await this.ResolvableRemoteModule.ResolveRequirements(); + var requirements = this.ResolvableRemoteModule.Requirements; + + Assert.Multiple(() => { + Assert.That(result, Is.EqualTo(Option.None)); + Assert.That(requirements.GetRequirements(), Has.Count.EqualTo(1)); + Assert.That(() => ((PSVersionRequirement)requirements.GetRequirements()[0]).Version, Is.EqualTo(new Version(5, 0))); + }); + } + + [TestCase( + [new string?[3] { "2.3.5", null, null }, new string[] { "2.3.5" }, "PSReadLine.2.3.5.nupkg"], + Description = "Selects the required version from a single cached file" + )] + [TestCase( + [new string?[3] { null, "2.3.5", null }, new string[] { "2.3.5" }, "PSReadLine.2.3.5.nupkg"], + Description = "Selects the minimum version from a single cached file" + )] + [TestCase( + [new string?[3] { "2.3.5", null, null }, new string[] { "2.3.2", "2.3.5", "2.3.7", "2.4.0" }, "PSReadLine.2.3.5.nupkg"], + Description = "Selects the required version from multiple cached files" + )] + [TestCase( + [new string?[3] { null, "2.3.5", null }, new string[] { "2.3.2", "2.3.5", "2.3.7", "2.4.0" }, "PSReadLine.2.4.0.nupkg"], + Description = "Selects the latest version because the minimum version is less than" + )] + [TestCase( + [new string?[3] { null, null, "2.3.6" }, new string[] { "2.3.2", "2.3.5", "2.3.7", "2.4.0" }, "PSReadLine.2.3.5.nupkg"], + Description = "Selects the closest to the maximum version from multiple cached files" + )] + [TestCase( + [new string?[3] { null, null, "2.3.5" }, new string[] { "2.3.2", "2.3.5", "2.3.7", "2.4.0" }, "PSReadLine.2.3.5.nupkg"], + Description = "Selects the maximum version from multiple cached files" + )] + [TestCase( + [new string?[3] { null, "2.3.4", "2.3.9" }, new string[] { "2.3.2", "2.3.5", "2.3.7", "2.4.0" }, "PSReadLine.2.3.7.nupkg"], + Description = "Selects the between the minimum and maximum version from multiple cached files" + )] + [TestCase( + [new string?[3] { null, null, null }, new string[] { "2.3.2", "2.3.5", "2.3.7", "2.4.0" }, "PSReadLine.2.4.0.nupkg"], + Description = "Selects the latest version with no version constraints" + )] + public async Task FindCachedResult( + string?[] moduleVersion, + string[] cachedVersions, + string expectedSelectedVersion + ) { + var moduleTuple = (moduleVersion[0], moduleVersion[1], moduleVersion[2]); + + var moduleSpec = moduleTuple switch { + (null, null, null) => new ModuleSpec("PSReadLine"), + (string req, _, _) => new ModuleSpec("PSReadLine", requiredVersion: new Version(req)), + (_, string minimum, null) => new ModuleSpec("PSReadLine", minimumVersion: new Version(minimum)), + (_, null, string maximum) => new ModuleSpec("PSReadLine", maximumVersion: new Version(maximum)), + (_, string minimum, string maximum) => new ModuleSpec("PSReadLine", minimumVersion: new Version(minimum), maximumVersion: new Version(maximum)) + }; + + var module = new ResolvableRemoteModule(moduleSpec); + TestData.CreateDummyCacheFiles(module, cachedVersions); + + var result = await module.FindCachedResult(); + Assert.Multiple(() => { + Assert.That(result.IsSome, Is.True); + Assert.That(result.ValueUnsafe(), Is.EqualTo(Path.Join(module.CachePath, expectedSelectedVersion))); + }); + } + + [Test] + public async Task FindCachedResult_IgnoresInvalidVersions() { + TestData.CreateDummyCacheFiles(this.ResolvableRemoteModule, "invalidversion"); + var result = await this.ResolvableRemoteModule.FindCachedResult(); + Assert.That(result, Is.EqualTo(Option.None)); + } + + [Test, NonParallelizable] + public async Task FindCachedResult_WaitsForEvent() { + this.ResolvableRemoteModule.CachedFile = Prelude.Atom(Either.Right(new ManualResetEventSlim(false))); + var resultTask = this.ResolvableRemoteModule.FindCachedResult(); + + await Task.Delay(250); + + Assert.Multiple(() => { + Assert.That(resultTask.IsCompleted, Is.False); + ((ManualResetEventSlim)this.ResolvableRemoteModule.CachedFile.Value).Set(); + this.ResolvableRemoteModule.CachedFile.Swap(_ => Either.Left("testfile")); + Assert.That(async () => await resultTask, Is.EqualTo(Prelude.Some("testfile"))); + }); + } + + [Test] + public void FindCachedResult_CreatesEventWhenFoundAndSetsCache() { + var resetEvent = new ManualResetEventSlim(false); + this.ResolvableRemoteModule.CachedFile = Prelude.Atom(Either.Right(resetEvent)); + TestData.CreateDummyCacheFiles(this.ResolvableRemoteModule, "2.3.5"); + + var resultTask = this.ResolvableRemoteModule.FindCachedResult(); + Assert.Multiple(() => { + Assert.That(async () => await resetEvent.WaitHandle.WaitOneAsync(500, new CancellationTokenSource(-1).Token), Throws.Nothing); + Assert.That(async () => (await resultTask).Unwrap(), Is.EqualTo(Path.Join(this.ResolvableRemoteModule.CachePath, "PSReadLine.2.3.5.nupkg"))); + + Assert.That(this.ResolvableRemoteModule.CachedFile.Value.IsLeft, Is.True); + Assert.That((string)this.ResolvableRemoteModule.CachedFile.Value, Is.EqualTo(Path.Join(this.ResolvableRemoteModule.CachePath, "PSReadLine.2.3.5.nupkg"))); + }); + } + + [Test, Repeat(2)] + public void CacheResult_DownloadsValidFile() { + if (TestContext.CurrentContext.CurrentRepeatCount % 2 == 0) { + // Allows us to cover the last branch of swapping the either method + this.ResolvableRemoteModule.CachedFile = Prelude.Atom(Either.Right(new ManualResetEventSlim(false))); + } + + Assert.Multiple(() => { + var result = this.ResolvableRemoteModule.CacheResult().ThrowIfFail(); + Assert.That(File.Exists(result), Is.True); + Assert.That(Path.GetDirectoryName(result), Is.EqualTo(this.ResolvableRemoteModule.CachePath)); + + using var reader = File.OpenRead(result); + Assert.That(reader.Length, Is.GreaterThan(0)); + + using var hasher = SHA256.Create(); + var hash = hasher.ComputeHash(reader); + var hashString = BitConverter.ToString(hash).Replace("-", ""); + Assert.That(hashString, Is.EqualTo("3A9430315469465407F8D7830653BD2415A994625CE92722E5820A8286B7AD27")); + + Assert.That(() => new ZipArchive(reader, ZipArchiveMode.Read), Throws.Nothing); + }); + } + + [TestCase([null, null, null], ExpectedResult = null)] + [TestCase(["2.3.5", null, null], ExpectedResult = "2.3.5")] + [TestCase([null, "2.3.5", null], ExpectedResult = "[2.3.5,)")] + [TestCase([null, null, "2.3.5"], ExpectedResult = "(,2.3.5]")] + [TestCase([null, "2.3.2", "2.3.5"], ExpectedResult = "[2.3.2,2.3.5]")] + [TestCase(["2.3.2", "2.3.5", "2.3.5"], ExpectedResult = "2.3.2")] + public string? ConvertVersionParameters( + string? requiredVersion, + string? minimumVersion, + string? maximumVersion + ) => ResolvableRemoteModule.ConvertVersionParameters(requiredVersion, minimumVersion, maximumVersion); +} + +file static class TestData { + public static void CreateDummyCacheFiles( + ResolvableRemoteModule resolvableRemoteModule, + params string[] versions + ) { + Directory.CreateDirectory(resolvableRemoteModule.CachePath); + + foreach (var version in versions) { + File.Create(Path.Join(resolvableRemoteModule.CachePath, $"{resolvableRemoteModule.ModuleSpec.Name}.{version}.nupkg")).Dispose(); + } + } +} diff --git a/tests/Compiler/Requirements/ModuleSpec.cs b/tests/Compiler/Requirements/ModuleSpec.cs index 6fa3bea0..dafb0230 100644 --- a/tests/Compiler/Requirements/ModuleSpec.cs +++ b/tests/Compiler/Requirements/ModuleSpec.cs @@ -10,9 +10,7 @@ namespace Compiler.Test.Requirements; [TestFixture] public class ModuleSpecTests { [TestCaseSource(typeof(TestData), nameof(TestData.InsetableLinesCases))] - public string GetInsertableLine_ReturnsCorrectLine(ModuleSpec moduleSpec) { - return moduleSpec.GetInsertableLine([]); - } + public string GetInsertableLine_ReturnsCorrectLine(ModuleSpec moduleSpec) => moduleSpec.GetInsertableLine([]); [TestCaseSource(typeof(TestData), nameof(TestData.MatchTestCases))] public ModuleMatch CompareTo( @@ -50,52 +48,49 @@ ModuleSpec moduleSpec2 } file sealed class TestData { + public static Guid Guid = Guid.Parse("d1b3b3b3-3b3b-3b3b-3b3b-3b3b3b3b3b3b"); + public static IEnumerable InsetableLinesCases { get { - var guid = Guid.NewGuid(); - yield return new TestCaseData(new ModuleSpec( "MyModule" )).Returns("Using module 'MyModule'"); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid - )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{guid}};}"""); + Guid + )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{Guid}};}"""); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") - )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{guid}};ModuleVersion = '1.0.0';}"""); + )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{Guid}};ModuleVersion = '1.0.0';}"""); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, maximumVersion: new Version("2.0.0") - )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{guid}};MaximumVersion = '2.0.0';}"""); + )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{Guid}};MaximumVersion = '2.0.0';}"""); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") - )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{guid}};ModuleVersion = '1.0.0';MaximumVersion = '2.0.0';}"""); + )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{Guid}};ModuleVersion = '1.0.0';MaximumVersion = '2.0.0';}"""); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0"), new Version("1.5.0") - )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{guid}};RequiredVersion = '1.5.0';}"""); + )).Returns($$"""Using module @{ModuleName = 'MyModule';GUID = {{Guid}};RequiredVersion = '1.5.0';}"""); } } - public static IEnumerable MatchTestCases { get { - var guid = Guid.NewGuid(); - #region Same matches yield return new TestCaseData(new ModuleSpec( "MyModule" @@ -105,43 +100,43 @@ public static IEnumerable MatchTestCases { yield return new TestCaseData(new ModuleSpec( "MyModule", - guid + Guid ), new ModuleSpec( "MyModule", - guid + Guid )).Returns(ModuleMatch.Same); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") )).Returns(ModuleMatch.Same); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )).Returns(ModuleMatch.Same); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0"), new Version("1.5.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0"), new Version("1.5.0") @@ -149,12 +144,12 @@ public static IEnumerable MatchTestCases { yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, null, new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") )).Returns(ModuleMatch.MergeRequired); #endregion @@ -162,24 +157,24 @@ public static IEnumerable MatchTestCases { #region Looser matches yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.3.0"), new Version("1.9.0") )).Returns(ModuleMatch.Looser); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, null, null, new Version("1.5.0") @@ -187,55 +182,55 @@ public static IEnumerable MatchTestCases { yield return new TestCaseData(new ModuleSpec( "MyModule", - guid + Guid ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") )).Returns(ModuleMatch.Looser); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid + Guid ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )).Returns(ModuleMatch.Looser); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("1.8.0") )).Returns(ModuleMatch.Looser); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.1.0"), new Version("2.0.0") )).Returns(ModuleMatch.Looser); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0"), new Version("1.5.0") @@ -245,96 +240,96 @@ public static IEnumerable MatchTestCases { #region Stricter matches yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.3.0"), new Version("1.9.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )).Returns(ModuleMatch.Stricter); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0"), new Version("1.5.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )).Returns(ModuleMatch.Stricter); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("1.8.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )).Returns(ModuleMatch.Stricter); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.1.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )).Returns(ModuleMatch.Stricter); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid + Guid )).Returns(ModuleMatch.Stricter); #endregion #region Incompatible matches yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, null, new Version("0.9.0") )).Returns(ModuleMatch.Incompatible); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("2.1.0"), new Version("2.5.0") )).Returns(ModuleMatch.Incompatible); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, null, null, new Version("2.5.0") @@ -342,11 +337,11 @@ public static IEnumerable MatchTestCases { yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, null, null, new Version("0.5.0") @@ -354,36 +349,36 @@ public static IEnumerable MatchTestCases { yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, requiredVersion: new Version("1.0.0") ), new ModuleSpec( "MyModule", - guid, + Guid, requiredVersion: new Version("1.0.1") )).Returns(ModuleMatch.Incompatible); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, null, null, new Version("2.5.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )).Returns(ModuleMatch.Incompatible); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, null, null, new Version("0.5.0") ), new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") )).Returns(ModuleMatch.Incompatible); #endregion @@ -392,8 +387,6 @@ public static IEnumerable MatchTestCases { public static IEnumerable MergeSpecCases { get { - var guid = Guid.NewGuid(); - yield return new TestCaseData(new ModuleSpec( "MyModule" ), Array.Empty()).Returns(new ModuleSpec( @@ -405,11 +398,11 @@ public static IEnumerable MergeSpecCases { ), new ModuleSpec[] { new( "MyModule", - guid + Guid ) }).Returns(new ModuleSpec( "MyModule", - guid + Guid )); yield return new TestCaseData(new ModuleSpec( @@ -417,12 +410,12 @@ public static IEnumerable MergeSpecCases { ), new ModuleSpec[] { new( "MyModule", - guid, + Guid, new Version("1.0.0") ) }).Returns(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0") )); @@ -431,48 +424,48 @@ public static IEnumerable MergeSpecCases { ), new ModuleSpec[] { new( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ) }).Returns(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid + Guid ), new ModuleSpec[] { new( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ) }).Returns(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") )); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec[] { new( "MyModule", - guid, + Guid, requiredVersion: new Version("1.5.0") ) }).Returns(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0"), new Version("1.5.0") @@ -480,55 +473,55 @@ public static IEnumerable MergeSpecCases { yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec[] { new( "MyModule", - guid, + Guid, new Version("1.5.0") ) }).Returns(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.5.0"), new Version("2.0.0") )); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec[] { new( "MyModule", - guid, + Guid, maximumVersion: new Version("1.5.0") ) }).Returns(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("1.5.0") )); yield return new TestCaseData(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.0.0"), new Version("2.0.0") ), new ModuleSpec[] { new( "MyModule", - guid, + Guid, new Version("1.5.0"), new Version("1.8.0") ) }).Returns(new ModuleSpec( "MyModule", - guid, + Guid, new Version("1.5.0"), new Version("1.8.0") )); diff --git a/tests/Compiler/Requirements/Requirement.cs b/tests/Compiler/Requirements/Requirement.cs new file mode 100644 index 00000000..24481b2d --- /dev/null +++ b/tests/Compiler/Requirements/Requirement.cs @@ -0,0 +1,215 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using System.Globalization; +using System.Security.Cryptography; +using System.Text; +using Compiler.Requirements; + +namespace Compiler.Test.Requirements; + +[TestFixture] +public class RequirementTests { + [TestCaseSource(typeof(TestData), nameof(TestData.EqualsOperator_Data))] + public bool EqualsOperator( + Requirement? requirementOne, + Requirement? requirementTwo + ) => requirementOne == requirementTwo; +} + +[TestFixture] +public class RequirementWeightSorterTests { + [Test] + public void Compare_WhenBothRequirementsAreNull_ReturnsZero() { + var sorter = new RequirementWeightSorter(); + var result = sorter.Compare(null, null); + + Assert.That(result, Is.EqualTo(0)); + } + + [Test] + public void Compare_WhenFirstRequirementIsNull_ReturnsNegativeOne() { + var sorter = new RequirementWeightSorter(); + var requirement = new TestRequirement(true); + var result = sorter.Compare(null, requirement); + + Assert.That(result, Is.EqualTo(-1)); + } + + [Test] + public void Compare_WhenSecondRequirementIsNull_ReturnsOne() { + var sorter = new RequirementWeightSorter(); + var requirement = new TestRequirement(true); + var result = sorter.Compare(requirement, null); + + Assert.That(result, Is.EqualTo(1)); + } + + [Test] + public void Compare_WhenBothRequirementsHaveSameWeight_ReturnsZero() { + var sorter = new RequirementWeightSorter(); + var requirement1 = new TestRequirement(true); + var requirement2 = new TestRequirement(true); + var result = sorter.Compare(requirement1, requirement2); + + Assert.That(result, Is.EqualTo(0)); + } + + [Test] + public void Compare_WhenFirstRequirementHasLowerWeight_ReturnsNegativeOne() { + var sorter = new RequirementWeightSorter(); + var requirement1 = new TestRequirement(true, 50); + var requirement2 = new TestRequirement(true, 100); + var result = sorter.Compare(requirement1, requirement2); + + Assert.That(result, Is.EqualTo(-1)); + } + + [Test] + public void Compare_WhenFirstRequirementHasHigherWeight_ReturnsOne() { + var sorter = new RequirementWeightSorter(); + var requirement1 = new TestRequirement(true, 100); + var requirement2 = new TestRequirement(true, 50); + var result = sorter.Compare(requirement1, requirement2); + + Assert.That(result, Is.EqualTo(1)); + } + + [Test] + public void Compare_WhenRequirementsHaveSameWeight_ReturnsZero() { + var sorter = new RequirementWeightSorter(); + var requirement1 = new TestRequirement(true, hash: [1, 2, 3]); + var requirement2 = new TestRequirement(true, hash: [1, 2, 4]); + var result = sorter.Compare(requirement1, requirement2); + + Assert.That(result, Is.EqualTo(0)); + } + + [TestCaseSource(typeof(TestData), nameof(TestData.Compare_Data))] + public int Compare( + Requirement requirement1, + Requirement requirement2 + ) { + var sorter = new RequirementWeightSorter(); + return sorter.Compare(requirement1, requirement2); + } +} + +file static class TestData { + public static IEnumerable EqualsOperator_Data { + get { + var requirementOne = new TestRequirement(true); + var requirementTwo = new TestRequirement(false); + + yield return new TestCaseData(requirementOne, requirementOne) + .SetDescription("Equals true when right is same reference") + .Returns(true); + + yield return new TestCaseData(requirementOne, requirementTwo) + .SetDescription("Equals false when right is different") + .Returns(false); + + yield return new TestCaseData(requirementOne, null) + .SetDescription("Equals false when right is null") + .Returns(false); + + yield return new TestCaseData(null, requirementOne) + .SetDescription("Equals false when left is null") + .Returns(false); + + yield return new TestCaseData(null, null) + .SetDescription("Equals true when both are null") + .Returns(true); + + } + } + + public static IEnumerable Compare_Data { + get { + yield return new TestCaseData( + new RunAsAdminRequirement(), + new RunAsAdminRequirement() + ).Returns(0); + + yield return new TestCaseData( + new RunAsAdminRequirement(), + new UsingNamespace("System") + ).Returns(-1); + + yield return new TestCaseData( + new UsingNamespace("System"), + new RunAsAdminRequirement() + ).Returns(1); + + yield return new TestCaseData( + new ModuleSpec("TestModule"), + new PSEditionRequirement(PSEdition.Desktop) + ).Returns(1); + + yield return new TestCaseData( + new PSEditionRequirement(PSEdition.Desktop), + new ModuleSpec("TestModule") + ).Returns(-1); + + yield return new TestCaseData( + new ModuleSpec("TestModule"), + new ModuleSpec("TestModule") + ).Returns(0); + + yield return new TestCaseData( + new ModuleSpec("TestModule-2"), + new ModuleSpec("TestModule-1") + ).Returns(1); + + yield return new TestCaseData( + new ModuleSpec("TestModule-1"), + new ModuleSpec("TestModule-2") + ).Returns(-1); + } + } +} + +internal sealed class TestRequirement : Requirement { + public TestRequirement( + bool supportsMultiple, + uint weight = 50, + byte[]? hash = null) : base() { + this.SupportsMultiple = supportsMultiple; + this.Weight = weight; + this.Hash = hash ?? SHA256.HashData(Encoding.UTF8.GetBytes(weight.ToString(CultureInfo.InvariantCulture))); + } + + public override string GetInsertableLine(Hashtable data) => throw new NotImplementedException(); + public override bool IsCompatibleWith(Requirement other) => throw new NotImplementedException(); +} + +internal sealed class SampleRequirement : Requirement { + public SampleRequirement(string data) : base() { + this.SupportsMultiple = true; + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(data)); + } + + public override bool IsCompatibleWith(Requirement other) => true; + public override string GetInsertableLine(Hashtable data) => string.Empty; +} + +internal sealed class EasyComparableRequirement : Requirement { + public EasyComparableRequirement(byte orderInt) : base() { + this.SupportsMultiple = true; + this.Hash = [orderInt]; + } + + public override bool IsCompatibleWith(Requirement other) => true; + public override string GetInsertableLine(Hashtable data) => string.Empty; +} + +internal sealed class IncompatibleRequirement : Requirement { + public IncompatibleRequirement() : base() { + this.SupportsMultiple = false; + this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes("Incompatible")); + } + + public override bool IsCompatibleWith(Requirement other) => false; + public override string GetInsertableLine(Hashtable data) => string.Empty; +} diff --git a/tests/Compiler/Requirements/RequirementGroup.cs b/tests/Compiler/Requirements/RequirementGroup.cs new file mode 100644 index 00000000..c02e278a --- /dev/null +++ b/tests/Compiler/Requirements/RequirementGroup.cs @@ -0,0 +1,120 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using System.Globalization; +using Compiler.Requirements; + +namespace Compiler.Test.Requirements; + +[TestFixture] +public class RequirementGroupTests { + [Test] + public void Requirements_EmptyListByDefault() { + var requirementGroup = new RequirementGroup(); + + var requirements = requirementGroup.GetRequirements(); + Assert.That(requirements, Is.Empty); + } + + [Test] + public void Requriements_EmptyWhenNoneOfTypeAdded() { + var requirementGroup = new RequirementGroup(); + requirementGroup.AddRequirement(new TestRequirement(true)); + + var requirements = requirementGroup.GetRequirements(); + Assert.That(requirements, Is.Empty); + } + + [Test] + public void RemoveRequirement_FalseWhenRequirementNotPresent() { + var requirementGroup = new RequirementGroup(); + var requirement = new TestRequirement(true); + + var result = requirementGroup.RemoveRequirement(requirement); + Assert.That(result, Is.False); + } + + [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementTests))] + public void AddRequirement(Requirement[] requirements) { + var requirementGroup = new RequirementGroup(); + + foreach (var requirement in requirements) { + requirementGroup.AddRequirement(requirement); + } + + var storedRequirements = requirementGroup.GetRequirements(); + Assert.Multiple(() => { + Assert.That(storedRequirements, Has.Count.EqualTo(requirements.Length)); + Assert.That(storedRequirements, Is.EquivalentTo(requirements)); + }); + } + + [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementTests))] + public void RemoveRequirement(Requirement[] requirements) { + var requirementGroup = new RequirementGroup(); + + foreach (var requirement in requirements) { + requirementGroup.AddRequirement(requirement); + } + + var removingCount = (int)Math.Ceiling(requirements.Length / 2.0); // Ensure we remove at least one + var removed = 0; + for (var i = 0; i < removingCount; i++) { + if (requirementGroup.RemoveRequirement(requirements[i])) removed++; + } + + var storedRequirements = requirementGroup.GetRequirements(); + Assert.Multiple(() => { + Assert.That(removed, Is.EqualTo(removingCount)); + Assert.That(storedRequirements, Has.Count.EqualTo(requirements.Length - removed)); + Assert.That(storedRequirements, Is.EquivalentTo(requirements.Skip(removingCount))); + }); + } + + [Test, Repeat(1000)] + public void GetRequirements_ShouldReturnAllRequirementsInOrderOfHashWhenSameWeight() { + var requirementGroup = new RequirementGroup(); + var requirementsList = new List(); + for (var i = 0; i < 100; i++) { + var requirement = new SampleRequirement(i.ToString(CultureInfo.InvariantCulture)); + requirementsList.Add(requirement); + requirementGroup.AddRequirement(requirement); + } + + var requirements = requirementGroup.GetRequirements(); + Assert.Multiple(() => { + Assert.That(requirements, Has.Count.EqualTo(100)); + Assert.That(requirements, Is.Ordered.By(nameof(Requirement.Weight))); + for (var i = 0; i < 100; i++) { + Assert.That(requirements.ElementAt(i), Is.EqualTo(requirementsList[i])); + } + }); + } +} + +file sealed class TestData { + private static int Counter; + public static Requirement GetNewRequirement() => new SampleRequirement(Counter++.ToString(CultureInfo.InvariantCulture)); + public static Requirement[] GetNewRequirements(int count) { + var requirements = new Requirement[count]; + for (var i = 0; i < count; i++) { requirements[i] = GetNewRequirement(); } + return requirements; + } + + public static IEnumerable AddRequirementTests { + get { + yield return new TestCaseData( + arg: GetNewRequirements(1) + ).SetDescription("Single Requirement"); + + yield return new TestCaseData( + arg: GetNewRequirements(2) + ).SetDescription("Two Requirements"); + + yield return new TestCaseData( + arg: GetNewRequirements(10) + ).SetDescription("Multiple Requirements"); + } + } +} diff --git a/tests/Compiler/Requirements/Requirements.cs b/tests/Compiler/Requirements/Requirements.cs deleted file mode 100644 index 172c95d8..00000000 --- a/tests/Compiler/Requirements/Requirements.cs +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright (c) James Draycott. All Rights Reserved. -// Licensed under the GPL3 License, See LICENSE in the project root for license information. - -using System.Collections; -using System.Globalization; -using System.Security.Cryptography; -using System.Text; -using Compiler.Requirements; - -namespace Compiler.Test.Requirements; - -[TestFixture] -public class RequirementsTests { - private RequirementGroup Requirements; - - [SetUp] - public void SetUp() => this.Requirements = new RequirementGroup(); - - [TestCaseSource(typeof(TestData), nameof(TestData.CaseForEachRequirementType))] - public void AddRequirement_AddSingleRequirement_ReturnCollection(Requirement requirement) { - this.Requirements.AddRequirement(requirement); - - Assert.That(this.Requirements.GetRequirements(), Is.EqualTo(new List { requirement })); - } - - public static class TestData { - public static IEnumerable CaseForEachRequirementType { - get { - yield return new TestCaseData(new ModuleSpec("TestModule")).SetCategory("ModuleSpec"); - yield return new TestCaseData(new PSEditionRequirement(PSEdition.Desktop)).SetCategory("PSEditionRequirement"); - yield return new TestCaseData(new PSVersionRequirement(new Version(7, 0))).SetCategory("PSVersionRequirement"); - yield return new TestCaseData(new RunAsAdminRequirement()).SetCategory("RunAsAdminRequirement"); - } - } - } -} - -[TestFixture] -public class RequirementGroupTests { - [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementTests))] - public void AddRequirement(Requirement[] requirements) { - var requirementGroup = new RequirementGroup(); - foreach (var requirement in requirements) { - requirementGroup.AddRequirement(requirement); - } - - var storedRequirements = requirementGroup.GetRequirements(); - Assert.Multiple(() => { - Assert.That(storedRequirements, Has.Count.EqualTo(requirements.Length)); - Assert.That(storedRequirements, Is.EquivalentTo(requirements)); - }); - } - - [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementTests))] - public void RemoveRequirement(Requirement[] requirements) { - var requirementGroup = new RequirementGroup(); - foreach (var requirement in requirements) { - requirementGroup.AddRequirement(requirement); - } - - var removingCount = (int)Math.Ceiling(requirements.Length / 2.0); // Ensure we remove at least one - var removed = 0; - for (var i = 0; i < removingCount; i++) { - if (requirementGroup.RemoveRequirement(requirements[i])) removed++; - } - - var storedRequirements = requirementGroup.GetRequirements(); - Assert.Multiple(() => { - Assert.That(removed, Is.EqualTo(removingCount)); - Assert.That(storedRequirements, Has.Count.EqualTo(requirements.Length - removed)); - Assert.That(storedRequirements, Is.EquivalentTo(requirements.Skip(removingCount))); - }); - } - - [Test, Repeat(1000)] - public void GetRequirements_ShouldReturnAllRequirementsInOrderOfHashWhenSameWeight() { - var requirementGroup = new RequirementGroup(); - var requirementsList = new List(); - for (var i = 0; i < 100; i++) { - var requirement = new TestData.SampleRequirement(i.ToString(CultureInfo.InvariantCulture)); - requirementsList.Add(requirement); - requirementGroup.AddRequirement(requirement); - } - - var requirements = requirementGroup.GetRequirements(); - Assert.Multiple(() => { - Assert.That(requirements, Has.Count.EqualTo(100)); - Assert.That(requirements, Is.Ordered.By(nameof(Requirement.Weight))); - for (var i = 0; i < 100; i++) { - Assert.That(requirements.ElementAt(i), Is.EqualTo(requirementsList[i])); - } - }); - } -} - -[TestFixture] -public class RequirementWeightSorterTests { - [Test] - public void Compare_WhenBothRequirementsAreNull_ReturnsZero() { - var sorter = new RequirementWeightSorter(); - var result = sorter.Compare(null, null); - - Assert.That(result, Is.EqualTo(0)); - } - - [Test] - public void Compare_WhenFirstRequirementIsNull_ReturnsNegativeOne() { - var sorter = new RequirementWeightSorter(); - var requirement = new TestData.TestRequirement(true); - var result = sorter.Compare(null, requirement); - - Assert.That(result, Is.EqualTo(-1)); - } - - [Test] - public void Compare_WhenSecondRequirementIsNull_ReturnsOne() { - var sorter = new RequirementWeightSorter(); - var requirement = new TestData.TestRequirement(true); - var result = sorter.Compare(requirement, null); - - Assert.That(result, Is.EqualTo(1)); - } - - [Test] - public void Compare_WhenBothRequirementsHaveSameWeight_ReturnsZero() { - var sorter = new RequirementWeightSorter(); - var requirement1 = new TestData.TestRequirement(true); - var requirement2 = new TestData.TestRequirement(true); - var result = sorter.Compare(requirement1, requirement2); - - Assert.That(result, Is.EqualTo(0)); - } - - [Test] - public void Compare_WhenFirstRequirementHasLowerWeight_ReturnsNegativeOne() { - var sorter = new RequirementWeightSorter(); - var requirement1 = new TestData.TestRequirement(true, 50); - var requirement2 = new TestData.TestRequirement(true, 100); - var result = sorter.Compare(requirement1, requirement2); - - Assert.That(result, Is.EqualTo(-1)); - } - - [Test] - public void Compare_WhenFirstRequirementHasHigherWeight_ReturnsOne() { - var sorter = new RequirementWeightSorter(); - var requirement1 = new TestData.TestRequirement(true, 100); - var requirement2 = new TestData.TestRequirement(true, 50); - var result = sorter.Compare(requirement1, requirement2); - - Assert.That(result, Is.EqualTo(1)); - } - - [Test] - public void Compare_WhenRequirementsHaveSameWeight_ReturnsZero() { - var sorter = new RequirementWeightSorter(); - var requirement1 = new TestData.TestRequirement(true, hash: [1, 2, 3]); - var requirement2 = new TestData.TestRequirement(true, hash: [1, 2, 4]); - var result = sorter.Compare(requirement1, requirement2); - - Assert.That(result, Is.EqualTo(0)); - } - - [TestCaseSource(typeof(TestData), nameof(TestData.CaseForEachRequirementType))] - public void Compare( - Requirement requirement1, - Requirement requirement2, - int expected) { - var sorter = new RequirementWeightSorter(); - var result = sorter.Compare(requirement1, requirement2); - - switch (result) { - case var _ when result < 0: - Assert.That(result, Is.LessThanOrEqualTo(expected)); - break; - case var _ when result > 0: - Assert.That(result, Is.GreaterThanOrEqualTo(expected)); - break; - default: - Assert.That(result, Is.EqualTo(expected)); - break; - } - } -} - -file sealed class TestData { - private static int Counter = 0; - public static Requirement GetNewRequirement() => new SampleRequirement(Counter++.ToString()); - public static Requirement[] GetNewRequirements(int count) { - var requirements = new Requirement[count]; - for (var i = 0; i < count; i++) { requirements[i] = GetNewRequirement(); } - return requirements; - } - - public static IEnumerable CaseForEachRequirementType { - get { - yield return new TestCaseData( - new RunAsAdminRequirement(), - new RunAsAdminRequirement(), - 0 - ).SetCategory("Equal"); - - yield return new TestCaseData( - new RunAsAdminRequirement(), - new UsingNamespace("System"), - -1 - ).SetCategory("Hash Difference"); - - yield return new TestCaseData( - new UsingNamespace("System"), - new RunAsAdminRequirement(), - 1 - ).SetCategory("Hash Difference"); - - yield return new TestCaseData( - new ModuleSpec("TestModule"), - new PSEditionRequirement(PSEdition.Desktop), - 1 - ).SetCategory("Weight Difference"); - - yield return new TestCaseData( - new PSEditionRequirement(PSEdition.Desktop), - new ModuleSpec("TestModule"), - -1 - ).SetCategory("Weight Difference"); - - yield return new TestCaseData( - new ModuleSpec("TestModule"), - new ModuleSpec("TestModule"), - 0 - ).SetCategory("Equal"); - - yield return new TestCaseData( - new ModuleSpec("TestModule-2"), - new ModuleSpec("TestModule-1"), - -1 - ).SetCategory("Hash Difference"); - - yield return new TestCaseData( - new ModuleSpec("TestModule-1"), - new ModuleSpec("TestModule-2"), - 1 - ).SetCategory("Hash Difference"); - } - } - - public static IEnumerable AddRequirementTests { - get { - yield return new TestCaseData( - arg: GetNewRequirements(1) - ).SetDescription("Single Requirement"); - - yield return new TestCaseData( - arg: GetNewRequirements(2) - ).SetDescription("Two Requirements"); - - yield return new TestCaseData( - arg: GetNewRequirements(10) - ).SetDescription("Multiple Requirements"); - } - } - - internal sealed class TestRequirement : Requirement { - public TestRequirement( - bool supportsMultiple, - uint weight = 50, - byte[]? hash = null) : base() { - this.SupportsMultiple = supportsMultiple; - this.Weight = weight; - this.Hash = hash ?? SHA256.HashData(Encoding.UTF8.GetBytes(weight.ToString(CultureInfo.InvariantCulture))); - } - - public override string GetInsertableLine(Hashtable data) => throw new NotImplementedException(); - public override bool IsCompatibleWith(Requirement other) => throw new NotImplementedException(); - } - - internal sealed class SampleRequirement : Requirement { - public SampleRequirement(string data) : base() { - this.SupportsMultiple = true; - this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes(data)); - } - - public override bool IsCompatibleWith(Requirement other) => true; - public override string GetInsertableLine(Hashtable data) => string.Empty; - } - - internal sealed class IncompatibleRequirement : Requirement { - public IncompatibleRequirement() : base() { - this.SupportsMultiple = false; - this.Hash = SHA256.HashData(Encoding.UTF8.GetBytes("Incompatible")); - } - - public override bool IsCompatibleWith(Requirement other) => false; - public override string GetInsertableLine(Hashtable data) => string.Empty; - } -} diff --git a/tests/Compiler/packages.lock.json b/tests/Compiler/packages.lock.json index 590c4163..17769c10 100644 --- a/tests/Compiler/packages.lock.json +++ b/tests/Compiler/packages.lock.json @@ -24,6 +24,15 @@ "Microsoft.TestPlatform.TestHost": "17.8.0" } }, + "Moq": { + "type": "Direct", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "NUnit": { "type": "Direct", "requested": "[4.1.0, )", @@ -42,6 +51,14 @@ "resolved": "4.5.0", "contentHash": "s8JpqTe9bI2f49Pfr3dFRfoVSuFQyraTj68c3XXjIS/MRGvvkLnrg6RLqnTjdShX+AdFUCCU/4Xex58AdUfs6A==" }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, "CommandLineParser": { "type": "Transitive", "resolved": "2.9.1", From 0d662bcd63918ff19bd84004f651e1649dc89da5 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 5 Sep 2024 18:40:31 +1000 Subject: [PATCH 135/341] fix(Compiler): code coverage gen task Wasn't producing the correct output for reportgenerator --- .vscode/tasks.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index eb88837f..589872d6 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -29,12 +29,7 @@ "label": "watch", "command": "dotnet", "type": "process", - "args": [ - "watch", - "run", - "--project", - "${workspaceFolder}/scripts.sln" - ], + "args": ["watch", "run", "--project", "${workspaceFolder}/scripts.sln"], "problemMatcher": "$msCompile" }, { @@ -43,6 +38,7 @@ "type": "shell", "args": [ "test", + "--collect:\\\"XPlat Code Coverage\\\"", "/p:CollectCoverage=true", "/p:CoverletOutput=Coverage/", "/p:CoverletOutputFormat=lcov" @@ -54,7 +50,7 @@ "command": "reportgenerator", "type": "shell", "args": [ - "-reports:./**/coverage.cobertura.xml", + "-reports:./tests/Compiler/TestResults/**/coverage.cobertura.xml", "-targetdir:coverage_report", "-assemblyfilters:'+Compiler;-Compiler.Test'", "-classfilters:'-System.Text.RegularExpressions.Generated*'" From ebd2d4d9e3c87fb23c4ff57cf9ff3dcd200b89f0 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 6 Sep 2024 16:39:44 +1000 Subject: [PATCH 136/341] fix(Compiler): End of Central Directory record could not be found. Seems i was modifiying the original byte buffer if the remote had requirements, oops. --- src/Compiler/Module/Compiled/Compiled.cs | 15 ++++++---- src/Compiler/Module/Compiled/Remote.cs | 15 ++++------ src/Compiler/Module/Resolvable/Remote.cs | 36 +++++++++--------------- 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 3416e8c4..216f1a82 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -35,7 +35,7 @@ protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] this.ModuleSpec = moduleSpec; this.Requirements = requirements; - var byteList = new List(hashableBytes); + var byteList = new List((byte[])hashableBytes.Clone()); AddRequirementHashBytes(byteList, requirements); this.ComputedHash = Convert.ToHexString(SHA256.HashData(byteList.ToArray())); } @@ -63,11 +63,6 @@ public virtual string GetPowerShellObject() => $$""" } """; - public static void AddRequirementHashBytes(List hashableBytes, RequirementGroup requirementGroup) { - var requirements = requirementGroup.GetRequirements(); - requirements.ToList().ForEach(requirement => hashableBytes.AddRange(requirement.Hash)); - } - protected Compiled GetRootParent() { if (this.Parents.Count == 0) return this; @@ -113,6 +108,14 @@ protected Compiled[] GetSiblings() { return siblings.FirstOrDefault(compiled => compiled.ModuleSpec == moduleSpec); } + + public static void AddRequirementHashBytes( + [NotNull] List hashableBytes, + [NotNull] RequirementGroup requirementGroup + ) { + var requirements = requirementGroup.GetRequirements(); + requirements.ToList().ForEach(requirement => hashableBytes.AddRange(requirement.Hash)); + } } public enum ContentType { diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index d97b8bfa..722816a7 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -18,7 +18,7 @@ public class CompiledRemoteModule : Compiled { private Hashtable? PowerShellManifest; private ZipArchive? ZipArchive; - public readonly MemoryStream MemoryStream; + public readonly byte[] Bytes; public override ContentType Type => ContentType.Zip; @@ -27,9 +27,9 @@ public class CompiledRemoteModule : Compiled { internal CompiledRemoteModule( ModuleSpec moduleSpec, RequirementGroup requirements, - MemoryStream memoryStream - ) : base(moduleSpec, requirements, memoryStream.ToArray()) { - this.MemoryStream = memoryStream; + byte[] bytes + ) : base(moduleSpec, requirements, bytes) { + this.Bytes = bytes; var manifest = this.GetPowerShellManifest(); this.Version = manifest["ModuleVersion"] switch { @@ -40,10 +40,7 @@ MemoryStream memoryStream } public override string StringifyContent() { - // Convert to a powershell byte array - var bytes = new byte[this.MemoryStream.Length]; - this.MemoryStream.Read(bytes, 0, bytes.Length); - var base64 = Convert.ToBase64String(bytes); + var base64 = Convert.ToBase64String(this.Bytes); return $"'{base64}'"; } @@ -92,7 +89,7 @@ public override IEnumerable GetExportedFunctions() { return exportedFunctions; } - private ZipArchive GetZipArchive() => this.ZipArchive ??= new ZipArchive(this.MemoryStream, ZipArchiveMode.Read, true); + private ZipArchive GetZipArchive() => this.ZipArchive ??= new ZipArchive(new MemoryStream((byte[])this.Bytes.Clone()), ZipArchiveMode.Read, false); private Hashtable GetPowerShellManifest() { if (this.PowerShellManifest != null) return this.PowerShellManifest; diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 08193827..3a0cd670 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -11,10 +11,10 @@ using NLog; namespace Compiler.Module.Resolvable; -public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSpec), IDisposable { +public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSpec) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly object UsingPSRepoLock = new(); - private MemoryStream? MemoryStream; + private byte[]? Bytes; // Only public for testing purposes. public Atom>? CachedFile; @@ -25,22 +25,18 @@ public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSp this.ModuleSpec.Name ); - ~ResolvableRemoteModule() { - this.MemoryStream?.Dispose(); - } - [Pure] public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) => this.ModuleSpec.CompareTo(requirement); public override async Task> ResolveRequirements() { - this.MemoryStream ??= new MemoryStream(File.ReadAllBytes((await this.FindCachedResult()).ToFin().BindFail(_ => this.CacheResult()).Match( + this.Bytes ??= File.ReadAllBytes((await this.FindCachedResult()).ToFin().BindFail(_ => this.CacheResult()).Match( Fail: error => throw error, Succ: path => path - )), false); + )); - return this.MemoryStream.AsOption() - .Filter(static memoryStream => memoryStream == null || memoryStream.Length != 0) - .Map(static memoryStream => new ZipArchive(memoryStream, ZipArchiveMode.Read, true)) + return this.Bytes.AsOption() + .Filter(static bytes => bytes == null || bytes.Length != 0) + .Map(static bytes => new ZipArchive(new MemoryStream(bytes), ZipArchiveMode.Read, false)) .Map(archive => archive.GetEntry($"{this.ModuleSpec.Name}.psd1")) .Filter(static entry => entry != null) .Select(entry => entry!.Open()) @@ -75,22 +71,21 @@ public override async Task> ResolveRequirements() { } public override async Task> IntoCompiled() { - if (this.MemoryStream == null) { - var memoryStreamResult = (await this.FindCachedResult()).ToFin() + if (this.Bytes == null) { + var bytesResult = (await this.FindCachedResult()).ToFin() .BiBind( Succ: value => FinSucc(value), Fail: _ => this.CacheResult().Catch(err => err.Enrich(this.ModuleSpec)).As()) - .AndThen(File.ReadAllBytes) - .AndThen(bytes => new MemoryStream([.. bytes], false)); + .AndThen(File.ReadAllBytes); - if (memoryStreamResult.IsErr(out var error, out _)) return error; - this.MemoryStream = memoryStreamResult.Unwrap(); + if (bytesResult.IsErr(out var error, out _)) return error; + this.Bytes = bytesResult.Unwrap(); } return new CompiledRemoteModule( this.ModuleSpec, this.Requirements, - this.MemoryStream + this.Bytes ); } @@ -212,9 +207,4 @@ public Fin CacheResult() { [Pure] public override int GetHashCode() => this.ModuleSpec.GetHashCode(); - - public void Dispose() { - this.MemoryStream?.Dispose(); - GC.SuppressFinalize(this); - } } From 8b97da24a356ba8195cc2b64780427bba32ca28b Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 6 Sep 2024 16:40:56 +1000 Subject: [PATCH 137/341] test(Compiler): More tests! --- src/Compiler/Module/Compiled/Compiled.cs | 12 +-- src/Compiler/Module/Compiled/Local.cs | 16 +-- src/Compiler/Module/Compiled/Remote.cs | 3 +- src/Compiler/Module/Compiled/Script.cs | 14 +-- tests/Compiler/Compiler.Test.csproj | 7 ++ tests/Compiler/Module/Compiled/Compiled.cs | 35 ++++++- tests/Compiler/Module/Compiled/Local.cs | 92 ++++++++++++++++++ tests/Compiler/Module/Compiled/Remote.cs | 70 +++++++++++++ tests/Compiler/Module/Compiled/Script.cs | 8 ++ tests/Compiler/Module/Resolvable/Remote.cs | 3 - ...osoft.PowerShell.PSResourceGet.1.0.5.nupkg | Bin 0 -> 2072222 bytes .../Compiler/Resources/PSReadLine.2.3.5.nupkg | Bin 0 -> 259840 bytes .../Resources/PackageManagement.1.4.8.1.nupkg | Bin 0 -> 1153134 bytes .../Resources/PowerShellGet.2.2.5.nupkg | Bin 0 -> 270249 bytes 14 files changed, 234 insertions(+), 26 deletions(-) create mode 100644 tests/Compiler/Module/Compiled/Local.cs create mode 100644 tests/Compiler/Module/Compiled/Remote.cs create mode 100644 tests/Compiler/Module/Compiled/Script.cs create mode 100644 tests/Compiler/Resources/Microsoft.PowerShell.PSResourceGet.1.0.5.nupkg create mode 100644 tests/Compiler/Resources/PSReadLine.2.3.5.nupkg create mode 100644 tests/Compiler/Resources/PackageManagement.1.4.8.1.nupkg create mode 100644 tests/Compiler/Resources/PowerShellGet.2.2.5.nupkg diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 216f1a82..07ac8e08 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -9,11 +9,11 @@ namespace Compiler.Module.Compiled; public abstract class Compiled { - internal List Parents = []; + public virtual List Parents { get; } = []; - public readonly ModuleSpec ModuleSpec; + public virtual ModuleSpec ModuleSpec { get; } - public RequirementGroup Requirements; + public virtual RequirementGroup Requirements { get; } /// /// Gets combined the hash of the content and requirements of the module. @@ -63,7 +63,7 @@ public virtual string GetPowerShellObject() => $$""" } """; - protected Compiled GetRootParent() { + public Compiled GetRootParent() { if (this.Parents.Count == 0) return this; // All parents should point to the same root parent eventually. @@ -83,7 +83,7 @@ protected Compiled GetRootParent() { /// [Pure] [return: NotNull] - protected Compiled[] GetSiblings() { + public Compiled[] GetSiblings() { var rootParent = this.GetRootParent(); if (rootParent is not CompiledScript script) return []; @@ -100,7 +100,7 @@ protected Compiled[] GetSiblings() { /// The sibling if it exists, otherwise null. /// [Pure] - protected Compiled? FindSibling([NotNull] ModuleSpec moduleSpec) { + public Compiled? FindSibling([NotNull] ModuleSpec moduleSpec) { if (ReferenceEquals(moduleSpec, this.ModuleSpec)) return this; var siblings = this.GetSiblings(); diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index b3ec365b..2e1a43eb 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -2,6 +2,7 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; +using System.Diagnostics.CodeAnalysis; using System.Text; using Compiler.Requirements; using Compiler.Text; @@ -10,19 +11,17 @@ namespace Compiler.Module.Compiled; -public class CompiledLocalModule : Compiled { +public class CompiledLocalModule( + PathedModuleSpec moduleSpec, + CompiledDocument document, + RequirementGroup requirements +) : Compiled(moduleSpec, requirements, Encoding.UTF8.GetBytes(document.GetContent())) { public override ContentType Type { get; } = ContentType.UTF8String; // Local modules are always version 0.0.1, as they are not versioned. public override Version Version { get; } = new Version(0, 0, 1); - public readonly CompiledDocument Document; - - internal CompiledLocalModule( - PathedModuleSpec moduleSpec, - CompiledDocument document, - RequirementGroup requirements - ) : base(moduleSpec, requirements, Encoding.UTF8.GetBytes(document.GetContent())) => this.Document = document; + public virtual CompiledDocument Document { get; } = document; public override string StringifyContent() => new StringBuilder() .AppendLine("<#ps1#> @'") @@ -40,6 +39,7 @@ RequirementGroup requirements .Append("'@;") .ToString(); + [ExcludeFromCodeCoverage(Justification = "We don't need to test this, as it's just a wrapper.")] public override IEnumerable GetExportedFunctions() => AstHelper.FindAvailableFunctions(this.Document.Ast, true).Select(function => function.Name); } diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 722816a7..253c8a93 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -2,7 +2,6 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; -using System.Diagnostics.Contracts; using System.IO.Compression; using System.Management.Automation; using System.Management.Automation.Runspaces; @@ -24,7 +23,7 @@ public class CompiledRemoteModule : Compiled { public override Version Version { get; } - internal CompiledRemoteModule( + public CompiledRemoteModule( ModuleSpec moduleSpec, RequirementGroup requirements, byte[] bytes diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index a0034f72..521fcf4c 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -1,7 +1,6 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. -using System.Management.Automation; using System.Management.Automation.Language; using System.Reflection; using System.Text; @@ -16,12 +15,16 @@ namespace Compiler.Module.Compiled; -public class CompiledScript : CompiledLocalModule { +public class CompiledScript( + PathedModuleSpec moduleSpec, + CompiledDocument document, + RequirementGroup requirements +) : CompiledLocalModule(moduleSpec, document, requirements) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public readonly ParamBlockAst? ScriptParamBlock; + public virtual ParamBlockAst? ScriptParamBlock { get; } - public readonly BidirectionalGraph> Graph; + public virtual BidirectionalGraph> Graph { get; } = new(); /// /// Creates a new compiled script. @@ -37,10 +40,9 @@ internal CompiledScript( ResolvableParent resolvableParent, ParamBlockAst? scriptParamBlock, RequirementGroup requirements - ) : base(thisResolvable.ModuleSpec, document, requirements) { + ) : this(thisResolvable.ModuleSpec, document, requirements) { this.ScriptParamBlock = scriptParamBlock; - this.Graph = new BidirectionalGraph>(); this.Graph.AddVertex(this); // Add the parent-child relationships to each module. this.Graph.EdgeAdded += edge => edge.Target.Parents.Add(edge.Source); diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index fa679ab4..6185fe22 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -37,4 +37,11 @@ + + + + + + + diff --git a/tests/Compiler/Module/Compiled/Compiled.cs b/tests/Compiler/Module/Compiled/Compiled.cs index e9e7b212..6f7f651a 100644 --- a/tests/Compiler/Module/Compiled/Compiled.cs +++ b/tests/Compiler/Module/Compiled/Compiled.cs @@ -4,12 +4,14 @@ using static Compiler.Module.Compiled.Compiled; using Compiler.Requirements; using System.Collections; +using Moq; +using RealCompiled = Compiler.Module.Compiled.Compiled; namespace Compiler.Test.Module.Compiled; [TestFixture] public class CompiledTests { - [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementHashData)), Repeat(10)] + [TestCaseSource(typeof(TestData), nameof(TestData.AddRequirementHashData)), Repeat(10), Parallelizable] public void AddRequirementHashBytes_AlwaysSameResult( byte[] hashableBytes, RequirementGroup requirementGroup @@ -30,6 +32,25 @@ RequirementGroup requirementGroup } }); } + + [Test] + public void GetRootParent_WhenNoParents_ReturnsSelf() { + var mockCompiled = TestData.GetMockCompiledModule(); + mockCompiled.Setup(x => x.Parents).Returns([]); + + Assert.That(mockCompiled.Object.GetRootParent(), Is.EqualTo(mockCompiled.Object)); + } + + [Test] + public void GetRootParent_WhenHasParents_ReturnsRootParent() { + var rootParent = TestData.GetMockCompiledModule(); + var parent = TestData.GetMockCompiledModule(); + var mockCompiled = TestData.GetMockCompiledModule(); + mockCompiled.Setup(x => x.Parents).Returns([parent.Object]); + parent.Setup(x => x.Parents).Returns([rootParent.Object]); + + Assert.That(mockCompiled.Object.GetRootParent(), Is.EqualTo(rootParent.Object)); + } } file static class TestData { @@ -71,4 +92,16 @@ public static IEnumerable AddRequirementHashData { ).SetName("Single type of Requirement"); } } + + public static Mock GetMockCompiledModule() { + var random = TestContext.CurrentContext.Random; + var moduleSpec = new ModuleSpec(random.GetString(6)); + var requirements = new RequirementGroup(); + var hashableBytes = new byte[random.Next(10, 100)]; + random.NextBytes(hashableBytes); + + return new Mock(moduleSpec, requirements, hashableBytes) { + CallBase = true + }; + } } diff --git a/tests/Compiler/Module/Compiled/Local.cs b/tests/Compiler/Module/Compiled/Local.cs new file mode 100644 index 00000000..5564926e --- /dev/null +++ b/tests/Compiler/Module/Compiled/Local.cs @@ -0,0 +1,92 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Management.Automation.Language; +using System.Reflection; +using Compiler.Module.Compiled; +using Compiler.Requirements; +using Compiler.Text; +using Moq; +using QuikGraph; +using RealCompiled = Compiler.Module.Compiled.Compiled; + +namespace Compiler.Test.Module.Compiled; + +[TestFixture] +public class CompiledLocalModuleTests { + [Test, Repeat(10), Parallelizable] + public void StringifyContent_ReturnsValidAstContent() { + var module = TestData.GetRandomCompiledModule(); + var stringifiedContent = module.StringifyContent(); + Assert.Multiple(() => { + var ast = Parser.ParseInput(stringifiedContent, out _, out var errors); + Assert.That(errors, Is.Empty); + Assert.That(ast, Is.Not.Null); + }); + } +} + +file static class TestData { + public static RealCompiled GetRandomCompiledModule(CompiledLocalModule? parent = null, int depLevel = 0) { + var random = TestContext.CurrentContext.Random; + var createDependencies = depLevel < 3 && random.NextBool(); + var scriptParent = parent as CompiledScript ?? parent?.GetRootParent() as CompiledScript; + + var createLocalModule = parent is null || random.NextBool(); + if (createLocalModule) { + var document = CompiledDocument.FromBuilder(new TextEditor(new TextDocument(["Write-Host 'Hello, World!'"]))).Unwrap(); + var modulePath = TestContext.CurrentContext.WorkDirectory + $"/{random.GetString(6)}.psm1"; + File.Create(modulePath).Close(); + var moduleSpec = new PathedModuleSpec(modulePath); + var requirementGroup = new RequirementGroup(); + requirementGroup.AddRequirement(new RunAsAdminRequirement()); + + // Gotta create a script module + if (depLevel == 0 || scriptParent is null) { + var scriptMock = new Mock(moduleSpec, document, requirementGroup) { + CallBase = true + }; + + var graph = new BidirectionalGraph>(); + graph.AddVertex(scriptMock.Object); + graph.EdgeAdded += edge => { + edge.Target.Parents.Add(edge.Source); + edge.Target.GetRootParent().Requirements.AddRequirement(edge.Target.ModuleSpec); + }; + + if (createDependencies) { + var dependencies = new List(); + for (var i = 0; i < random.Next(1, 5); i++) { + var dependency = GetRandomCompiledModule(scriptMock.Object, depLevel + 1); + dependencies.Add(dependency); + graph.AddVertex(dependency); + graph.AddEdge(new Edge(scriptMock.Object, dependency)); + } + } + + return scriptMock.Object; + } else { + var module = new CompiledLocalModule(moduleSpec, document, requirementGroup); + scriptParent!.Graph.AddVerticesAndEdge(new Edge(scriptParent, module)); + module.Parents.Add(scriptParent); + + if (createDependencies) { + var dependencies = new List(); + for (var i = 0; i < random.Next(1, 5); i++) { + var dependency = GetRandomCompiledModule(module, depLevel + 1); + dependencies.Add(dependency); + scriptParent.Graph.AddVertex(dependency); + scriptParent.Graph.AddEdge(new Edge(module, dependency)); + } + } + + return module; + } + } else { + var remoteModule = CompiledRemoteModuleTests.TestData.GetTestRemoteModule(); + scriptParent!.Graph.AddVerticesAndEdge(new Edge(scriptParent, remoteModule)); + + return remoteModule; + } + } +} diff --git a/tests/Compiler/Module/Compiled/Remote.cs b/tests/Compiler/Module/Compiled/Remote.cs new file mode 100644 index 00000000..b5d0012a --- /dev/null +++ b/tests/Compiler/Module/Compiled/Remote.cs @@ -0,0 +1,70 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.IO.Compression; +using System.Management.Automation.Language; +using System.Reflection; +using Compiler.Module.Compiled; +using Compiler.Requirements; +using Moq; + +namespace Compiler.Test.Module.Compiled; + +[TestFixture] +public class CompiledRemoteModuleTests { + [Test, Repeat(10), Parallelizable] + public void StringifyContent_ReturnsValidAst() { + var module = TestData.GetTestRemoteModule(); + var stringifiedContent = module.StringifyContent(); + Assert.Multiple(() => { + var ast = Parser.ParseInput(stringifiedContent, out _, out var errors); + Assert.That(errors, Is.Empty); + Assert.That(ast, Is.Not.Null); + }); + } + + [Test, Repeat(10), Parallelizable] + public void StringifyContent_CanBeConvertedBack() { + // Convert the base64 string back to a byte array, then into a memory stream, then into a zip archive. + var module = TestData.GetTestRemoteModule(); + var stringifiedContent = module.StringifyContent(); + var bytes = Convert.FromBase64String(stringifiedContent[1..^1]); + + Assert.Multiple(() => { + Assert.That(bytes, Is.Not.Empty); + Assert.That(bytes, Is.EqualTo(module.Bytes)); + + using var zipArchive = new ZipArchive(new MemoryStream(module.Bytes), ZipArchiveMode.Read, false); + Assert.That(zipArchive, Is.Not.Null); + Assert.That(zipArchive.Entries, Is.Not.Empty); + Assert.That(zipArchive.Entries, Is.All.Property(nameof(ZipArchiveEntry.Length)).GreaterThan(0)); + }); + } + + public static class TestData { + private static readonly Dictionary TestableRemoteModules = new() { + ["Microsoft.PowerShell.PSResourceGet"] = "1.0.5", + ["PackageManagement"] = "1.4.8.1", + ["PowerShellGet"] = "2.2.5", + ["PSReadLine"] = "2.3.5" + }; + + public static CompiledRemoteModule GetTestRemoteModule() { + var random = TestContext.CurrentContext.Random; + var (moduleName, moduleVersion) = TestableRemoteModules.ElementAt(random.Next(0, TestableRemoteModules.Count)); + var moduleSpec = new ModuleSpec(moduleName, requiredVersion: new Version(moduleVersion)); + var requirementGroup = new RequirementGroup(); + + var info = Assembly.GetExecutingAssembly().GetName(); + using var nupkgStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.{moduleName}.{moduleVersion}.nupkg")!; + var bytes = new byte[nupkgStream.Length]; + nupkgStream.Read(bytes, 0, bytes.Length); + + var mock = new Mock(moduleSpec, requirementGroup, bytes) { + CallBase = true + }; + + return mock.Object; + } + } +} diff --git a/tests/Compiler/Module/Compiled/Script.cs b/tests/Compiler/Module/Compiled/Script.cs new file mode 100644 index 00000000..3a1d6b08 --- /dev/null +++ b/tests/Compiler/Module/Compiled/Script.cs @@ -0,0 +1,8 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +namespace Compiler.Test.Module.Compiled; + +file static class TestData { + +} diff --git a/tests/Compiler/Module/Resolvable/Remote.cs b/tests/Compiler/Module/Resolvable/Remote.cs index ba0fc4a4..6f85555c 100644 --- a/tests/Compiler/Module/Resolvable/Remote.cs +++ b/tests/Compiler/Module/Resolvable/Remote.cs @@ -27,9 +27,6 @@ public void Setup() { } } - [TearDown] - public void Teardown() => this.ResolvableRemoteModule.Dispose(); - [Test] public void CachePath_IsCorrect() { var cachePath = this.ResolvableRemoteModule.CachePath; diff --git a/tests/Compiler/Resources/Microsoft.PowerShell.PSResourceGet.1.0.5.nupkg b/tests/Compiler/Resources/Microsoft.PowerShell.PSResourceGet.1.0.5.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..753f18ac51bb76e86628454732038a42014d1a42 GIT binary patch literal 2072222 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

Rkx0cd3K;tDmS9rgr08*sC|(=PAj~*_TP@S7GA6 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 Hp9=7Ax_ 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%0DqQbU(A+%%o4!YUeqvE3rlB%( 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%0DwC|Mgy(N6FgdZ&72PG`C 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

g*k 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

_EQ(AJb3lx{i(yS{|8I>4-%fzC>I;-nVUbu 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 y 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

Pf))!=o9X>F&$^Mp2b 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 z zUQy%{Lj?IWkkbv}^HDq&=(8|xIIJaF@de8Gu%_tR>?p-nBcaS5jEi+SF0x+BR{iH? z81{6nRzfMYq)o4Uj<1VIDtfEOmyh=qSwYwl58WqqsgK&x^f;N zcOoqqnaxK3$Z{{+5EE4>Qa`2$seD@b9g<=0U8-d>e#|E+hTLlOp(jsMSA@h-xc-9t z%G&W4c>ao%T9{D-Gk7o)7<4clZAkH9Y9;Pr(N_CR@)n4DfCx`&|jWolTS0N z0>+1-)1tMeA6Z*NTcom*oa)kGXE5MzlYx_F29lg^U*V->u)IL+u#_6KQ9CLb)a?Wt zVZM(&(1k(kR804iYp@vNPpi$Vne$4HJI01iCXi!?)G0@V`seQ2P~neJi+z^c<#@Fo z_rJ6`+=flB`bsdespepR$J!#NpV&4Oclt?PQ$w2%G)yT>=iednBXUp8+@x}g!@M6! z#pl&R6@8&es}irwhegxgIOglK(BK}{Tx#PNf;+1^A#6vtQ(lxv{eVJTX__AUK#o54wGTRI?kKGseN+exA>PbicHj+^t zfAj%(I?23J9Rb~hKQjE#BuWQbX<#XzJMr%*(JNm(VJ@TRwuvr&o;4x(dCJ5Q{5)=A zH9yx(9M8`qC(h*O@Wkc(JZ$3C{47q~&CkNbNBG$x$)giXA7isN)4nX~OBR>*@^UV; zfzyq=e0I%KeiW`FPPD@BM>@vGF-zUA=4i6<`yVZdcsLdQKl567d`?l| zj=|UEQqO`7P)3wLrX2hhm=P>i-p3+)RAkVLde}-CkpqpIi|Ni2^M$qBf93_U+h3>~ zo{wm082sjJhC#N{KRUOS{zkRy;Jli!jKq~l{8Y)+KZ2JJHrdd>)@Vb2u)&6YPqPjE zE6q0aFE-oIzu0U;|6;QZos}5fwMAq!Ka@9vQYyuhM7u9tB)pWu3{s?MME@a;kmS?X zs;^9`o>ui2>3%1l?|1SXcXC_VFl@aat$uEq<@h$Uk-n^t?Wo;s>GdIg^f;L6!_;K4 zkCv?Z3w;p&<1KCWYPFyAZTIti1r1$4FaDm$8Bki8{0!!NHOtut<6)xqfOn(weggFL z!IQO5da=Tc=H)T=UL(~*RHL*iOBw5j~@# zlF>Xk2Iyu|V_-N*1f&oisq8j-0SvL!p4l{9O+U`(b;Kv=09s;9Kmp@r;Rwj*1}IK} z6tC(d6REL2lg_k@hx`R!OeKN!FXJk{pW^c!#m~w3IV)3Mn02GfS8q9Q^mf@(8aNnS zg~E3z1{Y0;FN2odQXjZn?X}e*J|90(lqB06eacAspZMm_TAU5c?#M5l=i)zdTj)P> z)olJFvrZGwgTsjGt4%&5U(K0l|=2#;%XrTklcMm~8^J|o+rJ|o8+gwM!T2kAQU zjpyPzVv4Wxu0iq{9%xh#>?QZn6sWqP)_}6$@st`5j#kC_&JFRf5(V)OlojPQ7~)Ag zK~c1FAiR77$T`X)nP2mD{)``nOLH=5gZPmS6dMBrP!58G;jupu3AeUXKE0$d@f0(=ThZ!K}<>!lg^~2%ZZM3UMAg$ zG>M$a28@|xFMJ1b@k|Plu~B%l7!0N|>XjU*EXARr3!nhR+teIZDUmG5lq=Aqz3C2B6AEDyIXOLfg4klse` z{mX#^ME?|h-&DK%r_vGc6^8}#Y)g4YQ#8u6-6(oCy?)z8W{v1U`9z~g_nlW?<4MnE24Favk z$?`4vG-TUulI=#$%<9^9-gB4igCe)n^vS(RWw@wO;O%E8@3vZ%De27xOD|88-||pv z*XqE%ZdPBsLg@+9n%ZSU89` zS2A)Y`xZh{aniShTnua$@QPegTk0qMwwj@$iQz^^N8H0a<+C`0_zop^GEPHsX9ca4 z^&*Cb1`=@8>QBH?OKax^iL9&IS*}EovUUmi4L7?mGJTIxfe`tI0^=)aU7{Dbe&`S? zYrZC-iN?ZaDd+JPESo90G@w1#{}0<~mRQ4mzSZ^i^I zxX_R!*_tf}<4xJ<{TIZ{SI$K*fe&=x(d?Jl>}^T1@a0B7$N#qkcm`L^CQou6PyD^g zX>I>c)d?=3aT+|{{{Q{pp?pgB;`wRT#S>n&qJ*xdE|p`ur0>+EGRN#u<{0)dB`=Nd z($J6H8~d2L1*n-_IX}bT!h6`bY}JJCps)65QYQi{jqY>0?x1~6pKRrG`aRwmTjC!N z&gb+)&&6lw+UMwVs@nR6a9NdVkF-*I%;2)B+3IHTSbg$^@mT%pbM;t#^tpPhN_m10 zl<}Eo@3YEQ&$DOsS=G#=Bi7&Kvl=!GxvW0@Lc6T)J$M0ZHCFi^uSY)zkJp4bo5!mz z#VhvBEj6cm-^g#wcBV zr8~U-p~2zx7g2{-GBB@roE%=ip*g%>Jfp*_vS`e3pqr|(lI%0HpXgSq>!=Uxqb+=3 zA3azf*sq2@u#e8>1N)@%f&JW^KCof`d$vBXPx?NvpP$nQmJ3k{56TCY^fjMV{x#pH zrlZU0n*AgSYhS|_-%t!bro3Qt>_ORZwr$plnI~jhwe1cn&W*Hf>*-hSn@6!mXze81 zPZ84gyRr-LXvT~>$#TqplSE5D_He8#&|Dj>!RX`4OZFYlWyamDMyw@sk2ejBlS9_Z z=bC?3H`}=yvDbC)sFDa6mVf-k+H zONz)jWKPG!a=YJ|q_+rvAB6p7A>*HCJKAh=-eeqC7M$ww5iiUJ8xG5Japn{j-8ZT( zNr-rd4#CT*L}N32J|j604Ck6zY4x2)0}{_r1oWb~cq=mKW-TW5P^3_a3p1n)=#5vB zR`+Ji5I^D7JDdc5#JfPgdjmZEg4+9I%i~lI53HL-Z|wnnE2h$YyX0LAWS2}h#ICa}_ z^d=3Uc6pQ&AM?WFmI~?p^JJS{8Txqho#JgJq^u1!cz5@b-?zjjG5N`3B@luv-L<8f zB|GX0o@?O>PPteYg7JiW!dYgVN?0zIjm25p3e5G~%3+#>)w-h@LYnhQt5_liGVe&l zc0)SgOyb)+kT&7Fz)Ktni38>XZ>R^qrCO!n+cguuxLhzpgO*R2sil+UB?m2D>@nNf zrdYjVA6p{)qYH=5Fpc`d&b$^$=vK8r9^U|TyM4F1a8j2`mC4=ycV5pA{F%wwxtOe( zT_p)G80u2D?+y7E*}XQ<6CbSO^9eL~IQ&r&d4C|?8TJV81!?&9fZTQ#)QE9rKIvAK zE2b>T5i`Q;Y6#jf#NBJ^1s=FPo${yl#KL=k<7B$}=gWSYsSF*DV~45utF zPt4enPlE6#L$Vh72a_F(T#pDR9Ch0reMxSd8UupmU?|fFcj3a+cwHhbGIHwsZDHS; zA9Rz~A7nSt`$d27y=6i{-=?o&El6Ld_p!c4onMmQV)wr_@7O5CnJ?Z)cR47!^l!tv z9G|EAgoAkcPAlv8#KUr(=!m$M%=Kkm|2BPs6BL^8d?|{@(~?E-_}`pQa)RzAJYSCD zNomOHh4r#V4S6P`Pxc-pmO5j_4k;yXA&Zxf!cMDcWL$s%|zR(LY19UAd`HHs&z zC5zzkzjdGE1Phw*d@YKnOG_5P9nbm%w*)u~|A_gtcJMFkjMw6>SZiu{`1_Xhl~2R?hh{u_vVfkQik@ys zPpXlgZ$|OFI7&}n6FqB84Ub08x0>!t>gT0wPcQpB zVcEI=g|bt6*^h-~&uc3CbSnGw=d`uRII!gF>SawfS z*=JDMJJ0aHGx$7|oz?68L|AtIe}U&+dfDF%%kKVP;CWu>`S-%IduQjlyzBY<&#G)% z4QgvAZKCN22KJccMn5CTWzn~3fAF`L)z?&3^XDR;FTVEre8u>0{A0-11w=zG;44)5 zH=N2J>@@e!BOqUzXgL~NJb|ctrs%@jCxbJrmGjjWfqW!sxeZroZzq4Nbf;KB(_|v} ztZDO?Ovyk;Kek1J{(z^)wyZ-dHqKok znkzbhZ(qnqDBhRyMz{KBXJ3~Yck1W6fM8^B;_{2`ZhZ_{ z{BK6^Sw`Xz)HKv$x!6AFfE`z+&BW+?rTjh5eq-J;`K^1}jh%d+|J{2@*Uw%^x~S=% zC0)el&S*Q+5wZ~}lO})DiP`{7bCMlt;g!VjiI%cz$^0`kF=xCn(vAwdsoGN}0ncpy z&g#!w^UQI@NAQxe;$~OiyFGZR|F$6FYYcxT{cZEjw!n~j&XS$N4A3HPB2cPqAPy@b;fUpFBAFT(oE2YvPg z36hqpI2w@cZ~@$?xNReq+U8{PJ1z`;R1)p9=Z1)t!wmOE-kPKXs1sTJruN ziu21_vR;uH)yx|k#WAe!?jG2BzIu;4? zmHMaY@(0TNAQ}D!&HMsh=BoTD|GUG5Wj2hjW}ffSnJK)@coD+?iPtRsWKyIWxHr*n z1zV?OvPr3@EApzl|{nM|2k6aTe)RD-tX0=0O59Gp;X#73H5pXB` zHS)#wJOSQM!4uA|=H*Lan%->w-V~j0)sl1{bpstS=aqRkDezU?ukq8nt&+0EGO#8l z{)^^ShCP`A(*JF6U7Ue-8c0q5itOM?w=lk*J`_#gA|Za!O^)Z_=`LJ#4<7s#R+)Y8 zTgWd0UW;~Y>PaHiMInDiAzJzKx4|G66Mvzq)?bM>UkP2XVb-Sr3LB)1(*3*&-|aKt zGwW}OvuBLV)@DYEsO;7&SiVd~$*K)h?ZK{cOdO6rF;H~|_uk%`mr+!SRh6Vb7 zQx=M#w*~}-#Z{9rNBorypFXF%xoxx-=^0k7*3-Jxh|}qWVl-`>64c|sSh{d6v2bYb zDBX~0`Z3|-th zqu>0?fdkaP$5HR!glFjUOVb^`Crt6sp|ut@fu)2YHAoBX2WX*P?i8?6luZG9Sb6d@ zvFN-zsI}1c(&yay$_uw=d_8>*n*Qix zjYK5fefloyP4r#y4mjD!j62rSiJlIlTfJYf7M2R5yA-CFSo`TniVN40H$;cgquwuC zOMYX$C97(6l^t2vm9LHza%JshVg8rZE(SdBfCY>zLsdQo@<$Dn5n|2j*Avsgh9Csnu_gnVgh;^L? z=a+}kDGO^)rqioQyu#Iz=e9H8Pmmg=bJ&>wHq-Gjn@$43yG#5JxgNIh*=`=DWHEmw z{lL-QJg1Y8~+`z9@`T)jJXp_e|`x zLeBjOeSZZ++#V%j$Baa{g{3hj|6r+^fsFsl-j%?~QB?ie?w;_A`A&6`y910?aps1**pNN7A$|Z*!a)WY5@j_uiJi%MM zkMO5>evLm=hp)+cqwqN zLZbC@l#@mmOKyjaiPYFugS1M7r4%qWqJ#;q0HnlIW09Ed6Fo=bGa_5jo?Q$4cz9jz zH?V(Y^L~QL+N{iC+mtCChWiE5oJsk#`j-&X{8k%3$5ZVZw95D;x?wc6&~M5 zBQY}M@vI|$3vHQ{xd?Hkak~fV$8;SmOKkUEdQ$H|Qk}mK`fOlw!ad;lex^Z!`9po* zjb9?*+rpfGxwdZ#;ZCxI?bp#Hyyv@`6@ahp>(S1Eio(jTjQR6Nwx#7#$NdWyFgOg6 zLXETXE40w$v<@>U+A1SR(c(}k;?w)^Wl#kCXgq(~G(0A0D}~2o|Ja!FZyq%q_5)K_ z-1~XNq@6ISA*}lVK=t>NpR0naHHfwmbuDU6F62jRrkoo^v8$>;E5^{&U1$oDn{vg* zA!S#a0pwPKCi6Dlw^|NEk3gW$_M3`BHe;jXZP0p({LA@`6AMAI49PgLRrqJjiO~ny zNn4DWg4&wT+s-cwNF7jpuXyW6lDKHe~ zvgbG6m~WUNZ>hpuNejkn$~M(;$8cWLn7H0Lm}KiEU3S`d-)lOdgM=8j|5`NwI{Zv3 z_ZN;iq{RU~!@OeZA%{e1Q;asf4kr0?(XFI}RZyXV=vfwwEle7YID`OGv@I)xA(Ia8 zikY#}L$GZird!9d6wRx{QUf7`aBV6(W`1PrW7&=7wd=31X}ciN$Jegfd_2GDeTw%q z;0eZ3Cy&crv2krB0VVy&Acl=hd!MVB2!=RO?dQukZ4)DBg4@2*B9$Dgn21s_@|)v0 zJ42iY!_*?be@BFM7d-xhhQr?z-_T1Qe`&An80kJJlAt(HL)ZQH&09D0T@!U%ksew! z{6qP<5E2dpgTEUu53!CFtXSVLg+jCYqr>PQta_`39S!j`d?87-MxFo%le+4^b@Yr) zmf+vKB;F|FQ@`;N+_|cbt*h$5dr4_)Dc*uyuJ?^+W9OGzwnEY>ZQYuV-pZ$kB<5LI zHc|-+;Ke&cNq$jNZEL4g=)}C|IE^=&=kW_(5;r1u8TYncn72IUeo1FS*4CNqNXk|( zr@&@e<0W1N#m>rdD-b)*JL0V!t?K=zC7r1bMrrcPnv)xR$i=X12;_~>7fnvs%oYpy^V*;~UX$^MQoyyePkgC>} z_y_j+22qxlE$mk$pQ};F&%fiw{rqbi`T2KjFum7~)6dWF;B_1Y|4+~FPErgGcXCDR zEh_f7WBT=jvSTsYY+~2CFWcJ4OXB?N>OQ}qs5&-OIzCU6tbkX<}zOJqE^dY2jg5;L>KfR@0d1sjpJ&g zk^WkCo26}UGuq`otkzc6Mqt}py4*)R*sW{Ylos<1xkZ(=ZMIo%i)TX)G*`woP~zHf zD}r2XF&A5Y>zjb}T7Pvjcx9unY64U?R<5nKtJS|~aANtL-M@lBpwH}0DDT%_Q-*1`BBXv-EIHwe} zED6tt18dF)G`E_!4{X5OXpQ9812@XAjQy&O!z!$iN*+3}Ssse`JVdeDk&jUMkrDFG zkg|Il_BYLJzQsNp8=+@yW6^d_=@6KnKwr%UTO49Z}3E`1YlYsf2?7${~3*E~fx8|-h>Z|OToI~zIfcNw+&1Nh!#Irk}S zcz+L>KV=u3oVrdK>uv1Onvqjsb5VV3J_`>fx$H`7$xS|RHXal9z~}`uPAPI^mvIv- z7EF8ee7aj?kG_{KN%KI1BTL+4;I+dO!hBqp^isZ${1{%;$s(P{AwWs>zKa=o%lPWg zsCvm48K|k%tce?Q($u&qv~DG|rF$fNt`c!}X(}cWCv}vn`tuH)?;R!?B1_!o6_> zH2Bltd^-t*%9Q6BZAq zaX)7>62#j3gk9 zAo3}WOAoF&NE_%MqV5=7sztQj02s*&ec1P5Ubuz9(}cIH^f}24NFt9A#_}!Os<9ON zU?d3sdXOz{8d=d7mxp)V?)hqL_IFFYoe8lCg|IxAV0~(E98$uon`GGbw)-@%h9=T* z{eZ)cO?Ned2dr4@7_CnQZB{3WFVIF<%Z3bXS@p?Ho~~TLu1-g$56kT@^e;nKT4|=u zRToP+nIOhv7L#MH`i_i|<-IWnC{TcTa3#F@Fd;tHM??pVO*-=kuGXcrLG?ZP$_ z$Nw1aFfj!Mm2;ysJYt1fTQs}@k1#knZJR@_woAKd6cX&766Y^m`Q@Yx=5ky@%HY!H z<+MWzR|I0_<}1`D(-z5~eeQIbY-VRB#d4C9rFRnZoJml3DyW;og>P2LH-wXKP{|mp z+$9QUq0?XvDI^8Of7zwg3iaIz7|ge4k1N7t<6FbklyGAh^^Gd|{&4dBDjBmEU*M5soHaq#cs8hZfuh=16zJ_? z47aP~JHp9#sN@I2$q%SxNC=WsI#~*gqM4zPj?uWOCX})-=jvFy)#OpISc@jqJ@hD! zT!j`TnT2IONgBxbGV<*lBKk;O(h}Fo9i1){KSU% zI;7fH5KTZ2KgGj!>fu>D+~Dt%%e8k}l|NdQ|1od7l44YQN~nX@CJeK8u#V%+Kpn@b z2NvP@I-pkv?G!~iR2_$_@{a;)2^p|>_$3~eMFZuJ;D@X@Dk=>)#cC9e#8hR@5VS(^ z_WO5|aggZ}RKx&t6h*}zPc+Xv%viL*co127{1RtDyW3rYJmvX;qA_Ua9vaz>G>2q* z6_)6dGoIEp_Tb3PvylZ8b?xK$YUMJ#b+p(ReTq4b);m`B(u)^Uv#7N)V&Qk-H9j`w zpHylTVGud8K512CWj2_(Kg+T-F?ugTxiX$|5>EC0X(ry6vxT>9EN@e}=%&ggA?g=(K+@a4hf5@7?FMp zFB7xn7d=9na`htR3f>*acx_qDu~zEdZ_FrelYxe&Y-dqyQ3$o4snIk3H@#~7q}{vo zEg7yw>LP5#WeMlV`7nfk%xaw(fwZa}&kl9vCu_=QOF!XozNagb^NrH( zQX)xLV&p_B(`n~>)PzghEb&BwsFt>~OK`4^Gy8>DA*E=|IW`N?K)e_DGn2>vP&flxHb(?2@JwS=z`)b`D9Rt|1ikgri3Hv|_CofIMGF*LEi}X>X2ei77 zMZb*=5FZ7{Ad}X*7ygTUyTHh~Wm+PXDBL-*7Re!KNUsFD4ct$_na7_t=Jvgv>Y=Dk z@_)BRrOP=5R^xJoMW*Par@}twD2Sm_RxFO~5|<=$nWW)TAax>@=V;s*hgBB;sBH@D z^WdLZ*wy5?3b7kDR;L*wzak>Jq;{w#Q(Z^?;HBk^{vp*Ul`H#>v&1GzAI~Ua520vsEX3tCk)LCP6u@pQNBhZ$`n8vuW)+|z{wU3AxSQuQpE>v?Kn4>_@d&)xLA(scV37yp)J z({YHebg2~yx5-ucO6$HWf^Q7V>JcZlGM)vfxMSef1;Nle@BrZ zO_ym%jFww*X|u|0Tqs~F6}DHFQdU|@*wvId-NTctLXXL&x%3{T4Bqs#+)g;cE|oo@ zx3a^_488nIVW#r$d71F7+Gi8)N!4DJ5ALr|8nI~xa<<*n;osM0F zj_a55R}N{1!N6NHE6K)!UgBN+CCgNPlI%!~=Y0?wZwTqfY{NZDG zlXTG->v$RWMQiMih`l|(BVe#yIbDv$%NUCf%dsebgs*1#QodT{kE&t$kQ^2XCiaxW zf+z7OZ+x+5<#7Cm?4wk~Syt7~pgB63QeoNTcr~)wZHehL=^-phcXkvn3rh|La>2oK2V(Wz=q+L3*|eV3_$eg(WV(=ELbmdU!j!$FDzn>g$@D5Dg~ zCDfwO9!jpaK&o0%EDQn3wE2d%-?_21^t)t{CiHu4USj>ucyTV}R*%-ovn?N8aPr{dK?vSQS0b5pOL_S^WZlzI}U!9p1c<+ZA( z6=D@K$y>?C>qW)s>T$Qg<4P5_>Z83dg!aM^+6#TOmjpAnZBvIJNl=HjtVT7^!Vu7f zA)qsB1BEfYt9Er^OsgAo<_w)zgMOUHI$|x^3^Qn)G8`r&-_0uyPr)Kc0o&V75M))` zBkM@|lum{t*$3Trm=^L&Xnc9qq)N=3-~q^Q551sshFfx8R?_Jo8eSBtsH?J~O~QKo zP}J$)Yj|FheV`I~lqe2Q@D6vq0jJsoO;GRx$sZH7gRG zLo&OMf2ao=;g`bzm!;e~wQ8vp`J0eY+P^ z_Q9yO^%+??#dwUR27Bn&9;85!F~W^_A_@kB=XaakWIOQI{rtUko6N}m2SjYz8^Bi~ zBKsc_v1hCI&d4l}P;_g$f7k$u5c#uJHP$CEX6Pv-bqhA-qYLYsoQ&6L{C}oiD=!Q@t*SZ zG|_wNrl&6NDcawe$cz4oiTqam5TyOtM82oLJCX0|?@8p_`+F1lgh_*gK{+_5Zu}?EF~;BYmoH5JV+TqP&s|JDTREe#hb7sfuEiy3&J?Ovrp^f?`^_?jyEnT zX65hRKCBrTqN|Ye3CxZI?*r`am(qOh{sV=lo0AN4>9QqKcf%&x26F~q66i3p?msy; zsX#hHo`WwaRLhP=_l;4{6yII1&N(LKCO>sb?Ug5ew^`P~(H-8$dpQ<=Qhq{9yZQ#i zga`#+wo!l@tQ#aMNhJ=1>t@&yZ^m_kLt&HR07S#$d$Rf6+FRO)UqN7JahpZ=coCDc z24q%sE!=5clci+J?6qtg;|=Q^Xods%A?FWPqj$t&W6ILKY-;*_^0?#32>rbzk2s9* z23r60p;n{+2>xcmJeS_*jlwOI2PV<-Mvr1)zepT7>S4C@I70~-CQw~BVME)EJOPpO&O zTQgOrS-ERz(R(G0<=LhIXIcfpyW* zaOhoV7TOJ!a7_6f%F}^s|AwRGGa)z$*JV|K6DI}GbyuS6u0Z!Mg>J6OmZ5-zysTTt zHp@I$R`ndgOCl}lKES!JLy zR^wM3PS}bQ`Sqc@=ta zrXfby7lS7i&PRR;8t7Be6tv?AuN{CiDM|+ID7_c8HfRWABrmLASw1NfU9O-@5=7SX zkZJ~L-qavdP2!g@T@qs#V^JkW?*T7C(VOVblAwvkAVJzPj_CtTW< z#di{q^GhZvcf}If!@$Te4wrn+iJWReL3TkkfxOxtB2LjbWV0xAOLjc2I!^vhQDWfw zBc^yB??4m-e!Q!c@96W&S9GQH70G0=xAYZV<+<<}$FB0665t@eJH;F;9M>rS)0Y&k zFG^f8Tf9l)!jqtlg+y)v?Q@BDp}{>o(nuJU30aw-{Bb9F^8?Z$z-zO6`+KE;2qaP@ z?MERGWXjQ?ZXBKh1Z=Z6fSt+#u_75urjXYg7s*37XJRJrPk?(wnrAJBV`=wH$LJQ9 zdYmQ5j|xX7%4TNv!9)gJ(x5Fk9x_MTDuu=MvdqO5^Fua&DVjfBJsgSYMX^?^c_NFC z$V(XhbiIsGdGGlX-iX1Rtu+Z-w^#|hRHV%$xskR zTznX-M^&6HL0fFc8fIqxz=t1Vxtdrvbg z^#Tn`iVIK$?{1=mZa|>mXmbTs3-wvz95bRu@GuZ)Umm83LkViUEzV;GQr*a1W>}&f zwFMZE<`0ddt-vPOinky_XYt;H@}@<_{`?|D{qOeBz`>y}KM552Y!6;oF=Np{Gw}{C zdfQ=S;{E~DvYB=v6?}y~w*uPxMIGaAD0lP)=uqvf_aO_EP3j@JaGXP;3XV2cP)oGB zW3pdpOxEf#d4Iz(>C|J=5ge1*dQ2`1jtM^c78nyemJSS#NejONXYhuVxV`R}9OR9O z4MKL(6qe1zm;eWjNesGz#QBlpVnFwL^1Un*x@E#kl|uT1T1bC@wb{q`7s9B}rs=s< z&L+@tkGk?XOM)g_C7&C}-WP(TofMR}Xw4;3sD4Neihe{Jnda*}nGNHFzr~uF6<3mW zxVJwW6rW~5eBwKwGn8cBr9N1Gx`ZhIxbF^R(x!9VE?7apksFU0XGmb%ov4ck8e-3kigyNLVEKJD zYAes*aI-p9JM3UPn!>$Mi!DNa_Azo|-8izIcRkVSwGWbaST>!{nv`>qZ`C#?w{42@ z4=O#$$LD<3pTLvlWM5fJ4qM`rAohqUcI8QBiT|rANSV8-%uiQkHYrap*YflV+$djR z6T0y;x*YnW?a?hHW3Q+oV*pS|lUL4N_Yq1=CMDJAE&OSIa~Uy}q$mb5+oS>i02yoA-xYqVS` zIGbT{!ps+!%-0aAQ7#d-LGILsxuAU9k(6%;Cg})zZ~-ROXjARaalDwZQe`)797MayM*wU48xQOjqA94qbhdrsIu` zboI>|>MNeEZlfm8;r%5gUi+t!R!US)Z=0sKT{*pzzE*0fua)X$K}0%IMAiqXn?+M_ zP0;f-u{6pJ==mDC0X^Rkvl=ZcI9h3| znYOY1rAXt*yz00t9JMSlQVf>kYYwpw9E%NXhkKf}9d4_z9qwpkJKVXcw!_!7R=Rt9 zw!>Yz+&x>~cDVa>W;@(74%^{=O~-p1*$xkAsQdosY=^zxupKs^?GPa58@9uiwH-EL zDBiFgwwUd(*JigJ_Syv7;YnZ1Pibg7e51m4c%-Uez;<}FDzi!3;W4e1o*19)@VGAb zfin4*<+ot1Ti+-eJ= zj@WFFJAW~Sl?CQ$huIO`F!BAg147d<%d6Coe3gCgpy8Sy@GJB$>3Ow&g_?`4M!B2d zSEwzf8svgH!74he4qH*jX6m$7$TQ_9c#EP>4L?CYxnN$kpP=!|bi96onq;Z+6Kn$U z8s$#i1ky5XPa)dwSZm#n>9<+d{kDO3c4cerSH149fo&7k{WY;P$_?o58o8i;umK&> z4o6YnVd|5tP~?v)@`LtxUu`Go;(qAjewNs+@q|fSf)7`7d5g>A`x5G_AOW?kzaHHms+As5QW|Tk)D1*Lp|^5s$Wpwb`I)kChC8MsutG}!b$~=KI1DXyZHK9 z_V|BAMKe{ZwFl_3x1vk6UX~o1G$qN5cf6|fv7TmcsN_vm$xQWXMI77bg+?i~9OlgS@!u`uHU+ z>3=moef&#Z?$=vhAOGrgrjLI;4t@MPO~>Cf(#OBoP`~}3(8o8tp^t0mV^HM{eY`oB z%5_NkhCY5xm&i=@y83uKrH|`t;v4E};w!Z7oXfwvEA{y2D)o4U)}Ud)zf=Q;K$LE` z#6PMPZj<`r~ zWcRl&d>NJ~{_le}f1a3Nt+fhy_XrABS!PTV(;bOJ1jgdU#hon1CjBDlc-svwDFEmgIyhrT$S%4j`I`A5GfBjP^q`k3Q`0NbEGkY9()bSZi>))vNrd7v#H%%%0N4;QYX}P^D{Qj0# zXW!-#4*%;fZFzKljCgGKpv~6zDgs_pMod)`tF+dtvZ_tB8X$GE=GV=lo}piZ>OIwJ zy+3JFm42g%w5b~Z-}jF1)Q!zK`OVk`*h6R!Df||(2S}*W9OdU&soe-7XV6a;YlQw} z;LIe8zisndKHI=wJ8a$Fl2z>Avs50AY1Bf&NlCEC*8VzDXYPV^#|$sM&haWeI>ult zwdR!zSH?^$MqBh(V~&L3=Y-&=R>S|yD)f1T5PmP>GTY1A#?MMLTw+fS#4BzWYPVH% z7)?IP6;<}YDq8)CyjOF${G2-Fr#2|x)LMO-UIlJ7zP0*vU2evfU#oBRI$NuQB(Jd_ z$cnsBDfiVI(wnmLvPI;7yAfK4ht#X;O3)8(>2nL@NNSLt|00`;C}K245zym?ux+UU zHaj(%?Q+wNS2AX&y82y%_x-Qx`El{V$#v{(UmUz)Z#Qdi6XDJA@bFx%SAx^eCwOxod{6BI`m`EFjt6OeBI{x%Ddnz@2aEW zd+TcW`JVe=cTc7sp!9uE{`S`Nsc;$6#BZ@{9u3$^^gUUT8!Ok@|0(Nh#lxw(>#YCT z^;Is+=dh3KS)ufx`Mjywb-OmVn*)#d^J357yjU2V7vO!G7qIkVY%LNY&#RahzHwP| zUM$q}!V^$DFZQcpMAn%X3)Q^XU(btghy4%#O@0{e-&y{=2fpm)o%Pg#mS#F2b;izh z*7$F%?VI0A%N?qfF)ig;Cm#q_UWOIVsm;dE9fczIh4S#_kl=oW2g^wZA?b9gVi&at ze|uF`$lY1xF0aZx!Q#`TC+fu+V?7j4yZB+ChXvNvJ1eo`JV)zaTdUR@s#!A7_( zQEImPUT=0%?LDcgWS~`tdp3{XCJth)C2M7y-sZKb=^;5%w`oV!rWG~XWa=?Lx~feL z>>Syq6TCK!)EgZ&@WC+;)OlQuI_v5jS?7rj=%DKC4b{0+)e-VX7@Nf(Vb%0Um|=$m zx3f}}RQhX-&El`IYWizrdpxs`dAhE@W()X_MqX$Bqq^g@t2)oVT5?p)ktFRU_itd9 zb!_nt&5);fyjT+#b9xo;hjE>(ah*C|T-EJbsc~Tl#?{B_cDWi?$-@QvdM_Tou4EgT zZzn4@ZLhD5GxGCcNaE4Z{t)m+-p5|+5UEo8$*<=V!`kl)5%+!)b`Lnnp!xYJ2H zq534lCLOM?wO)O#W<10-F3Q_(_@yRY>hens4OPi6^<4F5XfbqJBZvOGG}Nj_ zP-kkW(;GpJYN&VW_1|B^ei1cVOL~?~`VWskaVqby{q(`M9{YuhW-JoBqPcf4a}J@dr^h zR;QY$U))Hn$!2=-<9|K2TS|?lB2k+8UWXMK*=VfQ8}s6|)NfVv*D`#GX13Qm{kM>j zv03C+?HH@~H5+5KrXt4bJ&j_l&Z`+?wNk9EA7iyr)*#^mw`Ywj#_D`+pkFY)7_0Z{ za_`&nF;*A6&U|F=8%K=QT203b8!e+Q(opaJUy8Bndn3lGK_C#Q^G1x-YjW;v9n!uL zWA$%2cebxyjMYkU@pxmb`s&759f~hLS8bBr7kqt}@@}sY((oa*U3-Zqi@zFSvDUb= zghsBaXK8C@jAVah-)LTXS}0ndS+qggH#AFGri3giP1EScOw$H&v09NOI$1_pnb$;{C)6dPe#c#tZ}9~H>E(lx?jz8Y47;gL!dtGjE{oa1+h6! z?jW)?$OYNLnup2O8t)lyZ->mPqFXZuY!KlZwut7q!Qb(ge2I7pQ+$|MNbD0}NmDFf z!AD#s8T1pIz@VQ}4Ejk=K7KtM6SWE4S>?I&S+goD_v#&vJ{#7kSoUdBgV?HZd$KBc za5K27h&~N+bDPDHMO13og52LXqD^USBQDo*lAo?p#?p5fk>BR(pYiYd9#@EW%uV>@ zCbyf+jnFqD`=>4Gc}>3z**CQ9=KVxusJOW)pJ;4m{6DM5|BBb`_>cFqY5%R`zt?Lq z{#WVozp}~&#&kSK`8oQhZf@U(InFQM_~)hs-(TwQUy^-IPZQgOaW%*JNtIXmO^+YQ zy?tr-;-5T=yotfTS`Ypgs|Fu!I#ZnyJrzvwS`UBCuPDede=rjMUVuER`gK3-^^WV0 z^pS7-7`pBcn=CT2_YSm{nS$j>Kd(;R8?pJ>A`YU)>o^EH)_9Be7h|1aQRGk(q}^VtvF!&7F~3^R)UJeD)%x7gC1E zArWFEdTdB07mqtwYg=&2Bn&aE+HQ!$MI^f$I{_FVmhUWNop~tr~UN3xm zLz8^_%Nl$;P=jv=Yw_*18sEMiKDnOTy*ci^MRV`X)hajgdV7ZjYsZQ`Xa>o?b~~S& zz{1V$b2eoX-KNLqtJNkk)8uQ~CffSnyWeAO))R1LUud^3Y){SD9Cq^N6;O@ek~cT& zF{#+MJWS1Nb$sLu-SEBoC)YiOQXX|#oUZ!T+drlLiIu41Qo{ch-W!e9-wmZ;)=pdP zhDJlXq2wJ+nhvpml@(iK3_4meG`J9Y$fo|`ry&npyDM>h&U!t*I2>DYJ#nv1v zUQCFcBh;l+skkjs&9-gEhQnQ@Y|e`gizVXTG;xW`Z=;A2vSrSqOYtwXh7u*ZV@P{B z!reCamnkbfdc9=VgpY1ivq9QX>!{xc_i~jp6fj*9Y`{WLkJK;K^j6ylG-vj0;C_y+J(-J7I7}DqrkL(hS~#fz5v&O9RfgL*(bfBEDfa zX$w4}ZGngD*lM1CWa7WkKhir6|47&Cf5EY_<5gbenI4|~Ke;NNOnkS>#5>9?I)=DY zsUzN7d;$+EDec?{D-h>v=uJ z+RHV=bJc4GwLjSNx>_~7x`1wJ$DLalb7#Hkm^*8uF?Y;Al_7U4Re|qm{=6+5i_!g`_D+qKqlr5Ei`}nztbCA>Uq?an>MWphD`PsX zR~^%7Z8WBn`LS}1f(W8&@y&5c&oryv$FzEXwuXA&a{9gRzgEB34DEZB@no#uFU68H z!7j+NL5=Q=BLg^5KwM94YlDAI0^XDS1}pzWLV-wZ6mz6DzeXs%BC1+%!MBc|l`5bC%DnpZIYK*AllJ_w&P_zcS@=-TU1>8ST0dN#1 zkSsU*yD@nV*eJE@Ae<#%m}0IXXRT4pn5&MZYbsW3Gglo+cdhYaD!(L?iy3Yfv@pc4 z311@a;*ym39R3|LGC4G(U$??hSCOHDMar#c#rLwgOm413Xu3m`l-s3$Lun>DV3dix z2_2(VpzFbCXK5Ck$C+fl({wHyD4K(LB2f>aCo!9J%yr9W|J<;dB0N5GsN5m!e-^jm zq7YfHY7%a+SU^3Bpio20g9mCUu6v_ zJIqtxCNu*@V=!kLZrt&G_vHAAEI}VBfbKvqfG)tmy^4VgX~ndu4lq8^IcK`>dEQ1$!K z9kh=cvAHR%-P2^aq!o+NgS$PIC)mXVTYPk^3r+25i5Rk}rFp=v_)qKr>aGUUY?$~N zhz73@yGC|6L-t{XWsCyi8~|_$Q?kRN+-yZX%oJK?6dW_m0%!^I_>O9Bczo0vtTjh- zWrFSa9K#buO~9Yq?tGx}_-)6~6VJ%ws<_W`cj62UwlgRlqty?AU`DGsJC&}>Soiom zo6rxt(1Xn-a`Qd3y8`Xr0j^mKHt;Ax2ot$PCO2e|a_Mp%6u!k+{caF@H}Fo6WadKJ zkT)&{vW$FV6u+qI1eh}>C-PiwiDamqhohY=?%=K%c?U$nb?_erV2)szV>Ha!wP229 zm}51}r9R9QWAt35Q_6h9a~0=A9>p|5dyDqS`P)ZM$(44OeALDBk<&^)#(534yMS`C zOH=s{$BwysK!<&hIy4xgv{+{5OOCq;MB?^L_UI4X)SkGJvt4=5m*Vfe7}$w){W-}D zaW5p{rC~`({9qEe>HY@NX})^0+~4AnGA+&=QDezZmU|i=rx>h(aP4Htg1V+@S~5W@ z2zot;Ww<9RIi%qa_u<2Xq~L#!rYtauQL}493#~Aus*<|*I4Xa%S03W0kWI^aNz1j; ztx|K-ayd4upvR?MlTXA9(S@lm`%{^nj2mJi=9Hv`ud95z7oy@C#A+sJ78=7*@g+1^ zjY9F)BrlnbQEo!DE%Dw4c^5RudtZaR3mfFUzd_#G26-1X$XnMS@8Sk|A83&G!3KGk zG|2l-tkoUO;c~>^byQ)Fn=aul)xK#+4;$&`~em4$NBJ&DtLgD_Ezu*R=~g2hks1L z1ElmO1;3~Q{%t<|;|d-ir8g`1#TD?!`|wXFcz~4lQSb*P z?XTLiqym105C1I%50KJZ06*I(8eNn^_IVzKm&wAq>`8vvr&L)$loqPG4zH-|9X|ZG z6+A#n2PpU>D&SA{;lHEc0a7|Juoi2F&ki&dzrzQrD3S%HvefO9bsp*GQ@k~UC0-6e zN<0%ZtR?;s%&x?9Q~=NKYv6$mwUXN15fO{99KP9#SRE0gd<$RA@@;&z%D3`0TK+0u zCzfyG>uL!u$Og!(Cvgz>wvYS_dk}6HG%;zrv!i9hM53PII+m~tr0aQU5YH*we_AB7eIy~*FIEI@-cvlAu`tJ2^*zeK3meYp z!DxlCiX0PtsaT;mw)#!VP?fLc!8=~#%mp~X`Rtv+tN{v zpE4qcN4iV8ZPNcsTXyMaiB_qE$0{v{>&|dYUa;Azv4m3~(}!`8KSAPXkEHq}4zhUP zqb=U|gxo0-Kfb{^g1%egM7AIgfz_Muv)!-3)-`D9b{8B%E#hvp`*b$L1XWgiHrRUA z_O{5@b7Z}G-Cqi>`?H~S{|YCt?!UU$y8pz$y8k?Xt$;QAX>3cL@2%O-Lzk#i7*86# z$SQ9=dOn(5oK@-P0dDQ*;c*E#deAcE=%HAQs9e{WnS6I3?NF4nJ8W@0r38@<#BBF4 zxP_Kr9-xJ-w!0M2PJWvXM=Zl_EZz~5gpDy_L#`qanE($*txwQO+}V(M+FOZxJp94P z+^@^^tG0JfXM6V~9>ybhiA^&KNbEHWAZF?DC^+NPn8NRBxqI05 zq35m~Eyq8~Z6_}&d)K0wPG@W~0dp4~p)Od#E?`}rcGO&16q)~iJ$@$3b6&5QG)gP6 zWHIbqm)x6MPI>R5Jgab!Y_G+`i*dwwLf)ZCSjuCL?ne8hg>G}?SF~caNB%&+;t1_% z%BRhdhi6f`Slih5gnIFf%QJnRvN~GaW58BUF%fV_P*4ZT48b{~`~k=567I1C@59Q2 zq0!d%fIP`z>~Kc>XmC!G|KvR1e`34GVVV6_bUWYXxNl>hc#Nxdq&#{lC<$%%c&RKU zt+$Hw?kwffTs=WfkcwV1ECyWq0ti)PwVDI|`603l_5Vcl-zLw8!&URjTjF~=P|Wu_ zzFc`xy!o&eY#={V0Ro6o^jz1!BG{Od!kFG+NQX-`GR)cUQ+vx{SvUV7N|OQ!4s0#F zvVPK`TIR9rij_`gVWH-BNee{?w_id}Q3#qig#B{)or&QO#%+uQ*PlI!DgAWube#Nj zaf6uv2QvPR0MhZ&N(`L~pIuZO4xioaG%=zZGQFP9j=Xi}``$W#+-)^iPKfM#z3;0# zuhLhCvWw*SP1NfL@x?d^6TOHio#NR}W@J#okY2hIl89_Qx;+)XxtfK-c&`b8jMTH_jDgG#W^Nw7YgJ3atP#%+IZjP<2@62YZeOQy*30gS{v_b zA8#3WYZeOQy)Fc@rZ(QQe7xjkP1G(F#(RAT4{1^Fz^&hZW>h>9;G(0zen zM#U9S!&dpT-Wb~va_&UVsahM10)z~_A=*rSmfA2hV7b4iUR&$eXewm0?32r6+#5lT z-%&dG4vf{Gqmo_jm8fE0V-!yko1pF6eC{$@{auZ&tzDzHbPMVPkuP#Ua`|&UFRi4u zoy)c(5|fTB!+XM=frl&clOUU)!DKoUnU;@7qf&7ftv?kK;+qU0+>cQo{4o_%yd|n! zcP*-4cW+hQrhN{s+3F@BE{oPD`5gHW0K)rsSj!?d;N2enR4h=YC-4yBjesvA;Dbmy zVIKr`QRd6IYj}Rx+(T(v!2}FxTCOM?dXGqcrSCJ@ib93n!~8(&B-uD@>i8|%;o}4u zOpr}9*_DDF-oj`)Itu?uQZ<|GPF%3?QYqN^?OD1P#eYUD@FDElz+Zm*EJ0E+IAFw2 z&~qyIf;L&XlP%$AL9rrvT7?mXVv<7Xm`|dVS()r2xiuy!r;)_NkBqZ3KGqd4*m32E zDbU8Cq#xGnH1UkcPa|8WT9|%Dp7@^+4M53i24FqaJu?gg$_dfIHBe^1ZK`$0QkZBc-~u$=bOOuU@bgP z*2nWiHJbs@;8|Y_&%O2We7hRYlfZLtEj-WH$MaM*o=1V_`C52>R3FcGs_{GpJU^<1 z=Y=qyDS<3F`TeXNzCz-NP(27#FVsSHM+jA+m4G2Ns^Ipm-}FbToBl)8hay#Y_N$NQ zv1&Ze0?&T6@GPp2=gDe3&jHV(T6n%%AI~FUJSQpAq+%SImmOXf%ech8iM3y?h4}IM zh;OKF;5}&I;~pMyH>p!4<<{;@BCn>Vg^aw51qHXmBbT!%vG2N|jgDcP&Z+q``5AqRPdfLG|eMNM#Z z`31Eewj%qGxPEW-+7bW>tLUuxBHc_dZ1>|a+Sur##Utwg%YBL#laQjMq+jUFa`NXmd}kLQ${U&-)Uvk$%G7Ag}aQIxqK!N_SHO&PMCx`ua^&-}~g6 zh*t55{50GBGCb-XwtFo%z?6idogLe~j&~Be#P?emVm%Jbki zWtncny#XHk8|i1{tF$lM>wbmZEwpSB5AbgG$RDs>OY}_?d+m`W^YufkJ#vqJC>Yr8 z0)C3oj=aBRJotAQpdz*apC+CD!qUBLYT~Sj)a+oF-_YN`=nt>0&BOPR?EXOkR!+tG z7tLvp_3u8k58VyDbKVarGuD65&{47eg=iS8VTYET$ z-i1QP&-*0OM`rJ+IyL`7RQO&_T&EL@XXMYYM_%$Cm*$sRd$XZ={rQ~c>o-s6<~6nms&7ya0tZ?{KI-z7w0>4(@wk74x)O$v@s zdtii$v3zReyM!$_GH+MU!F&0UcRMbG&(RE2hiP) zI9z^SlJY^@6EPrfnfK4i0XYi;a?-q?R1CcWpKWT$FURLNn+}&z#g@_7SRqiMQyaEZTB`xT300dFo_qD;L=H3BvkG*`e!iW zPAAhD%Ws`_(y`01Hz<*%E0Dz#X_7~sv2-jAk@QUyeRu{!v5g>a*O1wqMIKFO(1BYs zMvpAx5iJvmT*R{F4$#eT?_@~}Y3Z!_8r=_f+3SB2lC1^Gv)#LZIc7WJZdM>rT*POE z2{DxuQ#s`S(z;|F*F%h!D2md(Tpevjlc(%Hx_4NjCmku#i!a*l{U~m%A*Zl4P|Oal z`5N79u%Dm}&=Q$KiGj0`(O#iYSDbY48p41xZxucfMlJ}m@Jq-fbzbLV7lL6c3wx}Y~+bYx|5?) z+2OdIxvX+AX^59d^ZS78Ym7#Ubp0Uk_Rr{|5Cih>B#4743WAK^L~^W?8c4o~g!nz; zGX6k6V-YSZ&!cLKB)TJ=BqLfDtlwQT!r34&#opm4E5zW5Z_6Ol(K~do6yH$7ojQSU zG~`|KYG#KsMpnFxU5l*vlf3+vgVYPjk?DA4;8|+VnLu=}M#MLiaGy@NPbJ*16Yf_D z59ovkRKkNg;X#$~kWP3=C45~cd|f4cLnnMgB|NMX9##pD=!8d9!lOFjQI+tRPIycu zJgyTSR|!w(geO$OlRDu^m9SnXtXB!&)Cu2I3E$EQ-%<%r>4c|L0(ro!-1&<1;sCO~ zipi0y7icOIg6rxJW5W0e*S7Eag+rLs>z zW)V&`yv$O-z8~$baZWQ+VF5%cvQy@pe z7L!JaxFu1>gG{nr;+90Nx3m{}9KKL1Cz1i4+uQW_mZXF{H<-c#p6ExhsCKtiB4*?1 zeIpn^?^ULFP4E*LXVlA9{D9#;NEgz(*uJ806y#F8k}1n8woa{ z=~7s$?Gi(isbRX0Vhl%2UZ<44hn<4iw2mkqV~&2Kh5En5be{yofu{RSx>7m%9bRC% zPxBLghqp7`@9`6UhX+mfhx~-!;cnCY5kKK~m_+U4bj6!DncPwG6)UsQYPx^pmWyFf z-~_ACMzlsRhN9wO-br(}M-G_fMeiMIgX54fX6CB%uwH66uf!FvPVNZsOl}ur6!0eh zQl+!yvp5k$a=L!Ss}M6wG@TRqXo)6qqWo=EwqPFInJ)SK6S-UDE>Y+c0hUW17*glo z<0TmbTkiK|m=r&{G~W`r8%Kal&3fi(Ar@+~_B@Qe()(ltFBtZ6I+ z`CPcke!VrDOfw9cIn)@MR#j;)$apco!nJ>cZmdo@f8-&m(GWCW5-flWmxeRJYi>bd z=svs8HN`7Cjkaezbf68`| z_!(VJTSqX|r1htG_SD^SFFnfVcYc`H42LpawXi+Tc7M)hQ7Y4#KOh#r3@cIh6I67> z*h4R4hAD}SNiqwzru$#O5}HCcFRH|jw3YQ*<-P<`#j{IV<1sQnuA#^i9K58?I#}bi z(-JQeG4ie6BbjEl#3XUJ_aLzQ$Mj4hVYYGFKd4FWZ_vnP#%hCv$>>CA7=u7h zqh(^Bq=OULKra4|5FOeA&2pb6s6?AJ`ZPVv#|fA^_h(4B1=5)hv+5a2$_9yBSy;4L zQTMl0rvkU#7YI?ARIX*?)e2%6_gwg$c2fYWe?vdwK3=PvVkZ*l5^wL0Z>DBBro+gi z?(Z>gj1HsCa%p=#k$)--+{eKFC`8*VoDAr`40URBn7Y`*!A^EY_0vzGKn_+t8g5s~ z-DRZbcM5jBu$6?$hWf1_va&#p99ed8u)gk@dr+_dwM-lYwUub200IcXOin}nf_{33 zC$v#B#an6FaSpPxxlrqZuv3mM9H5_HM019AqZ+92mt*R+?`_jIEiffXi9#{=Q^;}J zqUqR`K+ZL^S!qW^aXN+LH3e1m&OAQUn>a>WEVXJ3J2$8M=)%^-LEq|xn45>Ir)(LIMB_f3C^Ok`--GErQRPy_rdUTTQl0|qhEGsXSsGi` zP~t|8Dr6MJUQs*UKk-_(Fh@i7qTa2&dhsX^QqTaXgRE74vw;@_e^w&8t$%{|sN(Ur zxQrfJ|1VEx1oa0=ZUnixf06dS6M2UAVK1$e&p(v%xk6$mwZuNMr9xuwPYJao7pAWJ zSGJt~Cg10=#oI{Ml<{PY{zIlY;&`O}!%Jf!z5`AMs+Qv`gQB^6N2r(Ti7Tsv+z|hS zXqROaoD+mYb+m5y5UYWI!NX?6I!y4#21xWv!nJ*%nc6z7=BlGf9;MxeS6GRp>A|b@ z!jK+uLV9G{Mm5Anl!Eh`D+Na@1@aS;Qi#!Rucs6eQYpkqDI`KlAug3dyh14)7wQc# zFR=oAwK+6Gv%DFU*u{R2E2lz9mJER7s&;mG1#=OX)#&XObh9n&I(=Q=@o;Z`OGeC*L;-Mf6o#3 zBo$%HKLSnNkD@VCr4XpxijO-y*oi#3pCv@pHMtGEq@e#@p2i}VQ4*V_-Q~DRileub z!+P`uQp4;Xju`^Y%(rC3 zy8&o+Z)g!0@Lidq5*hrbGQZVMFusv#ztd@aLkYjv349ZFIbqF(bDTcL?*_ku-t%jD z!6+qi>eB-35~^Rl!ihfSu~T7`q98ie@dsT8-%!HKI^kuN@JF4%H%!UVKj}2Sp@cu{ zgg>i6)2Ex*bQg$;S-_E&d4hud2-7bQ!+kS7zC^ID`86ao!sWh~CyX zhg2cfb}{`?a06fS~I4sB@J;NICsEN`iqzRS%t)j zikVc$1oF>32OGrVw$oP6UNNVGRHU0n+vh20GOlQ5+X;$K9#Gv#kq5x*2dR~4c>>SS zSUC+RVR4cw+EYez^R4Pp%#uBm^gWqc`w6_q&Az`>EIYJQtb6!~w&-Yz{g9U1MKh-0 z$q-8Dgm#HaaS#<0By49k80G1xV@4akeaFqqlLF%#TJpCNpeZhfR99QWytg<-$temm zw?@eiY0>1tThmg-FE$h5yQq-IlJO;&)vw_a^DZNZ6|`#tXacc*h!JD#$9d zX<;fKNWqdEtLYaW_l4RKPM|#|C-N)OqW_2S5gTB~j2eP9R+JUi{7b-qY^W9%L|1>8 zt^@m%kC{5YRD{PXH~7m{sw@% z5FiE91k7o$s1@Y^LtE(vWkd9s;tX8V5?qG9uuWfCfs=ZcHlZV(QQFKEWXRZo8WB0M zibkVFE<7?=pSup#G_rhKndsEwT#AX8VeHj&yaNBn|29H2~Vs)8;gp~Q;})mn=vZB`sRrgnz5OYK|>ZPK8* zZQDkYh(+N0LnBGNbH%%;$3~{1-I%}cpy$&dPyBrsDEfq)?txT+eSC2#65WK!%g(I0 z7>`-;K}ZHetcBp7#;5(Dn9aN?UDgsZBO$A|eG=W!W2GdNtQ0SUg!Uo=mN79_B(2)X zn-Y22jUbc7j}ME=b0os~Bui63Shswuxv}zX4a;-5nkwH_ncor7e2^OgQ*djuxqaKB z{M1ev+WCQZvaX>)x}0q}i01y}@Q#L92f;B+SXhkZa1JXym9THz^cxXsQi&eBkn zDWiKgiZUgWj4i>%RZHbU(GVPkH-ILEvhRlx?oQB6oJZS5k;-=GOR}k*q@_;96&rQ9 zI@LAhR87-2R#SdLWi{kOOp`A#Yl<{%cASghAywmc(XR@)>X5ceHRBT5Cwb zyh!_k^HWWXq$NOy%8RTR%+YL{M8LMVcEd#~wL1R@*3-06+DNC80m8dLHmvz)o zB~=fcVuxyuEK%-@>&At zS6#(xM#X^?G4TK~%_@pDHHupsqdl^flVvL@LcIs;tTw|rZ2-KPC<8#A1#K%i7hWAm zSxk{*kvAp_h3xMw8{6WzfcR` zA;4Gf^=TmP%4Ec3MosgEV$(5i2FDVEbh{NLZ|GIuVVoan-zSnlSUI~s1lfi-@~JB; zXzwvW5r-TlK%Rg}Fx{-8na#KKlqVyv+St0bUW|<~iW0^skXWTDULAje(dO5&fdi&g z9j~x2!sI~9+=cR5RQOC|6xqfoN|3PKP8oy#X7)pWL?pEk`X0eB_o33Bv_@WktZw5i2)<5wY7IO%Gl&e{0;@b!&J_cvw zU0-~fLA(oU3m;r4lXuNB3?nm;ER$c%at2am@+gtpfjG&cFfv*hSVpEyoCZl|xIcGAS)q#EY z$OHRi8L?a**oP;vwe&GYBL}HDZ|cSXdO(H0pc(Rh-E#S~)ZIaTCM-@JLCf<~44Gpu z;a-Ld&A!PHQH(juAn55YfqoLmT&hX{&wPC7Fxx5i*y^ zrx4-{54Z9goi1HpY278%Gb1kJoex(v4ZXjLq>?%zQr{uWT6~M zQq=~WL0C3>o9+r=~qee$Ds4Xymhv$`fJ`P7YL91#Wy->`HE=MF9X zoo4pgfGnMXI|d#SCsCuNsi`M@z1ToT6Y+Hp{`JQ%f>UWAQ<_LY*A%c*dXB`&6$9O+ zYxvqzn$OqXQXgOYN@tNP@QQ&+r30xAR}4%pJ;BdYvZVt7py$t9$j-f%=TCosX&cO- zhr$2y>?kppF6z7|d4F}_UY^$^@8uaw@?M^cB=6;!L-JmpYb5XGnL+Yip7SH`<=H&) zUY@5T@8u~f^8WU~{T+e(I|KJ$3*5`|bL71|^G4pwb8Y1Py@7jqE{(jGXUWKWdH##M ze=uREjfSZFjCa3!vTFY5@y=fx9-ekC|VG>#KL_XoY z&-7D@aO8qGf_zaXCy|(pL)jzvR><|RcQS(97 zJMO^B(JFM)QpJ$v$l023j4qSQ$rC8Mac7dJ<4ze!DvhGY5Rjj;*-veVuk%6aylKF) z%#3^^!v3N(>BcVF%y+LRIK1Lu(n{SS45?U`+<%!!{fM)(w79=R_UYsBk1mL<$y49l z0{yi5n<+6F_?3>!7buFcxLbr4a>(EQ7?lfz^TEIZC5wBS{0ao(;#ACB4qp&qDo>T( zSw6KRiPt=$?yYD_nqs7$g@)D*qKMfww3wwh;M8Dg7n(c+XLtB=1g~O!MXqPXKjDhE zrC)ukxH?mlS9M)xL*K4Y+G!N zCmOJ8V)FVWx~la!{CYQWY%n$)+%KxlA-uu!Bm(?8C}tC<<%qwKSTbaLAI9+`6q`6l z#U`$~8iJHxxfE$@{T|`BFelRHK5W^k)Ce#7@Ihy^BTAZpIOiVJ8*Ss*Ogr)-wdZE$ zv6v~Ipo-xCH~Z(hb3kUAQY+*egLCO|U2$nVI!ZgCmKY@D#r@(Lak6}aq|=Ir-bP}U z>WZtkk&qVSG+F|utz*b4i@WpaF;1k6ifM$*o2MT@*$vaYV+Og9yi5cJagg-hRCG0ooGmCJ3umBmyimr^^Z3 zl9N;-FPLkCP|7a9magO+OIsPSk~i{FgK!$hY4sYWNm10z}QFqw1W?7P7pO7ewr%l%B#`@T=&5Mz}2N~+hN&P7+_v{#x&@3K{h?{3&pzD^3z zKoJmAB=9Yo-w+K46rlT4^?-ND+@Gt5-I4R6dRV}6Mm~sd;5^P>v-FC^)6pwX6U0rM`sJG`BA8}ijL>TR&WW`LFKlgbb<{=M|#RgX~Au^P8HtwZml@M7Z;9km1 zBZAj@$w!nnm8p^#iD{396?AXV3I&Kw5u<9!2AIX7*l>RhIh=8S2ObYr0L$wUOL;|hpzOvFX-}%u{IpjmLg74r~c}*$_|T6D*0zCcX<2F@ z@N&{SyYW6=-=NZg;)FrNC_P2GnY=?t(L9ND(ET19n~v^&XrWW|_QNxB$9nxIv@NEk z*X%Xq-nP7#G4#7g55U$%jtniylrR#>vyehOvzk9x27A!SEi~CsR^B#uf3U$WG*;xO zv}oZ)K2-~!$dk|N-84@0fUMfjOe#B8_dxu z>~NBSEPTV~m*d_1homnsBg)cB&y{vXQOE6tyjmddyK%p#yw9*4W3I?x;hJ|Bg4Oav zG4}wr7zc{6L5U>c?#9!wm5RjOHi)eqDZxFE=Q$rj{m59tKl{!9*4Unr`D^6ad5aCP zh`@=&Fi0$SaX_Eq{D`khzsx~cRUQmpCzs42d^O95^3^II#@C7EC45~i!Ngh86@w?S zjIrXJK4QTLZ8fB2eKd7!m$=9luf*hb4BVF;21x*TD?7-c^%vxxfX{%pn8L&;;20#@ zdO95T8tp=f2pp(CN?T-@#OTqcM|{0N_jPt;;4p-nkOvZm{t;A6?I!6yJ}moqB>H%i z>f_O>kH@G!9;^Czob00n6KBgl;z_&>eVj}B?s&fjxyCz|u8*kq4O?KQbCa!8scza- zf`?tE&`c~N944AsQAQku92#m3(<;hilQg5F$XhNf;Gj0FCIsgI6~AK)IZP8i@+i~z zTQFWIB!=jhP>c)s`xLWy{NmuaksN+nVwgQy#}7pl|7@>>QOmf-dpG?TSZQjkN44 zcX6znHv62k_azXzkLvGgkXSJ&%4EiTKE9RizZ*GnxFsd;?~9aomG|KL4u79kMikJ1 z3O-?Vfli8A;{UmO6EL}os&BmK-rM(f_bf@z(mk0h6PAR_^vnb@EJ;`rmav31tO;A# zL=%t;>3~Y7LtH>X2!e`=f)Wh4q9B{#zM;4M`p3Fz>)T;;m`+<2&ec)yqUIFUx}ya?d{0s^1VN_`c~p8*>VmEjP5Le0QkT z@2=O#8MRhUt*#d?!@Xo0Sc*DkibAf&-@#D7t-gB+3Y-omup>9-Zvd!zx$JoJl1F8l z@2+D6@%dx^M#gwOQ#yW)u=;~sc!Rpsg|89vyNs_9!r{1Jy~FRab~h$eag@x}HzLLy zCprf1Ipt_S##)0lGnng&1i{UwW5}3a3fep>HmM71?>X2oVbu#{t>df!~4{1mdDx#(6ig=C6X7BWq7l`v}9NAHb1!Kit;_N|y@!>h?jJ_$}TGgg`r zbCTTy@jEMRnK`>B@2t$j_xt2^2P^I+xAKf}C-;&MD(dZ8s2{ym#(;R-=o+&YJ91X} zgJ#@%65PV`C~@&hZ3$vOYeuX*kTY*0v}JZ2PTpYUIpq&|H}v-hn|CS;sbX3yGcXNb zrLwZL< zp;tMx>k`H5qI^Ek?gbj5!J2mFvYda;b?{ z-(3NtF<`y|c0R-cMilVc7_f%|9*F^aDqzN;2B7*DZEG(8puabi^7k^iY%9**8s}@< ziUawKeTSLvYC|^`>qtoAVCX{$*j0lzC%eY>nNwp8jSaH$0Q~b4e=q$biGLdXdnEoo z`u9xy(+40Pc>~Jo?_brPFAwMPy(769Z54l}Zo`tdT%b8zOw{$)b|1!;kQ%HF;SS#@ z!iDfn`nKSNX|6deuJzg*Q)#Z)Mw)avW2rP(Zf7|c9NtvUgHDYtxAr$Sz+Q+So!MeC z(A((Yn@w~!;@a0O+pg%(I5oEC+T0N)dhht?bIPN$n$o_7X&2#`m%X_h-oTj-C(!KT z5Yx)n?T+3K@D}JR^Cp7y7oNF4#{N={?Fi_-y__H9<%&pR zcj(*Q181a62bIHjupF@{bf7V&56&OVuJ3TAeW&3b>f!+4Mhm#n0N!N*?=paQTfn;w z;5`-~4!am(KV7|v97J~roGapgulldH{`aN)Ybg}@?h&!Mit5b>^iq*;X-fS5Z6*Fd zQ{r2j5^rwu-`3>+V3U7KlmGT6{~b;K4>kEe+~mhOMuY#ODL)?|3o(17T~fhkQx*Ie z6L?7mA8*R=PW4}7{hv_(we+8~VSjrXbqUU?=4_-F(8U(|T7fQB=n@Nkoj{i;^Z*Ne zlRytp=z$h`l|TWIF? z^N=7YM?cgo9w6}3_<yWplM_`Zf29I6SpwCSX#T$Lu7|t4=3`~ z&%im=@w5UwF8?e`dYm$AsIJld6Lo*Sp;VKJpafYGD~dzA=$jh!1zW{54Lvk+Lcg6G?WHcSa(ce#-9!ONbPD&_v*1`kfyQDu%5dOw6jLBy zzk;L5Xc~NdBPA1$RtS=#TpBEgtcK^WMQGV^znRC%{=S?ZWCMM3hV5n^0j^I9u3zQ+ z?pD7h6?3A8xp9uZ&JOf_YLh5L4#?pChO}c}#h#!6^az7bRrfdPUa9VH(LGDu-=>?V zYJSwgi;m?sY>{|^mcs#Bi#b5+Ma1tgB9Cg|ew6N|>K>(=hiY(tm+oWK{XN$lhuJfQ zeT@F0H|TkV%1)`%tRc@WR5}}uw|KIJp=uAbd_B;Te$1;(Pc_d2?9@w>PEE@3&`Nmd z*0rk;QpG`7;WAffhGUG@wI}VF0EKuvy3zM#$cEph<MK8m1EX$8CWPP1|dINP2phy#FgEZ`giIM)KsHGo%Gz$*;kJPQzq&3wKS{)5K_v}eRv zue7nm0RSY2@`Y4YzL3qz7qVITLN@Egxg2eBd9?|IoL0V3vd4afmD%Yw+@lN^+wf?4 zL1o_;s+S#%@?dI8{RUZ622425-YEyBdkNiZ)V(*|uTu9Jbf0hV`UyMtV}`(wo9`3J znsZc2-uO?REO>RsLa|TtNFnD&zo!7CHNFg1X;qNiovbq_2*bAGBl6tvS;_)XMAZ^f z8~{MVDBnxWVbjhcRjglPz?U|Fqr9Oc1d?L;(SQs5lqrRjM3C5d18d{Zb`8Buba2B( zCX1RmUyG({iQ)%*Ln9&^47hF)uNwg5j~rKMT zZBCaPz(xz$XaKLb0CA}3(Hpoy%W|<@3q{vr3f3V`Fwf{KTW>It-`H4zH=49Yyt7Hg zJCGYfs2;X34o(iPQQ3%_={I^GiH-B_?&?!A8Og)MGK~rS-eivZa8}lI+;@dVUmU8F ze^=bU*`o)iq9KlF*`@GAG6yF+wd+){9QEWh*QcTj#S z^2_^QSW?3w76bo)K>G=u;e;n}or53ZIQ-5e6kiCtcL& z@Q~vyd`iM(-lqx4@EGdv9+c=NTyN{Wp8ZQ!qe191X$qQ@9Gve&XR_Q^qdx4wlz9_9 zxu8@E7ieLv1(9TF?={J3gL2wPuSq|&jaa=SQ<_5!PxX++&k6TreWX#Ga4)*qGEPXQ z0OHaV{?i>pIAGevW|FH^;mKMkr_6}g!TNhw4ekJ4aK>EXgaPweVCuM=ZTMX@!eGBf z7%DsAKJ-sof?8f33L1wi|s?S-Is?%b9XeUEcS_y^vK+2~!Ls!N4(Cop_1Rv%HuI`mi zcp6-M09vw|lfslr=mKmvU7Em(m#?(s;-dT0MR(#jG4X~h+X=Mv#$pEN7(e(yfQGHw znue~jwN{*80Vy-2(Zv#abdRYvr?o}2<6zKzItAyYKmq<;xkbh3hrp;(C{+T)5{=JX zdE_WV>DP;OKGWn2bdak7@to-(JDDsyIJcEdr)bqq!4ct=F(`1R1I4D6a$x~2#~Wm+ zn5QL54Hd;zqR`m_kLGdOL2qGLNyrhQlP1xB*Jm$C!KhxO-5yZ(q{ zmK=;IKpaAM+O@!;Vo~R})}U{=E9jp(GQ)IYn(!@DrWzm3`xYRqRvz~)HaBqqfU_Ep z_orlaZm^8&)~_;guC|G;Hh{NUz*`MKmSB9ZZCt*^t2(lLEBu!tyN~veN#&A*A>@VP z%rRMetGpbTyUa8a)E)g4Ltp`yASZmgs3&EGj;2~aLuh+CL0%G6&hal8UR4OLz*l?4vQf5ANZwQu^Vpsc3yqN~tf)h1vd?}7eG+CfIz zkMWZ<_23lGRxF$4y8@a+f`>><)?FY{5w96Nm$$H^Uvi>i>e4_qxQ0=X&l_~44)G~Z zvOojscX?yc=i8LBHXdm2hv|~T$1Zi|aKnG0T(v9qEAmFJ+Ts#B9mb90;rg@2!Dc1j zWn=|YxIdPALY(X&njtr%W}OM(8>{@9S0kQ{*OXzT`?Z{*aV_TZCd=^*IJn;}k93-e zt)P>X+LuPzZ?k<(8~|Kz0oNPA4Hj^N0leJ;-fjTzumEwWkUrf{#jB!vjVBHj)hj?8 zw>Tk153UFx^t1q2Qw-sXFhZY4C=Hyk_EBswmFqI>t{6-n4tIom<67lceX)@&wAB8? zTf=jP`sbRC5(~&0Imv>bvVsUbyyO6%+V7+{@cy;gb;f&+-&jB)#XsQ`A@duN;Y@*I zAJgC?o0jTtRR(p*VN_6fnzDu(e+QvEC=QM7UUG;G;-L=cApDMEso!(_v;-!XKgbg5 zu4AnFGfV+(hCedipW-}nH3n#c6kflL@gnN@$gZjStikID=J=f8^_<0v4vp(4CjF9t8o<*x=W#;QMW@cJ9$y%6V-t1&OQHj3;B@Bm1}NKMbBn z6VHDNp8Or$-BE|eR`(^xBt-ldk$BM{t67a1WErdel0i1(Azq7TGs@K%pb3(3$~|zS z!4n;eRv%}aF_eKFU8m|GSJv3&SI$e`DH4@TJg>;TY_rvI<329;k?hTTD%MaS?aD*U z5p|bPT`KMHP+GEHYxXyeiihAcd8;PR8ZJu=Mg$r(JWIpm z{&}U?kU>dIR{R^KnPRAHs0)~wKTsW;BdmRp6n$G8YaXO)uGT=HgA8pFlW$h}BP>T(c~zRqd%De3 z-YKi$-Z)yuIn13PhAURgg#y`pgFPF)|AzvK5NMIf5c?`{lg}vlV&sojr=WO{fntGZ zuMIdG+N9Ta&FvoZ+wJ5!XCt9u2d67%!;~b()Fj4~B!N#)1d3>-Z>_W^K=tSLuT|CLthGzVh()@|@=xxlyl{~mb(RVNm zU)aNp$sUP=`u!Fl4l4RvK-mC#EkGR9-?sp9P;=h``V3&Y1&D(x`4%w40A^aiOaqu@ z0kaIC-vas#V73L!Hh>*0U@@CgeL2b%R(VPJ(spR{4((DBAQ zKYxsM<-zJlpW>h|1~~mwRo6RYkGzgA1?#RL^(=)xlrhaJ&hQf}&V16w-#n*x^qAN) z?OIAi=afW^Q?*hN+d(8PZ*%y)0DF;-i+Z8z>|TQ*@+ZOZN3v=77eFYNbO7p*!E9PD{c8-}>Ze{%8?T)|T!k1op$q7Fwb=eQQq)s>5iEI60L-C)p z1wt$pv1BwX(~<#Z7XdA=?3~3M0?}Aud1YD*oU(!3e0v-OQB`hG2!ai0|B`vjyc$+Q zZ*VF$n&OIfMyV@I=%BZrFj^Blb|_cOSLYybd1ofbXO9i%^Q2bN_|aUz^P>MpYmd*$ zd3W3*cWH~&PGMca55AqV{&A=x9heUa0G=xte9tExFU$Waz13wz(x)((A z@EPl>Gi{{Guo%B4x)-Q?LU?5umHOTZ}-c2<$Eh(4(Lg{j&vu`HH}Z z7I>FMAm!JRx}|S$*1y-z`r;r?r`ofMGEb9fR_7a;6y*ir~as(hEix+e^}k`pc`rlQZBXrldB5=KsCfXGiYK!=f%STdg}fH&GDx$ zFu3*mOw{{dKI;7@>H{wy^#K$0(=Q)YqF}-0y?MS&1w|OMa&_}&4Kjfuig_&2uO|!96Fqq~S)q<~P`-UuW1zJ+Xg+LO^u5-U$4>$@z1(DB~!HUo*7*f(;P| z08pDTFE1JZ6ll!Liv|EK8T0a@0YLr5yu4@t(48u6%Y}Rb}T|K^K zpix0lJjEf`rJ#G_^@0=M-+I87lQZAn5pgSze|k7fl-GPAt_$rEM!QIbzRa>hbKyt5 z+KJ5dC7SuJ?!?LG(S!ga-H_A|57*k793Q$z?=)n4E-b);}J963!SJPfxOqv^%R$qY1jlzyWoJJ6H)0KaS1;I{oVxNt5?FgCOoc|o5wcXQ2|O61V(#SZoEbS;@4ldq{KWPV zahzw`Q0&J*T6T9VOpo<3<&JtcSaKGG6UCNDJU?17Dy0QzX*U*`j-X+G* zMYZD?C;U|*ZEL7(Yz>u1+7&f0`rtxn3ySf36gavrHV}Z#n(y$fZH|xQk*_F{v=#l_ zobrmc=$wKW9xn12Y$@Dh4tid@@pO5-Hp&AHd=|1pciKV)8h)R*Pj!9)>g@817J>^! zug|7?eI7@qqHGyNH^aYSTGl*T-3!NES8R_Ydk=rp>gql! z7UkYC+Ltn!{qWOf0IWrH3vZHC&VVKadMz)ndm(gQ(UeA6l~?=WB%#!Lkm$TsUx2nN zc39c!i*)3;HOqyVgepVarbYX+{jvW5Szkf~bSPxK2~D{6~=mAB=z=Zfu}9noU$u8uEuL}LI_!$KO-#P5he9MjAiBYdnS zhIdUVPC?AwS&OMbaf-&98ZAMVm3>V!>=8n0UnsUmf2YkUfl0gw3L1PiULh*?qBF#5 z=@(nE)od-c77LqJFJ8bcA?O}{KwEt?Ki#1*bffKfNap;zv>l^@X*mdh_W3$&viua{O{5qgrQodxAZ!E!xQ?-6Y3u0 z#duwn#c>IaIWnWKPY!XJgIY(M<80__?Bxaa@`I(9GbDU~<8ul_*PREuQwtABYxW?dEAR6DLv*S| zJk6u%QhXz;-w$p|-hE%Y3uoeSZ@)iQ!ohM#>(}OBc`i8|Yrltoqf{r*dPo(9_8(o^ z1Q~R+h~d3#5l}yq*MVZOnRsQfEVICP8gQ!+8^`uDPQv$}tWTn7XxA?_8z9#bdF%vn zv&%&IZ^wTtbx~#wxBC54hjW#wETwl~+JL_1S{hIzlUJ_29yBnmLDNFo#jd%HNXj|# zfl0X=sc&HSy}axCFXB~gL2DIsn*>pQ&hdlryX?a2$-scw!mI@ioNn1ZiP;x(ui42! z)gtp^ESuElsKbXj1gY#S=lVF_g9O6PlAqw2bg7l*7Y^Y**)XMp&eo&HCCLce#b77= z3-jzX-mN>fVVZ|rt3XX^Xu2BsSYNM-$j|;z4;vyEIZ;LYb)mU{}{I@cZd6T1K28ryhz0BggT(DE<}eV$A< z>t1vam6w06+wTMD{-vh=nQYtZKb5#UlYJiIG}CH4UD%+N3ea(;TJ_;vR2I<6SP(7q zbkX3UPPjiO;w)C>c1@NGhdI9$bMm?(m-RXD_YSw&;BI7_%U3%%LkCWcm~!RJ}mJ@W4R8E7##RPEJ9_fW4WZ` z{0hsrEdUi!G?ian$Mn8B@BqF~8GNx7E(}g>OvN#>i)dlHVISLw8INJ5m6G>xqUEe) z&e4ZFcXp!V=%3+4$Mf55*3>pfRi2m#)8WTA@j(Lz>8~66|it>h!p5b z4I%C?RJx1k67gz2lG=1~ww%88kOnhBwlQK{H?&4{mH3GjiJGZ-aYew#{sjc@+ zrc}ygx%zPK{H@NNPwVVQ@%F&*2I%~F(Ft5F$Hcw%^H|N24Q6*0!@98HBst~;cX2X> zsQwDF)hmU&U`PZux-#$+P5(!3zC2B~i)BjY3RBWcrsPyf#*he1cf}Svbac8{SJR(n zi#=V6J%h!rlJpFTZcU|MK2iEJZThn${n<=^j-+Quv^kaj5~hDuOJlXqwdr3W>Ca>O zS4w(@M7O2VKg#syH>H1-O}|>wuVMQ0B|Sr;52n)Zddvj)UtrU}TGC(0^pT`z2(4~x zJN-pA{l$`gEz?&eJwu|~Q|VthQTlZ@{UwtA(uDr&n(2T2MCo5+)4x{Izb>KwYhwCi zb>D&9;n%7s;jp4*sz{xaK;lehokq!oMWA52-OXg4f)aKT;08)MS&Y_lN6`!^*udq09MkGO2QM@C_nH$H?atjn1dL-Bz9eDUE#s3 z^oP~ng)erl{cY5_FFr`8aA;0%cJrKR9o}}-`=p}B)71E(O7ikFD#Qu2va`^kE2!+S z;ce>Z-Eh4+rfj%D9lo;nd@)MN5))#}HVAQ2>Z0@^tm#Ko8IN_PHc`O3u6+oDC3?FI zj<&hZ+OJw~L3a?zhSrE`3{mYdZ)N!WP^d*6J%4( zHxyUkFjnBBasNEU;_rqh$Yx2mJGNW?JGk9AF+$&&5TT?$y(aEO%ZS>?655^`CY3&T-<=LiwW+JjQ%_E_X-6n$o}7)E>YojjIGUBX)3mRfxjnAKeUsPWgvshq z^t2X3f#8Y#K|@uN-Z%la*QKzHb9sm6lF(oqH90ob98wpENizBLyh6+1t?7nn%Sk2L z^GOx*{scA9X)wRxJu>2NN?NNYFg0n*3%Rwb`2@#YBaX)<)K2uKC&%%G{{fCMku7T7 z23MeXT?)nb#&u~x_e;*&A7Uz^&6I*`N6t2;oq^|_wLiBB#!p(Ba!%QuB=uT{%<e;Y3sP^>6hN!$9u$@MZha9LNZ+gP!%vN#m;vx>1P;wGV9N?XTYFFPpES%z z&t9>I`SX2=R_1@ROv7&d7JL)LT7ADph%8T=R@dK8qL29>z^8hvm&yY=%f;$ulgDl2 z^0+OP#|Jf!EzIL~&BK+mOq>iCt9LMuRAM1!n;$f;9YL~o)IX&8eVF-u#NxEuID1mb z#A;^o(G4wW@~@*;a9OmCw8^AwrrXiW8*`!8$Z2`cw}W;1sM1BI$oj_=-H#L9JBe-_ z7ZQkK^%Ev8r=t2NHSS%Edv_d{_J*f2?xzgB@6l-YCRxVuupuv2?=$i4*LV-a+1buE zANme#Au4Ia9%^rhvIb*XAVsLQZ=M~?mid+z6(TsiT)9!Fua>)V*)F_E-F5qdxuf#O z@Je-4bypuZbwy2GUN|-Gx|B|R41SN(FCRmDA0vK(vq}uqM**YFM3HMF-)8F+`GQF# zk4xUnX6wiXl33oy^!X-MI*Sf3x{aBnihKX~;})&AjCy$q#XHPVqU!;%gG0*YTH?cOxM2E9!gQwHbWW zI~#sMSr4jMFXXEr*`_Bfht^i61vvtOgYmw$4oq2 zaPnn_%PAZ#4>Q8Wnbep8hF_O9azn^<{ctwrl#3X53N1psjc-9B&NtF=9uZnI4raN6 zJZTq4guJ>iaOwD0CY|I#%FFce;pxMz>Ikng;rbw^eIl`$HpdBV{=s^F%hPa6o^N{% za|#6*n#|qyYjwnwmA{o zY`&ED>&glf&=$Czd|8#&8X(m-x!4KAcxA@mV<9qSblFJFa|Uz%kjxj~6B?8Uu1wKL z?6U~z4WYhon)nCX6ZwZtk%czA!#*uV8??ALG;4}8R+3)&BU$0q=6;{r&6f9@F$_%HJGTCAJT+C+Svme;=vshB^3qfPNJjrLe$qcxNp4vLX?FqaRBE5b<$C z#7!L&lia%)C*;$kC+xZfL3E~X9G!I>MO#T_Xi7avTxgT{DX*E%Tdw_IptGG1*J%vB zlJv^)-Tnli@Ke$hIv4+?6cgI!#?#i)GD$!ZXQQ9t*VgE+1=y}+;zsVa#J+}gny{r8 zHnemTHeFeRPBA+kpC&}QJd2!z~yvzGXJMG0h z81H>Gk6vEckj638`xE=PJX=0!;_3}Cv%JW;-a)B%+rvMiw@r|#$qxDi(3;ioZoS>8 zok#nQ%8hsrO=`{ezsFZQz6)*bj6LsdtJ;5ixoXQ=v;h5iM)Mrm8?Qw#q}HPD zrd0?mSIfBB(MwN)_sZ<(ZTDhxQPX1cPtGd&OZbAe7}vm2>c717^ou#JQYT0QTzQE; zH9NfsV5LvdYF?$rWR-f!OtoITIAyZiw>X8EskD73={sIabKhynn!e+}G3LA3xbH9| z?mJ#K={pB(v+u})XPPRT{dfD%3)>tve)i@2&!lz7G|^P|z}7t{b!cmm zk06o2A=~zJ8l5?%oKKWdf#mM=C@YuHsm_`?VF#;fw}OX^o^JP-s^*|P*t`UJg3V(i`qB( zUvUcPFX)D~ZNZ_EXz?V8W}BF;qhF5`2c?_ZgEEq02bXcfFYryoe%%4Lj(&Q4H0*;> z!u4?ppP!_JZ;em-5lMRc%O?HN_@oh&hF>Id(?%a0w^MIhaJ1z8ib?YB8~y%7)S4!V zJ~U~fA5WC%7nq0L(L*Oq^vFbsJ|T&AowPB3GEt(-B+-&d6aDu@iIz&D4^NutYZE1! zDv3TaX`-)Al!zDU-O;N+hC|Q>njkdPu?3%nU)3Owev5{h z|BK40CM@1pHIOmb9*Gq)oYQI|rZe9nV|P*>tdX}M57uvau-U?c?U3+b{b?S|Hr@Yk z_G~-adhaCl-Z`l^LmKyNm!&!Fb%!;}l`yxYga>m{{HE^nc1mQVGCzEs^TP*P5<#ik zlzRlVLNz<18Cf3qsBOaIo1e057_DkVGvnV&(WgI5kNfFGp;iR)| zLZgP+wsD70XL?ifSYEJrJNw?Q|L(l;|6Sj^ZQPg}uzjy0eQz-7dkh&TFW9CuS=wG{ z!*|g6_p6>Y6I2+HA3~Q7< z{ik!JWR5v+~^Sd#Qor@e1s#=E~kb6-RCDEDd-PkAKQ} za8Q}S4k+^j>IEUqeEct1$W58qI2CBPST`o=?S^k|J(sNsCtvKwZf;xPG$elN-%E_` zUMlfp+e*CPJq>Z6*jC)iMH;a^U%IKw%a?EJ%8ov66Qp-bMe5!bvo_g6r}huInAADf zDOHc<<49e(Izh!8cV{?nzK0FshL1wMR|P87BdAUrE6^;= z#+?YFg$k9utRDi+3bno(4&2p_VI39UMfiEOe%I|t;~bXnNBiRU^(I%7zqvb;%`C?^jOYC!=uCV@OhGzS zN`s#Ge%utA`8O>GPT>Oe0E?UbMmIzKWUoJuxS=2er)e6^(Et)>VLPb_J6syTJo}Ob+)0&6ep&I zVP_8DHYnA0tlShQI&ga%Z~t+P$2Q>AvjHv78thA#m$YT7xK@){U>ft~+j9TLwoJ${ zaI_cq7thT`=Ris{V0E9)$=Lh~{^KH9SG*DAe^Do|SVI>Uj;%%F#Pv zb%f4QQ++VS^A-SaM$x=AuaEO<|9MLw{SV!wOl2?}K}n?J!K_0#-}sh_Z+GK6gud>9 zY7ymJCOj_p>=m|gCcGcSXbsB4Z9(sFXE1Z5x4Tf;!Evi=fM}soc9cwoO1l%@$0e!y z0nw=<-42cUm!l2;GJ2Mso{h-O7X$}J&y3+ld?u(4P^#7hC(;AqZu~uD^o+*r;-!>z zpq-0B>P@Z`om;Pd9Q0{jC{CVYRcGY|HpC62FAgEDh<;ikqOQ#nd#xdirBbseN zd(O*8Q`k`3+ZW3d_r=8xeesH~bYg_`er63q)?JNh*BFs>9gg8tW%rvwdzJ-ym z&PF)7_lMfF>SE4byA6B%kS78Ls1Ezl@M7=HbcXC^F_y%&_SqjeJ!x>+O)Yj zs8>83=-t`RVPNLvdS_lVvBCFrhYwN#1&2Y@As@;Xy-hP*L1Ac{{p-Z*9 z({NT|AGjmEUkWX*b}hlz2J809*nq){GRo=)65??6Y&KAxR0<|1V8E0KPKpT3c)9n?uV$Lc)C2=q2& z&$zQz4IXO!kQsXA;ROx}^6{KJ6ko}?IYE*vhbQXP?H%YkN##1ce29}}Ki^QvzI}h* zMEXGzb_KA0Sxot#HBY2x`Ij!67Udjnq9vz5&}7&j@sZiuDC7d4wy#^aigQG4gv7U?xf*@C1 zg*ZC)7xY1=0p%C7;W3owZBKQk@B7O!CQ=9y8``;;1>$aW7|Y*hk~~bDLkruB+XfT^ zethDV^h2Cb`3=L;q9nF(+iky$K2Fm)dKd6I^x-|^-fhx9oOG_P^nz@-FO~u|EMM?@ zhj&J!NDH+(sDjt&YWuW72P~V*hsPp)<(qB_)22KH(+1?+G;+%KK^;4@XR~g#AJG7G zK#RXHvTm1Jjbh;<8kN^&*Qiwwb~>WsJy-xnZg?$ln+pL>6XEB`2!J?RzJwfc#ClV>=Gp#wFcA5e!sDnr^e)}{Rf$=KLzsZkifvG(| zxHun5-d4dhpUyg;;;u>>E5vD6Ij{z0) zX_03WkqX6v5^1F+OQC^Cg%ptrF_F@Wb*zn*nX-U6%gQTGNCcd5#3V3{PBAZ(U3{_( z-Er`d%a!6Zbv1Z)u{CVOwY34)))cO-G2Q=naD^hSH)N%?eH~ zAitT(@}A6Oh01JCMr4OK)RqN{Df7(SNdjMykdWGT$*8?1+_8PhbuQ6&=OlO% z;dATwMKf2s8u3c|?+=zNS9=SK3`!UxVEZ!Q2lLl;BVFxej*dd&UqOFs;$KOBTjD>3 z{&uK|LpoU)>hDC)3qJ;DIf-&A&rBYmy`EW}Zn5?L@K2fX;dNO=?Go8me=1qbF(RKx z`?QzyIf!C=_n6z&QS2DBOHi@B&bPOMVj&xz4vK@;oqn-U?2viAn8$3EFXojLi+zka zLy26jyG}=V8l&aP(dqau=z{js|I^Ij(T&XE;+Q$4;l07#ic{R;l$b#*3WL~%0*b}- zI$NA7EMjr$B;4KM4c)Xe)w6H zQiPpsZ2V`;ryWPnW89Rwx!n zp#}%h-}!iRw=O_!W_f|qrC<3xq6g7=Jb_MwKZL_#vWV^7c{khXmz0AC9~AM0oQ1z6 z&z7tQ+;Yn_GBjKaWCkgxbqHcBpyBIyviwS(YcY1^WF#ZOP3ldnN0#dRWBt9SNNk$+ z6i6{wir&WdQg4^+<5TliUgs?vJD4NclgBBqs7p!Ey7NLPk%D9w;@68^^GG}HU1qutc@Nt>=M*E>QB zd~Canww>4AS~;Mh89Z$UqyJF!bQ?7@)eyC}ayd5ut{JU-df7$4T#YOj9gltuT)ZG$ zL+`=jRbFMa)dxs#!Vbu4$0;irl8Q(t!J?dEO|sD+^M)G%qiQ)2xx&ZZH7>1@`|~c@ zLiXo$xfShZLuIq~V@62>2$^()7Y7JSge|Q@%Wcb;c4}!reTN$s&`HSD8pz-t8VY1s zmz~Kw>-p@gj9fWV`>G~ISKU|AS}%GkqqeEvbW`=T2f1Vl$?FWFA+~>_Ep7kwJl{!m z#0%IFIafB+-^fUp8{6}ZdNSN%`O*93myd)*uSOp6di^+UG^f@lb$9DQ4*1UtW0_($ zL-Eui_HXTknB-C=nUt7mK8!+^r#j&rc}oQq;>YOf2s@LC)8QRke`^eaj|U2T2kUCo zHCM@of6W^f2VwdwP#CFxgWAC1U3%?u=wL61JowKP+ykFm#1_Kf!eA(ujhYE$nqf0pzW;?UtYv}N};bjf* z`4c{y#p0f}{QU2xYMc{1NkMEZ?K^gS^I<=!TY~<5N!_%vVD7+32esEpkG)KOYx29E zxYcbn%^dQ2vG|fl} zT1=Y~k0(h^(&pFzRd|r99&hAqL?V&t@zy;=*qaC=ohrkGeTJ|r2qUQ~eT03Muqz28 zwJe=d{bliaSPD|j7HF4gyrTZ)w8aPMO0(SXSD2p%cErT-SstHgKbQ-o50JAPNPsXD z`7UoMd@~m{-nHc8JGo)-6k9MC1(JBcoKe0-PK6rJe0aUQ;fO|G`H63rU&S;ykhogU zduZQ-i2cSQ_OQfr!{1uKe!i-yu#lM}ZDns2j(auOBs--yyJ|4+dKX6D)DkrlJ9ZC@ z&!yUO(}%s>%n`5LUUB$LxxKy)_5;Tp=X0wxBLt7&$04^Pq`&Q{u_-gE$7Zzo(I>;7 zxq3jEj@Fqeg-0UJ;d=T0TGsm8L`0X>w@St1kOK`pt}!i>@l1VhF$8F_fcvr<^I8+r zu>rT5n63qU)x_LnXnb8GjmIoWKWGxZWC1_OPDEn~HpxyRjdO^4has`#fim9KSjInX zmLD=@{L2D<&N4RJGI~uJ65OZm7qvXe;%Zyo$Cyu_@qFAAZZeNPM+*xeFIeSS@mmi6 zjW$0>&M~hiZf^Yse!TkI`Ki8xW%chivhacz8g;KeviyEV!oGC`sJ9? zZ?YRR_5+zq!}rSU;OB4Rgy4nmqc?DBETNb!LU)Ijf1{hpu{$-EB>NCbEWGd*LW_Qw z!T9bU?4KQe1!J}}znJK)B5<0u&gySkz4)~l_;y`-1$eQ8!qN`HE#xcqaAVV15u+FbE+*10hTNo2KzuC~0v^XR z)|KIYI296vQ+TSm8ji20z_~C_@NsZ_BL&X$fmeTUA2=RKfeT?P!8^n8%@nvbEE3!f z$G2i|GZhTYj{?n?%9*JWdLb#1>InsHdCZ~F2TA3e8${n?XN|8&fD45BYPf}=hvu9b zd!_W6HccAcj-UP|^L7F^6kCpNHQAWl1MN=(I8BoYCT=`m(UvA_&zlB2AOEMB#px)s zVDYS9?w4@EdMziVZ^N-nCr*051Md;hW7Z3uw91ju zf3Bt)?8&J^n*l_Xx%uB|o5d5hjbzi<7RTWKV52;<(6j~3=F{FuFWX`TNc7Y)UG(TY zBHCn~M@H8r&i$?Puq5u`iSy9Jd5Ah2X+7J%iwr9NkT%gVa{%aMH~|DS~Su{v@KN_T<3-#5sqq&Sbg4A6M!AQ$)o}I zKRq8Lt$Aj9e2lYc_59IfHq3_~wG%LQ$}=>h=wsR_?FNw``Z(Jm={4l}_zLc!sDrcy z*Z^&fkQxx=?pZ_A8f|7eBTH8~+Svkbwq;FgWtp=D^IFS=t(7ItmY>4aTG`v#@>OvR zJ6nFHv37R0+^@0voGni(Y^t;6DTP^v7m7+BaZ1#2F7zKTf98fe*%`Z?@Dr@fC;0=h zzt|O*M-kZuw0(3K=lUVX8E_Kf4t2RsG)LGr97XZcqF-6y2)$cNZI$V603`~BgW2&l zJjmrYLyMv<7l61=N>)L5w=~1RDNgxXUVooc68Pp)^eHY7H>93lz6XGfq@s|r_w@2u z%SKipF(ze~Ww#g0@}1N++Kjs4Yu{*fuXzEqj;+(Cv|HDVK0nEuNMt3Tx~8ne{f4*5 zT0p@tQ}-Ii=e|a!}#XK{vm_Kg2 z7zsA%wo%Ljjm7-QW@<}$)&lmQuoMY4$znFna>_Q3+xWEJvb2I%^lE)=FZ{IOJE@^G zFn5Xr=G%lk$dKWrbMV}1zEgWBYYlx_j~EAg#0fv63>jhDF!0CiOGxD$JvZlD!iP_; z_xh!lv`&ms*qK-fwoaF##p0F2wmTw&_8>h3%!l|>`Tp4*+yx>bM25z+YBnqEcF+1HHvWYM^Wnx#^k3VwB>76e`XJi;2-%NugFS0D z-yqaYwm)5j3Qo9=Vq-+Ol;6A)ULXhW^Cc?w-tw*fllyNRU36s~Xbe3i2e6&l61GVH z$`~7V7(JyBW3g~(YY^@u`}m-LXxNkkcD~c=KPUXM@Bo9YMz~S*Yy^FOngXsR;EnqG zP;`Hvl-r(1PwjM&_$%ZIzbY4*QCKc1JNki&R5Jfb9)}qUf6Xjp4>xwE=gbOoVLWgD zdD~r9f=#+Jn#Ck07ZmgL#$x^w7b6@$ThkV^X~JS8*rc1Fn8!^q-)Jo6d7G&% ziY2FT+5EIe+SQ5QI38WtXvSgaPg`>zcHsm zndlzoUCPm1%f!>$WHX{F!^^}M3+RSH!)eU9QHR=#zQr~A+olmDhTV@HDdU#2M!_#( zgYfOt4j>p<(=d_PjO;A&9X7!&jncu1W{jEb$-V^gv&>PcGHKzqFtn?$+;aFRIprQ| zW|9&s6X1|P%M9_Ba8$$_f!Xmi*OeQ!#wlcrZ_Hz<8Y?%>PKk$W&D)FLDpr14J~VENkiRDt2LZ7mU{>6 z>-}vj3O;s%Q!~4F@Vg|ln|cc&1_}l6_-%!Dc6G?6?P*AREjK$5gO)UcX~Q}AwldCo zV$vPr;Glx-Ny~udT8dt;udoV2=In~r1CN$HCedC*bDmC(s1F|K)R;}d(QnBKD}1!E zz#{}S_KV1Cf*Plb8qg$~9!Gzt?sl{UD_APomTSjW)5e&$qbVzAORMlPIDxf0IVnzZ z$eRLm&Zo@{jMrjgas6#8=VOK2gU?%LcpH4zIM8H{xu=4q=*PVMq9730P=~bPTYOK; zo7F-Hhyi;~X$@vSjDEM5FCTe9aKx9c*y;#sfz(S-^-HEYd~uRBX&{caD`gLDaT#vk z3c;%2gOmF&eRsqanZ+?q9A}n|BP&-3scQvTAek9oXC?@*XDub`pYRz#-z?{rJy4>9R1>!MXmqC0bhdaWzFJfhrpYL{Q>fnu63vF0o*dMi&T`qNfY z{#=^(t6X)MG}|8&!BIL*9L;It4caYS?H0!{#HsPKX?6WrMrazl5>{}!HEK!XfPf8M z=O<2$;92v~zYk)sHvW|oTeDD*P;5#|_=N3C><`CDTQ)^fvTl_|HQBAu!sRUa;wJnQ zA34vDD~8dPE?+B&I4c#t0#0?U)N!4Tt`W7whPs;fboti!@q+hpG8PAqacU<>>Jypb z!+ifR`jH$7K(_tkthHXtCF%gDG^bE!ItR)iC-b`=x^)Q0YKICxaf{4)41mVudVa@x z9>(^|=`rbO-BzTDkYHlXuY{147o7DcvFLkHG`jars8M%#JMYhJ-EVF##K5kI_V61> zSJucx(t3^c;jp5AOtBJdpb_*K%Glc72oA!>xe)66lp8a1Z_n&Zt|OBPGGBfqGmURm z?xiu^@Cn8wy|S4u#5h6dwIZh1DMGJPo9IOxe{2btq8HPF->;u8sH`LvvJQ_FD^JJ+ zbu|WHOR)a*MtU(Faw5GbN#xKUK(%Eowp$wHO9m`G!BC6ODo;$Ud^jVa`e~NxrSJ|R z_q47YX|^Ipw3thgG65S>n)l{{%+_DV^jq0XKNlLECkp+}5c-w(>cC(;n|XED&%p=B zC6Go!(y&hn(n}}Yg|fa*S2i~FbA{4p;x~fOyfC<*QzK}Nf$b%$nmG4{b7i=Iim+=S zdDU@M^zPSD#eyn53Y^W$pb1#hJ2iC+Vp4{>G33r-_FE~>jGkm$kh)LV2LEZ&&a9tP z^y{w>I;~>sVOl}mDo?bqW;F(MLEDDkv7Se4J2M?}!s(*iAZT;6l}n}}!lC?Ta%D)e@KRe> zIG_nAm(G7%wBrk+hIZwcc7-(U3Wj#n_B6CBOia6i(hh3I<7l^EL8xU&Ls)eO-iF$G z@?3=u4mO19(#9uCRgheHGhcTlfnOl<5==9k(9}N0kDVhPhP@|DP{r12WD|M7RB?JZ%_S|{J1rYeUw624Gjc5FGgpm zze*NF?)L`l{p=bOl;+WFPY*RyA?wm)l7oa+@1T(B$3i;O-!rRXe}j z8l+of-cWYyzh;+%1f1XKH;wk`*oRjNy(ILvl$u6RRudcXD=7%*3-999>_w&O(`56U z`tO)SUw9`^@yus0P3}f#G6ngQ(>XS1!wOBX_P9N;r+u{?(Mc)iF#pOfDB)a=Vh_8* z`GvL5@-?bRcD{4UE2i>9kO*u>wDTz07~R@ITUED<5t)p-h~o z#RXiQ_sCk#SS#EW)q6>y8w{btzo5AKU-jtad49sb5%NMd;cL&voOz1Sn-Q?1`Pa&& zRP37Ba&(DAEY54@@;j3=o`H4{}Nwe`X>X|{|mokJ&>$8 z>elGx5b7g7qW_K2&x6RP{vyEG%KdAfXUWzKp5d&Q3~FQY`w|z!(4qbv_{36}@eL=@ zLI)XS2acho!cquYV6|O<9Pqj8NrO%giztq3D^FZZ^lJzmBh%{H-$;A^0n2&UF>wduZ2Ld8c<1Z9deomHRz$xbHIfDEDWlDPj z=kRHA3X#82DPt{^^ipn^LDd)j1}g1ar}{l3tp@4?`nV>UyLDMtp6jUQl1I|PPW|$j zlv_Hwo%JkTwOf=hVXJ`K@LSA>?f7gx?mx_@6n5ZuKs{ykWMm!ZN&B1eKL>5_G5njS zmos)9=RM1>;(wW0$E}Vp-#$Gx?x+1@BNeB{ek?tDWR}zaqUqsDpD)!(7N=0j^}kr1 z;*0Tz+Eje&>{4(S>DH$0WE0`g3(Hwc5O%T7dEc$G*Hw<2(&E$@LEuB3Q(Bs0cK8~u z(RXsx=Z4*ckygGTUyqHX>)$!3(`o5CVbd|za~(QP&X6uFk)#FFfivMRC@RvBUi`GG zI|!$d%p;xF+lSvOpJ#xkS9Lmx4{0Ks3lpP6aV1LPWBP$Zj87h-m_f**bnLk=8=ZBc z%P!S(mZ~CX2Swc$94(f$fhMnMs;bplEMd6XkI%;0S|yp~2KuTy(0i$! z^v=ROTECLBW(fUmzy4-UoR2uw9ZCGF1a6k0x9UWDjV$eB{=30JRCi*mtC<8OV+4K~ zgX|VrW}l?)&KWB6d56e+26KMxoGkB%`O)h-cq|Hy(Ho6C&lP=Ji7y%P&chti z)suJ6eZO`tk}jtjy;xzh<;`VzN1HTGjkra-2oBRh?_H7SDmho(L_tjS7hVAHtFJ-n zty_x_7d(p%HtpLWocV6TeBW}AG+`O@_+If5u5(M(XcOlP;@6}!j2qd|D88VcL zNqwLIo;j2D;R@ZY`pSJ56K7AjqQ8a~^aejWa19OJV# zUU{sm&WiHf$qC=dM&f$-cGT%C>I+@RUJ>0)>>bgJ4sW6)5!#aw9p)Urdaa1vHz68v z&tuIvgy#HGakIHDf9oM8YF9QW%?~AhaNU3N&Kr&&7n-FFR&Z@5zRbAb^_)vXBHjdOKx zS!v!}FF2vHgPV`812!YQTEV<@o9KOlZZ^NXY>ZlhQV(XkmzM_4=wEUzvE9i0tG6KD zMkbW8eyr@ipz~D&@8Ws#yJSD!EUw)x0RAo+6u_qhz~3d)1#pi5_`9SafO`eN-z9&S zOz#%}f0z7501pU&ze|2BfKLm6ze~O*fCmM@-zE17;2{CrbFNlx7BP-n67sbclk!5b}OXB12$i8mv%i`nj z$go@cium|DGTW_vQhfX!>2z!NiI2bGFDWH032m|6&YXjG<#y^4?0j&9AoLA?C5Hw| z;n+jEhQBr*(lq>y@sOV3Z;gkv44*b0(lPv<@sNh$?~RA_3;$p|q+R%o@sMueAB~4J zi#?A^{jGm%{e%y{4)`Bv`R zho-oL*Z@>~t5D}+N{hYfnqwjiV`GSMGaLNqAiQ$H1nPvbo8dYx=09$1Vb3w;xH#U@ zObW;WOMxZ}{|ppOlHU#7nR?k+6kKvxGXBEGc3deSd?kbaN=P3cCibw>4RNIt_x_F- z4s&^Q>(`r=h+o>m_G8cAJ$+yC0$v1h>o@4`U1)bvUgO;mCpz18hC5t^Xh+P3U|c2W3>4nxPn2*@|KaZFko5Gu8vO&K6;r znFN`PkZWy&ln{c%cLB5&3_iaU&WfD-?Qx!1BKGjDa5e!4;hugh=PqQfdrzi~Ya_YR zJMN6-w2bM7dnrFlnjC`|uMnENM`$uQ6a4Y}grivhUQ)L}#jm}|Roo0OuT3w&!B56n zPj9$@TpWN)10j)|0nM{J8d8YjYoX9$p%4qfLF6rh_D!riP7eRZP0crCgT{b1XZwFMQb4P+gid&Qc(AuGT<$2ytpmJ2+LpvfM_`$$m7c z?>;PPHktz@7L*N51Z5mx?aT1K2}48Zvry(og#i4~Hpi>+&x2v=YOoy~qruB}u6qhxis|(jPw1+#mQH%qyioY+-+JYIkt<@CQ#1YU^lGrah=t z`OQ9oSw9o-eh7Df`S4N@uM{0*$Lzso%q~r4wJkbkKO{)rZpJKFoXXY-~fMvtI@r11RzNcq6fyj@&zm9fW5m7`6h7H7j@>+(LZTLU1)`L2Yjw zT9isHO@@u4<)_i|4O+aMV9@d>M#~qpDtjmu2M4tm8k)8{3C04k$SR%f()Z!GU@U!y z$K4|Vhs%t7#*7&XE$=sSnADhIR5v_A1p{^ueJ2?bh+FyXj?M~{)1WWPsqU|vITm@W zmOdr$KS04MssQ(EFQwQYY|{>Ya2?&L2thQ&cav9RhbC-PbK3de@}Wv)u{hF?g_}p& zzU=UPi1H?s%W%jxUmW)Q@<<`G74z27zDR3zPgTq~T{2ZjI<6~g9GedF)iE5@oRP}I zCzlFOaG!va2Prfc3QBtr*<%TSAc_GM5R86at)(DwFqe;@3tFl8-ExhkzMPTE61QB~ zI^U)93L5LdQa8O+AnwNzcYlDm^CI%Q-le#oXOYqbB_@#dn=%ZR2U&?o zW9F+jxfAZldD{7Logt{{b!sG~%GX-4%t+4IQ5r7AhY?y@jS|4H$1IzY&>Mf#zPHbsNLjTtgIeI@DPt%cm6uWY&LGY&MH_B#zsF8&g1 zPgjXxjo$=Y`V?E^seO>T^~2R~Qxx!7*3j<2W~n3x1aRwT$bb~^Ay8ppx*zaWV!m>Y zdS^3dU~aik>iq@jBMXIvaB5$Iul_aZ6kis?(_Mo$gmq@!1}F~A6F5%JztVJa&YmPE z=j;M0t%EO^p7gL3@z8iGaYi`$vHdIP=^*@uIEsGWl#03 zCo*%E_6ckksnJ3*7G~o^K07`m#9u#>Zrf7$!A|gj31N0c|Xbc)?c5OWhyVX_` zASYqEOAw3%YKKIc6wG<7=TLDITkIq*Ve2gT_mk$rOW8v9TaH#W->cubPv;ug3|v%co8Bk^vK|9SI~X{ zUfi$0R$6x<)eAMusSy-{b@khV5Ivxfb7~iGfW4A#8bI;4_JgW@K`tU+nTrfxd9hR% zJQ$A~nF;hBq_4bMhG)yTO%ON3OOwqoYlO}4>!ev%v+1!JhIpm�nfYJ2eJiGt5tl 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%0AXr=)ci#*9ca~hfp~K#d9?RbzAxc~Y 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¥qrV@&_CT2A5Qw^;ZW*i&T4 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%0DGhDHRMYNpq#nU2Pq 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
x?bEar%ZOGgs)|EFikJ{mDM3U-%vYY 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ɝ$ea}NODW{P>0!_Q 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
*8%JyX7VA(k=hw(Cmeya=}Ppeci3;XGn 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
  • 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

      A;(d!H87@lUuD2xcO%>6+yAsVm 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

      4jO1I1d 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⋚`~kf}gC0c4oQIV8SfH7|v}O6g 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

      9QOd&<;Nao|q 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%0D%|mlUp6skY(e;7-jPK)_u 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%0D!Y9ag#!77}V@KP%n4nIWMGZ0=ym z#`s2s4uajROnrai;LsuL${{k`{@~%EiR?9E8(3~^PUtY!nkd=3iDN@kSbdU=B{b)P z&{Vcsu}-ZzbOigWViluig=Vmi6iZL34b5h!6?-^%erOKcmqIM!*W|TuM<0fN+?-uu zettxAXf8WXu~$Yc0(OC7*QFnVml0-4##-PcHkZvN_8eOn`A=X!BjY$1q`_TbW-79k zz)qU-*bAw;u2>YXF=@JPh5u+)XRvGh&u7;dY@;Y-+mNvhW_#As&=R)8V5>t**$W1n zYARz#6}xxT#?W!>3u0H8?~6JFCq+Li_Q~y*;`%^>j3B7>94UX8Jp$kmoS-xWP6Ly7Gvay+xRg64ORI=HbuDPy~ z-Kli%q%JT`V6SDmX1<9mJWICG8^d?-i7eh=ouNz5A-J?*4T5kM5_Zd#0wInl|YQ9biu$ zN|lucBVSOGZ(hcLU9_W#@gNmS?f@Af`nV*HNUo#C7_KvoJCZ0shYB@!SeZQSi?lVc zXR&Sf=hUJ@lbP{g7qLhbKPyqzo6&)R=R&PNS3_FSe(4(7xu%VH#g_rW+R!0tnG>jW zm`}vG^?RgrH+Z6F%tz!3O&^rTqD4xM3+WG>NOl2G9}z-&J$H|R80h*#tmy7(6=zsW4|{a#7;+;&rX1Lu^k+Z=24LP3}1M6Q90Wt*mK!y$VJe zxhG+EK%PZ5%|ykbM3@q`{^<1Ne5Uq-heLMHUR0I!9*>AVLDNqT9v#5KI5fp96+xuqf3rQ3dX*=aUy*ZJA=`JUdP zqbIbN+I$9si1-yj-=_BZTpWrOMi?PEtei6RK1@%9!=GB*KfRLEUlRR0)I#s`0xXev zZN%mzaI=UvE!noB&&Yy{#6k0(_Et5s!Jp36{9e%^v8O4jd(7zLLcwNDZ2^)f$*YLp zx`|U{_pmZ4^z*$wJ6vME@QSQPH>%`-Rodva7+xS+Q2HW)XzCH=1(m%vl+uK{R%Vyi zKcdgR+^f>^^=)`#kca+D9UMo%bLAWYqa)@^$8m zbT`hLNv%k?>gzp2KwjcC%D%R;=lIp8|DeUZ7D$i^({lT~#I4gSe}ZnW|B#z1G}~;tTJG6iVnLSW75=EtCuP-_jOU5bj@*-! zn!7(i-C0Kp0o-q3j!xQ@c7>Xrefr3Aldw)Qo|F7a1{NW#Oc3XM;U=eudpk488la~1SgnQi@twvx$nJ3k$ZDEde?)e;CtyQ+y`paM+RRK7_~4_aFgAqtoCZz9=Lc z29Rdjm2G0iIKpWSHZyDCWLjrVT2I3(8t@hBac(A(vrkTsX)oUB4CoMD=99Z?0S-6z zK8R27q$xf;YUQTtzxGo*rC0KLmRm9ka{ams-o~xx&_2JEeO&r5SC`eynby|#yFKgd zJJh>hY?SOZ>rb|IYh=FK7`rhi_ry^(+19EKLaRf>)hL@6r*}#>IoJ6RvDE2G#ZBX;sf4OJ602W{2&>H(l#Q zz0ZwJM(ST=suq#a(vd^wvu49u}?@Z0~u|xZ=3stw=JJ;>yefN<=?k=f>K5%3q zEG_IA>fyUMuWPiiJFj>~n_Ti1VJ-sJgdYg8^`q{SOGB>EL}%dyBeW ztplhAceST4Ev&?>e9a6cx*JoJ%+0!Apy^XQA`y%Yb zzc9C@*tKZ#x@LSu|0^?yN|oY)QnGxZ9pY+2&C-;-Fdu_?{pB{>OnZm^s$H{=LDGT< zT-o;%Q?t^Fq>dfDH0)YwCisCS`*%hVcb%?pj@r;3ThlzT?t8a3%+F0*TJs9~qFs3l zNS+oTtXInQ!(!1vG6CTI{Re$ z7fb@PSPSAvq|XsCJTXex@iAz`qXgs#$3C$_RT&)oEUbEQYvuJFr6ew3tpITyB0@F@ zo4^NW-|sm>cC~G#-naqn7GAr}a=PGDq~jO`9Ao^ah3Cv&9CC)hq&UL;XMVe+Bx@X| z1t;1+4z(oyQTAdOxP50yKJp12!gkR*a%~XSsR2vuDL~>+vUE z^nW-8`_0v>m6^>5bbc`Up@2V_vb!rxEw{-h|9qG8#rZe#C~t=CY}%AV*aPF(-7s#1 z*N7U$)}6-p>OXzFBxBU0=}bErMzWSe_`3wB=C9;ArF$%+@KicWVm#Z*+QuWq9$rVs z?~g9V>@72mfy2bHXDP>_5yC?dmeq;p84%z*6w*PE?+?@j8bAMZEO8dHro0^`=K4y> z&Eea?{FFU0-LC`eHv#`u6$8{VNh|iFd*Ozqg66u4=*-$D1RfLcQ|}HOvYjGYPK|P9 zKPM7rV+siQhAseV;|}D_<~tvcww@1Iw&24w<+Oj~V~%G2oBL}KWgpM0)X^$q>``?8 zp7hFc+e1@7`SBv6XW;%Dap0XiQCj9HpGM(2lQz3HL&Sq2L)wbUO>eb|$oO7#H8KM^ zj@y)10{2-;{nm@H*18@K{+k4ynCL67Z}XYI%YX^?qd;`~MHH<`Yfw^&Q^EbM6zOOg zZ1VHc=X;qU2#^Uq@X8inzF(`h0GQdO4Ezi<{a2zBB@}|OMqN50e{+hHOr7R1GNgW{ z?9yzOE;n)A^*tQ=>(CLa{KD{bVDG^b^_WxJSdWF*YgppV)5x(j))IL(vYK~6`**v+ z4vQ9S8ym(g!+{og8qt)Y?ZGMBswUDE%&Kw!f}w9vS!|cyvkY&2+CPd;xsI;U#u0t` zHBIRF&yq#53tXV)9=4nWZkwF{ANTjt`G6YSb(YoG2gScNxZNzP{D>tBdYd=VvyPml z*apjv{f2CzU%euH{GcNT_Ojt-+Dw&5L^TUnsER$j8o)vai*1H5oob}f+b`Fmk8KAY zW~mlqOzs-j9&}G?xvRJVof$8s_JTm8O5fSW>=vn&x6;>~oxB6`{?WuX-%BL5yNoW* zAa36<8+8ZHTBU(!Udf(y_vD^5CTGujp5+eVy2UdqmqT;k>buYD>=1b?31Nq-K`WPS z^XgXXdLad%0qFMKQy%?$J5U_cT zvp2ePQbo$w%RT$}^Z+8a{25OdU{aPh`Nau8fyu&Hk3y5Y&2Xb)qSQ}lL+4sN^dxor zU>cPCPqd#ghOjV@FrZtfURy6AQpYo9Fh2!ofDII*GYV8cGQtode<^KwVj%^{{9Yp|yf=Sc7}FB!s9R;Y(J%OjF{V(_Eq5Zfc=(F1;0 z^dAen&<1mUQ;GFarqCYynL~6HTIw%1|2}=o&_Uh7)>m!JbhFu*SF|=L1`m9Sk%4m+ zlVM+L%Tp6;8MB(_=`yAUlmRkL@9VA+F-{&;O6*a(#F|ZpoMs5!RO%U93z@AER$v`C z$d5hIJ^r4kj(PZ6N!OIHYTd=MS19zHW0B~+PH@#~<1JN(-FX)OpwMyt*WyiJo!m_h z1TRfEdYW-2`(j!qx_NV#k>AhsmgMl~;e^Dh{H?^ICR=5|rZ|l2c(W_1UBCH&29r+2lb|YF) zBu7K2yT+9MwCk_=9}Bw0H%{`aOuEK{kc=)>2Ng&Su<^rWGowD%7(hWC+K1acAds=g z+=SZ8!Cj@!F7R@^U^TPWY>8%U6-3!SMevqj!3Ae8c%tr*ara{ZTzq7HgqoVDvcfyF zY3`dV+h4_9)V)vkB|Tf9i^*@NPj?>42(YwQ+}_)exPY`rD8hb2T9-Y3wFTgA3}Rno%*=HW%zA#Us-JVoR+@{cqI5Q2@tjcx zJHVeN_)Rrj;SU>~2hyFQ&OA=e_%?>w{Y?$KLG^pE`Bb|?Ru;?-4(L*d=a zg@hjJ>#(CjfJ#UAZA*_)95y5}+vC>CzqAQ#LJih$z;PlSB{y2{AGEQe9_G9hW=Ei{L^}WR`CkbYkKv{az8XBjFav-pM6dL#L~m#(Z0CFxwoksTGc)d|1~%DP6UNq2)pO2nALGZRtXIUVon zP2mh{fdd>3t9DtntY5&ssRHsqzwJ)EY6uy@RUHzOK|z%&`yg4WbCqYZ+30o@L*)#W z7PRUf7j@n~iZI)r<7cU_3wX5^1O&{bu|f#;Q=OxljDYjoq4=k>ry66T60Dn?C&FN~tw;uk`85p( z`<3W$zsCBQ_&BbwEh^~BDbQanTj9tJ7GR?v*-7WWwJI~LpX0)#8W&@B2Nv%~XY}xS^^DW)RqPE5pE4wcuJI;+VqZ(MPyn$M=ph*?@zU#a>KX?B1z`Qr9lhV2s6T|HD94%o3$Y;w_B~-57?5P~Y z-gcZ?#NfM;O-Ga7$-lUbJzKMg-! zz5G&~Z$&z+=@#UkkL97T)Yp>AlIzY7N>I2ucQF0cy77;1P}-4A7H{OQ?pN*hz@~OZ ziyUKB!`*}IH`03blaWChcVg-DiV> zeu3*XiWY{s?Z#<;o8KhkkrS>A{G?wdXI0JuEAGS>k8y5Z zp_g7~`Q7X99f|TDLYRLBEUd0;%Oi&ShWOsJ+7Kh&oeYw31JhS}Uw<-AI01i(j~)Z~ zd`<2QZqlxcc8!=Xu8%|ov>k&P3g6m}6qk+HRv0O)%zya)FbM4Qm;e`d8(lxSExq+S zM4s@n8Oi|*lO=vJor>4_yZe&k*<-1J zOh;VWu7!6K`e(w%x6eX-1BDFvy}93On+sG!ZEeT2(@ulrIsJZ@=f6!&2LPZd32w!M zL4-%Bx)dd3~#W&I<@Ca!bEX(Aav*BYQeqz7AqtU32_r zTy;w0BRt$4<&iaz7w>xGBdorPu-9f_gp(DL_qR5At2%^F?XW!^-$T;?XEr zII~{SchUXdS7W8Sljx}q4$d49PIVUp7zZs zL^y|$p0ge;!j=Zt*Pnr{SSf*6w;!_9ZnQ=zck9vv4cgnDJ5LOk)_|LoX#X0q1|Q0~ zg3dCh0=kZZPRJ0L6rz|TbDb{>*72?N9&g=*d_Z+xcW$>m+}g?#!2#Jce#u#ef_tW{ zhk*NPg@27Riz(%2?jM^(8fz$%iuDS++ke@Q*W8I8I$)`n(9UfV zhgsC1pz-pc=RjH+7P2Jw3oJ-}$BlnB{(wy_kmxnhkkt{Jkz zUF=BNET@+860Bs5-}?Ci!B?O)cUGZ1dtI0WYVkPz2dcdy-n&$V>On(%t42EWDy?$*CCs$dKa( zzO6aocyk&};CU1DxCx4V9?Up(-2bN(>+!VS1Px+)*cNl=`Uz0E63e;qd8QtH2vTqB za${>uz9Edwfmie6w|x`!Q5nY1T%c1Ae1I97jBlv!GDq0c0)0FE zV@1mpKaOo%MUKXX>}>;QuZMm6ajZJ8f%VqR{x{MXL6{(TLx$)6^$QQk795nbrPspc zSE0H(8e62V=%v&8s7DcYDcPR-_*UiXIn1*B>Wgxs2Tu;xj! z%&3a}p($7nvs!+Fqv=gt{OGM==gofi#ff1d{Twx7&0Mh1)cErK2GhS{)>U*{rO*qJ z{N$#HQ#mE3gMMwHLUv;W<+NWnowR&APIyc>yZhHj{e1TP_B4IuwEp<^WGOyW;&d7< z>i&YjKYNnLHo3VgVdKwi#(uK0>ZR%G{;WRb*1=vpbM`@GH^cTKe2siixsH}SnK3jQ zVV*k;iMTCW2MgVteo?ihE0hhkI@vj3LM~*S`P`4sf0>75Dol6C3Gv#LG+3%KxHhRa z)ER9vB3wWkc~iPq8KmlcckkfJAZ9C`O)=R7hh@3UvWJYijyz`8^X%XXTMvT-Gz~V_ zL3${GNvl)7EKtJn!%3>Q9@;|@rw)wGQ%J8p@0i=5##H&UzP0INufy2k(utZU5QL_Z zt)gCv5z>-99e}hJ7(j-z?i&!f=EQ;XU8Jsz=8fP|9}|Nv&O+c9%~twcX-9Z2gOm0B zfRkw7T|_$1v*S8;cm>I;93X-u?brDH6c@5K&$H4pShp`wCIE-SrV-B>%B|TuRdXFbh+V;InLq@R#AlXHtPcli&9-J{Zw3Iijpal_gGs zRV7Zdl_gxfRZ$Dm{a99{K2#=Zd$dhqhRI&he>zB{H8q%@*Fbz*kwc^4CpvqWfyC}? zsqFYIn7%uwyJ;tAExR8GPqCS}A?j1Y1+>Wc=A_8@iqhmh5g%kjkyE2<#Y`R3o5rIelhb956CxZ20?UHy1&V;z*_eE3VmBIS(5!@RIucy z*g@_bcF148KVOQ4s}FlIk23f*FcfD-+(tz1CRm4ESL?pbqL*0D2o$(OkChI53^jECm6iR6X+k0JMd7;T=68TX)`bP&%y4|bUF`)r>C zkM>wQDi`DhlbkT&R{^3YADoWD@C$5YgAJaH?dI+};lMK+?m@2L07L<8xIpwXk3_A9 zm0v!|gGP1{JrqGvt?7aBtSsgP|oPwVyt8tk8 zo5P-SXPG{oX5O=Ih?bp&TBvW~6O<2CWW7fquyim<9I{01uuS-WgWV$_Tm0EUIPGLO z+a0Q6LhhZ~;yaG$HZmMRS9T1-w+-21WGs2jpgoeIe^wDBhofWhDFFH+a=1?M^$v0e z*0GF7gDW)C1Yq{EaG>Idoru7--jy~KFsh!>NRP~ENm{%ULN0Zw2vrvt`$%tD??XD~ zn!Ui9ai>*J{%|az2>ZrQqiXU3<)fzx&j`Q+4gg55(^^5{+bBHIjzz8RY{pa%$q%GJ zh7g}^@AL!NgR{V+~usi2%>fhq5) znz$qz;LWuO8`GV&7iBrSJn#G*KWZVbzl!+aD9ko0=|EpgBHNBf)w4oF13Og z-Tm0}^D_60bm+&PSEzz}=r&ixyDa}C=i>y7S?)S)3qJqT`yDWn1M}1uD7up)w|$2& z=(P3ntzZw~`Y*v7-&Cw}J)gVw9731q4d39|YVOv3XS)VPx0hGU_T4FG;X`Xu;-x;C zH)Br9wzye@&kY0Re%37FG7F=kF!XugU#;wybwU(egBbBeJ5958E37mxeH@7`gmfr7`O;HBSn?b> zP{b5tV{zy46ISC1&9lbuW^X=UGa4wt@3=Fh}guOczXCrD3IzxhArFMpf6 zP#o_Q4&(<24QBdqk3WQ&-nQhX2R|45#`|?v)EJTvIvaXGeNHeC@bmi3B9v_v?2vGF zEQ|h}kkfaKKk*FLO;5~mzU=Z3uKU9~@#Ok1i5i=T!#PD3-TxR+i*hlFMa3TDHi0ei zsY*=8fl80eKXUtSS9z*MsP7`y%~~ih;1nSqS7}3VcZ@xn5rexPCk=(9ClX$+9s}f^ zhAxy55BJT?95$+69pvr_Ya)=1kTF>f`=uTocCb!3n6VP8HisWZtL_5`2@>hrMdB>* zn@fKn9oF+=6xq98|6UKo@$5SV*v^LW`nfBS&?*Ar(dKdKy*iT`CezcI+8mz$Uuz12K6WzgU#pVX{ zfn|d0!JMGh!YX7%=5)|=0~)(+J19$+jtV^eLtOPQr;Eua7=1<~gbsCov_BA(^$;p( zO)s@`Ckny}Lny2h?E?`Hj&n8&VuyY>{3#(3D1Z*_JUANGU#cILDpD+CaWv)89?pKR z6eJ+>p|&#t-Qg!b-0}gwDJ2R&eXW*C@(XF5q~fh)vN+$LPAh4@dRyj&r%VB-Y(~v(Mj~j6p$t>V-;M(hqhWHQI`viwI!hskZ z32bV3@{zs!?iV4wd ztPsPCg5ej?dOgDRQC0A;u4LG0I+CWO7UaDNH{-*XQN8fHzTOj=I)Cbg!6(O4{W#U{ zilT@r1CJYpvxg&q3t;q5Iw$R=508+F)D3 ziY63&g80o88Mc05G`IjI7Im;58@6JhCYTtw&|_PfpoC}uI)cq*cm7JIKO&9FhcXCT zZ9$C9VkIb}2X@xW68fF+?6G4k|C+k9-g|0t6$z#HPs4;k-9EV6i&`l8aj{dg{gWhZ zeRPei?N`CLLRXaKhw7cly5S#_uI&G!7~Yb0sDG_6aHq(dFeiVilJ6MV3-QOcM@$jm z>=smKOGu{fTbj|EEUcYT$XLpqX`nVh}A z*NjsG>1@e?DcM(!@F$c+{5qI^?_OZI8)`dBGtMc!nDP+ZaGo>!ra>=f@BinZsbiv0 z6iS~W`rJzQhIZ*h`(CqjM*rp_P2x`izp2yP8g3Y_k8+1g#bg0L^nYYSEL4QjoHx2Bj!a#B0KsEUif2gbM&@{_rxcSvTtN&TwU_!6EcJ3YRW9*b< zx-uvie9Ka4g<-N*C91^j#^{k|X0WThJK_}QQl^&f_{f6+M+abO0vq-k`1 zAsCxr%a~(0%1ug$C_I&@q@ia)XPpE23U*peyV@V6Z!DXkvO@3g13h!{X<|DN8Wjy$eir=C%cMzfF>Wd|as z7{0$lv!+XyOZL8t*QtkJW>BgW+YSBnM1OZy1^o5#LGWSli@RpNZJF67O~e+LxH!Lw zJ0H8Nysf-)xapX!AHBk#{8V$*anxCTv9x{Dr5$t5hb@@z#L1)bQ84?>V$J-u{lU+z zv>DtEc~V(R_cPw_oO|*+>9xymdNvx;;BTyY3!-qkXe}HoleI3z~j&d#ibwe0FG2cncgT4d&x})CHqKLs zQuU!wsVb@1P%VTi)HYEY?WuaHAndH&AcljR-_4*Gt|ljW$R+*sn<@AHIz5RYGn>HL z80PRbHH2w19mSO1rA~~7`?8+&>9dflBSASagcjNt9*}s!EzBBz{Of7~77Wsd4w!qF zBi!k(MMb}kD2vI`WE<)y{*AbeeAu(0Ym(WS0dfZFK`fHlRk>nbwjQ|GRH6n7(zriV zN-g&(on7 zU+#;@Uj6>MAs;?Khon|gCGi--E@NS{;c&)DcjW-dU;f<2KbHkJ6Pqk_4^ANYGnsO3 z{6UB_^%gL@EcNx@OI`W+_3q1VBkopn5M?VHjMGGCuTm^eiS;vLp1vjsg^)W>9A>bu zl)wS$8qHe(o?Z{{mvMBiJ~eazlvw zCj`3tbB1zDdQIhhjQfZsRuQ%a?<6O^j?1lB2=j^{j**vfg&Vvk20xW(4V!jO0df(; z_O%zL*-0i2euMio#6*oKl$wvM10ICYx{?Ojc91xWaDmm&U3AclLW(xFVXZGvgNZNX zgXkMI3K$1U*A z)W$IP7*232llnCIlW@`;7ZDqhC@4<9U77Clk;BQhDT9OdV_~r`ltF#|EF1d%!Vs!% zjB~>-xN|2n#tlyw;f*je{*AsZR?uMoT(C;CJ|+$$cQ zkAf?_MR&pE(tN;cXuo9EHhJB22tUJo;_n!B8{#QPzN5AeT-o-;PTqHzTo!Nd09^Y* zMs3#sfkR^beld4NYe5$h(3h?|rZr<<O?0%+W3O)`j`PLur8*X`lL8`x9MbK1WXRgW287OrF!SCmted?-xa`3r1Z68a zy8~>3QmtXB*_A8)y9rvS4@)SSR79GL#TIILPt!+U6k6Ar@AP*AYgVXJo|0XI)J~m7B0P{< zKkWK4&nvdpZqdwZx4w>Geh1XLBC`s9Z`~YeWENCt$>KtA8Xzn z;hSnJHOoVHs-JpmKFiDg){~C%Y3})iBf^vV1=kOmH?3PqmOJ9z*J1;J`ip)m)kyqI zVLRT64;0fIDM(`Fr`6RQl<^hSAlEtOfnk{|0i;o=@;TC$ztzSoxh#3rG7IBXWitz9 zp1sAYmp`++$F8R;%AVC=&RHqSUckU@BMW^VJ4s7oAwHr4rCPPcq|#<{BkjVb>KBtO z{$@EsP~j&pUa?Vw-w{1GWjenD28nEd8;Rk^@}4^6@Bn55=U;Yh2-Q4deb?|i9y~2q z!Ny3Z$m$Tkt@mY~At^ zf0iTVgwSPnpOKlo|77$V`bVo?-u1J5x&&XaofksCofqP49rXqpMx`atIe_}!I_ZVf zy%B?J^0#st(RXxH5nZB|2hf)=zu5|WWm0=xQUg`NF^6i)M4!1{TXPOS-hRk zH8rH_MgQ+&NP+rO%QQjcJ5FKGj!E5^m(5av7(0WX{s+8rCB32Vyum$mfBJ9o&y++9 z@sAKc8+HR1XKsJu%+%H zsgF;qt|h5(>jS9|qGeH0>*ArTP3{EE1y=i*wlC5ikIWwK%X|Ailtr3xF4iF>E>?~q zcII(5R(95}TR}cZdb8xuCa=)b$oTPd^#>#x@vNAa>}-WS^!@yTO(T|IV(?3 zQ-H3Oyr-6}m6e*2l&_kyJkqGrl0E^?PO`WR={2#(ShlrO_P;%wbOXyjorsI>e!17*nwm}flm{bSZq-1n zPtPCx+}iVmiBD{G%xX?DBv(z1F+|3yMAKW{(+~a>S#jPVE{gK%$ROFLzR-!|?`GB| z{+7h2Wy24hM0Rk7`Pc;Wt-=O?j4a}78qj%tw;oi_^9#COKQwHi3ucV)SzJVvJrsUu zjgWot(FOYmgAW&Frc4{2sH zD>c)Y#nBbh85PsPysnp~9Tw?CL>7BQgv9AYyH;i~nTQdKnP8tHT}Ii6MMmLFl4u%q zTG80lwBo)gMU^N6%M?OltKA)f6iXtDT|(=gsj(ph!4l^B%8%%7S>R#~RY($8&vN8& zF(cL?6aCtn&Vts$`c0W~R~jdK1`F#W63rO5Zl+=#Z-ss^fruq?pC_!|Dnu7D4Y9C4 z8)nQ^{xQ6=^Q`=f^mirV@5;aLUU^rKyjSO|UsB&@DXr+{C!+pcB z&OmqeorsjpRXC8K|AnJI@{;RsY550L>h^5Wa&PB$j4^UJRd=k9ozCJvYoXtf_mC*R z3gYr?pc#4;uXlJygBR24PF(i(wpkDfuKZL1`YHhJbjT+bVv`Y+|2o}>l?-h4{XiRO z#Q-@L9KYPy*;%66e;a4Pw#o5%D|f89`&I-Nd#MBjMCmDepxGRatZd_~^yJj!>{N}RX>`{*g%Q`f`m1_gK6F=wdUUrK zUNkh`t5G!9-%-{nmU}4#z3)THZUsW=1gc3ymn`(NXN*p4>b47aehrZp^lyllLQ5IN z{Q!bbfJZ93MQ~dt{W$x`x5;6aaaQI?pF)yTeM?zkFt@i`9gs@F4GlfkZRSeBaI?G? z(O}kuSFP0ZOL7%3g)r5km^hVi&$=W%C1uyzlHmPl^u5&3)D&`ybHTqPDHvIivayV? z3@J>GO|WoA*ut{5H6Yk=iL)W^W&L{og*Rk?v{M~NXiaRrOH63JzfWLg*}I~if;?kr zB(D~zY-{AJ>}zDCOM9R=>T6kCsa>Qkvb0QovW?+`>W(}c?}mQNc|_DQ#1mvt^YIZy zcd@{d$8><2Q@q^NYSQiikn~fuUSHXIBwI%bb8R=v z0fUI{1gm6bfHg~MvovbQ(c$l^k>sDEaZdTz&0Hs^nx7BlfHFHLw~v!dF3I)PMOFXQ zM$1KVPi~7Fw$cXVTD(9Eo8QQ-qdejZ5<<0vcH;)VQ^S-jKy(Jt$jSAOGU}D|2)!B_ zdl=}ozuwGYI@V5ttozjpeJKpFh82lL4OOW0FugwQki;b!Z}qO%8cdC z>H*R}Jd6PL6~-7+Xvas;cpaRnPZMzu2Bbty<53;_>{Dn>J1vD@gG>DVC*2Hja+A z_JZZ=&F*uNNAaf`IA&p$UF;Ws}`s;3O?twA}MBXIKD~5uNfT8S>Zfk6Fh-+he)Gr zQ`m-d$OQ<$Www*yifghutgv&3A%bw#Nu^~fwK6tYl?JC_?F;#}cNu5fMdjiV#f41C z`T|@G2tgJa1wO6gi>esHnqbujD@#Yuc8MY>{U(`s&@5#3D46HFrIS8_u3NE^z30;2 zqG_t8nOCnW7)uzojj{p9ULA19!&g=iFfEpmv$t$0^C_RxpzSnlm!j|4Mf!;7nwnvT z?X&Dv>j$ebnmG=R)TSmk*6%emt8#(sN97{=^tX(wC1-oO5o^LjV>J9#Z8b}ceda>+ z%r(ne`K|dhwP?cs6uLY1r%7QL7Qe^J)D;%>$?l%6;v}$fM(N{ue>eVnv1S;4mGJ9R z^XEtz1^Jx=?ZRTIHcf8%(o3ZV{vK7^dhI{4Z~-LvnGhpu=N63-$g!0g>Rp_ijQV;F z5Qu$GQyd>zX#c{sHhAA3y@c={}vOI0PZt8l1Ub_TeUVV zfM7UABx8wOPtBNkI@&|~Tk#m{2q~2h=thE9B=umw*+*j1v+F`{9zVzYc{M?t@}en+ zO7Neg;QKU9Ioj%C9J6JR#OvDQ<%oeeNB=?bgoh)gQ+k>z3Y0XFEUL$06L0@u%!iwB6dp-H6 zE6)-pF$B`INGx3XH;2>kM^!y_e3sEFl2(@97zsau+dW-N=W+bd0S4OM8=VaWT1cz{ zvsNd(GMg{Tm;8J+jco?5&tFE_g%+Hbvh6Nb%2$y(SF{$enwOTa;^5>Q13Ej`82^>{ z>4CS}hKsTw7_F{jZYE~lSI)K{mPD799pZfjJ+*o%=3xcl(q$v+Q6S}4td!_0;dKTi zhANr*x~sg)ogJJJMqPHu4vQ<(4(Uu$-+Ay&l+fs>i*mmoJJ>e#`JZZCTYZJq8-*MY z$-A9(q>BEYSlKC3Tsj#SlE0f!C!O7Ow;7d4B^#$I6~5;;?TR_bM1EEd=61#%e*8e?3Mm^!>u> zt&RUYt27EOr43cDiGqh6ovYR7*Ywp^rk57?GS)YWS*t61ZD`%bPde?Xz9`URaLB-J zgCU4d!l?ms(w4-q8Y3$b3RdH+dJ$8>zg6(1z{ibRX&CTxMT)Rl$pLr=VWc@2w!L!3xE6I)8VL!3%`wR)YYq*Kz0uk0aapKXOmV&_Q_2zQC$lPj9otk6fK7{eOjVa9ci3w*{ezrFt~JT%XtU)bNH)0sukK?u z3T0){EuL1mTX6k*R&6s368Vjr$a64iW246727z^m-n6H3mLPm4G%aZhA=^#rE*Hr8 z-JUCVy2Iwcxr8QQ%5*5~7}o%{2jerv8LVuA=cP)-J@MjU_3v1l+QZL#kuj^HlAOSi zpNcfpL!=F;Jvy;`0hVI0X;PS=8y&*q-$H9y^pf+J5|iK5TNM$isS+g5|h(F(p5d zgHsTbfkmgopCHU%wv~r2g2XQGFkV^IC^y*>IK(6h6ibc#5V2eU>^jzu2zkVwal#Si zd{ioFRw$ZL$p{P^`U7zi>C|M+4eY&!d>49BB+APX-MiC`THTRDylpyN)`6(3yWAy_ zr$Ve(0!T(h4nf;noB5cc6(dO%G`%3rQ;lEno7VH>usJ6m?y zM(x#QEKIMGp`GD@Iwxf9^f0;NoP-Vl$Fue5$v=1yfu2Hoxk$*3MRp1yZOLf-O!4*( zW#EXPc;$w0oR=0ck7cr?IZVGQ_h(pS{>3eSQzsO`+!R}d&kSc&ZCAcAmwFPrDTK$| z0K#(&*3PX^!I31_(t_L+R}&SPE{Dil0#lqSgM4#l+jq)?w*C%x%CusbpoUlQwxA2| zNyQ(f}66F#?#1MZTee7 zy+s1@LAzRlQ1}ngRc+vd`2kaWrR-WecxuXv&9uDDPuYm(>Cqxd^xY!$blod?$<3(7 zqBegH&53d@y+oD5#c8_&L+ss;7OOxs$VhI#fA@41))iSwePOeYh(H;$Jc*@L7W!Vm z%oWZkw1#=oq;)wRMhE#ZWnQC)p|a?EqA9;HNR_&ys;RV-8B^>kW!3QGubrvZ>R%yt z_bIiK;o1tLonUw+%@bM51UZX3{cAp{*=z6JZ=A4}+7FYVEnKv7Myj~yYLv`+72jsz znwQI}IK!HqeZN}7t)>msZl#_I`TUJD@*ZLn=QzQXTl90+_O{aElGSvcKr3%?e8?bSlK24()F}I{t-YoS=r`F~dZOP}b5pwh(CXrSLrH=r;|62k0mTN8cvizSkys zD%az81r#VgR$3p=&eY5+SHYb9L;^ITMV2vP@LawOXqmQ^u zfWOuFpG!n+W-`T8`yqd~iN%7Q>pZ;?`>Q)*^$VjO`MStM1E{E+K?ZV{XiRHv29u9y zx$4S_Rz3q;->tO=Y^gl3^jbl=Q39{$a%7coZLu4qh4>I%4@ZuPG@p|xmUB5vd#JmJ zMMycN2m0?w6LYoz*B?&MAfT27Imks?^m8b7d?|b>z55W6Qlqlqk4gim6&;7q}aAP^)!o*KCbe6n+3;6 zTj%!C${vj=Ly*^matAnOhf-O)19>^D4WpHmgK^q9dlHJCT%>1TTu1mnK3+rYN4_S{ z#Lr}y*B0-r!6yD(KHhOtDf>zJ{n3Th^$5Fc$Ec1pfo;cMCb`1*Lo^o}vsANoQyuRn zc-a$~{ld@g{{c`yufKm+DL2x;6SSAoZN67yWwCxxFx{ zX=J}}^TW+Z(R%6N%?n?Gf~iZztG`tvAK>eRcB}FfTo?8Gwz^>f?{+BPQFV|koiKkxBEfj@WMfr>~TWKQq7)s#guW6C4Ts{5X9Tj>nPRn5AdQT6QVa>4j zF}g23GB-#+&-RUn|BA|^gLa)lA>CL_t;8f0EY2SU;BiBjah^qW*m=J+QhVw$nh9zC)FrNmZQaE9Y@(Y$Zh*Uq>f|e}|4)1G0TxBFH4Jx8 z4lv9RWKh6SQ9%hkWKa~8AO=Lij3QxBBuWs$G+l(gu zs(Xe(-E{wZpZosr_ccs+oeHO_PF0=M)!i{1NS3z|;I3hreNuC>$h|8N@d>$L8M8)U zNOG_I+&t5G_6~1Fv~ijnRsiZHY=8{6aq!7b+X90t?eA#yz*A7G=l10O75Dj*Y=3~* zWW(=YAvew1u#sncJV#Y>N3d}2pk0?L>w6e11tSZkdr|(DZ>WA-C?K)G;?rS;f7lDc;kd1$||t*LR4G0 zA%VGKaEgFk!Ri`pEbbeJSr5yBg=4e0E8%`@I4mO@+~Xt|pTOe6JFlpdrNVe*CKVdB z9MFqUG;&I0q3ITbkj%ob$B(t2{@5Bc*{)7#$OYM+a6m{d7clyXz<Ms_bo{n536h{hl2fhaFaV1Z*)_c6lI=E6;c^gB0%XBrOJjYrsWya zv#1pKW1kzQ>W2V^94Z0Iw1Sun$ODc_DjKd>z6q62a_by}R1DOX04X{M2jP3Z zYGG_7;ERH|9*~AL;giT3@<;M`!~jmPyGRZ0m1=58^`jVS0M&@_IZY)`N^7I}@?CBvKRQ_iY=RkZ}$t*fU5g zkQVGJNr4}k%Mss}i!hc-HTo;w!1j_|DVUEPjdqZN?-gKa z$o4yitaSr^!wjNgDz6(;?veZ5HK-%&z%ZWQU0*dA2zgRolsDx=`BHwAKNSFdYyxx+ zg>@AE2RRae116ExkV07H%dk%RRdts~YpX~unt2#L z1aSflWrY#;7;zUOq#BA#5^5+*{Zqi*pDR0^y+Tv;r9z6wv$q$Dc`CI%6qmqH!E>Yp zGQckp(>AJxTm#0k70M)l7b2}F5u3&r({h2BCzT4sv?@*_=Gmx1X`w_&F3>Nf6(tdh z`Q}o&R4i1*SqLROiB!p>m5%UFiDf)hoJv2`Ml4mT;@F~6iQ$T=`k|^gD9@83%3xY3 z(?AWuP`^ZCD^|%RBvQg2Qn>{F#V&qVU4XGuh zQjU5RA+D%eELEuVvn{aI7BGuu6F{XegYLmuBBfy5X4|WZ^I^uQg%pre4J77SAYEZ< zK~*?Jhzc=?`D{noUfPr4tAN>R5oSXe2a^tai(?M++8gIHM=UZ)_yUUN@r5#&$U;IP zxFWy@AQ8 zKuMOIl1<|hVZiONXG-ig^c$#b53>a)8LS7SCeTO?JPb!)AaXFY4|~F%v3)1t3LHaC zco&Q#EI5h8&O)eG3hk6|g85)4CuoJ_td@&K5==$DB&MJuS}4VlZm8ERBZV6=E578aA$4n<**NrW0`Ktg1` znOvk48$xEmWwD~_h~-kKNcx?cOwVp&bLrp7$F&hCi~K6s;~1r7Pd)lIUpsfH_ihB0TE3_F@Q8N{&6VS)h)tW2U3 zn?s9uFfD{~xfG=p4x>y$CWcZ7LY60$v$Nh2MwX`pAyr7^yrupa{PR%k6i)<=0>zJI zp^Rt&cQI9B8X)-rnOq9^rFL+V+lj>jxm2bU0;dwH^cR5ic6JgLxWZm;0EvV$JV}80 zp_Zdih)@bT*b`xBFQx=2f$Skw3JXT1zY1Ii&e;DU&|+JSfTtwN1PqC!A|wZ5C^?yk zqcMc$OEr9+QURGH7GfbtGL9KL5Jqf|@q7r2#C%5}8xjzRY^i^MtRB~e0_6?R40t<= zKxE)RXru<=8!V#}5`l|a44Z>64p#Z0IjQJKvjPM!!CWOzu+313p{V{ntJJB0&v1}6 z=sIeZn$02MB7r%n)C%mEO08r$9uGPL#UL76$)ZEq0_Y8;*$ASv5V4Jnh||qN**5pZ z35ZJsGZNkpMB?;47+KmL!r2_38iET;q*Ajg9g1=ZrxSPcpic&?HHw(paDdLK=bvLGJ{XVUK@YCRpVx zcB~VmJm{8EyvXHp2eIO-tfqP8M#M6iSw&c-t^ja|Gy)n?pehEnquQ!A*9b^c;2#=j zDHd|s*{KMsl?6@|lPKgW4tyl&bD}r_DlQ#XG>oXS(kMfyt{57v(!U}^kZ{d6TqZC#({C=?a(~I5Zp)3^i8<-f>cTq_J<9Eap-`zR(6VA}$U!I#MA|B$J6n zeBe8!QVGjWN=0C(=u45m2!UMzL*@%%)M>*MHX|A=H=V7-3gnr{Y?VZS!U0@bpb*P2 zO2|bj!1Um9RY_ve6(tmiRbnYNGs0|3g;rv7E{exS3Q4EU;b#WjQ79yQ3Gf_+!m@ZV@NYhtIUse4DZUU7 z=pzqgs8kAN#Uc>+5U><0p_6D=fkeUtnH-f{8DQk8fXx-thJPuXg)*A-oku{>buh^a z_y>fcBJ3UwB!d+VLxn9SB!T}bVr$Nbt8@UFWjr*eVcqg*8Bz=;La`7DUM%Dh!?_qV zCXv(un}*_&Ct7K6VS;7~DE~B?zM#aQ=>m!=a0m*-2@%4uvWa{o zYQ7Xi6&neO#hVcgD41*r#t+2}XIt?kA_F(T#RKyam0WE7#-h0PcHTEeNLDqDAEY`f z3zQt~XZ7Wn+toJuGRlb}@6j#=?~DjPBYk71d2iWJwSk(t z)!_5`wNC=5Jb{hx!rMnK4vH5Xw;0;H-JL&e{KRLG*M&8qgy>8OkC z{)<+(=ZAO&ItVXrKULrV2zf)d0AH3Vz}5-yP22+Vnr{5YgaAJ=A;2$82=D_F0{p&& z0N-*ez^_XP@Z%B!{I-MuKP@3}z>^oAzI^#I2&`YBfX@TFQ^37H9MS6G^aadOe39-K zI*ASveERYwo(`m4X*b%Pu1|Z=8o{7RQz!}LtK0kK(9aD7)Zw2SX#UFkrTHrd8XZe_ zrX%Q9bPqa%&ZGO$188U3MPQBXvceO7%|oEkkYND_8Sqo+#TOuoex^IEAMz(#!`%Pm ziE3Ak;gwFV8tzH#Aa8dD|6DcPw(X!y_Az%?O*CwcO-+KkMX_0Fy3C+NKfeT@Bp+XG zfS0$9@ei<}V|mJ$wA5_C1UqbDmkpqU*{;&?MGkWK3E(HE1noUIpfJ5Pu6%+;z^As4H1Q?0wB7Nc)E)50z84; zzympq)&nY(G!HayV1XLc_w%8V_{9+rCixi4S^@c%g#hrB;C16{UWt{GCUO#edaN$u zNLfRiW&T%@BH|ze`;-T01|V~#Wq`~wUj`{ssS@-u8Xb3#0d%Q20HFrd)=;&IL-!h7 z49TwOZv(B!RcS8c0>DB+IwB_p2trbpTY)hFq6VyC5IIV$6@6Q@Iph(ujxQnF`9k7E zLPdwzgXWu~%f$fjRi+R*fy82?%z&Q6 z+(*+wSpjewJW|^N|%G@AS{eWTfq8%U`H z6QyF7fZq)!l1T(4OTJE)d^Z_fbl{jXNe(5GjsOZ+By2z;qu7#QosiUqhSY|}R1%Vq zWzx`OnKb-rnIKFu1)F3F{wh}MHR#cdlDITA#iR*b!Zi9XF^jr7Hn{n zaD1Crk)g_VsOT~0YA0{RhZ3EK0EcKBBaj69_|65&~Amg(RHFm%~-c zsuy^(5Pg&qDb7G{HUXwmC4gW{ejQ~Yssd*xMItF?lC^sD!fD-Ih0!~2#GF1dYb20>F6+v-DP+AcLjf9hSB4Y?|ezPH&F(fvI zq{a}Iwt3OK@7Cvtd64rjh$8fB^0e81^JMlT9Ds z&Hyu1LKGZ07lKFtWt5YcP(Vg7V-?UKm0Id-kZc&@1e-GmHfK-_owM9+gNoueRRq0_;oJI%-h}9-An7m_`5S&aE~meDg9j2I887TwNenq4PfkK+QqMp@o~}#C)p>ZjYu#GKv~8*hj>$>F z$NvH~J@fLia|1m*dZgy{%ujSr%F6Ia&dSTw<#~WhMVHdoBQHm%^YHRa^bPtDb4He>Z5s6uSxmX+^GLjIWjUyEr)}&noe!Yuo#y+Cx?4rra)R=y{L{pFo zv`t7aNGQzJ1MrJ>lz_a038z*SgQM`Puf9+oG*$1bjoyFu)fmbRT0$O|2-NiBo_5G} zXLs8V0KTCR;9F`Xh7_2C+(#6zg3tDs!_T(kc#nf$`qz&c8$(#VF6ZCsp{(_7W$Y*$ z-;<}yL#~ESV?3fmLh*m?zUF1sZakesH!NEk@9KKMH{tAqjmN4`n=cB;S;ys0Gkr1uM|9^EWF>Gd~!v8&cc?Sckj{m96(mU{rTmRp8?pA@3^8Q!0 z4Fh+h>izv)ziE)&{?9gP&wvc!|DHYXTLD${zkA!e1g3SpzrT;X310mPOgPg-g+@^kYvi8@V! zhJ8y5^4@;T08LhoCS8}C>rUI5JQt+_9-Wt!rOCyIqulAhSU^`dqOJjD68rjtWR~?O zXpFDF!g7^3zB}EHeYch-A4C|wG+I*^YOU+8L9VMI&)AY^R*Yoj=V`e2gydq&z7i%T zXx+Hy?X$7B_!L>Lre{JQohE~OuM$R+?@b_YcBh?;FYD4IvF!m;q~lxHbAVPLA)!(3 zG!vGY4E3{*MiMe(&K&lm7n)?a!vt7$+*5ogO=){pL^X_U1l8vPQeCEoeT67Cvc)%o zJ^?DIq&0j)Fe2--$aCIVIVLin_W!=T|7(o2Z(CNu1A?TRk~C2V@PTtU!q%M^uYvwuynGge{vlzrDEGid^2NMVht0kH5aNmbZ&&e)#~N z;OD7(^mle0*QlzUAMH?oZ*gi{O~}v@DIuw5zm@HLx&H1mk4>AdrcWI0TK(!XuR4c& ztZMY}`1RIqx@p}q$LriqJ`%0|<;F+%^bQ-BF9@_QI(7N+tNF6|D&^IhT`oQyiQ>bxj%sn0l#w{leW5_*cY|anlQ#VSI+_e&;AP$p;c0Y?ILR^i~O}AU9B7(do$BGx7LR8*nH?nlud!3y)|P*}O%|R#B~^ z+q8{|ZP&g-$4;FS5|fg3DLs0o_DW07$jr*_os*lF->0B&VG*PC^z!!c_45y??}2xF z|K`yMevR33feji4ak03qTL61MBvP5&%v@oiR9RYC+f=bt+p+0YtJym^R@c<1S<9(* zox090_3FF2xqDy}{z29MxdR9(*m0=Z=$Y%Y>n~cqZ^pTaO%=jXE-TM0IQ}KFdf(k2 z-d_4)Ows-GW!BU7Rav_B*>ulZQ+F=67af^k!Sy!L*^?~eyA z8Mtl6!saI<%ZGdPinIGz=hVBw{hc(|qaWtpKKjDNV@UC>JEPlm*nN0R_nWQuZZDm9 zZ%=7J*mB3!$91~~u8!$%xpnQsfcbSF4O+C`PMWr*`@YFbWAZ<}<*gfDc3Ss*n@`g> zd+%&Z?jL^Q>eG^#{+U}2AJ|xydwIf*S8HRaBmS4`+Rkw~S}V3-@RxBV+vWu=zNQ~c zwbnL&((vvR+gqN;kHvRC+t;orsdiKC&N&V4bXz*we)+0>y#^=#@?=_EqI(1a5(4t$n|1tfI(}#;-XVD)Q_^b5)^1&_KGVXeiyMACV!PD7m^d9!= z^om^cu=4{C&9?32>YVl~xxVL3B&9Ys-GW!;{4)>mTJQc4G;#E=H22nHUE0O*w~rlV z5Bd4I*+H`Na~oc7J!*2MYK;*}jDvQ`1)p%l(FJZ&GykZ0U}3 zUw%m#qAEDLbn5(dz9I41BX*yCTK>!DdzX1josP)AJYIQxcyyNZ=(dq+#kv+vtlV!} zU5JzVTya`=W!b90xBVT)_Daa4Qgn$_MnVpikd5zSE2MhmXTlHk-uxa^t`1bbq&zA! zs}Gf|OQK>RtrfmZ5PS(8$TywxsqmasDkdS1bXg#lDOA?#YK}E)JG**#Qq2K>IN%4v zm>tpI;>z|kD=hXDQjFP?hu~mrfZtj8;Q)dEiPFNaHT*K^%H>cXc7|VH z_)Uf%4#*k!y`+fOh+^Ou1-}fgTrRXd17AxD{V#z2gNuhsf&S-m{r{hFfWZ%EHO#TE zHaBdIEc08QJKtqoKv#T{&CTM;|f%(~*)0R4Lh)a2IL#iG%-;!jAleG#Q*UV(G-|%Rg7g=bEXie zkU+}gfmUG>iZYkvsirZblQmQXg*Xd2R&Ul1m_@5VjO8^JK`0&E;er66r>IWd5VR z#8OoO7aHtnwB{2-^Uue21+>Z?@`OQI4b+;$p5*@&Oz62K(d&CA>*lANVCh%aTlHJHz2&R}p#<0y$bDh0sjbQ68`f z(H$_jK_6pajW;D_Vjx$N(S*lRI1+gJ~%P03JsO3N=??2K$ zE}j1e=}ZY-)09v^e|`yV0b@iue>KLIxb=bA5WP*x!rsFg0-zQ zqEU*FC99f7CyuGv&-eNDmrZ;IWJP&w|8Zm3;@tGdRqd}hocn#tgvUFoo$@~Gv3L2C z!HNq}S6|=m>M^f*|3lA1C%^0Z+w`3~M(>gF3dh9VyL>JEtW78TOGTc;$J)dUk!4al zm(Ra^aC`UAe5YR}3t|u4{%Pg0K|RBBB6=PSrzirg|t;0H$?G%b?hH*TX>R* z#$=Tsl8KlX#x&KsFm-WoP;G4o5{=2ewQzs;`6ErS!zTn?VR zDsfw}E8U}eeCMg}B06b@op4#IelWbPTVBh(T|=(inh|ko$G8J7<6p*AjpsidIiIBWY zlGy9%=)?KF)`bl3ylzoQk)ry3|L&*jFTbSt*{jp)k*6P9jq!SrU*ersuHU^m<-RW8 z-al=0r_*K5<1bY|QE&7iZT;=b)uW63yG>g6`!AMp0wr%4lz1@``N_%;2uBtd!MZtR^9yMg((Qcm0WL>C6tvarATt9B{tJRlA zbg`N_yY?<8Pp|RygPw#xUTj_aZQCuL37`9TJe|`n@M_w=b47dhKTfJUEAJ!k*7akz z!ZwMn2h>m22ZB?Ab7|F)1S;e9I(cqk5dAP!*7 zEq(qWM``cA{6glE5@jpzEiX27tTC%ewR&j}J4Y|sB=WB+h}<%0kD23DzqI|97v#_V zcTW|qIv8-4w$?T|J;J;&`GA1lc`>p9WtlGs!t4DTyFrxL4sxM}HbhrlLy6YnQpP%uGWwvueR`qjd~mZ{6yOwBTIkSwzEcF?Rd5GhNE?z z{cBGNXzqKw|LXB8>}xGtobn{0das+#ku&0l->Tj9bd45`+U{N7p|KPH`N^U#9%pOa z&hBc_CcI$nJL=}PWxSI3%R6n>mRCE|uEqU;*%l9LMQ&4X3hf_uXV;#bq8mB)ov!Z) zpSthaZu<_G2akHvDw0{aboBKnU1qKPcy(3EtzDCg`#nAPw8i~MmxWf&3l##Iz}fk?rx|;k$GDCO_G`WC=Frd)d!;S+otfX%BX8o{%y)e?9bK)u zcAxljqt;$SF0C4Fdu?Xat4XW2g_osIId$XQ@R4$ZID87?@FAlVNjWKKLz5@lOyu8p zg^``HfHhBG<|re#eiOkC3}NJ0(n5e}hA|dK-Y;bMaH%Bba@+!W+ObVHTMMIZK3aG{ zd$QIDZ>BRV=0FlLt;<@KwHOx3NglRimELNi=if6pyJw1uA z>t-VC+A`5hl!>rw@@K-XLel*S{ye657B*fZD4xs|momlUj6`zhGsT0M#)j&6bQQ0^ zlC8;ENx9IoRB*Z$CS~Wk_sq*+f{h4xjJKnw#=*p?5>K2YxB(#v4BB|^wmIv}VBJ>k z8i(&m-ySc9&7X23wy>)E=?i&1YEF|+Qr%1%KefrE0jCPh#_rO^ySp}ewqX^qD`ot8U2H0Y8ODx4U3AzW=GJE$m-5Z1Pjv6RSR@-EJgy zcbRrCsM`E9>m3S818zM`J`@_%x2V=js{sqf<_#Y8>PQ`4c)i^}D!0yCEHs<;wC9JO z?i0)EHLjP|F*2#TG&QsHlu366zuGzGWqAE-9~+z~_j#6Cd&S+Ab)TNN`ckoSs`KP2 ztrS7>7m^X@s_*es-+I2!?Uyby*F^@%_RDtfU%uk*nv0ihhPMgp=OSbW*fBzq8r7fB%r|PSppj`H?o;JU6Sb?L@ z{!?@2%ql9X`Jvgw>Pvr*sHJ~B^WBcLjV&hMdYs?4>XS!)Qw!BCzMNZIt7rbbl^;I- z^jNNcl-gkBN9L)Z<>>3z^D~mh1)ZGHKC1N&eTSN}`>H%^6g>-(t#17LqNDS=?wUP( zT8G~4qnd^7Y;tH?pDr?ev$Rizvv!qdWb``JHrL9$DEgST#IA%Xu^R~HA5%Q>zb&}_ z&;m3uEX#^lAOqqivXrkiGc{77B^8ids{sA80=8j1Dhdj;H3gdc-RnG|*;w z?Dc&m{ifU9@Qo^!^p?)MtDi;1Gfhm2n`yln&oXPh<+pym*;V!GKU&jYNn$|>O}Sk; zP@}ldjnuVFol^d)bI)}h0$+aoHK4D{>h!hQH-j20<<+z+YtdIb=Gsm?_1pAe%iqnP z((v%XfTlK=#&pUXx}e{q)Eftzy-S?$)I##3=W#)|voFeJ&pmI=P;NQ(an6aVfoBf9 zDete!8tT_>ip8Xz+qXK-sk3RoS?|!#A9g3&w+%5{Fy(@J#j-^!KXsQaeY3~v{)Ex( zNA!-id|YRKmbF{&;rytQA#O!0Gak2FRefr$Tm7ro?>8ZH?3!z>YWbyfUuUDvsXEXr zg?aw|C($+Y<1eSQUu@ZH&xv({-`?9!tL?wVLdZO;{mPR+u(aQAS5hW7^$6PFyzs=r zi$Cr9aJt$0MO~u&XP4NTF(tMVBXRkBT3b@(9aB=}RVCj0J zU@E~qQ9_3TZG$19A(#ZrGZ|_bzU` zm!zc~U28U5?y~R3hCAcl+ums8n&Y|lZECYu>oQkZS+rCsA5Hfgo+bzyGh+GCL1t6e zg!Gy=@9MraVJqIMyC3^ey}H_*RdwE554IduXZ~cZ*OtuQu2I%^e_yTI=5*>_kS_XI zyWeV*I63C;)fe=hR378^NZ#?tJn2B!roVQ{9_6xmb^G<(_3;-|x=Y+1-&8edU*s`q z!R~^>1Bd#(|9zjR<(93BZQF#1ibD$KwLV*`?Y%2L9(D=$vg;q{Q*`3fi{#-q4o}WL zIzDv1^wqs~!DrXj%6ZXZR>{bpTm=PL=g*CN;C#Nxz2xz!odQqS8@sOixr?*)qt_pd z-abZIU{LUVfg5_7sPom+Hw_X_ac72R-BdK;zkKzfbJ*ZYTKTMnHeIQ1iCqW3x_e5u zuv(0d-NPIvp4G}bGVPhzvbJT>!=nDC^NCHU?a5S3VE|y+!WkE?v(|;E=IJJ?d3UB8 z_?;_M^XR|rhx&W9eeII6Vx56zjLhf&lzdN9Zf*HN`|@I-^?)>u%h0)wAWS zbJ0!r*iN6}dSK8ArxC66uR8}$4N7d)(Q?`Fbx+1Pmj5!X-ctR7i4r!g| z9KCj8+sXsj4E6#6F`{m&FRU`W3 zN4B#~Dekz>W%&;At7fg+i0Pckug~afz5nEY(BXb>-pzMk#zeZ!+k5Irp*l#Ka&OH8 zmx+U4TTHL=e)gNGSBgttUu1?22_2WE3(v9G8((*)t5v_!E2T4Tw^j;#C!0rny0K{E z&al%P;-$eqh3EEN9X51SO-WkM(KW7K|9pAHXz{|l=wow)c}w;*cI(r4b)?gWY8yH( zt+L#zLI2b9UJF#$-kclsbNTrDx>|K8n_xAsiSwMFtfDS&3TW!iGxz9Q-l%SWxB2nB zyTex5`!3$;w0PX2m5xJ3=e6>*Q{PVLqnhqDJ+|G=dxiGp)t1hRDJu#nuis_P`J`SG z-1^T9ey=$DQcYkw_;!Z0=uSf07xP3|VW9G}d3%mKecyQHc%yS#j@|c5*PsDdR z<>?btJY#RqEaw&flQ%7LDsfoZ{Eu~5u>ul&Q(lbL-_z662LvRzp9$!N z;D1?s|CKbmb8|t<`|EOQ$P4EjIqy_ht~gtA`qQt|#o|+o)1&ea9`@<*h8~pO{Kl>F z&5dlkdwq#(eIVuS#F*ZlZw+kT`ST{<9z(-xnXMmXb-ciHr&9f(`+#0;2ZwH4FgiR< zZ2fXypVz~puj~pv*gLL`)~`(FpE>I3d5a5mV)_Rp@QU^>`IM8o(qZYcH@@3_>Lg#9 z(qK!~eqPJAV$1E`H07JRTf& zKRolW=h>aZn7G!iw-VPJ+k9)(@H>;1(apDR@4eWzOONi?-i;sU=n(Wtb3AuI$j{;V z$M(j1U$q=@?$dnDfPo(`&J4T0A;;tLfO!3u%S#6OKJjh&rheuk%Qg>o2>EkQ<}PUE zmse`5waY7@)oNnix`|xggsdLUR)I8t)!BTcUDa-7TZ}LxF$`%Z+(KVjQ8&_I-VRQ6* z`G|ykci7ys-66_=8XNmv^Q~W+jOQd!7s`9oyynFF&jIGVNKB-I{?rMrClv z$ap*FA3D;|$;G%azHXjgL{fJ)k<@rUxVed>ZuAeGXq9p2eNX7lXgAkW;fB9i;A7EPEOr1e@KaDI1h-^Q1c)BB&u56IYRp}n(v%Zhs{@Ky&N61|7FkXx;OLMFL^t0gLAvOC!ETI%XZjpu(VWl z4XS%1c#{9Jx9?p>?Ad0!Dt2g-wI9u9{$w}e{&RV+;@!n|P3+p{|LD8hVNXJ?yK7p% z%*L+LzSa-Nty$dVdgRT6X zn0tPZW0z2RbZ5J9Y38%$IbZ2v=j^n_zs1j)zt@OO>lLPoSp3_@6$c-T=+=71sS_>x ztnUyjU7bpY4(vZWAwBoAZ0nPdl%Uj4M|Ooo4jedP`;m7I?rgN#vF?{f^R;b;Y}>)x zRWhfat%J>oQQ4pGuRq~jb%cD3@1-p*-%tA@d+7bn$)`vC8|IttjhuS!X3a;>>oy6h zU3xDsuS>6!GaEe}Sf=$FukJm zQ7`2>hjv~a*UrvPc`>_$cM8Nn1LB_gIQxI6#XYB%47w*43F|BPysCT~YUjXbjxOW* zeuG`F);pHe<8SRxmTm?8B za1l%a6I9`o5ztx>So$&!0p4?v!HLI{4&niO11^g%O!<|~Q1e9=X7DvB&O@J~(YJ?A z9$uM@kzg^tc(!J?AxsY|`>M(O;$muE{FoJ^@*#}_|p`Q*;`{Cicp0$6to?HFR=GpV~b}SJXp0{)#rK)wJ4|u8KojwN(0%Dd-i>ng z;%#qN4S0U9<;|TlRf}9~-Mbu?Un|; z+&LyQ{b=(W!+$ zls0$hV|lFF$iDaY&i-&n7SOn3U2nfU2T|~uM%r86=}hL3)Ejqx^O`%j=$0hNTGe7} zMhjJ&O>2IPNslhu(~P<}aq<=SN6Fn^+b8vr>jzCdzo_3E_3GlI`!kE*=JmaJ>)gKa zxp#L*x_@XTvS~WKn)SUaI|_7X&Fn9_mW&=WYiKWCLw>=MQ;EO!R}Swt;7Xr3PjJAz z?Xqg|^3N};oyxd0V5?~9zS#9ScIB3(tiu|4hUKaw{npW%b{l`r zs&a0umd+h$?{syW9y;>c%fw%277ZT$ap97) z8^gD@-%zBu5mYVmUiX3#qrWUXl~eLGWNlB&3lruJpC(v1r*}b#ugARwcZ30>d(5iQ zs66sg#Gs>1^a+Dz?R)go=WXsk-hHrhNbUBgx-Xd;@Otpi5kqY+^X|CpE?C@PON&uq zw>NxTwI|?}fBxpG+Lq@RBoY_UU=! z$5ovgs}^qY*XzqYi}S7e_41iK@#x-*)qXi>wZV1H=%!~2oyH#=SajU&;k?#N3p5}9 z4^T@31QY-O00;osq^(#Ee^~KmB>(_uMgRae0001FWpHI~WMyt+X=QUSQ+acAWo<4} zb#8QNZDlS)Z*6dCY-Ms&WpZ|DV`XzLRc>=(W@Rp9Y;5g&2V7H2v-qAAdPiweLQxSR zoPY?ZC{;kJbP$9P0z^oHNsuBU1TKmd8-l153+hGeii#pC_TIZ#vA_ipu3g`rlMrIN z*Z=?f?(ciQ_uh$TW@mPHcDByW9Q2DS0Ym@*3BF&x0MGz2_Bf02Up;y7RWaJ90(Q!u zHEuwB&l-m$v-p%W9yf_cXHyt-4u>nC#4{e7NrRyy|ITRtrX-d)&tlt=idNO!~gYT z2@(~Da(%=i)yPsACIBR3O2z@81W^f0>;J--NFItrb^MWow3if36)-ae5MR*}_e)2l z_ctQqs60N80mQmteV2i+-q+NH+o?1NXrI zj8O+b{+n`v6w%QB-4pwedVBbtp-G?j87{rKcJ-x9n-=XEGZsH?U*>u_;B@=I`j91u zSE@44TpqX7&)`syiQj_Uw4}O1#;$$7?xriQXZ^Y6DOEY^O2wTzjkTlF4X0TMw|AS) z9eu`XeX_>h%GqycUqRb{yJ5O-owDwc^>n+Okip@L&dmA}(_>sVc&Li9qb9ALbx<5# z(60yA;O& zs)Z`*Jlox;PtQ!vujfPpx;5+}CCET9E6}IDyXiY8(R0|oj!Wk(OSQeJA6@ixqqB?V znc=0S4+w=ag>?*j@X?bZ=vY>y3O@-B80pS#yK8&!ojbOTdc%R1ATniX--;=|Jt%+5 zi-lJ^5y-vA1UW&MryA?3{BwGG3ZcX!CI_dTs zmG6O4r0g9`+)97aNR1YYp{|#K&BlS64aUfZjn+?Ua4j-!{f=$NHS|?HpCO2c*n_5T zQlqb{?5u(4ZB7K*7gOaysU-?R+1F7G#nvdN)xPuVD3xzKQcRsi?cwnYmU2Jx%0^2e zmSANCB1KxW0~n4{tf9Cd64vz^0Xd)Y9^wV}!&a^*PY|`=%3Kc4@XRcef9;Qt4S)mh zrwzp%lj;e)-GD=ZoWW6@`c<<9JcG9-r>*hqo|-$k2(M!H`O+h@H?I-BVMR;B3O7!O zfDGr9iX?zl*|mX9w%WBpN>)lsRNs?>gz55Mv^ii&&408W5%qs3F1&2hl2E_Ll&u;i~Thda=~C1dqiV*TMla zHE!q*RsJuTbfi*IhD8X}m#Jg`O8Obrrb;BDsA7gL$)>20-Wk`IgMcN9CZZ*iq=G2D zMz<5r%i^_-k(4(jDIo?D2pSP3hF#AE(DZs|EW5Y_+GTt3-g}U!@zc%Ve?VF4eak*F z4NI3KwvRf2aAP`@=s~#pLIvdlo(S4>_zm$~L83my3l74RBU@TF8Ly-N9L{ zA?X{$VqB4*&&o}9h^NjZ?b?Hrfu+7DZP0^S|LQ4E4@qmXiWc&d;`f)T7;o4(3DxV2 zv&bFeRWRO&p5Ul!sua?`Nm8*Gu!?8ODaT?|p~)eOcQOu6T|z$Bmk17lNUU_AaLvAS zkrL^6!sVL08|M+^#&v{JHs{lzf6hb@0gb`H*qX-(bv1|IyjwhCR#gXNt9|kxHUSDo`U7!tEHY6i^hz zg%Q3HA0{P>tQm-wb=kKeP4+@k0L%Qj6;SvUC(=m=V*`Likf!boKn>c!C<>D6Anckn zW(q_tgcC)^4`d4YNJZTByaP#69Sd&5F@uN1E>s0q=j)ys)~7&WtQ){Jmxo;tBOLu_ zUC55;J7}(v3`7KQk}98@+=e?oV2k*|?=*fT3owoklCmW0+u+0u*Ax&5>DD5Hg*BuI z9}|e~Hle^MbM!zCuMmKjZWY1EbRr7xW+wai6)XOP``5qmF)%l(@xue6Q#x~aFun|) zVi61}bW--=5R2EfJNQ8-JW>1#1zK=86-MjEAx&kKiY3-w&WAc8-1>@J{$eK)| z<*1rGqBsIGMy@bM)>wm{1;uF5o(1*j&%Fz>(f2(9648v2PSr%=lI0i;9obxdD)CClFZKkya;m-+M$J(*(E||8#-DRUw9D$9z*}7HSgcp~Wm8KWkK2^~A!I zIVo@!iQPvmi99=vkK!YK-_|L0RlA2#AwOfnu-WF5DRuwX%pvqIL4MJyRQ*GNg@>XY!Ida=~4#)E+ef#;fyJRIJ0Y8}> zu_TB@`7((UlM#D=pdHGGp6$s^`R>byPI$^GJYUP_^vqJgNRlPw#Jw5*1Zh5@7=>x~ zh*5f}h+rocJS-3Dg~P`D=`8qlvanws^E*FHFKAtp#N#|T^+yPxR64W!vpXWa@5eTB zs+@wM_;N7$xWdc$xrMmib*JkUX&4Rez&+R%d}-3|S!3eO)|p7=HRs7d=!2G z%@%fdtNK0Ja|u(LY^Dx@O6XSKq1Mz&h(-Nq9uoU$HKkO&!n zCz%U;XUoYX0eykz=wgnReMOA)&|TZ5MVdU;pToxy-*pfmj4~sK#uV;HRK{EuyjK21 zHVhLH1not~?Zja=M}<*U?M#FZqNb86KcZ=56c$o&m$p5{f_J}0rV9CRn3y&+dLplk zUp=MvKA!q`RL;T_jSeQh+L`1Xo5J;NZLJNmDY6DOwifMh2{pVlKEr7U$s*Q3lz`1w zyq;3z5xkme8zP1hY6&F_ENX51gnk?wbH3VE=$YSyk6YIe5iCPl7CW3kNbk6qx+|7| zwa3yiC+!JIWluG3_RCW8S0j|)e>0_{Hqy6cEVsb$0tbYSyx>TJbyixvENEe$(&d!c z32m_t4l=Mxt?6x*T8ujGj+_#Hv-RpI|wgt!A-H-VE zRjbx*EnlZzDw;_~(11r;T0uN`O!m4B%>t2w=L4h3gb|MkmPc`M;`m~s8B?l)g zZf3BQS%%<<^niGC3jW}@Vp<7nx@fG0iDI{B&v=Q})g=Jp&5kWc zc=YRDJ`6-^W2)ITxFbl@M)iqoHe1IL8nOzWcE>vrrVu1$hKz$z%#E4_JEkLKcpb{s zmkDHnc>L@fF=%lv#XQN9fy0SGU~@5qBkiY2?hv>5*%sIspX;I0^#Ok=QLqa7`Da2J8zp(O7bkhrb**SbmU7PV)Uo&XWyVZ z#!`wqqD6|y_~7mn$}~<;p4_&POLv%n<3GXk$G?yuLOk}Z!SV{AN<9l}l-y;LI>hYT zT;&9iUS?*?K+Gks_5ua^vYbo>^N+=&09N)ei4vENV2I91HAwP3Sv>L+%FEP^21#Rf za>zAjHU@k(8KGLPC5s%AxKt2zHj=Xd)gDr!m!mjl^4*I74?A?@Bb5R7V9>%zf5% zNKEjtVz`y4P1 z*mJ@5XT-&^lg=rH=E+>6iB@0vZv;oS>FUSVc0XR-9ebX%I|Xo=YgiFb(}GpEG=IDx zPN3I78EvH=4i2E=)zr{^AyzqnW&)L0grHAY5r=MYBcot1;bN&Ji|9VH_V`i9FFlYfqz`qp^Y zMylkk1V3TqlUI2;VM{|N3}C6e#Sg`K4tvF{!o8`FLRSn&GL*{+9tmr z0fS%l4Qq&c)Ce_lf{zOJ`)#kr*azt~ffmRiRo?XcJC2(9@1k7J-qN>dw#tIMws_v0 zYEE9Qc2hhX+a7ANxsVCSEi{m7d82qZYzezu+0jw zI5=yMWlAnj`nuM1z0#}RadNf%@US7*%992T8gN3pV`wB07f3zk(G2@}r+*qr@4VOI z&O9|!{|>CV*u37=`A!ecM}BUoB~)1PeD$k&n>qVlCcSROK|+vMm*Kc3u25`PwH1E1 zxIX_Udw*y2emeT*4tY^Gh^(L1Ww-uSQnBbvQKf$j=cwwK&^=lXJ4*Y=qF`SR>f&8nthwxNSG zePl-?D%+5k>=_AmGssGroyLh6rSyv;ZICz7WC}@xwbC>;0r)D^)(MC%H#JYak4EZT zoYU)KSNqb<`F!hWN#20Ul3G>A8z_oN?TLi&^w1*H)co`%NC;B9B@5nmxG*Sp6u{RI z>8BA00W7cPG$^ zX|8j`irteflVub1Y9->I4J`@L(gqK`lb#^b|LFP}H7dQY(c(m{B1g<|x`PeQ9qps8 zDVK5Rl3osmMrz#D?M*aQz6vi<=7MZq2u)nOJ>VAg$gha3La*SY2!Aa}(-CzyZ;7P( zQbIzyvn4NRqe0IqOa6ejbLn&R$<662T0;(U+fRGzt@oXsy7sq;!ZJw;7-t{}T#P2P3zMl~rhF4hdCqEfk?t6XNHBrkV+Wp#LY!c<7N5_=?yfi2F z(<|kXuZaZnDK%djFZj}sD#!PH&Ww+?O*XYW?L897Eg%dkY@WR}JpR(B+8ll@-^vwV z1YE>wURfv$dU>^13vOvB^_+eDUaKwk-q1(TDe|!Eb$7VnPHZ8$2v^tl#fUEhOXGdQ z8dGYOpm&FCS(8o<5i()8UmdxZdhaYhsT>XyYeQ;P4&GOuj0j7h~MqJKU4=Xyp5LR}NXV60v&5-V9eSjtBAElb7hu zCQ5`2GifNs7X9Yk7f^83RxX~&-d9YUlWcu!lAAZkw#jr`Tx&SH2vN>J(;Gw^H(D^; z(oL}Gv5XVV72+8CV(lI-E43Fw>hDu&uj4kRcD3I1Z6nVT>6lXB(Y$6dcWJ!QOx|tD zh{U&0+j?<_)5Rz_*syYZ#lfJ;dlCDz)L9b8R7BvSV3;NwXInf$+}X|?^y(?e`_G0C zI-auwc-d*s1x3B&HKyH<&U}<5Lu(g{0WUV$XHpOSw7M-3fAN1 zCi&?2`(Y72T;!ALua!#^!1XCIvF`<$6WQUL%h_RsTowmEvDtYeWctjKPH9Rd`Yvu6 zdP}z@>@2Mky8Y&ZM91aIvB9yY&CSdxzd(A3jUVl$>v1e+r3<-v!kGxOqk3?3FvXzv z+6e8dF!%53vDPaphY$gM_PUFZO-*xP^a4@?(dsH+DR8nV(bMv-^2rjpp1O}*|Bm`j z_T$QmK&zOZ-|)rMfVz{{)=tE9)*}3q$!dpN1NM_Uj4M$t{#dn$y>`ZSu~9!!=1;H7 zEbrR1!b60Vf(*8An8QkEK|Azd$}dTpZ6uiuW8OOHXPwNW(ZTYWLgFGM6a^MrgcgQL zqqeg|4gKC{F|inpG6?)d;A}(Q-R%YYbJHw*B)olBZ9Q2rc4B)?FzIBi<)LNzu<#qD z<&R+9!+39N%`8xr{{oF!OQ$TEAPP_LRfWcva$Beh+>)}!>LGoh679L-`MWV25pz}| zvNE%_+YuG#@J>)H?u)GP#g9#fYxQnsrovyWhTxo!HEZf9F=CtT4tbvK?pB^SS@cv! zEhd#$rHQ?YQq2?)Gwato`A`!}75&-QYCRS%xH9CXUQnw{jQ_%6#@ccG)MLdbB<0JH zEleP6R&fmRh>740y@$?regDQ4O>0m-TJl{gPxTZxJry8WoHyJNwoa~XF2ED6V? zgc!Hcu6F@g?$Xn%@_jdk6-IU*wBgf~MF5Ms(*QaD za1Apip)$Vn2_LcTWi# zVj5~XW4@R(nGuE{=02$Pja^hl8?+bPqFuxCw&SR0Ne&ssZga?-6Ure*ypldgn{e_S z#l~V=Zm+9A(MP1bjP5NwuO+hfv8fG+5t4_;n!pZwh6h(7Aje8^^|Ch)PB*^G6juj5 zgef9Xl?ic;thnhyai9IQ_8duKf$V1=sd#g>9G%jKfSRV22A949)`CO}3)Wf4;WBM& z)FE_dntoAr0lrUz&YNlT<;&3wxGk>3W~rg{JlnCD=$~`y1$Gj%;vNpTDxHJb?e5>6 zS(UT8>h!7?JwK>C|NA;y9$1aV$`k-L7g>&rZ|-q2`D z%5{kVliM)95s#2*-g$Ld@BT{utng=Y{8%P3v5(CUgO}-zNMl*M*c-+?uEnb(_M%d2 zt94{DCdu}3tV-LCwpYlp0!g4bT7qq}&`sWZ9DL00CkMXOj)h|G>*#Sy*2)=dskX5_ z@V$iOT*lG*hAxkD2aR7|&$5Jx3A8v|hl-mLvBxnCR%Y;NF-UFaj(l{Vot6aG;LDuRtw22=pM^TXEOvzMrOU+5715_1nkohit{(Rqq24j8CJ2 zW@_(j(&W`%4(inq@A<%zti+qOaMO?hY2x0t-h9M7F3BF^vF}8w8-RO~j*Ce?EcW$tRtxJN=u(zf z_G!Xm7|?$9)rY1|u%=9Hx!GGTGXW%b2fOCy@j1#|c0M_|c@YRa#=PAWepU5#HAO;8 zg3>wpBCu2H$^Itx54yaMGvc+DNO^@cMOy9RYoSltBY1Yz#@OtUZ5Ws>fX8^M~|MQ%AZ;=${)g z_^5ggH-C8*ix4D8fb7D$ZdBKPo!AUA-pGg|r%hELeQM}P>kYw@M%}X?4;YQZV?<==gT-K-72WP@YHZlgSdv&&n zxw6-bC0;C~tBs6BBrKrqmOblM^-mDt3te(oTjbA9*Y8Ak#%&GQPLs874!PdUs*C#% zJ-ubdoyR?&mbG8Os?%l?xEc_Qd8NKV5;`@3^{nE;*_fQ|S zylK|ZW3dz?BZJ))gH$z^y3|ZnHn*#i&HR`Zx5>zQ&;6L-^A+~-xA9B}wv zrMshRwwg}+>_?oG%N#Z!^@l}^Pb^w(-|bMQ@iF3%ih|n&lJ-v8{2r>s8!T1a`RfPf z3(3entqqUeKcvWM&S8>@;A=`{H!BLh7BOG(i;aJGf&lN2u7FAUS*}f*gGs$*v}Rz| z`)cc&LRk(BJ7c)os6(V%{SYv9DvpQN?(%cKm7mo$yI7ubf_|l5|=GysXhWWGi+8~-7LJL@)MHGFBu-{fiF+@RfL*BLUM#<9fXy!r{ltB~vR`SDyF^;H{D zAwI9N6ES-Ck@`j_;UXb?!Z_i5I9ZqfG8MAl$#bi?uB36d{7iDUlf{SuY@%yQv3HM0 z`Ab$GR#J1sEb$8N^R~}cuXuFj)#0gawC9hcfG&HvU(l+KCl~#SVAPj3_GPtsJj9=dHa+mwUCq^PB-P9*_-4$gx zepjbx;q(mKX|sh^B+3r;3Br$jnVM_r$_g8zA{rs4G zobprad&J|5Uz1eGh}zk<)x#3hwLQGP1PWIAjp1^XR=y=p=dI&E#j2SRZ9ESeXBG6y197j~QR;6z(g=hsR^B>)h6~mz^0mI$r0$r)j4vng60Q@z|J|8 z5ow{js2-z}d${(q`(Xdss}x@$@7%L)vkK7WSrJaARz=CP?IVxo2L+Dr>z-%bG1+V3 zb*_`-(5;%3m73R<=aN0we}>HlQ+~ERe2IdRLMo=ZTX|{%K569dD`~>5 zxTnAQVs78UUB^lJyr^s`f=!VpZuIbDHa4G9dy9x|S1wg`?{m$Tc_Ef;Pv_0bxBdO& z_nyq8j=n1HJV{(T!fy^<5x&5%UAd3=K~*tj(KVr*qgO6|>{r|2=I?VDxx6tpZj{NQ z%=-Qc^y+S;g$);v@QLT{LZz??v)QbR*=0hqtxaERwqTyiE4gj2%K{{pHDVu^rkeVl z1)b@;|sf>sKp?*x!ab`d}KQhvnK_oI8?b-2znaM_f|FRX7)z%?MLi>yN4ys zzK!1d{LQ%>iJX5Gr@8DQ_BQofpn8?IkqwG(&nLoFpHm92-Rbv5ew1(1O<}XDxMy6e z9YiRf7rHTPBP@N{e@j{F?IaDM`1BjTEHY9a?bvgI3&@h%#pAd41J>ew#~qP)+k)YeVy+i8p3xD+*x-hwYFOHWQrv3e7&@yU&#Dk+1PzR`7jG*HHLeO0a!bJ)4BI=wT{5~-I4?p| z#(rGcW28`?-zA)OUsYM2K(|EUa8{TWu`F?RA8YH&ze^0?f@2|fscIcDI5!#7Zvzee zFg>2?7^}sfvs_4XCr?&Zj9mHArLnw~v}As}^>6;exzxS zM5E#oxpu6R-dr4IpRC_ZPP4e*wXAYQVubM{@P}I@-sjKwC+wLmYW=^z4bVe0Z}Q6XIiy#{+Qe8>KiHt%pAz`h{ znRuTf>o%UVG{cpY8@dV~q1GjO)m3lyO@5>|QwXVJ>=PG#-F1LB@R{VYbbW6(bDPn& zUHYfZ5&1Uy0|TLf?bfD8StCk1wJ0XeuBX?QwlbEJz~`+KdV5) zwzecNBMgcTdXRW&xNMv*k~p99@EI&r2_Mc~hkmuyL%FDt7W*=xvhoQLXc-ZVaH%P)fAtn%c9I?Lay3puxqm+e*P zKM~N#htZAiwO5tvikaiF!P_ca9Cu_3xbx=cLmld7r2K@&?1OWs&ZdM{&*Sg#rU z>bb3S6&B(i>3X64djbqtBILa$ly1!KED5`pC017k5@-Y=D!Vs?^aeZ>zQK;vBd|`R zP3|AI2u#Qinou+nXo$>iq+Bt@C*H3@T<9Q15Q@bDWNil92*M{x&TML0vI*ebydjwv zc!GAS*zew~Z2j;0zw#ljGM?9l53w=Z@e2_c~Lm47RC|9gKHpjSpHTCfdPXeLnl#o7}gm zSID3eTerP-YH#+jSX=i-%`z%o5O?v8q%M8=oSh77-4kw)*F_}VVjhkAGyQlR=}#No zC>T4m`7PY{-+oZmo_zSanrWnQit*pc2Lp=-{HN0L*K*aAdwa(W0{~di6hwoj-|vSJ z1Z3yT!T#%0MgI4Js|24XxS<&xiUj~nzl~Cd;uNjTAYf;(g$uh1*d40Pv;x`Lv8$-7 zft!oo0c!}<7Fl=zfYSeUj35Jmf}E6$lDf>FgG7qe zg5NO!04!84%J{D#0N@Js>3?Ahbfs|p34I!?uU1V501JBmS;+q3s&E5WH=1@L{O2H>K`2QWI z>&O1b`CQ1*(x}ckyufw}Za|CQYxDCJyF*g~c8Kk>4p{fTs7b0JJ>+>%dSU`Q6a}hB;VRTe?C_T%gJFr+L3zFX#f+ zIIEzpJHY(mx~L=R--y!x-Hzb->x5?K27*AVE#!aX%`bL$UJzEK0{}FA0RY;6*$M#7 zlw^NnD_EOCOdy_$U~|y_C_%qsc`YaDfDVQxqBh(gz>wI#0#zVj8)&)sEAW?vwdr_A zVSxb90R!{L!k)Y*|C@zc(0T@q;x~ui`BVIk`>ztI2(kx5 zJpVQ^f3|`AgEO?H{448!(G>FU#Q)n3%RgU2oIv@v+m}B9e_p}=1CUFk{QrMFuOg3t U`0Fbup+8+H0MPgL*O}=502MuVO8@`> literal 0 HcmV?d00001 diff --git a/tests/Compiler/Resources/PSReadLine.2.3.5.nupkg b/tests/Compiler/Resources/PSReadLine.2.3.5.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..07dd19716bd1c823ede8288f5f93f9dc71ca481f GIT binary patch literal 259840 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℞_|&^9j>-u#W0T>~HtTEFY(mrxcGm9?sKN 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

      N4Bk@Yq4x*2k`#9^epDbJBy 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 H0}k|G$X$ol literal 0 HcmV?d00001 diff --git a/tests/Compiler/Resources/PackageManagement.1.4.8.1.nupkg b/tests/Compiler/Resources/PackageManagement.1.4.8.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..33fc9a5e902437d8096f1cfa577792a6a8de6c05 GIT binary patch literal 1153134 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

      5k0n*JYOvmKWv+w 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

      =6IKfiLD!wOP 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

      ~EME30EkM%A@+HDdKL=Eq8ljCV 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 A<33Zj3%MmY$-=XE3``5#Mm-=4cRdw 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%0DsbwVSp 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

      @@ -89,6 +89,6 @@ public static IEnumerable GetDefaultSessionFunctions() { Get-Command * | Select-Object -ExpandProperty Name """).Invoke(); defaultFunctions.AddRange(ps.Select(commandName => ((string)commandName.BaseObject).Replace(".exe", ""))); - return defaultFunctions.Distinct(); + return defaultFunctions.Distinct().Select(SanatiseName); } } From aa0cdc949b492b780bb6bcde2ee7ab145ec221a6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 6 Sep 2024 18:45:02 +1000 Subject: [PATCH 141/341] fix(Compiler): Prevent error if verticies are modified while waiting. --- src/Compiler/Module/Compiled/Script.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 4654b5ff..6c383ef4 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -53,7 +53,8 @@ RequirementGroup requirements var compiledRequirements = await Task.WhenAll(thisGraph .OutEdges(resolvable) .Select(async edge => { - return this.Graph.Vertices.FirstOrDefault(module => module.ModuleSpec == edge.Target.ModuleSpec) + var verticies = this.Graph.Vertices.ToList(); // Prevents concurrent modification exception. + return verticies.FirstOrDefault(module => module.ModuleSpec == edge.Target.ModuleSpec) ?? (await resolvableParent.WaitForCompiled(edge.Target.ModuleSpec)).ThrowIfFail(); })); From fbaabcb77869d431f21280b4f151bb0931130336 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 12 Sep 2024 15:40:18 +1000 Subject: [PATCH 142/341] fix(Compiler): Caching for Analyser --- src/Compiler/Analyser/Analyser.cs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index 2ed92e42..3b43df92 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -1,8 +1,10 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; +using System.Security.Cryptography; using Compiler.Analyser.Rules; using Compiler.Module.Compiled; using NLog; @@ -12,21 +14,25 @@ namespace Compiler.Analyser; public static class Analyser { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private static readonly IEnumerable Rules = [ new UseOfUndefinedFunction() ]; - private static readonly HashSet Cache = []; + private static readonly ConcurrentBag Cache = []; [Pure] [return: NotNull] public static List Analyse(CompiledLocalModule module, IEnumerable availableImports) { - var key = module.ComputedHash; - if (availableImports.Any()) key += availableImports.Select(x => x.ComputedHash).Aggregate((x, y) => x + y); + var key = module.ComputedHash[0..8]; + if (availableImports.Any()) { + var rawBytes = new List(); + availableImports.ToList().ForEach(x => rawBytes.AddRange(Convert.FromHexString(x.ComputedHash))); + key += Convert.ToHexString(SHA256.HashData(rawBytes.ToArray()))[0..8]; + } - lock (Cache) { - if (Cache.Contains(key)) return []; + if (Cache.Contains(key)) { + Logger.Trace($"Cache hit for {module.ModuleSpec.Name} with key {key}"); + return []; } Logger.Trace($"Analyzing module {module.ModuleSpec.Name}"); @@ -34,9 +40,8 @@ public static List Analyse(CompiledLocalModule module, IEnumerable Date: Thu, 12 Sep 2024 15:40:51 +1000 Subject: [PATCH 143/341] refactor(Compiler): Improved Suppressions from ast --- src/Compiler/Analyser/Suppression.cs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Compiler/Analyser/Suppression.cs b/src/Compiler/Analyser/Suppression.cs index 58160726..92d40553 100644 --- a/src/Compiler/Analyser/Suppression.cs +++ b/src/Compiler/Analyser/Suppression.cs @@ -10,7 +10,11 @@ public record Suppression( [NotNull] Type Type, [AllowNull] object? Data, [NotNull] string Justification -); +) { + public override int GetHashCode() => HashCode.Combine(this.Type, this.Data, this.Justification); + + public override string ToString() => $"[{this.Type.Name}] {this.Justification} ({this.Data})"; +} [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] public sealed class SuppressAnalyserAttribute( @@ -35,7 +39,14 @@ public static IEnumerable FromAttributes(IEnumerable< public static SuppressAnalyserAttribute? FromAttributeAst([NotNull] AttributeAst attrAst) { ArgumentNullException.ThrowIfNull(attrAst); - if (attrAst.TypeName.GetReflectionType() != typeof(SuppressAnalyserAttribute)) return null; + var typeName = attrAst.TypeName; + var attributeSuffixed = typeName.FullName.EndsWith("Attribute", StringComparison.OrdinalIgnoreCase) ? typeName.FullName : typeName.FullName + "Attribute"; + var hasNamespace = typeName.Extent.Text.Contains('.'); + + if (!(typeName.GetReflectionAttributeType() == typeof(SuppressAnalyserAttribute) + || (hasNamespace && attributeSuffixed == typeof(SuppressAnalyserAttribute).FullName) + || (!hasNamespace && attributeSuffixed == nameof(SuppressAnalyserAttribute)) + )) return null; string? checkType = null; object? data = null; @@ -93,6 +104,15 @@ public static IEnumerable FromAttributes(IEnumerable< if (string.IsNullOrWhiteSpace(justification)) throw new ArgumentException("Justification is required"); if (data is null) throw new ArgumentException("Data is required"); + switch (data) { + case string: + break; + case object[] dataArray when dataArray.All(v => v is string): + break; + default: + throw new ArgumentException($"Data must be a string or an array of strings, got {data.GetType().Name}"); + } + return new SuppressAnalyserAttribute(checkType, data, justification); } } From 100e79b0943c528b963eb1a1e9064b9c9d3fdeb1 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 12 Sep 2024 15:44:56 +1000 Subject: [PATCH 144/341] fix(Compiler): async issues and a little bit of refactoring In the CompiledLocalModule class, an exception handling has been added when finding the sibling module hash. If an exception occurs, the hash is set to "000000" as a fallback value. --- src/Compiler/Module/Compiled/Local.cs | 13 +- src/Compiler/Module/Compiled/Remote.cs | 2 +- src/Compiler/Module/Compiled/Script.cs | 70 +++-- src/Compiler/Module/Resolvable/Remote.cs | 129 +++++---- src/Compiler/Module/Resolvable/Resolvable.cs | 286 +++++++++---------- src/Compiler/Module/Resolvable/Script.cs | 12 +- src/Compiler/Program.cs | 141 ++++----- src/Compiler/Resources/ScriptTemplate.ps1 | 10 +- src/Compiler/Text/Document.cs | 4 - tests/Compiler/Module/Resolvable/Remote.cs | 44 +-- 10 files changed, 377 insertions(+), 334 deletions(-) diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index 2e1a43eb..163450a7 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -26,10 +26,15 @@ RequirementGroup requirements public override string StringifyContent() => new StringBuilder() .AppendLine("<#ps1#> @'") .AppendJoin('\n', this.Requirements.GetRequirements().Select(requirement => { - var hash = (requirement switch { - ModuleSpec req => this.FindSibling(req)!.ComputedHash, - _ => requirement.HashString - })[..6]; + string hash; + try { + hash = (requirement switch { + ModuleSpec req => this.FindSibling(req)!.ComputedHash, + _ => requirement.HashString + })[..6]; + } catch { + hash = "000000"; + } var data = new Hashtable() { { "NameSuffix", hash } }; return requirement.GetInsertableLine(data); diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 253c8a93..e62598b4 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -57,7 +57,7 @@ public IEnumerable GetExported(object? data, CommandTypes commandTypes) archive.ExtractToDirectory(tempOutput); } - var sessionState = InitialSessionState.CreateDefault(); + var sessionState = InitialSessionState.CreateDefault2(); sessionState.ImportPSModulesFromPath(tempModuleRootPath); var pwsh = PowerShell.Create(sessionState); return pwsh.Runspace.SessionStateProxy.InvokeCommand diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 6c383ef4..e479b186 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -31,13 +31,11 @@ RequirementGroup requirements /// /// /// - /// /// /// - internal CompiledScript( + private CompiledScript( ResolvableScript thisResolvable, CompiledDocument document, - ResolvableParent resolvableParent, ParamBlockAst? scriptParamBlock, RequirementGroup requirements ) : this(thisResolvable.ModuleSpec, document, requirements) { @@ -46,36 +44,58 @@ RequirementGroup requirements this.Graph.AddVertex(this); // Add the parent-child relationships to each module. this.Graph.EdgeAdded += edge => edge.Target.Parents.Add(edge.Source); + } + + public static async Task> Create( + ResolvableScript thisResolvable, + CompiledDocument document, + ResolvableParent resolvableParent, + ParamBlockAst? scriptParamBlock, + RequirementGroup requirements + ) { + var script = new CompiledScript(thisResolvable, document, scriptParamBlock, requirements); + var thisGraph = resolvableParent.GetGraphFromRoot(thisResolvable); var loadOrder = thisGraph.TopologicalSort(); var reversedLoadOrder = loadOrder.Reverse(); - Task.WhenAll(reversedLoadOrder.Select(async resolvable => { - var compiledRequirements = await Task.WhenAll(thisGraph - .OutEdges(resolvable) - .Select(async edge => { - var verticies = this.Graph.Vertices.ToList(); // Prevents concurrent modification exception. - return verticies.FirstOrDefault(module => module.ModuleSpec == edge.Target.ModuleSpec) - ?? (await resolvableParent.WaitForCompiled(edge.Target.ModuleSpec)).ThrowIfFail(); - })); - - var compiledModule = resolvable.ModuleSpec == thisResolvable.ModuleSpec - ? this - : (await resolvableParent.WaitForCompiled(resolvable.ModuleSpec)).ThrowIfFail(); - - if (compiledRequirements.Length != 0) { - this.Graph.AddVerticesAndEdgeRange( - compiledRequirements.Select(requirement => new Edge(compiledModule, requirement)) - ); + + foreach (var resolvable in reversedLoadOrder) { + var compiledRequirements = new List(); + foreach (var edge in thisGraph.OutEdges(resolvable)) { + var requirement = script.Graph.Vertices.FirstOrDefault(module => module.ModuleSpec == edge.Target.ModuleSpec); + if (requirement is null) { + if ((await resolvableParent.WaitForCompiled(edge.Target.ModuleSpec)).IsErr(out var error, out var compiled)) { + return error; + } + + requirement = compiled; + } + compiledRequirements.Add(requirement); + } + + Compiled? compiledModule = resolvable.ModuleSpec == thisResolvable.ModuleSpec ? script : null; + if (compiledModule is null) { + if ((await resolvableParent.WaitForCompiled(resolvable.ModuleSpec)).IsErr(out var error, out var compiled)) { + return error; + } + + compiledModule = compiled; + } + + if (compiledRequirements.Count != 0) { + script.Graph.AddVerticesAndEdgeRange(compiledRequirements.Select(requirement => new Edge(compiledModule, requirement))); } else { - this.Graph.AddVertex(compiledModule); + script.Graph.AddVertex(compiledModule); } - })).Wait(10000); + } - this.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { - var imports = this.Graph.OutEdges(compiled).Select(edge => edge.Target); + script.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { + var imports = script.Graph.OutEdges(compiled).Select(edge => edge.Target); Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports]) - .ForEach(issue => Program.Errors.Add(issue.ToErrorException())); + .ForEach(issue => Program.Errors.Add(issue.Enrich(compiled.ModuleSpec))); }); + + return script; } public override string GetPowerShellObject() { diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 3a0cd670..14544274 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -7,7 +7,6 @@ using Compiler.Module.Compiled; using Compiler.Requirements; using LanguageExt; -using LanguageExt.Traits; using NLog; namespace Compiler.Module.Resolvable; @@ -17,7 +16,7 @@ public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSp private byte[]? Bytes; // Only public for testing purposes. - public Atom>? CachedFile; + public Atom, Task>>>? CachedFile; public string CachePath => Path.Join( Path.GetTempPath(), @@ -29,10 +28,11 @@ public class ResolvableRemoteModule(ModuleSpec moduleSpec) : Resolvable(moduleSp public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) => this.ModuleSpec.CompareTo(requirement); public override async Task> ResolveRequirements() { - this.Bytes ??= File.ReadAllBytes((await this.FindCachedResult()).ToFin().BindFail(_ => this.CacheResult()).Match( - Fail: error => throw error, - Succ: path => path - )); + if (this.Bytes == null) { + var cachedResult = await this.GetNupkgPath(); + if (cachedResult.IsErr(out var error, out var nupkgPath)) return Some(error); + this.Bytes = File.ReadAllBytes(nupkgPath); + } return this.Bytes.AsOption() .Filter(static bytes => bytes == null || bytes.Length != 0) @@ -72,14 +72,11 @@ public override async Task> ResolveRequirements() { public override async Task> IntoCompiled() { if (this.Bytes == null) { - var bytesResult = (await this.FindCachedResult()).ToFin() - .BiBind( - Succ: value => FinSucc(value), - Fail: _ => this.CacheResult().Catch(err => err.Enrich(this.ModuleSpec)).As()) + var bytesResult = (await this.GetNupkgPath()) + .BindFail(err => err.Enrich(this.ModuleSpec)) .AndThen(File.ReadAllBytes); - if (bytesResult.IsErr(out var error, out _)) return error; - this.Bytes = bytesResult.Unwrap(); + if (bytesResult.IsErr(out var error, out this.Bytes)) return error; } return new CompiledRemoteModule( @@ -96,59 +93,78 @@ public override bool Equals(object? obj) { return obj is ResolvableRemoteModule other && this.GetModuleMatchFor(other.ModuleSpec) == ModuleMatch.Same; } + public async Task> GetNupkgPath() { + var cachedResult = await this.FindCachedResult(); + if (cachedResult.IsSome(out var path)) return path; + + return (await this.CacheResult()).BindFail(err => err.Enrich(this.ModuleSpec)); + } + public async Task> FindCachedResult() { if (this.CachedFile is not null) { var either = this.CachedFile.Value; - if (either.IsLeft) return (string)either; - - var waitingForResetEvent = (ManualResetEventSlim)either; - await waitingForResetEvent.WaitHandle.WaitOneAsync(500, Program.CancelSource.Token); - await Task.Delay(10); // I don't know why this is needed, but it is. - if (waitingForResetEvent.IsSet) return (string)this.CachedFile.Value; - } else { - this.CachedFile = Atom>(new ManualResetEventSlim(false)); + if (either.IsLeft) return (Option)either; + + var runningTask = (Task>)either; + return await runningTask; } - if (!Directory.Exists(this.CachePath)) return None; + var task = Task.Run>(() => { + if (!Directory.Exists(this.CachePath)) return None; - var files = Directory.GetFiles(this.CachePath, "*.nupkg"); - if (files.Length == 0) return None; + var files = Directory.GetFiles(this.CachePath, "*.nupkg"); + if (files.Length == 0) return None; - var versions = files.Where(file => { - var fileName = Path.GetFileName(file); - return fileName.StartsWith(this.ModuleSpec.Name, StringComparison.OrdinalIgnoreCase); - }).Bind(file => { - var fileName = Path.GetFileName(file); - var version = fileName.Substring(this.ModuleSpec.Name.Length + 1, fileName.Length - this.ModuleSpec.Name.Length - 1 - ".nupkg".Length); + var versions = files.Where(file => { + var fileName = Path.GetFileName(file); + return fileName.StartsWith(this.ModuleSpec.Name, StringComparison.OrdinalIgnoreCase); + }).Bind(file => { + var fileName = Path.GetFileName(file); + var version = fileName.Substring(this.ModuleSpec.Name.Length + 1, fileName.Length - this.ModuleSpec.Name.Length - 1 - ".nupkg".Length); - try { - return Some(new Version(version)); - } catch { - return Option.None; // Ignore invalid versions. - } - }); + try { + return Some(new Version(version)); + } catch { + return Option.None; // Ignore invalid versions. + } + }); - Func findBestVersionFunc = (this.ModuleSpec.RequiredVersion, this.ModuleSpec.MinimumVersion, this.ModuleSpec.MaximumVersion) switch { - (Version requiredVersion, _, _) => version => version == requiredVersion, - (_, Version minimumVersion, Version maximumVersion) => version => version >= minimumVersion && version <= maximumVersion, - (_, Version minimumVersion, null) => version => version >= minimumVersion, - (_, null, Version maximumVersion) => version => version <= maximumVersion, - (null, null, null) => (_) => true - }; + Func findBestVersionFunc = (this.ModuleSpec.RequiredVersion, this.ModuleSpec.MinimumVersion, this.ModuleSpec.MaximumVersion) switch { + (Version requiredVersion, _, _) => version => version == requiredVersion, + (_, Version minimumVersion, Version maximumVersion) => version => version >= minimumVersion && version <= maximumVersion, + (_, Version minimumVersion, null) => version => version >= minimumVersion, + (_, null, Version maximumVersion) => version => version <= maximumVersion, + (null, null, null) => (_) => true + }; + + var posibleVersions = versions.Where(version => findBestVersionFunc(version)).ToArray(); + var selectedVersion = posibleVersions.OrderByDescending(version => version).FirstOrDefault(); + if (selectedVersion == null) return None; - var posibleVersions = versions.Where(version => findBestVersionFunc(version)).ToArray(); - var selectedVersion = posibleVersions.OrderByDescending(version => version).FirstOrDefault(); - if (selectedVersion == null) return None; + var selectedFile = Path.Join(this.CachePath, $"{this.ModuleSpec.Name}.{selectedVersion}.nupkg"); - var selectedFile = Path.Join(this.CachePath, $"{this.ModuleSpec.Name}.{selectedVersion}.nupkg"); - var resetEvent = (ManualResetEventSlim)this.CachedFile.Value; - this.CachedFile.Swap(_ => Left(selectedFile)); - resetEvent.Set(); + return selectedFile; + }); - return selectedFile; + this.CachedFile = Atom(Either, Task>>.Right(task)); + var result = await task; + this.CachedFile.Swap(_ => Left(result)); + return result; } - public Fin CacheResult() { + public async Task> CacheResult() { + if (this.CachedFile is not null) { + var either = this.CachedFile.Value; + if (either.IsLeft && ((Option)either).IsSome(out var path)) { + return path; + } else if (either.IsRight) { + var runningTask = (Task>)either; + if ((await runningTask).IsSome(out path)) { + return path; + } + } + } + var versionString = ConvertVersionParameters(this.ModuleSpec.RequiredVersion?.ToString(), this.ModuleSpec.MinimumVersion?.ToString(), this.ModuleSpec.MaximumVersion?.ToString()); var powerShellCode = /*ps1*/ $$""" Set-StrictMode -Version 3; @@ -177,16 +193,9 @@ public Fin CacheResult() { .Map(objects => objects.First().ToString()) .Tap(path => { if (this.CachedFile is null) { - this.CachedFile = Atom>(Left(path)); + this.CachedFile = Atom, Task>>>(Left(Some(path))); } else { - this.CachedFile.Swap(v => { - if (v.IsRight) { - var resetEvent = (ManualResetEventSlim)v; - resetEvent.Set(); - } - - return Left(path); - }); + this.CachedFile.Swap(_ => Left(Some(path))); } }); } diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index b0b4bd71..a798c0b1 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -1,13 +1,12 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; -using System.Management.Automation; using Compiler.Module.Compiled; using Compiler.Requirements; using LanguageExt; -using LanguageExt.UnsafeValueAccess; using NLog; using QuikGraph; using QuikGraph.Graphviz; @@ -17,10 +16,6 @@ namespace Compiler.Module.Resolvable; public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleSpec) { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public ManualResetEvent RequirementsWaitHandle { get; } = new ManualResetEvent(false); - - public bool RequirementsResolved { get; private set; } - /// /// Resolves the requirements of the module. /// @@ -28,31 +23,11 @@ public abstract partial class Resolvable(ModuleSpec moduleSpec) : Module(moduleS /// None if the requirements were resolved successfully, otherwise an exception. /// [return: NotNull] - public abstract Task> ResolveRequirements(); [return: NotNull] public abstract Task> IntoCompiled(); - protected virtual void QueueResolve() => ThreadPool.QueueUserWorkItem(async _ => { - try { - (await this.ResolveRequirements()).Match( - exception => { - Program.Errors.Add(exception); - Program.CancelSource.Cancel(true); - }, - () => Logger.Debug($"Finished resolving requirements for module {this.ModuleSpec.Name}.") - ); - } catch (Exception err) { - Program.Errors.Add(Error.New($"Failed to resolve requirements for module {this.ModuleSpec.Name}.", err)); - Program.CancelSource.Cancel(true); - return; - } - - this.RequirementsWaitHandle.Set(); - this.RequirementsResolved = true; - }, Program.CancelSource.Token); - /// /// Create an instance of the Resolvable class, /// catching exceptions and enriching them with the module spec. @@ -67,7 +42,7 @@ protected virtual void QueueResolve() => ThreadPool.QueueUserWorkItem(async _ => /// /// [return: NotNull] - internal static Fin TryCreate( + internal static async Task> TryCreate( [NotNull] Option parentResolvable, [NotNull] ModuleSpec moduleSpec, Collection? mergeWith = default @@ -76,13 +51,12 @@ internal static Fin TryCreate( moduleSpec = moduleSpec.MergeSpecs([.. mergeWith]); } + Resolvable? resolvable = null; if (parentResolvable.IsSome(out var parent) && parent is ResolvableLocalModule localParent) { var parentPath = Path.GetDirectoryName(localParent.ModuleSpec.FullPath)!; try { Logger.Debug($"Looking for {moduleSpec.Name} module in {parentPath}."); - var localModule = new ResolvableLocalModule(parentPath, moduleSpec); - localModule.QueueResolve(); - return FinSucc(localModule as Resolvable); + resolvable = new ResolvableLocalModule(parentPath, moduleSpec); } catch (ExceptionalException err) when (err.ToError() is InvalidModulePathError) { // Silent fall through to remote. } catch (ExceptionalException err) { @@ -94,21 +68,28 @@ internal static Fin TryCreate( } } - try { - var remote = new ResolvableRemoteModule(moduleSpec); - remote.QueueResolve(); - - return FinSucc(remote as Resolvable); - } catch (Exception err) { - return FinFail(err); + if (resolvable is null) { + try { + resolvable = new ResolvableRemoteModule(moduleSpec); + } catch (Exception err) { + return FinFail(err); + } } + + var requirements = await resolvable.ResolveRequirements(); + return requirements.Match( + exception => FinFail(exception.Enrich(moduleSpec)), + () => FinSucc(resolvable) + ); } - internal static Fin TryCreateScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] ResolvableParent parent) { + internal static async Task> TryCreateScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] ResolvableParent parent) { try { var script = new ResolvableScript(moduleSpec, parent); - script.QueueResolve(); - return FinSucc(script); + return (await script.ResolveRequirements()).Match( + exception => FinFail(exception.Enrich(moduleSpec)), + () => FinSucc(script) + ); } catch (Exception err) { return FinFail(err); } @@ -126,11 +107,13 @@ public record ResolvedMatch(Resolvable Resolvable, ModuleMatch Match); public record ResolvableInfo( [NotNull] Option> Compiled, [NotNull] Option> OnCompletion, - [NotNull] Option WaitHandle + [NotNull] Option>> CompilingTask ); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private readonly List<(ModuleSpec, Task)> RunningTasks = []; + public readonly Dictionary Resolvables = []; /// @@ -191,27 +174,34 @@ public void QueueResolve([NotNull] Resolvable rootModule, Action /// /// /// - public ResolvedMatch? FindResolvable(ModuleSpec moduleSpec) { - var resolvable = this.Graph.Vertices.FirstOrDefault(resolvable => resolvable.ModuleSpec.CompareTo(moduleSpec) != ModuleMatch.None); - if (resolvable == null) return null; + public async Task> FindResolvable([NotNull] ModuleSpec moduleSpec) { + var resolvable = this.Graph.Vertices + .FirstOrDefault(resolvable => resolvable.ModuleSpec.CompareTo(moduleSpec) != ModuleMatch.None); + + var fromRunningTask = this.RunningTasks + .Where(task => !ReferenceEquals(task.Item1, moduleSpec)) + .FirstOrDefault(task => task.Item1.CompareTo(moduleSpec) != ModuleMatch.None); + + if (resolvable is not null) { + return new ResolvedMatch(resolvable, resolvable.ModuleSpec.CompareTo(moduleSpec)); + } else if (fromRunningTask.Item1 is not null) { + Logger.Debug($"{moduleSpec} is waiting for {fromRunningTask.Item1} to complete."); + await fromRunningTask.Item2; + var awaitedResolvable = this.Graph.Vertices.FirstOrDefault(resolvable => ReferenceEquals(fromRunningTask.Item1, resolvable.ModuleSpec))!; + return new ResolvedMatch(awaitedResolvable, fromRunningTask.Item1.CompareTo(moduleSpec)); + } - Logger.Debug($"Found resolvable {resolvable.ModuleSpec.Name} for {moduleSpec.Name}."); - return new(resolvable, resolvable.ModuleSpec.CompareTo(moduleSpec)); + return None; } public async Task> WaitForCompiled(ModuleSpec moduleSpec) { - var resolvableMatch = this.FindResolvable(moduleSpec); - if (resolvableMatch == null) { - return FinFail(Error.New($"No resolvable found for {moduleSpec}.")); + if (this.RunningTasks.Count > 0) { + await Task.WhenAll(this.RunningTasks.Select(task => task.Item2)); } - var (resolvable, match) = resolvableMatch; - if (match == ModuleMatch.None) { - return FinFail(Error.New($"No matching resolvable found for {moduleSpec}.")); - } - - if (!resolvable.RequirementsResolved) { - await resolvable.RequirementsWaitHandle.WaitOneAsync(10000, Program.CancelSource.Token); + var resolvable = this.Graph.Vertices.FirstOrDefault(res => res.ModuleSpec == moduleSpec); + if (resolvable is null) { + return FinFail(Error.New($"No resolvable found for {moduleSpec}.")); } if (!this.Resolvables.TryGetValue(moduleSpec, out var resolvableInfo)) { @@ -229,45 +219,33 @@ public void QueueResolve([NotNull] Resolvable rootModule, Action // if the compiled is none and the error is none then we need to wait for the wait handle if it exists, // otherwise we need to start the compilation. - if (waitHandle.IsSome(out var handle)) { - Logger.Debug($"Waiting for IntoCompiled to finish for {moduleSpec.Name}."); - await handle.WaitOneAsync(10000, Program.CancelSource.Token); - - if (this.Resolvables.TryGetValue(moduleSpec, out resolvableInfo)) { - (compiledOpt, _, _) = resolvableInfo; + if (waitHandle.IsSome(out var runningTask)) { + return await runningTask; + } else { + var compilingTask = Task.Run(async () => { + var newlyCompiledModule = await resolvable.IntoCompiled(); + newlyCompiledModule.IfFail(err => Logger.Error(err.Message)); - // Safety: We know its going to be some here due waitHandle being some and having triggered. - if (compiledOpt.Unwrap().IsErr(out var err, out var compiled)) { - return FinFail(err); + lock (this.Resolvables) { + this.Resolvables[moduleSpec] = resolvableInfo with { + Compiled = newlyCompiledModule + }; } - return FinSucc(compiled); - } + newlyCompiledModule.IfSucc(module => onCompletion.IfSome( + onCompletion => onCompletion((module as CompiledScript)!) // Safety: We know it's a compiled script + )); - return FinFail(Error.New($"Failed to find compiled module for {moduleSpec.Name} after waiting for it.")); - } else { - var newWaitHandle = new ManualResetEvent(false); - lock (this.Resolvables) { - this.Resolvables[moduleSpec] = resolvableInfo with { - WaitHandle = newWaitHandle - }; - } - - var newlyCompiledModule = await resolvable.IntoCompiled(); - newlyCompiledModule.IfFail(err => Logger.Error(err.Message)); + return newlyCompiledModule; + }); lock (this.Resolvables) { this.Resolvables[moduleSpec] = resolvableInfo with { - Compiled = newlyCompiledModule + CompilingTask = compilingTask }; } - newlyCompiledModule.IfSucc(module => onCompletion.IfSome( - onCompletion => onCompletion((module as CompiledScript)!) // Safety: We know it's a compiled script - )); - - newWaitHandle.Set(); - return newlyCompiledModule; + return await compilingTask; } } @@ -275,15 +253,29 @@ public async Task StartCompilation() { await this.ResolveDepedencyGraph(); // Get a list of the scripts which are roots and have no scripts depending on them. - var topLevelScripts = this.Graph.Vertices.Where(resolvable => !this.Graph.TryGetInEdges(resolvable, out var inEdges) || !inEdges.Any()); - topLevelScripts.AsParallel().ForAll(async resolvable => { - Logger.Trace($"Compiling top level script {resolvable.ModuleSpec.Name}"); - - var compiledModule = await this.WaitForCompiled(resolvable.ModuleSpec); - compiledModule.IfFail(Program.Errors.Add); + var topLevelScripts = new Queue(this.Graph.Vertices.Where(resolvable => !this.Graph.TryGetInEdges(resolvable, out var inEdges) || !inEdges.Any())); + var compileTasks = new List(); + while (compileTasks.Count > 0 || topLevelScripts.Count > 0) { + if (compileTasks.Count > 0) { + await Task.WhenAny(compileTasks); + compileTasks.RemoveAll(task => task.IsCompleted); + } - Logger.Debug($"Finished compiling top level script {resolvable.ModuleSpec.Name}"); - }); + if (topLevelScripts.Count > 0) { + var resolvable = topLevelScripts.Dequeue(); + compileTasks.Add(Task.Run(async () => { + Logger.Trace($"Compiling top level script {resolvable.ModuleSpec.Name}"); + + var compiledModule = await this.WaitForCompiled(resolvable.ModuleSpec); + // If the module failed, we need to cancel any tasks that are waiting for it. + compiledModule.IfFail(err => { + Program.Errors.Add(err.Enrich(resolvable.ModuleSpec)); + var (_, task) = this.RunningTasks.Find(task => task.Item1 == resolvable.ModuleSpec); + }); + Logger.Trace($"Finished compiling top level script {resolvable.ModuleSpec.Name}"); + })); + } + } Logger.Trace("Finished compiling all top level scripts."); } @@ -292,56 +284,52 @@ public async Task StartCompilation() { /// Creates all the links between the modules and their dependencies. /// private async Task ResolveDepedencyGraph() { - var iterating = new Queue<(Resolvable?, ModuleSpec)>(this.Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); - while (iterating.Count > 0) { - var (parentResolvable, workingModuleSpec) = iterating.Dequeue(); - Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); - - // If the parent module has already been resolved this will be an orphan. - if (parentResolvable != null && !this.Graph.ContainsVertex(parentResolvable)) { - Logger.Debug("Parent module had already been resolved, skipping orphan."); - continue; - } + var iterating = new ConcurrentQueue<(Resolvable?, ModuleSpec)>(this.Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); + do { + if (iterating.TryDequeue(out var item)) { + var (parentResolvable, workingModuleSpec) = item; + var alreadyBeingProcessed = this.RunningTasks.Any(task => task.Item1 == workingModuleSpec); - var resolvableResult = this.LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); - - Option workingResolvable = None; - switch (resolvableResult) { - case var fail when fail.IsFail: - Logger.Error($"Failed to link {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); - fail.IfFail(Program.Errors.Add); - continue; - case var succ when succ.IsSucc: - Logger.Debug($"Linked {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); - workingResolvable = succ.Unwrap(); - break; - default: - break; - } + this.RunningTasks.Add((workingModuleSpec, Task.Run(async () => { + Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); - // If it was null or there are out edges it means this module has already been resolved. - if (workingResolvable.IsNone || (this.Graph.TryGetOutEdges(workingResolvable.ValueUnsafe()!, out var outEdges) && outEdges.Any())) { - Logger.Debug("Module has already been resolved, skipping."); - continue; - } + // If the parent module has already been resolved this will be an orphan. + if (parentResolvable != null && !this.Graph.ContainsVertex(parentResolvable)) { + Logger.Debug("Parent module had already been resolved, skipping orphan."); + return; + } - var safeWorkingResolvable = workingResolvable.ValueUnsafe()!; - // TODO Maybe push to the end of the queue or something. - if (!safeWorkingResolvable.RequirementsResolved) { - if (iterating.Count == 0) { - Logger.Debug("Requirements not resolved, waiting for them to be resolved."); - await safeWorkingResolvable.RequirementsWaitHandle.WaitOneAsync(10000, Program.CancelSource.Token); - } else { - Logger.Debug("Requirements not resolved, pushing to the end of the queue."); - iterating.Enqueue((parentResolvable, workingModuleSpec)); - continue; - } + var resolvableResult = await this.LinkFindingPossibleResolved(parentResolvable, workingModuleSpec); + + Option workingResolvable = None; + if (resolvableResult.IsErr(out var err, out workingResolvable)) { + Logger.Error($"Failed to link {workingModuleSpec} to {parentResolvable?.ModuleSpec}."); + Program.Errors.Add(err); + return; + } + + // If it was null or there are out edges it means this module has already been resolved. + if (!workingResolvable.IsSome(out var safeWorkingResolvable) || (this.Graph.TryGetOutEdges(safeWorkingResolvable, out var outEdges) && outEdges.Any())) { + Logger.Debug("Module has already been resolved, skipping."); + return; + } + + lock (safeWorkingResolvable.Requirements) { + safeWorkingResolvable.Requirements.GetRequirements().ToList() + .ForEach(requirement => iterating.Enqueue((safeWorkingResolvable, requirement))); + } + }))); } - lock (safeWorkingResolvable.Requirements) { - safeWorkingResolvable.Requirements.GetRequirements().ToList().ForEach(requirement => iterating.Enqueue((safeWorkingResolvable, requirement))); + this.RunningTasks.RemoveAll(task => task.Item2.IsCompleted); + + if (this.RunningTasks.Count > 0) { + Logger.Debug($"Waiting for tasks to complete, {this.RunningTasks.Count} running with {iterating.Count} left to process."); + await Task.WhenAny(this.RunningTasks.Select(task => task.Item2)); } - } + } while (!iterating.IsEmpty || this.RunningTasks.Count > 0); + + Logger.Debug("Finished resolving all modules."); var dotGraph = this.Graph.ToGraphviz(alg => { alg.FormatVertex += (sender, args) => { @@ -371,17 +359,22 @@ private async Task ResolveDepedencyGraph() { /// If the module is incompatible with the current module. /// [return: NotNull] - public Fin> LinkFindingPossibleResolved( + public async Task>> LinkFindingPossibleResolved( Resolvable? parentResolvable, - [NotNull] ModuleSpec moduleToResolve) { + [NotNull] ModuleSpec moduleToResolve + ) { ArgumentNullException.ThrowIfNull(moduleToResolve); - var resolveableMatch = this.FindResolvable(moduleToResolve); Resolvable? resultingResolvable = null; - if (resolveableMatch != null) { + Resolvable? foundResolvable = null; + var match = ModuleMatch.None; + (await this.FindResolvable(moduleToResolve)).IfSome(resolvableMatch => { + resolvableMatch.Deconstruct(out foundResolvable, out match); + }); + + if (foundResolvable is not null) { Logger.Debug($"Found existing resolvable for {moduleToResolve.Name}."); - resolveableMatch.Deconstruct(out var foundResolvable, out var match); switch (match) { case ModuleMatch.PreferOurs or ModuleMatch.Same or ModuleMatch.Looser: resultingResolvable = foundResolvable; @@ -395,7 +388,7 @@ public Fin> LinkFindingPossibleResolved( _ => (moduleToResolve, []), }; - var fin = Resolvable.TryCreate( + var fin = await Resolvable.TryCreate( parentResolvable.AsOption(), mergeFrom, [.. mergeWith] @@ -416,7 +409,7 @@ [.. mergeWith] break; }; - if (resultingResolvable == null) { + if (resultingResolvable is null) { return FinFail>(Error.New($"Failed to resolve {moduleToResolve.Name}.")); } @@ -437,9 +430,8 @@ [.. mergeWith] } } } else { - var newResolvable = Resolvable.TryCreate(parentResolvable.AsOption(), moduleToResolve); - if (newResolvable.IsErr(out var err, out _)) return FinFail>(err); - resultingResolvable = newResolvable.Unwrap(); + var newResolvable = await Resolvable.TryCreate(parentResolvable.AsOption(), moduleToResolve); + if (newResolvable.IsErr(out var err, out resultingResolvable)) return FinFail>(err); } if (parentResolvable != null) { diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index b5a1011d..ef944696 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -41,14 +41,18 @@ public ResolvableScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] Resolva #endregion } - public override Task> IntoCompiled() => CompiledDocument.FromBuilder(this.Editor, 0) - .AndThenTry(doc => new Compiled.CompiledScript( + public override async Task> IntoCompiled() { + var document = CompiledDocument.FromBuilder(this.Editor, 0); + if (document.IsErr(out var err, out var compiledDocument)) return FinFail(err); + + return (await Compiled.CompiledScript.Create( this, - doc, + compiledDocument, this.ResolvableParent, this.ExtractParameterBlock(), this.Requirements - ) as Compiled.Compiled).AsTask(); + )).AndThen(static script => (Compiled.Compiled)script); + } /// /// Looks for the parameter block of the script, diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index cc1828f2..3d340cc4 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -29,12 +29,8 @@ public class Program { internal static bool IsDebugging; - internal static readonly AutoResetEvent AutoEvent = new(false); - internal static readonly ConcurrentBag Errors = []; - internal static readonly CancellationTokenSource CancelSource = new(); - public static readonly Lazy RunspacePool = new(() => { var sessionState = InitialSessionState.CreateDefault2(); sessionState.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Bypass; @@ -75,15 +71,19 @@ private static async Task Main(string[] args) { CleanInput(opts); IsDebugging = SetupLogger(opts) <= LogLevel.Debug; - var filesToCompile = GetFilesToCompile(opts.Input!); + if (GetFilesToCompile(opts.Input!).IsErr(out var error, out var filesToCompile)) { + Errors.Add(error); + return 1; + } + EnsureDirectoryStructure(opts.Input!, opts.Output, filesToCompile); var superParent = new ResolvableParent(); ConcurrentBag<(string, Exception)> compilerErrors = []; - GetFilesToCompile(opts.Input!).ToList().ForEach(scriptPath => { + filesToCompile.ToList().ForEach(async scriptPath => { var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); - if (Resolvable.TryCreateScript(pathedModuleSpec, superParent).IsErr(out var error, out var resolvableScript)) { + if ((await Resolvable.TryCreateScript(pathedModuleSpec, superParent)).IsErr(out var error, out var resolvableScript)) { compilerErrors.Add((scriptPath, error)); return; } @@ -95,7 +95,6 @@ private static async Task Main(string[] args) { scriptPath, compiled.GetPowerShellObject(), opts.Force); - Logger.Debug($"Compiled {scriptPath}"); }); }); @@ -105,7 +104,7 @@ private static async Task Main(string[] args) { Errors.Add(err); } - Logger.Debug("Finished compilation."); + Logger.Trace("Finished compilation."); if (compilerErrors.IsEmpty) return 0; @@ -128,61 +127,13 @@ private static async Task Main(string[] args) { } ); - if (!Errors.IsEmpty) { - do { - ThreadPool.GetAvailableThreads(out var workerThreads, out _); - ThreadPool.GetMaxThreads(out var maxThreads, out _); - Logger.Debug($"Waiting for all threads to finish, {ThreadPool.PendingWorkItemCount} items left using {ThreadPool.ThreadCount} threads."); - Logger.Debug($"Worker threads: {workerThreads} Max threads: {maxThreads}"); - await Task.Delay(25); - } while (ThreadPool.PendingWorkItemCount != 0); - - // Seriously .NET, why is there no fucking double ended queue. - var printedBefore = false; // This is to prevent a newline before the first error - var errorQueue = new Deque(); - errorQueue.AddRange(Errors); - do { - var err = errorQueue.PopFirst(); - - // Flatten ManyErrors into the indiviuals - if (err is ManyErrors manyErrors) { - errorQueue.PushRangeFirst(manyErrors.Errors); - continue; - } - - var type = err.IsExceptional ? LogLevel.Error : LogLevel.Warn; - - if (printedBefore) { - if (type == LogLevel.Error) { - Console.Error.WriteLine(); - } else { - Console.WriteLine(); - } - } else { - printedBefore = true; - } - - var message = err is Issue - ? err.ToString() - : err.Message - + (IsDebugging - ? (err.Exception.IsSome(out var exception) - ? Environment.NewLine + exception.StackTrace - : "") - : "" - ); - - Logger.Log(type, message); - } while (errorQueue.Count > 0); - - return 1; - } + await OutputErrors(Errors); RunspacePool.Value.Close(); RunspacePool.Value.Dispose(); LogManager.Shutdown(); - return result; + return result != 0 ? result : Errors.IsEmpty ? 0 : 1; } public static void CleanInput(Options opts) { @@ -292,19 +243,19 @@ public static string GetOutputLocation( } - public static IEnumerable GetFilesToCompile(string input) { + public static Fin> GetFilesToCompile(string input) { + var files = new List(); if (File.Exists(input)) { - Logger.Debug($"Found file {input}"); - yield return input; + files.Add(input); } else if (Directory.Exists(input)) { foreach (var file in Directory.EnumerateFiles(input, "*.ps1", SearchOption.AllDirectories)) { - Logger.Debug($"Found file {file}"); - yield return file; + files.Add(file); } } else { - Logger.Error("Input must be a file or directory."); - Environment.Exit(1); + return LanguageExt.Common.Error.New($"Input {input} is not a file or directory."); } + + return files; } public static void EnsureDirectoryStructure( @@ -350,11 +301,67 @@ public static async void OutputToFile( } } - Logger.Info($"Writing to file {outputPath}"); + Logger.Trace($"Writing to file {outputPath}"); using var fileStream = File.Open(outputPath, FileMode.CreateNew, FileAccess.Write, FileShare.None); await fileStream.WriteAsync(Encoding.UTF8.GetBytes(content)); } + public static async Task OutputErrors(IEnumerable errors) { + if (Errors.IsEmpty) return 0; + + // Wait for all threads to finish before outputting errors, this is to ensure all errors are captured. + do { + Logger.Debug($$""" + Waiting for all threads to finish { + Pending: {{ThreadPool.PendingWorkItemCount}} + Threads: {{ThreadPool.ThreadCount}} + Runspaces: {{Math.Abs(RunspacePool.Value.GetAvailableRunspaces() - RunspacePool.Value.GetMaxRunspaces())}} of {{RunspacePool.Value.GetMaxRunspaces()}} + } + """); + await Task.Delay(25); + } while (ThreadPool.PendingWorkItemCount != 0 && ThreadPool.ThreadCount > RunspacePool.Value.GetMaxRunspaces()); + + // Seriously .NET, why is there no fucking double ended queue. + var printedBefore = false; // This is to prevent a newline before the first error + var errorQueue = new Deque(); + errorQueue.AddRange(errors); + do { + var err = errorQueue.PopFirst(); + + // Flatten ManyErrors into the indiviuals + if (err is ManyErrors manyErrors) { + errorQueue.PushRangeFirst(manyErrors.Errors); + continue; + } + + var type = err.IsExceptional ? LogLevel.Error : LogLevel.Warn; + + if (printedBefore) { + if (type == LogLevel.Error) { + Console.Error.WriteLine(); + } else { + Console.WriteLine(); + } + } else { + printedBefore = true; + } + + var message = err is Issue issue + ? issue.ToString() + : err.Message + + (IsDebugging + ? (err.Exception.IsSome(out var exception) + ? Environment.NewLine + exception.StackTrace + : "") + : "" + ); + + Logger.Log(type, message); + } while (errorQueue.Count > 0); + + return 1; + } + internal static PowerShell GetPowerShellSession() { var pwsh = PowerShell.Create(RunspacePool.Value.InitialSessionState); pwsh.RunspacePool = RunspacePool.Value; diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index ccdccee5..553adf96 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -1,8 +1,8 @@ -[Diagnostics.CodeAnalysis.SuppressMessageAttribute( - 'PSAvoidGlobalVars', - 'Global:CompiledScript', - Justification = 'Required to inform modules of runtime type.' -)] +# [Diagnostics.CodeAnalysis.SuppressMessageAttribute( +# 'PSAvoidGlobalVars', +# 'Global:CompiledScript', +# Justification = 'Required to inform modules of runtime type.' +# )] #!DEFINE PARAM_BLOCK begin { [Boolean]$Global:CompiledScript = $True; diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index 7840134b..683b634b 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -25,18 +25,14 @@ ScriptBlockAst ast public string GetContent() => string.Join('\n', this.Lines); public static Fin FromBuilder(TextEditor builder, int indentBy = 0) { - Logger.Trace($"Creating CompiledDocument from {builder}"); - builder.AddEdit(() => new IndentUpdater(indentBy)); var lines = builder.Document.Lines; var spanUpdates = new List(); var sortedUpdaters = builder.TextUpdaters.OrderBy(updater => updater.Priority).ToList(); foreach (var textUpdater in sortedUpdaters) { - // Logger.Debug($"Applying updater {textUpdater} with priority {textUpdater.Priority}"); spanUpdates.ForEach(textUpdater.PushByUpdate); var updateResult = textUpdater.Apply(lines); - Logger.Debug($"Update result: {updateResult}"); updateResult.IfSucc(spanUpdates.AddRange); if (updateResult.IsErr(out var err, out _)) { diff --git a/tests/Compiler/Module/Resolvable/Remote.cs b/tests/Compiler/Module/Resolvable/Remote.cs index 6f85555c..6be39f21 100644 --- a/tests/Compiler/Module/Resolvable/Remote.cs +++ b/tests/Compiler/Module/Resolvable/Remote.cs @@ -7,9 +7,9 @@ using Compiler.Module.Resolvable; using Compiler.Requirements; using LanguageExt; -using LanguageExt.ClassInstances.Pred; using LanguageExt.Common; using LanguageExt.UnsafeValueAccess; +using Moq; namespace Compiler.Test.Module.Resolvable; @@ -20,7 +20,9 @@ public class ResolvableRemoteModuleTests { [SetUp] public void Setup() { var moduleSpec = new ModuleSpec("PSReadLine", requiredVersion: new Version(2, 3, 5)); - this.ResolvableRemoteModule = new ResolvableRemoteModule(moduleSpec); + this.ResolvableRemoteModule = new Mock(moduleSpec) { + CallBase = true + }.Object; if (Directory.Exists(this.ResolvableRemoteModule.CachePath)) { Directory.Delete(this.ResolvableRemoteModule.CachePath, true); // Clean up any previous caches @@ -116,45 +118,53 @@ public async Task FindCachedResult_IgnoresInvalidVersions() { } [Test, NonParallelizable] - public async Task FindCachedResult_WaitsForEvent() { - this.ResolvableRemoteModule.CachedFile = Prelude.Atom(Either.Right(new ManualResetEventSlim(false))); + public async Task FindCachedResult_WaitsForTask() { + var manualEvent = new ManualResetEventSlim(false); + var task = Task.Run(async () => { + await manualEvent.WaitHandle.WaitOneAsync(-1, CancellationToken.None); + return Prelude.Some("testfile"); + }); + + this.ResolvableRemoteModule.CachedFile = Prelude.Atom(Either, Task>>.Right(task)); var resultTask = this.ResolvableRemoteModule.FindCachedResult(); await Task.Delay(250); - Assert.Multiple(() => { + Assert.Multiple(async () => { + Assert.That(task.IsCompleted, Is.False); Assert.That(resultTask.IsCompleted, Is.False); - ((ManualResetEventSlim)this.ResolvableRemoteModule.CachedFile.Value).Set(); - this.ResolvableRemoteModule.CachedFile.Swap(_ => Either.Left("testfile")); - Assert.That(async () => await resultTask, Is.EqualTo(Prelude.Some("testfile"))); + Assert.That(this.ResolvableRemoteModule.CachedFile.Value, Is.EqualTo(task)); + + manualEvent.Set(); + await this.ResolvableRemoteModule.CachedFile.SwapAsync(async _ => await task); + + Assert.That(resultTask.IsCompleted, Is.True); + Assert.That(resultTask.Result, Is.EqualTo(Prelude.Some("testfile"))); }); } [Test] public void FindCachedResult_CreatesEventWhenFoundAndSetsCache() { - var resetEvent = new ManualResetEventSlim(false); - this.ResolvableRemoteModule.CachedFile = Prelude.Atom(Either.Right(resetEvent)); TestData.CreateDummyCacheFiles(this.ResolvableRemoteModule, "2.3.5"); var resultTask = this.ResolvableRemoteModule.FindCachedResult(); Assert.Multiple(() => { - Assert.That(async () => await resetEvent.WaitHandle.WaitOneAsync(500, new CancellationTokenSource(-1).Token), Throws.Nothing); Assert.That(async () => (await resultTask).Unwrap(), Is.EqualTo(Path.Join(this.ResolvableRemoteModule.CachePath, "PSReadLine.2.3.5.nupkg"))); - Assert.That(this.ResolvableRemoteModule.CachedFile.Value.IsLeft, Is.True); - Assert.That((string)this.ResolvableRemoteModule.CachedFile.Value, Is.EqualTo(Path.Join(this.ResolvableRemoteModule.CachePath, "PSReadLine.2.3.5.nupkg"))); + Assert.That(this.ResolvableRemoteModule.CachedFile!.Value.IsLeft, Is.True); + Assert.That(((Option)this.ResolvableRemoteModule.CachedFile!.Value).Unwrap(), Is.EqualTo(Path.Join(this.ResolvableRemoteModule.CachePath, "PSReadLine.2.3.5.nupkg"))); }); } [Test, Repeat(2)] - public void CacheResult_DownloadsValidFile() { + public async Task CacheResult_DownloadsValidFile() { if (TestContext.CurrentContext.CurrentRepeatCount % 2 == 0) { // Allows us to cover the last branch of swapping the either method - this.ResolvableRemoteModule.CachedFile = Prelude.Atom(Either.Right(new ManualResetEventSlim(false))); + // this.ResolvableRemoteModule.CachedFile = Prelude.Atom(Either>>.Right(Task.FromResult(Option.None))); } - Assert.Multiple(() => { - var result = this.ResolvableRemoteModule.CacheResult().ThrowIfFail(); + await Assert.MultipleAsync(async () => { + var result = (await this.ResolvableRemoteModule.CacheResult()).ThrowIfFail(); Assert.That(File.Exists(result), Is.True); Assert.That(Path.GetDirectoryName(result), Is.EqualTo(this.ResolvableRemoteModule.CachePath)); From 5a07a211ffd5e7b31e9fee08274acd4a99a6b8a9 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 12 Sep 2024 16:03:04 +1000 Subject: [PATCH 145/341] fix(Compiler): module name for cleanup --- src/Compiler/Module/Compiled/Script.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index e479b186..5871ed20 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -131,7 +131,7 @@ public override string GetPowerShellObject() { ? this.Graph.TopologicalSort() .Skip(1) // Skip the root node. .Reverse() - .Select(module => $"'{module.ModuleSpec.Name}'") + .Select(module => $"'{module.GetNameHash()}'") .Aggregate((a, b) => $"{a}, {b}") : string.Empty; From ac70a4f5661e5c871e74cb5d2dc4be9090808632 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 13 Sep 2024 12:55:58 +1000 Subject: [PATCH 146/341] test(Compiler): Add some new tests --- tests/Compiler/Analyser/Analyser.cs | 0 tests/Compiler/Analyser/Issue.cs | 0 .../Analyser/Rules/UseOfUnknownFunction.cs | 4 + tests/Compiler/Analyser/Suppression.cs | 145 ++++++++++++++++++ tests/Compiler/AstHelper.cs | 90 ++++++++++- .../Compiler/Text/Updater/Built/HereString.cs | 59 +++++++ 6 files changed, 293 insertions(+), 5 deletions(-) create mode 100644 tests/Compiler/Analyser/Analyser.cs create mode 100644 tests/Compiler/Analyser/Issue.cs create mode 100644 tests/Compiler/Analyser/Rules/UseOfUnknownFunction.cs create mode 100644 tests/Compiler/Analyser/Suppression.cs create mode 100644 tests/Compiler/Text/Updater/Built/HereString.cs diff --git a/tests/Compiler/Analyser/Analyser.cs b/tests/Compiler/Analyser/Analyser.cs new file mode 100644 index 00000000..e69de29b diff --git a/tests/Compiler/Analyser/Issue.cs b/tests/Compiler/Analyser/Issue.cs new file mode 100644 index 00000000..e69de29b diff --git a/tests/Compiler/Analyser/Rules/UseOfUnknownFunction.cs b/tests/Compiler/Analyser/Rules/UseOfUnknownFunction.cs new file mode 100644 index 00000000..0bcb6a2b --- /dev/null +++ b/tests/Compiler/Analyser/Rules/UseOfUnknownFunction.cs @@ -0,0 +1,4 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +namespace Compiler.Test.Analyser.Rules; diff --git a/tests/Compiler/Analyser/Suppression.cs b/tests/Compiler/Analyser/Suppression.cs new file mode 100644 index 00000000..bc305612 --- /dev/null +++ b/tests/Compiler/Analyser/Suppression.cs @@ -0,0 +1,145 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using System.Management.Automation.Language; +using Compiler.Analyser; +using Compiler.Analyser.Rules; + +namespace Compiler.Test.Analyser; + +[TestFixture] +public class SuppressionAttributeTests { + [TestCaseSource(typeof(TestData), nameof(TestData.NoSuppressionAttribute))] + public void FromAttributeAst_ReturnsNull(string astContent) { + var attributes = TestData.GetAttributes(astContent); + Assert.Multiple(() => { + foreach (var attribute in attributes) { + var result = SuppressAnalyserAttribute.FromAttributeAst(attribute); + Assert.That(result, Is.Null); + } + }); + } + + [TestCaseSource(typeof(TestData), nameof(TestData.SuppressionAttribute))] + public void FromAttributeAst_ReturnsSuppression(string astContent, List expected) { + var attributes = TestData.GetAttributes(astContent); + var i = 0; + foreach (var attribute in attributes) { + var result = SuppressAnalyserAttribute.FromAttributeAst(attribute); + if (result is null) continue; + Assert.Multiple(() => { + var suppression = result?.GetSupression(); + + Assert.That(suppression?.Type, Is.EqualTo(expected[i].Type)); + Assert.That(suppression?.Justification, Is.EqualTo(expected[i].Justification)); + + if (expected[i].Data is IEnumerable data and not string) { + var j = 0; + foreach (var item in data) { + Assert.That(item, Is.EqualTo(((object[])expected[i].Data!)[j])); + j++; + } + } else { + Assert.That(suppression?.Data, Is.EqualTo(expected[i].Data)); + } + }); + i++; + } + } + + private static class TestData { + public static IEnumerable NoSuppressionAttribute { + get { + yield return new TestCaseData(""" + [CmdletBinding()] + param() + """); + + yield return new TestCaseData(""" + function Test-Function { + param() + } + """); + + yield return new TestCaseData(""" + function Test-Function { + [CmdletBinding()] + [OutputType()] + [Alias('Test')] + param() + } + """); + } + } + + public static IEnumerable SuppressionAttribute { + get { + yield return new TestCaseData(""" + [SuppressAnalyser('UseOfUndefinedFunction', 'Function', 'Justification')] + param() + """, + new List { + new(typeof(UseOfUndefinedFunction), "Function", "Justification") + }); + + yield return new TestCaseData(""" + function Test-Function { + [CmdletBinding()] + [OutputType()] + [Alias('Test')] + [SuppressAnalyser('UseOfUndefinedFunction', 'Certain-Function', 'Justification')] + param() + } + """, + new List { + new(typeof(UseOfUndefinedFunction), "Certain-Function", "Justification") + }); + + yield return new TestCaseData(""" + function Test-Function { + [SuppressAnalyser('UseOfUndefinedFunction', 'This-Function', 'This Justification')] + [SuppressAnalyser('UseOfUndefinedFunction', 'That-Function', 'That Justification')] + param() + } + """, + new List { + new(typeof(UseOfUndefinedFunction), "This-Function", "This Justification"), + new(typeof(UseOfUndefinedFunction), "That-Function", "That Justification") + }); + + yield return new TestCaseData(""" + function Test-Function { + [SuppressAnalyser('UseOfUndefinedFunction', ('This-Function', 'That-Function'), 'This and That Justification')] + param() + } + """, + new List { + new(typeof(UseOfUndefinedFunction), new object[] { "This-Function", "That-Function" }, "This and That Justification") + }); + + yield return new TestCaseData(""" + function Test-Function { + [SuppressAnalyser('UseOfUndefinedFunction', 'This-Function', 'This Justification')] + [SuppressAnalyserAttribute('UseOfUndefinedFunction', 'That-Function', 'That Justification')] + [Compiler.Analyser.SuppressAnalyser('UseOfUndefinedFunction', 'Other-Function', 'Other Justification')] + [Compiler.Analyser.SuppressAnalyserAttribute('UseOfUndefinedFunction', 'Another-Function', 'Another Justification')] + param() + } + """, + new List { + new(typeof(UseOfUndefinedFunction), "This-Function", "This Justification"), + new(typeof(UseOfUndefinedFunction), "That-Function", "That Justification"), + new(typeof(UseOfUndefinedFunction), "Other-Function", "Other Justification"), + new(typeof(UseOfUndefinedFunction), "Another-Function", "Another Justification") + }); + } + } + + public static IEnumerable GetAttributes(string astContent) { + var ast = Parser.ParseInput(astContent, out _, out var errors); + Assert.That(errors, Is.Empty); + return ast.FindAll(ast => ast is AttributeAst, true).Cast(); + } + } +} diff --git a/tests/Compiler/AstHelper.cs b/tests/Compiler/AstHelper.cs index 56c159c9..69a9e2bc 100644 --- a/tests/Compiler/AstHelper.cs +++ b/tests/Compiler/AstHelper.cs @@ -4,11 +4,10 @@ using Compiler.Analyser; using LanguageExt; using LanguageExt.Common; -using LanguageExt.UnsafeValueAccess; -using Microsoft.PowerShell.Commands; using System.Collections; -using System.Management.Automation; +using System.Globalization; using System.Management.Automation.Language; +using System.Text; namespace Compiler.Test; @@ -88,11 +87,28 @@ bool onlyExported Assert.Multiple(() => { Assert.That(result, Is.Not.Null); Assert.That(result, Has.Count.EqualTo(expectedFunctions.Count())); - Assert.That(result, Has.All.Matches(function => expectedFunctions.Contains(function.Name))); }); } + + [TestCaseSource(typeof(TestData.AstFinder), nameof(TestData.AstFinder.Aliases))] + public void FindAvailableAliases( + string astContent, + IEnumerable expectedAliases, + bool onlyExported + ) { + Console.WriteLine(astContent); + var ast = AstHelper.GetAstReportingErrors(astContent, [], []).ThrowIfFail(); + var result = AstHelper.FindAvailableAliases(ast, onlyExported); + + Assert.Multiple(() => { + Assert.That(result, Is.Not.Null); + Assert.That(result.Count(), Is.EqualTo(expectedAliases.Count())); + Assert.That(result, Is.EquivalentTo(expectedAliases)); + }); + } + [TestCaseSource(typeof(TestData.AstFinder), nameof(TestData.AstFinder.Namespaces))] public void FindDeclaredNamespaces( string astContent, @@ -327,7 +343,6 @@ public static IEnumerable Data { } } - internal static class AstParser { private static readonly string[] SupressArgs = ["ModuleNotFoundDuringParse"]; @@ -447,6 +462,71 @@ function Test-Function3 { } } } + public static IEnumerable Aliases { + get { + var templateByFunction = /*ps1*/ """ + + """; + + var templateByAttribute = /*ps1*/ """ + + """; + + var nameTemplate = "Test-Alias{0}"; + var counts = new[] { 1, 2, 5 }; + for (var i = 0; i < counts.Length * 2; i++) { + var withExport = i % 2 == 0; + var count = counts[i / 2]; + var (byFunctionContent, expectedByFunction) = GetTemplatedData(templateByFunction, nameTemplate, count, Environment.NewLine, "Alias", withExport); + var (byAttributeContent, expectedByAttribute) = GetTemplatedData(templateByAttribute, nameTemplate, count, Environment.NewLine, "Alias", withExport); + + yield return new TestCaseData(byFunctionContent, expectedByFunction, withExport); + yield return new TestCaseData(byAttributeContent, expectedByAttribute, withExport); + } + } + } + + private static (string, IEnumerable) GetTemplatedData( + string template, + string nameTemplate, + int count, + string seperator, + string exportType, + bool withExport + ) { + var zoneStartIndex = template.IndexOf('<'); + var zoneEndIndex = template.IndexOf('>'); + + var beforeZone = template[..zoneStartIndex]; + var afterZone = ""; + if (zoneEndIndex != -1 && zoneEndIndex < template.Length) afterZone = template[(zoneEndIndex + 1)..]; + + var copyableZone = template[(zoneStartIndex + 1)..template.LastIndexOf('>')]; + + var exportNames = new List(); + var data = new StringBuilder().Append(beforeZone); + for (var i = 0; i < count; i++) { + var name = nameTemplate.Replace("{0}", i.ToString(CultureInfo.InvariantCulture)); + data.Append(copyableZone.Replace("{name}", name).Replace("{0}", i.ToString(CultureInfo.InvariantCulture))); + if (i != count - 1) data.Append(seperator); + + exportNames.Add(name); + } + + data.Append(afterZone); + + if (withExport) { + data.AppendLine(); + data.Append("Export-ModuleMember -").Append(exportType).Append(' '); + data.AppendJoin(',', exportNames); + } + + return (data.ToString(), exportNames); + } + public static IEnumerable Namespaces { get { var singleNamespace = /*ps1*/ """ diff --git a/tests/Compiler/Text/Updater/Built/HereString.cs b/tests/Compiler/Text/Updater/Built/HereString.cs new file mode 100644 index 00000000..a40802aa --- /dev/null +++ b/tests/Compiler/Text/Updater/Built/HereString.cs @@ -0,0 +1,59 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using System.Management.Automation.Language; +using Compiler.Text.Updater.Built; + +namespace Compiler.Test.Text.Updater.Built; + +public class HereStringUpdaterTests { + [TestCaseSource(typeof(TestData), nameof(TestData.Data))] + public string InternalApply_UpdatesHereStrings(string astContent) { + var ast = AstHelper.GetAstReportingErrors(astContent, default, []).Unwrap().Find(ast => ast is StringConstantExpressionAst, false)!; + var result = HereStringUpdater.InternalApply(ast); + + Assert.That(result, Is.Not.Null.Or.Empty); + return string.Join('\n', result); + } + + private static class TestData { + public static IEnumerable Data { + get { + yield return new TestCaseData(""" + @' + Here-string + '@ + """).Returns(""" + @" + Here-string + "@ + """); + + yield return new TestCaseData(""" + @" + Here-string + "@ + """).Returns(""" + @" + Here-string + "@ + """); + + yield return new TestCaseData(""" + @" + @' + what looks like a nested here-string but isn't! + '@ + "@ + """).Returns(""" + @" + @' + what looks like a nested here-string but isn't! + '@ + "@ + """); + } + } + } +} From 28d69f1152101bc2a9c5d2d9c6648ba9b1b9c950 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 13 Sep 2024 12:56:53 +1000 Subject: [PATCH 147/341] refactor(Compiler): Implement checking for aliases in UseOfUndefinedFunction.cs Also, update the CompiledLocalModule class in the Module/Compiled/Local.cs file to include aliases in the list of exported functions. --- .../Analyser/Rules/UseOfUndefinedFunction.cs | 4 +- src/Compiler/AstHelper.cs | 73 +++++++++++++++---- src/Compiler/Module/Compiled/Local.cs | 8 +- src/Compiler/Program.cs | 2 +- 4 files changed, 70 insertions(+), 17 deletions(-) diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index cfeab527..1fc8d85d 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -43,12 +43,14 @@ public override IEnumerable Analyse( IEnumerable importedModules) { var commandAst = (CommandAst)node; var callName = SanatiseName(commandAst.GetCommandName()); + if (BuiltinsFunctions.Contains(callName)) yield break; if (AstHelper.FindAvailableFunctions(AstHelper.FindRoot(node), false).Select(definition => SanatiseName(definition.Name)).Contains(callName)) yield break; + if (AstHelper.FindAvailableAliases(AstHelper.FindRoot(node), false).Select(SanatiseName).Contains(callName)) yield break; if (importedModules.Any(module => module.GetExportedFunctions().Select(SanatiseName).Contains(callName))) yield break; yield return Issue.Warning( - $"Undefined function '{callName}'", + $"Undefined function '{commandAst.GetCommandName()}'", commandAst.CommandElements[0].Extent, commandAst ); diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index bd7cc9b6..9a7cbe57 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Management.Automation; using System.Management.Automation.Language; using System.Text; using Compiler.Analyser; @@ -89,47 +90,93 @@ public static List FindAvailableFunctions(Ast ast, bool o .ToList(); // Short circuit so we don't have to do any more work if we are not filtering for only exported functions. - if (!onlyExported) { - return allDefinedFunctions; - } + if (!onlyExported) return allDefinedFunctions; + + return [.. GetWantedExports(ast, "Function", allDefinedFunctions, function => NameWithoutNamespace(function.Name))]; + } + + public static IEnumerable FindAvailableAliases(Ast ast, bool onlyExported) { + var allAstFunctionCalls = ast + .FindAll(testAst => testAst is CommandAst commandAst && commandAst.CommandElements[0].Extent.Text is "Set-Alias" or "New-Alias", true) + .Cast() + .ToList(); + + var allFunctionsWithAliases = ast + .FindAll(testAst => testAst is FunctionDefinitionAst, true) + .Cast() + .Where(functionDefinition => functionDefinition.Body.ParamBlock.Attributes.Any(attribute => attribute.TypeName.GetReflectionType() == typeof(AliasAttribute))); + + var availableAliases = new List(); + var attributeType = typeof(AliasAttribute); + availableAliases.AddRange(allFunctionsWithAliases.SelectMany(function => function.Body.ParamBlock.Attributes + .Where(attribute => attribute.TypeName.GetReflectionAttributeType() == attributeType) + .SelectMany(attribute => { + var aliasesObject = attribute.NamedArguments.FirstOrDefault(namedArg => namedArg.ArgumentName is "aliasNames")?.Argument + ?? attribute.PositionalArguments.FirstOrDefault(); + + return aliasesObject switch { + ArrayLiteralAst arrayLiteralAst => arrayLiteralAst.Elements.Select(element => element.SafeGetValue()).Cast(), + StringConstantExpressionAst stringConstantAst => [stringConstantAst.Value], + _ => [], + }; + }) + )); + + availableAliases.AddRange(allAstFunctionCalls.SelectMany(static commandAst => commandAst.CommandElements + .Where(static commandElement => commandElement is CommandParameterAst) + .Cast() + .Where(static param => param.ParameterName == "Name") + .Select(param => { + var value = param.Argument ?? commandAst.CommandElements[commandAst.CommandElements.IndexOf(param) + 1] as ExpressionAst; + return value switch { + StringConstantExpressionAst stringConstantAst => stringConstantAst.Value, + _ => null + }; + }) + .Where(static alias => !string.IsNullOrWhiteSpace(alias)) + .Cast() + // .Select(static ast => ast.Value) + )); + + if (!onlyExported) return availableAliases; + + return GetWantedExports(ast, "Alias", availableAliases, NameWithoutNamespace); + } + private static IEnumerable GetWantedExports(Ast ast, string kind, IEnumerable availableItems, Func getName) { var exportCommands = ast.FindAll(testAst => testAst is CommandAst commandAst && commandAst.CommandElements[0].Extent.Text == "Export-ModuleMember", true ).Cast(); // If there are no Export-ModuleMember commands, we are exporting everything. if (!exportCommands.Any()) { - return allDefinedFunctions; + return availableItems; } - var wantingToExport = new List<(string, IEnumerable)>(); + var wantingToExport = new List(); foreach (var exportCommand in exportCommands) { // TODO - Support unnamed export param eg `Export-ModuleMember *` var namedParameters = exportCommand.CommandElements .Where(commandElement => commandElement is CommandParameterAst) .Cast() - .Where(param => param.ParameterName is "Function" or "Alias"); + .Where(param => param.ParameterName.Equals(kind, StringComparison.OrdinalIgnoreCase)); foreach (var namedParameter in namedParameters) { var value = namedParameter.Argument ?? exportCommand.CommandElements[exportCommand.CommandElements.IndexOf(namedParameter) + 1] as ExpressionAst; var objects = value switch { - StringConstantExpressionAst starAst when starAst.Value == "*" => allDefinedFunctions.Select(function => NameWithoutNamespace(function.Name)), + StringConstantExpressionAst starAst when starAst.Value == "*" => availableItems.Select(getName), StringConstantExpressionAst stringConstantAst => [stringConstantAst.Value], ArrayLiteralAst arrayLiteralAst => arrayLiteralAst.Elements.Select(element => element.SafeGetValue()), _ => [], // We don't know what to do with this value, so we will just ignore it. }; - wantingToExport.Add((namedParameter.ParameterName, objects.Cast())); + wantingToExport.AddRange(objects.Cast()); } } - return allDefinedFunctions.Where(function => { - return wantingToExport.Any(wanting => - wanting.Item2.Contains(NameWithoutNamespace(function.Name)) - ); - }).ToList(); + return availableItems.Where(item => wantingToExport.Contains(getName(item))); } /// diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index 163450a7..439dbcaa 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -45,6 +45,10 @@ RequirementGroup requirements .ToString(); [ExcludeFromCodeCoverage(Justification = "We don't need to test this, as it's just a wrapper.")] - public override IEnumerable GetExportedFunctions() => - AstHelper.FindAvailableFunctions(this.Document.Ast, true).Select(function => function.Name); + public override IEnumerable GetExportedFunctions() { + var exported = new List(); + exported.AddRange(AstHelper.FindAvailableFunctions(this.Document.Ast, true).Select(function => function.Name)); + exported.AddRange(AstHelper.FindAvailableAliases(this.Document.Ast, true)); + return exported; + } } diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 3d340cc4..89b1ce55 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -38,7 +38,7 @@ public class Program { var rsPool = RunspaceFactory.CreateRunspacePool(sessionState); rsPool.SetMinRunspaces(1); - rsPool.SetMaxRunspaces(5); + rsPool.SetMaxRunspaces(10); rsPool.Open(); return rsPool; }); From ac925b4ecbc03d065cfedf8cc5d49fe671f3b945 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 13 Sep 2024 12:59:37 +1000 Subject: [PATCH 148/341] fix: Fixup modules for use with new compiler --- src/common/PSStyle.psm1 | 9 +++---- src/common/Scope.psm1 | 4 +-- src/common/Utils.psm1 | 4 ++- src/hudu/Common.psm1 | 1 + src/hudu/Database.ps1 | 9 ++++--- src/hudu/Update-Entra-Integration.ps1 | 2 -- src/microsoft/Common.psm1 | 18 +++++++------ src/microsoft/Security.ps1 | 6 ++--- src/microsoft/admin/Update-DKIM.ps1 | 4 +-- .../entra/Disable-EnterpriseUserConsent.ps1 | 2 +- src/microsoft/entra/Get-MFAChanges.ps1 | 3 +-- src/microsoft/entra/New-User.ps1 | 2 +- src/microsoft/entra/StaffLocation.ps1 | 14 ++++++----- src/microsoft/intune/Setup.ps1 | 4 +-- src/microsoft/reports/Exchange.ps1 | 2 +- src/microsoft/security/ConditonalAccess.ps1 | 4 +-- src/microsoft/security/Exchange.ps1 | 5 +++- src/microsoft/security/Retention.ps1 | 8 +++--- src/microsoft/security/Setup-Alerts.ps1 | 6 ++++- src/microsoft/windows/AutoSetup.ps1 | 13 +++++----- .../windows/Extract-DownloadedTo.ps1 | 5 +++- src/microsoft/windows/Invoke-Downloadable.ps1 | 10 +++++--- .../windows/Repair-WMIRepository.ps1 | 5 +++- src/microsoft/windows/Setup-Printer.ps1 | 25 +++++++++++-------- src/microsoft/windows/Setup-Wireguard.ps1 | 5 +++- src/misc/Setup-SecretManagement.ps1 | 2 +- src/n-sight/cleaners/Update.ps1 | 5 +++- 27 files changed, 103 insertions(+), 74 deletions(-) diff --git a/src/common/PSStyle.psm1 b/src/common/PSStyle.psm1 index 9ebf6889..b946aca7 100644 --- a/src/common/PSStyle.psm1 +++ b/src/common/PSStyle.psm1 @@ -190,8 +190,7 @@ class PSStyle { } if ($isBackground) { return [PSStyle]::BackgroundColorMap[$index] - } - else { + } else { return [PSStyle]::ForegroundColorMap[$index] } } @@ -226,8 +225,7 @@ class PSStyle { function Get-ConsoleColour([Parameter(Mandatory)][System.ConsoleColor]$Colour) { if ($Below7_2) { [PSStyle]::MapForegroundColorToEscapeSequence($Colour) - } - else { + } else { $PSStyle.Foreground.FromConsoleColor($Colour) } } @@ -236,7 +234,6 @@ function Get-ConsoleColour([Parameter(Mandatory)][System.ConsoleColor]$Colour) { if ($PSVersionTable.PSVersion.Major -lt 7 -or $PSVersionTable.PSVersion.Minor -lt 2) { $PSStyle = [PSStyle]::new() Export-ModuleMember -Variable PSStyle -Function Get-ConsoleColour; -} -else { +} else { Export-ModuleMember -Function Get-ConsoleColour; } diff --git a/src/common/Scope.psm1 b/src/common/Scope.psm1 index 31ee389a..85584dab 100644 --- a/src/common/Scope.psm1 +++ b/src/common/Scope.psm1 @@ -11,7 +11,6 @@ function Get-Stack { } function Get-StackTop { - ; return (Get-Stack).Peek() } @@ -102,8 +101,7 @@ $Local:EndingIndent} default { if ($null -ne $Formatter) { $Formatter.InvokeWithContext($null, [PSVariable]::new('_', $Value)); - } - else { + } else { $Value; } diff --git a/src/common/Utils.psm1 b/src/common/Utils.psm1 index 8ba39f92..7b2513a7 100644 --- a/src/common/Utils.psm1 +++ b/src/common/Utils.psm1 @@ -1186,4 +1186,6 @@ function Test-IsWindows11 { return $Private:OSCaption -match 'Windows 11'; } -Export-ModuleMember -Function Test-IsWindows11, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Export-Types, Add-ModuleCallback, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag -Alias await, async, lazy; +Export-ModuleMember ` + -Function Test-IsWindows11, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Export-Types, Add-ModuleCallback, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag ` + -Alias await, async, lazy; diff --git a/src/hudu/Common.psm1 b/src/hudu/Common.psm1 index 0c83e683..4ea9a632 100644 --- a/src/hudu/Common.psm1 +++ b/src/hudu/Common.psm1 @@ -2,6 +2,7 @@ Using module ../common/Logging.psm1 Using module ../common/Scope.psm1 Using module ../common/Input.psm1 Using module ../common/Exit.psm1 +Using module ../common/Utils.psm1 function Get-HuduApiKey { begin { Enter-Scope; } diff --git a/src/hudu/Database.ps1 b/src/hudu/Database.ps1 index cc090d99..0a1d29d9 100644 --- a/src/hudu/Database.ps1 +++ b/src/hudu/Database.ps1 @@ -1,6 +1,7 @@ Using module ../common/Environment.psm1 Using module ../common/Logging.psm1 Using module ../common/Input.psm1 +Using module ../common/Utils.psm1 Using module ./Common.psm1 [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Update')] @@ -36,8 +37,8 @@ function New-HuduDatabase { $Local:BitwardenItems = $Local:BitWardenItems | await; $Local:DisplayItems = $Local:BitwardenItems ` - | Select-Object -Property name, id ` - | Sort-Object -Property name; + | Select-Object -Property name, id ` + | Sort-Object -Property name; [HashTable]$Local:Matches = @{}; foreach ($Local:Company in $Local:Companies) { @@ -61,7 +62,7 @@ function New-HuduDatabase { Invoke-RunMain $PSCmdlet { if ($PSCmdlet.ParameterSetName -eq 'Update') { - Invoke-Info "Updating companies" + Invoke-Info 'Updating companies' if (-not $Endpoint) { $Endpoint = Get-UserInput -Title 'Hudu Endpoint' -Question 'Please enter your Hudu Endpoint'; @@ -74,7 +75,7 @@ Invoke-RunMain $PSCmdlet { # TODO :: Create update function if there is an existing file. New-HuduDatabase -Database "$Database/matched-companies.json" -Endpoint $Endpoint; } else { - Invoke-Info "Invoking existing companies"; + Invoke-Info 'Invoking existing companies'; # Invoke-EnsureModule -Modules "$PSScriptRoot/Existing.psm1"; # Invoke-Existing-Company -Database $Database; diff --git a/src/hudu/Update-Entra-Integration.ps1 b/src/hudu/Update-Entra-Integration.ps1 index 71d277a4..7dc86aad 100644 --- a/src/hudu/Update-Entra-Integration.ps1 +++ b/src/hudu/Update-Entra-Integration.ps1 @@ -36,8 +36,6 @@ function Remove-OldSecrets { } -# Invoke-Init; -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { [String]$Local:HuduKey = Get-VarOrSave -VariableName 'HUDU_KEY' -LazyValue { $Local:Input = Get-UserInput -Title 'Hudu API Key' -Question 'Please enter your Hudu API Key'; diff --git a/src/microsoft/Common.psm1 b/src/microsoft/Common.psm1 index 4e1db688..a6e77ae8 100644 --- a/src/microsoft/Common.psm1 +++ b/src/microsoft/Common.psm1 @@ -1,9 +1,13 @@ -Using Module Microsoft.Graph.Authentication; -Using Module Microsoft.Graph.Identity.DirectoryManagement; -Using Module Microsoft.Graph.Users; -Using Module ExchangeOnlineManagement; +Using Module Microsoft.Graph.Authentication +Using Module Microsoft.Graph.Identity.DirectoryManagement +Using Module Microsoft.Graph.Users +Using Module ExchangeOnlineManagement -Using namespace Microsoft.Graph.PowerShell.Models; +Using Module ..\common\Logging.psm1 +Using Module ..\common\Scope.psm1 +Using Module ..\common\Connection.psm1 + +Using namespace Microsoft.Graph.PowerShell.Models Function Get-PrimaryDomain { Get-MgDomain | Where-Object { $_.IsDefault -eq $True }; @@ -20,10 +24,10 @@ function Get-AlertsUser { process { Trap { - Invoke-Warn @" + Invoke-Warn @' There was an error during the creation of the Alerts user. If a new mailbox was created, please ensure that the user account is correctly disabled at the least. -"@; +'@; Write-Error -ErrorRecord $_; return $null; } diff --git a/src/microsoft/Security.ps1 b/src/microsoft/Security.ps1 index c94b74ec..df764200 100644 --- a/src/microsoft/Security.ps1 +++ b/src/microsoft/Security.ps1 @@ -1,6 +1,6 @@ -Using module ../../common/Environment.psm1 -Using module ../../common/Connect.psm1 -Using module ./Common.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Connection.psm1 +Using module .\Common.psm1 Using module Microsoft.Online.SharePoint.PowerShell Param( diff --git a/src/microsoft/admin/Update-DKIM.ps1 b/src/microsoft/admin/Update-DKIM.ps1 index b8fb1dd5..fd1d8a22 100644 --- a/src/microsoft/admin/Update-DKIM.ps1 +++ b/src/microsoft/admin/Update-DKIM.ps1 @@ -1,10 +1,10 @@ #Requires -Version 7.1 Using module ../../common/Environment.psm1 -Using module ../../common/Connect.psm1 +Using module ../../common/Connection.psm1 Using module Microsoft.Graph.Identity.DirectoryManagement -Using namespace Microsoft.Graph.PowerShell.Models; +Using namespace Microsoft.Graph.PowerShell.Models # foreach ($domain in $domains) { # # Get the domain name diff --git a/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 b/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 index a84e2252..315b22db 100644 --- a/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 +++ b/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 @@ -1,5 +1,5 @@ Using module ../../common/Environment.psm1 -Using module ../../common/Connect.psm1 +Using module ../../common/Connection.psm1 Using module Microsoft.Graph.Identity.SignIns function Disable-EnterpriseConsent_UserConsent { diff --git a/src/microsoft/entra/Get-MFAChanges.ps1 b/src/microsoft/entra/Get-MFAChanges.ps1 index 8cbf71ab..99042e98 100644 --- a/src/microsoft/entra/Get-MFAChanges.ps1 +++ b/src/microsoft/entra/Get-MFAChanges.ps1 @@ -1,7 +1,7 @@ #Requires -Version 5.1 Using module ../../common/Environment.psm1 -Using module ../../common/Connect.psm1 +Using module ../../common/Connection.psm1 Using module ../../common/Logging.psm1 Using module ../../common/Ensure.psm1 Using module ../../common/Scope.psm1 @@ -771,7 +771,6 @@ function Save-Excel([OfficeOpenXml.ExcelPackage]$ExcelData) { } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { if (-not $ClientsFolder) { [String[]]$Local:PossiblePaths = @( diff --git a/src/microsoft/entra/New-User.ps1 b/src/microsoft/entra/New-User.ps1 index f92f4742..b0b93bdc 100644 --- a/src/microsoft/entra/New-User.ps1 +++ b/src/microsoft/entra/New-User.ps1 @@ -1,5 +1,5 @@ Using module ../../common/Environment.psm1 -Using module ../../common/Connect.psm1 +Using module ../../common/Connection.psm1 Using module ../../common/Input.psm1 Using module Microsoft.Graph.Identity.DirectoryManagement diff --git a/src/microsoft/entra/StaffLocation.ps1 b/src/microsoft/entra/StaffLocation.ps1 index 1e204251..6bd5a8b3 100644 --- a/src/microsoft/entra/StaffLocation.ps1 +++ b/src/microsoft/entra/StaffLocation.ps1 @@ -11,12 +11,15 @@ - Intune Device Configuration Profile (Optional) #> -Using module Microsoft.Graph.Identity.SignIns; -Using module Microsoft.Graph.Authentication; -Using module Microsoft.Graph.Groups; +Using module Microsoft.Graph.Identity.SignIns +Using module Microsoft.Graph.Authentication +Using module Microsoft.Graph.Groups -Using namespace Microsoft.Graph.PowerShell.Models; -Using namespace System.Management.Automation; +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 + +Using namespace Microsoft.Graph.PowerShell.Models +Using namespace System.Management.Automation [CmdletBinding()] param() @@ -241,7 +244,6 @@ function Set-ConditionalAccessPolicy { }; # Register-ArgumentCompleter -CommandName:($PSCommandPath | Split-Path -Leaf) -ScriptBlock $Local:ScriptBlock -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet -Main:$Local:ScriptBlock; dynamicparam { diff --git a/src/microsoft/intune/Setup.ps1 b/src/microsoft/intune/Setup.ps1 index f2b5a36d..f01175f6 100644 --- a/src/microsoft/intune/Setup.ps1 +++ b/src/microsoft/intune/Setup.ps1 @@ -5,7 +5,7 @@ Using module ../../common/Environment.psm1 Using module ../../common/Logging.psm1 -Using module ../../common/Connect.psm1 +Using module ../../common/Connection.psm1 Using module ../../common/Scope.psm1 Using module ../../common/Exit.psm1 @@ -13,7 +13,7 @@ Using module Microsoft.Graph.Authentication Using module Microsoft.Graph.Beta.DeviceManagement Using module Microsoft.Graph.Beta.Groups -using namespace Microsoft.Graph.Beta.PowerShell.Models; +using namespace Microsoft.Graph.Beta.PowerShell.Models [CmdletBinding()] param() diff --git a/src/microsoft/reports/Exchange.ps1 b/src/microsoft/reports/Exchange.ps1 index 013e7185..229e741b 100644 --- a/src/microsoft/reports/Exchange.ps1 +++ b/src/microsoft/reports/Exchange.ps1 @@ -1,5 +1,5 @@ Using module ../../common/Environment.psm1 -Using module ../../common/Connect.psm1 +Using module ../../common/Connection.psm1 Using module ExchangeOnlineManagement function Get-SharedMailboxes { diff --git a/src/microsoft/security/ConditonalAccess.ps1 b/src/microsoft/security/ConditonalAccess.ps1 index 374dd744..d5f6ff02 100644 --- a/src/microsoft/security/ConditonalAccess.ps1 +++ b/src/microsoft/security/ConditonalAccess.ps1 @@ -1,6 +1,8 @@ #Requires -Version 5.1 #Requires -Modules AzureADPreview +Using module ..\..\common\Environment.psm1 + function New-Condition_AllCloudApps( [Parameter(Mandatory)] [Microsoft.Open.MSGraph.Model.ConditionalAccessConditionSet]$Conditions @@ -108,8 +110,6 @@ function New-ConditionalAccessPrivilegedIdentityManagementPolicy { New-AzureADMSConditionalAccessPolicy -DisplayName $Local:PolicyName -State 'Enabled' -Conditions $Local:Conditions -GrantControls $Local:GrantControls -SessionControls $Local:SessionControls -ErrorAction Stop | Out-Null } - -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service AzureAD; }; diff --git a/src/microsoft/security/Exchange.ps1 b/src/microsoft/security/Exchange.ps1 index 99f05a8e..8ac6f6ca 100644 --- a/src/microsoft/security/Exchange.ps1 +++ b/src/microsoft/security/Exchange.ps1 @@ -1,5 +1,9 @@ #Requires -Modules ExchangeOnlineManagement +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 + Param( [Parameter(Mandatory)] [ValidateSet('MailBox', 'Policies', 'Outlook')] @@ -281,7 +285,6 @@ function Update-AntiMalwarePolicy { #endregion - Policies -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service -Service ExchangeOnline; diff --git a/src/microsoft/security/Retention.ps1 b/src/microsoft/security/Retention.ps1 index 0a443eb6..c131eb62 100644 --- a/src/microsoft/security/Retention.ps1 +++ b/src/microsoft/security/Retention.ps1 @@ -1,12 +1,14 @@ #Requires -Version 5.1 #Requires -Modules ExchangeOnlineManagement +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 + [String]$Script:RetentionPolicy = 'Log Retention Policy'; [String]$Script:RetentionPolicyDescription = 'One year retention policy for all activities'; [String]$Script:RetentionPolicyDuration = 'TwelveMonths'; [String[]]$Script:RentionPolicyRecordTypes = @('ExchangeAdmin', 'ExchangeItem', 'ExchangeItemGroup', 'SharePoint', 'SyntheticProbe', 'SharePointFileOperation', 'OneDrive', 'AzureActiveDirectory', 'AzureActiveDirectoryAccountLogon', 'DataCenterSecurityCmdlet', 'ComplianceDLPSharePoint', 'Sway', 'ComplianceDLPExchange', 'SharePointSharingOperation', 'AzureActiveDirectoryStsLogon', 'SkypeForBusinessPSTNUsage', 'SkypeForBusinessUsersBlocked', 'SecurityComplianceCenterEOPCmdlet', 'ExchangeAggregatedOperation', 'PowerBIAudit', 'CRM', 'Yammer', 'SkypeForBusinessCmdlets', 'Discovery', 'MicrosoftTeams', 'ThreatIntelligence', 'MailSubmission', 'MicrosoftFlow', 'AeD', 'MicrosoftStream', 'ComplianceDLPSharePointClassification', 'ThreatFinder', 'Project', 'SharePointListOperation', 'SharePointCommentOperation', 'DataGovernance', 'Kaizala', 'SecurityComplianceAlerts', 'ThreatIntelligenceUrl', 'SecurityComplianceInsights', 'MIPLabel', 'WorkplaceAnalytics', 'PowerAppsApp', 'PowerAppsPlan', 'ThreatIntelligenceAtpContent', 'LabelContentExplorer', 'TeamsHealthcare', 'ExchangeItemAggregated', 'HygieneEvent', 'DataInsightsRestApiAudit', 'InformationBarrierPolicyApplication', 'SharePointListItemOperation', 'SharePointContentTypeOperation', 'SharePointFieldOperation', 'MicrosoftTeamsAdmin', 'HRSignal', 'MicrosoftTeamsDevice', 'MicrosoftTeamsAnalytics', 'InformationWorkerProtection', 'Campaign', 'DLPEndpoint', 'AirInvestigation', 'Quarantine', 'MicrosoftForms', 'ApplicationAudit', 'ComplianceSupervisionExchange', 'CustomerKeyServiceEncryption', 'OfficeNative', 'MipAutoLabelSharePointItem', 'MipAutoLabelSharePointPolicyLocation', 'MicrosoftTeamsShifts', 'SecureScore', 'MipAutoLabelExchangeItem', 'CortanaBriefing', 'Search', 'WDATPAlerts', 'PowerPlatformAdminDlp', 'PowerPlatformAdminEnvironment', 'MDATPAudit', 'SensitivityLabelPolicyMatch', 'SensitivityLabelAction', 'SensitivityLabeledFileAction', 'AttackSim', 'AirManualInvestigation', 'SecurityComplianceRBAC', 'UserTraining', 'AirAdminActionInvestigation', 'MSTIC', 'PhysicalBadgingSignal', 'TeamsEasyApprovals', 'AipDiscover', 'AipSensitivityLabelAction', 'AipProtectionAction', 'AipFileDeleted', 'AipHeartBeat', 'MCASAlerts', 'OnPremisesFileShareScannerDlp', 'OnPremisesSharePointScannerDlp', 'ExchangeSearch', 'SharePointSearch', 'PrivacyDataMinimization', 'LabelAnalyticsAggregate', 'MyAnalyticsSettings', 'SecurityComplianceUserChange', 'ComplianceDLPExchangeClassification', 'ComplianceDLPEndpoint', 'MipExactDataMatch', 'MSDEResponseActions', 'MSDEGeneralSettings', 'MSDEIndicatorsSettings', 'MS365DCustomDetection', 'MSDERolesSettings', 'MAPGAlerts', 'MAPGPolicy', 'MAPGRemediation', 'PrivacyRemediationAction', 'PrivacyDigestEmail', 'MipAutoLabelSimulationProgress', 'MipAutoLabelSimulationCompletion', 'MipAutoLabelProgressFeedback', 'DlpSensitiveInformationType', 'MipAutoLabelSimulationStatistics', 'LargeContentMetadata', 'Microsoft365Group', 'CDPMlInferencingResult', 'FilteringMailMetadata', 'CDPClassificationMailItem', 'CDPClassificationDocument', 'OfficeScriptsRunAction', 'FilteringPostMailDeliveryAction', 'CDPUnifiedFeedback', 'TenantAllowBlockList', 'ConsumptionResource', 'HealthcareSignal', 'DlpImportResult', 'CDPCompliancePolicyExecution', 'MultiStageDisposition', 'PrivacyDataMatch', 'FilteringDocMetadata', 'FilteringEmailFeatures', 'PowerBIDlp', 'FilteringUrlInfo', 'FilteringAttachmentInfo', 'CoreReportingSettings', 'ComplianceConnector', 'PowerPlatformLockboxResourceAccessRequest', 'PowerPlatformLockboxResourceCommand', 'CDPPredictiveCodingLabel', 'CDPCompliancePolicyUserFeedback', 'WebpageActivityEndpoint', 'OMEPortal', 'CMImprovementActionChange', 'FilteringUrlClick', 'MipLabelAnalyticsAuditRecord', 'FilteringEntityEvent', 'FilteringRuleHits', 'FilteringMailSubmission', 'LabelExplorer', 'MicrosoftManagedServicePlatform', 'PowerPlatformServiceActivity', 'ScorePlatformGenericAuditRecord', 'FilteringTimeTravelDocMetadata', 'Alert', 'AlertStatus', 'AlertIncident', 'IncidentStatus', 'Case', 'CaseInvestigation', 'RecordsManagement', 'PrivacyRemediation', 'DataShareOperation', 'CdpDlpSensitive', 'EHRConnector', 'FilteringMailGradingResult', 'PublicFolder', 'PrivacyTenantAuditHistoryRecord', 'AipScannerDiscoverEvent', 'EduDataLakeDownloadOperation', 'M365ComplianceConnector', 'MicrosoftGraphDataConnectOperation', 'MicrosoftPurview', 'FilteringEmailContentFeatures', 'PowerPagesSite', 'PowerAppsResource', 'PlannerPlan', 'PlannerCopyPlan', 'PlannerTask', 'PlannerRoster', 'PlannerPlanList', 'PlannerTaskList', 'PlannerTenantSettings', 'ProjectForTheWebProject', 'ProjectForTheWebTask', 'ProjectForTheWebRoadmap', 'ProjectForTheWebRoadmapItem', 'ProjectForTheWebProjectSettings', 'ProjectForTheWebRoadmapSettings', 'QuarantineMetadata', 'MicrosoftTodoAudit', 'TimeTravelFilteringDocMetadata', 'TeamsQuarantineMetadata', 'SharePointAppPermissionOperation', 'MicrosoftTeamsSensitivityLabelAction', 'FilteringTeamsMetadata', 'FilteringTeamsUrlInfo', 'FilteringTeamsPostDeliveryAction', 'MDCAssessments', 'MDCRegulatoryComplianceStandards', 'MDCRegulatoryComplianceControls', 'MDCRegulatoryComplianceAssessments', 'MDCSecurityConnectors', 'MDADataSecuritySignal', 'VivaGoals', 'FilteringRuntimeInfo', 'AttackSimAdmin', 'MicrosoftGraphDataConnectConsent', 'FilteringAtpDetonationInfo', 'PrivacyPortal', 'ManagedTenants', 'UnifiedSimulationMatchedItem', 'UnifiedSimulationSummary', 'UpdateQuarantineMetadata', 'MS365DSuppressionRule', 'PurviewDataMapOperation', 'FilteringUrlPostClickAction', 'IrmUserDefinedDetectionSignal', 'TeamsUpdates', 'PlannerRosterSensitivityLabel', 'MS365DIncident', 'FilteringDelistingMetadata', 'ComplianceDLPSharePointClassificationExtended', 'MicrosoftDefenderForIdentityAudit', 'SupervisoryReviewDayXInsight', 'DefenderExpertsforXDRAdmin', 'CDPEdgeBlockedMessage', 'HostedRpa', 'CdpContentExplorerAggregateRecord', 'CDPHygieneAttachmentInfo', 'CDPHygieneSummary', 'CDPPostMailDeliveryAction', 'CDPEmailFeatures', 'CDPHygieneUrlInfo', 'CDPUrlClick', 'CDPPackageManagerHygieneEvent', 'FilteringDocScan', 'TimeTravelFilteringDocScan', 'MAPGOnboard', 'VfamCreatePolicy', 'VfamUpdatePolicy', 'VfamDeletePolicy', 'M365DAAD', 'CdpColdCrawlStatus', 'PowerPlatformAdministratorActivity', 'Windows365CustomerLockbox', 'CdpResourceScopeChangeEvent'); -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service -Service SecurityComplience; @@ -14,7 +16,7 @@ Invoke-RunMain $PSCmdlet { $UnifiedAuditLogRetentionPolicy = Get-UnifiedAuditLogRetentionPolicy | Where-Object { $_.Name -eq $Script:RetentionPolicy }; if ($null -eq $UnifiedAuditLogRetentionPolicy) { - Info "Creating new policy..."; + Invoke-Info "Creating new policy..."; New-UnifiedAuditLogRetentionPolicy ` -Name $Script:RetentionPolicy ` @@ -25,7 +27,7 @@ Invoke-RunMain $PSCmdlet { return; } - Info "Updating existing policy..."; + Invoke-Info "Updating existing policy..."; Set-UnifiedAuditLogRetentionPolicy ` -Identity $UnifiedAuditLogRetentionPolicy.Identity ` -Description $Script:RetentionPolicyDescription ` diff --git a/src/microsoft/security/Setup-Alerts.ps1 b/src/microsoft/security/Setup-Alerts.ps1 index 0f399d36..e6cf1386 100644 --- a/src/microsoft/security/Setup-Alerts.ps1 +++ b/src/microsoft/security/Setup-Alerts.ps1 @@ -1,5 +1,10 @@ #Requires -Version 5.1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Connection.psm1 + param( [Parameter()] [Switch]$UpdatePolicies @@ -55,7 +60,6 @@ function Update-SecurityAndCompilence( } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Connect-Service -Services SecurityComplience,Graph -Scopes 'SecurityEvents.ReadWrite.All'; diff --git a/src/microsoft/windows/AutoSetup.ps1 b/src/microsoft/windows/AutoSetup.ps1 index f6871fd3..6f9f8177 100644 --- a/src/microsoft/windows/AutoSetup.ps1 +++ b/src/microsoft/windows/AutoSetup.ps1 @@ -1,11 +1,13 @@ #Requires -Version 5.1 #Requires -RunAsAdministrator -Using module ../../common/Environment.psm1; -Using module ../../common/Logging.psm1; -Using module ../../common/Scope.psm1; -Using module ../../common/Exit.psm1; -Using module PSWindowsUpdate; +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Exit.psm1 +Using module ..\..\common\Flag.psm1 + +Using module PSWindowsUpdate # Windows 10 Setup screen raw inputs # enter - Language @@ -1007,7 +1009,6 @@ function Invoke-PhaseFinish { #endregion - Phase Functions -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Register-ExitHandler -Name 'Running Flag Removal' -ExitHandler { (Get-RunningFlag).Remove(); diff --git a/src/microsoft/windows/Extract-DownloadedTo.ps1 b/src/microsoft/windows/Extract-DownloadedTo.ps1 index 7037f157..757606c4 100644 --- a/src/microsoft/windows/Extract-DownloadedTo.ps1 +++ b/src/microsoft/windows/Extract-DownloadedTo.ps1 @@ -1,3 +1,7 @@ +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 + [CmdletBinding(SupportsShouldProcess)] Param( [Parameter(Mandatory)] @@ -38,7 +42,6 @@ function Get-DownloadedItem( } } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { if (-not (Test-Path $ExtractTo)) { Invoke-Error "ExtractTo path $ExtractTo does not exist."; diff --git a/src/microsoft/windows/Invoke-Downloadable.ps1 b/src/microsoft/windows/Invoke-Downloadable.ps1 index 2b73d263..7e0c4d34 100644 --- a/src/microsoft/windows/Invoke-Downloadable.ps1 +++ b/src/microsoft/windows/Invoke-Downloadable.ps1 @@ -1,3 +1,7 @@ +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 + [CmdletBinding(SupportsShouldProcess)] Param( [Parameter(Mandatory)] @@ -18,7 +22,7 @@ function Get-Executable( [Parameter()] [String]$ExecutablePattern ) { - begin { Enter-Scope -Invocation $MyInvocation; } + begin { Enter-Scope; } end { Exit-Scope; } process { @@ -27,8 +31,7 @@ function Get-Executable( [String]$Local:Executable = $URL.Split('/')[-1]; Invoke-Info "No executable pattern specified, assuming executable is $Local:Executable"; Invoke-WebRequest -Uri $URL -OutFile $Local:Executable -UseBasicParsing; - } - else { + } else { [String]$Local:OutFolder = $URL.Split('/')[-1].Split('.')[0]; Invoke-Info "Downloading $URL to $Local:OutFolder.zip" @@ -66,7 +69,6 @@ function Invoke-Exec( } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-WithinEphemeral { [String]$Local:Executable = Get-Executable -URL:$URL -ExecutablePattern:$ExecutablePattern; diff --git a/src/microsoft/windows/Repair-WMIRepository.ps1 b/src/microsoft/windows/Repair-WMIRepository.ps1 index 6ae1f131..2881f197 100644 --- a/src/microsoft/windows/Repair-WMIRepository.ps1 +++ b/src/microsoft/windows/Repair-WMIRepository.ps1 @@ -1,3 +1,7 @@ +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Ensure.psm1 + [CmdletBinding(SupportsShouldProcess)] param( [Switch]$Nuke @@ -31,7 +35,6 @@ function Get-DependentServices { return $result } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/microsoft/windows/Setup-Printer.ps1 b/src/microsoft/windows/Setup-Printer.ps1 index 7085b14a..d29cc14c 100644 --- a/src/microsoft/windows/Setup-Printer.ps1 +++ b/src/microsoft/windows/Setup-Printer.ps1 @@ -1,5 +1,9 @@ #Requires -Version 5.1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 + Param( [Parameter(Mandatory, Position = 0, ParameterSetName = 'Default')] [Alias('Name')] @@ -21,17 +25,17 @@ Param( ")] [String]$ChocoDriver, - [Parameter(HelpMessage = " + [Parameter(HelpMessage = ' If specified, the manufacturer of the printer will be used to determine the driver to install. If not specified, the driver will be installed from the Chocolatey package. - ")] - [ValidateSet("Ricoh")] + ')] + [ValidateSet('Ricoh')] [String]$Manufacturer, - [Parameter(HelpMessage = " + [Parameter(HelpMessage = ' If specified, printer will be added even if the computer cannot contact the printer. If not specified, if the computer cannot contact the printer, the script will silently exit. - ")] + ')] [Switch]$Force ) @@ -63,14 +67,14 @@ function Install-Driver_Ricoh() { Invoke-Info "Inf file found: $($Local:InfPath.FullName)"; Invoke-Info "Inf name: $Local:InfName"; - Invoke-Info "Installing Ricoh driver..."; + Invoke-Info 'Installing Ricoh driver...'; pnputil.exe /add-driver $Local:InfPath.FullName /install | Out-Null; [String]$Local:WindowsDriverPath = 'C:\Windows\System32\DriverStore\FileRepository'; [System.IO.DirectoryInfo]$Local:DriverPath = Get-ChildItem -Path $Local:WindowsDriverPath -Filter "${Local:InfName}_*" -Recurse | Select-Object -First 1; [System.IO.FileInfo]$Local:DriverInfPath = Get-ChildItem -Path $Local:DriverPath.FullName -Filter $Local:InfName -Recurse | Select-Object -First 1; - Invoke-Info "Adding Ricoh driver to printer drivers..."; + Invoke-Info 'Adding Ricoh driver to printer drivers...'; Invoke-Info "Driver name: $DriverName"; Invoke-Info "Driver path: $($Local:DriverPath.FullName)"; Invoke-Info "Driver inf path: $($Local:DriverInfPath.FullName)"; @@ -119,7 +123,7 @@ function Install-Driver( return $DriverName; } elseif ($Manufacturer) { switch ($Manufacturer) { - "Ricoh" { Install-Driver_Ricoh; } + 'Ricoh' { Install-Driver_Ricoh; } } } else { Invoke-Info 'No chocolatey package or manufacturer specified, trying to find driver already installed.'; @@ -138,10 +142,10 @@ function Install-Driver( $Local:WaitTimeout -= $Local:ProcessingTime; if ($Local:ProcessingTime.Milliseconds -lt 1000) { - Invoke-Verbose "Processing time took less than 1 second, sleeping for the remainder of the second."; + Invoke-Verbose 'Processing time took less than 1 second, sleeping for the remainder of the second.'; Start-Sleep -Milliseconds (1000 - $Local:ProcessingTime.Milliseconds); } else { - Invoke-Verbose "Wait timeout took longer than 1 second, skipping sleep."; + Invoke-Verbose 'Wait timeout took longer than 1 second, skipping sleep.'; } } while ($Local:WaitTimeout.TotalSeconds -gt 0) @@ -202,7 +206,6 @@ function Install-PrinterImpl( } } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { [String]$Local:TrimmedPrinterName = $PrinterName.Trim(); [String]$Local:TrimmedPrinterIP = $PrinterIP.Trim(); diff --git a/src/microsoft/windows/Setup-Wireguard.ps1 b/src/microsoft/windows/Setup-Wireguard.ps1 index 96f059bd..818fcd65 100644 --- a/src/microsoft/windows/Setup-Wireguard.ps1 +++ b/src/microsoft/windows/Setup-Wireguard.ps1 @@ -1,12 +1,15 @@ #Requires -Version 5.1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Input.psm1 + [CmdletBinding(SupportsShouldProcess)] param ( [Parameter()] [String]$WireGuardPackage = 'wireguard' ) -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/misc/Setup-SecretManagement.ps1 b/src/misc/Setup-SecretManagement.ps1 index cf2c9b43..e9be6b75 100644 --- a/src/misc/Setup-SecretManagement.ps1 +++ b/src/misc/Setup-SecretManagement.ps1 @@ -3,6 +3,7 @@ Using module ../common/Environment.psm1 Using module ../common/Ensure.psm1 Using module ../common/Input.psm1 + Using module Microsoft.Powershell.SecretManagement [CmdletBinding()] @@ -23,7 +24,6 @@ function Install-1Password { } -Import-Module $PSScriptRoot/../common/Environment.psm1; Invoke-RunMain $PSCmdlet { Invoke-EnsureUser; Install-ModuleFromGitHub -GitHubRepo 'cdhunt/SecretManagement.1Password' -Branch 'vNext' -Scope CurrentUser; diff --git a/src/n-sight/cleaners/Update.ps1 b/src/n-sight/cleaners/Update.ps1 index 9aa361fb..5ca0c9ac 100644 --- a/src/n-sight/cleaners/Update.ps1 +++ b/src/n-sight/cleaners/Update.ps1 @@ -1,3 +1,7 @@ +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Exit.psm1 + [CmdletBinding()] param( [String]$BaseUrl = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Cleanup Scripts', @@ -67,7 +71,6 @@ Function Invoke-UpdateScript { Invoke-Info "File '$ScriptName' has been updated."; } -Import-Module $PSScriptRoot/../../common/Environment.psm1; Invoke-RunMain $PSCmdlet { foreach ($File in $FilesToFetch) { Invoke-UpdateScript -BaseUrl:$BaseUrl -ScriptName:$File; From aaeadd53f9f5be7fa60d11a162ca7637fa9604b3 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 16 Sep 2024 13:56:14 +1000 Subject: [PATCH 149/341] fix(Compiler): Enriching of errors not actually working. --- src/Compiler/Analyser/Issue.cs | 19 +++++-------------- src/Compiler/Analyser/Rules/RuleVisitor.cs | 2 +- src/Compiler/Errors.cs | 8 ++------ src/Compiler/Module/Resolvable/Local.cs | 1 + src/Compiler/Module/Resolvable/Script.cs | 2 +- src/Compiler/Text/Document.cs | 3 --- 6 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/Compiler/Analyser/Issue.cs b/src/Compiler/Analyser/Issue.cs index c8858538..90a7a1f6 100644 --- a/src/Compiler/Analyser/Issue.cs +++ b/src/Compiler/Analyser/Issue.cs @@ -13,34 +13,24 @@ namespace Compiler.Analyser; [DataContract] public record Issue( [NotNull] IssueSeverity Severity, - [NotNull] string Message, + [NotNull] string ActualMessage, [NotNull] IScriptExtent Extent, [NotNull] Ast Parent, [NotNull] Option Module = default -) : Error() { +) : EnrichableExceptional(ActualMessage, 620, Module) { public override bool IsExceptional { get; } = Severity == IssueSeverity.Error; public override bool IsExpected { get; } = Severity == IssueSeverity.Warning; - public override string Message { get; } = Message; + public override string Message => this.ToString(); public override string ToString() => AstHelper.GetPrettyAstError( this.Extent, this.Parent, - Some(this.Message), + Some(this.ActualMessage), this.Module.Map(mod => mod is PathedModuleSpec pathed ? pathed.FullPath : mod.Name) ); - [Pure] - [return: NotNull] - public override ErrorException ToErrorException() => new WrappedErrorExceptionalException(this); - - [Pure] - [return: NotNull] - public Issue Enrich([NotNull] ModuleSpec module) => this with { - Module = Some(module) - }; - [Pure] [return: NotNull] public static Issue Error( @@ -58,6 +48,7 @@ public static Issue Warning( [NotNull] Option module = default) => new(IssueSeverity.Warning, message, extent, parent, module); public override bool Is() => false; + public T Enrich(ModuleSpec module) where T : Exceptional => throw new NotImplementedException(); } public enum IssueSeverity { diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs index b214d3a8..95cd6ac0 100644 --- a/src/Compiler/Analyser/Rules/RuleVisitor.cs +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -32,7 +32,7 @@ public override AstVisitAction DefaultVisit(Ast ast) { public static IEnumerable GetSupressions(Ast ast) { var paramBlock = AstHelper.FindClosestParamBlock(ast); return paramBlock == null - ? (IEnumerable)([]) + ? ([]) : SuppressAnalyserAttribute.FromAttributes(paramBlock.Attributes).Select(attr => attr.GetSupression()); } } diff --git a/src/Compiler/Errors.cs b/src/Compiler/Errors.cs index 31eecc0b..262ae0c3 100644 --- a/src/Compiler/Errors.cs +++ b/src/Compiler/Errors.cs @@ -8,7 +8,7 @@ namespace Compiler; -public record EnrichableExceptional( +public abstract record EnrichableExceptional( string ActualMessage, int Code, [NotNull] Option Module = default @@ -16,10 +16,6 @@ public record EnrichableExceptional( ActualMessage, Code ) { - public EnrichableExceptional Enrich(ModuleSpec module) => this with { - Module = Some(module) - }; - public override string Message { get { var module = this.Module.Match( @@ -89,7 +85,7 @@ public static T Enrich( this T error, ModuleSpec module ) where T : Error => error switch { - EnrichableExceptional enrichable => (enrichable.Enrich(module) as T)!, // Safety: The EnrichableExceptional return will always be a T. + EnrichableExceptional enrichable => (enrichable with { Module = module } as T)!, // Safety: The EnrichableExceptional return will always be a T. ManyErrors errors => (new ManyErrors(errors.Errors.Select(error => error.Enrich(module))) as T)!, // Safety: T will always be ManyErrors. _ => error }; diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 75f0ad71..30efe248 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -168,6 +168,7 @@ public override Task> ResolveRequirements() { } public override Task> IntoCompiled() => CompiledDocument.FromBuilder(this.Editor, 0) + .BindFail(err => err.Enrich(this.ModuleSpec)) .AndThenTry(doc => new CompiledLocalModule( this.ModuleSpec, doc, diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index ef944696..c9c190c4 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -43,7 +43,7 @@ public ResolvableScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] Resolva public override async Task> IntoCompiled() { var document = CompiledDocument.FromBuilder(this.Editor, 0); - if (document.IsErr(out var err, out var compiledDocument)) return FinFail(err); + if (document.IsErr(out var err, out var compiledDocument)) return FinFail(err.Enrich(this.ModuleSpec)); return (await Compiled.CompiledScript.Create( this, diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index 683b634b..757f2514 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -18,8 +18,6 @@ public sealed class CompiledDocument( string[] lines, ScriptBlockAst ast ) : TextDocument(lines) { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public ScriptBlockAst Ast { get; private init; } = ast; public string GetContent() => string.Join('\n', this.Lines); @@ -36,7 +34,6 @@ public static Fin FromBuilder(TextEditor builder, int indentBy updateResult.IfSucc(spanUpdates.AddRange); if (updateResult.IsErr(out var err, out _)) { - Logger.Error($"Error while applying updater {textUpdater}: {err}"); return err; } } From 3c6e7120af604e165cbb431b0ac2b902a309a63d Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 16 Sep 2024 18:47:40 +1000 Subject: [PATCH 150/341] refactor(Compiler): Read partial file when creating resolvables. Improves initial edge and requirement computation by not needing to read the entire file and parse it all just for requirements and using statements. --- src/Compiler/Module/Compiled/Script.cs | 20 ++----- src/Compiler/Module/Resolvable/Local.cs | 40 ++++++++----- src/Compiler/Module/Resolvable/Remote.cs | 1 - src/Compiler/Module/Resolvable/Resolvable.cs | 1 - src/Compiler/Module/Resolvable/Script.cs | 13 ----- src/Compiler/Requirements/RunAsAdmin.cs | 1 - src/Compiler/Text/Document.cs | 59 ++++++++++++++++++-- src/Compiler/Text/Span.cs | 14 +---- src/Compiler/Utils.cs | 14 +++++ tests/Compiler/Module/Resolvable/Script.cs | 47 ---------------- 10 files changed, 101 insertions(+), 109 deletions(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 5871ed20..cbea3a63 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -1,17 +1,14 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. -using System.Management.Automation.Language; using System.Reflection; using System.Text; using Compiler.Module.Resolvable; using Compiler.Requirements; using Compiler.Text; using LanguageExt; -using NLog; using QuikGraph; using QuikGraph.Algorithms; -using QuikGraph.Graphviz; namespace Compiler.Module.Compiled; @@ -20,10 +17,6 @@ public class CompiledScript( CompiledDocument document, RequirementGroup requirements ) : CompiledLocalModule(moduleSpec, document, requirements) { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - public virtual ParamBlockAst? ScriptParamBlock { get; } - public virtual BidirectionalGraph> Graph { get; } = new(); /// @@ -36,11 +29,8 @@ RequirementGroup requirements private CompiledScript( ResolvableScript thisResolvable, CompiledDocument document, - ParamBlockAst? scriptParamBlock, RequirementGroup requirements ) : this(thisResolvable.ModuleSpec, document, requirements) { - this.ScriptParamBlock = scriptParamBlock; - this.Graph.AddVertex(this); // Add the parent-child relationships to each module. this.Graph.EdgeAdded += edge => edge.Target.Parents.Add(edge.Source); @@ -50,10 +40,9 @@ public static async Task> Create( ResolvableScript thisResolvable, CompiledDocument document, ResolvableParent resolvableParent, - ParamBlockAst? scriptParamBlock, RequirementGroup requirements ) { - var script = new CompiledScript(thisResolvable, document, scriptParamBlock, requirements); + var script = new CompiledScript(thisResolvable, document, requirements); var thisGraph = resolvableParent.GetGraphFromRoot(thisResolvable); var loadOrder = thisGraph.TopologicalSort(); @@ -120,9 +109,10 @@ public override string GetPowerShellObject() { embeddedModules.AppendLine(IndentString(");", 4)); var paramBlock = new StringBuilder(); - if (this.ScriptParamBlock != null) { - this.ScriptParamBlock.Attributes.ToList().ForEach(attribute => paramBlock.AppendLine(attribute.Extent.Text)); - paramBlock.Append(this.ScriptParamBlock.Extent.Text); + var scriptParamBlock = this.Document.Ast.ParamBlock; + if (scriptParamBlock != null) { + scriptParamBlock.Attributes.ToList().ForEach(attribute => paramBlock.AppendLine(attribute.Extent.Text)); + paramBlock.Append(scriptParamBlock.Extent.Text); } else { paramBlock.AppendLine("[CmdletBinding()]\nparam()"); } diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 30efe248..e49b0a00 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -14,9 +14,7 @@ namespace Compiler.Module.Resolvable; public partial class ResolvableLocalModule : Resolvable { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - - internal readonly ScriptBlockAst Ast; + internal readonly ScriptBlockAst RequirementsAst; public readonly TextEditor Editor; @@ -67,16 +65,10 @@ moduleSpec is PathedModuleSpec pathedModuleSpec public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) { if (!File.Exists(moduleSpec.FullPath)) { throw InvalidModulePathError.NotAFile(moduleSpec.FullPath); - } else { - Logger.Debug($"Loading Local Module: {moduleSpec.FullPath}"); } this.Editor = new TextEditor(new TextDocument(File.ReadAllLines(moduleSpec.FullPath))); - this.Ast = AstHelper.GetAstReportingErrors( - string.Join('\n', this.Editor.Document.Lines), - Some(moduleSpec.FullPath), - ["ModuleNotFoundDuringParse"] - ).Catch(err => err.Enrich(this.ModuleSpec)).As().ThrowIfFail(); + this.RequirementsAst = this.Editor.Document.GetRequirementsAst().BindFail(err => err.Enrich(this.ModuleSpec)).ThrowIfFail(); // Remove empty lines this.Editor.AddRegexEdit(0, EntireEmptyLineRegex(), _ => { return null; }); @@ -121,7 +113,7 @@ public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) { } public override Task> ResolveRequirements() { - AstHelper.FindDeclaredModules(this.Ast).ToList().ForEach(module => { + AstHelper.FindDeclaredModules(this.RequirementsAst).ToList().ForEach(module => { if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) { this.Editor.AddExactEdit( ast.Extent.StartLineNumber - 1, @@ -149,7 +141,7 @@ public override Task> ResolveRequirements() { } }); - AstHelper.FindDeclaredNamespaces(this.Ast).ToList().ForEach(statement => { + AstHelper.FindDeclaredNamespaces(this.RequirementsAst).ToList().ForEach(statement => { this.Editor.AddExactEdit( statement.Extent.StartLineNumber - 1, statement.Extent.StartColumnNumber - 1, @@ -164,6 +156,28 @@ public override Task> ResolveRequirements() { } }); + if (this.RequirementsAst.ScriptRequirements is not null) { + if (this.RequirementsAst.ScriptRequirements.IsElevationRequired) { + lock (this.Requirements) { + this.Requirements.AddRequirement(new RunAsAdminRequirement()); + } + } + + if (this.RequirementsAst.ScriptRequirements.RequiredPSEditions is not null and not { Count: 0 }) { + var psEditionString = this.RequirementsAst.ScriptRequirements.RequiredPSEditions.First(); + var psEdition = Enum.Parse(psEditionString, true); + lock (this.Requirements) { + this.Requirements.AddRequirement(new PSEditionRequirement(psEdition)); + } + } + + if (this.RequirementsAst.ScriptRequirements.RequiredPSVersion is not null) { + lock (this.Requirements) { + this.Requirements.AddRequirement(new PSVersionRequirement(this.RequirementsAst.ScriptRequirements.RequiredPSVersion)); + } + } + } + return Option.None.AsTask(); } @@ -180,7 +194,7 @@ public override bool Equals(object? obj) { if (ReferenceEquals(this, obj)) return true; return obj is ResolvableLocalModule other && this.ModuleSpec.CompareTo(other.ModuleSpec) == ModuleMatch.Same && - this.Editor.Document.Lines == other.Editor.Document.Lines; + this.Editor.Document.GetLines() == other.Editor.Document.GetLines(); } public override int GetHashCode() => this.ModuleSpec.GetHashCode(); diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index 14544274..bc4dd729 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -168,7 +168,6 @@ public async Task> CacheResult() { var versionString = ConvertVersionParameters(this.ModuleSpec.RequiredVersion?.ToString(), this.ModuleSpec.MinimumVersion?.ToString(), this.ModuleSpec.MaximumVersion?.ToString()); var powerShellCode = /*ps1*/ $$""" Set-StrictMode -Version 3; - Set-PSResourceRepository -Name PSGallery -Trusted -Confirm:$False; $Module = Find-PSResource -Name '{{this.ModuleSpec.Name}}' {{(versionString != null ? $"-Version '{versionString}'" : "")}}; diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index a798c0b1..47663459 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -224,7 +224,6 @@ public async Task> FindResolvable([NotNull] ModuleSpec mod } else { var compilingTask = Task.Run(async () => { var newlyCompiledModule = await resolvable.IntoCompiled(); - newlyCompiledModule.IfFail(err => Logger.Error(err.Message)); lock (this.Resolvables) { this.Resolvables[moduleSpec] = resolvableInfo with { diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index c9c190c4..cf84106e 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -2,7 +2,6 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Diagnostics.CodeAnalysis; -using System.Management.Automation.Language; using Compiler.Requirements; using Compiler.Text; using LanguageExt; @@ -49,19 +48,7 @@ public ResolvableScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] Resolva this, compiledDocument, this.ResolvableParent, - this.ExtractParameterBlock(), this.Requirements )).AndThen(static script => (Compiled.Compiled)script); } - - /// - /// Looks for the parameter block of the script, - /// - /// - /// The parameter block of the script, if it exists. - /// - public ParamBlockAst? ExtractParameterBlock() { - var scriptParamBlockAst = this.Ast.ParamBlock; - return scriptParamBlockAst ?? null; - } } diff --git a/src/Compiler/Requirements/RunAsAdmin.cs b/src/Compiler/Requirements/RunAsAdmin.cs index 15fc3995..5002d3d0 100644 --- a/src/Compiler/Requirements/RunAsAdmin.cs +++ b/src/Compiler/Requirements/RunAsAdmin.cs @@ -2,7 +2,6 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; -using System.Diagnostics.CodeAnalysis; using System.Security.Cryptography; using System.Text; diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index 757f2514..ccd46aaf 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -6,12 +6,61 @@ using System.Text.RegularExpressions; using Compiler.Text.Updater; using LanguageExt; -using NLog; namespace Compiler.Text; -public partial class TextDocument([NotNull] string[] lines) { - public readonly List Lines = new(lines); +public class TextDocument : IDisposable { + private readonly List Lines; + private StreamReader? FileStream; + protected Fin? RequirementsAst; + + public TextDocument(string[] lines) => this.Lines = [.. lines]; + + public TextDocument(string path) { + this.Lines = []; + this.FileStream = new StreamReader(path); + } + + public Fin GetRequirementsAst() { + if (this.RequirementsAst is not null) return this.RequirementsAst; + + this.GetLines(line => { + line = line.Trim(); + return string.IsNullOrWhiteSpace(line) || + line.StartsWith("#requires", StringComparison.OrdinalIgnoreCase) || + line.StartsWith("using", StringComparison.OrdinalIgnoreCase); + }); + + return this.RequirementsAst = AstHelper.GetAstReportingErrors( + string.Join('\n', this.Lines), + None, + ["ModuleNotFoundDuringParse"] + ); + } + + [return: NotNull] + public IEnumerable GetLines(Predicate? readerStopCondition = null) { + if (this.FileStream is not null) { + while (!this.FileStream.EndOfStream && this.FileStream.ReadLine() is string line) { + this.Lines.Add((string)line.Clone()); // Clone the line incase it is modified in the predicate. + if (readerStopCondition is not null && readerStopCondition(line)) { + break; + } + } + + if (this.FileStream.EndOfStream) { + this.FileStream.Dispose(); + this.FileStream = null; + } + } + + return this.Lines; + } + + public void Dispose() { + this.FileStream?.Dispose(); + GC.SuppressFinalize(this); + } } public sealed class CompiledDocument( @@ -20,12 +69,12 @@ ScriptBlockAst ast ) : TextDocument(lines) { public ScriptBlockAst Ast { get; private init; } = ast; - public string GetContent() => string.Join('\n', this.Lines); + public string GetContent() => string.Join('\n', this.GetLines()); public static Fin FromBuilder(TextEditor builder, int indentBy = 0) { builder.AddEdit(() => new IndentUpdater(indentBy)); - var lines = builder.Document.Lines; + var lines = builder.Document.GetLines().ToList(); var spanUpdates = new List(); var sortedUpdaters = builder.TextUpdaters.OrderBy(updater => updater.Priority).ToList(); foreach (var textUpdater in sortedUpdaters) { diff --git a/src/Compiler/Text/Span.cs b/src/Compiler/Text/Span.cs index 5107cbc7..13c44032 100644 --- a/src/Compiler/Text/Span.cs +++ b/src/Compiler/Text/Span.cs @@ -3,10 +3,8 @@ using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; -using System.Management.Automation; using System.Text; using LanguageExt; -using QuikGraph.Algorithms.Search; namespace Compiler.Text; @@ -86,16 +84,6 @@ public static Fin New( } } - public static TextSpan WrappingEntireDocument(TextDocument document) => WrappingEntireDocument([.. document.Lines]); - - public static TextSpan WrappingEntireDocument(string[] lines) { - if (lines.Length == 0) { - return new TextSpan(0, 0, 0, 0); - } - - return new TextSpan(0, 0, lines.Length - 1, lines[^1].Length); - } - public bool Contains(int index, int column) { if (index < this.StartingIndex || index > this.EndingIndex) { return false; @@ -112,7 +100,7 @@ public bool Contains(int index, int column) { return true; } - public string GetContent(TextDocument document) => this.GetContent([.. document.Lines]); + public string GetContent(TextDocument document) => this.GetContent([.. document.GetLines()]); [Pure] [return: NotNull] diff --git a/src/Compiler/Utils.cs b/src/Compiler/Utils.cs index ac615389..573946b6 100644 --- a/src/Compiler/Utils.cs +++ b/src/Compiler/Utils.cs @@ -114,6 +114,20 @@ [NotNull] Func func } }); + [return: NotNull] + [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Fin AndThenTry( + [NotNull] this Fin fin, + [NotNull] Func func, + [NotNull] Func error + ) => fin.Bind(value => { + try { + return func(value); + } catch (Exception err) { + return FinFail(error(value, err)); + } + }); + [return: NotNull] [Pure, MethodImpl(MethodImplOptions.AggressiveInlining)] public static Fin AndThen( diff --git a/tests/Compiler/Module/Resolvable/Script.cs b/tests/Compiler/Module/Resolvable/Script.cs index e7c7c2fd..8b7b9893 100644 --- a/tests/Compiler/Module/Resolvable/Script.cs +++ b/tests/Compiler/Module/Resolvable/Script.cs @@ -24,54 +24,7 @@ string content return compiled.GetContent(); } - [TestCaseSource(typeof(TestData), nameof(TestData.ExtractParameterBlockCases))] - public string? ExtractParameterBlock( - bool expectNull, - string scriptText - ) { - var scriptLines = scriptText.Split('\n'); - var script = new ResolvableScript(TestUtils.GetModuleSpecFromContent(scriptText), new ResolvableParent()); - - var result = script.ExtractParameterBlock(); - - Assert.Multiple(() => { - if (expectNull) { - Assert.That(result, Is.Null); - } else { - Assert.That(result, Is.Not.Null); - } - }); - - return result?.Extent.Text; - } - - public static class TestData { - public static IEnumerable ExtractParameterBlockCases { - get { - // yield return new TestCaseData(false, TEST_SCRIPT).Returns(""" - // param( - // [Parameter()] - // [string]$Name - // ) - // """).SetName("ExtractParameterBlock_ReturnsParameterBlockAst_WhenParameterBlockExists"); - - yield return new TestCaseData(true, """ - #Requires -Version 5.1 - - Write-Host 'Hello, World!'; - """).Returns(null).SetName("ExtractParameterBlock_ReturnsNull_WhenParameterBlockDoesNotExist"); - - yield return new TestCaseData(true, "").Returns(null).SetName("ExtractParameterBlock_ReturnsNull_WhenScriptIsEmpty"); - - yield return new TestCaseData(false, "param()").Returns("param()").SetName("ExtractParameterBlock_ReturnsParameterBlockAst_WhenExistsWithoutAttributesAndParameters"); - - yield return new TestCaseData(false, "param([string]$Name)").Returns("param([string]$Name)").SetName("ExtractParameterBlock_ReturnsParameterBlockAst_WhenExistsWithAttributesAndParameters"); - - yield return new TestCaseData(false, "param([string]$Name, [int]$Age)").Returns("param([string]$Name, [int]$Age)").SetName("ExtractParameterBlock_ReturnsParameterBlockAst_WhenExistsWithMultipleParameters"); - } - } - public static IEnumerable TestCases { get { // yield return new TestCaseData( From e225bde5299e828eabd9505cb7232d8022a683b4 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 16 Sep 2024 18:48:17 +1000 Subject: [PATCH 151/341] feat(Compiler): Output debuggable content when error occurs during AstUpdaters. --- src/Compiler/AstHelper.cs | 2 +- src/Compiler/Errors.cs | 79 ++++++++++++++++++++++++++++++++++----- src/Compiler/Program.cs | 74 ++++++++++++++++++++++++++++-------- 3 files changed, 129 insertions(+), 26 deletions(-) diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index 9a7cbe57..b34640e0 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -209,7 +209,7 @@ public static Fin GetAstReportingErrors( if (parserErrors.Length != 0) { var issues = parserErrors.Select(error => Issue.Error(error.Message, error.Extent, ast)); var errors = Error.Many(issues.ToArray()); - return Fin.Fail(errors); + return new WrappedErrorWithDebuggableContent(astContent, errors); } return ast; diff --git a/src/Compiler/Errors.cs b/src/Compiler/Errors.cs index 262ae0c3..30fb3195 100644 --- a/src/Compiler/Errors.cs +++ b/src/Compiler/Errors.cs @@ -8,14 +8,11 @@ namespace Compiler; -public abstract record EnrichableExceptional( - string ActualMessage, - int Code, - [NotNull] Option Module = default -) : Exceptional( - ActualMessage, - Code -) { +public abstract record EnrichableError : Error { + public Option Module { get; init; } + + public string ActualMessage { get; } + public override string Message { get { var module = this.Module.Match( @@ -23,7 +20,65 @@ public override string Message { () => "" ); - return $"{this.ActualMessage}{module}"; + return $"{this.Message}{module}"; + } + } + + public override bool IsExpected => this.Inner.AndThen(i => i.IsExpected).UnwrapOr(false); + + public override bool IsExceptional => this.Inner.AndThen(i => i.IsExceptional).UnwrapOr(false); + + public EnrichableError( + string message, + [NotNull] Option module = default + ) : base() { + this.ActualMessage = message; + this.Module = module; + } + + public EnrichableError( + [NotNull] Error innerError, + [NotNull] Option module = default + ) : base(innerError) { + this.ActualMessage = innerError.Message; + this.Module = module; + } + + public override bool Is() => (this.Inner.IsSome && this.Inner.Unwrap() is TE) || this is TE; + + public override ErrorException ToErrorException() { + if (this.IsExceptional) { + return new WrappedErrorExceptionalException(this); + } else if (this.IsExpected) { + return new WrappedErrorExpectedException(this); + } else { + return ErrorException.New(this.Code, this.Message); + } + } +} + +public abstract record EnrichableExceptional : Exceptional { + public Option Module { get; init; } + + public EnrichableExceptional( + string message, + int code, + [NotNull] Option module = default + ) : base(message, code) => this.Module = module; + + public EnrichableExceptional( + [NotNull] Exceptional innerException, + [NotNull] Option module = default + ) : base(innerException) => this.Module = module; + + public override string Message { + get { + var module = this.Module.Match( + some => $" in module {some.Name}", + () => "" + ); + + return $"{base.Message}{module}"; } } @@ -80,6 +135,12 @@ Some of the requirements are incompatible with each other. 622 ); +public sealed record WrappedErrorWithDebuggableContent( + string Content, + Error InnerException, + Option ModuleSpec = default +) : EnrichableError(InnerException, ModuleSpec); + public static class ErrorUtils { public static T Enrich( this T error, diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 89b1ce55..e6096ad7 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -56,9 +56,6 @@ public class Options { [Option('o', "output", Required = false, HelpText = "Output file to be written.")] public string? Output { get; set; } - [Option("fail-fast", Required = false, HelpText = "Fail fast on error.")] - public bool FailFast { get; set; } - [Option('f', "force", Required = false, HelpText = "Force overwrite of output file.")] public bool Force { get; set; } } @@ -80,16 +77,15 @@ private static async Task Main(string[] args) { var superParent = new ResolvableParent(); - ConcurrentBag<(string, Exception)> compilerErrors = []; filesToCompile.ToList().ForEach(async scriptPath => { var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); if ((await Resolvable.TryCreateScript(pathedModuleSpec, superParent)).IsErr(out var error, out var resolvableScript)) { - compilerErrors.Add((scriptPath, error)); + Errors.Add(error.Enrich(pathedModuleSpec)); return; } superParent.QueueResolve(resolvableScript, compiled => { - OutputToFile( + Output( opts.Input!, opts.Output, scriptPath, @@ -106,11 +102,7 @@ private static async Task Main(string[] args) { Logger.Trace("Finished compilation."); - if (compilerErrors.IsEmpty) return 0; - - foreach (var (scriptPath, e) in compilerErrors) { - Errors.Add(LanguageExt.Common.Error.New($"Error compiling {scriptPath}", e)); - } + await OutputErrors(Errors, opts.Input!, opts.Output); return 1; }, @@ -127,8 +119,6 @@ private static async Task Main(string[] args) { } ); - await OutputErrors(Errors); - RunspacePool.Value.Close(); RunspacePool.Value.Dispose(); LogManager.Shutdown(); @@ -242,7 +232,21 @@ public static string GetOutputLocation( return Path.Combine(outputDirectory, relativePath); } - + /// + /// Gets the files to compile from the input. + /// + /// Ignores files that are not .ps1 files, + /// or files with the first line starting with #!ignore (case insensitive) or is empty. + /// + /// + /// The input file or directory to get the files from, + /// if it is a file, it will return a list with that file. + /// + /// Otherwise, it will return all .ps1 files in the recursed directory. + /// + /// + /// The valid files to compile. + /// public static Fin> GetFilesToCompile(string input) { var files = new List(); if (File.Exists(input)) { @@ -255,9 +259,26 @@ public static Fin> GetFilesToCompile(string input) { return LanguageExt.Common.Error.New($"Input {input} is not a file or directory."); } + files.RemoveAll(static file => { + using var reader = new StreamReader(file); + return reader.ReadLine()?.StartsWith("#!ignore", StringComparison.OrdinalIgnoreCase) ?? true; + }); + return files; } + /// + /// Ensures that the output directory structure is the same as the source directory. + /// + /// + /// The root directory of the source files. + /// + /// + /// The root directory of the output files. + /// + /// + /// A list of the scripts that the output directory should contain. + /// public static void EnsureDirectoryStructure( string sourceDirectory, string? outputDirectory, @@ -274,7 +295,7 @@ IEnumerable scripts } } - public static async void OutputToFile( + public static async void Output( string sourceDirectory, string? outputDirectory, string fileName, @@ -306,7 +327,11 @@ public static async void OutputToFile( await fileStream.WriteAsync(Encoding.UTF8.GetBytes(content)); } - public static async Task OutputErrors(IEnumerable errors) { + public static async Task OutputErrors( + IEnumerable errors, + string sourceDirectory, + Option outputDirectory + ) { if (Errors.IsEmpty) return 0; // Wait for all threads to finish before outputting errors, this is to ensure all errors are captured. @@ -325,6 +350,7 @@ public static async Task OutputErrors(IEnumerable var printedBefore = false; // This is to prevent a newline before the first error var errorQueue = new Deque(); errorQueue.AddRange(errors); + var outputDebuggables = new List(); do { var err = errorQueue.PopFirst(); @@ -346,6 +372,22 @@ public static async Task OutputErrors(IEnumerable printedBefore = true; } + if (IsDebugging && outputDirectory.IsSome(out var outDir) + && err is WrappedErrorWithDebuggableContent wrappedDebuggable + && wrappedDebuggable.Module.IsSome(out var module) + && !outputDebuggables.Contains(module.Hash) + ) { + Output( + sourceDirectory, + outDir, + module.Name, + wrappedDebuggable.Content, + true + ); + + outputDebuggables.Add(module.Hash); + } + var message = err is Issue issue ? issue.ToString() : err.Message From e1a360a7e615a5adad4fc783fd113e7c4c740b60 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 20 Sep 2024 17:31:58 +1000 Subject: [PATCH 152/341] refactor(Compiler): disable analyser dep calculation for key & better async. Key hash with dependencies is too random and not stable currently, needs revisiting in the future. --- src/Compiler/Analyser/Analyser.cs | 38 +++++++++++--------------- src/Compiler/Module/Compiled/Script.cs | 4 +-- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index 3b43df92..94a5f05e 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -18,31 +18,25 @@ public static class Analyser { new UseOfUndefinedFunction() ]; - private static readonly ConcurrentBag Cache = []; + private static readonly ConcurrentDictionary>> Cache = []; [Pure] [return: NotNull] - public static List Analyse(CompiledLocalModule module, IEnumerable availableImports) { + public static async Task> Analyse(CompiledLocalModule module, IEnumerable availableImports) { var key = module.ComputedHash[0..8]; - if (availableImports.Any()) { - var rawBytes = new List(); - availableImports.ToList().ForEach(x => rawBytes.AddRange(Convert.FromHexString(x.ComputedHash))); - key += Convert.ToHexString(SHA256.HashData(rawBytes.ToArray()))[0..8]; - } - - if (Cache.Contains(key)) { - Logger.Trace($"Cache hit for {module.ModuleSpec.Name} with key {key}"); - return []; - } - - Logger.Trace($"Analyzing module {module.ModuleSpec.Name}"); - - var visitor = new RuleVisitor(module, Rules, availableImports); - module.Document.Ast.Visit(visitor); - - Logger.Trace($"Caching analysis for {module.ModuleSpec.Name} with key {key}"); - Cache.Add(key); - - return visitor.Issues; + // FIXME - Key orders are not consistent between instances. + // if (availableImports.Any()) { + // var rawBytes = new List(); + // availableImports.OrderBy(i => i.ModuleSpec.Name).ToList().ForEach(x => rawBytes.AddRange(Convert.FromHexString(x.ComputedHash))); + // key += Convert.ToHexString(SHA256.HashData(rawBytes.ToArray()))[0..8]; + // } + + return await Cache.GetOrAdd(key, _ => Task.Run(() => { + Logger.Trace($"Analyzing module {module.ModuleSpec.Name}"); + + var visitor = new RuleVisitor(module, Rules, availableImports); + module.Document.Ast.Visit(visitor); + return visitor.Issues; + })); } } diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index cbea3a63..09e3b951 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -78,9 +78,9 @@ RequirementGroup requirements } } - script.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { + script.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(async compiled => { var imports = script.Graph.OutEdges(compiled).Select(edge => edge.Target); - Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports]) + (await Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports])) .ForEach(issue => Program.Errors.Add(issue.Enrich(compiled.ModuleSpec))); }); From 7337fdb028d5f00b80038a8324f10877569475f6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 20 Sep 2024 17:36:27 +1000 Subject: [PATCH 153/341] fix(Compiler): Actually wait and report compiler errors --- src/Compiler/Module/Resolvable/Resolvable.cs | 37 ++++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index 47663459..dff2882c 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -254,26 +254,25 @@ public async Task StartCompilation() { // Get a list of the scripts which are roots and have no scripts depending on them. var topLevelScripts = new Queue(this.Graph.Vertices.Where(resolvable => !this.Graph.TryGetInEdges(resolvable, out var inEdges) || !inEdges.Any())); var compileTasks = new List(); - while (compileTasks.Count > 0 || topLevelScripts.Count > 0) { - if (compileTasks.Count > 0) { - await Task.WhenAny(compileTasks); - compileTasks.RemoveAll(task => task.IsCompleted); - } + foreach (var resolvable in topLevelScripts) { + compileTasks.Add(Task.Run(async () => { + Logger.Trace($"Compiling top level script {resolvable.ModuleSpec.Name}"); + + var compiledModule = await this.WaitForCompiled(resolvable.ModuleSpec); + compiledModule.IfFail(err => Program.Errors.Add(err.Enrich(resolvable.ModuleSpec))); + Logger.Trace($"Finished compiling top level script {resolvable.ModuleSpec.Name}"); + }).ContinueWith(task => { + if (task.IsFaulted) { + Logger.Error(task.Exception, "Failed to compile top level script."); + Program.Errors.Add(task.Exception); + } + })); + } - if (topLevelScripts.Count > 0) { - var resolvable = topLevelScripts.Dequeue(); - compileTasks.Add(Task.Run(async () => { - Logger.Trace($"Compiling top level script {resolvable.ModuleSpec.Name}"); - - var compiledModule = await this.WaitForCompiled(resolvable.ModuleSpec); - // If the module failed, we need to cancel any tasks that are waiting for it. - compiledModule.IfFail(err => { - Program.Errors.Add(err.Enrich(resolvable.ModuleSpec)); - var (_, task) = this.RunningTasks.Find(task => task.Item1 == resolvable.ModuleSpec); - }); - Logger.Trace($"Finished compiling top level script {resolvable.ModuleSpec.Name}"); - })); - } + while (compileTasks.Count > 0) { + var task = await Task.WhenAny(compileTasks); + Logger.Debug($"Task completed, {compileTasks.Count} remaining."); + compileTasks.Remove(task); } Logger.Trace("Finished compiling all top level scripts."); From 2ec7f282396edf665c70561539cdfe87f13f6732 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 23 Sep 2024 12:52:09 +1000 Subject: [PATCH 154/341] feat(Compiler): Add newline and comment removal updaters; refactor HereString and Indent updaters Also adds base abstract updater for token based updaters. --- src/Compiler/AstHelper.cs | 11 +- src/Compiler/Errors.cs | 16 +- src/Compiler/Module/Resolvable/Local.cs | 27 +- src/Compiler/Text/Document.cs | 165 +++++++++--- src/Compiler/Text/Span.cs | 247 ++++++++++++++++-- src/Compiler/Text/Updater.cs | 35 ++- src/Compiler/Text/Updater/AstUpdater.cs | 53 ++-- .../Updater/Built/CommentRemovalUpdater.cs | 13 + .../{HereString.cs => HereStringUpdater.cs} | 2 +- .../Text/Updater/{ => Built}/IndentUpdater.cs | 17 +- .../Updater/Built/NewLineRemovalUpdater.cs | 13 + src/Compiler/Text/Updater/ExactUpdater.cs | 50 ++-- .../Text/Updater/NodeEnumerableUpdater.cs | 44 ++++ src/Compiler/Text/Updater/PatternUpdater.cs | 69 ++--- src/Compiler/Text/Updater/RegexUpdater.cs | 74 +----- src/Compiler/Text/Updater/TokenUpdater.cs | 26 ++ src/Compiler/Utils.cs | 6 +- 17 files changed, 587 insertions(+), 281 deletions(-) create mode 100644 src/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs rename src/Compiler/Text/Updater/Built/{HereString.cs => HereStringUpdater.cs} (98%) rename src/Compiler/Text/Updater/{ => Built}/IndentUpdater.cs (58%) create mode 100644 src/Compiler/Text/Updater/Built/NewLineRemovalUpdater.cs create mode 100644 src/Compiler/Text/Updater/NodeEnumerableUpdater.cs create mode 100644 src/Compiler/Text/Updater/TokenUpdater.cs diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index b34640e0..412df923 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -104,7 +104,8 @@ public static IEnumerable FindAvailableAliases(Ast ast, bool onlyExporte var allFunctionsWithAliases = ast .FindAll(testAst => testAst is FunctionDefinitionAst, true) .Cast() - .Where(functionDefinition => functionDefinition.Body.ParamBlock.Attributes.Any(attribute => attribute.TypeName.GetReflectionType() == typeof(AliasAttribute))); + .Where(function => function.Body.ParamBlock != null) + .Where(functionDefinition => functionDefinition.Body.ParamBlock!.Attributes.Any(attribute => attribute.TypeName.GetReflectionType() == typeof(AliasAttribute))); var availableAliases = new List(); var attributeType = typeof(AliasAttribute); @@ -198,18 +199,20 @@ private static IEnumerable GetWantedExports(Ast ast, string kind, IEnumera public static Fin GetAstReportingErrors( [NotNull] string astContent, [NotNull] Option filePath, - [NotNull] IEnumerable ignoredErrors) { + [NotNull] IEnumerable ignoredErrors, + out Token[] tokens + ) { ArgumentNullException.ThrowIfNull(astContent); ArgumentNullException.ThrowIfNull(filePath); ArgumentNullException.ThrowIfNull(ignoredErrors); - var ast = Parser.ParseInput(astContent, filePath.ValueUnsafe(), out _, out var parserErrors); + var ast = Parser.ParseInput(astContent, filePath.ValueUnsafe(), out tokens, out var parserErrors); parserErrors = [.. parserErrors.Where(error => !ignoredErrors.Contains(error.ErrorId))]; if (parserErrors.Length != 0) { var issues = parserErrors.Select(error => Issue.Error(error.Message, error.Extent, ast)); var errors = Error.Many(issues.ToArray()); - return new WrappedErrorWithDebuggableContent(astContent, errors); + return new WrappedErrorWithDebuggableContent(None, astContent, errors); } return ast; diff --git a/src/Compiler/Errors.cs b/src/Compiler/Errors.cs index 30fb3195..8b7b45d6 100644 --- a/src/Compiler/Errors.cs +++ b/src/Compiler/Errors.cs @@ -20,7 +20,7 @@ public override string Message { () => "" ); - return $"{this.Message}{module}"; + return $"{this.ActualMessage}{module}"; } } @@ -38,9 +38,13 @@ public EnrichableError( public EnrichableError( [NotNull] Error innerError, + [NotNull] Option message = default, [NotNull] Option module = default ) : base(innerError) { - this.ActualMessage = innerError.Message; + this.ActualMessage = message.Match( + some => some + Environment.NewLine + innerError.Message, + () => innerError.Message + ); this.Module = module; } @@ -136,16 +140,20 @@ Some of the requirements are incompatible with each other. ); public sealed record WrappedErrorWithDebuggableContent( + Option MaybeMessage, string Content, Error InnerException, - Option ModuleSpec = default -) : EnrichableError(InnerException, ModuleSpec); + Option Module = default +) : EnrichableError(InnerException, MaybeMessage, Module) { + public override Option Inner => this.InnerException; +} public static class ErrorUtils { public static T Enrich( this T error, ModuleSpec module ) where T : Error => error switch { + WrappedErrorWithDebuggableContent wrapped => (wrapped with { Module = module, InnerException = wrapped.InnerException.Enrich(module) } as T)!, // Safety: The WrappedErrorWithDebuggableContent return will always be a T. EnrichableExceptional enrichable => (enrichable with { Module = module } as T)!, // Safety: The EnrichableExceptional return will always be a T. ManyErrors errors => (new ManyErrors(errors.Errors.Select(error => error.Enrich(module))) as T)!, // Safety: T will always be ManyErrors. _ => error diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index e49b0a00..42feb521 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -8,8 +8,6 @@ using Compiler.Text; using Compiler.Text.Updater.Built; using LanguageExt; -using LanguageExt.Traits; -using NLog; namespace Compiler.Module.Resolvable; @@ -70,25 +68,8 @@ public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) { this.Editor = new TextEditor(new TextDocument(File.ReadAllLines(moduleSpec.FullPath))); this.RequirementsAst = this.Editor.Document.GetRequirementsAst().BindFail(err => err.Enrich(this.ModuleSpec)).ThrowIfFail(); - // Remove empty lines - this.Editor.AddRegexEdit(0, EntireEmptyLineRegex(), _ => { return null; }); - - // Document Blocks - this.Editor.AddPatternEdit( - 5, - DocumentationStartRegex(), - DocumentationEndRegex(), - (lines) => { return []; }); - - // Entire Line Comments - this.Editor.AddRegexEdit(10, EntireLineCommentRegex(), _ => { return null; }); - - // Comments at the end of a line, after some code. - this.Editor.AddRegexEdit(priority: 15, EndOfLineComment(), _ => { return null; }); - - // Remove #Requires statements - this.Editor.AddRegexEdit(20, RequiresStatementRegex(), _ => { return null; }); - + // this.Editor.AddEdit(static () => new NewLineRemovalUpdater()); + this.Editor.AddEdit(static () => new CommentRemovalUpdater()); this.Editor.AddEdit(static () => new HereStringUpdater()); } @@ -116,11 +97,12 @@ public override Task> ResolveRequirements() { AstHelper.FindDeclaredModules(this.RequirementsAst).ToList().ForEach(module => { if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) { this.Editor.AddExactEdit( + 5, ast.Extent.StartLineNumber - 1, ast.Extent.StartColumnNumber - 1, ast.Extent.EndLineNumber - 1, ast.Extent.EndColumnNumber - 1, - _ => [] + _ => [] ); } @@ -143,6 +125,7 @@ public override Task> ResolveRequirements() { AstHelper.FindDeclaredNamespaces(this.RequirementsAst).ToList().ForEach(statement => { this.Editor.AddExactEdit( + 5, statement.Extent.StartLineNumber - 1, statement.Extent.StartColumnNumber - 1, statement.Extent.EndLineNumber - 1, diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index ccd46aaf..92e1e447 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -3,9 +3,12 @@ using System.Diagnostics.CodeAnalysis; using System.Management.Automation.Language; +using System.Runtime.CompilerServices; using System.Text.RegularExpressions; using Compiler.Text.Updater; +using Compiler.Text.Updater.Built; using LanguageExt; +using NLog; namespace Compiler.Text; @@ -34,7 +37,8 @@ public Fin GetRequirementsAst() { return this.RequirementsAst = AstHelper.GetAstReportingErrors( string.Join('\n', this.Lines), None, - ["ModuleNotFoundDuringParse"] + ["ModuleNotFoundDuringParse"], + out _ ); } @@ -67,119 +71,205 @@ public sealed class CompiledDocument( string[] lines, ScriptBlockAst ast ) : TextDocument(lines) { + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public ScriptBlockAst Ast { get; private init; } = ast; public string GetContent() => string.Join('\n', this.GetLines()); public static Fin FromBuilder(TextEditor builder, int indentBy = 0) { - builder.AddEdit(() => new IndentUpdater(indentBy)); + if (indentBy != 0) builder.AddEdit(() => new IndentUpdater(indentBy)); var lines = builder.Document.GetLines().ToList(); var spanUpdates = new List(); - var sortedUpdaters = builder.TextUpdaters.OrderBy(updater => updater.Priority).ToList(); + var sortedUpdaters = builder.TextUpdaters.OrderBy(updater => updater.Updater.Priority).ToList(); + Logger.Debug($"Applying in order->{string.Join("\n\t", sortedUpdaters)}"); foreach (var textUpdater in sortedUpdaters) { - spanUpdates.ForEach(textUpdater.PushByUpdate); - var updateResult = textUpdater.Apply(lines); + spanUpdates.ForEach(textUpdater.Updater.PushByUpdate); + Fin> updateResult; + try { + updateResult = textUpdater.Updater.Apply(lines); + } catch (Exception e) { + return Error.New( + $"Error applying update: {textUpdater}", + e + ); + } - updateResult.IfSucc(spanUpdates.AddRange); - if (updateResult.IsErr(out var err, out _)) { - return err; + if (updateResult.IsErr(out var err, out var updates)) { + if (err is WrappedErrorWithDebuggableContent wrappedError) { + return err; + } + + return new WrappedErrorWithDebuggableContent($"Error applying update: {textUpdater}", string.Join('\n', lines), err); } + + spanUpdates.AddRange(updates); } return AstHelper.GetAstReportingErrors( - string.Join('\n', lines), + string.Join('\n', lines), None, - ["ModuleNotFoundDuringParse"] + ["ModuleNotFoundDuringParse"], + out _ ).AndThen(ast => new CompiledDocument([.. lines], ast)); } } public class TextEditor(TextDocument document) { + public record SourcedTextUpdater( + TextSpanUpdater Updater, + string SourceFile, + string SourceMember, + int SourceLine + ) { + private static readonly string RootDir = $"src{Path.DirectorySeparatorChar}Compiler"; + + public override string ToString() { + var sourceFile = this.SourceFile; + var rootDirIndex = sourceFile.IndexOf(RootDir, StringComparison.Ordinal); + if (rootDirIndex != -1) { + sourceFile = sourceFile[rootDirIndex..]; + } + + return $"{sourceFile}::{this.SourceMember}::{this.SourceLine}->{this.Updater}"; + } + } + public readonly TextDocument OriginalCopy = document; public readonly TextDocument Document = document; - public readonly List TextUpdaters = []; + public readonly List TextUpdaters = []; - public void AddEdit(Func updater) => this.TextUpdaters.Add(updater()); + public void AddEdit( + [NotNull] Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.TextUpdaters.Add(new(updater(), callerFile, callerMember, callerLine)); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddPatternEdit( Regex openingPattern, Regex closingPattern, - Func updater - ) => this.AddPatternEdit(50, openingPattern, closingPattern, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddPatternEdit(50, openingPattern, closingPattern, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddPatternEdit( uint priority, Regex openingPattern, Regex closingPattern, - Func updater - ) => this.AddPatternEdit(priority, openingPattern, closingPattern, UpdateOptions.None, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddPatternEdit(priority, openingPattern, closingPattern, UpdateOptions.None, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddPatternEdit( Regex openingPattern, Regex closingPattern, UpdateOptions options, - Func updater - ) => this.AddPatternEdit(50, openingPattern, closingPattern, options, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddPatternEdit(50, openingPattern, closingPattern, options, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddPatternEdit( uint priority, Regex openingPattern, Regex closingPattern, UpdateOptions options, - Func updater - ) => this.AddEdit(() => new PatternUpdater(priority, openingPattern, closingPattern, options, updater)); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddEdit(() => new PatternUpdater(priority, openingPattern, closingPattern, options, updater), callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddRegexEdit( Regex pattern, - Func updater - ) => this.AddRegexEdit(50, pattern, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddRegexEdit(50, pattern, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddRegexEdit( Regex pattern, UpdateOptions options, - Func updater - ) => this.AddRegexEdit(50, pattern, options, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddRegexEdit(50, pattern, options, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddRegexEdit( uint priority, Regex pattern, - Func updater - ) => this.AddRegexEdit(priority, pattern, UpdateOptions.None, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddRegexEdit(priority, pattern, UpdateOptions.None, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddRegexEdit( uint priority, Regex pattern, UpdateOptions options, - Func updater - ) => this.AddEdit(() => new RegexUpdater(priority, pattern, options, updater)); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddEdit(() => new RegexUpdater(priority, pattern, options, updater), callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddExactEdit( int startingIndex, int startingColumn, int endingIndex, int endingColumn, - Func updater - ) => this.AddExactEdit(startingIndex, startingColumn, endingIndex, endingColumn, UpdateOptions.None, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddExactEdit(startingIndex, startingColumn, endingIndex, endingColumn, UpdateOptions.None, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddExactEdit( int startingIndex, int startingColumn, int endingIndex, int endingColumn, UpdateOptions options, - Func updater - ) => this.AddExactEdit(50, startingIndex, startingColumn, endingIndex, endingColumn, options, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddExactEdit(50, startingIndex, startingColumn, endingIndex, endingColumn, options, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddExactEdit( uint priority, int startingIndex, int startingColumn, int endingIndex, int endingColumn, - Func updater - ) => this.AddExactEdit(priority, startingIndex, startingColumn, endingIndex, endingColumn, UpdateOptions.None, updater); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddExactEdit(priority, startingIndex, startingColumn, endingIndex, endingColumn, UpdateOptions.None, updater, callerFile, callerMember, callerLine); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public void AddExactEdit( uint priority, int startingIndex, @@ -187,6 +277,9 @@ public void AddExactEdit( int endingIndex, int endingColumn, UpdateOptions options, - Func updater - ) => this.AddEdit(() => new ExactUpdater(priority, startingIndex, startingColumn, endingIndex, endingColumn, options, updater)); + Func updater, + [CallerFilePath] string callerFile = "", + [CallerMemberName] string callerMember = "", + [CallerLineNumber] int callerLine = default + ) => this.AddEdit(() => new ExactUpdater(priority, startingIndex, startingColumn, endingIndex, endingColumn, options, updater), callerFile, callerMember, callerLine); } diff --git a/src/Compiler/Text/Span.cs b/src/Compiler/Text/Span.cs index 13c44032..17e3edc2 100644 --- a/src/Compiler/Text/Span.cs +++ b/src/Compiler/Text/Span.cs @@ -1,8 +1,10 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; +using System.Globalization; using System.Text; using LanguageExt; @@ -18,7 +20,18 @@ public enum UpdateOptions { InsertInline = 2 } -public record TextSpan { +public sealed record ContentChange( + int LineOffset, + int StartingColumnOffset, + int EndingColumnOffset +); + +public sealed record TextSpan : IComparable { + /// + /// An empty span that contains no content and has no updates. + /// + public static readonly TextSpan Empty = new(0, 0, 0, 0); + [NotNull, JetBrains.Annotations.NonNegativeValue] public int StartingIndex { get; init; } [NotNull, JetBrains.Annotations.NonNegativeValue] @@ -28,6 +41,11 @@ public record TextSpan { [NotNull, JetBrains.Annotations.NonNegativeValue] public int EndingColumn { get; init; } + /// + /// Provides a list of updates that have been applied to the span, in order of application. + /// + private IEnumerable AppliedUpdates { get; init; } = []; + /// /// Initialises a new instance of the TextSpan class allowing for logical spans of text to be defined. /// @@ -84,6 +102,8 @@ public static Fin New( } } + [Pure] + [return: NotNull] public bool Contains(int index, int column) { if (index < this.StartingIndex || index > this.EndingIndex) { return false; @@ -100,6 +120,41 @@ public bool Contains(int index, int column) { return true; } + [Pure] + [return: NotNull] + public bool Contains([NotNull] TextSpan span) { + if (span.StartingIndex < this.StartingIndex || span.EndingIndex > this.EndingIndex) { + return false; + } + + if (span.StartingIndex == this.StartingIndex && span.StartingColumn < this.StartingColumn) { + return false; + } + + if (span.EndingIndex == this.EndingIndex && span.EndingColumn > this.EndingColumn) { + return false; + } + + return true; + } + + /// + /// Determines if the span overlaps either the starting or end of the span, + /// but does not contain the entire span. + /// + /// + /// + public bool OverlapsNotContained(TextSpan span) { + var overlapping = false; + if (span.StartingIndex == this.StartingIndex) { + overlapping = span.StartingColumn < this.EndingColumn; + } else if (span.EndingIndex == this.EndingIndex) { + overlapping = span.EndingColumn > this.StartingColumn; + } + + return overlapping; + } + public string GetContent(TextDocument document) => this.GetContent([.. document.GetLines()]); [Pure] @@ -145,58 +200,56 @@ public string GetContent(string[] lines) { /// /// The number of lines added or removed by the update. /// - public int SetContent( + public Fin SetContent( [NotNull] List lines, [NotNull] UpdateOptions options, [NotNull] string[] content ) { - ArgumentNullException.ThrowIfNull(lines); - ArgumentNullException.ThrowIfNull(options); - ArgumentNullException.ThrowIfNull(content); - if (this.StartingIndex < 0 || this.StartingIndex >= lines.Count) { - throw new ArgumentOutOfRangeException(nameof(lines), $"Starting index {this.StartingIndex} is out of range for document with {lines.Count} lines"); + return Error.New($"Starting index {this.StartingIndex} is out of range for document with {lines.Count} lines"); } if (this.EndingIndex < 0 || this.EndingIndex >= lines.Count) { - throw new ArgumentOutOfRangeException(nameof(lines), $"Ending index {this.EndingIndex} is out of range for document with {lines.Count} lines"); + return Error.New($"Ending index {this.EndingIndex} is out of range for document with {lines.Count} lines"); } if (this.StartingIndex > this.EndingIndex) { - throw new ArgumentOutOfRangeException(nameof(lines), $"Starting index {this.StartingIndex} is greater than ending index {this.EndingIndex}"); + return Error.New($"Starting index {this.StartingIndex} is greater than ending index {this.EndingIndex}"); } if (this.StartingIndex == this.EndingIndex && this.StartingColumn > this.EndingColumn) { - throw new ArgumentOutOfRangeException(nameof(lines), $"Starting column {this.StartingColumn} is greater than ending column {this.EndingColumn} on the same line"); + return Error.New($"Starting column {this.StartingColumn} is greater than ending column {this.EndingColumn} on the same line"); } var startingLine = lines[this.StartingIndex]; if (startingLine.Length < this.StartingColumn) { - throw new ArgumentOutOfRangeException(nameof(lines), $"Starting column {this.StartingColumn} is out of range for line with {startingLine.Length} characters. Line: {startingLine}"); + return Error.New($"Starting column {this.StartingColumn} is out of range for line with {startingLine.Length} characters. Line: {startingLine}"); } var endingLine = lines[this.EndingIndex]; if (endingLine.Length < this.EndingColumn) { - throw new ArgumentOutOfRangeException(nameof(lines), $"Ending column {this.EndingColumn} is out of range for line with {endingLine.Length} characters. Line: {endingLine}"); + return Error.New($"Ending column {this.EndingColumn} is out of range for line with {endingLine.Length} characters. Line: {endingLine}"); } - var offset = 0; var firstLineBefore = startingLine[..this.StartingColumn]; var lastLineAfter = endingLine[this.EndingColumn..]; + var startingColumnOffset = -firstLineBefore?.Length ?? 0; + var endingColumnOffset = -(this.EndingColumn + (lastLineAfter?.Length ?? 0)); + var lineOffset = 0; if (this.StartingIndex == this.EndingIndex) { lines.RemoveAt(this.StartingIndex); - offset--; + lineOffset--; // Short circuit if the new content is empty, there will be no need to update the document. if (string.IsNullOrEmpty(firstLineBefore) && string.IsNullOrEmpty(lastLineAfter) && content.Length == 0) { - return offset; + return new ContentChange(lineOffset, startingColumnOffset, endingColumnOffset); } } else { // Remove all lines in the span to get a clean slate. for (var i = this.StartingIndex; i <= this.EndingIndex; i++) { lines.RemoveAt(this.StartingIndex); - offset--; + lineOffset--; } } @@ -205,52 +258,192 @@ [NotNull] string[] content if (!string.IsNullOrEmpty(firstLineBefore)) { lineContent.Append(firstLineBefore); + startingColumnOffset += firstLineBefore.Length; + + if (this.StartingIndex == this.EndingIndex) { + endingColumnOffset += firstLineBefore.Length; + } } if (content.Length > 0) { - lineContent.Append(content[0]); + var firstLineContent = content[0]; + lineContent.Append(firstLineContent); if (content.Length > 1) { lines.InsertRange(this.StartingIndex, content.Skip(1)); - offset += content.Length - 1; + lineOffset += content.Length - 1; + endingColumnOffset += content[^1].Length; + } else if (this.StartingIndex == this.EndingIndex) { + endingColumnOffset += firstLineContent.Length; } } if (!string.IsNullOrEmpty(lastLineAfter)) { if (this.StartingIndex != this.EndingIndex || content.Length > 1) { - lines[this.EndingIndex + offset] += lastLineAfter; + lines[this.EndingIndex + lineOffset] += lastLineAfter; + endingColumnOffset += lastLineAfter.Length; } else { lineContent.Append(lastLineAfter); + endingColumnOffset += lastLineAfter.Length; } } lines.Insert(this.StartingIndex, lineContent.ToString()); - offset++; + lineOffset++; + + if (this.StartingIndex == this.EndingIndex) { + endingColumnOffset += startingColumnOffset; + } } else { var insertingAfterStartingIndex = false; if (!string.IsNullOrEmpty(firstLineBefore)) { lines.Insert(this.StartingIndex, firstLineBefore); insertingAfterStartingIndex = true; - offset++; + lineOffset++; + startingColumnOffset += firstLineBefore.Length; + if (this.StartingIndex == this.EndingIndex && content.Length == 0) { + endingColumnOffset += firstLineBefore.Length; + } } if (content.Length > 0) { lines.InsertRange(this.StartingIndex + (insertingAfterStartingIndex ? 1 : 0), content); - offset += content.Length; + lineOffset += content.Length; } if (!string.IsNullOrEmpty(lastLineAfter)) { - lines.Insert(this.EndingIndex + offset + 1, lastLineAfter); - offset++; + lines.Insert(this.EndingIndex + lineOffset + 1, lastLineAfter); + endingColumnOffset += lastLineAfter.Length; + lineOffset++; + } else if (content.Length > 0) { + endingColumnOffset += content[^1].Length; + } + } + + return new ContentChange(lineOffset, startingColumnOffset, endingColumnOffset); + } + + public Fin RemoveContent(List lines) => this.SetContent(lines, UpdateOptions.None, []); + + [Pure] + [return: NotNull] + public TextSpan WithUpdate(params IEnumerable updateInfo) { + ArgumentNullException.ThrowIfNull(updateInfo); + + if (!updateInfo.Any()) return this; + + var startingIndex = this.StartingIndex; + var endingIndex = this.EndingIndex; + var startingColumn = this.StartingColumn; + var endingColumn = this.EndingColumn; + foreach (var info in updateInfo) { + if (info.TextSpan.StartingIndex <= this.StartingIndex) { + startingIndex += info.Change.LineOffset; + if (info.TextSpan.StartingIndex == this.StartingIndex) { + if (info.TextSpan.StartingColumn <= this.StartingColumn) { + startingColumn = Math.Max(0, startingColumn + info.Change.StartingColumnOffset); + } + } + } + + + if (info.TextSpan.StartingIndex <= this.EndingIndex) { + endingIndex += info.Change.LineOffset; + } + + if (info.TextSpan.StartingIndex == this.EndingIndex && info.TextSpan.StartingColumn <= this.EndingColumn) { + endingColumn = Math.Max(0, endingColumn + info.Change.StartingColumnOffset); + } else if (info.TextSpan.EndingIndex == this.EndingIndex) { + if ((info.TextSpan.EndingColumn + info.Change.EndingColumnOffset) <= this.EndingColumn) { + endingColumn = Math.Max(0, endingColumn + info.Change.EndingColumnOffset); + } + } + } + + return this with { + StartingIndex = startingIndex, + EndingIndex = endingIndex, + StartingColumn = startingColumn, + EndingColumn = endingColumn + }; + + // var startingIndexOffset = updateInfo.Where( + // info => info.TextSpan.StartingIndex <= this.StartingIndex + // ).Sum(info => info.LineOffset); + // var endingIndexOffset = updateInfo.Where( + // info => info.TextSpan.StartingIndex <= this.EndingIndex + // ).Sum(info => info.LineOffset); + + // var newStartingIndex = this.StartingIndex + startingIndexOffset; + // var newEndingIndex = this.EndingIndex + endingIndexOffset; + // var newAppliedUpdates = this.AppliedUpdates.Concat(updateInfo); + + // return this with { + // StartingIndex = newStartingIndex, + // EndingIndex = newEndingIndex, + // AppliedUpdates = newAppliedUpdates + // }; + } + + public string StringifyOffset( + ContentChange change + ) => $"(({this.StartingIndex} + {change.LineOffset})[({this.StartingColumn} + {change.StartingColumnOffset})..])..(({this.EndingIndex} + {change.LineOffset})[{this.EndingColumn} + {change.EndingColumnOffset}])"; + + public override string ToString() { + var caller = new StackFrame(2).GetMethod(); + var sb = new StringBuilder().Append(CultureInfo.InvariantCulture, $"({this.StartingIndex}[{this.StartingColumn}])..({this.EndingIndex}[{this.EndingColumn}])"); + + var originalStartingIndex = this.StartingIndex; + var originalEndingIndex = this.EndingIndex; + + // If the caller is this ToString method, return a simple string representation, otherwise include the applied updates. + var skipListingUpdates = caller?.DeclaringType != typeof(SpanUpdateInfo); + if (this.AppliedUpdates.Any()) { + if (!skipListingUpdates) { + sb.Append(CultureInfo.InvariantCulture, $" with {this.AppliedUpdates.Count()} applied updates"); + } + + foreach (var update in this.AppliedUpdates) { + if (!skipListingUpdates) { + sb.Append(CultureInfo.InvariantCulture, $"\n\t{update}"); + } } } - return offset; + return sb.ToString(); } - public int RemoveContent(List lines) => this.SetContent(lines, UpdateOptions.None, []); + + /// + /// Spans that are contained within other spans are first, + /// If they overlap, the span that starts first is first, + /// If they start at the same index and column, the span that ends first is first. + /// + public int CompareTo(TextSpan? other) { + if (ReferenceEquals(this, other) || this.Equals(other)) return 0; + if (other is null) return 1; + + if (this.Contains(other)) return 1; + if (other.Contains(this)) return -1; + + if (this.StartingIndex != other.StartingIndex) return this.StartingIndex.CompareTo(other.StartingIndex); + if (this.StartingColumn != other.StartingColumn) return this.StartingColumn.CompareTo(other.StartingColumn); + if (this.EndingIndex != other.EndingIndex) return this.EndingIndex.CompareTo(other.EndingIndex); + if (this.EndingColumn != other.EndingColumn) return this.EndingColumn.CompareTo(other.EndingColumn); + + if (this.OverlapsNotContained(other)) return -1; + if (other.OverlapsNotContained(this)) return 1; + + return 0; + } public override int GetHashCode() => HashCode.Combine(this.StartingIndex, this.StartingColumn, this.EndingIndex, this.EndingColumn); - public override string ToString() => $"({this.StartingIndex}, {this.StartingColumn}) - ({this.EndingIndex}, {this.EndingColumn})"; + public static bool operator <(TextSpan left, TextSpan right) => left is null ? right is not null : left.CompareTo(right) < 0; + + public static bool operator <=(TextSpan left, TextSpan right) => left is null || left.CompareTo(right) <= 0; + + public static bool operator >(TextSpan left, TextSpan right) => left is not null && left.CompareTo(right) > 0; + + public static bool operator >=(TextSpan left, TextSpan right) => left is null ? right is null : left.CompareTo(right) >= 0; } diff --git a/src/Compiler/Text/Updater.cs b/src/Compiler/Text/Updater.cs index ca9f27a7..1696183e 100644 --- a/src/Compiler/Text/Updater.cs +++ b/src/Compiler/Text/Updater.cs @@ -2,19 +2,19 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Diagnostics.CodeAnalysis; -using Compiler.Text.Updater; using LanguageExt; namespace Compiler.Text; public record SpanUpdateInfo( + [NotNull] TextSpanUpdater Updater, [NotNull] TextSpan TextSpan, - [NotNull] int Offset + [NotNull] ContentChange Change ) { - public override string ToString() => $"{nameof(PatternUpdater)}({this.TextSpan} +- {this.Offset})"; + public override string ToString() => $"[{this.TextSpan} + {this.TextSpan.StringifyOffset(this.Change)}]->{this.Updater}"; } -public abstract class TextSpanUpdater(uint priority = 50) { +public abstract class TextSpanUpdater(uint priority = 50) : IComparable { public readonly uint Priority = priority; /// @@ -26,7 +26,7 @@ public abstract class TextSpanUpdater(uint priority = 50) { /// /// The number of lines changed by the update. /// - public abstract Fin Apply(List lines); + public abstract Fin> Apply(List lines); /// /// Use informaiton from another update to possibly update this ones variables. @@ -34,4 +34,29 @@ public abstract class TextSpanUpdater(uint priority = 50) { /// [ExcludeFromCodeCoverage(Justification = "This is a virtual method that may be overridden.")] public virtual void PushByUpdate(SpanUpdateInfo updateInfo) { /*Do Nothing*/ } + + public virtual int CompareTo(TextSpanUpdater? other) => other is null ? -1 : this.Priority.CompareTo(other.Priority); + + public override string ToString() => $"{this.GetType().Name}[{this.Priority}]"; + + public override bool Equals(object? obj) { + if (ReferenceEquals(this, obj)) return true; + if (obj is null) return false; + + return obj is TextSpanUpdater updater && this.Priority == updater.Priority; + } + + public override int GetHashCode() => this.Priority.GetHashCode(); + + public static bool operator ==(TextSpanUpdater left, TextSpanUpdater right) => left is null ? right is null : left.Equals(right); + + public static bool operator !=(TextSpanUpdater left, TextSpanUpdater right) => !(left == right); + + public static bool operator <(TextSpanUpdater left, TextSpanUpdater right) => left is null ? right is not null : left.CompareTo(right) < 0; + + public static bool operator <=(TextSpanUpdater left, TextSpanUpdater right) => left is null || left.CompareTo(right) <= 0; + + public static bool operator >(TextSpanUpdater left, TextSpanUpdater right) => left is not null && left.CompareTo(right) > 0; + + public static bool operator >=(TextSpanUpdater left, TextSpanUpdater right) => left is null ? right is null : left.CompareTo(right) >= 0; } diff --git a/src/Compiler/Text/Updater/AstUpdater.cs b/src/Compiler/Text/Updater/AstUpdater.cs index 8d916ce6..e3dab0bc 100644 --- a/src/Compiler/Text/Updater/AstUpdater.cs +++ b/src/Compiler/Text/Updater/AstUpdater.cs @@ -8,51 +8,28 @@ namespace Compiler.Text.Updater; public class AstUpdater( uint priority, - Func astPredicate, + Func predicate, Func updater, - UpdateOptions options) : TextSpanUpdater(priority) { - public override Fin Apply(List lines) => AstHelper.GetAstReportingErrors(string.Join('\n', lines), Some("AstUpdater"), ["ModuleNotFoundDuringParse"]) + UpdateOptions options +) : NodeEnumerableUpdater(priority, predicate, updater, options) { + public override Fin> GetUpdatableNodes(List lines, Func predicate, UpdateOptions options) => AstHelper.GetAstReportingErrors(string.Join('\n', lines), Some("AstUpdater"), ["ModuleNotFoundDuringParse"], out _) .AndThen(ast => { IEnumerable nodesToUpdate; if (options.HasFlag(UpdateOptions.MatchEntireDocument)) { - nodesToUpdate = ast.FindAll(astPredicate, true); - if (!nodesToUpdate.Any()) return FinSucc([]); + nodesToUpdate = ast.FindAll(predicate, true); } else { - var node = ast.Find(astPredicate, true); - if (node == null) return FinSucc([]); + var node = ast.Find(predicate, true); + if (node == null) return []; nodesToUpdate = [node]; } - var offset = 0; - var updateSpans = new List(); - foreach (var node in nodesToUpdate) { - var thisOffset = 0; - var extent = node.Extent; - var spanResult = TextSpan.New( - extent.StartLineNumber - 1, - extent.StartColumnNumber - 1, - extent.EndLineNumber - 1, - extent.EndColumnNumber - 1 - ); - if (spanResult.IsErr(out var err, out var span)) { - return FinFail(err); - } - - var isMultiLine = span.StartingIndex != span.EndingIndex; - var newContent = updater(node); - ArgumentNullException.ThrowIfNull(newContent); - - // Remove the entire line if the replacement is empty and the match is the entire line. - if (newContent == null && span.StartingColumn == 0 && span.EndingColumn == lines[span.StartingIndex].Length) { - thisOffset += span.RemoveContent(lines); - } else { - thisOffset += span.SetContent(lines, options, newContent!); - } - - updateSpans.Add(new SpanUpdateInfo(span, thisOffset)); - offset += thisOffset; - } - - return updateSpans.ToArray(); + return nodesToUpdate; }); + + public override Fin GetSpan(Ast item) => TextSpan.New( + item.Extent.StartLineNumber - 1, + item.Extent.StartColumnNumber - 1, + item.Extent.EndLineNumber - 1, + item.Extent.EndColumnNumber - 1 + ); } diff --git a/src/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs b/src/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs new file mode 100644 index 00000000..62408c68 --- /dev/null +++ b/src/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs @@ -0,0 +1,13 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Management.Automation.Language; + +namespace Compiler.Text.Updater.Built; + +public sealed class CommentRemovalUpdater() : TokenUpdater( + 10, + static token => token.Kind == TokenKind.Comment, + static comment => [], + UpdateOptions.InsertInline +); diff --git a/src/Compiler/Text/Updater/Built/HereString.cs b/src/Compiler/Text/Updater/Built/HereStringUpdater.cs similarity index 98% rename from src/Compiler/Text/Updater/Built/HereString.cs rename to src/Compiler/Text/Updater/Built/HereStringUpdater.cs index a754135e..e45691e7 100644 --- a/src/Compiler/Text/Updater/Built/HereString.cs +++ b/src/Compiler/Text/Updater/Built/HereStringUpdater.cs @@ -7,7 +7,7 @@ namespace Compiler.Text.Updater.Built; -public partial class HereStringUpdater() : AstUpdater( +public sealed class HereStringUpdater() : AstUpdater( 80, static ast => ast is StringConstantExpressionAst stringConstantAst && stringConstantAst.StringConstantType is StringConstantType.SingleQuotedHereString or StringConstantType.DoubleQuotedHereString, static hereString => InternalApply(hereString), diff --git a/src/Compiler/Text/Updater/IndentUpdater.cs b/src/Compiler/Text/Updater/Built/IndentUpdater.cs similarity index 58% rename from src/Compiler/Text/Updater/IndentUpdater.cs rename to src/Compiler/Text/Updater/Built/IndentUpdater.cs index 6077e4a6..0ac63772 100644 --- a/src/Compiler/Text/Updater/IndentUpdater.cs +++ b/src/Compiler/Text/Updater/Built/IndentUpdater.cs @@ -3,29 +3,26 @@ using LanguageExt; -namespace Compiler.Text.Updater; +namespace Compiler.Text.Updater.Built; public class IndentUpdater(int indentBy) : TextSpanUpdater(70) { private readonly int IndentBy = indentBy; - public override Fin Apply(List lines) { + public override Fin> Apply(List lines) { var updateSpans = new List(); var indentString = new string(' ', this.IndentBy); for (var i = 0; i < lines.Count; i++) { // Don't indent empty lines. - if (lines[i].Length == 0) { - continue; - } + if (lines[i].Length == 0) continue; lines[i] = $"{indentString}{lines[i]}"; var spanResult = TextSpan.New(i, 0, i, 0); - if (spanResult.IsErr(out var err, out var span)) { - return FinFail(err); - } + if (spanResult.IsErr(out var err, out var span)) return err; - updateSpans.Add(new SpanUpdateInfo(span, this.IndentBy)); + var change = new ContentChange(0, this.IndentBy, 0); + updateSpans.Add(new SpanUpdateInfo(this, span, change)); } - return FinSucc(updateSpans.ToArray()); + return updateSpans; } } diff --git a/src/Compiler/Text/Updater/Built/NewLineRemovalUpdater.cs b/src/Compiler/Text/Updater/Built/NewLineRemovalUpdater.cs new file mode 100644 index 00000000..dcde8b66 --- /dev/null +++ b/src/Compiler/Text/Updater/Built/NewLineRemovalUpdater.cs @@ -0,0 +1,13 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Management.Automation.Language; + +namespace Compiler.Text.Updater.Built; + +public sealed class NewLineRemovalUpdater() : TokenUpdater( + 5, + static token => token.Kind == TokenKind.NewLine, + static newline => [], + UpdateOptions.InsertInline +); diff --git a/src/Compiler/Text/Updater/ExactUpdater.cs b/src/Compiler/Text/Updater/ExactUpdater.cs index 3cca2e30..0cffa063 100644 --- a/src/Compiler/Text/Updater/ExactUpdater.cs +++ b/src/Compiler/Text/Updater/ExactUpdater.cs @@ -43,18 +43,18 @@ [NotNull] Func updater this.Span = TextSpan.New(startingIndex, startingColumn, endingIndex, endingColumn).ThrowIfFail(); if (this.Span.StartingIndex == this.Span.EndingIndex && this.Span.StartingColumn > this.Span.EndingColumn) { - throw new ArgumentException($"Starting column must be less than ending column, got {this.Span.StartingColumn} and {this.Span.EndingColumn}."); + throw new ArgumentException($"Starting column must be less than ending column, got {this.Span.StartingColumn}..{this.Span.EndingColumn}."); } } - public override Fin Apply([NotNull] List lines) => lines.AsOption() + public override Fin> Apply([NotNull] List lines) => lines.AsOption() .FailIf( - l => l.Count - 1 < this.Span.StartingIndex || this.Span.EndingIndex > l.Count - 1, - l => Error.New($"Span indexes must be within the bounds of the document ({l.Count}), got {this.Span.StartingIndex} and {this.Span.EndingIndex}.")) + l => l.Count <= this.Span.StartingIndex || this.Span.EndingIndex >= l.Count, + l => Error.New($"Span indexes must be within the length of the document ({l.Count}), was {this.Span.StartingIndex}..{this.Span.EndingIndex}.")) .FailIfOpt( l => this.Span.StartingIndex > this.Span.EndingIndex, - l => Error.New($"Starting index must be less than ending index, got {this.Span.StartingIndex} and {this.Span.EndingIndex}.")) - .FailIfOpt( + l => Error.New($"Starting index must be less than ending index, was {this.Span.StartingIndex}..{this.Span.EndingIndex}.")) + .FailIfOpt( l => this.Span.StartingColumn > l[this.Span.StartingIndex].Length, l => Error.New($"Starting column must be less than the length of the line ({l[this.Span.StartingIndex].Length - 1}), got index {this.Span.StartingColumn}.") ) @@ -63,40 +63,34 @@ public override Fin Apply([NotNull] List lines) => lin l => Error.New($"Ending column must be less than the length of the line ({l[this.Span.EndingIndex].Length - 1}), got index {this.Span.EndingColumn}.") ) .AndThen(opt => opt.UnwrapOr([])) - .AndThen, SpanUpdateInfo[]>(lines => { - string[] newLines; - int offset; + .Bind(lines => { + Fin change; if (this.Span.StartingIndex == this.Span.EndingIndex) { var updatingLine = lines[this.Span.StartingIndex][this.Span.StartingColumn..this.Span.EndingColumn]; - newLines = this.Updater([updatingLine]); - offset = this.Span.SetContent(lines, this.UpdateOptions, newLines); + + change = this.Span.SetContent(lines, this.UpdateOptions, this.Updater([updatingLine])); } else { var updatingLines = lines.Skip(this.Span.StartingIndex).Take(this.Span.EndingIndex - this.Span.StartingIndex + 1).ToArray(); // Trim the starting and ending lines to the correct columns. updatingLines[0] = lines[this.Span.StartingIndex][this.Span.StartingColumn..]; updatingLines[^1] = lines[this.Span.EndingIndex][..this.Span.EndingColumn]; - newLines = this.Updater(updatingLines); - offset = this.Span.SetContent(lines, this.UpdateOptions, newLines); + change = this.Span.SetContent(lines, this.UpdateOptions, this.Updater(updatingLines)); } - return [new SpanUpdateInfo(this.Span, offset)]; + return change.AndThen(c => { + return new SpanUpdateInfo(this, this.Span, c); + }); }); - public override void PushByUpdate(SpanUpdateInfo updateInfo) { - if (this.Span.StartingIndex >= updateInfo.TextSpan.StartingIndex) { - this.Span = this.Span with { - StartingIndex = this.Span.StartingIndex + updateInfo.Offset - }; - } + public override void PushByUpdate(SpanUpdateInfo updateInfo) => this.Span = this.Span.WithUpdate(updateInfo); - if (this.Span.EndingIndex >= updateInfo.TextSpan.StartingIndex) { - this.Span = this.Span with { - EndingIndex = this.Span.EndingIndex + updateInfo.Offset - }; - } - } + public override string ToString() => $"{nameof(ExactUpdater)}[{this.Priority}]->{this.Span}"; + + public override int CompareTo(TextSpanUpdater? other) { + if (other is null) return -1; + if (other is not ExactUpdater otherUpdater) return -1; - public override string ToString() => - $"{nameof(ExactUpdater)}({this.Span.StartingIndex}[{this.Span.StartingColumn}..]..{this.Span.EndingIndex}[..{this.Span.EndingColumn}])"; + return this.Span.CompareTo(otherUpdater.Span); + } } diff --git a/src/Compiler/Text/Updater/NodeEnumerableUpdater.cs b/src/Compiler/Text/Updater/NodeEnumerableUpdater.cs new file mode 100644 index 00000000..845042cc --- /dev/null +++ b/src/Compiler/Text/Updater/NodeEnumerableUpdater.cs @@ -0,0 +1,44 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using LanguageExt; + +namespace Compiler.Text.Updater; + +public abstract class NodeEnumerableUpdater( + uint priority, + Func itemPredicate, + Func itemUpdater, + UpdateOptions options +) : TextSpanUpdater(priority) { + public abstract Fin> GetUpdatableNodes(List lines, Func predicate, UpdateOptions options); + + public abstract Fin GetSpan(TItem item); + + public override Fin> Apply(List lines) { + var nodesResult = this.GetUpdatableNodes(lines, itemPredicate, options); + if (nodesResult.IsErr(out var err, out var nodes)) return err; + if (!nodes.Any()) return System.Array.Empty(); + + var updateSpans = new List(); + foreach (var node in nodes) { + Fin thisChange; + if (this.GetSpan(node).IsErr(out err, out var span)) return err; + span = span.WithUpdate(updateSpans); + + var isMultiLine = span.StartingIndex != span.EndingIndex; + var newContent = itemUpdater(node); + + // Remove the entire line if the replacement is empty and the match is the entire line. + thisChange = newContent.Length == 0 && span.StartingColumn == 0 && span.EndingColumn == lines[span.StartingIndex].Length + ? span.RemoveContent(lines) + : span.SetContent(lines, options, newContent!); + + if (thisChange.IsErr(out err, out var change)) return err; + + updateSpans.Add(new SpanUpdateInfo(this, span, change)); + } + + return updateSpans.ToArray(); + } +} diff --git a/src/Compiler/Text/Updater/PatternUpdater.cs b/src/Compiler/Text/Updater/PatternUpdater.cs index 85140f27..9e68060c 100644 --- a/src/Compiler/Text/Updater/PatternUpdater.cs +++ b/src/Compiler/Text/Updater/PatternUpdater.cs @@ -1,9 +1,11 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Diagnostics.Contracts; using System.Text; using System.Text.RegularExpressions; using CommandLine; +using LanguageExt; using NLog; namespace Compiler.Text.Updater; @@ -21,61 +23,44 @@ Func updater public Regex StartingPattern { get; } = startingPattern; public Regex EndingPattern { get; } = endingPattern; - public override LanguageExt.Fin Apply(List lines) { + public override Fin> Apply(List lines) { var spanUpdateInfo = new List(); - var skipRanges = new HashSet(); - var offset = 0; + var skipSpans = new List(); while (true) { - var (startIndex, endIndex) = this.FindStartToEndBlock([.. lines], offset, skipRanges); - if (startIndex == -1 || endIndex == -1) { - break; - } - - var spanResult = TextSpan.New(startIndex, 0, endIndex, lines[endIndex].Length); - if (spanResult.IsErr(out var err, out var span)) { - return FinFail(err); - } + var spanResult = this.FindStartToEndBlock(ref lines, ref skipSpans); + if (!spanResult.IsSome(out var span)) break; - var updatingLines = lines[startIndex..(endIndex + 1)].ToArray(); + var updatingLines = span.GetContent([.. lines]).Split('\n'); var newLines = this.Updater(updatingLines); - var thisOffset = span.SetContent(lines, options, newLines); - - offset += thisOffset; - skipRanges.Add(new Range(startIndex, endIndex)); - spanUpdateInfo.Add(new SpanUpdateInfo(span, thisOffset)); + var thisChange = span.SetContent(lines, options, newLines); + if (thisChange.IsErr(out var err, out var change)) return err; + + var thisUpdateInfo = new SpanUpdateInfo(this, span, change); + // Include self for updating because we want its new span location. + skipSpans.Add(span); + skipSpans = new List(skipSpans.Select(s => s.WithUpdate(thisUpdateInfo))); + spanUpdateInfo.Add(thisUpdateInfo); } - return FinSucc(spanUpdateInfo.ToArray()); + return spanUpdateInfo; } - private (int, int) FindStartToEndBlock( - string[] lines, - int offset, - HashSet skipRanges + [Pure] + private Option FindStartToEndBlock( + ref List lines, + ref List skipSpans ) { - if (lines == null || lines.Length == 0) { - return (-1, -1); - } - - var offsetSkipRanges = new HashSet>(); - foreach (var range in skipRanges) { - var clampedStart = Math.Clamp(range.Start.Value + offset, 0, lines.Length - 1); - var clampedEnd = Math.Clamp(range.End.Value + offset, 0, lines.Length - 1); - if (clampedStart < clampedEnd) { - offsetSkipRanges.Add(Enumerable.Range(clampedStart, clampedEnd - clampedStart + 1)); - } - } + if (lines == null || lines.Count == 0) return None; var startIndex = -1; var endIndex = -1; var openLevel = 0; - for (var i = 0; i < lines.Length; i++) { + for (var i = 0; i < lines.Count; i++) { var clonedLine = lines[i].Clone().Cast()!; - if (offsetSkipRanges.Any(range => range.Contains(i))) { - continue; - } + // TODO - Actually account for columns instead of just entire rows. + if (skipSpans.Any(span => span.Contains(i, 0) || span.Contains(i, clonedLine.Length))) continue; var openingMatch = this.StartingPattern.Matches(clonedLine); if (openingMatch.Count > 0) { @@ -112,8 +97,10 @@ HashSet skipRanges } } - return (startIndex, endIndex); + return startIndex == -1 || endIndex == -1 + ? None + : TextSpan.New(startIndex, 0, endIndex, lines[endIndex].Length).Unwrap(); } - public override string ToString() => $"{nameof(PatternUpdater)}({this.StartingPattern} -> {this.EndingPattern})"; + public override string ToString() => $"{nameof(PatternUpdater)}[{this.Priority}]->({this.StartingPattern}..{this.EndingPattern})"; } diff --git a/src/Compiler/Text/Updater/RegexUpdater.cs b/src/Compiler/Text/Updater/RegexUpdater.cs index 29f8639e..6cb97670 100644 --- a/src/Compiler/Text/Updater/RegexUpdater.cs +++ b/src/Compiler/Text/Updater/RegexUpdater.cs @@ -35,20 +35,15 @@ public Regex Pattern { /// An array of objects representing the updates made to the document. /// [return: NotNull] - public override Fin Apply([NotNull] List lines) { - ArgumentNullException.ThrowIfNull(lines); - + public override Fin> Apply([NotNull] List lines) { var multilinedContent = string.Join('\n', lines); var matches = this.Pattern.Matches(multilinedContent); + if (matches.Count == 0) return System.Array.Empty(); - if (matches.Count == 0) { - return FinSucc([]); - } - - var spanUpdateInfo = new List(); var offset = 0; + var spanUpdateInfo = new List(); foreach (Match match in matches) { - var thisOffset = 0; + Fin thisChange; var multilineEndingIndex = match.Index + match.Length; var contentBeforeThisLine = multilinedContent[..match.Index].LastIndexOf(value: '\n'); var isMultiLine = options.HasFlag(UpdateOptions.MatchEntireDocument) && match.Value.Contains('\n'); @@ -69,67 +64,22 @@ public override Fin Apply([NotNull] List lines) { var newContent = this.Updater(match); - // FIXME These shouldn't happen and are likely a bug in the updater. - if (startingLineIndex > lines.Count) { - return FinFail(new ArgumentOutOfRangeException( - nameof(lines), - startingLineIndex, - "Starting line index is greater than the number of lines in the document." - )); - } - if (endingLineIndex > lines.Count) { - return FinFail(new ArgumentOutOfRangeException( - nameof(lines), - endingLineIndex, - "Ending line index is greater than the number of lines in the document." - )); - } - if (startingColumn > lines[startingLineIndex].Length) { - return FinFail(new ArgumentOutOfRangeException( - nameof(lines), - startingColumn, - "Starting column is greater than the length of the line." - )); - } - if (endingColumn > lines[endingLineIndex].Length) { - return FinFail(new ArgumentOutOfRangeException( - nameof(lines), - endingColumn, - "Ending column is greater than the length of the line." - )); - } - if (startingLineIndex > endingLineIndex) { - return FinFail(new ArgumentOutOfRangeException( - nameof(lines), - startingLineIndex, - "Starting line index is greater than the ending line index." - )); - } - if (startingLineIndex == endingLineIndex && startingColumn > endingColumn) { - return FinFail(new ArgumentOutOfRangeException( - nameof(lines), - startingColumn, - "Starting column is greater than the ending column." - )); - } - // Remove the entire line if the replacement is empty and the match is the entire line. if (newContent == null && startingColumn == 0 && match.Length == lines[startingLineIndex].Length) { - thisOffset += span.RemoveContent(lines); + thisChange = span.RemoveContent(lines); } else { var newLines = newContent == null ? [] : isMultiLine ? newContent.Split('\n') : [newContent]; - thisOffset += span.SetContent(lines, options, newLines); - if (isMultiLine) { - thisOffset += newLines.Length - 1; - } + thisChange = span.SetContent(lines, options, newLines); } - spanUpdateInfo.Add(new SpanUpdateInfo(span, thisOffset)); - offset += thisOffset; + if (thisChange.IsErr(out var changeError, out var change)) return changeError; + + spanUpdateInfo.Add(new SpanUpdateInfo(this, span, change)); + offset += change.LineOffset; } - return FinSucc(spanUpdateInfo.ToArray()); + return spanUpdateInfo; } - public override string ToString() => $"{nameof(RegexUpdater)}({this.Pattern})"; + public override string ToString() => $"{nameof(RegexUpdater)}[{this.Priority}]->({this.Pattern})"; } diff --git a/src/Compiler/Text/Updater/TokenUpdater.cs b/src/Compiler/Text/Updater/TokenUpdater.cs new file mode 100644 index 00000000..faf48195 --- /dev/null +++ b/src/Compiler/Text/Updater/TokenUpdater.cs @@ -0,0 +1,26 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Management.Automation.Language; +using LanguageExt; + +namespace Compiler.Text.Updater; + +public class TokenUpdater( + uint priority, + Func predicate, + Func updater, + UpdateOptions options +) : NodeEnumerableUpdater(priority, predicate, updater, options) { + public override Fin> GetUpdatableNodes(List lines, Func predicate, UpdateOptions options) { + AstHelper.GetAstReportingErrors(string.Join('\n', lines), Some("TokenUpdater"), ["ModuleNotFoundDuringParse"], out var tokens); + return FinSucc(tokens.Where(predicate)); + } + + public override Fin GetSpan(Token token) => TextSpan.New( + token.Extent.StartLineNumber - 1, + token.Extent.StartColumnNumber - 1, + token.Extent.EndLineNumber - 1, + token.Extent.EndColumnNumber - 1 + ); +} diff --git a/src/Compiler/Utils.cs b/src/Compiler/Utils.cs index 573946b6..6eee8df1 100644 --- a/src/Compiler/Utils.cs +++ b/src/Compiler/Utils.cs @@ -193,13 +193,13 @@ public static Fin TapFail(this Fin fin, Action action) { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Fin> FailIf(this Option option, Predicate predicate, Func error) => option.Match( - Some: value => predicate(value) ? Fin>.Fail(error(value)) : Fin>.Succ(Some(value)), + Some: value => predicate(value) ? error(value) : Some(value), None: Fin>.Succ(None) ); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Fin> FailIf(this Option option, Predicate predicate, Error error) => option.Match( - Some: value => predicate(value) ? Fin>.Fail(error) : Fin>.Succ(Some(value)), + Some: value => predicate(value) ? error : Some(value), None: Fin>.Succ(None) ); @@ -213,7 +213,7 @@ public static Fin FailIf(this Fin fin, Predicate predicate, Error er [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Fin> FailIfOpt(this Fin> fin, Predicate predicate, Func error) => fin.Bind(option => option.Match( - Some: value => predicate(value) ? Fin>.Fail(error(value)) : Fin>.Succ(Some(value)), + Some: value => predicate(value) ? error(value) : Some(value), None: Fin>.Succ(None) )); From 1bcd30c5f61e5f2d26c93e0495b0d864bc17c26b Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 23 Sep 2024 12:57:42 +1000 Subject: [PATCH 155/341] fix(Compiler): Improve file deletion error handling and enhance error logging with debuggable output --- src/Compiler/Program.cs | 68 ++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index e6096ad7..82b9498d 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -318,7 +318,13 @@ public static async void Output( if (removeFile) { Logger.Trace("Removing file"); - File.Delete(outputPath); + + try { + File.Delete(outputPath); + } catch (IOException err) { + Errors.Add(LanguageExt.Common.Error.New("Unable to delete file", (Exception)err)); + return; + } } } @@ -354,8 +360,29 @@ Option outputDirectory do { var err = errorQueue.PopFirst(); + if (IsDebugging && outputDirectory.IsSome(out var outDir) + && err is WrappedErrorWithDebuggableContent wrappedDebuggable + && wrappedDebuggable.Module.IsSome(out var module) + && module is PathedModuleSpec pathedModuleSpec + && !outputDebuggables.Contains(module.Hash) + ) { + Output( + sourceDirectory, + outDir, + pathedModuleSpec.FullPath, + wrappedDebuggable.Content, + true + ); + + outputDebuggables.Add(module.Hash); + } + + if (err is WrappedErrorWithDebuggableContent wrappedErr) { + err = wrappedErr.InnerException; + } + // Flatten ManyErrors into the indiviuals - if (err is ManyErrors manyErrors) { + if (err is ManyErrors manyErrors && manyErrors.Count > 0) { errorQueue.PushRangeFirst(manyErrors.Errors); continue; } @@ -372,33 +399,18 @@ Option outputDirectory printedBefore = true; } - if (IsDebugging && outputDirectory.IsSome(out var outDir) - && err is WrappedErrorWithDebuggableContent wrappedDebuggable - && wrappedDebuggable.Module.IsSome(out var module) - && !outputDebuggables.Contains(module.Hash) - ) { - Output( - sourceDirectory, - outDir, - module.Name, - wrappedDebuggable.Content, - true - ); + var message = err.Message + (IsDebugging + ? (err.Exception.IsSome(out var exception) + ? Environment.NewLine + exception.StackTrace + : "") + : "" + ); - outputDebuggables.Add(module.Hash); + if (type == LogLevel.Error) { + Console.Error.WriteLine(message); + } else { + Console.WriteLine(message); } - - var message = err is Issue issue - ? issue.ToString() - : err.Message - + (IsDebugging - ? (err.Exception.IsSome(out var exception) - ? Environment.NewLine + exception.StackTrace - : "") - : "" - ); - - Logger.Log(type, message); } while (errorQueue.Count > 0); return 1; @@ -423,7 +435,7 @@ internal static Fin> RunPowerShell(string script, params ob pwsh.Streams.Warning.ToList().ForEach(log => Logger.Warn(log.Message)); if (pwsh.HadErrors) { - var ast = AstHelper.GetAstReportingErrors(script, None, ["ModuleNotFoundDuringParse"]).Match( + var ast = AstHelper.GetAstReportingErrors(script, None, ["ModuleNotFoundDuringParse"], out _).Match( ast => ast, error => { Logger.Error("Unable to parse ast of script for error reporting."); From 3d1124f1a42b7e526723a8be47bcc21267894c82 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 23 Sep 2024 13:55:36 +1000 Subject: [PATCH 156/341] feat(Compiler): Add support for extra module info JSON and enhance exported command retrieval Would be nice to also have this as a dynamic file that can be scripted so its always up to date. --- src/Compiler/Compiler.csproj | 1 + src/Compiler/Module/Compiled/Remote.cs | 50 +- .../ExchangeOnlineManagement.json | 781 ++++++++++++++++++ 3 files changed, 826 insertions(+), 6 deletions(-) create mode 100644 src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.json diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index a7bb9b88..4d0fb882 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -58,6 +58,7 @@ + diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index e62598b4..5876cbfc 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -5,6 +5,9 @@ using System.IO.Compression; using System.Management.Automation; using System.Management.Automation.Runspaces; +using System.Reflection; +using System.Text; +using System.Text.Json; using CommandLine; using Compiler.Requirements; using LanguageExt; @@ -13,6 +16,12 @@ namespace Compiler.Module.Compiled; public class CompiledRemoteModule : Compiled { + private record ExtraModuleInfo( + string[]? FunctionsToExport, + string[]? CmdletsToExport, + string[]? AliasesToExport + ); + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private Hashtable? PowerShellManifest; private ZipArchive? ZipArchive; @@ -43,10 +52,14 @@ public override string StringifyContent() { return $"'{base64}'"; } + // TODO - Cache the results of this function public IEnumerable GetExported(object? data, CommandTypes commandTypes) { + var exported = new List(); + switch (data) { case object[] strings: - return strings.Cast(); + exported.AddRange(strings.Cast()); + break; case string starString when starString == "*": var version = this.GetPowerShellManifest()["ModuleVersion"]!.ToString()!; var tempModuleRootPath = Path.Combine(Path.GetTempPath(), $"PowerShellGet\\_Export_{this.ModuleSpec.Name}"); @@ -60,17 +73,42 @@ public IEnumerable GetExported(object? data, CommandTypes commandTypes) var sessionState = InitialSessionState.CreateDefault2(); sessionState.ImportPSModulesFromPath(tempModuleRootPath); var pwsh = PowerShell.Create(sessionState); - return pwsh.Runspace.SessionStateProxy.InvokeCommand + exported.AddRange(pwsh.Runspace.SessionStateProxy.InvokeCommand .GetCommands("*", commandTypes, true) .Where(command => command.ModuleName == this.ModuleSpec.Name) - .Select(command => command.Name); + .Select(command => command.Name)); + break; case string str: - return [str]; + exported.Add(str); + break; case null: - return []; + break; default: - throw new InvalidDataException($"FunctionsToExport must be a string or an array of strings, but was {data.GetType()}"); + throw new InvalidDataException($"{commandTypes}sToExport must be a string or an array of strings, but was {data.GetType()}"); + } + + var info = Assembly.GetExecutingAssembly().GetName(); + var extraModuleInfoResource = $"{info.Name}.Resources.ExtraModuleInfo.{this.ModuleSpec.Name}.json"; + using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.ExtraModuleInfo.{this.ModuleSpec.Name}.json"); + if (templateStream == null) return exported; + + using var streamReader = new StreamReader(templateStream, Encoding.UTF8); + var extraModuleInfo = JsonSerializer.Deserialize(streamReader.ReadToEnd()); + if (extraModuleInfo == null) { + Logger.Warn($"Failed to parse extra module info for {this.ModuleSpec.Name}"); + return exported; } + + var extraExports = commandTypes switch { + CommandTypes.Function => extraModuleInfo.FunctionsToExport, + CommandTypes.Cmdlet => extraModuleInfo.CmdletsToExport, + CommandTypes.Alias => extraModuleInfo.AliasesToExport, + _ => throw new ArgumentOutOfRangeException(nameof(commandTypes), commandTypes, null) + }; + if (extraExports == null) return exported; + + exported.AddRange(extraExports); + return exported; } public override IEnumerable GetExportedFunctions() { diff --git a/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.json b/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.json new file mode 100644 index 00000000..e405c107 --- /dev/null +++ b/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.json @@ -0,0 +1,781 @@ +{ + "FunctionsToExport": [ + "Add-AvailabilityAddressSpace", + "Add-DistributionGroupMember", + "Add-MailboxFolderPermission", + "Add-MailboxLocation", + "Add-MailboxPermission", + "Add-ManagementRoleEntry", + "Add-PublicFolderClientPermission", + "Add-RecipientPermission", + "Add-RoleGroupMember", + "Add-UnifiedGroupLinks", + "Approve-ElevatedAccessRequest", + "Check-ExoInformationBarrierSymmetry", + "Clear-ActiveSyncDevice", + "Clear-MobileDevice", + "Clear-TextMessagingAccount", + "Compare-TextMessagingVerificationCode", + "Complete-MigrationBatch", + "Debug-AdditionalCapacityProtection", + "Delete-QuarantineMessage", + "Deny-ElevatedAccessRequest", + "Disable-AntiPhishRule", + "Disable-App", + "Disable-ATPEvaluationRule", + "Disable-ATPProtectionPolicyRule", + "Disable-BirthdayCalendar", + "Disable-DnssecForVerifiedDomain", + "Disable-EOPProtectionPolicyRule", + "Disable-HostedContentFilterRule", + "Disable-HostedOutboundSpamFilterRule", + "Disable-InboxRule", + "Disable-IPv6ForAcceptedDomain", + "Disable-JournalArchiving", + "Disable-JournalRule", + "Disable-Mailbox", + "Disable-MailPublicFolder", + "Disable-MalwareFilterRule", + "Disable-OutlookProtectionRule", + "Disable-ReportSubmissionRule", + "Disable-SafeAttachmentRule", + "Disable-SafeLinksRule", + "Disable-SmtpDaneInbound", + "Disable-SweepRule", + "Disable-TransportRule", + "Enable-AntiPhishRule", + "Enable-App", + "Enable-ATPEvaluationRule", + "Enable-ATPProtectionPolicyRule", + "Enable-BirthdayCalendar", + "Enable-DnssecForVerifiedDomain", + "Enable-EOPProtectionPolicyRule", + "Enable-ExoInformationBarriersMultiSegment", + "Enable-HostedContentFilterRule", + "Enable-HostedOutboundSpamFilterRule", + "Enable-InboxRule", + "Enable-IPv6ForAcceptedDomain", + "Enable-JournalRule", + "Enable-Mailbox", + "Enable-MailPublicFolder", + "Enable-MalwareFilterRule", + "Enable-OrganizationCustomization", + "Enable-OutlookProtectionRule", + "Enable-ReportSubmissionRule", + "Enable-SafeAttachmentRule", + "Enable-SafeLinksRule", + "Enable-SmtpDaneInbound", + "Enable-SweepRule", + "Enable-TransportRule", + "Export-ApplicationData", + "Export-DlpPolicyCollection", + "Export-MailboxDiagnosticLogs", + "Export-MigrationReport", + "Export-QuarantineMessage", + "Export-TransportRuleCollection", + "Get-AcceptedDomain", + "Get-AccessToCustomerDataRequest", + "Get-ActiveSyncDevice", + "Get-ActiveSyncDeviceAccessRule", + "Get-ActiveSyncDeviceClass", + "Get-ActiveSyncDeviceStatistics", + "Get-ActiveSyncMailboxPolicy", + "Get-ActiveSyncOrganizationSettings", + "Get-AdaptiveScope", + "Get-AddressBookPolicy", + "Get-AdminAuditLogConfig", + "Get-AdministrativeUnit", + "Get-AggregateZapReport", + "Get-AntiPhishPolicy", + "Get-AntiPhishRule", + "Get-App", + "Get-ApplicationAccessPolicy", + "Get-ArcConfig", + "Get-ATPBuiltInProtectionRule", + "Get-ATPEvaluationRule", + "Get-AtpPolicyForO365", + "Get-ATPProtectionPolicyRule", + "Get-ATPTotalTrafficReport", + "Get-AuditConfig", + "Get-AuditConfigurationPolicy", + "Get-AuditConfigurationRule", + "Get-AuditLogSearch", + "Get-AuthenticationPolicy", + "Get-AuthServer", + "Get-AvailabilityAddressSpace", + "Get-AvailabilityConfig", + "Get-BlockedConnector", + "Get-BlockedSenderAddress", + "Get-BookingMailbox", + "Get-CalendarDiagnosticAnalysis", + "Get-CalendarDiagnosticLog", + "Get-CalendarDiagnosticObjects", + "Get-CalendarProcessing", + "Get-CalendarSettings", + "Get-CalendarViewDiagnostics", + "Get-CASMailbox", + "Get-CASMailboxPlan", + "Get-ClassificationRuleCollection", + "Get-Clutter", + "Get-CompliancePolicyFileSyncNotification", + "Get-CompliancePolicySyncNotification", + "Get-ComplianceTag", + "Get-ComplianceTagStorage", + "Get-CompromisedUserAggregateReport", + "Get-CompromisedUserDetailReport", + "Get-ConfigAnalyzerPolicyRecommendation", + "Get-Contact", + "Get-ContentMalwareMdoAggregateReport", + "Get-ContentMalwareMdoDetailReport", + "Get-CrossTenantAccessPolicy", + "Get-CustomDlpEmailTemplates", + "Get-CustomizedUserSubmission", + "Get-DataClassification", + "Get-DataClassificationConfig", + "Get-DataEncryptionPolicy", + "Get-DataRetentionReport", + "Get-DetailZapReport", + "Get-DeviceComplianceDetailsReport", + "Get-DeviceComplianceDetailsReportFilter", + "Get-DeviceCompliancePolicyInventory", + "Get-DeviceComplianceReportDate", + "Get-DeviceComplianceSummaryReport", + "Get-DeviceComplianceUserInventory", + "Get-DeviceComplianceUserReport", + "Get-DeviceConditionalAccessPolicy", + "Get-DeviceConditionalAccessRule", + "Get-DeviceConfigurationPolicy", + "Get-DeviceConfigurationRule", + "Get-DevicePolicy", + "Get-DeviceTenantPolicy", + "Get-DeviceTenantRule", + "Get-DistributionGroup", + "Get-DistributionGroupMember", + "Get-DkimSigningConfig", + "Get-DlpDetailReport", + "Get-DlpDetectionsReport", + "Get-DlpIncidentDetailReport", + "Get-DlpKeywordDictionary", + "Get-DlpPolicy", + "Get-DlpPolicyTemplate", + "Get-DlpSensitiveInformationTypeConfig", + "Get-DlpSensitiveInformationTypeRulePackage", + "Get-DlpSiDetectionsReport", + "Get-DnssecStatusForVerifiedDomain", + "Get-DynamicDistributionGroup", + "Get-DynamicDistributionGroupMember", + "Get-ElevatedAccessApprovalPolicy", + "Get-ElevatedAccessAuthorization", + "Get-ElevatedAccessRequest", + "Get-EligibleDistributionGroupForMigration", + "Get-EmailAddressPolicy", + "Get-EmailTenantSettings", + "Get-EOPProtectionPolicyRule", + "Get-EtrLimits", + "Get-EvaluationModeReport", + "Get-EvaluationModeReportSeries", + "Get-EventsFromEmailConfiguration", + "Get-ExoConnectivityTableSnapshot", + "Get-ExoInformationBarrierPolicy", + "Get-ExoInformationBarrierRelationship", + "Get-ExoInformationBarrierRelationshipTable", + "Get-ExoInformationBarrierSegment", + "Get-ExoInformationBarrierUpgradeImpact", + "Get-ExoPhishSimOverrideRule", + "Get-ExoRecipientsStatus", + "Get-ExoSecOpsOverrideRule", + "Get-ExoSegmentsSnapshot", + "Get-ExoUsersByIBSegment", + "Get-ExportedCustomerContent", + "Get-ExternalInOutlook", + "Get-FailedContentIndexDocuments", + "Get-FederationInformation", + "Get-FederationTrust", + "Get-FfoMigrationReport", + "Get-FocusedInbox", + "Get-Group", + "Get-HistoricalSearch", + "Get-HostedConnectionFilterPolicy", + "Get-HostedContentFilterPolicy", + "Get-HostedContentFilterRule", + "Get-HostedOutboundSpamFilterPolicy", + "Get-HostedOutboundSpamFilterRule", + "Get-HybridMailflowDatacenterIPs", + "Get-InboundConnector", + "Get-InboxRule", + "Get-InformationBarrierReportDetails", + "Get-InformationBarrierReportSummary", + "Get-IntraOrganizationConfiguration", + "Get-IntraOrganizationConnector", + "Get-IPv6StatusForAcceptedDomain", + "Get-IRMConfiguration", + "Get-JitConfiguration", + "Get-JournalRule", + "Get-LinkedUser", + "Get-LogonStatistics", + "Get-M365CrossTenantAccessPolicy", + "Get-M365DataAtRestEncryptionPolicy", + "Get-M365DataAtRestEncryptionPolicyAssignment", + "Get-Mailbox", + "Get-MailboxAnalysisRequest", + "Get-MailboxAnalysisRequestStatistics", + "Get-MailboxAuditBypassAssociation", + "Get-MailboxAutoReplyConfiguration", + "Get-MailboxCalendarConfiguration", + "Get-MailboxCalendarFolder", + "Get-MailboxExtendedProperty", + "Get-MailboxFolder", + "Get-MailboxFolderPermission", + "Get-MailboxFolderStatistics", + "Get-MailboxIRMAccess", + "Get-MailboxJunkEmailConfiguration", + "Get-MailboxLocation", + "Get-MailboxMessageConfiguration", + "Get-MailboxOverrideConfiguration", + "Get-MailboxPermission", + "Get-MailboxPlan", + "Get-MailboxRegionalConfiguration", + "Get-MailboxRestoreRequest", + "Get-MailboxRestoreRequestStatistics", + "Get-MailboxSearch", + "Get-MailboxSpellingConfiguration", + "Get-MailboxStatistics", + "Get-MailboxUserConfiguration", + "Get-MailContact", + "Get-MailDetailATPReport", + "Get-MailDetailDlpPolicyReport", + "Get-MailDetailEncryptionReport", + "Get-MailDetailEvaluationModeReport", + "Get-MailDetailTransportRuleReport", + "Get-MailFilterListReport", + "Get-MailFlowStatusReport", + "Get-MailPublicFolder", + "Get-MailTrafficATPReport", + "Get-MailTrafficEncryptionReport", + "Get-MailTrafficPolicyReport", + "Get-MailTrafficSummaryReport", + "Get-MailUser", + "Get-MalwareFilterPolicy", + "Get-MalwareFilterRule", + "Get-ManagementRole", + "Get-ManagementRoleAssignment", + "Get-ManagementRoleEntry", + "Get-ManagementScope", + "Get-MessageCategory", + "Get-MessageClassification", + "Get-MessageTrace", + "Get-MessageTraceDetail", + "Get-MessageTrackingReport", + "Get-MigrationBatch", + "Get-MigrationConfig", + "Get-MigrationEndpoint", + "Get-MigrationStatistics", + "Get-MigrationUser", + "Get-MigrationUserStatistics", + "Get-MobileDevice", + "Get-MobileDeviceDashboardSummaryReport", + "Get-MobileDeviceMailboxPolicy", + "Get-MobileDeviceStatistics", + "Get-MoveRequest", + "Get-MoveRequestStatistics", + "Get-MxRecordReport", + "Get-MxRecordsReport", + "Get-Notification", + "Get-OMEConfiguration", + "Get-OnlineMeetingConfiguration", + "Get-OnPremisesOrganization", + "Get-OnPremServerExemptionQuota", + "Get-OnPremServerReportInfo", + "Get-OrganizationalUnit", + "Get-OrganizationConfig", + "Get-OrganizationRelationship", + "Get-OutboundConnector", + "Get-OutboundConnectorReport", + "Get-OutlookProtectionRule", + "Get-OwaMailboxPolicy", + "Get-PartnerApplication", + "Get-PerimeterConfig", + "Get-PerimeterMessageTrace", + "Get-PhishSimOverridePolicy", + "Get-Place", + "Get-PolicyConfig", + "Get-PolicyTipConfig", + "Get-PublicFolder", + "Get-PublicFolderClientPermission", + "Get-PublicFolderItemStatistics", + "Get-PublicFolderMailboxDiagnostics", + "Get-PublicFolderMailboxMigrationRequest", + "Get-PublicFolderMailboxMigrationRequestStatistics", + "Get-PublicFolderMoveRequest", + "Get-PublicFolderMoveRequestStatistics", + "Get-PublicFolderStatistics", + "Get-QuarantineMessage", + "Get-QuarantineMessageHeader", + "Get-QuarantinePolicy", + "Get-RbacDiagnosticInfo", + "Get-Recipient", + "Get-RecipientPermission", + "Get-RecipientStatisticsReport", + "Get-RemoteDomain", + "Get-ReportExecutionInstance", + "Get-ReportSchedule", + "Get-ReportScheduleList", + "Get-ReportSubmissionPolicy", + "Get-ReportSubmissionRule", + "Get-ResourceConfig", + "Get-RetentionEvent", + "Get-RetentionPolicy", + "Get-RetentionPolicyTag", + "Get-RMSTemplate", + "Get-RoleAssignmentPolicy", + "Get-RoleGroup", + "Get-RoleGroupMember", + "Get-SafeAttachmentPolicy", + "Get-SafeAttachmentRule", + "Get-SafeLinksAggregateReport", + "Get-SafeLinksDetailReport", + "Get-SafeLinksPolicy", + "Get-SafeLinksRule", + "Get-SCInsights", + "Get-ScopeEntities", + "Get-SearchDocumentFormat", + "Get-SecOpsOverridePolicy", + "Get-SecurityPrincipal", + "Get-SensitivityLabelActivityDetailsReport", + "Get-SensitivityLabelActivityReport", + "Get-ServiceDeliveryReport", + "Get-ServicePrincipal", + "Get-ServiceStatus", + "Get-SharingPolicy", + "Get-SmimeConfig", + "Get-SmtpDaneInboundStatus", + "Get-SpoofIntelligenceInsight", + "Get-SpoofMailReport", + "Get-SupervisoryReviewActivity", + "Get-SupervisoryReviewPolicyReport", + "Get-SupervisoryReviewPolicyV2", + "Get-SupervisoryReviewReport", + "Get-SupervisoryReviewRule", + "Get-SweepRule", + "Get-SyncConfig", + "Get-SyncRequest", + "Get-SyncRequestStatistics", + "Get-TenantAllowBlockListItems", + "Get-TenantAllowBlockListSpoofItems", + "Get-TenantExemptionInfo", + "Get-TenantExemptionQuota", + "Get-TenantExemptionQuotaEligibility", + "Get-TenantScanRequestStatistics", + "Get-TextMessagingAccount", + "Get-ToolInformation", + "Get-TransportConfig", + "Get-TransportRule", + "Get-TransportRuleAction", + "Get-TransportRulePredicate", + "Get-UnifiedAuditSetting", + "Get-UnifiedGroup", + "Get-UnifiedGroupLinks", + "Get-User", + "Import-DlpPolicyCollection", + "Import-RecipientDataProperty", + "Import-TransportRuleCollection", + "Invoke-BirthdayCalendarSync", + "New-ActiveSyncDeviceAccessRule", + "New-ActiveSyncMailboxPolicy", + "New-AdminAuditLogSearch", + "New-AntiPhishPolicy", + "New-AntiPhishRule", + "New-App", + "New-ApplicationAccessPolicy", + "New-ATPBuiltInProtectionRule", + "New-ATPEvaluationRule", + "New-ATPProtectionPolicyRule", + "New-AuthenticationPolicy", + "New-AvailabilityConfig", + "New-ClassificationRuleCollection", + "New-CompliancePolicySyncNotification", + "New-DatabaseMaintenanceRequest", + "New-DataClassification", + "New-DistributionGroup", + "New-DkimSigningConfig", + "New-DkimSigningConfigSelectorCnames", + "New-DlpPolicy", + "New-DynamicDistributionGroup", + "New-ElevatedAccessRequest", + "New-EmailAddressPolicy", + "New-EOPProtectionPolicyRule", + "New-ExoPhishSimOverrideRule", + "New-ExoSecOpsOverrideRule", + "New-Fingerprint", + "New-HostedConnectionFilterPolicy", + "New-HostedContentFilterPolicy", + "New-HostedContentFilterRule", + "New-HostedOutboundSpamFilterPolicy", + "New-HostedOutboundSpamFilterRule", + "New-InboundConnector", + "New-InboxRule", + "New-IntraOrganizationConnector", + "New-JournalRule", + "New-Mailbox", + "New-MailboxAnalysisRequest", + "New-MailboxAuditLogSearch", + "New-MailboxFolder", + "New-MailboxRestoreRequest", + "New-MailboxSearch", + "New-MailContact", + "New-MailMessage", + "New-MailUser", + "New-MalwareFilterPolicy", + "New-MalwareFilterRule", + "New-ManagementRole", + "New-ManagementRoleAssignment", + "New-ManagementScope", + "New-MessageClassification", + "New-MigrationBatch", + "New-MigrationEndpoint", + "New-MobileDeviceMailboxPolicy", + "New-MoveRequest", + "New-OnPremisesOrganization", + "New-OrganizationRelationship", + "New-OutboundConnector", + "New-OutlookProtectionRule", + "New-OwaMailboxPolicy", + "New-PartnerApplication", + "New-PhishSimOverridePolicy", + "New-PolicyTipConfig", + "New-PrivilegedIdentityManagementRequest", + "New-ProtectionServicePolicy", + "New-PublicFolder", + "New-PublicFolderMoveRequest", + "New-QuarantinePermissions", + "New-QuarantinePolicy", + "New-RemoteDomain", + "New-ReportSchedule", + "New-ReportSubmissionPolicy", + "New-ReportSubmissionRule", + "New-RetentionPolicy", + "New-RetentionPolicyTag", + "New-RoleAssignmentPolicy", + "New-RoleGroup", + "New-SafeAttachmentPolicy", + "New-SafeAttachmentRule", + "New-SafeLinksPolicy", + "New-SafeLinksRule", + "New-SchedulingMailbox", + "New-SecOpsOverridePolicy", + "New-ServicePrincipal", + "New-SharingPolicy", + "New-SweepRule", + "New-SyncMailPublicFolder", + "New-SyncRequest", + "New-TenantAllowBlockListItems", + "New-TenantAllowBlockListSpoofItems", + "New-TenantExemptionInfo", + "New-TenantExemptionQuota", + "New-TenantScanRequest", + "New-TransportRule", + "New-UnifiedGroup", + "Preview-QuarantineMessage", + "Release-QuarantineMessage", + "Remove-ActiveSyncDevice", + "Remove-ActiveSyncDeviceAccessRule", + "Remove-ActiveSyncMailboxPolicy", + "Remove-AntiPhishPolicy", + "Remove-AntiPhishRule", + "Remove-App", + "Remove-ApplicationAccessPolicy", + "Remove-ATPProtectionPolicyRule", + "Remove-AuditConfigurationPolicy", + "Remove-AuditConfigurationRule", + "Remove-AuditStubFolder", + "Remove-AuthenticationPolicy", + "Remove-AvailabilityAddressSpace", + "Remove-AvailabilityConfig", + "Remove-BlockedConnector", + "Remove-BlockedSenderAddress", + "Remove-BookingMailbox", + "Remove-CalendarEvents", + "Remove-ClassificationRuleCollection", + "Remove-CompliancePolicyFileSyncNotification", + "Remove-CompliancePolicySyncNotification", + "Remove-DataClassification", + "Remove-DistributionGroup", + "Remove-DistributionGroupMember", + "Remove-DlpPolicy", + "Remove-DynamicDistributionGroup", + "Remove-EmailAddressPolicy", + "Remove-EOPProtectionPolicyRule", + "Remove-ExoInformationBarriersV1Configuration", + "Remove-ExoPhishSimOverrideRule", + "Remove-ExoSecOpsOverrideRule", + "Remove-HostedConnectionFilterPolicy", + "Remove-HostedContentFilterPolicy", + "Remove-HostedContentFilterRule", + "Remove-HostedOutboundSpamFilterPolicy", + "Remove-HostedOutboundSpamFilterRule", + "Remove-HybridConfiguration", + "Remove-InboundConnector", + "Remove-InboxRule", + "Remove-IntraOrganizationConnector", + "Remove-JournalRule", + "Remove-M365CrossTenantAccessPolicy", + "Remove-Mailbox", + "Remove-MailboxAnalysisRequest", + "Remove-MailboxFolderPermission", + "Remove-MailboxIRMAccess", + "Remove-MailboxLocation", + "Remove-MailboxPermission", + "Remove-MailboxRestoreRequest", + "Remove-MailboxSearch", + "Remove-MailboxUserConfiguration", + "Remove-MailContact", + "Remove-MailUser", + "Remove-MalwareFilterPolicy", + "Remove-MalwareFilterRule", + "Remove-ManagementRole", + "Remove-ManagementRoleAssignment", + "Remove-ManagementRoleEntry", + "Remove-ManagementScope", + "Remove-MessageClassification", + "Remove-MigrationBatch", + "Remove-MigrationEndpoint", + "Remove-MigrationUser", + "Remove-MobileDevice", + "Remove-MobileDeviceMailboxPolicy", + "Remove-MoveRequest", + "Remove-OnPremisesOrganization", + "Remove-OrganizationRelationship", + "Remove-OutboundConnector", + "Remove-OutlookProtectionRule", + "Remove-OwaMailboxPolicy", + "Remove-PartnerApplication", + "Remove-PhishSimOverridePolicy", + "Remove-PolicyTipConfig", + "Remove-PublicFolder", + "Remove-PublicFolderClientPermission", + "Remove-PublicFolderMailboxMigrationRequest", + "Remove-PublicFolderMoveRequest", + "Remove-QuarantinePolicy", + "Remove-RecipientPermission", + "Remove-RemoteDomain", + "Remove-ReportSchedule", + "Remove-ReportSubmissionPolicy", + "Remove-ReportSubmissionRule", + "Remove-RetentionPolicy", + "Remove-RetentionPolicyTag", + "Remove-RoleAssignmentPolicy", + "Remove-RoleGroup", + "Remove-RoleGroupMember", + "Remove-SafeAttachmentPolicy", + "Remove-SafeAttachmentRule", + "Remove-SafeLinksPolicy", + "Remove-SafeLinksRule", + "Remove-SecOpsOverridePolicy", + "Remove-ServicePrincipal", + "Remove-SharingPolicy", + "Remove-SweepRule", + "Remove-SyncMailPublicFolder", + "Remove-SyncRequest", + "Remove-TenantAllowBlockListItems", + "Remove-TenantAllowBlockListSpoofItems", + "Remove-TenantScanRequest", + "Remove-TransportRule", + "Remove-UnifiedGroup", + "Remove-UnifiedGroupLinks", + "Reset-EventsFromEmailBlockStatus", + "Resume-MailboxAnalysisRequest", + "Resume-MailboxRestoreRequest", + "Resume-MoveRequest", + "Resume-PublicFolderMailboxMigrationRequest", + "Resume-SyncRequest", + "Resume-TenantScanRequest", + "Revoke-ElevatedAccessAuthorization", + "Rotate-DkimSigningConfig", + "Search-AdminAuditLog", + "Search-MailboxAuditLog", + "Search-MessageTrackingReport", + "Search-UnifiedAuditLog", + "Send-TextMessagingVerificationCode", + "Set-AcceptedDomain", + "Set-AccessToCustomerDataRequest", + "Set-ActiveSyncDeviceAccessRule", + "Set-ActiveSyncMailboxPolicy", + "Set-ActiveSyncOrganizationSettings", + "Set-AdminAuditLogConfig", + "Set-AntiPhishPolicy", + "Set-AntiPhishRule", + "Set-App", + "Set-ApplicationAccessPolicy", + "Set-ArcConfig", + "Set-ATPBuiltInProtectionRule", + "Set-ATPEvaluationRule", + "Set-AtpPolicyForO365", + "Set-ATPProtectionPolicyRule", + "Set-AuthenticationPolicy", + "Set-AvailabilityConfig", + "Set-BookingMailboxPermission", + "Set-CalendarProcessing", + "Set-CalendarSettings", + "Set-CASMailbox", + "set-CASMailboxPlan", + "Set-ClassificationRuleCollection", + "Set-Clutter", + "Set-Contact", + "Set-DataClassification", + "Set-DataEncryptionPolicy", + "Set-DistributionGroup", + "Set-DkimSigningConfig", + "Set-DlpPolicy", + "Set-DynamicDistributionGroup", + "Set-ElevatedAccessRequest", + "Set-EmailAddressPolicy", + "Set-EmailTenantSettings", + "Set-EOPProtectionPolicyRule", + "Set-EventsFromEmailConfiguration", + "Set-ExoPhishSimOverrideRule", + "Set-ExoSecOpsOverrideRule", + "Set-ExternalInOutlook", + "Set-FocusedInbox", + "Set-Group", + "Set-HostedConnectionFilterPolicy", + "Set-HostedContentFilterPolicy", + "Set-HostedContentFilterRule", + "Set-HostedOutboundSpamFilterPolicy", + "Set-HostedOutboundSpamFilterRule", + "Set-InboundConnector", + "Set-InboxRule", + "Set-IntraOrganizationConnector", + "Set-IRMConfiguration", + "Set-JournalRule", + "Set-LabelProperties", + "Set-LinkedUser", + "Set-M365CrossTenantAccessPolicy", + "Set-M365DataAtRestEncryptionPolicy", + "Set-M365DataAtRestEncryptionPolicyAssignment", + "Set-Mailbox", + "Set-MailboxAnalysisRequest", + "Set-MailboxAuditBypassAssociation", + "Set-MailboxAutoReplyConfiguration", + "Set-MailboxCalendarConfiguration", + "Set-MailboxCalendarFolder", + "Set-MailboxFolderPermission", + "Set-MailboxIRMAccess", + "Set-MailboxJunkEmailConfiguration", + "Set-MailboxLocation", + "Set-MailboxMessageConfiguration", + "Set-MailboxPlan", + "Set-MailboxRegionalConfiguration", + "Set-MailboxRestoreRequest", + "Set-MailboxSearch", + "Set-MailboxSpellingConfiguration", + "Set-MailContact", + "Set-MailPublicFolder", + "Set-MailUser", + "Set-MalwareFilterPolicy", + "Set-MalwareFilterRule", + "Set-ManagementRoleAssignment", + "Set-ManagementRoleEntry", + "Set-ManagementScope", + "Set-MessageClassification", + "Set-MigrationBatch", + "Set-MigrationConfig", + "Set-MigrationEndpoint", + "Set-MigrationUser", + "Set-MobileDeviceMailboxPolicy", + "Set-MoveRequest", + "Set-Notification", + "Set-OMEConfiguration", + "Set-OnPremisesOrganization", + "Set-Organization", + "Set-OrganizationConfig", + "Set-OrganizationRelationship", + "Set-OutboundConnector", + "Set-OutlookProtectionRule", + "Set-OwaMailboxPolicy", + "Set-PartnerApplication", + "Set-PerimeterConfig", + "Set-PhishSimOverridePolicy", + "Set-Place", + "Set-PolicyTipConfig", + "Set-ProtectionServicePolicy", + "Set-PublicFolder", + "Set-PublicFolderMailboxMigrationRequest", + "Set-QuarantinePermissions", + "Set-QuarantinePolicy", + "Set-RegulatoryComplianceUI", + "Set-RemoteDomain", + "Set-ReportSchedule", + "Set-ReportSubmissionPolicy", + "Set-ReportSubmissionRule", + "Set-ResourceConfig", + "Set-RetentionPolicy", + "Set-RetentionPolicyTag", + "Set-RMSTemplate", + "Set-RoleAssignmentPolicy", + "Set-RoleGroup", + "Set-SafeAttachmentPolicy", + "Set-SafeAttachmentRule", + "Set-SafeLinksPolicy", + "Set-SafeLinksRule", + "Set-SecOpsOverridePolicy", + "Set-ServicePrincipal", + "Set-SharingPolicy", + "Set-SmimeConfig", + "Set-SweepRule", + "Set-SyncRequest", + "Set-TenantAllowBlockListItems", + "Set-TenantAllowBlockListSpoofItems", + "Set-TenantSettingCrossTenantAccessPolicy", + "Set-TextMessagingAccount", + "Set-TransportConfig", + "Set-TransportRule", + "Set-UnifiedAuditSetting", + "Set-UnifiedGroup", + "Set-User", + "Start-AuditAssistant", + "Start-HistoricalSearch", + "Start-ManagedFolderAssistant", + "Start-MigrationBatch", + "Start-MigrationUser", + "Stop-HistoricalSearch", + "Stop-MigrationBatch", + "Stop-MigrationUser", + "Suspend-MailboxAnalysisRequest", + "Suspend-MailboxRestoreRequest", + "Suspend-MoveRequest", + "Suspend-PublicFolderMailboxMigrationRequest", + "Suspend-SyncRequest", + "Sync-CrossTenantAccessPolicy", + "Test-ApplicationAccessPolicy", + "Test-ArchiveConnectivity", + "Test-DatabaseEvent", + "Test-DataClassification", + "Test-DataEncryptionPolicy", + "Test-DlpPolicies", + "Test-InformationBarrierPolicy", + "Test-IRMConfiguration", + "Test-M365DataAtRestEncryptionPolicy", + "Test-MailboxAssistant", + "Test-MAPIConnectivity", + "Test-Message", + "Test-MigrationServerAvailability", + "Test-OAuthConnectivity", + "Test-OrganizationRelationship", + "Test-ServicePrincipalAuthorization", + "Test-StoreAdminConnectivity", + "Test-TextExtraction", + "Troubleshoot-AgendaMail", + "Undo-SoftDeletedMailbox", + "Undo-SoftDeletedUnifiedGroup", + "Update-DistributionGroupMember", + "Update-HybridConfiguration", + "Update-MaskingIndex", + "Update-PublicFolderMailbox", + "Update-Recipient", + "Update-RoleGroupMember", + "Upgrade-DistributionGroup", + "Validate-OutboundConnector", + "Validate-RetentionRuleQuery", + "Write-AdminAuditLog" + ] +} From 68261636831dfa48cbf3328af8d77869c76eb32d Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 23 Sep 2024 18:49:53 +1000 Subject: [PATCH 157/341] fix(Compiler): Missing functions for ExchangeMangementOnline & PowerShell missing assembly :angry: --- src/Compiler/Compiler.csproj | 9 +- src/Compiler/Module/Compiled/Remote.cs | 9 +- ...nt.json => ExchangeOnlineManagement.jsonc} | 317 +++++++- src/Compiler/packages.lock.json | 710 +----------------- tests/Compiler/AstHelper.cs | 6 +- tests/Compiler/Compiler.Test.csproj | 2 +- tests/Compiler/Text/Span.cs | 155 ++-- .../Updater/Built/CommentRemovalUpdater.cs | 67 ++ .../{HereString.cs => HereStringUpdater.cs} | 2 +- tests/Compiler/Utils.cs | 10 +- tests/Compiler/packages.lock.json | 6 +- 11 files changed, 523 insertions(+), 770 deletions(-) rename src/Compiler/Resources/ExtraModuleInfo/{ExchangeOnlineManagement.json => ExchangeOnlineManagement.jsonc} (70%) create mode 100644 tests/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs rename tests/Compiler/Text/Updater/Built/{HereString.cs => HereStringUpdater.cs} (95%) diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 4d0fb882..322c82fa 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -2,11 +2,15 @@ Program - net8.0 + net8.0-windows enable enable Exe - win-x64;linux-x64 + + + + True + true preview Properties @@ -58,6 +62,7 @@ + diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 5876cbfc..3a353cde 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -23,6 +23,10 @@ private record ExtraModuleInfo( ); private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private static readonly JsonSerializerOptions JsonSerializerOptions = new() { + ReadCommentHandling = JsonCommentHandling.Skip + }; + private Hashtable? PowerShellManifest; private ZipArchive? ZipArchive; @@ -89,11 +93,12 @@ public IEnumerable GetExported(object? data, CommandTypes commandTypes) var info = Assembly.GetExecutingAssembly().GetName(); var extraModuleInfoResource = $"{info.Name}.Resources.ExtraModuleInfo.{this.ModuleSpec.Name}.json"; - using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.ExtraModuleInfo.{this.ModuleSpec.Name}.json"); + using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(extraModuleInfoResource) + ?? Assembly.GetExecutingAssembly().GetManifestResourceStream($"{extraModuleInfoResource}c"); if (templateStream == null) return exported; using var streamReader = new StreamReader(templateStream, Encoding.UTF8); - var extraModuleInfo = JsonSerializer.Deserialize(streamReader.ReadToEnd()); + var extraModuleInfo = JsonSerializer.Deserialize(streamReader.ReadToEnd(), JsonSerializerOptions); if (extraModuleInfo == null) { Logger.Warn($"Failed to parse extra module info for {this.ModuleSpec.Name}"); return exported; diff --git a/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.json b/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc similarity index 70% rename from src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.json rename to src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc index e405c107..cd252d68 100644 --- a/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.json +++ b/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc @@ -1,5 +1,6 @@ { "FunctionsToExport": [ + // Commands present once Connect-ExchangeOnline is run "Add-AvailabilityAddressSpace", "Add-DistributionGroupMember", "Add-MailboxFolderPermission", @@ -776,6 +777,320 @@ "Upgrade-DistributionGroup", "Validate-OutboundConnector", "Validate-RetentionRuleQuery", - "Write-AdminAuditLog" + "Write-AdminAuditLog", + + // Commands present once Connect-IPPSSession is run + "Add-ComplianceCaseMember", + "Add-eDiscoveryCaseAdmin", + "Add-RoleGroupMember", + "Cancel-DlpEdmSession", + "Delete-QuarantineMessage", + "Enable-AdaptiveScopeStorage", + "Enable-ComplianceTagStorage", + "Execute-AzureAdLabelSync", + "Execute-UnifiedPolicyCmdletBatch", + "Export-ActivityExplorerData", + "Export-FilePlanProperty", + "Export-QuarantineMessage", + "Get-ActivityAlert", + "Get-AdaptiveScope", + "Get-AdminAuditLogConfig", + "Get-AppRetentionCompliancePolicy", + "Get-AppRetentionComplianceRule", + "Get-AuditConfig", + "Get-AuditConfigurationPolicy", + "Get-AuditConfigurationRule", + "Get-CaseHoldPolicy", + "Get-CaseHoldRule", + "Get-ComplianceCase", + "Get-ComplianceCaseMember", + "Get-ComplianceCaseStatistics", + "Get-ComplianceRetentionEvent", + "Get-ComplianceRetentionEventType", + "Get-ComplianceSearch", + "Get-ComplianceSearchAction", + "Get-ComplianceSecurityFilter", + "Get-ComplianceTag", + "Get-ComplianceTagStorage", + "Get-DataRetentionReport", + "Get-DeviceComplianceDetailsReport", + "Get-DeviceComplianceDetailsReportFilter", + "Get-DeviceCompliancePolicyInventory", + "Get-DeviceComplianceReportDate", + "Get-DeviceComplianceSummaryReport", + "Get-DeviceComplianceUserInventory", + "Get-DeviceComplianceUserReport", + "Get-DeviceConditionalAccessPolicy", + "Get-DeviceConditionalAccessRule", + "Get-DeviceConfigurationPolicy", + "Get-DeviceConfigurationRule", + "Get-DevicePolicy", + "Get-DeviceTenantPolicy", + "Get-DeviceTenantRule", + "Get-DlpCompliancePolicy", + "Get-DlpComplianceRule", + "Get-DlpDetailReport", + "Get-DlpDetectionsReport", + "Get-DlpEdmSchema", + "Get-DlpEdmSession", + "Get-DlpIncidentDetailReport", + "Get-DlpKeywordDictionary", + "Get-DlpSensitiveInformationType", + "Get-DlpSensitiveInformationTypeConfig", + "Get-DlpSensitiveInformationTypeRulePackage", + "Get-DlpSiDetectionsReport", + "Get-eDiscoveryCaseAdmin", + "Get-FilePlanPropertyAuthority", + "Get-FilePlanPropertyCategory", + "Get-FilePlanPropertyCitation", + "Get-FilePlanPropertyDepartment", + "Get-FilePlanPropertyReferenceId", + "Get-FilePlanPropertyStructure", + "Get-FilePlanPropertySubCategory", + "Get-Group", + "Get-HoldCompliancePolicy", + "Get-HoldComplianceRule", + "Get-InsiderRiskEntityList", + "Get-InsiderRiskPolicy", + "Get-JitConfiguration", + "Get-Label", + "Get-LabelPolicy", + "Get-LabelPolicyRule", + "Get-LongTermAuditItems", + "Get-LongTermAuditStats", + "Get-MailDetailEncryptionReport", + "Get-MailFilterListReport", + "Get-MailTrafficEncryptionReport", + "Get-ManagementRole", + "Get-OcrConfiguration", + "Get-OrganizationSegment", + "Get-PolicyConfig", + "Get-PrivacyManagementCaseAdmin", + "Get-PrivacyManagementComplianceCaseMember", + "Get-PrivacyManagementComplianceTag", + "Get-PrivacyManagementPolicy", + "Get-PrivacyManagementRule", + "Get-ProtectionAlert", + "Get-ProtectionCompliancePolicy", + "Get-QuarantineMessage", + "Get-QuarantineMessageHeader", + "Get-Recipient", + "Get-RecordReviewNotificationTemplateConfig", + "Get-RegulatoryComplianceUI", + "Get-RetentionCompliancePolicy", + "Get-RetentionComplianceRule", + "Get-RetentionEvent", + "Get-RoleGroup", + "Get-RoleGroupMember", + "Get-SCInsights", + "Get-ScopeEntities", + "Get-SecurityPrincipal", + "Get-ServicePrincipal", + "Get-SupervisoryReviewActivity", + "Get-SupervisoryReviewOverallProgressReport", + "Get-SupervisoryReviewPolicyReport", + "Get-SupervisoryReviewPolicyV2", + "Get-SupervisoryReviewReport", + "Get-SupervisoryReviewRule", + "Get-SupervisoryReviewTopCasesReport", + "Get-TenantAllowBlockListItems", + "Get-TenantAllowBlockListSpoofItems", + "Get-UnifiedAuditLogRetentionPolicy", + "Get-User", + "Import-DlpComplianceRuleCollection", + "Import-FilePlanProperty", + "Install-UnifiedCompliancePrerequisite", + "Invoke-ComplianceSecurityFilterAction", + "Invoke-HoldRemovalAction", + "Migrate-DlpFingerprint", + "New-ActivityAlert", + "New-AdaptiveScope", + "New-AdminAuditLogSearch", + "New-AppRetentionCompliancePolicy", + "New-AppRetentionComplianceRule", + "New-AuditConfigurationPolicy", + "New-AuditConfigurationRule", + "New-CaseHoldPolicy", + "New-CaseHoldRule", + "New-ComplianceCase", + "New-ComplianceRetentionEvent", + "New-ComplianceRetentionEventType", + "New-ComplianceSearch", + "New-ComplianceSearchAction", + "New-ComplianceSecurityFilter", + "New-ComplianceTag", + "New-DeviceConditionalAccessPolicy", + "New-DeviceConditionalAccessRule", + "New-DeviceConfigurationPolicy", + "New-DeviceConfigurationRule", + "New-DeviceTenantPolicy", + "New-DeviceTenantRule", + "New-DlpCompliancePolicy", + "New-DlpComplianceRule", + "New-DlpFingerprint", + "New-DlpKeywordDictionary", + "New-DlpSensitiveInformationType", + "New-DlpSensitiveInformationTypeRulePackage", + "New-FilePlanPropertyAuthority", + "New-FilePlanPropertyCategory", + "New-FilePlanPropertyCitation", + "New-FilePlanPropertyDepartment", + "New-FilePlanPropertyReferenceId", + "New-FilePlanPropertySubCategory", + "New-HoldCompliancePolicy", + "New-HoldComplianceRule", + "New-InsiderRiskEntityList", + "New-InsiderRiskPolicy", + "New-JitConfiguration", + "New-Label", + "New-LabelPolicy", + "New-OcrConfiguration", + "New-OrganizationSegment", + "New-PrivacyManagementComplianceTag", + "New-PrivacyManagementPolicy", + "New-PrivacyManagementRule", + "New-ProtectionAlert", + "New-ProtectionCompliancePolicy", + "New-RetentionCompliancePolicy", + "New-RetentionComplianceRule", + "New-RoleGroup", + "New-ServicePrincipal", + "New-SupervisoryReviewPolicyV2", + "New-SupervisoryReviewRule", + "New-TenantAllowBlockListItems", + "New-TenantAllowBlockListSpoofItems", + "New-UnifiedAuditLogRetentionPolicy", + "Preview-QuarantineMessage", + "Release-QuarantineMessage", + "Remove-ActivityAlert", + "Remove-AdaptiveScope", + "Remove-AppRetentionCompliancePolicy", + "Remove-AppRetentionComplianceRule", + "Remove-AuditConfigurationPolicy", + "Remove-AuditConfigurationRule", + "Remove-CaseHoldPolicy", + "Remove-CaseHoldRule", + "Remove-ComplianceCase", + "Remove-ComplianceCaseMember", + "Remove-ComplianceRetentionEvent", + "Remove-ComplianceRetentionEventType", + "Remove-ComplianceSearch", + "Remove-ComplianceSearchAction", + "Remove-ComplianceSecurityFilter", + "Remove-ComplianceTag", + "Remove-DeviceConditionalAccessPolicy", + "Remove-DeviceConditionalAccessRule", + "Remove-DeviceConfigurationPolicy", + "Remove-DeviceConfigurationRule", + "Remove-DeviceTenantPolicy", + "Remove-DeviceTenantRule", + "Remove-DlpCompliancePolicy", + "Remove-DlpComplianceRule", + "Remove-DlpEdmSchema", + "Remove-DlpKeywordDictionary", + "Remove-DlpSensitiveInformationType", + "Remove-DlpSensitiveInformationTypeRulePackage", + "Remove-eDiscoveryCaseAdmin", + "Remove-FilePlanPropertyAuthority", + "Remove-FilePlanPropertyCategory", + "Remove-FilePlanPropertyCitation", + "Remove-FilePlanPropertyDepartment", + "Remove-FilePlanPropertyReferenceId", + "Remove-FilePlanPropertySubCategory", + "Remove-HoldCompliancePolicy", + "Remove-HoldComplianceRule", + "Remove-InformationBarrierPolicy", + "Remove-InsiderRiskEntityList", + "Remove-InsiderRiskPolicy", + "Remove-Label", + "Remove-LabelPolicy", + "Remove-OcrConfiguration", + "Remove-OrganizationSegment", + "Remove-PrivacyManagementCaseAdmin", + "Remove-PrivacyManagementComplianceCaseMember", + "Remove-PrivacyManagementComplianceTag", + "Remove-PrivacyManagementPolicy", + "Remove-PrivacyManagementRule", + "Remove-ProtectionAlert", + "Remove-RecordLabel", + "Remove-RetentionCompliancePolicy", + "Remove-RetentionComplianceRule", + "Remove-RoleGroup", + "Remove-RoleGroupMember", + "Remove-ServicePrincipal", + "Remove-SupervisoryReviewPolicyV2", + "Remove-TenantAllowBlockListItems", + "Remove-TenantAllowBlockListSpoofItems", + "Remove-UnifiedAuditLogRetentionPolicy", + "Search-AdminAuditLog", + "Set-ActivityAlert", + "Set-AdaptiveScope", + "Set-AppRetentionCompliancePolicy", + "Set-AppRetentionComplianceRule", + "Set-AuditConfig", + "Set-AuditConfigurationRule", + "Set-CaseHoldPolicy", + "Set-CaseHoldRule", + "Set-ComplianceCase", + "Set-ComplianceRetentionEvent", + "Set-ComplianceRetentionEventType", + "Set-ComplianceSearch", + "Set-ComplianceSearchAction", + "Set-ComplianceSecurityFilter", + "Set-ComplianceTag", + "Set-DeviceConditionalAccessPolicy", + "Set-DeviceConditionalAccessRule", + "Set-DeviceConfigurationPolicy", + "Set-DeviceConfigurationRule", + "Set-DeviceTenantPolicy", + "Set-DeviceTenantRule", + "Set-DlpCompliancePolicy", + "Set-DlpComplianceRule", + "Set-DlpEdmSchema", + "Set-DlpKeywordDictionary", + "Set-DlpSensitiveInformationType", + "Set-DlpSensitiveInformationTypeConfig", + "Set-DlpSensitiveInformationTypeRulePackage", + "Set-FilePlanPropertyAuthority", + "Set-FilePlanPropertyCategory", + "Set-FilePlanPropertyCitation", + "Set-FilePlanPropertyDepartment", + "Set-FilePlanPropertyReferenceId", + "Set-FilePlanPropertySubCategory", + "Set-HoldCompliancePolicy", + "Set-HoldComplianceRule", + "Set-InsiderRiskEntityList", + "Set-InsiderRiskPolicy", + "Set-InsiderRiskPolicyLite", + "Set-JitConfiguration", + "Set-Label", + "Set-LabelPolicy", + "Set-OcrConfiguration", + "Set-OrganizationSegment", + "Set-PolicyConfig", + "Set-PrivacyManagementComplianceTag", + "Set-PrivacyManagementPolicy", + "Set-PrivacyManagementRule", + "Set-ProtectionAlert", + "Set-ProtectionCompliancePolicy", + "Set-RecordReviewNotificationTemplateConfig", + "Set-RegulatoryComplianceUI", + "Set-RetentionCompliancePolicy", + "Set-RetentionComplianceRule", + "Set-RoleGroup", + "Set-ServicePrincipal", + "Set-SupervisoryReviewPolicyV2", + "Set-SupervisoryReviewRule", + "Set-TenantAllowBlockListItems", + "Set-TenantAllowBlockListSpoofItems", + "Set-UnifiedAuditLogRetentionPolicy", + "Start-ComplianceSearch", + "Stop-ComplianceSearch", + "Test-DataClassification", + "Test-TextExtraction", + "Update-ComplianceCaseMember", + "Update-eDiscoveryCaseAdmin", + "Update-RoleGroupMember", + "Validate-RetentionRuleQuery" ] } diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index d465878f..5a405647 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0": { + "net8.0-windows7.0": { "CommandLineParser": { "type": "Direct", "requested": "[2.9.1, )", @@ -871,714 +871,6 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } - }, - "net8.0/linux-x64": { - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.4", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", - "Microsoft.PowerShell.Commands.Management": "7.4.2", - "Microsoft.PowerShell.Commands.Utility": "7.4.2", - "Microsoft.PowerShell.ConsoleHost": "7.4.2", - "Microsoft.PowerShell.Security": "7.4.2", - "Microsoft.WSMan.Management": "7.4.2", - "Microsoft.Windows.Compatibility": "8.0.4", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.2", - "System.Net.Http.WinHttpHandler": "8.0.0", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "System.Management.Automation": { - "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.2", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.4", - "System.Management.Automation": "7.4.2", - "System.Text.Json": "6.0.9", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", - "dependencies": { - "System.Security.AccessControl": "4.7.0", - "System.Security.Principal.Windows": "4.7.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.2", - "System.Management.Automation": "7.4.2", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - } - }, - "net8.0/win-x64": { - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.4", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", - "Microsoft.PowerShell.Commands.Management": "7.4.2", - "Microsoft.PowerShell.Commands.Utility": "7.4.2", - "Microsoft.PowerShell.ConsoleHost": "7.4.2", - "Microsoft.PowerShell.Security": "7.4.2", - "Microsoft.WSMan.Management": "7.4.2", - "Microsoft.Windows.Compatibility": "8.0.4", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.2", - "System.Net.Http.WinHttpHandler": "8.0.0", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "System.Management.Automation": { - "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.2", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.4", - "System.Management.Automation": "7.4.2", - "System.Text.Json": "6.0.9", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", - "dependencies": { - "System.Security.AccessControl": "4.7.0", - "System.Security.Principal.Windows": "4.7.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.2", - "System.Management.Automation": "7.4.2", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - } } } } \ No newline at end of file diff --git a/tests/Compiler/AstHelper.cs b/tests/Compiler/AstHelper.cs index 69a9e2bc..bf84240e 100644 --- a/tests/Compiler/AstHelper.cs +++ b/tests/Compiler/AstHelper.cs @@ -54,7 +54,7 @@ public void GetAstReportingErrors( IEnumerable ignoredErrors, bool expectError ) { - var result = AstHelper.GetAstReportingErrors(astContent, filePath, ignoredErrors); + var result = AstHelper.GetAstReportingErrors(astContent, filePath, ignoredErrors, out _); Assert.Multiple(() => { if (expectError) { @@ -99,7 +99,7 @@ public void FindAvailableAliases( bool onlyExported ) { Console.WriteLine(astContent); - var ast = AstHelper.GetAstReportingErrors(astContent, [], []).ThrowIfFail(); + var ast = AstHelper.GetAstReportingErrors(astContent, [], [], out _).ThrowIfFail(); var result = AstHelper.FindAvailableAliases(ast, onlyExported); Assert.Multiple(() => { @@ -134,7 +134,7 @@ public void FindDeclaredModules( Dictionary> expectedModules, bool skipAstChecking ) { - var ast = AstHelper.GetAstReportingErrors(astContent, Option.None, ["ModuleNotFoundDuringParse"]).ThrowIfFail(); + var ast = AstHelper.GetAstReportingErrors(astContent, Option.None, ["ModuleNotFoundDuringParse"], out _).ThrowIfFail(); var result = AstHelper.FindDeclaredModules(ast); Assert.Multiple(() => { diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index 6185fe22..f5ce9110 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -1,7 +1,7 @@ - net8.0 + net8.0-windows enable enable false diff --git a/tests/Compiler/Text/Span.cs b/tests/Compiler/Text/Span.cs index 00dd4b71..bbeda34e 100644 --- a/tests/Compiler/Text/Span.cs +++ b/tests/Compiler/Text/Span.cs @@ -23,9 +23,15 @@ public void SetUp() { this.Document = new TextDocument([.. this.Lines]); } + [TearDown] + public void TearDown() { + this.Lines.Clear(); + this.Document.Dispose(); + } + [Test, TestCaseSource(typeof(TestData), nameof(TestData.WrappingEntireDocumentTextCases))] public TextSpan WrappingEntireDocument(string[] lines) { - var span = TextSpan.WrappingEntireDocument(lines); + var span = TestData.WrappingEntireDocument(lines); Assert.Multiple(() => { Assert.That(span.StartingIndex, Is.EqualTo(0)); @@ -39,14 +45,12 @@ public TextSpan WrappingEntireDocument(string[] lines) { } }); - Console.WriteLine(span); - return span; } [Test] public void Contains_ReturnsTrue_WhenIndexAndColumnAreWithinSpan() { - var span = TextSpan.WrappingEntireDocument(this.Document); + var span = TestData.WrappingEntireDocument(this.Document); var result = span.Contains(1, 2); Assert.That(result, Is.True); } @@ -67,11 +71,11 @@ public void GetContent_SingleLineFromBeginingAndEndLines() { [Test] public void SetContent_UpdatesLinesWithNewContent() { - var span = TextSpan.WrappingEntireDocument(this.Document); - var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]); + var span = TestData.WrappingEntireDocument(this.Document); + var change = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]).Unwrap(); Assert.Multiple(() => { - Assert.That(lengthChanged, Is.EqualTo(-3)); + Assert.That(change, Is.EqualTo(new ContentChange(-3, 0, 2))); Assert.That(this.Lines[0], Is.EqualTo("New Content")); Assert.That(this.Lines, Has.Count.EqualTo(1)); }); @@ -81,10 +85,10 @@ public void SetContent_UpdatesLinesWithNewContent() { [Test] public void SetContent_UpdateMiddleLine() { var span = TextSpan.New(1, 0, 1, this.Lines[1].Length).Unwrap(); - var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]); + var change = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]).Unwrap(); Assert.Multiple(() => { - Assert.That(lengthChanged, Is.EqualTo(0)); + Assert.That(change, Is.EqualTo(new ContentChange(0, 0, 5))); Assert.That(this.Lines[1], Is.EqualTo("New Content")); }); } @@ -92,10 +96,10 @@ public void SetContent_UpdateMiddleLine() { [Test] public void SetContent_UpdateFirstLine() { var span = TextSpan.New(0, 0, 0, this.Lines[0].Length).Unwrap(); - var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]); + var change = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]).Unwrap(); Assert.Multiple(() => { - Assert.That(lengthChanged, Is.EqualTo(expected: 0)); + Assert.That(change, Is.EqualTo(new ContentChange(0, 0, 5))); Assert.That(this.Lines, Has.Count.EqualTo(4)); Assert.That(this.Lines[0], Is.EqualTo("New Content")); }); @@ -104,10 +108,10 @@ public void SetContent_UpdateFirstLine() { [Test] public void SetContent_UpdateLastLine() { var span = TextSpan.New(3, 0, 3, this.Lines[^1].Length).Unwrap(); - var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]); + var change = span.SetContent(this.Lines, UpdateOptions.None, ["New Content"]).Unwrap(); Assert.Multiple(() => { - Assert.That(lengthChanged, Is.EqualTo(0)); + Assert.That(change, Is.EqualTo(new ContentChange(0, 0, 2))); Assert.That(this.Lines[3], Is.EqualTo("New Content")); }); } @@ -115,10 +119,10 @@ public void SetContent_UpdateLastLine() { [Test] public void SetContent_InsertsNewLines() { var span = TextSpan.New(1, 0, 1, this.Lines[1].Length).Unwrap(); - var lengthChanged = span.SetContent(this.Lines, UpdateOptions.None, ["New", "Content"]); + var change = span.SetContent(this.Lines, UpdateOptions.None, ["New", "Content"]).Unwrap(); Assert.Multiple(() => { - Assert.That(lengthChanged, Is.EqualTo(1)); + Assert.That(change, Is.EqualTo(new ContentChange(1, 0, 1))); Assert.That(this.Lines[1], Is.EqualTo("New")); Assert.That(this.Lines[2], Is.EqualTo("Content")); }); @@ -127,13 +131,13 @@ public void SetContent_InsertsNewLines() { [Test] public void SetContent_AppendAndPrependColumns() { var spanStart = TextSpan.New(0, this.Lines[0].Length - 1, 0, this.Lines[0].Length - 1).Unwrap(); - var lengthChangedStart = spanStart.SetContent(this.Lines, UpdateOptions.InsertInline, [" beautiful"]); + var firstLineChange = spanStart.SetContent(this.Lines, UpdateOptions.InsertInline, [" beautiful"]).Unwrap(); var spanEnd = TextSpan.New(this.Lines.Count - 1, 0, this.Lines.Count - 1, 0).Unwrap(); - var lengthChangedEnd = spanEnd.SetContent(this.Lines, UpdateOptions.InsertInline, ["Awesome "]); + var lastLineChange = spanEnd.SetContent(this.Lines, UpdateOptions.InsertInline, ["Awesome "]).Unwrap(); Assert.Multiple(() => { - Assert.That(lengthChangedStart, Is.EqualTo(0)); - Assert.That(lengthChangedEnd, Is.EqualTo(0)); + Assert.That(firstLineChange, Is.EqualTo(new ContentChange(0, 0, 10))); + Assert.That(lastLineChange, Is.EqualTo(new ContentChange(0, 0, 8))); Assert.That(this.Lines[0], Is.EqualTo("Hello beautiful,")); Assert.That(this.Lines[^1], Is.EqualTo("Awesome Document!")); }); @@ -142,21 +146,21 @@ public void SetContent_AppendAndPrependColumns() { [Test] public void SetContent_UpdateMiddleOfLines() { var span = TextSpan.New(this.Lines.Count - 2, 3, this.Lines.Count - 2, 3).Unwrap(); - var lengthChanged = span.SetContent(this.Lines, UpdateOptions.InsertInline, [" not"]); + var change = span.SetContent(this.Lines, UpdateOptions.InsertInline, [" not"]).Unwrap(); Assert.Multiple(() => { - Assert.That(lengthChanged, Is.EqualTo(0)); + Assert.That(change, Is.EqualTo(new ContentChange(0, 0, 4))); Assert.That(this.Lines[^2], Is.EqualTo("I'm not the")); }); } [Test] public void RemoveContent_RemovesContentFromLines() { - var span = TextSpan.New(startingIndex: 0, 0, 0, 6).Unwrap(); - var lengthChanged = span.RemoveContent(this.Lines); + var span = TextSpan.New(0, 0, 0, 6).Unwrap(); + var change = span.RemoveContent(this.Lines).Unwrap(); Assert.Multiple(() => { - Assert.That(lengthChanged, Is.EqualTo(-1)); + Assert.That(change, Is.EqualTo(new ContentChange(-1, 0, -6))); Assert.That(this.Lines[0], Is.EqualTo("World!")); Assert.That(this.Lines, Has.Count.EqualTo(3)); }); @@ -190,10 +194,10 @@ public void SetContent_RemovesSingleLineSpan_WhenContentIsEmpty() { var lines = new List(["Hello, World!"]); var span = TextSpan.New(0, 0, 0, 13).Unwrap(); - var offset = span.SetContent(lines, UpdateOptions.None, []); + var change = span.SetContent(lines, UpdateOptions.None, []).Unwrap(); Assert.Multiple(() => { - Assert.That(offset, Is.EqualTo(-1)); + Assert.That(change, Is.EqualTo(new ContentChange(-1, 0, -13))); Assert.That(lines, Is.Empty); }); @@ -203,11 +207,11 @@ public void SetContent_RemovesSingleLineSpan_WhenContentIsEmpty() { public void SetContent_RemovesMultiLineSpan_WhenContentIsEmpty() { var lines = new List(["Line 1", "Line 2", "Line 3"]); - var span = TextSpan.New(0, 0, 2, 6).Unwrap(); - var offset = span.SetContent(lines, UpdateOptions.None, []); + var span = this.WrappingEntireDocument([.. lines]); + var change = span.SetContent(lines, UpdateOptions.None, []).Unwrap(); Assert.Multiple(() => { - Assert.That(offset, Is.EqualTo(-3)); + Assert.That(change, Is.EqualTo(new ContentChange(-3, 0, -6))); Assert.That(lines, Is.Empty); }); @@ -218,10 +222,10 @@ public void SetContent_ReplacesSingleLineSpan_WhenContentHasSingleLine() { var lines = new List(["Hello, World!"]); var span = TextSpan.New(0, 0, 0, 13).Unwrap(); - var offset = span.SetContent(lines, UpdateOptions.None, ["New Content"]); + var change = span.SetContent(lines, UpdateOptions.None, ["New Content"]).Unwrap(); Assert.Multiple(() => { - Assert.That(offset, Is.EqualTo(0)); + Assert.That(change, Is.EqualTo(new ContentChange(0, 0, -2))); Assert.That(lines, Has.Count.EqualTo(1)); Assert.That(lines[0], Is.EqualTo("New Content")); }); @@ -231,12 +235,11 @@ public void SetContent_ReplacesSingleLineSpan_WhenContentHasSingleLine() { [Test] public void SetContent_ReplacesMultiLineSpan_WhenContentHasMultipleLines() { var lines = new List(["Line 1", "Line 2", "Line 3"]); - - var span = TextSpan.New(0, 0, 2, 6).Unwrap(); - var offset = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); + var span = this.WrappingEntireDocument([.. lines]); + var change = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]).Unwrap(); Assert.Multiple(() => { - Assert.That(offset, Is.EqualTo(0)); + Assert.That(change, Is.EqualTo(new ContentChange(0, 0, 4))); Assert.That(lines, Has.Count.EqualTo(3)); Assert.That(lines[0], Is.EqualTo("New Line 1")); Assert.That(lines[1], Is.EqualTo("New Line 2")); @@ -250,10 +253,10 @@ public void SetContent_InsertsContentAtStart_WhenSpanIsAtStartOfDocument() { var lines = new List(["Line 1", "Line 2", "Line 3"]); var span = TextSpan.New(0, 0, 0, 0).Unwrap(); - var offset = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); + var change = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]).Unwrap(); Assert.Multiple(() => { - Assert.That(offset, Is.EqualTo(3)); + Assert.That(change, Is.EqualTo(new ContentChange(3, 0, 0))); Assert.That(lines, Has.Count.EqualTo(6)); Assert.That(lines[0], Is.EqualTo("New Line 1")); Assert.That(lines[1], Is.EqualTo("New Line 2")); @@ -270,10 +273,10 @@ public void SetContent_InsertsContentAtEnd_WhenSpanIsAtEndOfDocument() { var lines = new List(["Line 1", "Line 2", "Line 3"]); var span = TextSpan.New(2, 6, 2, 6).Unwrap(); - var offset = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); + var change = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]).Unwrap(); Assert.Multiple(() => { - Assert.That(offset, Is.EqualTo(3)); + Assert.That(change, Is.EqualTo(new ContentChange(3, 0, 4))); Assert.That(lines, Has.Count.EqualTo(6)); Assert.That(lines[0], Is.EqualTo("Line 1")); Assert.That(lines[1], Is.EqualTo("Line 2")); @@ -289,10 +292,10 @@ public void SetContent_InsertsContentInMiddle_WhenSpanIsInMiddleOfDocument() { var lines = new List(["Line 1", "Line 2", "Line 3"]); var span = TextSpan.New(1, 0, 1, 0).Unwrap(); - var offset = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]); + var change = span.SetContent(lines, UpdateOptions.None, ["New Line 1", "New Line 2", "New Line 3"]).Unwrap(); Assert.Multiple(() => { - Assert.That(offset, Is.EqualTo(3)); + Assert.That(change, Is.EqualTo(new ContentChange(3, 0, 0))); Assert.That(lines, Has.Count.EqualTo(6)); Assert.That(lines[0], Is.EqualTo("Line 1")); Assert.That(lines[1], Is.EqualTo("New Line 1")); @@ -308,10 +311,10 @@ public void SetContent_InsertsContentAtEndOfLastString_WhenInlineModeAndContentI var lines = new List(["Hello, World!"]); var span = TextSpan.New(0, 0, 0, 0).Unwrap(); - var offset = span.SetContent(lines, UpdateOptions.InsertInline, ["New", "Super cool", "This is a cool "]); + var change = span.SetContent(lines, UpdateOptions.InsertInline, ["New", "Super cool", "This is a cool "]).Unwrap(); Assert.Multiple(() => { - Assert.That(offset, Is.EqualTo(2)); + Assert.That(change, Is.EqualTo(new ContentChange(2, 0, 15))); Assert.That(lines, Has.Count.EqualTo(3)); Assert.That(lines[0], Is.EqualTo("New")); Assert.That(lines[1], Is.EqualTo("Super cool")); @@ -329,6 +332,18 @@ public void GetContent_ContentFromMiddleOfLines_AndPartialLine() { Assert.That(content, Is.EqualTo("Hello")); } + [TestCaseSource(typeof(TestData), nameof(TestData.OrderTestCases))] + public int CompareTo( + TextSpan textSpan, + TextSpan otherSpan + ) { + var result = textSpan.CompareTo(otherSpan); + var reverseResult = otherSpan.CompareTo(textSpan); + Assert.That(result, Is.EqualTo(-reverseResult)); + + return result; + } + public static class TestData { private static readonly List EmptyLines = []; private static readonly List SingleLine = new(["Hello, World!, I'm the Document!"]); @@ -443,5 +458,59 @@ public static IEnumerable WrappingEntireDocumentTextCases { yield return new TestCaseData(arg: TenLines.ToArray()).SetCategory("Ten lines").Returns(TextSpan.New(0, 0, 9, 6).Unwrap()); } } + + public static IEnumerable OrderTestCases { + get { + yield return new TestCaseData( + TextSpan.New(5, 3, 7, 21).Unwrap(), + TextSpan.New(5, 3, 7, 21).Unwrap() + ).Returns(0).SetDescription("Same span"); + + yield return new TestCaseData( + TextSpan.New(5, 3, 7, 21).Unwrap(), + TextSpan.New(5, 3, 7, 22).Unwrap() + ).Returns(-1).SetDescription("End column is greater"); + + yield return new TestCaseData( + TextSpan.New(5, 3, 7, 21).Unwrap(), + TextSpan.New(5, 3, 8, 21).Unwrap() + ).Returns(-1).SetDescription("End line is greater"); + + yield return new TestCaseData( + TextSpan.New(5, 3, 7, 21).Unwrap(), + TextSpan.New(5, 4, 7, 21).Unwrap() + ).Returns(1).SetDescription("Start column is greater"); + + yield return new TestCaseData( + TextSpan.New(5, 3, 7, 21).Unwrap(), + TextSpan.New(6, 3, 7, 21).Unwrap() + ).Returns(1).SetDescription("Start line is greater"); + + yield return new TestCaseData( + TextSpan.New(6, 4, 7, 21).Unwrap(), + TextSpan.New(6, 3, 8, 10).Unwrap() + ).Returns(-1).SetDescription("Multi-line contained by inside multi-line span"); + + yield return new TestCaseData( + TextSpan.New(6, 4, 6, 21).Unwrap(), + TextSpan.New(6, 3, 6, 53).Unwrap() + ).Returns(-1).SetDescription("Single-line contained by other single-line span"); + + yield return new TestCaseData( + TextSpan.New(7, 0, 7, 50).Unwrap(), + TextSpan.New(6, 3, 8, 21).Unwrap() + ).Returns(-1).SetDescription("Single-line contained by other multi-line span"); + } + } + + public static TextSpan WrappingEntireDocument(TextDocument document) => WrappingEntireDocument([.. document.GetLines()]); + + public static TextSpan WrappingEntireDocument(string[] lines) { + if (lines.Length == 0) { + return TextSpan.New(0, 0, 0, 0).Unwrap(); + } + + return TextSpan.New(0, 0, lines.Length - 1, lines[^1].Length).Unwrap(); + } } } diff --git a/tests/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs b/tests/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs new file mode 100644 index 00000000..b793f63e --- /dev/null +++ b/tests/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs @@ -0,0 +1,67 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Collections; +using Compiler.Text.Updater.Built; + +namespace Compiler.Test.Text.Updater.Built; + +[TestFixture] +public class CommentRemovalUpdaterTests { + [TestCaseSource(typeof(TestData), nameof(TestData.Data))] + public string Apply_RemovesComments(string content) { + var updater = new CommentRemovalUpdater(); + var lines = content.Split('\n').ToList(); + var result = updater.Apply(lines); + + Assert.Multiple(() => { + Assert.That(lines, Is.Not.Null); + Assert.That(result, Is.Not.Null.Or.Empty); + Assert.That(result.IsSucc, Is.True); + }); + + return string.Join('\n', lines); + } + + private static class TestData { + public static IEnumerable Data { + get { + yield return new TestCaseData(""" + Write-Host 'Hello, World!'# This is a comment + """).Returns(""" + Write-Host 'Hello, World!' + """); + + yield return new TestCaseData(""" + Write-Host 'Hello, World!'# This is a comment + Write-Host 'Goodbye, World!'# This is another comment + """).Returns(""" + Write-Host 'Hello, World!' + Write-Host 'Goodbye, World!' + """); + + yield return new TestCaseData(""" + Write-Host 'Hello, World!'# This is a comment + # This is another comment + """).Returns(""" + Write-Host 'Hello, World!' + """); + + yield return new TestCaseData(""" + # This is a comment + # This is another comment + """).Returns(string.Empty); + + yield return new TestCaseData(""" + # This is a comment + """).Returns(string.Empty); + + yield return new TestCaseData(""" + Write-Host 'Hello, World!' + """).Returns(""" + Write-Host 'Hello, World!' + """); + } + } + } +} diff --git a/tests/Compiler/Text/Updater/Built/HereString.cs b/tests/Compiler/Text/Updater/Built/HereStringUpdater.cs similarity index 95% rename from tests/Compiler/Text/Updater/Built/HereString.cs rename to tests/Compiler/Text/Updater/Built/HereStringUpdater.cs index a40802aa..3fb43516 100644 --- a/tests/Compiler/Text/Updater/Built/HereString.cs +++ b/tests/Compiler/Text/Updater/Built/HereStringUpdater.cs @@ -10,7 +10,7 @@ namespace Compiler.Test.Text.Updater.Built; public class HereStringUpdaterTests { [TestCaseSource(typeof(TestData), nameof(TestData.Data))] public string InternalApply_UpdatesHereStrings(string astContent) { - var ast = AstHelper.GetAstReportingErrors(astContent, default, []).Unwrap().Find(ast => ast is StringConstantExpressionAst, false)!; + var ast = AstHelper.GetAstReportingErrors(astContent, default, [], out _).Unwrap().Find(ast => ast is StringConstantExpressionAst, false)!; var result = HereStringUpdater.InternalApply(ast); Assert.That(result, Is.Not.Null.Or.Empty); diff --git a/tests/Compiler/Utils.cs b/tests/Compiler/Utils.cs index 8ff1be14..4f857165 100644 --- a/tests/Compiler/Utils.cs +++ b/tests/Compiler/Utils.cs @@ -1,13 +1,13 @@ -using System.Reflection; +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + using System.Runtime.CompilerServices; using Compiler.Requirements; namespace Compiler.Test; -public class TestUtils -{ - public static PathedModuleSpec GetModuleSpecFromContent(string content) - { +public class TestUtils { + public static PathedModuleSpec GetModuleSpecFromContent(string content) { var tempFile = Path.GetTempFileName(); File.WriteAllText(tempFile, content); return new PathedModuleSpec(tempFile); diff --git a/tests/Compiler/packages.lock.json b/tests/Compiler/packages.lock.json index 17769c10..51929d96 100644 --- a/tests/Compiler/packages.lock.json +++ b/tests/Compiler/packages.lock.json @@ -1,7 +1,7 @@ { "version": 1, "dependencies": { - "net8.0": { + "net8.0-windows7.0": { "coverlet.collector": { "type": "Direct", "requested": "[6.0.0, )", @@ -426,7 +426,7 @@ } } }, - "net8.0/linux-x64": { + "net8.0-windows7.0/linux-x64": { "Microsoft.Management.Infrastructure.Runtime.Unix": { "type": "Transitive", "resolved": "3.0.0", @@ -524,7 +524,7 @@ "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } }, - "net8.0/win-x64": { + "net8.0-windows7.0/win-x64": { "Microsoft.Management.Infrastructure.Runtime.Unix": { "type": "Transitive", "resolved": "3.0.0", From 19b716522e9868009732c3926646595285f88a4e Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 23 Sep 2024 18:55:03 +1000 Subject: [PATCH 158/341] fix(Compiler): misc script fixes for new compiler --- src/common/Cache.psm1 | 76 +- src/common/Input.psm1 | 2 +- src/common/Temp.psm1 | 6 +- src/microsoft/Common.psm1 | 2 + src/microsoft/Security.ps1 | 12 +- src/microsoft/admin/Invoke-ForCustomer.ps1 | 7 + .../admin/New-PartnerApplication.ps1 | 5 +- src/microsoft/admin/Update-DKIM.ps1 | 2 + src/microsoft/entra/Get-MFAChanges.ps1 | 2 + src/microsoft/entra/OffboardUser.ps1 | 3 + src/microsoft/entra/StaffLocation.ps1 | 76 +- src/microsoft/entra/TravelAccess.ps1 | 2 +- src/microsoft/security/ConditonalAccess.ps1 | 3 +- src/microsoft/security/Exchange.ps1 | 105 +- src/microsoft/security/Retention.ps1 | 12 +- src/microsoft/security/SecureScore.ps1 | 7 +- src/microsoft/security/Setup-Alerts.ps1 | 23 +- src/microsoft/windows/Invoke-Downloadable.ps1 | 9 +- .../windows/Repair-WMIRepository.ps1 | 21 +- src/microsoft/windows/Setup-Printer.ps1 | 9 +- src/microsoft/windows/Setup-Wireguard.ps1 | 14 +- src/misc/Export-KaseyaQuotes.ps1 | 1 + src/misc/Setup-SecretManagement.ps1 | 3 +- src/n-sight/Get-InstalledSoftware.ps1 | 2 + src/n-sight/cleaners/N-sightRMMCleanup.ps1 | 8 +- src/n-sight/cleaners/PMECleanup.ps1 | 62 +- src/n-sight/cleaners/TakeControlCleanup.ps1 | 42 +- src/n-sight/cleaners/Update.ps1 | 3 +- src/n-sight/cleaners/WindowsAgentCleanup.ps1 | 1291 ++++++++--------- src/n-sight/cleaners/avdCleanup.ps1 | 24 +- src/n-sight/cleaners/edr-ecosystem.ps1 | 2 +- 31 files changed, 941 insertions(+), 895 deletions(-) diff --git a/src/common/Cache.psm1 b/src/common/Cache.psm1 index a3692685..5709bff6 100644 --- a/src/common/Cache.psm1 +++ b/src/common/Cache.psm1 @@ -1,7 +1,7 @@ -Using module ./Logging.psm1 -Using module ./Scope.psm1 -Using module ./Exit.psm1 -Using module ./Utils.psm1 +Using module .\Logging.psm1 +Using module .\Scope.psm1 +Using module .\Exit.psm1 +Using module .\Utils.psm1 [Int]$Script:FAILED_FOLDER_CREATION = Register-ExitCode 'Failed to create the cache folder.'; [Int]$Script:FAILED_FILE_CREATION = Register-ExitCode 'Failed to create the cache file.'; @@ -10,26 +10,26 @@ Using module ./Utils.psm1 function Get-CachedContent { param( - [Parameter(Mandatory, HelpMessage="The unique name of the cache file.")] + [Parameter(Mandatory, HelpMessage = 'The unique name of the cache file.')] [String]$Name, - [Parameter(HelpMessage="The maximum age of the cache file.")] + [Parameter(HelpMessage = 'The maximum age of the cache file.')] [TimeSpan]$MaxAge, [Parameter(HelpMessage = 'A Custom script block to determine if the cached content is still valid.')] [ScriptBlock]$IsValidBlock, - [Parameter(Mandatory, HelpMessage="The script block which creates the content to be cached if needed, this should return a JSON object.")] + [Parameter(Mandatory, HelpMessage = 'The script block which creates the content to be cached if needed, this should return a JSON object.')] [ScriptBlock]$CreateBlock, [Parameter()] [ScriptBlock]$WriteBlock, - [Parameter(Mandatory, HelpMessage="The script block to parse the cached content.")] + [Parameter(Mandatory, HelpMessage = 'The script block to parse the cached content.')] [ValidateNotNullOrEmpty()] [ScriptBlock]$ParseBlock, - [Parameter(HelpMessage="Don't use the cached response, use the CreateBlock.")] + [Parameter(HelpMessage = "Don't use the cached response, use the CreateBlock.")] [Switch]$NoCache ) @@ -64,52 +64,52 @@ function Get-CachedLocation { [Parameter(HelpMessage = 'A Custom script block to determine if the cached content is still valid.')] [ValidateNotNullOrEmpty()] [ValidateScript({ - [System.Management.Automation.Language.Ast]$Local:Ast = $_.Ast; + [System.Management.Automation.Language.Ast]$Local:Ast = $_.Ast; - if (-not ($Local:Ast.ParamBlock.Parameters.Count -eq 1)) { - Invoke-Error 'The script block should have one parameter.'; - return $False; - } + if (-not ($Local:Ast.ParamBlock.Parameters.Count -eq 1)) { + Invoke-Error 'The script block should have one parameter.'; + return $False; + } - if (-not (Test-ReturnType -InputObject:$_ -ValidTypes @([Boolean]))) { - Invoke-Error 'The script block should return a boolean value.'; - return $False; - } + if (-not (Test-ReturnType -InputObject:$_ -ValidTypes @([Boolean]))) { + Invoke-Error 'The script block should return a boolean value.'; + return $False; + } - return $True; - })] + return $True; + })] [ScriptBlock]$IsValidBlock, [Parameter(Mandatory, HelpMessage = 'The script block which creates the content to be cached if needed, this should return a JSON object.')] [ValidateNotNullOrEmpty()] [ValidateScript({ - [System.Management.Automation.Language.Ast]$Local:Ast = $_.Ast; + [System.Management.Automation.Language.Ast]$Local:Ast = $_.Ast; - if (-not ($Local:Ast.ParamBlock.Parameters.Count -eq 0)) { - Invoke-Error 'The script block should not have any parameters.'; - return $False; - } + if (-not ($Local:Ast.ParamBlock.Parameters.Count -eq 0)) { + Invoke-Error 'The script block should not have any parameters.'; + return $False; + } - if (($Local:Ast.FindAll({ $args[0] -is [System.Management.Automation.Language.ReturnStatementAst] }, $True).Count -lt 1)) { - Invoke-Error 'The script block should return a value.'; - return $False; - } + if (($Local:Ast.FindAll({ $args[0] -is [System.Management.Automation.Language.ReturnStatementAst] }, $True).Count -lt 1)) { + Invoke-Error 'The script block should return a value.'; + return $False; + } - return $True; - })] + return $True; + })] [ScriptBlock]$CreateBlock, [Parameter(HelpMessage = 'The script block used to write the content to the cache file.')] [ValidateScript({ - [System.Management.Automation.Language.Ast]$Local:Ast = $_.Ast; + [System.Management.Automation.Language.Ast]$Local:Ast = $_.Ast; - if (-not ($Local:Ast.ParamBlock.Parameters.Count -eq 2)) { - Invoke-Error 'The script block should have two parameters.'; - return $false; - } + if (-not ($Local:Ast.ParamBlock.Parameters.Count -eq 2)) { + Invoke-Error 'The script block should have two parameters.'; + return $false; + } - return $true; - })] + return $true; + })] [ScriptBlock]$WriteBlock = { param( [Parameter(Mandatory)] diff --git a/src/common/Input.psm1 b/src/common/Input.psm1 index cb1a8649..9876d670 100644 --- a/src/common/Input.psm1 +++ b/src/common/Input.psm1 @@ -2,7 +2,7 @@ Using module ./Utils.psm1 Using module ./Logging.psm1 Using module ./Scope.psm1 Using module ./Assert.psm1 -Using module ./Ensure.psm1 + Using module @{ ModuleName = 'PSReadLine'; ModuleVersion = '2.3.2'; diff --git a/src/common/Temp.psm1 b/src/common/Temp.psm1 index b4f69b78..d632e940 100644 --- a/src/common/Temp.psm1 +++ b/src/common/Temp.psm1 @@ -18,8 +18,7 @@ function Get-NamedTempFolder { if (-not (Test-Path $Local:Folder -PathType Container)) { Invoke-Verbose -Message "Creating temporary folder $Local:Folder..."; New-Item -ItemType Directory -Path $Local:Folder | Out-Null; - } - elseif (Test-Path $Local:Folder -PathType Container) { + } elseif (Test-Path $Local:Folder -PathType Container) { Invoke-Verbose -Message "Temporary folder $Local:Folder already exists."; if ($ForceEmpty) { Invoke-Verbose -Message "Emptying temporary folder $Local:Folder..."; @@ -46,8 +45,7 @@ function Invoke-WithinEphemeral { Invoke-Verbose -Message "Executing script block within temporary folder $Local:Folder..."; Push-Location -Path $Local:Folder; & $ScriptBlock; - } - finally { + } finally { Invoke-Verbose -Message "Cleaning temporary folder $Local:Folder..."; Pop-Location; Remove-Item -Path $Local:Folder -Force -Recurse; diff --git a/src/microsoft/Common.psm1 b/src/microsoft/Common.psm1 index a6e77ae8..f6a33d4d 100644 --- a/src/microsoft/Common.psm1 +++ b/src/microsoft/Common.psm1 @@ -289,3 +289,5 @@ function Invoke-ForEachCustomer { } } } + +Export-ModuleMember -Function Get-AlertsUser, Invoke-ForEachCustomer; diff --git a/src/microsoft/Security.ps1 b/src/microsoft/Security.ps1 index df764200..de2b0454 100644 --- a/src/microsoft/Security.ps1 +++ b/src/microsoft/Security.ps1 @@ -1,8 +1,10 @@ -Using module ..\common\Environment.psm1 -Using module ..\common\Connection.psm1 -Using module .\Common.psm1 +Using module ../common/Environment.psm1 +Using module ../common/Connection.psm1 +Using module ./Common.psm1 + Using module Microsoft.Online.SharePoint.PowerShell +[CmdletBinding()] Param( [Parameter(Mandatory)] [ValidateSet('SecurityAlerts', 'ConditionalAccess', 'Sharepoint', 'Exchange')] @@ -140,10 +142,10 @@ Invoke-RunMain $PSCmdlet { New-ConditionalAccessPrivilegedIdentityManagementPolicy; } 'Sharepoint' { - Invoke-EnsureModule Microsoft.Online.Sharepoint.Powershell; + # Invoke-EnsureModule Microsoft.Online.Sharepoint.Powershell; } 'Exchange' { - Invoke-EnsureModule ExchangeOnlineManagement; + # Invoke-EnsureModule ExchangeOnlineManagement; Disable-Outlook_StorageProviders diff --git a/src/microsoft/admin/Invoke-ForCustomer.ps1 b/src/microsoft/admin/Invoke-ForCustomer.ps1 index 81717a05..30580dbc 100644 --- a/src/microsoft/admin/Invoke-ForCustomer.ps1 +++ b/src/microsoft/admin/Invoke-ForCustomer.ps1 @@ -1,4 +1,11 @@ Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Scope.psm1 +Using module ../../common/Input.psm1 +Using module ../../common/Utils.psm1 +Using module ../../common/Connection.psm1 +Using module ../../common/Exit.psm1 + Using module Microsoft.Graph.Authentication Using module PartnerCenter diff --git a/src/microsoft/admin/New-PartnerApplication.ps1 b/src/microsoft/admin/New-PartnerApplication.ps1 index fd88c852..32035a16 100644 --- a/src/microsoft/admin/New-PartnerApplication.ps1 +++ b/src/microsoft/admin/New-PartnerApplication.ps1 @@ -26,15 +26,12 @@ Using module ../../common/Analyser.psm1 Using module ../../common/Environment.psm1 Using module ../../common/Logging.psm1 Using module ../../common/Exit.psm1 + Using module AzureAD Using module PartnerCenter Using namespace Microsoft.Open.AzureAD.Model -[SupressAnalyser( - 'UseOfUndefinedFunction', - 'Connect-AzureAD','Get-AzureADTenantDetail','New-AzureADApplication','New-AzureADApplicationPasswordCredential' -)] Param( [Parameter(Mandatory)] [string]$DisplayName, diff --git a/src/microsoft/admin/Update-DKIM.ps1 b/src/microsoft/admin/Update-DKIM.ps1 index fd1d8a22..e96a08a6 100644 --- a/src/microsoft/admin/Update-DKIM.ps1 +++ b/src/microsoft/admin/Update-DKIM.ps1 @@ -2,6 +2,8 @@ Using module ../../common/Environment.psm1 Using module ../../common/Connection.psm1 +Using module ../../common/Logging.psm1 + Using module Microsoft.Graph.Identity.DirectoryManagement Using namespace Microsoft.Graph.PowerShell.Models diff --git a/src/microsoft/entra/Get-MFAChanges.ps1 b/src/microsoft/entra/Get-MFAChanges.ps1 index 99042e98..59972981 100644 --- a/src/microsoft/entra/Get-MFAChanges.ps1 +++ b/src/microsoft/entra/Get-MFAChanges.ps1 @@ -6,6 +6,8 @@ Using module ../../common/Logging.psm1 Using module ../../common/Ensure.psm1 Using module ../../common/Scope.psm1 Using module ../../common/Exit.psm1 +Using module ../../common/Assert.psm1 +Using module ../../common/Input.psm1 Using module ImportExcel diff --git a/src/microsoft/entra/OffboardUser.ps1 b/src/microsoft/entra/OffboardUser.ps1 index 282e14e6..e4ddfaaf 100644 --- a/src/microsoft/entra/OffboardUser.ps1 +++ b/src/microsoft/entra/OffboardUser.ps1 @@ -1,5 +1,8 @@ Using module ../../common/Environment.psm1 +Using module ../../common/Input.psm1 +Using module ../../common/Connection.psm1 Using module ../Common.psm1 + Using module ExchangeOnlineManagement Using module Microsoft.Graph.Users diff --git a/src/microsoft/entra/StaffLocation.ps1 b/src/microsoft/entra/StaffLocation.ps1 index 6bd5a8b3..c3665e4f 100644 --- a/src/microsoft/entra/StaffLocation.ps1 +++ b/src/microsoft/entra/StaffLocation.ps1 @@ -11,13 +11,15 @@ - Intune Device Configuration Profile (Optional) #> +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Input.psm1 +Using module ../../common/Connection.psm1 + Using module Microsoft.Graph.Identity.SignIns Using module Microsoft.Graph.Authentication Using module Microsoft.Graph.Groups -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 - Using namespace Microsoft.Graph.PowerShell.Models Using namespace System.Management.Automation @@ -246,45 +248,45 @@ function Set-ConditionalAccessPolicy { # Register-ArgumentCompleter -CommandName:($PSCommandPath | Split-Path -Leaf) -ScriptBlock $Local:ScriptBlock Invoke-RunMain $PSCmdlet -Main:$Local:ScriptBlock; -dynamicparam { - Start-Sleep -Seconds 15; +# dynamicparam { +# Start-Sleep -Seconds 15; - $Parameters = $Local:ScriptBlock.Ast.ParamBlock.Parameters; - if ($Parameters.Count -eq 0) { - Write-Host 'No parameters found.'; - return; - } else { - Write-Host "Found $($Parameters.Count) parameters."; - } +# $Parameters = $Local:ScriptBlock.Ast.ParamBlock.Parameters; +# if ($Parameters.Count -eq 0) { +# Write-Host 'No parameters found.'; +# return; +# } else { +# Write-Host "Found $($Parameters.Count) parameters."; +# } - $RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary; - - foreach ($Param in $Parameters) { - $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]; - - foreach ($Attribute in $Param.Attributes) { - $AttributeSet = New-Object "System.Management.Automation.$($Attribute.TypeName)Attribute"; - foreach ($Argument in $Attribute.NamedArguments) { - if ($Argument.ExpressionOmmited) { - # Assume its a switch parameter - $AttributeSet.($Argument.ArgumentName) = $True; - } else { - # Invoke the expression to get the value - $AttributeSet.($Argument.ArgumentName) = Invoke-Expression $Attribute.Argument.Extent.Text; - } - } +# $RuntimeParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary; + +# foreach ($Param in $Parameters) { +# $AttributeCollection = New-Object System.Collections.ObjectModel.Collection[System.Attribute]; + +# foreach ($Attribute in $Param.Attributes) { +# $AttributeSet = New-Object "System.Management.Automation.$($Attribute.TypeName)Attribute"; +# foreach ($Argument in $Attribute.NamedArguments) { +# if ($Argument.ExpressionOmmited) { +# # Assume its a switch parameter +# $AttributeSet.($Argument.ArgumentName) = $True; +# } else { +# # Invoke the expression to get the value +# $AttributeSet.($Argument.ArgumentName) = Invoke-Expression $Attribute.Argument.Extent.Text; +# } +# } - $AttributeCollection.Add($AttributeSet); - } +# $AttributeCollection.Add($AttributeSet); +# } - $ParameterName = $Param.Name.VariablePath.UserPath; - $ParameterType = $Param.StaticType; - $RuntimeParameter = [System.Management.Automation.RuntimeDefinedParameter]::new($ParameterName, $ParameterType, $AttributeCollection); - $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter); - } +# $ParameterName = $Param.Name.VariablePath.UserPath; +# $ParameterType = $Param.StaticType; +# $RuntimeParameter = [System.Management.Automation.RuntimeDefinedParameter]::new($ParameterName, $ParameterType, $AttributeCollection); +# $RuntimeParameterDictionary.Add($ParameterName, $RuntimeParameter); +# } - return $RuntimeParameterDictionary -} +# return $RuntimeParameterDictionary +# } # dynamicparam { # [RuntimeDefinedParameterDictionary]$Parameters = [RuntimeDefinedParameterDictionary]::new(); diff --git a/src/microsoft/entra/TravelAccess.ps1 b/src/microsoft/entra/TravelAccess.ps1 index 2f603a9f..a496c8ad 100644 --- a/src/microsoft/entra/TravelAccess.ps1 +++ b/src/microsoft/entra/TravelAccess.ps1 @@ -1,6 +1,6 @@ #Requires -Version 5.1 -Using module ../common/Environment.psm1 +Using module ../../common/Environment.psm1 Invoke-RunMain $PSCmdlet { # Sign into EntraID diff --git a/src/microsoft/security/ConditonalAccess.ps1 b/src/microsoft/security/ConditonalAccess.ps1 index d5f6ff02..dd06506f 100644 --- a/src/microsoft/security/ConditonalAccess.ps1 +++ b/src/microsoft/security/ConditonalAccess.ps1 @@ -1,7 +1,8 @@ +#!ignore #Requires -Version 5.1 -#Requires -Modules AzureADPreview Using module ..\..\common\Environment.psm1 +Using module AzureAD function New-Condition_AllCloudApps( [Parameter(Mandatory)] diff --git a/src/microsoft/security/Exchange.ps1 b/src/microsoft/security/Exchange.ps1 index 8ac6f6ca..e8cc8ace 100644 --- a/src/microsoft/security/Exchange.ps1 +++ b/src/microsoft/security/Exchange.ps1 @@ -1,8 +1,11 @@ #Requires -Modules ExchangeOnlineManagement -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 -Using module ..\..\common\Scope.psm1 +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Scope.psm1 +Using module ../../common/Input.psm1 +Using module ../../common/Connection.psm1 +Using module ../Common.psm1 Param( [Parameter(Mandatory)] @@ -19,6 +22,16 @@ function Enable-MailboxAuditing { function Enable-MailTips { Set-OrganizationConfig -MailTipsAllTipsEnabled $true -MailTipsExternalRecipientsTipsEnabled $true -MailTipsGroupMetricsEnabled $true -MailTipsLargeAudienceThreshold '25' } + +function Enable-AlertSpamPolicyAdmin { + $AlertsUser = Get-AlertsUser; + + Set-HostedOutboundSpamFilterPolicy -Identity Default ` + -BccSuspiciousOutboundAdditionalRecipients @($AlertsUser) ` + -BccSuspiciousOutboundMail $true ` + -NotifyOutboundSpam $true ` + -NotifyOutboundSpamRecipients @($AlertsUser); +} #endregion - Mailbox settings #region - Outlook settings @@ -35,11 +48,11 @@ function Update-SafeAttachmentsPolicy { process { $Local:Params = @{ - Name = 'AMT - Default safe attachments' - Enable = $true + Name = 'AMT - Default safe attachments' + Enable = $true - Action = 'DynamicDelivery' - QuarantineTag = 'AdminOnlyAccessPolicy' + Action = 'DynamicDelivery' + QuarantineTag = 'AdminOnlyAccessPolicy' }; try { @@ -207,46 +220,46 @@ function Update-AntiMalwarePolicy { process { $Local:Params = @{ - Name = 'AMT - Default malware filter policy' - Enable = $true - Action = 'Quarantine' - HighConfidenceSpamAction = 'Quarantine' - HighConfidenceMalwareAction = 'Quarantine' - BulkSpamAction = 'Quarantine' - BulkMalwareAction = 'Quarantine' - SpamAction = 'Quarantine' - PhishAction = 'Quarantine' - ZAPEnabled = $true - BypassInboundMessages = $false - BypassOutboundMessages = $false - BypassUnauthenticatedSenders = $false - BypassAuthenticatedUsers = $false - BypassMessagesSentToAndFromFollowedUsers = $false - BypassMessagesSentToFollowedUsers = $false - BypassMalwareDetection = $false - BypassSpamDetection = $false - BypassInboxRules = $false - BypassSecurityGroupManagerModeration = $false - BypassModerationFromRecipient = $false - BypassSenderAdminCheck = $false - BypassSenderInRecipientBlockedCondition = $false - BypassSenderInRecipientBlockedConditionExceptions = @() - BypassSenderInRecipientBlockedConditionAction = 'Quarantine' - BypassMalwareFiltering = $false - BypassSpamFiltering = $false - BypassRBLCheck = $false - BypassZeroHourExploits = $false - BypassSpoofDetection = $false - BypassPhishingDetection = $false - BypassDirectoryBasedEdgeBlocking = $false - BypassSenderReputationCheck = $false + Name = 'AMT - Default malware filter policy' + Enable = $true + Action = 'Quarantine' + HighConfidenceSpamAction = 'Quarantine' + HighConfidenceMalwareAction = 'Quarantine' + BulkSpamAction = 'Quarantine' + BulkMalwareAction = 'Quarantine' + SpamAction = 'Quarantine' + PhishAction = 'Quarantine' + ZAPEnabled = $true + BypassInboundMessages = $false + BypassOutboundMessages = $false + BypassUnauthenticatedSenders = $false + BypassAuthenticatedUsers = $false + BypassMessagesSentToAndFromFollowedUsers = $false + BypassMessagesSentToFollowedUsers = $false + BypassMalwareDetection = $false + BypassSpamDetection = $false + BypassInboxRules = $false + BypassSecurityGroupManagerModeration = $false + BypassModerationFromRecipient = $false + BypassSenderAdminCheck = $false + BypassSenderInRecipientBlockedCondition = $false + BypassSenderInRecipientBlockedConditionExceptions = @() + BypassSenderInRecipientBlockedConditionAction = 'Quarantine' + BypassMalwareFiltering = $false + BypassSpamFiltering = $false + BypassRBLCheck = $false + BypassZeroHourExploits = $false + BypassSpoofDetection = $false + BypassPhishingDetection = $false + BypassDirectoryBasedEdgeBlocking = $false + BypassSenderReputationCheck = $false BypassSenderInRecipientBlockedConditionFallbackAction = 'Quarantine' - BypassMaliciousFileDetection = $false - BypassDomainSecureEnabledCheck = $false - BypassDomainSecureOverrideCheck = $false - BypassDomainSecureOverrideAction = 'Quarantine' - BypassDomainSecureOverrideBulkAction = 'Quarantine' - BypassDomainSecureOverrideHighConfidenceAction = 'Quarantine' + BypassMaliciousFileDetection = $false + BypassDomainSecureEnabledCheck = $false + BypassDomainSecureOverrideCheck = $false + BypassDomainSecureOverrideAction = 'Quarantine' + BypassDomainSecureOverrideBulkAction = 'Quarantine' + BypassDomainSecureOverrideHighConfidenceAction = 'Quarantine' } try { diff --git a/src/microsoft/security/Retention.ps1 b/src/microsoft/security/Retention.ps1 index c131eb62..3550d131 100644 --- a/src/microsoft/security/Retention.ps1 +++ b/src/microsoft/security/Retention.ps1 @@ -1,8 +1,10 @@ #Requires -Version 5.1 -#Requires -Modules ExchangeOnlineManagement -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Connection.psm1 + +Using module ExchangeOnlineManagement [String]$Script:RetentionPolicy = 'Log Retention Policy'; [String]$Script:RetentionPolicyDescription = 'One year retention policy for all activities'; @@ -16,7 +18,7 @@ Invoke-RunMain $PSCmdlet { $UnifiedAuditLogRetentionPolicy = Get-UnifiedAuditLogRetentionPolicy | Where-Object { $_.Name -eq $Script:RetentionPolicy }; if ($null -eq $UnifiedAuditLogRetentionPolicy) { - Invoke-Info "Creating new policy..."; + Invoke-Info 'Creating new policy...'; New-UnifiedAuditLogRetentionPolicy ` -Name $Script:RetentionPolicy ` @@ -27,7 +29,7 @@ Invoke-RunMain $PSCmdlet { return; } - Invoke-Info "Updating existing policy..."; + Invoke-Info 'Updating existing policy...'; Set-UnifiedAuditLogRetentionPolicy ` -Identity $UnifiedAuditLogRetentionPolicy.Identity ` -Description $Script:RetentionPolicyDescription ` diff --git a/src/microsoft/security/SecureScore.ps1 b/src/microsoft/security/SecureScore.ps1 index cf356f88..d20c9fbb 100644 --- a/src/microsoft/security/SecureScore.ps1 +++ b/src/microsoft/security/SecureScore.ps1 @@ -1,3 +1,8 @@ +Using module ../../common/Environment.psm1 +Using module ../Common.psm1 + +Using module Microsoft.Graph.Beta.Security + function Get-SecureScore( [System.DateTime]$Date = (Get-Date) ) { @@ -9,7 +14,7 @@ function Get-SecureScoreDifference { $Local:ScoreToday = Get-SecureScore; $Local:ScoreLastMonth = Get-SecureScore -Date (Get-Date).AddMonths(-1); - if ($Local:ScoreToday -and $Local:ScoreLastMonth) { +if ($Local:ScoreToday -and $Local:ScoreLastMonth) { function Get-Percentage($Score) { return [Math]::Round(($Score.CurrentScore / $Score.MaxScore) * 100, 2); } diff --git a/src/microsoft/security/Setup-Alerts.ps1 b/src/microsoft/security/Setup-Alerts.ps1 index e6cf1386..b136b28f 100644 --- a/src/microsoft/security/Setup-Alerts.ps1 +++ b/src/microsoft/security/Setup-Alerts.ps1 @@ -1,9 +1,12 @@ #Requires -Version 5.1 -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 -Using module ..\..\common\Scope.psm1 -Using module ..\..\common\Connection.psm1 +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Scope.psm1 +Using module ../../common/Connection.psm1 +Using module ../Common.psm1 + +Using module ExchangeOnlineManagement param( [Parameter()] @@ -20,7 +23,7 @@ function Update-SecurityAndCompilence( $Local:Alerts = $Local:Alerts | Where-Object { ($_.NotifyUser -ne $AlertsUser.WindowsLiveID) -and !$_.Disabled } if ($null -eq $Local:Alerts -or $Local:Alerts.Count -eq 0) { - Info 'All Security and Complience alerts are already configured to notify the Alerts user.'; + Invoke-Info 'All Security and Complience alerts are already configured to notify the Alerts user.'; return; } @@ -29,7 +32,7 @@ function Update-SecurityAndCompilence( if ($Local:Alert.IsSystemRule) { # Check for existing custom rule if ($Local:AlertNames -contains "AMT $($Local:Alert.Name)") { - Info "Custom alert already exists for $($Local:Alert.Name). Skipping..."; + Invoke-Info "Custom alert already exists for $($Local:Alert.Name). Skipping..."; continue; } @@ -44,18 +47,18 @@ function Update-SecurityAndCompilence( New-ProtectionAlert -AggregationType $Local:NewAlert.AggregationType -AlertBy $Local:NewAlert.AlertBy -AlertFor $Local:NewAlert.AlertFor -Category $Local:NewAlert.Category -Comment $Local:NewAlert.Comment -CorrelationPolicyId $Local:NewAlert.CorrelationPolicyId -CustomProperties $Local:NewAlert.CustomProperties -Description $Local:NewAlert.Description -Disabled $Local:NewAlert.Disabled -Filter $Local:NewAlert.Filter -LogicalOperationName $Local:NewAlert.LogicalOperationName -Name $Local:NewAlert.Name -NotificationCulture $Local:NewAlert.NotificationCulture -NotificationEnabled $Local:NewAlert.NotificationEnabled -NotifyUser $Local:NewAlert.NotifyUser -NotifyUserOnFilterMatch $Local:NewAlert.NotifyUserOnFilterMatch -NotifyUserSuppressionExpiryDate $Local:NewAlert.NotifyUserSuppressionExpiryDate -NotifyUserThrottleThreshold $Local:NewAlert.NotifyUserThrottleThreshold -NotifyUserThrottleWindow $Local:NewAlert.NotifyUserThrottleWindow -Operation $Local:NewAlert.Operation -PrivacyManagementScopedSensitiveInformationTypes $Local:NewAlert.PrivacyManagementScopedSensitiveInformationTypes -PrivacyManagementScopedSensitiveInformationTypesForCounting $Local:NewAlert.PrivacyManagementScopedSensitiveInformationTypesForCounting -PrivacyManagementScopedSensitiveInformationTypesThreshold $Local:NewAlert.PrivacyManagementScopedSensitiveInformationTypesThreshold -Severity $Local:NewAlert.Severity -ThreatType $Local:NewAlert.ThreatType -Threshold $Local:NewAlert.Threshold -TimeWindow $Local:NewAlert.TimeWindow -UseCreatedDateTime $Local:NewAlert.UseCreatedDateTime -VolumeThreshold $Local:NewAlert.VolumeThreshold -ErrorAction Stop | Out-Null $Local:AlertNames += $Local:NewAlert.Name; } catch { - Warn "Unable to create custom alert for $($Local:Alert.Name)."; + Invoke-Warn "Unable to create custom alert for $($Local:Alert.Name)."; $Local:UnableToCreate += $Local:Alert.Name; } } else { - Info "Updating alert ''$($Local:Alert.Name)''..." + Invoke-Info "Updating alert ''$($Local:Alert.Name)''..." Set-ProtectionAlert -Identity $Local:Alert.Name -NotifyUser $Local:AlertsUser.WindowsLiveID | Out-Null } } if ($Local:UnableToCreate.Count -gt 0) { - Warn "Unable to create custom alerts for the following alerts: $($Local:UnableToCreate -join ', ')"; - Warn "Please update these alerts manually at ``https://security.microsoft.com/alertpoliciesv2`` for alerts user ``$($Local:AlertsUser.UserPrincipalName)``."; + Invoke-Warn "Unable to create custom alerts for the following alerts: $($Local:UnableToCreate -join ', ')"; + Invoke-Warn "Please update these alerts manually at ``https://security.microsoft.com/alertpoliciesv2`` for alerts user ``$($Local:AlertsUser.UserPrincipalName)``."; } } diff --git a/src/microsoft/windows/Invoke-Downloadable.ps1 b/src/microsoft/windows/Invoke-Downloadable.ps1 index 7e0c4d34..5c62bdde 100644 --- a/src/microsoft/windows/Invoke-Downloadable.ps1 +++ b/src/microsoft/windows/Invoke-Downloadable.ps1 @@ -1,6 +1,9 @@ -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 -Using module ..\..\common\Scope.psm1 +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Scope.psm1 +Using module ../../common/Utils.psm1 +Using module ../../common/Temp.psm1 + [CmdletBinding(SupportsShouldProcess)] Param( diff --git a/src/microsoft/windows/Repair-WMIRepository.ps1 b/src/microsoft/windows/Repair-WMIRepository.ps1 index 2881f197..35e28f79 100644 --- a/src/microsoft/windows/Repair-WMIRepository.ps1 +++ b/src/microsoft/windows/Repair-WMIRepository.ps1 @@ -40,7 +40,7 @@ Invoke-RunMain $PSCmdlet { $Private:Dependants = Get-DependentServices -ServiceName Winmgmt; if ($Private:Dependants) { - Invoke-Info "The following services are dependent on the WMI service and are currently running:"; + Invoke-Info 'The following services are dependent on the WMI service and are currently running:'; $Private:Dependants.Keys | ForEach-Object { Invoke-Info $_; } @@ -56,18 +56,18 @@ Invoke-RunMain $PSCmdlet { Set-Service -Name Winmgmt -StartupType Disabled; Stop-Service -Name Winmgmt; - Invoke-Info "Making a backup of the repository"; + Invoke-Info 'Making a backup of the repository'; Copy-Item -Path $env:windir\System32\wbem\Repository -Destination $env:windir\System32\wbem\Repository_Backup -Recurse -Force; if ($Nuke) { - Invoke-Info "Nuking the WMI repository"; + Invoke-Info 'Nuking the WMI repository'; try { Remove-Item -Path $env:windir\System32\wbem\Repository -Recurse -Force; } catch { Invoke-Error $_.Exception.Message; } } else { - Invoke-Info "Attempting to repair the WMI repository"; + Invoke-Info 'Attempting to repair the WMI repository'; try { Start-Process -FilePath "$env:windir\System32\wbem\winmgmt.exe" -ArgumentList "/salvagerepository $env:windir\System32\wbem" -Wait -NoNewWindow; Start-Process -FilePath "$env:windir\System32\wbem\winmgmt.exe" -ArgumentList "/resetrepository $env:windir\System32\wbem" -Wait -NoNewWindow; @@ -76,18 +76,23 @@ Invoke-RunMain $PSCmdlet { } } - Invoke-Info "Starting WMI service"; + Invoke-Info 'Starting WMI service'; Set-Service -Name Winmgmt -StartupType Automatic; Start-Service -Name Winmgmt; if ($Private:Dependants) { - Invoke-Info "Starting dependent services"; + Invoke-Info 'Starting dependent services'; $Private:Dependants.Keys | ForEach-Object { Invoke-Info "Starting $_"; Set-Service -Name $_ -StartupType $Private:Dependants[$_]; - Start-Service -Name $_; + try { + Start-Service -Name $_; + } catch { + Invoke-Error "Error while restarting $($_): $($_.Exception.Message)"; + continue; + } } } - Invoke-Info "You should restart the computer to ensure that everything works correctly."; + Invoke-Info 'You should restart the computer to ensure that everything works correctly.'; }; diff --git a/src/microsoft/windows/Setup-Printer.ps1 b/src/microsoft/windows/Setup-Printer.ps1 index d29cc14c..75908018 100644 --- a/src/microsoft/windows/Setup-Printer.ps1 +++ b/src/microsoft/windows/Setup-Printer.ps1 @@ -1,8 +1,11 @@ #Requires -Version 5.1 -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 -Using module ..\..\common\Scope.psm1 +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Scope.psm1 +Using module ../../common/PackageManager.psm1 +Using module ../../common/Temp.psm1 +Using module ../../common/Exit.psm1 Param( [Parameter(Mandatory, Position = 0, ParameterSetName = 'Default')] diff --git a/src/microsoft/windows/Setup-Wireguard.ps1 b/src/microsoft/windows/Setup-Wireguard.ps1 index 818fcd65..8620fc9c 100644 --- a/src/microsoft/windows/Setup-Wireguard.ps1 +++ b/src/microsoft/windows/Setup-Wireguard.ps1 @@ -1,8 +1,13 @@ #Requires -Version 5.1 -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 -Using module ..\..\common\Input.psm1 +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Input.psm1 +Using module ../../common/Ensure.psm1 +Using module ../../common/Utils.psm1 +Using module ../../common/PackageManager.psm1 +Using module ../../common/UsersAndAccounts.psm1 +Using module ../../common/Registry.psm1 [CmdletBinding(SupportsShouldProcess)] param ( @@ -53,8 +58,7 @@ Invoke-RunMain $PSCmdlet { if (Get-UserConfirmation -Title 'Add another user?' -Question 'Do you want to add another user to Network Configuration Operators?' -Default $True) { continue; - } - else { + } else { break; } } diff --git a/src/misc/Export-KaseyaQuotes.ps1 b/src/misc/Export-KaseyaQuotes.ps1 index a7bd1152..5c0cde9e 100644 --- a/src/misc/Export-KaseyaQuotes.ps1 +++ b/src/misc/Export-KaseyaQuotes.ps1 @@ -2,6 +2,7 @@ Using module ../common/Environment.psm1 Using module ../common/Input.psm1 Using module ../common/Logging.psm1 Using module ../common/Exit.psm1 +Using module ../common/Utils.psm1 [CmdletBinding()] param( diff --git a/src/misc/Setup-SecretManagement.ps1 b/src/misc/Setup-SecretManagement.ps1 index e9be6b75..dc338afc 100644 --- a/src/misc/Setup-SecretManagement.ps1 +++ b/src/misc/Setup-SecretManagement.ps1 @@ -3,8 +3,9 @@ Using module ../common/Environment.psm1 Using module ../common/Ensure.psm1 Using module ../common/Input.psm1 +Using module ../common/Utils.psm1 -Using module Microsoft.Powershell.SecretManagement +Using module Microsoft.PowerShell.SecretManagement [CmdletBinding()] param() diff --git a/src/n-sight/Get-InstalledSoftware.ps1 b/src/n-sight/Get-InstalledSoftware.ps1 index 9073df63..ad3490eb 100644 --- a/src/n-sight/Get-InstalledSoftware.ps1 +++ b/src/n-sight/Get-InstalledSoftware.ps1 @@ -1,6 +1,8 @@ Using module ../common/Environment.psm1 Using module ../common/Logging.psm1 Using module ../common/Scope.psm1 +Using module ../common/Cache.psm1 + Using module ImportExcel [CmdletBinding()] diff --git a/src/n-sight/cleaners/N-sightRMMCleanup.ps1 b/src/n-sight/cleaners/N-sightRMMCleanup.ps1 index 3fbeb17e..801c06f3 100644 --- a/src/n-sight/cleaners/N-sightRMMCleanup.ps1 +++ b/src/n-sight/cleaners/N-sightRMMCleanup.ps1 @@ -1,4 +1,4 @@ -#@compile-ignore +#!ignore # '================================================================================================================================================================== # 'Disclaimer # 'The sample scripts are not supported under any N-able support program or service. @@ -119,7 +119,7 @@ function getAgentPath() { break } } - + If (!$script:localFolder) { writeToLog F "Installation path for the Advanced Monitoring Agent location was not found." writeToLog F "Failing script." @@ -362,7 +362,7 @@ function downloadUnins() { $script:shell = new-object -com Shell.Application $shell.namespace($logFolder).copyhere($shell.namespace($downloadedFile).items(),16) - + } Else { try { Expand-Archive $downloadedFile $logFolder -Force -ErrorAction Stop @@ -727,4 +727,4 @@ function main() { performEcosytemUninstall } -main \ No newline at end of file +main diff --git a/src/n-sight/cleaners/PMECleanup.ps1 b/src/n-sight/cleaners/PMECleanup.ps1 index bd4f6ef5..97a5e231 100644 --- a/src/n-sight/cleaners/PMECleanup.ps1 +++ b/src/n-sight/cleaners/PMECleanup.ps1 @@ -1,4 +1,4 @@ -#@compile-ignore +#!ignore # '================================================================================================================================================================== # 'Disclaimer # 'The sample scripts are not supported under any N-able support program or service. @@ -16,7 +16,7 @@ Param ( function setupLogging() { $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\Feature Cleanup Utility\debug.log" - + $script:logFolder = Split-Path $logFilePath $script:logFile = Split-Path $logFilePath -Leaf @@ -54,7 +54,7 @@ function initialSetup() { $osVersion = (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('ProductName') } writeToLog I "Detected Operating System:`r`n`t$OSVersion" - + $osArch = (Get-WmiObject Win32_OperatingSystem).OSArchitecture writeToLog I "Detected Operating System Aarchitecture: $osArch" @@ -80,13 +80,13 @@ function initialSetup() { $cipherslists = @('TLS_DHE_RSA_WITH_AES_128_GCM_SHA256','TLS_DHE_RSA_WITH_AES_256_GCM_SHA384','TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256','TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384') $ciphersenabledkey = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\' | Select-Object -ExpandProperty Functions - + ForEach ($a in $ciphersenabledkey) { If ($cipherslists -eq $a){ $enabled.Add($a) | Out-Null } } - + If ($enabled.count -ne 0) { writeToLog I "Cipher Suite(s) found:" Foreach ($i in $enabled) { @@ -95,13 +95,13 @@ function initialSetup() { } Else { writeToLog W "Device is not fully patched, no secure Cipher Suite(s) were found." } - + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) } function getAgentPath() { writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - + try { $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop } catch { @@ -128,18 +128,18 @@ function getAgentPath() { writeToLog F "Error during the lookup of the WOW6432Node Path in the registry:" writeToLog F $_ } - + $Items = $Keys | Foreach-Object { Get-ItemProperty $_.PsPath } - + ForEach ($Item in $Items) { If ($Item.DisplayName -like "*Patch Management Service Controller*") { $script:localFolder = $Item.installLocation break } } - + If (!$localFolder) { writeToLog F "PME installation not found." writeToLog F "Will do post-cleanup but marking script as failed." @@ -212,7 +212,7 @@ function runPMEV1Uninstaller() { "$($pmeFolder)CacheService\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; "$($pmeFolder)RpcServer\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" } - + foreach ($key in $hash.Keys) { If (Test-Path $key) { $datItem = $key @@ -220,8 +220,8 @@ function runPMEV1Uninstaller() { If (!(Test-Path $datItem)) { writeToLog W "Dat file not found. Will attempt downloading." - downloadFileToLocation $hash[$key] $datItem - + downloadFileToLocation $hash[$key] $datItem + If (!(Test-Path $datItem)) { writeToLog F "Unable to download dat file for uninstaller to run." writeToLog F "PME must be removed manually. Failing script." @@ -253,7 +253,7 @@ function runPMEV1Uninstaller() { Start-Sleep -s 5 } Else { - writeToLog W "$key Uninstaller doesn't exist on the device." + writeToLog W "$key Uninstaller doesn't exist on the device." } } writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) @@ -268,7 +268,7 @@ function runPMEV2Uninstaller() { "$($pmeFolder)FileCacheServiceAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; "$($pmeFolder)RequestHandlerAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" } - + foreach ($key in $hash.Keys) { write-host "Checking $key" $keyName = (split-path $key).split('\')[-1] @@ -281,8 +281,8 @@ function runPMEV2Uninstaller() { if (!(Test-Path $datItem)) { writeToLog W "Could not find the following dat file:`r`n`t$datItem" writeToLog W "Dat file not found. Will attempt downloading." - downloadFileToLocation $hash[$key] $datItem - + downloadFileToLocation $hash[$key] $datItem + if (!(Test-Path $datItem)) { writeToLog F "Unable to download dat file for uninstaller to run." writeToLog F "PME must be removed manually. Failing script." @@ -314,7 +314,7 @@ function runPMEV2Uninstaller() { Start-Sleep -s 5 } Else { - writeToLog W "$key Uninstaller doesn't exist on the device." + writeToLog W "$key Uninstaller doesn't exist on the device." } } writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) @@ -398,7 +398,7 @@ function removeProcesses() { function downloadFileToLocation ($URL, $Location) { $wc = New-Object System.Net.WebClient - + try { $wc.DownloadFile($URL, $Location) } catch { @@ -408,24 +408,24 @@ function downloadFileToLocation ($URL, $Location) { function removePMEServices() { writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - + $array = @() $array += "PME.Agent.PmeService" $array += "SolarWinds.MSP.RpcServerService" $array += "SolarWinds.MSP.CacheService" - + foreach ($serviceName in $array) { If (Get-Service $serviceName -ErrorAction SilentlyContinue) { writeToLog I "Detected the $serviceName service on the device, will now remove service." - + try { $stopService = Stop-Service -Name $serviceName -ErrorAction Stop $deleteService = sc.exe delete $serviceName -ErrorAction Stop } catch { writeToLog I "The service cannot be removed automatically. Please remove manually." $removalError = $error[0] - writeToLog I "Exception from removal attempt is: $removalError" + writeToLog I "Exception from removal attempt is: $removalError" } writeToLog I "$serviceName service is now removed." } Else { @@ -442,7 +442,7 @@ function removePMEFoldersAndKeys() { $array += "C:\ProgramData\SolarWinds MSP\PME" $array += "C:\ProgramData\MspPlatform\PME" $array += "C:\ProgramData\MspPlatform\PME.Agent.PmeService" - + $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.CacheService" $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.CacheService" $array += "C:\ProgramData\MspPlatform\FileCacheServiceAgent" @@ -467,7 +467,7 @@ function removePMEFoldersAndKeys() { If ((Test-Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall") -eq $true) { $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" - + foreach ($entry in $recurse) { foreach ($key in Get-ItemProperty -path "Registry::$entry") { if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { @@ -479,7 +479,7 @@ function removePMEFoldersAndKeys() { } $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" - + foreach ($entry in $recurse) { foreach ($key in Get-ItemProperty -path "Registry::$entry") { if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { @@ -492,13 +492,13 @@ function removePMEFoldersAndKeys() { foreach ($FolderLocation in $Array) { if (Test-Path $FolderLocation) { writeToLog I "$FolderLocation exists. Removing item..." - + try { remove-item $folderLocation -recurse -force } catch { writeToLog I "The item $FolderLocation exists but cannot be removed automatically. Please remove manually." $removalError = $error[0] - writeToLog E "Exception from removal attempt is: $removalError" + writeToLog E "Exception from removal attempt is: $removalError" } } else { writeToLog W "$FolderLocation doesn't exist - moving on..." @@ -577,12 +577,12 @@ function main(){ } Else { runPMEV2Uninstaller } - + removeProcesses removePMEServices removePMEFoldersAndKeys - + writeToLog I "PME Cleanup now complete." postRuntime } -main \ No newline at end of file +main diff --git a/src/n-sight/cleaners/TakeControlCleanup.ps1 b/src/n-sight/cleaners/TakeControlCleanup.ps1 index 44bcf3e6..b98889df 100644 --- a/src/n-sight/cleaners/TakeControlCleanup.ps1 +++ b/src/n-sight/cleaners/TakeControlCleanup.ps1 @@ -1,4 +1,4 @@ -#@compile-ignore +#!ignore # '================================================================================================================================================================== # 'Disclaimer # 'The sample scripts are not supported under any N-able support program or service. @@ -54,7 +54,7 @@ function initialSetup() { $osVersion = (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('ProductName') } writeToLog I "Detected Operating System:`r`n`t$OSVersion" - + $osArch = (Get-WmiObject Win32_OperatingSystem).OSArchitecture writeToLog I "Detected Operating System Aarchitecture: $osArch" @@ -80,13 +80,13 @@ function initialSetup() { $cipherslists = @('TLS_DHE_RSA_WITH_AES_128_GCM_SHA256','TLS_DHE_RSA_WITH_AES_256_GCM_SHA384','TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256','TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384') $ciphersenabledkey = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\' | Select-Object -ExpandProperty Functions - + ForEach ($a in $ciphersenabledkey) { If ($cipherslists -eq $a){ $enabled.Add($a) | Out-Null } } - + If ($enabled.count -ne 0) { writeToLog I "Cipher Suite(s) found:" Foreach ($i in $enabled) { @@ -95,13 +95,13 @@ function initialSetup() { } Else { writeToLog W "Device is not fully patched, no secure Cipher Suite(s) were found." } - + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) } function getAgentPath() { writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - + $array = @() $array += "GetSupportService_LOGICnow" $array += "GetSupportService_N-Central" @@ -122,7 +122,7 @@ function getAgentPath() { writeToLog V "This occurred on line number: $line" writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" } - + ForEach ($Item in $Keys) { $script:installPath = $Item.Install_Dir $script:installedVersion = $Item.Version @@ -138,15 +138,15 @@ function getAgentPath() { } Else { writeToLog V "Install Path:`r`n`t$installPath" writeToLog V "Installed Version:`r`n`t$installedVersion" - + If (($installPath -match '.+?\\$') -eq $false) { $script:installPath = $script:installPath + "\" } - + writeToLog V "Take Control Folder located:`r`n`t$installPath" - + $script:uninstallerPath = $installPath + "uninstall.exe" - + If (!(Test-Path $uninstallerPath)) { writeToLog W "Unable to locate uninstall.exe on the device." writeToLog W "Uninstaller Path:`r`n`t$uninstallerPath" @@ -157,7 +157,7 @@ function getAgentPath() { writeToLog V "Confirmed uninstall.exe is present on the device:`r`n`t$uninstallerPath" } } - + clearFileLocks removeTmpUninstaller performUninstall @@ -345,7 +345,7 @@ function performUninstall() { $p.WaitForExit() Start-Sleep 10 $script:exitCode = $p.ExitCode - + If ($exitcode -eq 0) { writeToLog I "Successfully returned exit code 0 from uninstall action." } Else { @@ -364,7 +364,7 @@ function performUninstall() { writeToLog V "Starting stopwatch." $sw = [Diagnostics.Stopwatch]::StartNew() - + while (($sw.Elapsed.TotalSeconds -lt $timeoutInSecs) -and (Test-Path $uninstallLockFile)) { $result = Test-Path $uninstallLockFile writeToLog V "Current uninstall timespan: $($sw.Elapsed.TotalSeconds) seconds." @@ -412,24 +412,24 @@ function removeMSPAProcesses() { function removeMSPAServices() { writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - + $array = @() $array += "BASupportExpressStandaloneService_LOGICnow" $array += "BASupportExpressSrvcUpdater_LOGICnow" $array += "BASupportExpressStandaloneService_N_Central" $array += "BASupportExpressSrvcUpdater_N_Central" - + ForEach ($serviceName in $array) { If (Get-Service $serviceName -ErrorAction SilentlyContinue) { writeToLog I "Detected the $serviceName service on the device, will now remove service." - + try { Stop-Service -Name $serviceName -ErrorAction Stop sc.exe delete $serviceName -ErrorAction Stop } catch { writeToLog I "The service cannot be removed automatically. Please remove manually." $removalError = $error[0] - writeToLog I "Exception from removal attempt is: $removalError" + writeToLog I "Exception from removal attempt is: $removalError" } writeToLog I "$serviceName service is now removed." } Else { @@ -456,11 +456,11 @@ function removeMSPAFoldersAndKeys() { $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BACE_N-Central" $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BeAnyWhere Support Express\GetSupportService_LOGICnow" $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BeAnyWhere Support Express\GetSupportService_N-Central" - + ForEach ($item in $Array) { If (Test-Path $item) { writeToLog V "Detected $item, foribly removing item." - + try { Remove-Item $item -Recurse -Force -ErrorAction Stop } catch { @@ -546,4 +546,4 @@ function main() { removeMSPAFoldersAndKeys postRuntime } -main \ No newline at end of file +main diff --git a/src/n-sight/cleaners/Update.ps1 b/src/n-sight/cleaners/Update.ps1 index 5ca0c9ac..a5f60502 100644 --- a/src/n-sight/cleaners/Update.ps1 +++ b/src/n-sight/cleaners/Update.ps1 @@ -60,8 +60,7 @@ Function Invoke-UpdateScript { } try { - # Prepend file with #@compile-ignore - $Content = "#@compile-ignore`n$Content"; + $Content = "#@ignore`n$Content"; Set-Content -Path $Private:LocalFilePath -Value $Content; } catch { Invoke-Error -Message "Failed to write '$ScriptName' to '$Private:LocalFilePath': $($_.Exception.Message)"; diff --git a/src/n-sight/cleaners/WindowsAgentCleanup.ps1 b/src/n-sight/cleaners/WindowsAgentCleanup.ps1 index ca11e6be..71f7a82c 100644 --- a/src/n-sight/cleaners/WindowsAgentCleanup.ps1 +++ b/src/n-sight/cleaners/WindowsAgentCleanup.ps1 @@ -1,64 +1,64 @@ -#@compile-ignore +#!ignore # '================================================================================================================================================================== # 'Disclaimer -# 'The sample scripts are not supported under any N-able support program or service. -# 'The sample scripts are provided AS IS without warranty of any kind. -# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. -# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. -# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever -# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) +# 'The sample scripts are not supported under any N-able support program or service. +# 'The sample scripts are provided AS IS without warranty of any kind. +# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. +# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. +# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever +# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) # 'arising out of the use of or inability to use the sample scripts or documentation. # '================================================================================================================================================================== Param ( - [string]$verbose = "Y" + [string]$verbose = 'Y' ) function setupLogging() { - $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\Windows Agent Cleanup\debug.log" - - $script:logFolder = Split-Path $logFilePath - $script:logFile = Split-Path $logFilePath -Leaf + $script:logFilePath = 'C:\ProgramData\MspPlatform\Tech Tribes\Windows Agent Cleanup\debug.log' + + $script:logFolder = Split-Path $logFilePath + $script:logFile = Split-Path $logFilePath -Leaf $logFolderExists = Test-Path $logFolder $logFileExists = Test-Path $logFilePath If ($logFolderExists -eq $false) { - New-Item -ItemType "directory" -Path $logFolder | Out-Null + New-Item -ItemType 'directory' -Path $logFolder | Out-Null } - + If ($logFileExists -eq $true) { - Remove-Item $logFilePath -ErrorAction SilentlyContinue - Start-Sleep 2 - New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null + Remove-Item $logFilePath -ErrorAction SilentlyContinue + Start-Sleep 2 + New-Item -ItemType 'file' -Path $logFolder -Name $logFile | Out-Null } Else { - New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null + New-Item -ItemType 'file' -Path $logFolder -Name $logFile | Out-Null } - + If (($logFolder -match '.+?\\$') -eq $false) { - $script:logFolder = $logFolder + "\" + $script:logFolder = $logFolder + '\' } - writeToLog I "Running script version: 1.08." + writeToLog I 'Running script version: 1.08.' } function validateUserInput() { -# Ensures the provided input from user is valid - If ($verbose.ToLower() -eq "y") { - $script:verboseMode = $true - writeToLog V "You have defined to have the script output the verbose log entries." - } Else { - $script:verboseMode = $false - writeToLog I "Will output logs in regular mode." - } - - writeToLog V "Input Parameters have been successfully validated." - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + # Ensures the provided input from user is valid + If ($verbose.ToLower() -eq 'y') { + $script:verboseMode = $true + writeToLog V 'You have defined to have the script output the verbose log entries.' + } Else { + $script:verboseMode = $false + writeToLog I 'Will output logs in regular mode.' + } + + writeToLog V 'Input Parameters have been successfully validated.' + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function getAgentPath() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) try { $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop @@ -67,26 +67,26 @@ function getAgentPath() { $line = $_.InvocationInfo.ScriptLineNumber writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" writeToLog V "This occurred on line number: $line" - writeToLog W "Will continue with validating agent path." + writeToLog W 'Will continue with validating agent path.' } - - $Items = $Keys | Foreach-Object { + + $Items = $Keys | ForEach-Object { Get-ItemProperty $_.PsPath } - ForEach ($Item in $Items) { - If ($Item.DisplayName -like "Windows Agent") { + ForEach ($Item in $Items) { + If ($Item.DisplayName -like 'Windows Agent') { $script:localFolder = $Item.installLocation $script:registryPath = $Item.PsPath $registryName = $Item.PSChildName - $script:uninstallString = $Item.UninstallString + $script:uninstallString = $Item.UninstallString $registryDisplayName = $Item.DisplayName $registryVersion = $Item.DisplayVersion $registryInstallDate = $Item.InstallDate break } } - + try { $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop } catch { @@ -94,749 +94,738 @@ function getAgentPath() { $line = $_.InvocationInfo.ScriptLineNumber writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" writeToLog V "This occurred on line number: $line" - writeToLog W "Will continue with validating agent path." + writeToLog W 'Will continue with validating agent path.' } - $Items = $Keys | Foreach-Object { + $Items = $Keys | ForEach-Object { Get-ItemProperty $_.PsPath } - ForEach ($Item in $Items) { - If ($Item.DisplayName -like "Windows Agent") { + ForEach ($Item in $Items) { + If ($Item.DisplayName -like 'Windows Agent') { $script:localFolder = $Item.installLocation $script:registryPath = $Item.PsPath $registryName = $Item.PSChildName - $script:uninstallString = $Item.UninstallString + $script:uninstallString = $Item.UninstallString $registryDisplayName = $Item.DisplayName $registryVersion = $Item.DisplayVersion $registryInstallDate = $Item.InstallDate break } - } + } If (!$script:localFolder) { - writeToLog W "No Windows Agent located." - writeToLog W "No uninstall can be performed but will carry on with the cleanup." - $script:agentPresent = $false - $script:localFolder = "C:\Program Files (x86)\N-able Technologies\Windows Agent\" + writeToLog W 'No Windows Agent located.' + writeToLog W 'No uninstall can be performed but will carry on with the cleanup.' + $script:agentPresent = $false + $script:localFolder = 'C:\Program Files (x86)\N-able Technologies\Windows Agent\' } Else { - $script:agentPresent = $true + $script:agentPresent = $true - If (($script:localFolder -match '.+?\\$') -eq $false) { - $script:localFolder = $script:localFolder + "\" - } - - writeToLog I "Agent install location found:`r`n`t$localFolder" - writeToLog V "Registry location: `r`n`t$registryPath`r`n`t$registryName" - } + If (($script:localFolder -match '.+?\\$') -eq $false) { + $script:localFolder = $script:localFolder + '\' + } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog I "Agent install location found:`r`n`t$localFolder" + writeToLog V "Registry location: `r`n`t$registryPath`r`n`t$registryName" + } + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function stopServices() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "Windows Agent Service" - $array += "Windows Agent Maintenance Service" - - foreach ($serviceName in $array) { - - If (Get-Service $serviceName -ErrorAction SilentlyContinue) { - writeToLog I "Detected the $serviceName service on the device, will now stop the service." - - try { - $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - writeToLog I "$serviceName service is now stopped." - - } Else { - writeToLog W "$serviceName service was not found." - } - - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + $array = @() + $array += 'Windows Agent Service' + $array += 'Windows Agent Maintenance Service' + + foreach ($serviceName in $array) { + + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + writeToLog I "Detected the $serviceName service on the device, will now stop the service." + + try { + $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + writeToLog I "$serviceName service is now stopped." + + } Else { + writeToLog W "$serviceName service was not found." + } + + } + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function runUninstaller() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $uninsString = ($script:uninstallString -split 'MsiExec.exe ')[1] - - If ($uninsString.length -gt 0) { - $argumentList = $uninsString + " /qn /norestart" - writeToLog I "Starting MSI Uninstaller." - writeToLog V "Argument list confirming msi uninstall string:`r`n`t$argumentList" - - $uninstallExitCode = (Start-Process -FilePath msiexec.exe -ArgumentList $argumentList -Wait -Passthru).ExitCode - - writeToLog I "Uninstall process has now been completed." - - If ($uninstallExitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $uninstallExitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $uninstallExitCode" - } - } Else { - writeToLog V "Uninstall String length is: $($uninsString.length)" - writeToLog V "Uninstall cannot occur, will contiunue with cleanup." - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + $uninsString = ($script:uninstallString -split 'MsiExec.exe ')[1] + + If ($uninsString.length -gt 0) { + $argumentList = $uninsString + ' /qn /norestart' + writeToLog I 'Starting MSI Uninstaller.' + writeToLog V "Argument list confirming msi uninstall string:`r`n`t$argumentList" + + $uninstallExitCode = (Start-Process -FilePath msiexec.exe -ArgumentList $argumentList -Wait -PassThru).ExitCode + + writeToLog I 'Uninstall process has now been completed.' + + If ($uninstallExitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $uninstallExitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $uninstallExitCode" + } + } Else { + writeToLog V "Uninstall String length is: $($uninsString.length)" + writeToLog V 'Uninstall cannot occur, will contiunue with cleanup.' + } + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function determinePMEVersion() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) try { - $pmeVersionRaw = Get-Process -Name *PME.Agent -FileVersionInfo | Select-Object ProductName,ProductVersion,FileVersion | Sort-Object -unique -ErrorAction Stop + $pmeVersionRaw = Get-Process -Name *PME.Agent -FileVersionInfo | Select-Object ProductName,ProductVersion,FileVersion | Sort-Object -Unique -ErrorAction Stop } catch { $msg = $_.Exception.Message $line = $_.InvocationInfo.ScriptLineNumber writeToLog F "Error occurred locating an applicable PME Agent process, due to:`r`n`t$msg" writeToLog V "This occurred on line number: $line" - writeToLog F "Failing script." - Exit 1001 + writeToLog F 'Failing script.' + Exit 1001 } - $pmeProductName = $pmeVersionRaw.ProductName - $pmeProductVersion = $pmeVersionRaw.ProductVersion + $pmeProductName = $pmeVersionRaw.ProductName + $pmeProductVersion = $pmeVersionRaw.ProductVersion - writeToLog V "Detected PME Version: $pmeProductVersion" + writeToLog V "Detected PME Version: $pmeProductVersion" - If ($pmeProductName -eq "SolarWinds.MSP.PME.Agent") { - writeToLog I "Detected installed PME Version is: $pmeProductVersion" - $script:legacyPME = $true - } ElseIf ($pmeProductName -eq "PME.Agent") { - writeToLog I "Detected installed PME Version is: $pmeProductVersion" - $script:legacyPME = $false - } + If ($pmeProductName -eq 'SolarWinds.MSP.PME.Agent') { + writeToLog I "Detected installed PME Version is: $pmeProductVersion" + $script:legacyPME = $true + } ElseIf ($pmeProductName -eq 'PME.Agent') { + writeToLog I "Detected installed PME Version is: $pmeProductVersion" + $script:legacyPME = $false + } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function runPMEV1Uninstaller() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $pmeFolder = "C:\Program Files (x86)\SolarWinds MSP\" - - $hash = @{ - "$($pmeFolder)PME\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; - "$($pmeFolder)CacheService\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; - "$($pmeFolder)RpcServer\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" - } - - foreach ($key in $hash.Keys) { - if (Test-Path $key) { - $datItem = $key - $datItem = $datItem -replace "exe","dat" - - if (!(Test-Path $datItem)) { - writeToLog W "Dat file not found. Will attempt downloading." - downloadFileToLocation $hash[$key] $datItem - - if (!(Test-Path $datItem)) { - writeToLog F "Unable to download dat file for uninstaller to run." - writeToLog F "PME must be removed manually. Failing script." - exit 1001 - } - } - - writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." - - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $key - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = "/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART" - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - $script:exitCode = $p.ExitCode - - If ($exitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" - } - - Start-Sleep -s 5 - - } Else { - writeToLog W "$key Uninstaller doesn't exist on the device." - } - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + $pmeFolder = 'C:\Program Files (x86)\SolarWinds MSP\' + + $hash = @{ + "$($pmeFolder)PME\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat'; + "$($pmeFolder)CacheService\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat'; + "$($pmeFolder)RpcServer\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat' + } + + foreach ($key in $hash.Keys) { + if (Test-Path $key) { + $datItem = $key + $datItem = $datItem -replace 'exe','dat' + + if (!(Test-Path $datItem)) { + writeToLog W 'Dat file not found. Will attempt downloading.' + downloadFileToLocation $hash[$key] $datItem + + if (!(Test-Path $datItem)) { + writeToLog F 'Unable to download dat file for uninstaller to run.' + writeToLog F 'PME must be removed manually. Failing script.' + exit 1001 + } + } + + writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." + + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $key + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = '/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART' + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + $script:exitCode = $p.ExitCode + + If ($exitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" + } + + Start-Sleep -s 5 + + } Else { + writeToLog W "$key Uninstaller doesn't exist on the device." + } + } + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function runPMEV2Uninstaller() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $pmeFolder = "C:\Program Files (x86)\MspPlatform\" - - $hash = @{ - "$($pmeFolder)PME\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; - "$($pmeFolder)FileCacheServiceAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; - "$($pmeFolder)RequestHandlerAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" - } - - foreach ($key in $hash.Keys) { - if (Test-Path $key) { - $datItem = $key - $datItem = $datItem -replace "exe","dat" - - if (!(Test-Path $datItem)) { - writeToLog W "Dat file not found. Will attempt downloading." - downloadFileToLocation $hash[$key] $datItem - - if (!(Test-Path $datItem)) { - writeToLog F "Unable to download dat file for uninstaller to run." - writeToLog F "PME must be removed manually. Failing script." - exit 1001 - } - } - - writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." - - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $key - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = "/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART" - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - $script:exitCode = $p.ExitCode - - If ($exitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" - } - - Start-Sleep -s 5 - - } Else { - writeToLog W "$key Uninstaller doesn't exist on the device." - } - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + $pmeFolder = 'C:\Program Files (x86)\MspPlatform\' + + $hash = @{ + "$($pmeFolder)PME\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat'; + "$($pmeFolder)FileCacheServiceAgent\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat'; + "$($pmeFolder)RequestHandlerAgent\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat' + } + + foreach ($key in $hash.Keys) { + if (Test-Path $key) { + $datItem = $key + $datItem = $datItem -replace 'exe','dat' + + if (!(Test-Path $datItem)) { + writeToLog W 'Dat file not found. Will attempt downloading.' + downloadFileToLocation $hash[$key] $datItem + + if (!(Test-Path $datItem)) { + writeToLog F 'Unable to download dat file for uninstaller to run.' + writeToLog F 'PME must be removed manually. Failing script.' + exit 1001 + } + } + + writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." + + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $key + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = '/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART' + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + $script:exitCode = $p.ExitCode + + If ($exitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" + } + + Start-Sleep -s 5 + + } Else { + writeToLog W "$key Uninstaller doesn't exist on the device." + } + } + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function removeProcesses() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - try { - $script:pmeProcess = Get-Process -processname "*PME*" -ErrorAction Stop - $script:rpcProcess = Get-Process -processname "*RPC*" -ErrorAction Stop - $script:cacheServiceProcess = Get-Process -processname "*Cache*" -ErrorAction Stop + try { + $script:pmeProcess = Get-Process -processname '*PME*' -ErrorAction Stop + $script:rpcProcess = Get-Process -processname '*RPC*' -ErrorAction Stop + $script:cacheServiceProcess = Get-Process -processname '*Cache*' -ErrorAction Stop } catch { - writeToLog E "Error detecting process:" - writeToLog E $_ - } - - If ($null -ne $pmeProcess) { - writeToLog I "Detected $pmeProcess on the device, removing." - try { - Stop-Process $pmeProcess -Force -ErrorAction Stop - } catch { - writeToLog E "Error stopping PME process:" - writeToLog E $_ - } - } Else { - writeToLog I "Did not detect the PME process on the device." - } - - If ($null -ne $rpcProcess) { - writeToLog I "Detected $rpcProcess on the device, removing." - try { - Stop-Process $rpcProcess -Force -ErrorAction Stop - } catch { - writeToLog E "Error stopping RPC process:" - writeToLog E $_ - } - } Else { - writeToLog I "Did not detect PME's RPC process on the device." - } - If ($null -ne $cacheServiceProcess) { - writeToLog I "Detected $cacheServiceProcess on the device, removing." - try { - Stop-Process $cacheServiceProcess -Force -ErrorAction Stop - } catch { - writeToLog E "Error stopping Cache Service process:" - writeToLog E $_ - } - } Else { - writeToLog I "Did not detect PME's Cache Service process on the device." - } - - # If '_iu14D2N.tmp' is present on the device, then we will try to kill it + writeToLog E 'Error detecting process:' + writeToLog E $_ + } + + If ($null -ne $pmeProcess) { + writeToLog I "Detected $pmeProcess on the device, removing." + try { + Stop-Process $pmeProcess -Force -ErrorAction Stop + } catch { + writeToLog E 'Error stopping PME process:' + writeToLog E $_ + } + } Else { + writeToLog I 'Did not detect the PME process on the device.' + } + + If ($null -ne $rpcProcess) { + writeToLog I "Detected $rpcProcess on the device, removing." + try { + Stop-Process $rpcProcess -Force -ErrorAction Stop + } catch { + writeToLog E 'Error stopping RPC process:' + writeToLog E $_ + } + } Else { + writeToLog I "Did not detect PME's RPC process on the device." + } + If ($null -ne $cacheServiceProcess) { + writeToLog I "Detected $cacheServiceProcess on the device, removing." + try { + Stop-Process $cacheServiceProcess -Force -ErrorAction Stop + } catch { + writeToLog E 'Error stopping Cache Service process:' + writeToLog E $_ + } + } Else { + writeToLog I "Did not detect PME's Cache Service process on the device." + } + + # If '_iu14D2N.tmp' is present on the device, then we will try to kill it try { - $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop + $uninsLockProcTest = Get-Process -ProcessName '_iu*' -ErrorAction Stop } catch { - writeToLog E "Error detecting uninstaller lock file, due to:" + writeToLog E 'Error detecting uninstaller lock file, due to:' writeToLog E $_ } - If ($null -ne $uninsLockProcTest) { - writeToLog I "Detected $uninsLockProcTest on the device, removing." - try { - Stop-Process $uninsLockProcTest -Force -ErrorAction Stop - } catch { - writeToLog E "Error stopping uninstall lock process:" - writeToLog E $_ - } - } + If ($null -ne $uninsLockProcTest) { + writeToLog I "Detected $uninsLockProcTest on the device, removing." + try { + Stop-Process $uninsLockProcTest -Force -ErrorAction Stop + } catch { + writeToLog E 'Error stopping uninstall lock process:' + writeToLog E $_ + } + } - $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" + $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" $uninsLockPathTest = Test-Path $uninsLockPath If ($uninsLockPathTest -eq $true) { - writeToLog I "Detected $uninsLockPath on the device, removing." + writeToLog I "Detected $uninsLockPath on the device, removing." Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + } + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function downloadFileToLocation ($URL, $Location) { - $wc = New-Object System.Net.WebClient - - try { - $wc.DownloadFile($URL, $Location) - } catch { - writeToLog E "Exception when downloading file $Location from source $URL." - } + $wc = New-Object System.Net.WebClient + + try { + $wc.DownloadFile($URL, $Location) + } catch { + writeToLog E "Exception when downloading file $Location from source $URL." + } } function removePMEServices() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "PME.Agent.PmeService" - $array += "SolarWinds.MSP.RpcServerService" - $array += "SolarWinds.MSP.CacheService" - - foreach ($serviceName in $array) { - - If (Get-Service $serviceName -ErrorAction SilentlyContinue) { - writeToLog I "Detected the $serviceName service on the device, will now remove service." - - try { - $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop - $script:deleteService = sc.exe delete $serviceName -ErrorAction Stop - } catch { - writeToLog I "The service cannot be removed automatically. Please remove manually." - $removalError = $error[0] - writeToLog I "Exception from removal attempt is: $removalError" - } - writeToLog I "$serviceName service is now removed." - } Else { - writeToLog W "$serviceName service not found." - } - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + $array = @() + $array += 'PME.Agent.PmeService' + $array += 'SolarWinds.MSP.RpcServerService' + $array += 'SolarWinds.MSP.CacheService' + + foreach ($serviceName in $array) { + + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + writeToLog I "Detected the $serviceName service on the device, will now remove service." + + try { + $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop + $script:deleteService = sc.exe delete $serviceName -ErrorAction Stop + } catch { + writeToLog I 'The service cannot be removed automatically. Please remove manually.' + $removalError = $error[0] + writeToLog I "Exception from removal attempt is: $removalError" + } + writeToLog I "$serviceName service is now removed." + } Else { + writeToLog W "$serviceName service not found." + } + } + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function removePMEFoldersAndKeys() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "C:\ProgramData\SolarWinds MSP\PME" - $array += "C:\ProgramData\MspPlatform\PME" - $array += "C:\ProgramData\MspPlatform\PME.Agent.PmeService" - - $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.CacheService" - $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.CacheService" - $array += "C:\ProgramData\MspPlatform\FileCacheServiceAgent" - - $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.Diagnostics" - $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.RpcServerService" - $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.RpcServerService" - $array += "C:\ProgramData\MspPlatform\RequestHandlerAgent" - - $array += "C:\Program Files (x86)\SolarWinds MSP\CacheService\" - $array += "C:\Program Files (x86)\MspPlatform\FileCacheServiceAgent\" - $array += "C:\Program Files (x86)\SolarWinds MSP\PME\" - $array += "C:\Program Files (x86)\MspPlatform\PME\" - $array += "C:\Program Files (x86)\SolarWinds MSP\RpcServer\" - $array += "C:\Program Files (x86)\MspPlatform\RequestHandlerAgent\" - - If ((Test-Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall") -eq $true) { - $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" - - foreach ($entry in $recurse) { - foreach ($key in Get-ItemProperty -path "Registry::$entry") { - if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { - $temp = $entry.name -replace "HKEY_LOCAL_MACHINE", "HKLM:" - $array += $temp - } - } - } - } - - $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" - - foreach ($entry in $recurse) { - foreach ($key in Get-ItemProperty -path "Registry::$entry") { - if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { - $temp = $entry.name -replace "HKEY_LOCAL_MACHINE", "HKLM:" - $array += $temp - } - } - } - - foreach ($FolderLocation in $Array) { - if (Test-Path $FolderLocation) { - writeToLog I "$FolderLocation exists. Removing item..." - - try { - remove-item $folderLocation -recurse -force - } catch { - writeToLog I "The item $FolderLocation exists but cannot be removed automatically. Please remove manually." - $removalError = $error[0] - writeToLog E "Exception from removal attempt is: $removalError" - } - } else { - writeToLog W "$FolderLocation doesn't exist - moving on..." - } - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + $array = @() + $array += 'C:\ProgramData\SolarWinds MSP\PME' + $array += 'C:\ProgramData\MspPlatform\PME' + $array += 'C:\ProgramData\MspPlatform\PME.Agent.PmeService' + + $array += 'C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.CacheService' + $array += 'C:\ProgramData\MspPlatform\SolarWinds.MSP.CacheService' + $array += 'C:\ProgramData\MspPlatform\FileCacheServiceAgent' + + $array += 'C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.Diagnostics' + $array += 'C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.RpcServerService' + $array += 'C:\ProgramData\MspPlatform\SolarWinds.MSP.RpcServerService' + $array += 'C:\ProgramData\MspPlatform\RequestHandlerAgent' + + $array += 'C:\Program Files (x86)\SolarWinds MSP\CacheService\' + $array += 'C:\Program Files (x86)\MspPlatform\FileCacheServiceAgent\' + $array += 'C:\Program Files (x86)\SolarWinds MSP\PME\' + $array += 'C:\Program Files (x86)\MspPlatform\PME\' + $array += 'C:\Program Files (x86)\SolarWinds MSP\RpcServer\' + $array += 'C:\Program Files (x86)\MspPlatform\RequestHandlerAgent\' + + If ((Test-Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall') -eq $true) { + $recurse = Get-ChildItem -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall' + + foreach ($entry in $recurse) { + foreach ($key in Get-ItemProperty -Path "Registry::$entry") { + if ($key.DisplayName -eq 'SolarWinds MSP RPC Server' -or $key.DisplayName -eq 'Request Handler Agent' -or $key.DisplayName -eq 'File Cache Service Agent' -or $key.DisplayName -eq 'Patch Management Service Controller' -or $key.DisplayName -eq 'SolarWinds MSP Patch Management Engine' -or $key.DisplayName -eq 'SolarWinds MSP Cache Service') { + $temp = $entry.name -replace 'HKEY_LOCAL_MACHINE', 'HKLM:' + $array += $temp + } + } + } + } + + $recurse = Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' + + foreach ($entry in $recurse) { + foreach ($key in Get-ItemProperty -Path "Registry::$entry") { + if ($key.DisplayName -eq 'SolarWinds MSP RPC Server' -or $key.DisplayName -eq 'Request Handler Agent' -or $key.DisplayName -eq 'File Cache Service Agent' -or $key.DisplayName -eq 'Patch Management Service Controller' -or $key.DisplayName -eq 'SolarWinds MSP Patch Management Engine' -or $key.DisplayName -eq 'SolarWinds MSP Cache Service') { + $temp = $entry.name -replace 'HKEY_LOCAL_MACHINE', 'HKLM:' + $array += $temp + } + } + } + + foreach ($FolderLocation in $Array) { + if (Test-Path $FolderLocation) { + writeToLog I "$FolderLocation exists. Removing item..." + + try { + Remove-Item $folderLocation -Recurse -Force + } catch { + writeToLog I "The item $FolderLocation exists but cannot be removed automatically. Please remove manually." + $removalError = $error[0] + writeToLog E "Exception from removal attempt is: $removalError" + } + } else { + writeToLog W "$FolderLocation doesn't exist - moving on..." + } + } + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function killAgentProcesses() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - try { - $script:runningProcesses = Get-Process * -ErrorAction Stop | Where-Object {$_.Path -like "C:\Program Files (x86)\N-able Technologies\Windows Agent\*"} | Select-Object Name,Path - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to detect running processes, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - If ($null -ne $runningProcesses) { - writeToLog W "Found following process(es):`r`n`t $($runningProcesses.Name)" - - foreach ($process in $runningProcesses) { - try { - $process | Stop-Process -Force -ErrorAction Stop - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to stop the process: $process, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - foreach ($lockFile in Get-ChildItem -Path "C:\Program Files (x86)\N-able Technologies\Windows Agent\*" -Include * -Recurse) { - foreach ($process in $runningProcesses) { - $process.Modules | Where-Object {$_.FileName -eq $lockFile} | Stop-Process -Force -ErrorAction SilentlyContinue - } - } - } Else { - writeToLog V "No processes are running that are tied to the Windows Agent." - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + try { + $script:runningProcesses = Get-Process * -ErrorAction Stop | Where-Object { $_.Path -like 'C:\Program Files (x86)\N-able Technologies\Windows Agent\*' } | Select-Object Name,Path + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to detect running processes, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + If ($null -ne $runningProcesses) { + writeToLog W "Found following process(es):`r`n`t $($runningProcesses.Name)" + + foreach ($process in $runningProcesses) { + try { + $process | Stop-Process -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to stop the process: $process, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + foreach ($lockFile in Get-ChildItem -Path 'C:\Program Files (x86)\N-able Technologies\Windows Agent\*' -Include * -Recurse) { + foreach ($process in $runningProcesses) { + $process.Modules | Where-Object { $_.FileName -eq $lockFile } | Stop-Process -Force -ErrorAction SilentlyContinue + } + } + } Else { + writeToLog V 'No processes are running that are tied to the Windows Agent.' + } + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function cleanupAgent() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - try { - $script:agentPathTester = Test-Path $localFolder -ErrorAction SilentlyContinue - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to locate the Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + try { + $script:agentPathTester = Test-Path $localFolder -ErrorAction SilentlyContinue + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to locate the Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + If ($agentPathTester -eq $false) { writeToLog I "Windows Agent installation folder ($localFolder) is not present." } Else { - writeToLog I "Windows Agent folder is present ($localFolder), will attempt to remove." - - try { - Remove-Item $localFolder -Recurse -Force -ErrorAction Stop - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } + writeToLog I "Windows Agent folder is present ($localFolder), will attempt to remove." + + try { + Remove-Item $localFolder -Recurse -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } } - $script:agentFolder = Split-Path $localFolder + $script:agentFolder = Split-Path $localFolder $agentFolderExists = Test-Path $agentFolder - + If (($agentFolder -match '.+?\\$') -eq $false) { - $script:agentFolder = $agentFolder + "\" + $script:agentFolder = $agentFolder + '\' } - If ($agentFolderExists -eq $false) { + If ($agentFolderExists -eq $false) { writeToLog I "Windows Agent folder ($agentFolder) is not present." } Else { - writeToLog I "Windows Agent folder is present ($agentFolder), will attempt to remove." - - try { - Remove-Item $agentFolder -Recurse -Force -ErrorAction Stop - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } + writeToLog I "Windows Agent folder is present ($agentFolder), will attempt to remove." + + try { + Remove-Item $agentFolder -Recurse -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } } - $progDataFolder = "C:\ProgramData\N-Able Technologies\Windows Agent\" + $progDataFolder = 'C:\ProgramData\N-Able Technologies\Windows Agent\' - $progDataPpathTester = Test-Path $progDataFolder + $progDataPpathTester = Test-Path $progDataFolder If ($progDataPpathTester -eq $false) { - writeToLog I "Program Data folder ($progDataFolder) is not present." + writeToLog I "Program Data folder ($progDataFolder) is not present." } Else { - try { - Remove-Item $progDataFolder -Recurse -Force -ErrorAction Stop - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove the ProgramData Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + try { + Remove-Item $progDataFolder -Recurse -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove the ProgramData Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function verifyAssetTag() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - writeToLog I "Checking if Asset tags exist." + writeToLog I 'Checking if Asset tags exist.' - $class='NCentralAssetTag' - $namespace='root\cimv2\NCentralAsset' + $class = 'NCentralAssetTag' + $namespace = 'root\cimv2\NCentralAsset' $wmiAssetTag = Get-WmiObject -Namespace $namespace -Class $class - $wmiAssetTagLength = ($wmiAssetTag.UUID).length - - If ($wmiAssetTagLength -eq 0) { - writeToLog I "WMI Asset Tag does not exist." - } Else { - writeToLog I "WMI Asset Tag present on device." - writeToLog I "WMI Asset Tag entry: $($wmiAssetTag.UUID)" - } - - $path='HKLM:\SOFTWARE\N-able Technologies\NcentralAsset' - $name='NcentralAssetTag' - - try { - $regAssetTag = Get-ItemProperty -Path $path -Name $name -ErrorAction SilentlyContinue - } - catch { - } - - $regAssetTagLength = ($regAssetTag.NcentralAssetTag).length - - If ($regAssetTagLength -eq 0) { - writeToLog I "Registry Asset Tag does not exist." - } Else { - writeToLog I "Registry Asset Tag present on device." - writeToLog I "Registry Asset Tag entry: $($regAssetTag.NcentralAssetTag)" - } - - $xmlAssetTag = "C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml" - - If (Test-Path $xmlAssetTag) { - writeToLog I "The NcentralAsset.xml exists on the device." + $wmiAssetTagLength = ($wmiAssetTag.UUID).length + + If ($wmiAssetTagLength -eq 0) { + writeToLog I 'WMI Asset Tag does not exist.' + } Else { + writeToLog I 'WMI Asset Tag present on device.' + writeToLog I "WMI Asset Tag entry: $($wmiAssetTag.UUID)" + } + + $path = 'HKLM:\SOFTWARE\N-able Technologies\NcentralAsset' + $name = 'NcentralAssetTag' + + try { + $regAssetTag = Get-ItemProperty -Path $path -Name $name -ErrorAction SilentlyContinue + } catch { + } + + $regAssetTagLength = ($regAssetTag.NcentralAssetTag).length + + If ($regAssetTagLength -eq 0) { + writeToLog I 'Registry Asset Tag does not exist.' } Else { - writeToLog I "The NcentralAsset.xml does not on the device." - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog I 'Registry Asset Tag present on device.' + writeToLog I "Registry Asset Tag entry: $($regAssetTag.NcentralAssetTag)" + } + + $xmlAssetTag = 'C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml' + + If (Test-Path $xmlAssetTag) { + writeToLog I 'The NcentralAsset.xml exists on the device.' + } Else { + writeToLog I 'The NcentralAsset.xml does not on the device.' + } + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function cleanupAssetTag() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - writeToLog I "Cleaning up Windows Agent Asset Tags." + writeToLog I 'Cleaning up Windows Agent Asset Tags.' - $class='NCentralAssetTag' - $namespace='root\cimv2\NCentralAsset' + $class = 'NCentralAssetTag' + $namespace = 'root\cimv2\NCentralAsset' Get-WmiObject -Namespace $namespace -Class $class | Remove-WmiObject - $path='HKLM:\SOFTWARE\N-able Technologies\NcentralAsset' - $name='NcentralAssetTag' - - try { - Remove-ItemProperty -Path $path -Name $name -Force -ErrorAction SilentlyContinue - } - catch { - } - - If (Test-Path -LiteralPath "C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml") { - try { - Remove-Item -path "C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml" -Force -ErrorAction SilentlyContinue - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove NcentralAsset.xml, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - writeToLog I "Successfully removed Asset Tags." - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + $path = 'HKLM:\SOFTWARE\N-able Technologies\NcentralAsset' + $name = 'NcentralAssetTag' + + try { + Remove-ItemProperty -Path $path -Name $name -Force -ErrorAction SilentlyContinue + } catch { + } + + If (Test-Path -LiteralPath 'C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml') { + try { + Remove-Item -Path 'C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml' -Force -ErrorAction SilentlyContinue + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove NcentralAsset.xml, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + writeToLog I 'Successfully removed Asset Tags.' + } + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function cleanupTakeControl() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - writeToLog I "Uninstalling Take Control silently." - - If (Test-Path -LiteralPath "C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe") { - try { - Start-Process -NoNewWindow -FilePath "C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe" -ArgumentList " /S" - } - catch { - writeToLog W "Unable to find 64-bit installation, moving to 32-bit removal." - } - writeToLog I "Successfully Removed Take Control 64 bit." - } ElseIf (Test-Path -LiteralPath "C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe") { - Start-Process -NoNewWindow -FilePath "C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe" -ArgumentList " /S" - writeToLog I "Successfully Removed Take Control 32 bit." -} + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + writeToLog I 'Uninstalling Take Control silently.' + + If (Test-Path -LiteralPath 'C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe') { + try { + Start-Process -NoNewWindow -FilePath 'C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe' -ArgumentList ' /S' + } catch { + writeToLog W 'Unable to find 64-bit installation, moving to 32-bit removal.' + } + writeToLog I 'Successfully Removed Take Control 64 bit.' + } ElseIf (Test-Path -LiteralPath 'C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe') { + Start-Process -NoNewWindow -FilePath 'C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe' -ArgumentList ' /S' + writeToLog I 'Successfully Removed Take Control 32 bit.' + } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function cleanupConfigBackup() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - writeToLog I "Removing ConnectionString_Agent.xml." - - $connectionStringXmlLocation = "C:\Program Files (x86)\N-able Technologies\Windows Agent\config\ConnectionString_Agent.xml" - - If (Test-Path $connectionStringXmlLocation) { - try { - Remove-Item -path $connectionStringXmlLocation -force -ErrorAction Stop - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove NcentralAsset.xml, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } Else { - writeToLog I "File does not exist." - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) + writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) + + writeToLog I 'Removing ConnectionString_Agent.xml.' + + $connectionStringXmlLocation = 'C:\Program Files (x86)\N-able Technologies\Windows Agent\config\ConnectionString_Agent.xml' + + If (Test-Path $connectionStringXmlLocation) { + try { + Remove-Item -Path $connectionStringXmlLocation -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove NcentralAsset.xml, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } Else { + writeToLog I 'File does not exist.' + } + + writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) } function writeToLog($state, $message) { - $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) - - switch -regex -Wildcard ($state) { - "I" { - $state = "INFO" - $colour = "Cyan" - } - "E" { - $state = "ERROR" - $colour = "Red" - } - "W" { - $state = "WARNING" - $colour = "Yellow" - } - "F" { - $state = "FAILURE" - $colour = "Red" + $script:timestamp = '[{0:dd/MM/yy} {0:HH:mm:ss}]' -f (Get-Date) + + switch -regex -Wildcard ($state) { + 'I' { + $state = 'INFO' + $colour = 'Cyan' + } + 'E' { + $state = 'ERROR' + $colour = 'Red' + } + 'W' { + $state = 'WARNING' + $colour = 'Yellow' } - "C" { - $state = "COMPLETE" - $colour = "Green" + 'F' { + $state = 'FAILURE' + $colour = 'Red' } - "V" { + 'C' { + $state = 'COMPLETE' + $colour = 'Green' + } + 'V' { If ($verboseMode -eq $true) { - $state = "VERBOSE" - $colour = "Magenta" + $state = 'VERBOSE' + $colour = 'Magenta' } Else { return } - } - "" { - $state = "INFO" - } - Default { - $state = "INFO" - } - } + } + '' { + $state = 'INFO' + } + Default { + $state = 'INFO' + } + } Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour - Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue + Write-Output "$($timeStamp) - [$state]: $message" | Out-File $logFilePath -Append -ErrorAction SilentlyContinue } function main() { - setupLogging - validateUserInput + setupLogging + validateUserInput getAgentPath - If ($agentPresent -eq $true) { - stopServices - runUninstaller - } - - writeToLog I "Agent removed. Will now perform auxiliary cleanup." - determinePMEVersion - - If ($legacyPME -eq $true) { - runPMEV1Uninstaller - } Else { - runPMEV2Uninstaller - } - - removeProcesses - removePMEServices - removePMEFoldersAndKeys - cleanupTakeControl - cleanupConfigBackup - killAgentProcesses + If ($agentPresent -eq $true) { + stopServices + runUninstaller + } + + writeToLog I 'Agent removed. Will now perform auxiliary cleanup.' + determinePMEVersion + + If ($legacyPME -eq $true) { + runPMEV1Uninstaller + } Else { + runPMEV2Uninstaller + } + + removeProcesses + removePMEServices + removePMEFoldersAndKeys + cleanupTakeControl + cleanupConfigBackup + killAgentProcesses cleanupAgent - verifyAssetTag + verifyAssetTag cleanupAssetTag - verifyAssetTag + verifyAssetTag } -main \ No newline at end of file +main diff --git a/src/n-sight/cleaners/avdCleanup.ps1 b/src/n-sight/cleaners/avdCleanup.ps1 index 128cd063..a00e70a3 100644 --- a/src/n-sight/cleaners/avdCleanup.ps1 +++ b/src/n-sight/cleaners/avdCleanup.ps1 @@ -1,4 +1,4 @@ -#@compile-ignore +#!ignore # '================================================================================================================================================================== # 'Disclaimer # 'The sample scripts are not supported under any N-able support program or service. @@ -17,7 +17,7 @@ Param ( function setupLogging() { $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\AVDefenderCleanup\debug.log" - + $script:logFolder = Split-Path $logFilePath $script:logFile = Split-Path $logFilePath -Leaf @@ -27,7 +27,7 @@ function setupLogging() { If ($logFolderExists -eq $false) { New-Item -ItemType "directory" -Path $logFolder | Out-Null } - + If ($logFileExists -eq $true) { Remove-Item $logFilePath -ErrorAction SilentlyContinue Start-Sleep 2 @@ -35,7 +35,7 @@ function setupLogging() { } Else { New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null } - + If (($logFolder -match '.+?\\$') -eq $false) { $script:logFolder = $logFolder + "\" } @@ -71,7 +71,7 @@ function getAgentPath() { writeToLog V "This occurred on line number: $line" writeToLog W "Will continue with validating agent path." } - + $Items = $Keys | Foreach-Object { Get-ItemProperty $_.PsPath } @@ -88,7 +88,7 @@ function getAgentPath() { break } } - + try { $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop } catch { @@ -128,7 +128,7 @@ function getAgentPath() { If (($script:localFolder -match '.+?\\$') -eq $false) { $script:localFolder = $script:localFolder + "\" } - + writeToLog I "Windows Agent install location found:`r`n`t$localFolder" writeToLog V "Registry location: `r`n`t$registryPath`r`n`t$registryName" } @@ -191,7 +191,7 @@ function stopServices() { $array = @() $array += "Windows Agent Service" $array += "Windows Agent Maintenance Service" - + foreach ($serviceName in $array) { If (Get-Service $serviceName -ErrorAction SilentlyContinue) { @@ -238,7 +238,7 @@ function performUninstall() { $p.WaitForExit() Start-Sleep 10 $script:exitCode = $p.ExitCode - + If (($exitcode -eq 0)-or ($null -eq $exitcode)) { writeToLog I "Successfully returned exit code 0 from uninstall action." } Else { @@ -295,7 +295,7 @@ function cleanupFoldersAndKeys() { ForEach ($item in $Array) { If (Test-Path $item) { writeToLog V "Detected $item, foribly removing item." - + try { Remove-Item $item -Recurse -Force -ErrorAction Stop } catch { @@ -361,7 +361,7 @@ function startServices() { $array = @() $array += "Windows Agent Service" $array += "Windows Agent Maintenance Service" - + foreach ($serviceName in $array) { If (Get-Service $serviceName -ErrorAction SilentlyContinue) { @@ -445,4 +445,4 @@ function main() { exit 0 } -main \ No newline at end of file +main diff --git a/src/n-sight/cleaners/edr-ecosystem.ps1 b/src/n-sight/cleaners/edr-ecosystem.ps1 index d450c728..164deb37 100644 --- a/src/n-sight/cleaners/edr-ecosystem.ps1 +++ b/src/n-sight/cleaners/edr-ecosystem.ps1 @@ -1,4 +1,4 @@ -#@compile-ignore +#!ignore <# .SYNOPSIS This cleaner script is used to remove leftover files and folders from the EDR & EcoSystem agent. From 3538c925cc2196f450cd88ce7ff3d4d101a07961 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 24 Sep 2024 14:23:14 +1000 Subject: [PATCH 159/341] fix(Compiler): fix export issue when running from powershell core --- src/Compiler/Resources/ScriptTemplate.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index 553adf96..0c38bb24 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -1,6 +1,6 @@ # [Diagnostics.CodeAnalysis.SuppressMessageAttribute( # 'PSAvoidGlobalVars', -# 'Global:CompiledScript', +# $null, # Justification = 'Required to inform modules of runtime type.' # )] #!DEFINE PARAM_BLOCK @@ -53,7 +53,7 @@ begin { if ((Get-ChildItem -Path $Local:ModuleFolderPath).Count -ne 0) { return; } - [String]$Local:TempFile = [System.IO.Path]::GetTempFileName(); + [String]$Local:TempFile = [System.IO.Path]::ChangeExtension([System.IO.Path]::GetTempFileName(), '.zip'); [Byte[]]$Local:Bytes = [System.Convert]::FromBase64String($Content); [System.IO.File]::WriteAllBytes($Local:TempFile, $Local:Bytes); From 49a4f6157850b4d7748596d47a21ab0ef06f5931 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 26 Sep 2024 17:40:25 +1000 Subject: [PATCH 160/341] fix(Compiler): Add Analyser.psm1 to all modules. This allows the usage of SuppressAnalyserAttribute in all instances and ensures that its packaged in properly, this did require the move of some utils out of Utils.psm1 and into ModuleUtils.psm1 to prevent circular dependency recursion. --- .vscode/launch.json | 9 +- .vscode/settings.json | 10 +- src/Compiler/Compiler.csproj | 7 +- src/Compiler/Module/Resolvable/Local.cs | 66 +++++--- src/Compiler/Module/Resolvable/Resolvable.cs | 6 + src/Compiler/Program.cs | 30 +++- src/Compiler/Resources/Analyser.psm1 | 1 + src/Compiler/Resources/ModuleUtils.psm1 | 1 + src/common/Analyser.psm1 | 16 +- src/common/Event.psm1 | 2 + src/common/Exit.psm1 | 22 +-- src/common/Flag.psm1 | 4 +- src/common/ModuleUtils.psm1 | 148 ++++++++++++++++++ src/common/PackageManager.psm1 | 1 + src/common/Utils.psm1 | 150 ------------------- src/n-sight/Get-InstalledSoftware.ps1 | 1 + tests/Compiler/Module/Resolvable/Script.cs | 78 +++------- tests/Compiler/Text/Updater/Pattern.cs | 6 +- 18 files changed, 302 insertions(+), 256 deletions(-) create mode 120000 src/Compiler/Resources/Analyser.psm1 create mode 120000 src/Compiler/Resources/ModuleUtils.psm1 create mode 100644 src/common/ModuleUtils.psm1 diff --git a/.vscode/launch.json b/.vscode/launch.json index 95039f8b..4be1a0a7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -35,19 +35,22 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build", - "program": "${workspaceFolder}/Output/Debug/Compiler.dll", "args": ["-i", ".\\src\\automation\\", "-vvv", "-o", ".\\", "-f"], + "program": "${workspaceFolder}/src/Compiler/bin/Debug/Compiler.dll", "cwd": "${workspaceFolder}", "console": "internalConsole", "stopAtEntry": false, "requireExactSource": true, - "internalConsoleOptions": "openOnSessionStart" + "internalConsoleOptions": "openOnSessionStart", + "justMyCode": true, + "enableStepFiltering": true }, { "name": ".NET Core Attach", "type": "coreclr", "request": "attach", - "processId": "${command:pickProcess}" + "processId": "${command:pickProcess}", + "justMyCode": true } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 10076913..38d0565d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,10 +16,16 @@ "powershell.scriptAnalysis.settingsPath": "PSScriptAnalyzerSettings.psd1", "poshProTools.ignoredPaths": "compiled", "pester.testFilePath": ["tests/*.[tT]ests.[pP][sS]1"], - "markiscodecoverage.searchCriteria": "tests\\Compiler\\Coverage/coverage.info", + "markiscodecoverage.searchCriteria": "tests\\Compiler\\Coverage\\coverage.info", "markiscodecoverage.enableDecorations": true, "poshProTools.disableNewsNotification": true, "poshProTools.toolbar.formDesigner": false, "poshProTools.toolbar.packageAsExecutable": false, - "poshProTools.toolbar.quickScripts": false + "poshProTools.toolbar.quickScripts": false, + "editor.rulers": [ + 80, + 120, + 130 + ], + "files.eol": "\n" } diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 322c82fa..69fdb7e5 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -61,9 +61,10 @@ - - - + + + + diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 42feb521..7e87d9f8 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -1,8 +1,8 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Collections.Concurrent; using System.Management.Automation.Language; -using System.Text.RegularExpressions; using Compiler.Module.Compiled; using Compiler.Requirements; using Compiler.Text; @@ -12,6 +12,9 @@ namespace Compiler.Module.Resolvable; public partial class ResolvableLocalModule : Resolvable { + private static readonly string TempModuleExportPath = Path.Combine(Path.GetTempPath(), "Compiler", "ExportedModules"); + private static readonly ConcurrentDictionary> EmbeddedResources = []; + internal readonly ScriptBlockAst RequirementsAst; public readonly TextEditor Editor; @@ -94,6 +97,9 @@ public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) { } public override Task> ResolveRequirements() { + string[] dontAddTo = ["Analyser", "ModuleUtils"]; + var foundAnalyserModule = dontAddTo.Contains(Path.GetFileNameWithoutExtension(this.ModuleSpec.Name)); + AstHelper.FindDeclaredModules(this.RequirementsAst).ToList().ForEach(module => { if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) { this.Editor.AddExactEdit( @@ -118,6 +124,10 @@ public override Task> ResolveRequirements() { (Version?)requiredVersion ); + if (spec.Name.EndsWith("Analyser.psm1", StringComparison.OrdinalIgnoreCase)) { + foundAnalyserModule = true; + } + lock (this.Requirements) { this.Requirements.AddRequirement(spec); } @@ -161,6 +171,15 @@ public override Task> ResolveRequirements() { } } + // TODO - Cleanup this fuckfest of a workaround. + // Add a reference to the Analyser.psm1 file to ensure all files have access to the SuppressAnalyserAttribute + if (!foundAnalyserModule) { + lock (this.Requirements) { + this.Requirements.AddRequirement(new ModuleSpec(GetExportedResource("ModuleUtils.psm1").Unwrap())); // Safety - We know this will always be present in the resources. + this.Requirements.AddRequirement(new ModuleSpec(GetExportedResource("Analyser.psm1").Unwrap())); // Safety - We know this will always be present in the resources. + } + } + return Option.None.AsTask(); } @@ -182,24 +201,37 @@ public override bool Equals(object? obj) { public override int GetHashCode() => this.ModuleSpec.GetHashCode(); - #region Regex Patterns - [GeneratedRegex(@"^(?!\n)*$")] - public static partial Regex EntireEmptyLineRegex(); - - [GeneratedRegex(@"^(?!\n)\s*<#")] - public static partial Regex DocumentationStartRegex(); + private static Fin GetExportedResource( + string moduleName + ) => EmbeddedResources.GetOrAdd(moduleName, name => { + var tempModulePath = Path.Combine(TempModuleExportPath, name); + if (!Program.GetEmbeddedResource(name).IsSome(out var embeddedStream)) { + return (Error)new FileNotFoundException($"The embedded resource {name} was not found."); + } - [GeneratedRegex(@"^(?!\n)\s*#>")] - public static partial Regex DocumentationEndRegex(); + if (!Directory.Exists(TempModuleExportPath)) { + Directory.CreateDirectory(TempModuleExportPath); + } - [GeneratedRegex(@"^(?!\n)\s*#.*$")] - public static partial Regex EntireLineCommentRegex(); + if (!Path.Exists(tempModulePath)) { + using var fileWriter = File.OpenWrite(tempModulePath); + embeddedStream.CopyTo(fileWriter); + } else { + // If the file exists, check if its contents are the same. + using var fileStream = File.Open(tempModulePath, FileMode.Open); + var streamsDiffer = embeddedStream.Length != fileStream.Length; // If the lengths are different, the streams are different. + // If the lengths are the same, check the contents. + while (!streamsDiffer && fileStream.Position < fileStream.Length) { + streamsDiffer = embeddedStream.ReadByte() != fileStream.ReadByte(); + } - [GeneratedRegex(@"(?!\n)\s*(?).*$")] - public static partial Regex EndOfLineComment(); + if (streamsDiffer) { + using var fileWriter = new StreamWriter(fileStream); + fileWriter.Write(embeddedStream); + } + } - [GeneratedRegex(@"^\s*#Requires\s+-Version\s+\d+\.\d+")] - private static partial Regex RequiresStatementRegex(); - #endregion + embeddedStream.Close(); + return tempModulePath; + }); } - diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index dff2882c..ab5a3734 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -1,6 +1,7 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using C = System.Collections.Generic; using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; @@ -144,15 +145,20 @@ public BidirectionalGraph> GetGraphFromRoot(Resolva var graph = new BidirectionalGraph>(); graph.AddVertex(resolvable); + var processedAsRoot = new C.HashSet(); var iterating = new Queue([resolvable]); do { var currentResolvable = iterating.Dequeue(); lock (this.Graph) { + // Skip if we've already processed a vertex like this + if (processedAsRoot.Contains(currentResolvable)) continue; + this.Graph.TryGetOutEdges(currentResolvable, out var outEdges); outEdges.ToList().ForEach(edge => { graph.AddVerticesAndEdge(edge); iterating.Enqueue(edge.Target); }); + processedAsRoot.Add(currentResolvable); } } while (iterating.Count > 0); diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 82b9498d..b7e88ada 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -21,6 +21,9 @@ using Extended.Collections.Generic; using NuGet.Packaging; using LanguageExt; +using System.Reflection; +using System.Diagnostics.Contracts; +using System.Diagnostics.CodeAnalysis; namespace Compiler; @@ -377,8 +380,8 @@ Option outputDirectory outputDebuggables.Add(module.Hash); } - if (err is WrappedErrorWithDebuggableContent wrappedErr) { - err = wrappedErr.InnerException; + if (err.Inner.IsSome(out var wrappedErr)) { + errorQueue.PushFirst(wrappedErr); } // Flatten ManyErrors into the indiviuals @@ -401,7 +404,7 @@ Option outputDirectory var message = err.Message + (IsDebugging ? (err.Exception.IsSome(out var exception) - ? Environment.NewLine + exception.StackTrace + ? Environment.NewLine + exception.Message + Environment.NewLine + exception.StackTrace : "") : "" ); @@ -472,4 +475,25 @@ internal static Fin> RunPowerShell(string script, params ob return FinSucc(result); } + + /// + /// Gets the embedded resource from the assembly inside the Resource folder. + /// + /// + /// The path of the resource without the assembly name or Resource folder, e.g. "ExtraModuleInfo.ModuleName.json" + /// Folders must separated by '.' instead of '/'. + /// + /// + /// The stream of the embedded resource if one is found, otherwise None. + /// It is the caller's responsibility to dispose of the stream. + /// + [Pure] + [return: NotNull] + internal static Option GetEmbeddedResource(string resourceName) { + var assemblyName = Assembly.GetExecutingAssembly().GetName(); + var resourcePath = $"{assemblyName.Name}.Resources.{resourceName}"; + var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourcePath); + + return templateStream; + } } diff --git a/src/Compiler/Resources/Analyser.psm1 b/src/Compiler/Resources/Analyser.psm1 new file mode 120000 index 00000000..32b4e402 --- /dev/null +++ b/src/Compiler/Resources/Analyser.psm1 @@ -0,0 +1 @@ +C:/users/JamesDraycott/OneDrive - AMT/Documents/Repos/scripts/src/common/Analyser.psm1 \ No newline at end of file diff --git a/src/Compiler/Resources/ModuleUtils.psm1 b/src/Compiler/Resources/ModuleUtils.psm1 new file mode 120000 index 00000000..a1e4a390 --- /dev/null +++ b/src/Compiler/Resources/ModuleUtils.psm1 @@ -0,0 +1 @@ +C:/users/JamesDraycott/OneDrive - AMT/Documents/Repos/scripts/src/common/ModuleUtils.psm1 \ No newline at end of file diff --git a/src/common/Analyser.psm1 b/src/common/Analyser.psm1 index ca61e4a5..7aa6d5f3 100644 --- a/src/common/Analyser.psm1 +++ b/src/common/Analyser.psm1 @@ -1,7 +1,15 @@ -Using module ./Utils.psm1 +Using module ./ModuleUtils.psm1; -if (-not (Get-Variable -Name 'GlobalScript' -Scope Global -ValueOnly)) { - Add-Type -LiteralPath $PSScriptRoot\..\Compiler\Analyser\Suppression.cs; +<# +.SYNOPSIS + Supplies the SuppressAnalyserAttribute class for suppressing analyser checks, + this must be supplied so that the analyser can be used in the compiled scripts without, + encountering errors due to the attribute not being defined. +#> + +$CSFilePath = "$PSScriptRoot\..\Compiler\Analyser\Suppression.cs"; +if (-not (Get-Variable -Name 'GlobalScript' -Scope Global -ValueOnly) -and (Test-Path -Path $CSFilePath -PathType Leaf)) { + Add-Type -LiteralPath $CSFilePath; } else { $SuppressionCSharp = @' using System; @@ -10,7 +18,7 @@ namespace Compiler.Analyser { [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] public sealed class SuppressAnalyserAttribute( string CheckType, - object Data, + object? Data = null, string Justification = '' ) : Attribute } diff --git a/src/common/Event.psm1 b/src/common/Event.psm1 index 6e026778..c60d5b68 100644 --- a/src/common/Event.psm1 +++ b/src/common/Event.psm1 @@ -1,3 +1,5 @@ +Using module ./ModuleUtils.psm1 + [HashTable]$Script:Events = @{}; enum Priority { diff --git a/src/common/Exit.psm1 b/src/common/Exit.psm1 index 6fabe673..8187fdbb 100644 --- a/src/common/Exit.psm1 +++ b/src/common/Exit.psm1 @@ -19,8 +19,7 @@ function Invoke-Handlers([switch]$IsFailure) { Invoke-Debug -Message "Invoking exit handler '$Local:ExitHandlerName'..."; try { Invoke-Command -ScriptBlock $Local:ExitHandler.Script; - } - catch { + } catch { Invoke-Warn "Failed to invoke exit handler '$Local:ExitHandlerName': $_"; } } @@ -56,12 +55,10 @@ function Invoke-FailedExit { } Invoke-Error $Local:ExitDescription; - } - elseif ($ExitCode -ne 0 -and $ExitCode -ne 9999) { - Invoke-Warn "No exit description found for code '$ExitCode'"; - } - elseif ($ExitCode -lt 1000) { + } elseif ($ExitCode -lt 1000) { Invoke-FailedExit -ExitCode $Script:INVALID_ERROR_CODE -FormatArgs $ExitCode; + } elseif ($ExitCode -ne 0 -and $ExitCode -ne 9999) { + Invoke-Warn "No exit description found for code '$ExitCode'"; } # FIXME - Not getting to correct depth of exception @@ -91,8 +88,7 @@ function Invoke-FailedExit { if ($Local:DeepestInvocationInfo) { Format-Error -InvocationInfo $Local:DeepestInvocationInfo -Message $Local:DeepestMessage; - } - elseif ($Local:DeepestMessage) { + } elseif ($Local:DeepestMessage) { Invoke-Error -Message $Local:DeepestMessage; } } @@ -105,8 +101,7 @@ function Invoke-FailedExit { if ($null -eq $Local:DeepestException.ErrorRecord.CategoryInfo.Category) { [System.Management.Automation.ErrorCategory]$Local:Catagory = [System.Management.Automation.ErrorCategory]::NotSpecified; - } - else { + } else { [System.Management.Automation.ErrorCategory]$Local:Catagory = $Local:DeepestException.ErrorRecord.CategoryInfo.Category; } @@ -176,8 +171,7 @@ function Register-ExitHandler { if ($Global:ExitHandlers[$Local:TrimmedName]) { Invoke-Warn "Exit handler '$Local:TrimmedName' already registered, overwriting..."; $Global:ExitHandlers[$Local:TrimmedName] = $Local:Value; - } - else { + } else { $Global:ExitHandlers.add($Local:TrimmedName, $Local:Value); } } @@ -202,6 +196,6 @@ function Register-ExitCode { return $Local:ExitCode; } -$Script:INVALID_ERROR_CODE = Register-ExitCode -Description 'Invalid error code {0}, codes must be greater than 1000'; +$Script:INVALID_ERROR_CODE = Register-ExitCode -Description 'Invalid error code {}, codes must be greater than 1000'; Export-ModuleMember -Function Invoke-Handlers, Invoke-FailedExit, Invoke-QuickExit, Register-ExitHandler, Register-ExitCode, Restart-Script; diff --git a/src/common/Flag.psm1 b/src/common/Flag.psm1 index 462441ec..cc2f603e 100644 --- a/src/common/Flag.psm1 +++ b/src/common/Flag.psm1 @@ -1,5 +1,5 @@ Using module ./Logging.psm1 -Using module ./Utils.psm1 +Using module ./ModuleUtils.psm1 class Flag { [String][ValidateNotNull()]$Context; @@ -44,7 +44,7 @@ class RunningFlag: Flag { [Void]Set([Object]$Data) { if ($Data) { - Invoke-Warn -Message "Data is ignored for RunningFlag, only the PID of the running process is stored." + Invoke-Warn -Message 'Data is ignored for RunningFlag, only the PID of the running process is stored.' } [Int]$Local:CurrentPID = [System.Diagnostics.Process]::GetCurrentProcess().Id; diff --git a/src/common/ModuleUtils.psm1 b/src/common/ModuleUtils.psm1 new file mode 100644 index 00000000..29ecd3c5 --- /dev/null +++ b/src/common/ModuleUtils.psm1 @@ -0,0 +1,148 @@ +<# +.SYNOPSIS + Exports the types from a module for importing. + +.DESCRIPTION + This function will export the types from a module for importing. + These types will be added to the TypeAccelerators class which will allow them to be used in other modules after importing. + +.EXAMPLE + Export the some types from the module. + ``` + Export-Types -Types ( + [System.Management.Automation.PSCredential], + [System.Management.Automation.PSObject], + [System.Management.Automation.PSModuleInfo] + ); + ``` + +.PARAMETER Types + The types to export from the module. + +.PARAMETER Clobber + If the types should be allowed to clobber existing type accelerators. + +.INPUTS + None + +.OUTPUTS + None + +.FUNCTIONALITY + Module Management + Type Accelerators + +.EXTERNALHELP + https://amtsupport.github.io/scripts/docs/modules/Utils/Export-Types +#> +function Export-Types { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [Type[]]$Types, + + [Switch]$Clobber, + + [Parameter(DontShow)] + [PSModuleInfo]$Module = (Get-PSCallStack)[0].InvocationInfo.MyCommand.ScriptBlock.Module + ) + + if (-not $Module) { + throw [System.InvalidOperationException]::new('This function must be called from within a module.'); + } + + # Get the internal TypeAccelerators class to use its static methods. + $TypeAcceleratorsClass = [PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators'); + + if (-not $Clobber) { + # Ensure none of the types would clobber an existing type accelerator. + # If a type accelerator with the same name exists, throw an exception. + $ExistingTypeAccelerators = $TypeAcceleratorsClass::Get; + foreach ($Type in $Types) { + if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { + $Message = @( + "Unable to register type accelerator '$($Type.FullName)'" + 'Accelerator already exists.' + ) -join ' - ' + + throw [System.Management.Automation.ErrorRecord]::new( + [System.InvalidOperationException]::new($Message), + 'TypeAcceleratorAlreadyExists', + [System.Management.Automation.ErrorCategory]::InvalidOperation, + $Type.FullName + ) + } + } + } + + # Add type accelerators for every exportable type. + foreach ($Type in $Types) { + $TypeAcceleratorsClass::Add($Type.FullName, $Type); + } + + Invoke-Debug "Exported types: $($Types -join ', ')"; + Invoke-Debug "Registering module callback to remove type accelerators: $($Types -join ', ') from $($Module)"; + + # Remove type accelerators when the module is removed. + Add-ModuleCallback -Module $Module -ScriptBlock { + foreach ($Type in $Types) { + $null = $TypeAcceleratorsClass::Remove($Type.FullName); + } + }.GetNewClosure(); +} + +<# +.SYNOPSIS + Adds a function to be executed when the module is removed. + +.DESCRIPTION + This function will add a function to be executed when the module is removed. + This is useful for cleaning up resources when the module is removed. + +.EXAMPLE + Add a function to be executed when the module is removed. + ``` + $TempFile = [System.IO.Path]::GetTempFileName(); + # Do something with the temp file. + + Add-OnRemove { + Remove-Item -Path $TempFile -Force; + } + ``` + +.PARAMETER ScriptBlock + The script block to execute when the module is removed. + +.PARAMETER Module + The module to add the callback to. Defaults to the current module. + +.INPUTS + None + +.OUTPUTS + None + +.FUNCTIONALITY + Module Management + +.EXTERNALHELP + https://amtsupport.github.io/scripts/docs/modules/Utils/Add-ModuleCallback +#> +function Add-ModuleCallback { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + $ScriptBlock, + + [Parameter()] + $Module = (Get-PSCallStack)[0].InvocationInfo.MyCommand.ScriptBlock.Module + ) + + if (-not $Module) { + throw [System.InvalidOperationException]::new('This function must be called from within a module.'); + } + + $Module.OnRemove = $ScriptBlock; +} + +Export-ModuleMember -Function Export-Types, Add-ModuleCallback; diff --git a/src/common/PackageManager.psm1 b/src/common/PackageManager.psm1 index 64dc19aa..e7da8f25 100644 --- a/src/common/PackageManager.psm1 +++ b/src/common/PackageManager.psm1 @@ -41,6 +41,7 @@ enum PackageManager { function Local:Install-Requirements { [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSAvoidUsingInvokeExpression', + $null, Justification = 'Required to install Chocolatey, there is no other way to do this.' )] [Compiler.Analyser.SuppressAnalyserAttribute( diff --git a/src/common/Utils.psm1 b/src/common/Utils.psm1 index 7b2513a7..f0790c9d 100644 --- a/src/common/Utils.psm1 +++ b/src/common/Utils.psm1 @@ -454,156 +454,6 @@ function Test-NetworkConnection { } | Measure-Object | Select-Object -ExpandProperty Count) -gt 0; } -#region Module Export Helpers -<# -.SYNOPSIS - Exports the types from a module for importing. - -.DESCRIPTION - This function will export the types from a module for importing. - These types will be added to the TypeAccelerators class which will allow them to be used in other modules after importing. - -.EXAMPLE - Export the some types from the module. - ``` - Export-Types -Types ( - [System.Management.Automation.PSCredential], - [System.Management.Automation.PSObject], - [System.Management.Automation.PSModuleInfo] - ); - ``` - -.PARAMETER Types - The types to export from the module. - -.PARAMETER Clobber - If the types should be allowed to clobber existing type accelerators. - -.INPUTS - None - -.OUTPUTS - None - -.FUNCTIONALITY - Module Management - Type Accelerators - -.EXTERNALHELP - https://amtsupport.github.io/scripts/docs/modules/Utils/Export-Types -#> -function Export-Types { - [CmdletBinding()] - param( - [Parameter(Mandatory)] - [Type[]]$Types, - - [Switch]$Clobber, - - [Parameter(DontShow)] - [PSModuleInfo]$Module = (Get-PSCallStack)[0].InvocationInfo.MyCommand.ScriptBlock.Module - ) - - if (-not $Module) { - throw [System.InvalidOperationException]::new('This function must be called from within a module.'); - } - - # Get the internal TypeAccelerators class to use its static methods. - $TypeAcceleratorsClass = [PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators'); - - if (-not $Clobber) { - # Ensure none of the types would clobber an existing type accelerator. - # If a type accelerator with the same name exists, throw an exception. - $ExistingTypeAccelerators = $TypeAcceleratorsClass::Get; - foreach ($Type in $Types) { - if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { - $Message = @( - "Unable to register type accelerator '$($Type.FullName)'" - 'Accelerator already exists.' - ) -join ' - ' - - throw [System.Management.Automation.ErrorRecord]::new( - [System.InvalidOperationException]::new($Message), - 'TypeAcceleratorAlreadyExists', - [System.Management.Automation.ErrorCategory]::InvalidOperation, - $Type.FullName - ) - } - } - } - - # Add type accelerators for every exportable type. - foreach ($Type in $Types) { - $TypeAcceleratorsClass::Add($Type.FullName, $Type); - } - - Invoke-Debug "Exported types: $($Types -join ', ')"; - Invoke-Debug "Registering module callback to remove type accelerators: $($Types -join ', ') from $($Module)"; - - # Remove type accelerators when the module is removed. - Add-ModuleCallback -Module $Module -ScriptBlock { - foreach ($Type in $Types) { - $null = $TypeAcceleratorsClass::Remove($Type.FullName); - } - }.GetNewClosure(); -} - -<# -.SYNOPSIS - Adds a function to be executed when the module is removed. - -.DESCRIPTION - This function will add a function to be executed when the module is removed. - This is useful for cleaning up resources when the module is removed. - -.EXAMPLE - Add a function to be executed when the module is removed. - ``` - $TempFile = [System.IO.Path]::GetTempFileName(); - # Do something with the temp file. - - Add-OnRemove { - Remove-Item -Path $TempFile -Force; - } - ``` - -.PARAMETER ScriptBlock - The script block to execute when the module is removed. - -.PARAMETER Module - The module to add the callback to. Defaults to the current module. - -.INPUTS - None - -.OUTPUTS - None - -.FUNCTIONALITY - Module Management - -.EXTERNALHELP - https://amtsupport.github.io/scripts/docs/modules/Utils/Add-ModuleCallback -#> -function Add-ModuleCallback { - [CmdletBinding()] - param( - [Parameter(Mandatory)] - $ScriptBlock, - - [Parameter()] - $Module = (Get-PSCallStack)[0].InvocationInfo.MyCommand.ScriptBlock.Module - ) - - if (-not $Module) { - throw [System.InvalidOperationException]::new('This function must be called from within a module.'); - } - - $Module.OnRemove = $ScriptBlock; -} - -#endregion - #region Async Helpers <# .SYNOPSIS diff --git a/src/n-sight/Get-InstalledSoftware.ps1 b/src/n-sight/Get-InstalledSoftware.ps1 index ad3490eb..6eaed3b0 100644 --- a/src/n-sight/Get-InstalledSoftware.ps1 +++ b/src/n-sight/Get-InstalledSoftware.ps1 @@ -246,6 +246,7 @@ Invoke-RunMain $PSCmdlet { function Set-DeviceSoftware { [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSUseShouldProcessForStateChangingFunctions', + $null, Justification = 'Only reading data from the API, no changes are being made to the system.' )] param( diff --git a/tests/Compiler/Module/Resolvable/Script.cs b/tests/Compiler/Module/Resolvable/Script.cs index 8b7b9893..77830c9c 100644 --- a/tests/Compiler/Module/Resolvable/Script.cs +++ b/tests/Compiler/Module/Resolvable/Script.cs @@ -2,14 +2,14 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Collections; -using Compiler.Module.Resolvable; +using System.Text.RegularExpressions; using Compiler.Text; using Compiler.Text.Updater; namespace Compiler.Test.Module.Resolvable; [TestFixture] -public class CompiledScriptTest { +public partial class CompiledScriptTest { private static readonly string TEST_SCRIPT = Path.Combine(Environment.CurrentDirectory, "resources", "test.ps1"); [TestCaseSource(typeof(TestData), nameof(TestData.TestCases))] @@ -24,60 +24,28 @@ string content return compiled.GetContent(); } - public static class TestData { + public static partial class TestData { + [GeneratedRegex(@"^(?!\n)*$")] + public static partial Regex EntireEmptyLineRegex(); + + [GeneratedRegex(@"^(?!\n)\s*<#")] + public static partial Regex DocumentationStartRegex(); + + [GeneratedRegex(@"^(?!\n)\s*#>")] + public static partial Regex DocumentationEndRegex(); + + [GeneratedRegex(@"^(?!\n)\s*#.*$")] + public static partial Regex EntireLineCommentRegex(); + + [GeneratedRegex(@"(?!\n)\s*(?).*$")] + public static partial Regex EndOfLineComment(); + public static IEnumerable TestCases { get { - // yield return new TestCaseData( - // new PatternUpdater( - // 50, - // ResolvableLocalModule.MultilineStringOpenRegex(), - // ResolvableLocalModule.MultilineStringCloseRegex(), - // UpdateOptions.None, - // (lines) => - // { - // var startIndex = 0; - - // // If the multiline is not at the start of the content it does not need to be trimmed, so we skip it. - // var trimmedLine = lines[0].Trim(); - // if (trimmedLine.StartsWith(@"@""") || trimmedLine.StartsWith("@'")) - // { - // startIndex++; - // } - - // // Get the multiline indent level from the last line of the string. - // // This is used so we don't remove any whitespace that is part of the actual string formatting. - // var indentLevel = new Regex(@"^\s*").Match(lines.Last()).Value.Length; - - // var updatedLines = lines.Select((line, index) => - // { - // if (index < startIndex) - // { - // return line; - // } - - // return line[indentLevel..]; - // }); - - // return updatedLines.ToArray(); - // } - // ), - // """ - // Write-Host @" - // This is a multiline string! - // It can have multiple lines! - // "@; - // """ - // ).Returns(""" - // Write-Host @" - // This is a multiline string! - // It can have multiple lines! - // "@; - // """).SetName("Fix Indentation for Multiline Strings"); - yield return new TestCaseData( new RegexUpdater( 50, - ResolvableLocalModule.EntireLineCommentRegex(), + EntireLineCommentRegex(), UpdateOptions.None, _ => null ), @@ -94,7 +62,7 @@ public static IEnumerable TestCases { yield return new TestCaseData( new RegexUpdater( 50, - ResolvableLocalModule.EntireEmptyLineRegex(), + EntireEmptyLineRegex(), UpdateOptions.None, _ => null ), @@ -117,8 +85,8 @@ public static IEnumerable TestCases { yield return new TestCaseData( new PatternUpdater( 50, - ResolvableLocalModule.DocumentationStartRegex(), - ResolvableLocalModule.DocumentationEndRegex(), + DocumentationStartRegex(), + DocumentationEndRegex(), UpdateOptions.None, _ => [] ), @@ -140,7 +108,7 @@ function foo { yield return new TestCaseData( new RegexUpdater( 50, - ResolvableLocalModule.EndOfLineComment(), + EndOfLineComment(), UpdateOptions.None, _ => null ), diff --git a/tests/Compiler/Text/Updater/Pattern.cs b/tests/Compiler/Text/Updater/Pattern.cs index fabf8aa4..d1b64d8a 100644 --- a/tests/Compiler/Text/Updater/Pattern.cs +++ b/tests/Compiler/Text/Updater/Pattern.cs @@ -3,7 +3,7 @@ using System.Collections; using System.Text.RegularExpressions; -using Compiler.Module.Resolvable; +using Compiler.Test.Module.Resolvable; using Compiler.Text; namespace Compiler.Test.Text.Updater; @@ -48,8 +48,8 @@ public static IEnumerable AddPatternEditCases { get { yield return new TestCaseData( DOCUMENTATION_LINES, - ResolvableLocalModule.DocumentationStartRegex().ToString(), - ResolvableLocalModule.DocumentationEndRegex().ToString(), + CompiledScriptTest.TestData.DocumentationStartRegex().ToString(), + CompiledScriptTest.TestData.DocumentationEndRegex().ToString(), UpdateOptions.None, (Func)(_ => []) ).Returns(string.Empty).SetName("Ensure that documentation blocks are removed from content."); From 639a6843425c7100c11af293c0d6c42ce48f69a0 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 26 Sep 2024 17:42:17 +1000 Subject: [PATCH 161/341] fix(Compiler): Fix the NewLineRemovalUpdater and repurpose into WhitespaceUpdater. Now trims excess whitespace at the end of lines, and will check to see if its within a multiline string before removing blank lines incase they are on purpose. --- src/Compiler/Module/Resolvable/Local.cs | 2 +- src/Compiler/Text/Span.cs | 10 +-- .../Updater/Built/CommentRemovalUpdater.cs | 2 +- .../Updater/Built/NewLineRemovalUpdater.cs | 13 ---- .../Text/Updater/Built/WhitespaceUpdater.cs | 62 +++++++++++++++++++ .../Text/Updater/NodeEnumerableUpdater.cs | 6 +- 6 files changed, 70 insertions(+), 25 deletions(-) delete mode 100644 src/Compiler/Text/Updater/Built/NewLineRemovalUpdater.cs create mode 100644 src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 7e87d9f8..bf026b37 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -71,7 +71,7 @@ public ResolvableLocalModule(PathedModuleSpec moduleSpec) : base(moduleSpec) { this.Editor = new TextEditor(new TextDocument(File.ReadAllLines(moduleSpec.FullPath))); this.RequirementsAst = this.Editor.Document.GetRequirementsAst().BindFail(err => err.Enrich(this.ModuleSpec)).ThrowIfFail(); - // this.Editor.AddEdit(static () => new NewLineRemovalUpdater()); + this.Editor.AddEdit(static () => new WhitespaceUpdater()); this.Editor.AddEdit(static () => new CommentRemovalUpdater()); this.Editor.AddEdit(static () => new HereStringUpdater()); } diff --git a/src/Compiler/Text/Span.cs b/src/Compiler/Text/Span.cs index 17e3edc2..45c1ef63 100644 --- a/src/Compiler/Text/Span.cs +++ b/src/Compiler/Text/Span.cs @@ -240,11 +240,6 @@ [NotNull] string[] content if (this.StartingIndex == this.EndingIndex) { lines.RemoveAt(this.StartingIndex); lineOffset--; - - // Short circuit if the new content is empty, there will be no need to update the document. - if (string.IsNullOrEmpty(firstLineBefore) && string.IsNullOrEmpty(lastLineAfter) && content.Length == 0) { - return new ContentChange(lineOffset, startingColumnOffset, endingColumnOffset); - } } else { // Remove all lines in the span to get a clean slate. for (var i = this.StartingIndex; i <= this.EndingIndex; i++) { @@ -253,6 +248,11 @@ [NotNull] string[] content } } + // Short circuit if the new content is empty, there will be no need to update the document. + if (string.IsNullOrEmpty(firstLineBefore) && string.IsNullOrEmpty(lastLineAfter) && content.Length == 0) { + return new ContentChange(lineOffset, startingColumnOffset, endingColumnOffset); + } + if (options.HasFlag(UpdateOptions.InsertInline)) { var lineContent = new StringBuilder(); diff --git a/src/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs b/src/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs index 62408c68..5b4ca21a 100644 --- a/src/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs +++ b/src/Compiler/Text/Updater/Built/CommentRemovalUpdater.cs @@ -6,7 +6,7 @@ namespace Compiler.Text.Updater.Built; public sealed class CommentRemovalUpdater() : TokenUpdater( - 10, + 5, static token => token.Kind == TokenKind.Comment, static comment => [], UpdateOptions.InsertInline diff --git a/src/Compiler/Text/Updater/Built/NewLineRemovalUpdater.cs b/src/Compiler/Text/Updater/Built/NewLineRemovalUpdater.cs deleted file mode 100644 index dcde8b66..00000000 --- a/src/Compiler/Text/Updater/Built/NewLineRemovalUpdater.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) James Draycott. All Rights Reserved. -// Licensed under the GPL3 License, See LICENSE in the project root for license information. - -using System.Management.Automation.Language; - -namespace Compiler.Text.Updater.Built; - -public sealed class NewLineRemovalUpdater() : TokenUpdater( - 5, - static token => token.Kind == TokenKind.NewLine, - static newline => [], - UpdateOptions.InsertInline -); diff --git a/src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs b/src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs new file mode 100644 index 00000000..4b5b885f --- /dev/null +++ b/src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs @@ -0,0 +1,62 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Management.Automation.Language; +using LanguageExt; + +namespace Compiler.Text.Updater.Built; + +/// +/// Removes all empty lines, including lines that only contain whitespace, unless they are within a string. +/// +/// Additionally will remove any whitespace at the end of a line. +/// +public sealed class WhitespaceUpdater() : TextSpanUpdater(90) { + public override Fin> Apply(List lines) { + // Remove all empty lines, including lines that only contain whitespace, unless they are within a string. + if (AstHelper.GetAstReportingErrors(string.Join('\n', lines), None, [], out _).IsErr(out var err, out var ast)) { + return err; + } + + var stringConstants = ast.FindAll(x => x is StringConstantExpressionAst ast && ast.StringConstantType is StringConstantType.SingleQuotedHereString or StringConstantType.DoubleQuotedHereString, true) + .Select(x => TextSpan.New(x.Extent.StartLineNumber - 1, x.Extent.StartColumnNumber - 1, x.Extent.EndLineNumber - 1, x.Extent.EndColumnNumber - 1).Unwrap()) + .ToList(); + + var lineCount = lines.Count; + var spanUpdates = new List(); + for (var i = 0; i < lineCount; i++) { + var line = lines[i + spanUpdates.Aggregate(0, (acc, x) => acc + x.Change.LineOffset)]; + + TextSpan? span = null; + if (string.IsNullOrWhiteSpace(line)) { + span = TextSpan.New(i, 0, i, line.Length) + .Unwrap() // Safe to unwrap here as we know the span is valid + .WithUpdate(spanUpdates); + } else { + var whitespaceCount = line.Reverse().TakeWhile(char.IsWhiteSpace).Count(); + if (whitespaceCount > 0) { + span = TextSpan.New(i, line.Length - whitespaceCount, i, line.Length) + .Unwrap() // Safe to unwrap here as we know the span is valid + .WithUpdate(spanUpdates); + } + } + + if (span == null) continue; + + var intersectingNode = stringConstants.Find(x => x.Contains(span)); + if (intersectingNode != null) continue; + + if (span.SetContent(lines, UpdateOptions.None, []).IsErr(out err, out var contentChange)) { + return err; + } + + spanUpdates.Add(new SpanUpdateInfo(this, span, contentChange)); + stringConstants = stringConstants + .Where(x => x.EndingIndex >= span.EndingIndex) // Remove any contants that are before the current span as they are no longer relevant + .Select(x => x.WithUpdate(spanUpdates)).ToList(); + } + + return spanUpdates; + } +} + diff --git a/src/Compiler/Text/Updater/NodeEnumerableUpdater.cs b/src/Compiler/Text/Updater/NodeEnumerableUpdater.cs index 845042cc..76c70728 100644 --- a/src/Compiler/Text/Updater/NodeEnumerableUpdater.cs +++ b/src/Compiler/Text/Updater/NodeEnumerableUpdater.cs @@ -29,11 +29,7 @@ public override Fin> Apply(List lines) { var isMultiLine = span.StartingIndex != span.EndingIndex; var newContent = itemUpdater(node); - // Remove the entire line if the replacement is empty and the match is the entire line. - thisChange = newContent.Length == 0 && span.StartingColumn == 0 && span.EndingColumn == lines[span.StartingIndex].Length - ? span.RemoveContent(lines) - : span.SetContent(lines, options, newContent!); - + thisChange = span.SetContent(lines, options, newContent!); if (thisChange.IsErr(out err, out var change)) return err; updateSpans.Add(new SpanUpdateInfo(this, span, change)); From 2188ee7a18afa7fb8df353c041040e4af54b0c35 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 26 Sep 2024 17:47:16 +1000 Subject: [PATCH 162/341] fix(Compiler): Disable PublishTrimmed for compatibility with WinForms --- src/Compiler/Compiler.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 69fdb7e5..7603f25e 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -55,7 +55,8 @@ prompt 3 false - true + + false true true From 5ae30c61a1fb49f1462536ab5cfa2e77ec856e0d Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 26 Sep 2024 17:48:43 +1000 Subject: [PATCH 163/341] fix(ci): prevent double build --- .github/workflows/build.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ab71847a..c8a50a85 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1,6 +1,10 @@ name: Build Compiler -on: ["push", "pull_request"] +on: + push: + branches: [ main ] + pull_request: + jobs: build: From f4974f253af81b65614b5155e1551918c251c261 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 26 Sep 2024 17:50:19 +1000 Subject: [PATCH 164/341] fix(ci): double builds on other workflows --- .github/workflows/build.yaml | 2 +- .github/workflows/linter.yaml | 1 + .github/workflows/scan-secrets.yaml | 5 ++++- .github/workflows/test.yaml | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c8a50a85..f265d559 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -2,7 +2,7 @@ name: Build Compiler on: push: - branches: [ main ] + branches: [ master ] pull_request: diff --git a/.github/workflows/linter.yaml b/.github/workflows/linter.yaml index b1e616b3..2daa6310 100644 --- a/.github/workflows/linter.yaml +++ b/.github/workflows/linter.yaml @@ -4,6 +4,7 @@ on: pull_request: paths: ["src/**", "tests/**", "utils/**", ".github/workflows/**"] push: + branches: [master] paths: ["src/**", "tests/**", "utils/**", ".github/workflows/**"] jobs: diff --git a/.github/workflows/scan-secrets.yaml b/.github/workflows/scan-secrets.yaml index 613c964e..7e24d923 100644 --- a/.github/workflows/scan-secrets.yaml +++ b/.github/workflows/scan-secrets.yaml @@ -1,6 +1,9 @@ name: Scan for Secrets -on: [pull_request, push] +on: + push: + branches: [ master ] + pull_request: jobs: secrets-scan: diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f1354c5d..0c1c1e6e 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -4,6 +4,8 @@ on: push: branches: [master] paths: ["src/**", "tests/**", ".github/workflows/test-scripts.yaml"] + pull_request: + paths: ["src/**", "tests/**", ".github/workflows/test-scripts.yaml"] jobs: test-compiler: From 856770ef3eed7e2adba9ab6715d4871b7b165be3 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 26 Sep 2024 18:33:54 +1000 Subject: [PATCH 165/341] fix(Compiler): Update WhitespaceUpdater to include ModuleNotFoundDuringParse in error reporting --- src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs b/src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs index 4b5b885f..3d651fbb 100644 --- a/src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs +++ b/src/Compiler/Text/Updater/Built/WhitespaceUpdater.cs @@ -14,7 +14,7 @@ namespace Compiler.Text.Updater.Built; public sealed class WhitespaceUpdater() : TextSpanUpdater(90) { public override Fin> Apply(List lines) { // Remove all empty lines, including lines that only contain whitespace, unless they are within a string. - if (AstHelper.GetAstReportingErrors(string.Join('\n', lines), None, [], out _).IsErr(out var err, out var ast)) { + if (AstHelper.GetAstReportingErrors(string.Join('\n', lines), None, ["ModuleNotFoundDuringParse"], out _).IsErr(out var err, out var ast)) { return err; } @@ -59,4 +59,3 @@ public override Fin> Apply(List lines) { return spanUpdates; } } - From 0ff76675e17c67a917564b3910b5a58c452c7e28 Mon Sep 17 00:00:00 2001 From: Racci Date: Thu, 26 Sep 2024 18:36:34 +1000 Subject: [PATCH 166/341] fix(Compiler): Symbolic links --- src/Compiler/Resources/Analyser.psm1 | 2 +- src/Compiler/Resources/ModuleUtils.psm1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Compiler/Resources/Analyser.psm1 b/src/Compiler/Resources/Analyser.psm1 index 32b4e402..7d10467e 120000 --- a/src/Compiler/Resources/Analyser.psm1 +++ b/src/Compiler/Resources/Analyser.psm1 @@ -1 +1 @@ -C:/users/JamesDraycott/OneDrive - AMT/Documents/Repos/scripts/src/common/Analyser.psm1 \ No newline at end of file +../../common/Analyser.psm1 \ No newline at end of file diff --git a/src/Compiler/Resources/ModuleUtils.psm1 b/src/Compiler/Resources/ModuleUtils.psm1 index a1e4a390..31c2ef84 120000 --- a/src/Compiler/Resources/ModuleUtils.psm1 +++ b/src/Compiler/Resources/ModuleUtils.psm1 @@ -1 +1 @@ -C:/users/JamesDraycott/OneDrive - AMT/Documents/Repos/scripts/src/common/ModuleUtils.psm1 \ No newline at end of file +../../common/ModuleUtils.psm1 \ No newline at end of file From 89ea97fa85a88472b1a440abd8dc97ff5b5c2c39 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 27 Sep 2024 13:05:57 +1000 Subject: [PATCH 167/341] fix(Compiler): Error displays Remove duplicates of the same error, these can appear due to returning a cached Fin for some async methods. If error is an Issue prevent double printing. Unwrap ExceptionalException into its actual Error to catch it properly. --- src/Compiler/Analyser/Analyser.cs | 2 +- src/Compiler/Analyser/Issue.cs | 29 +- src/Compiler/Analyser/Rules/RuleVisitor.cs | 4 +- src/Compiler/Errors.cs | 69 +++- src/Compiler/Module/Resolvable/Local.cs | 3 - src/Compiler/Module/Resolvable/Resolvable.cs | 4 +- src/Compiler/Module/Resolvable/Script.cs | 2 +- src/Compiler/Program.cs | 35 +- src/Compiler/Text/Updater/ExactUpdater.cs | 53 ++- src/Compiler/packages.lock.json | 360 +++++++++++++++++++ 10 files changed, 510 insertions(+), 51 deletions(-) diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index 94a5f05e..1357ce6d 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -34,7 +34,7 @@ public static async Task> Analyse(CompiledLocalModule module, IEnume return await Cache.GetOrAdd(key, _ => Task.Run(() => { Logger.Trace($"Analyzing module {module.ModuleSpec.Name}"); - var visitor = new RuleVisitor(module, Rules, availableImports); + var visitor = new RuleVisitor(Rules, availableImports); module.Document.Ast.Visit(visitor); return visitor.Issues; })); diff --git a/src/Compiler/Analyser/Issue.cs b/src/Compiler/Analyser/Issue.cs index 90a7a1f6..82ceb856 100644 --- a/src/Compiler/Analyser/Issue.cs +++ b/src/Compiler/Analyser/Issue.cs @@ -22,7 +22,7 @@ public record Issue( public override bool IsExpected { get; } = Severity == IssueSeverity.Warning; - public override string Message => this.ToString(); + public override string Message => this.ActualMessage; public override string ToString() => AstHelper.GetPrettyAstError( this.Extent, @@ -31,6 +31,31 @@ public override string ToString() => AstHelper.GetPrettyAstError( this.Module.Map(mod => mod is PathedModuleSpec pathed ? pathed.FullPath : mod.Name) ); + public virtual bool Equals(Issue? other) { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; + + return this.Severity == other.Severity + && this.ActualMessage == other.ActualMessage + && this.Extent.File == other.Extent.File + && this.Extent.StartLineNumber == other.Extent.StartLineNumber + && this.Extent.StartColumnNumber == other.Extent.StartColumnNumber + && this.Extent.EndLineNumber == other.Extent.EndLineNumber + && this.Extent.EndColumnNumber == other.Extent.EndColumnNumber + && this.Module == other.Module; + } + + public override int GetHashCode() => HashCode.Combine( + this.Severity, + this.ActualMessage, + this.Module, + this.Extent.File, + this.Extent.StartLineNumber, + this.Extent.StartColumnNumber, + this.Extent.EndLineNumber, + this.Extent.EndColumnNumber + ); + [Pure] [return: NotNull] public static Issue Error( @@ -48,6 +73,7 @@ public static Issue Warning( [NotNull] Option module = default) => new(IssueSeverity.Warning, message, extent, parent, module); public override bool Is() => false; + public T Enrich(ModuleSpec module) where T : Exceptional => throw new NotImplementedException(); } @@ -55,4 +81,3 @@ public enum IssueSeverity { Error, Warning } - diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs index 95cd6ac0..dad75733 100644 --- a/src/Compiler/Analyser/Rules/RuleVisitor.cs +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -7,11 +7,9 @@ namespace Compiler.Analyser.Rules; public sealed class RuleVisitor( - Compiled module, IEnumerable rules, IEnumerable imports) : AstVisitor { - private readonly Compiled Module = module; private readonly IEnumerable Rules = rules; private readonly IEnumerable Imports = imports; @@ -22,7 +20,7 @@ public override AstVisitAction DefaultVisit(Ast ast) { foreach (var rule in this.Rules) { if (!rule.ShouldProcess(ast, supressions)) continue; foreach (var issue in rule.Analyse(ast, this.Imports)) { - this.Issues.Add(issue.Enrich(this.Module.ModuleSpec)); + this.Issues.Add(issue); } } diff --git a/src/Compiler/Errors.cs b/src/Compiler/Errors.cs index 8b7b45d6..6fb23995 100644 --- a/src/Compiler/Errors.cs +++ b/src/Compiler/Errors.cs @@ -89,9 +89,18 @@ public override string Message { public override Exception ToException() => base.ToErrorException(); }; -public sealed record InvalidModulePathError : EnrichableExceptional { +public record InvalidModulePathError : EnrichableExceptional { private InvalidModulePathError(string message) : base(message, 620) { } + public virtual bool Equals(InvalidModulePathError? other) { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; + + return this.Message == other.Message; + } + + public override int GetHashCode() => this.Message.GetHashCode(); + public static InvalidModulePathError NotAFile(string notFilePath) => new($"The module path must be a file, received {notFilePath}"); public static InvalidModulePathError ParentNotADirectory(string parentPath) => new($"The parent path must be a directory, received {parentPath}"); @@ -110,7 +119,14 @@ public sealed class EnrichedException([NotNull] Exception exception, [NotNull] M public override IDictionary Data => this.Exception.Data; - public override bool Equals(object? obj) => this.Exception.Equals(obj); + public override bool Equals(object? obj) { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj is not EnrichedException other) return false; + + return this.Module == other.Module + && this.Exception == other.Exception; + } public override Exception GetBaseException() => this.Exception.GetBaseException(); @@ -119,7 +135,7 @@ public sealed class EnrichedException([NotNull] Exception exception, [NotNull] M public override string ToString() => $"{this.Exception}\nIn module {this.Module.Name}"; } -public sealed record MultipleInstancesOfSingleRequirementError( +public record MultipleInstancesOfSingleRequirementError( IEnumerable Instances ) : EnrichableExceptional( $""" @@ -127,9 +143,18 @@ IEnumerable Instances {string.Join(", ", Instances)} """, 621 -) where T : Requirement; +) where T : Requirement { + public virtual bool Equals(MultipleInstancesOfSingleRequirementError? other) { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; + + return this.Instances.SequenceEqual(other.Instances); + } + + public override int GetHashCode() => HashCode.Combine(this.Instances); +} -public sealed record IncompatableRequirementsError( +public record IncompatableRequirementsError( IEnumerable ConflictingRequirements ) : EnrichableExceptional( $""" @@ -137,15 +162,35 @@ Some of the requirements are incompatible with each other. {string.Join(", ", ConflictingRequirements)} """, 622 -); +) { + public virtual bool Equals(IncompatableRequirementsError? other) { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; -public sealed record WrappedErrorWithDebuggableContent( + return this.ConflictingRequirements.SequenceEqual(other.ConflictingRequirements); + } + + public override int GetHashCode() => HashCode.Combine(this.ConflictingRequirements); +} + +public record WrappedErrorWithDebuggableContent( Option MaybeMessage, string Content, Error InnerException, Option Module = default ) : EnrichableError(InnerException, MaybeMessage, Module) { public override Option Inner => this.InnerException; + + public virtual bool Equals(WrappedErrorWithDebuggableContent? other) { + if (other is null) return false; + if (ReferenceEquals(this, other)) return true; + + return this.Module == other.Module + && this.InnerException == other.InnerException + && this.Content == other.Content; + } + + public override int GetHashCode() => HashCode.Combine(this.Content, this.InnerException, this.Module); } public static class ErrorUtils { @@ -153,8 +198,9 @@ public static T Enrich( this T error, ModuleSpec module ) where T : Error => error switch { - WrappedErrorWithDebuggableContent wrapped => (wrapped with { Module = module, InnerException = wrapped.InnerException.Enrich(module) } as T)!, // Safety: The WrappedErrorWithDebuggableContent return will always be a T. - EnrichableExceptional enrichable => (enrichable with { Module = module } as T)!, // Safety: The EnrichableExceptional return will always be a T. + WrappedErrorWithDebuggableContent wrapped when wrapped.Module.IsNone => (wrapped with { Module = module, InnerException = wrapped.InnerException.Enrich(module) } as T)!, // Safety: The WrappedErrorWithDebuggableContent return will always be a T. + EnrichableExceptional enrichable when enrichable.Module.IsNone => (enrichable with { Module = module } as T)!, // Safety: The EnrichableExceptional return will always be a T. + EnrichableError enrichable when enrichable.Module.IsNone => (enrichable with { Module = module } as T)!, // Safety: The EnrichableError return will always be a T. ManyErrors errors => (new ManyErrors(errors.Errors.Select(error => error.Enrich(module))) as T)!, // Safety: T will always be ManyErrors. _ => error }; @@ -162,5 +208,8 @@ ModuleSpec module public static EnrichedException Enrich( this Exception exception, ModuleSpec module - ) => new(exception, module); // Safety: T will always be an Exception. + ) => exception switch { + EnrichedException enriched => enriched, + _ => new(exception, module) // Safety: T will always be an Exception. + }; } diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index bf026b37..44a960ad 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -30,9 +30,6 @@ public partial class ResolvableLocalModule : Resolvable { /// /// The module spec to create the module from. /// - /// - /// Thrown when the path is not a valid module path or the parent path is not an absolute path. - /// /// /// Thrown when the ast cannot be generated from the file. /// diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index ab5a3734..1af74585 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -62,10 +62,10 @@ internal static async Task> TryCreate( // Silent fall through to remote. } catch (ExceptionalException err) { Logger.Debug("Caught Exceptional with Error type {0}", err.ToError().GetType()); - return FinFail(err.Enrich(moduleSpec)); + return err.ToError().Enrich(moduleSpec); // Get the underlying error instead of the wrapped one. } catch (Exception err) { Logger.Debug($"Caught exception while trying to create local module, {err.GetType()}"); - return FinFail(err.Enrich(moduleSpec)); + return (Error)err.Enrich(moduleSpec); } } diff --git a/src/Compiler/Module/Resolvable/Script.cs b/src/Compiler/Module/Resolvable/Script.cs index cf84106e..8ca59d6b 100644 --- a/src/Compiler/Module/Resolvable/Script.cs +++ b/src/Compiler/Module/Resolvable/Script.cs @@ -42,7 +42,7 @@ public ResolvableScript([NotNull] PathedModuleSpec moduleSpec, [NotNull] Resolva public override async Task> IntoCompiled() { var document = CompiledDocument.FromBuilder(this.Editor, 0); - if (document.IsErr(out var err, out var compiledDocument)) return FinFail(err.Enrich(this.ModuleSpec)); + if (document.IsErr(out var err, out var compiledDocument)) return err; return (await Compiled.CompiledScript.Create( this, diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index b7e88ada..105cadbb 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -5,6 +5,7 @@ global using static LanguageExt.Prelude; global using LanguageExt.Pipes; +using C = System.Collections.Generic; using System.Collections.Concurrent; using System.Collections.ObjectModel; using System.Management.Automation; @@ -341,8 +342,6 @@ public static async Task OutputErrors( string sourceDirectory, Option outputDirectory ) { - if (Errors.IsEmpty) return 0; - // Wait for all threads to finish before outputting errors, this is to ensure all errors are captured. do { Logger.Debug($$""" @@ -355,10 +354,20 @@ Option outputDirectory await Task.Delay(25); } while (ThreadPool.PendingWorkItemCount != 0 && ThreadPool.ThreadCount > RunspacePool.Value.GetMaxRunspaces()); + + if (Errors.IsEmpty) return 0; + + // Deduplicate errors. + var errorSet = new C.HashSet(); + foreach (var error in errors) { + if (errorSet.Contains(error)) continue; + errorSet.Add(error); + } + // Seriously .NET, why is there no fucking double ended queue. var printedBefore = false; // This is to prevent a newline before the first error var errorQueue = new Deque(); - errorQueue.AddRange(errors); + errorQueue.AddRange(errorSet); var outputDebuggables = new List(); do { var err = errorQueue.PopFirst(); @@ -380,8 +389,9 @@ Option outputDirectory outputDebuggables.Add(module.Hash); } - if (err.Inner.IsSome(out var wrappedErr)) { - errorQueue.PushFirst(wrappedErr); + if (err is WrappedErrorWithDebuggableContent wrappedErr) { + errorQueue.PushFirst(wrappedErr.InnerException); + continue; } // Flatten ManyErrors into the indiviuals @@ -402,12 +412,15 @@ Option outputDirectory printedBefore = true; } - var message = err.Message + (IsDebugging - ? (err.Exception.IsSome(out var exception) - ? Environment.NewLine + exception.Message + Environment.NewLine + exception.StackTrace - : "") - : "" - ); + var message = err switch { + Issue => err.ToString(), + _ => err.Message + (IsDebugging + ? (err.Exception.IsSome(out var exception) + ? Environment.NewLine + exception.Message + Environment.NewLine + exception.StackTrace + : "") + : "" + ) + }; if (type == LogLevel.Error) { Console.Error.WriteLine(message); diff --git a/src/Compiler/Text/Updater/ExactUpdater.cs b/src/Compiler/Text/Updater/ExactUpdater.cs index 0cffa063..11cbd170 100644 --- a/src/Compiler/Text/Updater/ExactUpdater.cs +++ b/src/Compiler/Text/Updater/ExactUpdater.cs @@ -3,13 +3,10 @@ using System.Diagnostics.CodeAnalysis; using LanguageExt; -using NLog; namespace Compiler.Text.Updater; public class ExactUpdater : TextSpanUpdater { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private readonly Func Updater; private readonly UpdateOptions UpdateOptions; @@ -48,21 +45,41 @@ [NotNull] Func updater } public override Fin> Apply([NotNull] List lines) => lines.AsOption() - .FailIf( - l => l.Count <= this.Span.StartingIndex || this.Span.EndingIndex >= l.Count, - l => Error.New($"Span indexes must be within the length of the document ({l.Count}), was {this.Span.StartingIndex}..{this.Span.EndingIndex}.")) - .FailIfOpt( - l => this.Span.StartingIndex > this.Span.EndingIndex, - l => Error.New($"Starting index must be less than ending index, was {this.Span.StartingIndex}..{this.Span.EndingIndex}.")) - .FailIfOpt( - l => this.Span.StartingColumn > l[this.Span.StartingIndex].Length, - l => Error.New($"Starting column must be less than the length of the line ({l[this.Span.StartingIndex].Length - 1}), got index {this.Span.StartingColumn}.") - ) - .FailIfOpt( - l => this.Span.EndingColumn > l[this.Span.EndingIndex].Length, - l => Error.New($"Ending column must be less than the length of the line ({l[this.Span.EndingIndex].Length - 1}), got index {this.Span.EndingColumn}.") - ) - .AndThen(opt => opt.UnwrapOr([])) + .ToFin() + // .FailIf( + // l => l.Count <= this.Span.StartingIndex || this.Span.EndingIndex >= l.Count, + // l => Error.New($"Span indexes must be within the length of the document ({l.Count}), was {this.Span.StartingIndex}..{this.Span.EndingIndex}.")) + // .FailIfOpt( + // l => this.Span.StartingIndex > this.Span.EndingIndex, + // l => Error.New($"Starting index must be less than ending index, was {this.Span.StartingIndex}..{this.Span.EndingIndex}.")) + // .FailIfOpt( + // l => this.Span.StartingColumn > l[this.Span.StartingIndex].Length, + // l => Error.New($"Starting column must be less than the length of the line ({l[this.Span.StartingIndex].Length - 1}), got index {this.Span.StartingColumn}.") + // ) + // .FailIfOpt( + // l => this.Span.EndingColumn > l[this.Span.EndingIndex].Length, + // l => Error.New($"Ending column must be less than the length of the line ({l[this.Span.EndingIndex].Length - 1}), got index {this.Span.EndingColumn}.") + // ) + .AndThenTry(l => { + if (l.Count <= this.Span.StartingIndex || this.Span.EndingIndex >= l.Count) { + throw Error.New($"Span indexes must be within the length of the document ({l.Count}), was {this.Span.StartingIndex}..{this.Span.EndingIndex}."); + } + + if (this.Span.StartingIndex > this.Span.EndingIndex) { + throw Error.New($"Starting index must be less than ending index, was {this.Span.StartingIndex}..{this.Span.EndingIndex}."); + } + + if (this.Span.StartingColumn > l[this.Span.StartingIndex].Length) { + throw Error.New($"Starting column must be less than the length of the line ({l[this.Span.StartingIndex].Length - 1}), got index {this.Span.StartingColumn}."); + } + + if (this.Span.EndingColumn > l[this.Span.EndingIndex].Length) { + throw Error.New($"Ending column must be less than the length of the line ({l[this.Span.EndingIndex].Length - 1}), got index {this.Span.EndingColumn}."); + } + + return l; + }) + // .AndThen(opt => opt.UnwrapOr([])) .Bind(lines => { Fin change; if (this.Span.StartingIndex == this.Span.EndingIndex) { diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 5a405647..f2ae2626 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,6 +20,12 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.8, )", + "resolved": "8.0.8", + "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" + }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.2, )", @@ -871,6 +877,360 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } + }, + "net8.0-windows7.0/win-x64": { + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.4", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", + "Microsoft.PowerShell.Commands.Management": "7.4.2", + "Microsoft.PowerShell.Commands.Utility": "7.4.2", + "Microsoft.PowerShell.ConsoleHost": "7.4.2", + "Microsoft.PowerShell.Security": "7.4.2", + "Microsoft.WSMan.Management": "7.4.2", + "Microsoft.Windows.Compatibility": "8.0.4", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.2", + "System.Net.Http.WinHttpHandler": "8.0.0", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.4", + "System.Management.Automation": "7.4.2", + "System.Text.Json": "6.0.9", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.2", + "System.Management.Automation": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } } } } \ No newline at end of file From 207414c8e0c080e5216cad7a70c1258102a39688 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 27 Sep 2024 18:20:41 +1000 Subject: [PATCH 168/341] fix(Compiler): Fix invalid exported resource files --- src/Compiler/Analyser/Analyser.cs | 1 - src/Compiler/Module/Resolvable/Local.cs | 4 +- src/Compiler/packages.lock.json | 360 ------------------------ 3 files changed, 2 insertions(+), 363 deletions(-) diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index 1357ce6d..ffa238ba 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -4,7 +4,6 @@ using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; -using System.Security.Cryptography; using Compiler.Analyser.Rules; using Compiler.Module.Compiled; using NLog; diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 44a960ad..dc7cbfa2 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -223,8 +223,8 @@ string moduleName } if (streamsDiffer) { - using var fileWriter = new StreamWriter(fileStream); - fileWriter.Write(embeddedStream); + fileStream.SetLength(0); // Clear the file. + embeddedStream.CopyTo(fileStream); } } diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index f2ae2626..5a405647 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,12 +20,6 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[8.0.8, )", - "resolved": "8.0.8", - "contentHash": "P8wR6MUWwYXIjPJuBaZgo5zlI/GWI6QEAo6NyVIbPefa9CCkohYu7dP2rD/mrqnjEqfRHyl+h9VZrDoGpELqYg==" - }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.2, )", @@ -877,360 +871,6 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } - }, - "net8.0-windows7.0/win-x64": { - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.4", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", - "Microsoft.PowerShell.Commands.Management": "7.4.2", - "Microsoft.PowerShell.Commands.Utility": "7.4.2", - "Microsoft.PowerShell.ConsoleHost": "7.4.2", - "Microsoft.PowerShell.Security": "7.4.2", - "Microsoft.WSMan.Management": "7.4.2", - "Microsoft.Windows.Compatibility": "8.0.4", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.2", - "System.Net.Http.WinHttpHandler": "8.0.0", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "System.Management.Automation": { - "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.2", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.4", - "System.Management.Automation": "7.4.2", - "System.Text.Json": "6.0.9", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", - "dependencies": { - "System.Security.AccessControl": "4.7.0", - "System.Security.Principal.Windows": "4.7.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.2", - "System.Management.Automation": "7.4.2", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - } } } } \ No newline at end of file From 7e766426f7ed8b4f65508ffcd49d02c1775f52b6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 27 Sep 2024 18:20:53 +1000 Subject: [PATCH 169/341] feat(Compiler): Enhance error reporting with location details --- src/Compiler/AstHelper.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index 412df923..63eb6c4c 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -7,6 +7,7 @@ using System.Management.Automation.Language; using System.Text; using Compiler.Analyser; +using Compiler.Text; using LanguageExt; using LanguageExt.UnsafeValueAccess; using NLog; @@ -273,9 +274,11 @@ public static string GetPrettyAstError( var fileName = realFilePath.UnwrapOrElse(() => parentAst.Extent.File is null ? "Unknown file" : parentAst.Extent.File); + var location = TextSpan.New(startingLine, startingColumn, endingLine, endingColumn).Unwrap(); // Safety: Extents should always be valid. + return $""" {"File".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} {fileName.Pastel(ConsoleColor.Gray)} - {"Line".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} + {"Where".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} {location.ToString().Pastel(ConsoleColor.Gray)} {string.Join('\n', printableLines)} {firstColumnIndentString}{colouredPipe} {errorPointer.Pastel(ConsoleColor.DarkRed)} {firstColumnIndentString}{colouredPipe} {message.UnwrapOrElse(static () => "Unknown Error").Pastel(ConsoleColor.DarkRed)} From 894bed06f29fe3823b75408a45ac40d14127a7e5 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 27 Sep 2024 18:21:58 +1000 Subject: [PATCH 170/341] chore(Compiler): Update launch and task configurations for script compilation --- .vscode/launch.json | 31 +++++++++++++++- .vscode/tasks.json | 90 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 116 insertions(+), 5 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 4be1a0a7..141d7089 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -35,8 +35,15 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build", - "args": ["-i", ".\\src\\automation\\", "-vvv", "-o", ".\\", "-f"], - "program": "${workspaceFolder}/src/Compiler/bin/Debug/Compiler.dll", + "program": "${workspaceFolder}/src/Compiler/bin/Debug/Compiler.exe", + "args": [ + "-i", + "${input:sourceDirectory}/${input:scriptSubdirectory}", + "-vvv", + "-o", + "${input:outputDirectory}/${input:scriptSubdirectory}", + "-f" + ], "cwd": "${workspaceFolder}", "console": "internalConsole", "stopAtEntry": false, @@ -52,5 +59,25 @@ "processId": "${command:pickProcess}", "justMyCode": true } + ], + "inputs": [ + { + "id": "sourceDirectory", + "description": "The source directory containing the scripts to compile.", + "default": "${workspaceFolder}/src", + "type": "promptString" + }, + { + "id": "outputDirectory", + "description": "The output directory for the compiled scripts.", + "default": "${workspaceFolder}/compiled2", + "type": "promptString" + }, + { + "id": "scriptSubdirectory", + "description": "A subdirectory of specific scripts relative to the source directory.", + "default": "", + "type": "promptString" + } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 589872d6..e8217cdf 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -29,7 +29,12 @@ "label": "watch", "command": "dotnet", "type": "process", - "args": ["watch", "run", "--project", "${workspaceFolder}/scripts.sln"], + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/scripts.sln" + ], "problemMatcher": "$msCompile" }, { @@ -55,15 +60,94 @@ "-assemblyfilters:'+Compiler;-Compiler.Test'", "-classfilters:'-System.Text.RegularExpressions.Generated*'" ], - "dependsOn": ["Generate coverage stats"], + "dependsOn": [ + "Generate coverage stats" + ], "problemMatcher": [] }, { "label": "Open Coverage Report", - "dependsOn": ["Generate coverage report"], + "dependsOn": [ + "Generate coverage report" + ], "type": "shell", "command": ".\\coverage_report\\index.html", "problemMatcher": [] + }, + { + "label": "Compile Scripts", + "dependsOn": [ + "build" + ], + "command": "${workspaceFolder}/src/Compiler/bin/Debug/Compiler.exe", + "args": [ + "-i", + "${input:sourceDirectory}/${input:scriptSubdirectory}", + "-o", + "${input:outputDirectory}/${input:scriptSubdirectory}", + "-f", + "-vvv" + ], + "problemMatcher": { + "fileLocation": "absolute", + "source": "Compiler Analyser", + "pattern": [ + { + "regexp": "^File\\s\\|\\s([:\\\\\\\/\\w\\s\\._!#()-]+)$", + "file": 1, + "kind": "location", + }, + { + "regexp": "^Where\\|\\s\\((\\d+)\\[(\\d+)\\]\\)[\\.]{2}\\((\\d+)\\[(\\d+)\\]\\)$", + "line": 1, + "column": 2, + "endLine": 3, + "endColumn": 4 + }, + { + "regexp": "[\\d\\s]*\\|\\s*.+$", + }, + { + "regexp": "\\s*\\|[\\s~]+$", + }, + { + "regexp": "\\s*\\|\\s(.+)$", + "message": 1 + } + ], + "severity": "error", + "applyTo": "allDocuments" + }, + "group": "none", + "presentation": { + "echo": true, + "reveal": "silent", + "focus": false, + "panel": "dedicated", + "showReuseMessage": false, + "clear": true, + "revealProblems": "onProblem" + } + } + ], + "inputs": [ + { + "id": "sourceDirectory", + "description": "The source directory containing the scripts to compile.", + "default": "${workspaceFolder}/src", + "type": "promptString" + }, + { + "id": "outputDirectory", + "description": "The output directory for the compiled scripts.", + "default": "${workspaceFolder}/compiled2", + "type": "promptString" + }, + { + "id": "scriptSubdirectory", + "description": "A subdirectory of specific scripts relative to the source directory.", + "default": "", + "type": "promptString" } ] } From 09cfad8272e646127556f4c1559b7d80ecd95d08 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 27 Sep 2024 18:22:09 +1000 Subject: [PATCH 171/341] docs(CONTRIBUTING): add contributing guidelines and commit message format --- CONTRIBUTING | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 CONTRIBUTING diff --git a/CONTRIBUTING b/CONTRIBUTING new file mode 100644 index 00000000..9ec507c1 --- /dev/null +++ b/CONTRIBUTING @@ -0,0 +1,157 @@ +# Contributing to AMTSupport Scripts + +- [Getting Started](#getting-started) +- [Security Vulnerability?](#how-to-report-a-security-vulnerability) +- [Git Commit Guidelines](#commit-message-format) + +## Getting Started + +1. **Fork the Repository** + - Click the "Fork" button at the top right of the repository page to create your own copy. + +2. **Clone Your Fork** + - Clone your forked repository to your local machine: + + ```bash + git clone https://github.com/your-username/repository-name.git + ``` + + - Replace `your-username` and `repository-name` with your GitHub username and the name of the repository. + +3. **Navigate to the Project Directory** + + ```bash + cd repository-name + ``` + +4. **Set Up the Environment** + - Required tools: + - PowerShell Core & Desktop + - .NET Core SDK + - Visual Studio Code (or any other code editor) + - Ensure that SymLink is enabled in your git configuration: + + ```bash + git config --global core.symlinks true + ``` + + - Dotnet tools: + + ```bash + dotnet install tool -g reportgenerator + ``` + +5. **Create a New Branch** + - Create a new branch for your feature or bug fix: + + ```bash + git checkout -b your-branch-name + ``` + +6. **Make Your Changes** + - Implement your changes and ensure they follow the project's coding standards. + +7. **Commit Your Changes** + - Commit your changes with a descriptive message: + + ```bash + git commit -m "chore(Compiler): cleanup unused imports" + ``` + +8. **Push to Your Fork** + - Push your changes to your forked repository: + + ```bash + git push origin your-branch-name + ``` + +9. **Create a Pull Request** + - Go to the original repository and click on "New Pull Request". Select your branch and submit the pull request. + +## Code of Conduct + +Please adhere to the [Code of Conduct](CODE_OF_CONDUCT.md) in all interactions. + +## How to report a security vulnerability + + If you find a security vulnerability, do NOT open an issue. Email instead. + Any security issues should be submitted directly to + + In order to determine whether you are dealing with a security issue, ask yourself these two questions: + +- Can I access something that's not mine, or something I shouldn't have access to? +- Can I disable something for other people? + + If the answer to either of those two questions are "yes", then you're probably dealing with a security issue. Note that even if you answer "no" to both questions, you may still be dealing with a security issue, so if you're unsure, just email me at . + +## Conventions + + + +## Git Commit Guidelines + +We have very precise rules over how our git commit messages can be formatted. This leads to **more +readable messages** that are easy to follow when looking through the **project history**. + + + +### Commit Message Format + +Each commit message consists of a **header**, a **body** and a **footer**. The header has a special +format that includes a **type**, a **scope**, and a **subject**: + +```html +(): + + + +
      +``` + +> Any line of the commit message cannot be longer 130 characters!
      +> This allows the message to be easier to read on GitHub as well as in various Git tools. + +#### Type + +Must be one of the following: + +- **feat**: A new feature +- **fix**: A bug fix +- **docs**: Documentation only changes +- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing + semi-colons, etc) +- **refactor**: A code change that neither fixes a bug nor adds a feature +- **perf**: A code change that improves performance +- **test**: Adding missing tests +- **chore**: Changes to the auxiliary tools such as release scripts +- **build**: Changes to the dependencies, devDependencies, or build tooling +- **ci**: Changes to our Continuous Integration configuration + +#### Scope + +The scope could be anything that helps specify the scope (or feature) that is changing. + +Examples + +- fix(script): +- docs(compiler): + +#### Subject + +The subject contains a succinct description of the change: + +- use the imperative, present tense: "change" not "changed" nor "changes" +- don't capitalize first letter +- no period (.) at the end + +#### Body + +Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes". +The body should include the motivation for the change and contrast this with previous behavior. + +#### Footer + +The footer should contain any information about **Breaking Changes** and is also the place to +reference GitHub issues that this commit **Closes**, **Fixes**, or **Relates to**. From a59c25de8d30999b74b0bed7a84d8e3841e63d03 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 21 Oct 2024 13:13:16 +1100 Subject: [PATCH 172/341] refactor(Compiler): Update SuppressAnalyserAttribute to improve error handling --- src/Compiler/Analyser/Rules/RuleVisitor.cs | 16 +++- src/Compiler/Analyser/Suppression.cs | 106 +++++++++++++++++---- src/Compiler/Utils.cs | 8 ++ tests/Compiler/Analyser/Suppression.cs | 11 ++- tests/Compiler/AstHelper.cs | 2 +- 5 files changed, 112 insertions(+), 31 deletions(-) diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs index dad75733..5a93d987 100644 --- a/src/Compiler/Analyser/Rules/RuleVisitor.cs +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -3,6 +3,7 @@ using System.Management.Automation.Language; using Compiler.Module.Compiled; +using LanguageExt; namespace Compiler.Analyser.Rules; @@ -16,9 +17,13 @@ public sealed class RuleVisitor( public readonly List Issues = []; public override AstVisitAction DefaultVisit(Ast ast) { - var supressions = GetSupressions(ast); + if (GetSupressions(ast).IsErr(out var err, out var suppressions)) { + this.Issues.AddRange(((ManyErrors)err).Errors.Cast()); + return AstVisitAction.SkipChildren; + }; + foreach (var rule in this.Rules) { - if (!rule.ShouldProcess(ast, supressions)) continue; + if (!rule.ShouldProcess(ast, suppressions)) continue; foreach (var issue in rule.Analyse(ast, this.Imports)) { this.Issues.Add(issue); } @@ -27,10 +32,11 @@ public override AstVisitAction DefaultVisit(Ast ast) { return AstVisitAction.Continue; } - public static IEnumerable GetSupressions(Ast ast) { + public static Fin> GetSupressions(Ast ast) { var paramBlock = AstHelper.FindClosestParamBlock(ast); return paramBlock == null - ? ([]) - : SuppressAnalyserAttribute.FromAttributes(paramBlock.Attributes).Select(attr => attr.GetSupression()); + ? FinSucc(Enumerable.Empty()) + : SuppressAnalyserAttribute.FromAttributes(paramBlock.Attributes) + .Map(suppressions => suppressions.Select(suppression => suppression.GetSupression())); } } diff --git a/src/Compiler/Analyser/Suppression.cs b/src/Compiler/Analyser/Suppression.cs index 92d40553..775bea97 100644 --- a/src/Compiler/Analyser/Suppression.cs +++ b/src/Compiler/Analyser/Suppression.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Management.Automation.Language; +using LanguageExt; namespace Compiler.Analyser; @@ -29,14 +30,28 @@ public Suppression GetSupression() { return new Suppression(type, data, justification); } - public static IEnumerable FromAttributes(IEnumerable attributes) { + [return: NotNull] + public static Fin> FromAttributes(IEnumerable attributes) { + var suppressions = new List(); + var issues = ManyErrors.Empty; + foreach (var attr in attributes) { - var suppression = FromAttributeAst(attr); - if (suppression is not null) yield return suppression; + var suppressionResult = FromAttributeAst(attr); + if (suppressionResult.IsErr(out var err, out var suppressionOpt)) { + issues = issues.Combine(err); + continue; + } else if (suppressionOpt.IsSome(out var suppression)) { + suppressions.Add(suppression); + } } + + return issues.Count == 0 + ? FinSucc>(suppressions) + : FinFail>(issues); } - public static SuppressAnalyserAttribute? FromAttributeAst([NotNull] AttributeAst attrAst) { + [return: NotNull] + public static Fin> FromAttributeAst([NotNull] AttributeAst attrAst) { ArgumentNullException.ThrowIfNull(attrAst); var typeName = attrAst.TypeName; @@ -46,7 +61,7 @@ public static IEnumerable FromAttributes(IEnumerable< if (!(typeName.GetReflectionAttributeType() == typeof(SuppressAnalyserAttribute) || (hasNamespace && attributeSuffixed == typeof(SuppressAnalyserAttribute).FullName) || (!hasNamespace && attributeSuffixed == nameof(SuppressAnalyserAttribute)) - )) return null; + )) return FinSucc>(None); string? checkType = null; object? data = null; @@ -55,21 +70,30 @@ public static IEnumerable FromAttributes(IEnumerable< var positionalArguments = attrAst.PositionalArguments; var namedArguments = attrAst.NamedArguments; - var lastPositionalArgumentsOffset = -1; + Issue IncorrectDataType(string name, string expected, IScriptExtent extent) => Issue.Error( + $"{name} must be a {expected}", + extent, + attrAst.GetRootParent() + ); + var lastPositionalArgumentsOffset = -1; if (positionalArguments != null && positionalArguments.Count != 0) { var count = positionalArguments.Count; lastPositionalArgumentsOffset = positionalArguments[^1].Extent.StartOffset; switch (count) { case 3: - if (positionalArguments[2] is not StringConstantExpressionAst justificationAst) throw new ArgumentException("Justification must be a string constant"); + if (positionalArguments[2] is not StringConstantExpressionAst justificationAst) { + return IncorrectDataType("Justification", "string constant", positionalArguments[2].Extent); + } justification = justificationAst.Value; goto case 2; case 2: data = positionalArguments[1].SafeGetValue(); goto case 1; case 1: - if (positionalArguments[0] is not StringConstantExpressionAst checkTypeAst) throw new ArgumentException("CheckType must be a string constant"); + if (positionalArguments[0] is not StringConstantExpressionAst checkTypeAst) { + return IncorrectDataType("CheckType", "string constant", positionalArguments[0].Extent); + } checkType = checkTypeAst.Value; goto default; default: @@ -79,30 +103,72 @@ public static IEnumerable FromAttributes(IEnumerable< if (namedArguments != null && namedArguments.Count != 0) { foreach (var name in namedArguments) { - if (name.Extent.StartOffset < lastPositionalArgumentsOffset) throw new ArgumentException("Named arguments must come after positional arguments"); + if (name.Extent.StartOffset < lastPositionalArgumentsOffset) { + return Issue.Error( + "Named arguments must come after positional arguments", + name.Extent, + attrAst.GetRootParent() + ); + } var argumentName = name.ArgumentName; if (argumentName.Equals("checkType", StringComparison.OrdinalIgnoreCase)) { - if (!string.IsNullOrWhiteSpace(checkType)) throw new ArgumentException("Named and positional arguments conflict for checkType"); - - if (name.Argument is not StringConstantExpressionAst checkTypeAst) throw new ArgumentException("CheckType must be a string constant"); + if (!string.IsNullOrWhiteSpace(checkType)) { + return Issue.Error( + "Named and positional arguments conflict for checkType", + name.Extent, + attrAst.GetRootParent() + ); + } + + if (name.Argument is not StringConstantExpressionAst checkTypeAst) { + return Issue.Error( + "CheckType must be a string constant", + name.Extent, + attrAst.GetRootParent() + ); + } checkType = checkTypeAst.Value; } else if (argumentName.Equals("data", StringComparison.OrdinalIgnoreCase)) { - if (data is not null) throw new ArgumentException("Named and positional arguments conflict for data"); + if (data is not null) { + return Issue.Error( + "Named and positional arguments conflict for data", + name.Extent, + attrAst.GetRootParent() + ); + } data = name.Argument.SafeGetValue(); } else if (argumentName.Equals("justification", StringComparison.OrdinalIgnoreCase)) { - if (!string.IsNullOrWhiteSpace(justification)) throw new ArgumentException("Named and positional arguments conflict for justification"); - - if (name.Argument is not StringConstantExpressionAst justificationAst) throw new ArgumentException("Justification must be a string constant"); + if (!string.IsNullOrWhiteSpace(justification)) { + return Issue.Error( + "Named and positional arguments conflict for justification", + name.Extent, + attrAst.GetRootParent() + ); + } + + if (name.Argument is not StringConstantExpressionAst justificationAst) { + return Issue.Error( + "Justification must be a string constant", + name.Extent, + attrAst.GetRootParent() + ); + } justification = justificationAst.Value; } } } - if (string.IsNullOrWhiteSpace(checkType)) throw new ArgumentException("CheckType is required"); - if (string.IsNullOrWhiteSpace(justification)) throw new ArgumentException("Justification is required"); - if (data is null) throw new ArgumentException("Data is required"); + Issue IsRequired(string name) => Issue.Error( + $"{name} is required", + attrAst.Extent, + attrAst.GetRootParent() + ); + + if (string.IsNullOrWhiteSpace(checkType)) return IsRequired("CheckType"); + if (string.IsNullOrWhiteSpace(justification)) return IsRequired("Justification"); + if (data is null) return IsRequired("Data"); switch (data) { case string: @@ -113,6 +179,6 @@ public static IEnumerable FromAttributes(IEnumerable< throw new ArgumentException($"Data must be a string or an array of strings, got {data.GetType().Name}"); } - return new SuppressAnalyserAttribute(checkType, data, justification); + return Some(new SuppressAnalyserAttribute(checkType, data, justification)); } } diff --git a/src/Compiler/Utils.cs b/src/Compiler/Utils.cs index 6eee8df1..e2f0e653 100644 --- a/src/Compiler/Utils.cs +++ b/src/Compiler/Utils.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; +using System.Management.Automation.Language; using System.Runtime.CompilerServices; using LanguageExt; using LanguageExt.UnsafeValueAccess; @@ -309,4 +310,11 @@ public static bool IsErr( [NotNullWhen(false)] out T? value ) => !fin.IsOk(out value, out error); #endregion + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Ast GetRootParent(this Ast ast) { + var parent = ast.Parent; + while (parent?.Parent != null) parent = parent.Parent; + return parent ?? ast; + } } diff --git a/tests/Compiler/Analyser/Suppression.cs b/tests/Compiler/Analyser/Suppression.cs index bc305612..2c03b6c1 100644 --- a/tests/Compiler/Analyser/Suppression.cs +++ b/tests/Compiler/Analyser/Suppression.cs @@ -5,6 +5,7 @@ using System.Management.Automation.Language; using Compiler.Analyser; using Compiler.Analyser.Rules; +using LanguageExt; namespace Compiler.Test.Analyser; @@ -15,8 +16,8 @@ public void FromAttributeAst_ReturnsNull(string astContent) { var attributes = TestData.GetAttributes(astContent); Assert.Multiple(() => { foreach (var attribute in attributes) { - var result = SuppressAnalyserAttribute.FromAttributeAst(attribute); - Assert.That(result, Is.Null); + var result = SuppressAnalyserAttribute.FromAttributeAst(attribute).Unwrap(); + Assert.That(result, Is.EqualTo(Option.None)); } }); } @@ -26,10 +27,10 @@ public void FromAttributeAst_ReturnsSuppression(string astContent, List { - var suppression = result?.GetSupression(); + var suppression = attr.GetSupression(); Assert.That(suppression?.Type, Is.EqualTo(expected[i].Type)); Assert.That(suppression?.Justification, Is.EqualTo(expected[i].Justification)); diff --git a/tests/Compiler/AstHelper.cs b/tests/Compiler/AstHelper.cs index bf84240e..4e0d9438 100644 --- a/tests/Compiler/AstHelper.cs +++ b/tests/Compiler/AstHelper.cs @@ -38,7 +38,7 @@ public void FindClosestParamBlock_ReturnsParamBlock( Assert.That(result?.Attributes, Is.Not.Null); Assert.That(result?.Attributes, Has.Count.EqualTo(1)); - var attributes = SuppressAnalyserAttribute.FromAttributes(result!.Attributes); + var attributes = SuppressAnalyserAttribute.FromAttributes(result!.Attributes).Unwrap(); var attribute = attributes.First(); Assert.That(attribute, Is.Not.Null); Assert.That(attribute, Is.TypeOf()); From d3b169e9474af3523cd45c6ca31cbe2469393c35 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 21 Oct 2024 13:13:32 +1100 Subject: [PATCH 173/341] fix(Compiler): Ensure only the first module is saved to the cache --- src/Compiler/Module/Resolvable/Remote.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compiler/Module/Resolvable/Remote.cs b/src/Compiler/Module/Resolvable/Remote.cs index bc4dd729..e11b9a4c 100644 --- a/src/Compiler/Module/Resolvable/Remote.cs +++ b/src/Compiler/Module/Resolvable/Remote.cs @@ -171,7 +171,7 @@ public async Task> CacheResult() { Set-PSResourceRepository -Name PSGallery -Trusted -Confirm:$False; $Module = Find-PSResource -Name '{{this.ModuleSpec.Name}}' {{(versionString != null ? $"-Version '{versionString}'" : "")}}; - $Module | Save-PSResource -Path '{{this.CachePath}}' -AsNupkg -SkipDependencyCheck; + $Module | Select-Object -First 1 | Save-PSResource -Path '{{this.CachePath}}' -AsNupkg -SkipDependencyCheck; return "{{this.CachePath}}/{{this.ModuleSpec.Name}}.$($Module.Version).nupkg"; """; From 9bff89d661231efca8b69d7239cf1c6ecb9a4dd6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 21 Oct 2024 13:13:53 +1100 Subject: [PATCH 174/341] chore(Compiler): Package Lock Update --- src/Compiler/packages.lock.json | 360 ++++++++++++++++++++++++++++++++ 1 file changed, 360 insertions(+) diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 5a405647..13192f1b 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,6 +20,12 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.10, )", + "resolved": "8.0.10", + "contentHash": "xT8jYjlroY7SLbGtoV9vUTVW/TPgodL4Egc31a444Xe0TMytLZ3UlKQ0kxMZsy/CrWsFB6wtKnSG1SsXcWreew==" + }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.2, )", @@ -871,6 +877,360 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } + }, + "net8.0-windows7.0/win-x64": { + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.4", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", + "Microsoft.PowerShell.Commands.Management": "7.4.2", + "Microsoft.PowerShell.Commands.Utility": "7.4.2", + "Microsoft.PowerShell.ConsoleHost": "7.4.2", + "Microsoft.PowerShell.Security": "7.4.2", + "Microsoft.WSMan.Management": "7.4.2", + "Microsoft.Windows.Compatibility": "8.0.4", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.2", + "System.Net.Http.WinHttpHandler": "8.0.0", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.4", + "System.Management.Automation": "7.4.2", + "System.Text.Json": "6.0.9", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.2", + "System.Management.Automation": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } } } } \ No newline at end of file From 9ee7bb0a49f2f574e87f3b557c42093b5262ca4e Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 12:48:04 +1100 Subject: [PATCH 175/341] feat(Analyser): Enhance rules with module support function. --- src/Compiler/Analyser/Analyser.cs | 3 ++- src/Compiler/Analyser/Rules/Rule.cs | 14 ++++++++++++++ src/Compiler/Analyser/Rules/RuleVisitor.cs | 14 +++++++++++++- .../Analyser/Rules/UseOfUndefinedFunction.cs | 2 ++ src/Compiler/Module/Compiled/Compiled.cs | 2 +- 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/Compiler/Analyser/Analyser.cs b/src/Compiler/Analyser/Analyser.cs index ffa238ba..4a490171 100644 --- a/src/Compiler/Analyser/Analyser.cs +++ b/src/Compiler/Analyser/Analyser.cs @@ -14,6 +14,7 @@ public static class Analyser { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly IEnumerable Rules = [ + new MissingCmdlet(), new UseOfUndefinedFunction() ]; @@ -34,7 +35,7 @@ public static async Task> Analyse(CompiledLocalModule module, IEnume Logger.Trace($"Analyzing module {module.ModuleSpec.Name}"); var visitor = new RuleVisitor(Rules, availableImports); - module.Document.Ast.Visit(visitor); + visitor.VisitModule(module); return visitor.Issues; })); } diff --git a/src/Compiler/Analyser/Rules/Rule.cs b/src/Compiler/Analyser/Rules/Rule.cs index ac6b0dfe..9597a5d3 100644 --- a/src/Compiler/Analyser/Rules/Rule.cs +++ b/src/Compiler/Analyser/Rules/Rule.cs @@ -7,6 +7,14 @@ namespace Compiler.Analyser.Rules; public abstract class Rule { + /// + /// Determines if the rule supports the module, + /// this can be used to determine rules only for the script itself or remote modules etc. + /// + /// The Compiled Module Type + /// True if this rule should be applied to the supplied module + public abstract bool SupportsModule(T compiledModule) where T : Compiled; + /// /// Determines if the rule should be processed for this Ast node. /// @@ -21,6 +29,12 @@ public abstract bool ShouldProcess( IEnumerable supressions ); + /// + /// Analyse the Ast node and return any issues found. + /// + /// The AST Node that is being analysed + /// Any available imports to check against + /// A list of issues found public abstract IEnumerable Analyse( Ast node, IEnumerable importedModules diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs index 5a93d987..ec7111a6 100644 --- a/src/Compiler/Analyser/Rules/RuleVisitor.cs +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -1,6 +1,7 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Diagnostics.CodeAnalysis; using System.Management.Automation.Language; using Compiler.Module.Compiled; using LanguageExt; @@ -13,9 +14,19 @@ public sealed class RuleVisitor( private readonly IEnumerable Rules = rules; private readonly IEnumerable Imports = imports; - + private readonly Dictionary> ThreadLocalCache = []; public readonly List Issues = []; + public void VisitModule([NotNull] CompiledLocalModule compiledModule) { + this.ThreadLocalCache.Add(Environment.CurrentManagedThreadId, []); + foreach (var rule in this.Rules) { + this.ThreadLocalCache[Environment.CurrentManagedThreadId].Add(rule, rule.SupportsModule(compiledModule)); + } + + compiledModule.Document.Ast.Visit(this); + this.ThreadLocalCache.Remove(Environment.CurrentManagedThreadId); + } + public override AstVisitAction DefaultVisit(Ast ast) { if (GetSupressions(ast).IsErr(out var err, out var suppressions)) { this.Issues.AddRange(((ManyErrors)err).Errors.Cast()); @@ -23,6 +34,7 @@ public override AstVisitAction DefaultVisit(Ast ast) { }; foreach (var rule in this.Rules) { + if (!this.ThreadLocalCache[Environment.CurrentManagedThreadId][rule]) continue; if (!rule.ShouldProcess(ast, suppressions)) continue; foreach (var issue in rule.Analyse(ast, this.Imports)) { this.Issues.Add(issue); diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index 1fc8d85d..66ab6441 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -18,6 +18,8 @@ public class UseOfUndefinedFunction : Rule { ///
      private static readonly IEnumerable BuiltinsFunctions = GetDefaultSessionFunctions(); + public override bool SupportsModule(T compiledModule) => compiledModule is CompiledLocalModule; + public override bool ShouldProcess( Ast node, IEnumerable supressions) { diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 07ac8e08..8a12e1ba 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -37,7 +37,7 @@ protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] var byteList = new List((byte[])hashableBytes.Clone()); AddRequirementHashBytes(byteList, requirements); - this.ComputedHash = Convert.ToHexString(SHA256.HashData(byteList.ToArray())); + this.ComputedHash = Convert.ToHexString(SHA256.HashData([.. byteList])); } From b827649dc645bb90f26a6f16260e258be77162c6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 12:49:07 +1100 Subject: [PATCH 176/341] fix(Compiler): Fix race condition preventing all analysers to finish sometimes --- src/Compiler/Module/Compiled/Script.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 09e3b951..bc52c46f 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -82,7 +82,13 @@ RequirementGroup requirements var imports = script.Graph.OutEdges(compiled).Select(edge => edge.Target); (await Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports])) .ForEach(issue => Program.Errors.Add(issue.Enrich(compiled.ModuleSpec))); - }); + } + + await Task.WhenAll(script.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).Select(async compiled => { + var imports = script.Graph.OutEdges(compiled).Select(edge => edge.Target); + var issues = await Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports]); + issues.ForEach(issue => Program.Errors.Add(issue.Enrich(compiled.ModuleSpec))); + })); return script; } From ba6aaaaafa0d6253afbdbc57b96d353e6726c0f1 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 12:49:25 +1100 Subject: [PATCH 177/341] feat(Analyser): Add MissingCmdlet rule to enforce CmdletBinding attribute in top-level param block of scripts --- src/Compiler/Analyser/Rules/MissingCmdlet.cs | 36 ++++++ .../Compiler/Analyser/Rules/MissingCmdlet.cs | 103 ++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 src/Compiler/Analyser/Rules/MissingCmdlet.cs create mode 100644 tests/Compiler/Analyser/Rules/MissingCmdlet.cs diff --git a/src/Compiler/Analyser/Rules/MissingCmdlet.cs b/src/Compiler/Analyser/Rules/MissingCmdlet.cs new file mode 100644 index 00000000..31a524f2 --- /dev/null +++ b/src/Compiler/Analyser/Rules/MissingCmdlet.cs @@ -0,0 +1,36 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Management.Automation; +using System.Management.Automation.Language; +using Compiler.Module.Compiled; + +namespace Compiler.Analyser.Rules; + +/// +/// Ensures that the script contains a param block with the CmdletBinding Attribute at the top level. +/// +public class MissingCmdlet : Rule { + public override bool SupportsModule(T compiledModule) => compiledModule is CompiledScript; + + public override bool ShouldProcess( + Ast node, + IEnumerable supressions + ) => node is ScriptBlockAst scriptBlockAst && scriptBlockAst.Parent == null; + + public override IEnumerable Analyse( + Ast node, + IEnumerable importedModules + ) { + var scriptBlockAst = (ScriptBlockAst)node; + if (scriptBlockAst.ParamBlock != null && scriptBlockAst.ParamBlock.Attributes.Count > 0 && scriptBlockAst.ParamBlock.Attributes.Any(attribute => attribute.TypeName.GetReflectionType() == typeof(CmdletBindingAttribute))) { + yield break; + } + + yield return Issue.Error( + "Missing Top Level Script Paramter Block with [CmdletBinding] Attribute", + scriptBlockAst.Extent, + scriptBlockAst + ); + } +} diff --git a/tests/Compiler/Analyser/Rules/MissingCmdlet.cs b/tests/Compiler/Analyser/Rules/MissingCmdlet.cs new file mode 100644 index 00000000..696b8de5 --- /dev/null +++ b/tests/Compiler/Analyser/Rules/MissingCmdlet.cs @@ -0,0 +1,103 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using Compiler.Analyser.Rules; +using static LanguageExt.Prelude; + +namespace Compiler.Test.Analyser.Rules; + +[TestFixture] +public class MissingCmdletTests { + [TestCaseSource(typeof(Data), nameof(Data.TestCases))] + public bool Test(string script) { + var visitor = new RuleVisitor([new MissingCmdlet()], []); + var ast = AstHelper.GetAstReportingErrors(script, None, [], out _).Unwrap(); + visitor.DefaultVisit(ast); + return visitor.Issues.Count > 0; + } + + private static class Data { + public static IEnumerable TestCases { + get { + yield return new TestCaseData(""" + #Requires -Version 5.1 + + Using module ../common/Environment.psm1 + Using module ../common/Logging.psm1 + Using module ../common/Exit.psm1 + Using module ../common/Ensure.psm1 + + Using namespace Microsoft.BitLocker.Structures + + #region - Error Codes + $Script:ERROR_BITLOCKER_DISABLED = Register-ExitCode 'BitLocker is not enabled on the system drive.'; + $Script:ERROR_NO_RECOVERY_PASSWORD = Register-ExitCode 'BitLocker is not configured to use a recovery password.'; + $Script:ERROR_DURING_UPLOAD = Register-ExitCode 'An error occurred while uploading the recovery key to Azure AD.'; + #endregion - Error Codes + + Invoke-RunMain $PSCmdlet { + Invoke-EnsureAdministrator; + + # Safety: This should never have a null value, as we are using the system drive environment variable. + [BitLockerVolume]$Local:Volume = Get-BitLockerVolume -MountPoint $env:SystemDrive; + [BitLockerVolumeKeyProtector]$Local:RecoveryProtector = ($Local:Volume.KeyProtector | Where-Object { $_.KeyProtectorType -eq [Microsoft.BitLocker.Structures.BitLockerVolumeKeyProtectorType]::RecoveryPassword }); + + if (($Local:Volume.ProtectionStatus -eq 'Off') -or $Local:Volume.KeyProtector.Count -eq 0) { + Invoke-FailedExit -ExitCode $Script:ERROR_BITLOCKER_DISABLED; + } + + if ($null -eq $Local:RecoveryProtector) { + Invoke-FailedExit -ExitCode $Script:ERROR_NO_RECOVERY_PASSWORD; + } + + try { + BackupToAAD-BitLockerKeyProtector -MountPoint $env:SystemDrive -KeyProtectorId $Local:RecoveryProtector.KeyProtectorID | Out-Null; + Invoke-Info 'BitLocker recovery key successfully backed up to Azure AD.'; + } catch { + Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:ERROR_DURING_UPLOAD; + } + }; + """).Returns(true); + + yield return new TestCaseData( + "function Test-Function { }" + ).SetDescription("No Top Level Parameter Block").Returns(true); + + yield return new TestCaseData( + "param()" + ).SetDescription("No CmdletBinding Attribute").Returns(true); + + yield return new TestCaseData(""" + [CmdletBinding()] + param() + """).SetDescription("CmdletBinding Attribute").Returns(false); + + yield return new TestCaseData(""" + param() + + function Test-Function { + [CmdletBinding()] + param() + } + """).SetDescription("No Top Level CmdletBinding Attribute, but inside function").Returns(true); + + yield return new TestCaseData(""" + function Test-Function { + [CmdletBinding()] + param() + } + """).SetDescription("No Top Level Param block or CmdletBinding Attribute, but inside function").Returns(true); + + yield return new TestCaseData(""" + [CmdletBinding()] + param() + + function Test-Function { + [CmdletBinding()] + param() + } + """).SetDescription("Top Level CmdletBinding Attribute, and inside function").Returns(false); + } + } + } +} From ad84dfb2906a45dbffabb9e87a65b25e10a1dcf8 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 12:51:00 +1100 Subject: [PATCH 178/341] feat(Compiler): Better templating support. No Longer hardcoding the supported template replacements, now a lot more dynamic. Also makes it so the script template is only lazily loaded once instead of for every object. --- src/Compiler/Module/Compiled/Script.cs | 86 ++++++++++++++++++----- src/Compiler/Program.cs | 2 +- src/Compiler/Resources/ScriptTemplate.ps1 | 16 ++--- src/Compiler/Text/Document.cs | 12 ++-- 4 files changed, 87 insertions(+), 29 deletions(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index bc52c46f..c566bc72 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -1,8 +1,11 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Management.Automation.Language; using System.Reflection; using System.Text; +using System.Text.RegularExpressions; +using Compiler.Analyser; using Compiler.Module.Resolvable; using Compiler.Requirements; using Compiler.Text; @@ -12,11 +15,18 @@ namespace Compiler.Module.Compiled; -public class CompiledScript( +public partial class CompiledScript( PathedModuleSpec moduleSpec, CompiledDocument document, RequirementGroup requirements ) : CompiledLocalModule(moduleSpec, document, requirements) { + private static readonly Lazy Template = new(() => { + var info = Assembly.GetExecutingAssembly().GetName(); + using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.ScriptTemplate.ps1")!; + using var streamReader = new StreamReader(templateStream, Encoding.UTF8); + return streamReader.ReadToEnd(); + }); + public virtual BidirectionalGraph> Graph { get; } = new(); /// @@ -78,9 +88,9 @@ RequirementGroup requirements } } - script.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(async compiled => { - var imports = script.Graph.OutEdges(compiled).Select(edge => edge.Target); - (await Analyser.Analyser.Analyse((CompiledLocalModule)compiled, [.. imports])) + foreach (var edge in script.Graph.Vertices) { + if (edge is not CompiledLocalModule compiled) { continue; } + (await Analyser.Analyser.Analyse(compiled, script.Graph.OutEdges(compiled).Select(edge => edge.Target))) .ForEach(issue => Program.Errors.Add(issue.Enrich(compiled.ModuleSpec))); } @@ -94,11 +104,7 @@ await Task.WhenAll(script.Graph.Vertices.Where(compiled => compiled is CompiledL } public override string GetPowerShellObject() { - var info = Assembly.GetExecutingAssembly().GetName(); - using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.ScriptTemplate.ps1")!; - using var streamReader = new StreamReader(templateStream, Encoding.UTF8); - var template = streamReader.ReadToEnd(); - + var template = Template.Value; var embeddedModules = new StringBuilder(); embeddedModules.AppendLine("$Script:EMBEDDED_MODULES = @("); this.Graph.Vertices.ToList().ForEach(module => { @@ -131,14 +137,18 @@ public override string GetPowerShellObject() { .Aggregate((a, b) => $"{a}, {b}") : string.Empty; - // TODO - Implement a way to replace #!DEFINE macros in the template. - // This could also be how we can implement secure variables during compilation. - template = template - .Replace("#!DEFINE EMBEDDED_MODULES", embeddedModules.ToString()) - .Replace("#!DEFINE PARAM_BLOCK", paramBlock.ToString()) - .Replace("#!DEFINE IMPORT_ORDER", $"$Script:REMOVE_ORDER = @({importOrder});"); + var replacements = new Dictionary { + { "EMBEDDED_MODULES", embeddedModules.ToString() }, + { "PARAM_BLOCK", paramBlock.ToString() }, + { "IMPORT_ORDER", $"$Script:REMOVE_ORDER = @({importOrder});" } + }; + + if (FillTemplate(template, replacements).IsErr(out var error, out var filledTemplate)) { + Program.Errors.Add(error); + return string.Empty; + }; - return template; + return filledTemplate; } /// @@ -172,4 +182,48 @@ private static string IndentString(string str, int indentBy, IEnumerable? s return string.Join('\n', indentedLines); } + + private static Fin FillTemplate(string template, Dictionary replacements) { + if (AstHelper.GetAstReportingErrors(template, None, [], out var tokens).IsErr(out var err, out var ast)) { + return err; + } + + if (tokens.Length == 0) { return template; } + + var defines = tokens + .Where(token => token.Kind == TokenKind.Comment) + .Select(token => (DefineRegex().Match(token.Text), token.Extent)) + .Where(match => match.Item1.Success) + .Select(match => (match.Item1.Groups, match.Extent)) + .ToList(); + + var editor = new TextEditor(new TextDocument(template.Split('\n'))); + defines.ForEach(define => { + var (groups, extent) = define; + var name = groups["name"].Value; + var args = groups["args"]?.Value; + var removeBefore = args?.Contains('<') ?? false; + var removeAfter = args?.Contains('>') ?? false; + + if (replacements.TryGetValue(name, out var replacement)) { + editor.AddExactEdit( + extent.StartLineNumber - 1, + removeBefore ? 0 : (extent.StartColumnNumber - 1), + extent.EndLineNumber - 1, + removeAfter + ? editor.Document.GetLines((_, index) => index >= extent.EndLineNumber)[extent.EndLineNumber - 1].Length + : (extent.EndColumnNumber - 1), + UpdateOptions.InsertInline, + _ => replacement.Split('\n') + ); + } else { + Program.Errors.Add(Issue.Error($"Could not find a replacement for the define '{name}'", extent, ast)); + } + }); + + return CompiledDocument.FromBuilder(editor).Map(doc => doc.GetContent()); + } + + [GeneratedRegex(@"!DEFINE\s+(?\w+)(?:\s+(?[<>]+))?", RegexOptions.Multiline)] + private static partial Regex DefineRegex(); } diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 105cadbb..27590a06 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -38,7 +38,7 @@ public class Program { public static readonly Lazy RunspacePool = new(() => { var sessionState = InitialSessionState.CreateDefault2(); sessionState.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Bypass; - sessionState.ImportPSModule(new[] { "Microsoft.PowerShell.PSResourceGet" }); + sessionState.ImportPSModule(["Microsoft.PowerShell.PSResourceGet"]); var rsPool = RunspaceFactory.CreateRunspacePool(sessionState); rsPool.SetMinRunspaces(1); diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index 0c38bb24..c9b3ed26 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -1,13 +1,13 @@ -# [Diagnostics.CodeAnalysis.SuppressMessageAttribute( -# 'PSAvoidGlobalVars', -# $null, -# Justification = 'Required to inform modules of runtime type.' -# )] -#!DEFINE PARAM_BLOCK +[Diagnostics.CodeAnalysis.SuppressMessageAttribute( + 'PSAvoidGlobalVars', + 'Global:CompiledScript', + Justification = 'Required to inform modules of runtime type.' +)] +<#!DEFINE PARAM_BLOCK >#> param() begin { [Boolean]$Global:CompiledScript = $True; - #!DEFINE EMBEDDED_MODULES - #!DEFINE IMPORT_ORDER + <#!DEFINE EMBEDDED_MODULES#> + <#!DEFINE IMPORT_ORDER#> [String]$Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index 92e1e447..6676bfe8 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -27,7 +27,7 @@ public TextDocument(string path) { public Fin GetRequirementsAst() { if (this.RequirementsAst is not null) return this.RequirementsAst; - this.GetLines(line => { + this.GetLines((line, _) => { line = line.Trim(); return string.IsNullOrWhiteSpace(line) || line.StartsWith("#requires", StringComparison.OrdinalIgnoreCase) || @@ -43,11 +43,13 @@ out _ } [return: NotNull] - public IEnumerable GetLines(Predicate? readerStopCondition = null) { + public List GetLines(Func? readerStopCondition = null) { if (this.FileStream is not null) { + var lineIndex = this.Lines.Count; while (!this.FileStream.EndOfStream && this.FileStream.ReadLine() is string line) { + lineIndex++; this.Lines.Add((string)line.Clone()); // Clone the line incase it is modified in the predicate. - if (readerStopCondition is not null && readerStopCondition(line)) { + if (readerStopCondition is not null && readerStopCondition(line, lineIndex)) { break; } } @@ -58,7 +60,9 @@ public IEnumerable GetLines(Predicate? readerStopCondition = nul } } - return this.Lines; + var copiedLines = new string[this.Lines.Count]; + this.Lines.CopyTo(copiedLines); + return [.. copiedLines]; } public void Dispose() { From ac6e497a375760a1d06ddbb0742d82343b8fedae Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 12:51:53 +1100 Subject: [PATCH 179/341] fix(Compiler): Fix assembly issues from pre-imported module versions in powershell. --- src/Compiler/Resources/ScriptTemplate.ps1 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index c9b3ed26..c75020d3 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -72,12 +72,13 @@ begin { } process { try { - & $Script:ScriptPath @PSBoundParameters; + $Result = Start-Job { & $Using:ScriptPath @PSBoundParameters } | Receive-Job -Wait -AutoRemoveJob; } finally { $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; $Script:REMOVE_ORDER | ForEach-Object { Get-Module -Name $_ | Remove-Module -Force; } } -} -end { + + return $Result; +} end { Remove-Variable -Name CompiledScript -Scope Global; } From a5fe521a1d1dffd07b0774450884a7fe935b4c64 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 13:46:20 +1100 Subject: [PATCH 180/341] feat(Analyser): Enhance MissingCmdlet rule to provide detailed error location for missing CmdletBinding attribute --- src/Compiler/Analyser/Rules/MissingCmdlet.cs | 43 +++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Analyser/Rules/MissingCmdlet.cs b/src/Compiler/Analyser/Rules/MissingCmdlet.cs index 31a524f2..1725c9f8 100644 --- a/src/Compiler/Analyser/Rules/MissingCmdlet.cs +++ b/src/Compiler/Analyser/Rules/MissingCmdlet.cs @@ -29,8 +29,49 @@ IEnumerable importedModules yield return Issue.Error( "Missing Top Level Script Paramter Block with [CmdletBinding] Attribute", - scriptBlockAst.Extent, + GetErrorLocation(scriptBlockAst), scriptBlockAst ); } + + /// + /// Gets the error location for the issue. + /// + /// If the script block has a top level param block, then its extent is returned. + /// Otherwise an extent covering the location after the using statements, + /// but before the first command, function or variable assignment is returned. + /// + /// + /// + private static IScriptExtent GetErrorLocation(ScriptBlockAst scriptBlockAst) { + if (scriptBlockAst.ParamBlock != null) { + return scriptBlockAst.ParamBlock.Extent; + } + + var lastUsing = scriptBlockAst.FindAll(ast => ast is UsingStatementAst, false).LastOrDefault(); + var first = scriptBlockAst.Find(ast => ast is CommandAst or FunctionDefinitionAst or AssignmentStatementAst, false); + + var startingLine = lastUsing?.Extent.EndLineNumber ?? 1; + var startingColumn = lastUsing?.Extent.StartColumnNumber ?? 1; + var endingLine = first?.Extent.StartLineNumber ?? scriptBlockAst.Extent.EndLineNumber; + var endingColumn = first?.Extent.EndColumnNumber ?? scriptBlockAst.Extent.EndColumnNumber; + + var scriptLines = scriptBlockAst.Extent.Text.Split('\n'); + return new ScriptExtent( + new ScriptPosition( + scriptBlockAst.Extent.File, + startingLine, + startingColumn, + scriptLines[startingLine - 1], + scriptBlockAst.Extent.Text + ), + new ScriptPosition( + scriptBlockAst.Extent.File, + endingLine, + endingColumn, + scriptLines[endingLine - 1], + scriptBlockAst.Extent.Text + ) + ); + } } From b2a9278a5d4c8958a8d21b6b0cd004242f7b1f11 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 14:19:11 +1100 Subject: [PATCH 181/341] chore(Compiler): Update lock file --- src/Compiler/packages.lock.json | 360 -------------------------------- 1 file changed, 360 deletions(-) diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 13192f1b..5a405647 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,12 +20,6 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[8.0.10, )", - "resolved": "8.0.10", - "contentHash": "xT8jYjlroY7SLbGtoV9vUTVW/TPgodL4Egc31a444Xe0TMytLZ3UlKQ0kxMZsy/CrWsFB6wtKnSG1SsXcWreew==" - }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.2, )", @@ -877,360 +871,6 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } - }, - "net8.0-windows7.0/win-x64": { - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.4", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", - "Microsoft.PowerShell.Commands.Management": "7.4.2", - "Microsoft.PowerShell.Commands.Utility": "7.4.2", - "Microsoft.PowerShell.ConsoleHost": "7.4.2", - "Microsoft.PowerShell.Security": "7.4.2", - "Microsoft.WSMan.Management": "7.4.2", - "Microsoft.Windows.Compatibility": "8.0.4", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.2", - "System.Net.Http.WinHttpHandler": "8.0.0", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "System.Management.Automation": { - "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.2", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.4", - "System.Management.Automation": "7.4.2", - "System.Text.Json": "6.0.9", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", - "dependencies": { - "System.Management.Automation": "7.4.2" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", - "dependencies": { - "System.Security.AccessControl": "4.7.0", - "System.Security.Principal.Windows": "4.7.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.2", - "System.Management.Automation": "7.4.2", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - } } } } \ No newline at end of file From 6bec7e199b616ea3be22708d54275a09b7848c7d Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 14:27:35 +1100 Subject: [PATCH 182/341] chore(Compiler): Another lock file update --- src/Compiler/packages.lock.json | 360 ++++++++++++++++++++++++++++++++ 1 file changed, 360 insertions(+) diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 5a405647..13192f1b 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,6 +20,12 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.10, )", + "resolved": "8.0.10", + "contentHash": "xT8jYjlroY7SLbGtoV9vUTVW/TPgodL4Egc31a444Xe0TMytLZ3UlKQ0kxMZsy/CrWsFB6wtKnSG1SsXcWreew==" + }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.2, )", @@ -871,6 +877,360 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" } + }, + "net8.0-windows7.0/win-x64": { + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.4", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", + "Microsoft.PowerShell.Commands.Management": "7.4.2", + "Microsoft.PowerShell.Commands.Utility": "7.4.2", + "Microsoft.PowerShell.ConsoleHost": "7.4.2", + "Microsoft.PowerShell.Security": "7.4.2", + "Microsoft.WSMan.Management": "7.4.2", + "Microsoft.Windows.Compatibility": "8.0.4", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.2", + "System.Net.Http.WinHttpHandler": "8.0.0", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.2, )", + "resolved": "7.4.2", + "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.4", + "System.Management.Automation": "7.4.2", + "System.Text.Json": "6.0.9", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", + "dependencies": { + "System.Management.Automation": "7.4.2" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.2", + "System.Management.Automation": "7.4.2", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.2", + "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } } } } \ No newline at end of file From 8d8e16df98ea6073c738369b531463e9b9961568 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 14:46:28 +1100 Subject: [PATCH 183/341] chore(Compiler): Remove unused package references from lock files --- src/Compiler/packages.lock.json | 8 +-- tests/Compiler/Compiler.Test.csproj | 2 +- tests/Compiler/packages.lock.json | 98 ----------------------------- 3 files changed, 2 insertions(+), 106 deletions(-) diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 13192f1b..5b369819 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,12 +20,6 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[8.0.10, )", - "resolved": "8.0.10", - "contentHash": "xT8jYjlroY7SLbGtoV9vUTVW/TPgodL4Egc31a444Xe0TMytLZ3UlKQ0kxMZsy/CrWsFB6wtKnSG1SsXcWreew==" - }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.2, )", @@ -1233,4 +1227,4 @@ } } } -} \ No newline at end of file +} diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index f5ce9110..ca1890a7 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -7,7 +7,7 @@ false true true - win-x64;linux-x64 + win-x64 diff --git a/tests/Compiler/packages.lock.json b/tests/Compiler/packages.lock.json index 51929d96..6a0e912c 100644 --- a/tests/Compiler/packages.lock.json +++ b/tests/Compiler/packages.lock.json @@ -426,104 +426,6 @@ } } }, - "net8.0-windows7.0/linux-x64": { - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Management.Automation": { - "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - } - }, "net8.0-windows7.0/win-x64": { "Microsoft.Management.Infrastructure.Runtime.Unix": { "type": "Transitive", From 0bf202d50d06d52d41cbc7a79aa7da49aec63c42 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 16:39:41 +1100 Subject: [PATCH 184/341] ci: fix build issues & update compiler workflow --- .github/workflows/build.yaml | 15 +++++--- .../{compiler.yaml => compile-scripts.yaml} | 35 ++++++++++--------- .github/workflows/test.yaml | 20 +++++++---- 3 files changed, 43 insertions(+), 27 deletions(-) rename .github/workflows/{compiler.yaml => compile-scripts.yaml} (77%) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f265d559..0c6ad653 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -3,12 +3,19 @@ name: Build Compiler on: push: branches: [ master ] + paths: ["src/**", ".github/workflows/build.yaml"] pull_request: + paths: ["src/**", ".github/workflows/build.yaml"] + workflow_call: + outputs: + artifact: + value: ${{ github.inputs.artifact }} + description: 'The artifact that was built' jobs: build: - runs-on: windows-latest + runs-on: ubuntu-latest permissions: contents: read steps: @@ -22,12 +29,12 @@ jobs: cache-dependency-path: "src/Compiler/packages.lock.json" - name: Install dependencies - run: dotnet restore --locked-mode + run: dotnet restore --locked-mode -r win-x64 - name: Build - run: dotnet publish .\src\Compiler\Compiler.csproj --sc -c Release + run: dotnet publish ./src/Compiler/Compiler.csproj --sc -c Release -r win-x64 - uses: actions/upload-artifact@v4 with: name: Compiler - path: .\src\Compiler\bin\Release\win-x64\publish\Compiler.exe + path: ./src/Compiler/bin/Release/win-x64/publish/Compiler.exe diff --git a/.github/workflows/compiler.yaml b/.github/workflows/compile-scripts.yaml similarity index 77% rename from .github/workflows/compiler.yaml rename to .github/workflows/compile-scripts.yaml index 3b04ba8c..64d4a051 100644 --- a/.github/workflows/compiler.yaml +++ b/.github/workflows/compile-scripts.yaml @@ -3,13 +3,9 @@ name: Compiler on: push: branches: [master] - paths: - - "src/**" - - "compiled/**" - - "utils/Compiler.ps1" - - ".github/workflows/compiler.yaml" + paths: [ "src/**/*.ps1", ".github/workflows/compile-scripts.yaml" ] pull_request: - paths: ["src/**", "compiled/**", "utils/Compiler.ps1"] + paths: [ "src/**/*.ps1", ".github/workflows/compile-scripts.yaml" ] jobs: changes: @@ -23,8 +19,6 @@ jobs: uses: actions/checkout@v4 # Checks for changes in the 'compiled' and 'src' directories - # We include 'utils/Compiler.ps1' in the 'src' directory incase it is modified - # As this can affect all scripts in the src directory. # We also check for deleted files so we can cleanup the compiled directory - name: Collect Changes for Upcoming Jobs uses: dorny/paths-filter@v3.0.2 @@ -35,10 +29,9 @@ jobs: compiled: - 'compiled/**' src: - - 'src/**' - - 'utils/Compiler.ps1' + - 'src/**/*.(ps1|psm1)' src_deleted: - - deleted: 'src/**' + - deleted: 'src/**/*.(ps1|psm1)' cleanup-directory: runs-on: ubuntu-latest @@ -68,19 +61,29 @@ jobs: with: commit_message: "chore(compiled): Remove compiled versions of deleted files" + build: + uses: ./.github/workflows/build.yaml + compile-scripts: - runs-on: ubuntu-latest - needs: changes + runs-on: windows-latest + needs: [changes, build] if: ${{ needs.changes.outputs.src == 'true' }} permissions: contents: write + steps: - name: Checkout uses: actions/checkout@v4 - - name: Compile Scripts - shell: pwsh - run: ./utils/Invoke-CompileAllScripts.ps1 -Debug -Verbose + - name: Download Compiler Artifact + uses: dawidd6/action-download-artifact@v6 + with: + workflow: build.yaml + workflow_conclusion: success + name: Compiler + + - name: Run Compiler + run: .\Compiler.exe -i .\src -o .\compiled - name: Commit Changes if: ${{ needs.changes.outputs.src == 'true' && github.event_name == 'push' }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 0c1c1e6e..f687e734 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -3,13 +3,13 @@ name: Tests on: push: branches: [master] - paths: ["src/**", "tests/**", ".github/workflows/test-scripts.yaml"] + paths: ["src/**", "tests/**", ".github/workflows/test.yaml"] pull_request: - paths: ["src/**", "tests/**", ".github/workflows/test-scripts.yaml"] + paths: ["src/**", "tests/**", ".github/workflows/test.yaml"] jobs: test-compiler: - runs-on: ubuntu-latest + runs-on: windows-latest permissions: contents: read @@ -20,23 +20,24 @@ jobs: fetch-depth: 0 - name: Setup DotNet - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: cache: true dotnet-version: 8.0.x + cache-dependency-path: "src/Compiler/packages.lock.json" - name: Install dependencies - run: dotnet restore + run: dotnet restore --locked-mode -r win-x64 - name: Test & Collect lcov coverage - run: dotnet test --logger trx /p:CollectCoverage=true /p:CoverletOutput=Coverage/ /p:CoverletOutputFormat=lcov" + run: dotnet test --logger trx /p:CollectCoverage=true /p:CoverletOutput=Coverage/ /p:CoverletOutputFormat=lcov - name: Upload coverage artifact uses: actions/upload-artifact@v4 if: ${{ always() }} with: name: dotnet-coverage - path: tests/Compiler/coverage.info + path: ./tests/Compiler/coverage.info test-scripts: runs-on: ubuntu-latest @@ -48,6 +49,11 @@ jobs: with: fetch-depth: 0 + - name: Install Dependencies + shell: pwsh + run: | + Install-Module -Name Pester -Scope CurrentUser -Force + - name: Run Pester Tests shell: pwsh run: .\utils\Invoke-CodeCoverage.ps1 From 60ec56401e17d68d284640a565502bafe08c6757 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 17:05:20 +1100 Subject: [PATCH 185/341] Fix(Analyser): failing tests --- src/Compiler/Analyser/Rules/RuleVisitor.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs index ec7111a6..b22c80ec 100644 --- a/src/Compiler/Analyser/Rules/RuleVisitor.cs +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -34,7 +34,12 @@ public override AstVisitAction DefaultVisit(Ast ast) { }; foreach (var rule in this.Rules) { - if (!this.ThreadLocalCache[Environment.CurrentManagedThreadId][rule]) continue; + // If the key doesn't exist assume we support it, this allows for usage outside of the visitor like in tests. + if (this.ThreadLocalCache.TryGetValue(Environment.CurrentManagedThreadId, out var threadCache) + && threadCache.TryGetValue(rule, out var supports) + && !supports + ) continue; + if (!rule.ShouldProcess(ast, suppressions)) continue; foreach (var issue in rule.Analyse(ast, this.Imports)) { this.Issues.Add(issue); From b7cb9ed8a80a89cdb72156b7a7c1caa3f1b1fa3b Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 22 Oct 2024 18:02:33 +1100 Subject: [PATCH 186/341] chore(Compiler): update PowerShell dependencies and clean up project files Also fixes issues with running tests and getting import errors --- src/Compiler/Compiler.csproj | 17 +- src/Compiler/Program.cs | 2 +- src/Compiler/packages.lock.json | 233 +++--- tests/Compiler/Compiler.Test.csproj | 2 + tests/Compiler/Module/Resolvable/Script.cs | 2 - tests/Compiler/packages.lock.json | 883 +++++++++++++++++++-- 6 files changed, 960 insertions(+), 179 deletions(-) diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 7603f25e..586eb9f5 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -7,8 +7,7 @@ enable Exe - - + win-x64 True true @@ -69,17 +68,21 @@ + + - + + - - - - + + + + + diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 27590a06..8ec06a7c 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -36,7 +36,7 @@ public class Program { internal static readonly ConcurrentBag Errors = []; public static readonly Lazy RunspacePool = new(() => { - var sessionState = InitialSessionState.CreateDefault2(); + var sessionState = InitialSessionState.CreateDefault(); sessionState.ExecutionPolicy = Microsoft.PowerShell.ExecutionPolicy.Bypass; sessionState.ImportPSModule(["Microsoft.PowerShell.PSResourceGet"]); diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 5b369819..bacdae1c 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -22,24 +22,24 @@ }, "Microsoft.PowerShell.SDK": { "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.4", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", - "Microsoft.PowerShell.Commands.Management": "7.4.2", - "Microsoft.PowerShell.Commands.Utility": "7.4.2", - "Microsoft.PowerShell.ConsoleHost": "7.4.2", - "Microsoft.PowerShell.Security": "7.4.2", - "Microsoft.WSMan.Management": "7.4.2", - "Microsoft.Windows.Compatibility": "8.0.4", + "Microsoft.Extensions.ObjectPool": "8.0.8", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", + "Microsoft.PowerShell.Commands.Management": "7.4.5", + "Microsoft.PowerShell.Commands.Utility": "7.4.5", + "Microsoft.PowerShell.ConsoleHost": "7.4.5", + "Microsoft.PowerShell.Security": "7.4.5", + "Microsoft.WSMan.Management": "7.4.5", + "Microsoft.Windows.Compatibility": "8.0.8", "System.Data.SqlClient": "4.8.6", "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.2", - "System.Net.Http.WinHttpHandler": "8.0.0", + "System.Management.Automation": "7.4.5", + "System.Net.Http.WinHttpHandler": "8.0.2", "System.Private.ServiceModel": "4.10.3", "System.ServiceModel.Duplex": "4.10.3", "System.ServiceModel.Http": "4.10.3", @@ -83,12 +83,6 @@ "resolved": "5.1.0", "contentHash": "jQ0fTkHZvgQsmbr5qU0IdCP1PWuUfmEmekIsTwysWK/iIwmT9Mbm0x5GpjYSTEwHTNVEpjYhBhyKVdzESgRCpg==" }, - "PowerShellStandard.Library": { - "type": "Direct", - "requested": "[7.0.0-preview.1, )", - "resolved": "7.0.0-preview.1", - "contentHash": "vd2iKiQjgB/Lh3270aMgdq/NdVq/qNHsLM8P7k/oD3hALG1UOzePa62TOSK6RlQClfXW1xI9Y1e+haHlUkF3PA==" - }, "QuikGraph": { "type": "Direct", "requested": "[2.5.0, )", @@ -106,13 +100,13 @@ }, "System.Management.Automation": { "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", "dependencies": { "Microsoft.ApplicationInsights": "2.21.0", "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", "Microsoft.PowerShell.Native": "7.4.0", "Microsoft.Security.Extensions": "1.2.0", "Microsoft.Win32.Registry.AccessControl": "8.0.0", @@ -120,6 +114,7 @@ "System.Configuration.ConfigurationManager": "8.0.0", "System.Diagnostics.DiagnosticSource": "8.0.1", "System.DirectoryServices": "8.0.0", + "System.Formats.Asn1": "8.0.1", "System.Management": "8.0.0", "System.Security.AccessControl": "6.0.1", "System.Security.Cryptography.Pkcs": "8.0.0", @@ -221,8 +216,8 @@ }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "6FPHZ6lxtsrlFKE1LeHEco0BxevHSDdxngh37GxwGqiHm8zQz78ttM2OIevqQ8IAvtB01+5xEWBcYsjvSnhhoQ==" + "resolved": "8.0.8", + "contentHash": "wnjTFjEvvSbOs3iMfl6CeJcUgPHZMYUB9uAQbGQGxGwVRl4GydNpMSkVntTzoi7AqQeYumU9yDSNeVbpq+ebow==" }, "Microsoft.Extensions.Primitives": { "type": "Transitive", @@ -243,10 +238,10 @@ }, "Microsoft.Management.Infrastructure.CimCmdlets": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", + "resolved": "7.4.5", + "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", "dependencies": { - "System.Management.Automation": "7.4.2" + "System.Management.Automation": "7.4.5" } }, "Microsoft.Management.Infrastructure.Runtime.Unix": { @@ -261,49 +256,49 @@ }, "Microsoft.PowerShell.Commands.Diagnostics": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", + "resolved": "7.4.5", + "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", "dependencies": { - "System.Management.Automation": "7.4.2" + "System.Management.Automation": "7.4.5" } }, "Microsoft.PowerShell.Commands.Management": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", + "resolved": "7.4.5", + "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", "dependencies": { - "Microsoft.PowerShell.Security": "7.4.2", + "Microsoft.PowerShell.Security": "7.4.5", "System.ServiceProcess.ServiceController": "8.0.0" } }, "Microsoft.PowerShell.Commands.Utility": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", + "resolved": "7.4.5", + "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", "dependencies": { "Json.More.Net": "1.9.3", "JsonSchema.Net": "5.2.7", "Markdig.Signed": "0.33.0", "Microsoft.CodeAnalysis.CSharp": "4.8.0", "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.4", - "System.Management.Automation": "7.4.2", - "System.Text.Json": "6.0.9", + "System.Drawing.Common": "8.0.8", + "System.Management.Automation": "7.4.5", + "System.Text.Json": "8.0.4", "System.Threading.AccessControl": "8.0.0" } }, "Microsoft.PowerShell.ConsoleHost": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", + "resolved": "7.4.5", + "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", "dependencies": { - "System.Management.Automation": "7.4.2" + "System.Management.Automation": "7.4.5" } }, "Microsoft.PowerShell.CoreCLR.Eventing": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "resolved": "7.4.5", + "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", "dependencies": { "System.Diagnostics.EventLog": "8.0.0" } @@ -323,10 +318,10 @@ }, "Microsoft.PowerShell.Security": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", + "resolved": "7.4.5", + "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", "dependencies": { - "System.Management.Automation": "7.4.2" + "System.Management.Automation": "7.4.5" } }, "Microsoft.Security.Extensions": { @@ -355,8 +350,8 @@ }, "Microsoft.Windows.Compatibility": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "yvh9lDvnMLGGgM2bSfPMcv64mCK29NIiv3jCp2/jSskfqjAYptFZ+bmK6PEt0KR12pQ3teFduzWvgGPcIedIQA==", + "resolved": "8.0.8", + "contentHash": "9FWk4D5mNFz99rT7NvsqrDdT/6bjkNtxo7CPwajyudBTMXi7kro8ixr5pUnFYrhUBfimR+OUGDYk/se4NxJ6sA==", "dependencies": { "Microsoft.Win32.Registry.AccessControl": "8.0.0", "Microsoft.Win32.SystemEvents": "8.0.0", @@ -372,7 +367,7 @@ "System.DirectoryServices": "8.0.0", "System.DirectoryServices.AccountManagement": "8.0.0", "System.DirectoryServices.Protocols": "8.0.0", - "System.Drawing.Common": "8.0.4", + "System.Drawing.Common": "8.0.8", "System.IO.Packaging": "8.0.0", "System.IO.Ports": "8.0.0", "System.Management": "8.0.0", @@ -380,7 +375,7 @@ "System.Runtime.Caching": "8.0.0", "System.Security.Cryptography.Pkcs": "8.0.0", "System.Security.Cryptography.ProtectedData": "8.0.0", - "System.Security.Cryptography.Xml": "8.0.0", + "System.Security.Cryptography.Xml": "8.0.1", "System.Security.Permissions": "8.0.0", "System.ServiceModel.Duplex": "4.10.0", "System.ServiceModel.Http": "4.10.0", @@ -397,18 +392,18 @@ }, "Microsoft.WSMan.Management": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", + "resolved": "7.4.5", + "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.2", - "System.Management.Automation": "7.4.2", + "Microsoft.WSMan.Runtime": "7.4.5", + "System.Management.Automation": "7.4.5", "System.ServiceProcess.ServiceController": "8.0.0" } }, "Microsoft.WSMan.Runtime": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" + "resolved": "7.4.5", + "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" }, "Newtonsoft.Json": { "type": "Transitive", @@ -650,16 +645,16 @@ }, "System.Drawing.Common": { "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "3G4xpa8mUYGzEF0HlswlBArAFywHJIzsZoB5hU4yMlnYHaabj/lg019BwbyyYBxj0aoM7Cz+jdlgUemeno9LOQ==", + "resolved": "8.0.8", + "contentHash": "4ZM1wvLjz9nVVExsfPAaSl/qOvU+QNedJL5rQ+2Wbow+iGeyO0e7XN07707rMBgaffEeeLrCZBwC0oHUuvRdPw==", "dependencies": { "Microsoft.Win32.SystemEvents": "8.0.0" } }, "System.Formats.Asn1": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AJukBuLoe3QeAF+mfaRKQb2dgyrvt340iMBHYv+VdBzCUM06IxGlvl0o/uPOS7lHnXPN6u8fFRHSHudx5aTi8w==" + "resolved": "8.0.1", + "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" }, "System.IO.Packaging": { "type": "Transitive", @@ -684,8 +679,8 @@ }, "System.Net.Http.WinHttpHandler": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" }, "System.Numerics.Vectors": { "type": "Transitive", @@ -756,8 +751,8 @@ }, "System.Security.Cryptography.Xml": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "HQSFbakswZ1OXFz2Bt3AJlC6ENDqWeVpgqhf213xqQUMDifzydOHIKVb1RV4prayobvR3ETIScMaQdDF2hwGZA==", + "resolved": "8.0.1", + "contentHash": "hqu2ztecOf3BYg5q1R7QcyliX9L7r3mfsWtaRitAxcezH8hyZMB7zCmhi186hsUZXk1KxsAHXwyPEW+xvUED6g==", "dependencies": { "System.Security.Cryptography.Pkcs": "8.0.0" } @@ -849,11 +844,10 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.9", - "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", + "resolved": "8.0.4", + "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" + "System.Text.Encodings.Web": "8.0.0" } }, "System.Threading.AccessControl": { @@ -875,24 +869,24 @@ "net8.0-windows7.0/win-x64": { "Microsoft.PowerShell.SDK": { "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "w3s920JOnHORiquqaZg3O9PttPSO34Dn0JRo01OrlHpRMtWV77KWM0Z61hEP9RiqDMwYSXCvxhbDZj8er6dJgA==", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.4", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.2", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.2", - "Microsoft.PowerShell.Commands.Management": "7.4.2", - "Microsoft.PowerShell.Commands.Utility": "7.4.2", - "Microsoft.PowerShell.ConsoleHost": "7.4.2", - "Microsoft.PowerShell.Security": "7.4.2", - "Microsoft.WSMan.Management": "7.4.2", - "Microsoft.Windows.Compatibility": "8.0.4", + "Microsoft.Extensions.ObjectPool": "8.0.8", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", + "Microsoft.PowerShell.Commands.Management": "7.4.5", + "Microsoft.PowerShell.Commands.Utility": "7.4.5", + "Microsoft.PowerShell.ConsoleHost": "7.4.5", + "Microsoft.PowerShell.Security": "7.4.5", + "Microsoft.WSMan.Management": "7.4.5", + "Microsoft.Windows.Compatibility": "8.0.8", "System.Data.SqlClient": "4.8.6", "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.2", - "System.Net.Http.WinHttpHandler": "8.0.0", + "System.Management.Automation": "7.4.5", + "System.Net.Http.WinHttpHandler": "8.0.2", "System.Private.ServiceModel": "4.10.3", "System.ServiceModel.Duplex": "4.10.3", "System.ServiceModel.Http": "4.10.3", @@ -905,13 +899,13 @@ }, "System.Management.Automation": { "type": "Direct", - "requested": "[7.4.2, )", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", "dependencies": { "Microsoft.ApplicationInsights": "2.21.0", "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", "Microsoft.PowerShell.Native": "7.4.0", "Microsoft.Security.Extensions": "1.2.0", "Microsoft.Win32.Registry.AccessControl": "8.0.0", @@ -919,6 +913,7 @@ "System.Configuration.ConfigurationManager": "8.0.0", "System.Diagnostics.DiagnosticSource": "8.0.1", "System.DirectoryServices": "8.0.0", + "System.Formats.Asn1": "8.0.1", "System.Management": "8.0.0", "System.Security.AccessControl": "6.0.1", "System.Security.Cryptography.Pkcs": "8.0.0", @@ -928,10 +923,10 @@ }, "Microsoft.Management.Infrastructure.CimCmdlets": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "wDfyC5gpaJU1FdLPL5aP64OD02oAks5nRqE9r6nPd0aZ51kJN0c2uc5HmOwY+ZHOHHkRjAC2PnrPA75UsQY4fw==", + "resolved": "7.4.5", + "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", "dependencies": { - "System.Management.Automation": "7.4.2" + "System.Management.Automation": "7.4.5" } }, "Microsoft.Management.Infrastructure.Runtime.Unix": { @@ -946,49 +941,49 @@ }, "Microsoft.PowerShell.Commands.Diagnostics": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "DgXc0MOeyWGndCcW7AQ8BbLpgHw7NQOD9xfAASTDaF0OmLUNlN3HmDwrZUb4pFiD0mQAkRze14R1ve3nnRakNw==", + "resolved": "7.4.5", + "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", "dependencies": { - "System.Management.Automation": "7.4.2" + "System.Management.Automation": "7.4.5" } }, "Microsoft.PowerShell.Commands.Management": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "/2bC7Z4GcTEO0YvtFYmyapgxTsRgLo+/sN+7lLspBmyynR6thNSukMfMq9YM5U6gCH5ev95tFijxi9eM66g2EQ==", + "resolved": "7.4.5", + "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", "dependencies": { - "Microsoft.PowerShell.Security": "7.4.2", + "Microsoft.PowerShell.Security": "7.4.5", "System.ServiceProcess.ServiceController": "8.0.0" } }, "Microsoft.PowerShell.Commands.Utility": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "OWpb6sMhsLha55jlMKNeeHpfPTR19EU2aKHSlT4pyluu+Gd4pTkdsDZ/nCIOJw0aRc3XGkdZ7dlFithjoH3gSw==", + "resolved": "7.4.5", + "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", "dependencies": { "Json.More.Net": "1.9.3", "JsonSchema.Net": "5.2.7", "Markdig.Signed": "0.33.0", "Microsoft.CodeAnalysis.CSharp": "4.8.0", "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.4", - "System.Management.Automation": "7.4.2", - "System.Text.Json": "6.0.9", + "System.Drawing.Common": "8.0.8", + "System.Management.Automation": "7.4.5", + "System.Text.Json": "8.0.4", "System.Threading.AccessControl": "8.0.0" } }, "Microsoft.PowerShell.ConsoleHost": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "FFz86ywpZCZMBiH129rLlwSfGTy2jWYjwFkLez4X8VrnYyKhHO4VA43ritoL7uRUERew4GmouflL1Oz81HsJbA==", + "resolved": "7.4.5", + "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", "dependencies": { - "System.Management.Automation": "7.4.2" + "System.Management.Automation": "7.4.5" } }, "Microsoft.PowerShell.CoreCLR.Eventing": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "resolved": "7.4.5", + "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", "dependencies": { "System.Diagnostics.EventLog": "8.0.0" } @@ -1000,10 +995,10 @@ }, "Microsoft.PowerShell.Security": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "s31Jv+tOFh4pX7Ipk/awKSQQFWubz6nlSAmVXM9/13kFhu9SAIpjaikMaK9BdcqJi9hbSO8xWZGAdBBurBqiWg==", + "resolved": "7.4.5", + "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", "dependencies": { - "System.Management.Automation": "7.4.2" + "System.Management.Automation": "7.4.5" } }, "Microsoft.Security.Extensions": { @@ -1032,18 +1027,18 @@ }, "Microsoft.WSMan.Management": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "bXGVxR3/Nglk5z6sQY7yr/M9zxVzZ6EpEqjqc5NmylUo6ezbwbPMQ7PWVvWUXut9lZ1+xK0ffxa+zC69wVaVdw==", + "resolved": "7.4.5", + "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.2", - "System.Management.Automation": "7.4.2", + "Microsoft.WSMan.Runtime": "7.4.5", + "System.Management.Automation": "7.4.5", "System.ServiceProcess.ServiceController": "8.0.0" } }, "Microsoft.WSMan.Runtime": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "gdIf0ozmp/jnYoiDApumIAmwXwq+x8BSdcUvw5mu78YyIt/gVXK34ime3DPX2+hi0YXfR8foExQWELTy3qSgUg==" + "resolved": "7.4.5", + "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" }, "runtime.linux-arm.runtime.native.System.IO.Ports": { "type": "Transitive", @@ -1163,8 +1158,8 @@ }, "System.Net.Http.WinHttpHandler": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" }, "System.Runtime.Caching": { "type": "Transitive", @@ -1227,4 +1222,4 @@ } } } -} +} \ No newline at end of file diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index ca1890a7..54d5f514 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -28,6 +28,8 @@ + + diff --git a/tests/Compiler/Module/Resolvable/Script.cs b/tests/Compiler/Module/Resolvable/Script.cs index 77830c9c..1ace53f7 100644 --- a/tests/Compiler/Module/Resolvable/Script.cs +++ b/tests/Compiler/Module/Resolvable/Script.cs @@ -10,8 +10,6 @@ namespace Compiler.Test.Module.Resolvable; [TestFixture] public partial class CompiledScriptTest { - private static readonly string TEST_SCRIPT = Path.Combine(Environment.CurrentDirectory, "resources", "test.ps1"); - [TestCaseSource(typeof(TestData), nameof(TestData.TestCases))] public string Test( TextSpanUpdater updater, diff --git a/tests/Compiler/packages.lock.json b/tests/Compiler/packages.lock.json index 6a0e912c..479d7783 100644 --- a/tests/Compiler/packages.lock.json +++ b/tests/Compiler/packages.lock.json @@ -24,6 +24,36 @@ "Microsoft.TestPlatform.TestHost": "17.8.0" } }, + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.8", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", + "Microsoft.PowerShell.Commands.Management": "7.4.5", + "Microsoft.PowerShell.Commands.Utility": "7.4.5", + "Microsoft.PowerShell.ConsoleHost": "7.4.5", + "Microsoft.PowerShell.Security": "7.4.5", + "Microsoft.WSMan.Management": "7.4.5", + "Microsoft.Windows.Compatibility": "8.0.8", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.5", + "System.Net.Http.WinHttpHandler": "8.0.2", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, "Moq": { "type": "Direct", "requested": "[4.20.70, )", @@ -51,6 +81,30 @@ "resolved": "4.5.0", "contentHash": "s8JpqTe9bI2f49Pfr3dFRfoVSuFQyraTj68c3XXjIS/MRGvvkLnrg6RLqnTjdShX+AdFUCCU/4Xex58AdUfs6A==" }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Formats.Asn1": "8.0.1", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, "Castle.Core": { "type": "Transitive", "resolved": "5.1.1", @@ -69,11 +123,47 @@ "resolved": "1.1.1", "contentHash": "PvLjUHQeX6MwjF34eQhU6EE1fCRC5zYcX/u10n+ZUkzgv+hRtZSHj1JzAg7AQ5a6iEcLZ2yCb5VBDzdupErDNQ==" }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.2.0", + "contentHash": "kKSyoVfndMriKHLfYGmr0uzQuI4jcc3TKGyww7buJFCYeHb/X0kodYBPL7n9454q7v6ASiRmDgpPGaDGerg/Hg==" + }, + "Json.More.Net": { + "type": "Transitive", + "resolved": "1.9.3", + "contentHash": "BKIsKHXR2Jq+LdLdxPo3L09Lv0ld9xs1fAMvSAe2cf2YOl3at9vw0RrMlhC2ookDi7VtrgHXzc2Et5mVBOAUdw==", + "dependencies": { + "System.Text.Json": "6.0.2" + } + }, + "JsonPointer.Net": { + "type": "Transitive", + "resolved": "3.0.3", + "contentHash": "mCGQc15lHLp1R2CVhWiipnZurHXm93+LbPPAT/vXQm5PdHt6WQuYLhaEF8VZ+aXL9P2I6bGND6pDTEfqFs6gig==", + "dependencies": { + "Json.More.Net": "1.8.0" + } + }, + "JsonSchema.Net": { + "type": "Transitive", + "resolved": "5.2.7", + "contentHash": "8un7Xq2MoKiWNo0HQtf2sPr3764W9NjNELIx3l9d3fIKEjg3tYtrZmxN+CgXKtzku4g52CqYUZuI+o0ue226vw==", + "dependencies": { + "JetBrains.Annotations": "2021.2.0", + "Json.More.Net": "1.9.0", + "JsonPointer.Net": "3.0.3" + } + }, "LanguageExt.Core": { "type": "Transitive", "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, + "Markdig.Signed": { + "type": "Transitive", + "resolved": "0.33.0", + "contentHash": "/BE/XANxmocgEqajbWB/ur4Jei+j1FkXppWH9JFmEuoq8T3xJndkQKZVCW/7lTdc9Ru6kfEAkwSXFOv30EkU2Q==" + }, "Microsoft.ApplicationInsights": { "type": "Transitive", "resolved": "2.21.0", @@ -82,6 +172,35 @@ "System.Diagnostics.DiagnosticSource": "5.0.0" } }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.8.0", + "contentHash": "/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "7.0.0", + "System.Reflection.Metadata": "7.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.8.0", + "contentHash": "+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.8.0]" + } + }, "Microsoft.CodeCoverage": { "type": "Transitive", "resolved": "17.8.0", @@ -100,6 +219,11 @@ "resolved": "6.0.0", "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "wnjTFjEvvSbOs3iMfl6CeJcUgPHZMYUB9uAQbGQGxGwVRl4GydNpMSkVntTzoi7AqQeYumU9yDSNeVbpq+ebow==" + }, "Microsoft.Extensions.Primitives": { "type": "Transitive", "resolved": "6.0.0", @@ -117,6 +241,14 @@ "Microsoft.Management.Infrastructure.Runtime.Win": "3.0.0" } }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, "Microsoft.Management.Infrastructure.Runtime.Unix": { "type": "Transitive", "resolved": "3.0.0", @@ -127,19 +259,76 @@ "resolved": "3.0.0", "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.8", + "System.Management.Automation": "7.4.5", + "System.Text.Json": "8.0.4", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, "Microsoft.PowerShell.CoreCLR.Eventing": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "resolved": "7.4.5", + "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", "dependencies": { "System.Diagnostics.EventLog": "8.0.0" } }, + "Microsoft.PowerShell.MarkdownRender": { + "type": "Transitive", + "resolved": "7.2.1", + "contentHash": "o5oUwL23R/KnjQPD2Oi49WAG5j4O4VLo1fPRSyM/aq0HuTrY2RnF4B3MCGk13BfcmK51p9kPlHZ1+8a/ZjO4Jg==", + "dependencies": { + "Markdig.Signed": "0.31.0" + } + }, "Microsoft.PowerShell.Native": { "type": "Transitive", "resolved": "7.4.0", "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, "Microsoft.Security.Extensions": { "type": "Transitive", "resolved": "1.2.0", @@ -163,11 +352,82 @@ "Newtonsoft.Json": "13.0.1" } }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, "Microsoft.Win32.Registry.AccessControl": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.Windows.Compatibility": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "9FWk4D5mNFz99rT7NvsqrDdT/6bjkNtxo7CPwajyudBTMXi7kro8ixr5pUnFYrhUBfimR+OUGDYk/se4NxJ6sA==", + "dependencies": { + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Microsoft.Win32.SystemEvents": "8.0.0", + "System.CodeDom": "8.0.0", + "System.ComponentModel.Composition": "8.0.0", + "System.ComponentModel.Composition.Registration": "8.0.0", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Data.Odbc": "8.0.0", + "System.Data.OleDb": "8.0.0", + "System.Data.SqlClient": "4.8.6", + "System.Diagnostics.EventLog": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.AccountManagement": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0", + "System.Drawing.Common": "8.0.8", + "System.IO.Packaging": "8.0.0", + "System.IO.Ports": "8.0.0", + "System.Management": "8.0.0", + "System.Reflection.Context": "8.0.0", + "System.Runtime.Caching": "8.0.0", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Cryptography.ProtectedData": "8.0.0", + "System.Security.Cryptography.Xml": "8.0.1", + "System.Security.Permissions": "8.0.0", + "System.ServiceModel.Duplex": "4.10.0", + "System.ServiceModel.Http": "4.10.0", + "System.ServiceModel.NetTcp": "4.10.0", + "System.ServiceModel.Primitives": "4.10.0", + "System.ServiceModel.Security": "4.10.0", + "System.ServiceModel.Syndication": "8.0.0", + "System.ServiceProcess.ServiceController": "8.0.0", + "System.Speech": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0", + "System.Threading.AccessControl": "8.0.0", + "System.Web.Services.Description": "4.10.0" + } + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.5", + "System.Management.Automation": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" + }, "Newtonsoft.Json": { "type": "Transitive", "resolved": "13.0.3", @@ -275,11 +535,6 @@ "resolved": "5.1.0", "contentHash": "jQ0fTkHZvgQsmbr5qU0IdCP1PWuUfmEmekIsTwysWK/iIwmT9Mbm0x5GpjYSTEwHTNVEpjYhBhyKVdzESgRCpg==" }, - "PowerShellStandard.Library": { - "type": "Transitive", - "resolved": "7.0.0-preview.1", - "contentHash": "vd2iKiQjgB/Lh3270aMgdq/NdVq/qNHsLM8P7k/oD3hALG1UOzePa62TOSK6RlQClfXW1xI9Y1e+haHlUkF3PA==" - }, "QuikGraph": { "type": "Transitive", "resolved": "2.5.0", @@ -293,11 +548,92 @@ "QuikGraph": "2.5.0" } }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Ee7Sz5llLpTgyKIWzKI/GeuRSbFkOABgJRY00SqTY0OkTYtkB+9l5rFZfE7fxPA3c22RfytCBYkUdAkcmwMjQg==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "8.0.0", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.linux-x64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.osx-arm64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.osx-x64.runtime.native.System.IO.Ports": "8.0.0" + } + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, "System.CodeDom": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==" + }, + "System.ComponentModel.Composition": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bGhUX5BTivJ9Wax0qnJy7uGq7dn/TQkEpJ2Fpu1etg8dbPwyDkUzNPc1d3I2/jUr9y4wDI3a1dkSmi8X21Pzbw==" + }, + "System.ComponentModel.Composition.Registration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "BVMXYqX7Z0Zdq3tc94UKJL/cOWq4LF3ufexfdPuUDrDl4ekbbfwPVzsusVbx+aq6Yx60CJnmJLyHtM3V2Q7BBQ==", + "dependencies": { + "System.ComponentModel.Composition": "8.0.0", + "System.Reflection.Context": "8.0.0" + } + }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "8.0.0", @@ -307,6 +643,33 @@ "System.Security.Cryptography.ProtectedData": "8.0.0" } }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "8.0.1", @@ -317,15 +680,59 @@ "resolved": "8.0.0", "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, "System.DirectoryServices": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "4ZM1wvLjz9nVVExsfPAaSl/qOvU+QNedJL5rQ+2Wbow+iGeyO0e7XN07707rMBgaffEeeLrCZBwC0oHUuvRdPw==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "8.0.0" + } + }, "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" + }, + "System.IO.Packaging": { "type": "Transitive", "resolved": "8.0.0", - "contentHash": "AJukBuLoe3QeAF+mfaRKQb2dgyrvt340iMBHYv+VdBzCUM06IxGlvl0o/uPOS7lHnXPN6u8fFRHSHudx5aTi8w==" + "contentHash": "8g1V4YRpdGAxFcK8v9OjuMdIOJSpF30Zb1JGicwVZhly3I994WFyBdV6mQEo8d3T+URQe55/M0U0eIH0Hts1bg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } }, "System.Management": { "type": "Transitive", @@ -335,32 +742,54 @@ "System.CodeDom": "8.0.0" } }, - "System.Management.Automation": { + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" + }, + "System.Numerics.Vectors": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "BcUV7OERlLqGxDXZuIyIMMmk1PbqBblLRbAoigmzIUx/M8A+8epvyPyXRpbgoucKH7QmfYdQIev04Phx2Co08A==", "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" } }, + "System.Reflection.Context": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "k76ubeIBOeIVg7vkQ4I+LoB8sY1EzFIc3oHEtoiNLhXleb7TBLXUQu0CFZ4sPlXJzWNabRf+gn1T7lyhOBxIMA==" + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + "resolved": "7.0.0", + "contentHash": "MclTG61lsD9sYdpNz9xsKBzjsmsfCtcMZYXz/IUr2zlhaTaABonlr1ESeompTgM+Xk+IwtGYU7/voh3YWB/fWw==", + "dependencies": { + "System.Collections.Immutable": "7.0.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } }, "System.Runtime.CompilerServices.Unsafe": { "type": "Transitive", @@ -385,6 +814,14 @@ "resolved": "8.0.0", "contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==" }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "hqu2ztecOf3BYg5q1R7QcyliX9L7r3mfsWtaRitAxcezH8hyZMB7zCmhi186hsUZXk1KxsAHXwyPEW+xvUED6g==", + "dependencies": { + "System.Security.Cryptography.Pkcs": "8.0.0" + } + }, "System.Security.Permissions": { "type": "Transitive", "resolved": "8.0.0", @@ -393,11 +830,101 @@ "System.Windows.Extensions": "8.0.0" } }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Duplex": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "IZ8ZahvTenWML7/jGUXSCm6jHlxpMbcb+Hy+h5p1WP9YVtb+Er7FHRRGizqQMINEdK6HhWpD6rzr5PdxNyusdg==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "hodkn0rPTYmoZ9EIPwcleUrOi1gZBPvU0uFvzmJbyxl1lIpVM5GxTrs/pCETStjOXCiXhBDoZQYajquOEfeW/w==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.NetTcp": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "tP7GN7ehqSIQEz7yOJEtY8ziTpfavf2IQMPKa7r9KGQ75+uEW6/wSlWez7oKQwGYuAHbcGhpJvdG6WoVMKYgkw==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "aNcdry95wIP1J+/HcLQM/f/AA73LnBQDNc2uCoZ+c1//KpVRp8nMZv5ApMwK+eDNVdCK8G0NLInF+xG3mfQL+g==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3" + } + }, + "System.ServiceModel.Security": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "vqelKb7DvP2inb6LDJ5Igi8wpOYdtLXn5luDW5qEaqkV2sYO1pKlVYBpr6g6m5SevzbdZlVNu67dQiD/H6EdGQ==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Syndication": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CJxIUwpBkMCPmIx46tFVOt0zpRrYurUHLW6tJBcmyj+MyWpKc6MMcS69B7IdlV/bgtgys073wMIHZX9QOQ1OFA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, "System.Text.Encoding.CodePages": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.4", + "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Web.Services.Description": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "ORCkTkUo9f1o4ACG+H6SV+0XSxVZ461w3cHzYxEU41y6aKWp1CeNTMYbtdxMw1we6c6t4Hqq15PdcLVcdqno/g==" + }, "System.Windows.Extensions": { "type": "Transitive", "resolved": "8.0.0", @@ -418,15 +945,76 @@ "NuGet.Commands": "[6.9.1, )", "NuGet.Common": "[6.9.1, )", "Pastel": "[5.1.0, )", - "PowerShellStandard.Library": "[7.0.0-preview.1, )", "QuikGraph": "[2.5.0, )", "QuikGraph.Graphviz": "[2.5.0, )", - "System.Management.Automation": "[7.4.2, )", + "System.Management.Automation": "[7.4.5, )", "System.Windows.Forms": "[4.0.0, )" } } }, "net8.0-windows7.0/win-x64": { + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.8", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", + "Microsoft.PowerShell.Commands.Management": "7.4.5", + "Microsoft.PowerShell.Commands.Utility": "7.4.5", + "Microsoft.PowerShell.ConsoleHost": "7.4.5", + "Microsoft.PowerShell.Security": "7.4.5", + "Microsoft.WSMan.Management": "7.4.5", + "Microsoft.Windows.Compatibility": "8.0.8", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.5", + "System.Net.Http.WinHttpHandler": "8.0.2", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Formats.Asn1": "8.0.1", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, "Microsoft.Management.Infrastructure.Runtime.Unix": { "type": "Transitive", "resolved": "3.0.0", @@ -437,10 +1025,51 @@ "resolved": "3.0.0", "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.8", + "System.Management.Automation": "7.4.5", + "System.Text.Json": "8.0.4", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, "Microsoft.PowerShell.CoreCLR.Eventing": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6pGLOm90k/M3/SO50eVlnF7zwNOjMxQzWZ37O9dcMvlOLD7XuG8mRq/2EuQ2TaG4/qEsjG8/vv+f1GnyASSL5w==", + "resolved": "7.4.5", + "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", "dependencies": { "System.Diagnostics.EventLog": "8.0.0" } @@ -450,26 +1079,161 @@ "resolved": "7.4.0", "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, "Microsoft.Security.Extensions": { "type": "Transitive", "resolved": "1.2.0", "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, "Microsoft.Win32.Registry.AccessControl": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.5", + "System.Management.Automation": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, "System.Diagnostics.EventLog": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, "System.DirectoryServices": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, "System.Management": { "type": "Transitive", "resolved": "8.0.0", @@ -478,26 +1242,17 @@ "System.CodeDom": "8.0.0" } }, - "System.Management.Automation": { + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" + }, + "System.Runtime.Caching": { "type": "Transitive", - "resolved": "7.4.2", - "contentHash": "6GKNDctTjyv6ppVEf1Hw6kc6TTXggL+cEamWK/axOz0ojr10vRFklipP6K2ipClCMfMGaCmxZ+ArkZeit5yXug==", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.2", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" + "System.Configuration.ConfigurationManager": "8.0.0" } }, "System.Security.AccessControl": { @@ -513,11 +1268,39 @@ "System.Formats.Asn1": "8.0.0" } }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, "System.Text.Encoding.CodePages": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, "System.Windows.Extensions": { "type": "Transitive", "resolved": "8.0.0", From 9140a05e3613e90aa2918c4809fd746c732b19dd Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:53:43 +1100 Subject: [PATCH 187/341] fix(Analyser): Incorrect Variable check for compiled scripts --- src/common/Analyser.psm1 | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/common/Analyser.psm1 b/src/common/Analyser.psm1 index 7aa6d5f3..da196802 100644 --- a/src/common/Analyser.psm1 +++ b/src/common/Analyser.psm1 @@ -1,4 +1,4 @@ -Using module ./ModuleUtils.psm1; +Using module ./ModuleUtils.psm1 <# .SYNOPSIS @@ -8,7 +8,7 @@ Using module ./ModuleUtils.psm1; #> $CSFilePath = "$PSScriptRoot\..\Compiler\Analyser\Suppression.cs"; -if (-not (Get-Variable -Name 'GlobalScript' -Scope Global -ValueOnly) -and (Test-Path -Path $CSFilePath -PathType Leaf)) { +if (-not (Get-Variable -Name 'CompiledScript' -Scope Global -ValueOnly -ErrorAction SilentlyContinue) -and (Test-Path -Path $CSFilePath -PathType Leaf)) { Add-Type -LiteralPath $CSFilePath; } else { $SuppressionCSharp = @' @@ -18,13 +18,17 @@ namespace Compiler.Analyser { [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] public sealed class SuppressAnalyserAttribute( string CheckType, - object? Data = null, - string Justification = '' - ) : Attribute + object Data = null, + string Justification = "" + ) : Attribute { + public string CheckType { get; } + public object Data { get; } + public string Justification { get; } + } } '@; - Add-Type -TypeDefinition $SuppressionCSharp -Language CSharp; + Add-Type -TypeDefinition $SuppressionCSharp -Language CSharp -IgnoreWarnings -WarningAction SilentlyContinue; } Export-Types -Types @( From 10e43c32cb517dab4a430614ff79683fac919d77 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:54:13 +1100 Subject: [PATCH 188/341] refactor: If we dont have a validation check we shouldn't delete it --- src/common/Cache.psm1 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/common/Cache.psm1 b/src/common/Cache.psm1 index 5709bff6..76a7e124 100644 --- a/src/common/Cache.psm1 +++ b/src/common/Cache.psm1 @@ -117,7 +117,6 @@ function Get-CachedLocation { [String]$Path, [Parameter(Mandatory)] - [ValidateNotNullOrEmpty()] [Object]$Content ) @@ -170,8 +169,7 @@ function Get-CachedLocation { Remove-Cache -CachePath $Local:CachePath; } } else { - Invoke-Verbose 'No cache validation method provided, skipping validation and re-creating.'; - Remove-Cache -CachePath $Local:CachePath; + Invoke-Verbose 'No cache validation method provided, assuming valid.'; } } From 6a41c203ab9091cae0083019a9ed9531eabfda7b Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:55:32 +1100 Subject: [PATCH 189/341] fix: attribute issues --- src/common/Connection.psm1 | 9 +++++++++ src/common/PackageManager.psm1 | 2 +- src/microsoft/admin/Invoke-ForCustomer.ps1 | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/common/Connection.psm1 b/src/common/Connection.psm1 index 353418cf..599849cc 100644 --- a/src/common/Connection.psm1 +++ b/src/common/Connection.psm1 @@ -1,11 +1,20 @@ Using module ./Logging.psm1 Using module ./Scope.psm1 Using module ./Exit.psm1 +Using module ./Input.psm1 Using module Microsoft.Graph.Authentication Using module ExchangeOnlineManagement Using module AzureAD Using module MSOnline +[CmdletBinding()] +[Compiler.Analyser.SuppressAnalyserAttribute( + CheckType = 'UseOfUndefinedFunction', + Data = 'Get-ConnectionInformation', 'Get-IPPSSession', 'Get-AzureADCurrentSessionInfo', 'Get-MgContext', 'Get-MsolCompanyInformation', 'Connect-AzureAD', 'Disconnect-AzureAD', + Justification = 'wmic is not available on the builder machine' +)] +param() + function Local:Invoke-NonNullParams { [CmdletBinding()] param( diff --git a/src/common/PackageManager.psm1 b/src/common/PackageManager.psm1 index e7da8f25..9b34343b 100644 --- a/src/common/PackageManager.psm1 +++ b/src/common/PackageManager.psm1 @@ -41,7 +41,7 @@ enum PackageManager { function Local:Install-Requirements { [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSAvoidUsingInvokeExpression', - $null, + '', Justification = 'Required to install Chocolatey, there is no other way to do this.' )] [Compiler.Analyser.SuppressAnalyserAttribute( diff --git a/src/microsoft/admin/Invoke-ForCustomer.ps1 b/src/microsoft/admin/Invoke-ForCustomer.ps1 index 30580dbc..981a5878 100644 --- a/src/microsoft/admin/Invoke-ForCustomer.ps1 +++ b/src/microsoft/admin/Invoke-ForCustomer.ps1 @@ -7,6 +7,7 @@ Using module ../../common/Connection.psm1 Using module ../../common/Exit.psm1 Using module Microsoft.Graph.Authentication +Using module Microsoft.Graph.Identity.DirectoryManagement Using module PartnerCenter [CmdletBinding(DefaultParameterSetName = 'ScriptBlock')] @@ -348,4 +349,3 @@ Invoke-RunMain $PSCmdlet -NotStrict -Main { } } }; - From 55a95e34313f982f24bd74e6ac3c40d464d6b1f6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:55:51 +1100 Subject: [PATCH 190/341] feat: Add removal of imported modules back to non compiled scripts --- src/common/Environment.psm1 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/common/Environment.psm1 b/src/common/Environment.psm1 index 251a2516..8f5ea10b 100644 --- a/src/common/Environment.psm1 +++ b/src/common/Environment.psm1 @@ -1,6 +1,5 @@ Using module ./Utils.psm1 Using module ./Logging.psm1 -Using module ./Scope.psm1 Using module ./Exit.psm1 Using namespace System.Management.Automation.Language; @@ -9,6 +8,10 @@ Using namespace System.Collections.Generic [System.Boolean]$Script:ScriptRestarted = $False; [System.Boolean]$Script:ScriptRestarting = $False; [System.Collections.Generic.List[String]]$Script:ImportedModules = [System.Collections.Generic.List[String]]::new(); +$Script:ModuleSnapshot = Get-Module | Select-Object -ExpandProperty Path | Where-Object { + # Also Exclude our own modules + $_.Name -notmatch '(Environment|Logging|Scope|Utils|Exit)' +}; #region - Utility Functions function Get-OrFalse { @@ -89,6 +92,18 @@ function Invoke-Teardown { $PSDefaultParameterValues.Remove('*:InformationAction'); $PSDefaultParameterValues.Remove('*:Verbose'); $PSDefaultParameterValues.Remove('*:Debug'); + + if (-not (Get-Variable -Name 'CompiledScript' -ValueOnly -ErrorAction SilentlyContinue)) { + Get-Module | ForEach-Object { + if ($Script:ModuleSnapshot -notcontains $_.Path) { + Write-Debug "Removing module $_."; + $_ | Remove-Module -Force -Confirm:$False -Verbose:$False -Debug:$False; + if (Get-Module -Name $_.Name) { + Write-Warning "Failed to remove module $_."; + } + } + } + } } <# From 28bf4d2c86f15e566cd76415755d6870fbdc1d4a Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:56:31 +1100 Subject: [PATCH 191/341] refactor: the minimum required version is actually 2.3.2 --- src/common/Logging.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Logging.psm1 b/src/common/Logging.psm1 index 03823d34..716de330 100644 --- a/src/common/Logging.psm1 +++ b/src/common/Logging.psm1 @@ -1,7 +1,7 @@ Using module ./PSStyle.psm1 Using module @{ ModuleName = 'PSReadLine'; - RequiredVersion = '2.3.5'; + ModuleVersion = '2.3.2'; } [HashTable]$Script:Logging = @{ From 8e69dc59dfef17fbb2630f3d1198fd2b95daf6c7 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:56:44 +1100 Subject: [PATCH 192/341] fix: should not be using log in this module --- src/common/ModuleUtils.psm1 | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/common/ModuleUtils.psm1 b/src/common/ModuleUtils.psm1 index 29ecd3c5..050cd9ee 100644 --- a/src/common/ModuleUtils.psm1 +++ b/src/common/ModuleUtils.psm1 @@ -80,9 +80,6 @@ function Export-Types { $TypeAcceleratorsClass::Add($Type.FullName, $Type); } - Invoke-Debug "Exported types: $($Types -join ', ')"; - Invoke-Debug "Registering module callback to remove type accelerators: $($Types -join ', ') from $($Module)"; - # Remove type accelerators when the module is removed. Add-ModuleCallback -Module $Module -ScriptBlock { foreach ($Type in $Types) { From 04e53b06661d6eb5b7be501a0ca02101a05f8484 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:57:23 +1100 Subject: [PATCH 193/341] fix: Incorrect Registry Key Name --- src/microsoft/windows/Setup-Wireguard.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/microsoft/windows/Setup-Wireguard.ps1 b/src/microsoft/windows/Setup-Wireguard.ps1 index 8620fc9c..98f4ecb4 100644 --- a/src/microsoft/windows/Setup-Wireguard.ps1 +++ b/src/microsoft/windows/Setup-Wireguard.ps1 @@ -24,8 +24,8 @@ Invoke-RunMain $PSCmdlet { Install-ManagedPackage -PackageName 'WireGuard'; } - Invoke-Info 'Setting up LimitedUI Registry Key...'; - Set-RegistryKey -Path HKLM:\SOFTWARE\WireGuard -Key 'LimitedUserUI' -Value 1 -Kind DWord; + Invoke-Info 'Setting up LimitedOperatorUI Registry Key...'; + Set-RegistryKey -Path HKLM:\SOFTWARE\WireGuard -Key 'LimitedOperatorUI' -Value 1 -Kind DWord; # Query for if any users need to be added to Network Configuration Operators Invoke-Info 'Querying for if any users need to be added to Network Configuration Operators...'; From 6db75268b96b0ae7d09fd436bc0668d3b374bc24 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:58:53 +1100 Subject: [PATCH 194/341] feat(Setup-Printer): Bultin Support for Konica Minolta Printers Also fixes some issues regarding param sets. --- src/microsoft/windows/Setup-Printer.ps1 | 190 +++++++++++++++--------- 1 file changed, 119 insertions(+), 71 deletions(-) diff --git a/src/microsoft/windows/Setup-Printer.ps1 b/src/microsoft/windows/Setup-Printer.ps1 index 75908018..040731a0 100644 --- a/src/microsoft/windows/Setup-Printer.ps1 +++ b/src/microsoft/windows/Setup-Printer.ps1 @@ -7,38 +7,54 @@ Using module ../../common/PackageManager.psm1 Using module ../../common/Temp.psm1 Using module ../../common/Exit.psm1 +<# +.PARAMETER PrinterName + The name of the printer. + +.PARAMETER PrinterIP + The IP address of the printer. + +.PARAMETER PrinterDriver + The name of the printer driver as it appears in the list of installed drivers. + +.PARAMETER ChocoDriver + The name of the package to install from Chocolatey. + If not specified, the driver will not be installed. + + If the driver is not installed already and isn't being installed by chocolatey, + A 5 minute timeout will be used to wait for the driver to be installed asychronously. + +.PARAMETER Manufacturer + If specified and one of 'Ricoh', 'HP', or 'Konica Minolta', the driver will be installed based on the manufacturer. + +.PARAMETER Force + If specified, printer will be added even if the computer cannot contact the printer. + If not specified, if the computer cannot contact the printer, the script will silently exit. +#> +[CmdletBinding()] Param( - [Parameter(Mandatory, Position = 0, ParameterSetName = 'Default')] + [Parameter(Mandatory, Position = 0, ParameterSetName = 'ByDriverName')] + [Parameter(Mandatory, Position = 0, ParameterSetName = 'ByManufacturer')] [Alias('Name')] [String]$PrinterName, - [Parameter(Mandatory, Position = 1, ParameterSetName = 'Default')] + [Parameter(Mandatory, Position = 1, ParameterSetName = 'ByDriverName')] + [Parameter(Mandatory, Position = 1, ParameterSetName = 'ByManufacturer')] [Alias('IP')] [String]$PrinterIP, - [Parameter(Mandatory, ParameterSetName = 'ChocoDriver')] + [Parameter(Mandatory, Position = 2, ParameterSetName = 'ByDriverName')] [String]$PrinterDriver, - [Parameter(ParameterSetName = 'ChocoDriver', HelpMessage = " - The name of the package to install from Chocolatey. - If not specified, the driver will not be installed. - - If the driver is not installed already and isn't being installed by chocolatey, - A 5 minute timeout will be used to wait for the driver to be installed asychronously. - ")] + [Parameter(Position = 3, ParameterSetName = 'ByDriverName')] [String]$ChocoDriver, - [Parameter(HelpMessage = ' - If specified, the manufacturer of the printer will be used to determine the driver to install. - If not specified, the driver will be installed from the Chocolatey package. - ')] - [ValidateSet('Ricoh')] + [Parameter(Mandatory, Position = 2, ParameterSetName = 'ByManufacturer')] + [ValidateSet('Ricoh', 'HP', 'Konica Minolta')] [String]$Manufacturer, - [Parameter(HelpMessage = ' - If specified, printer will be added even if the computer cannot contact the printer. - If not specified, if the computer cannot contact the printer, the script will silently exit. - ')] + [Parameter(Position = 4, ParameterSetName = 'ByDriverName')] + [Parameter(Position = 3, ParameterSetName = 'ByManufacturer')] [Switch]$Force ) @@ -88,31 +104,37 @@ function Install-Driver_Ricoh() { return $DriverName; } -function Install-Driver_Choco( - [Parameter(Mandatory)] - [ValidateNotNullOrEmpty()] - [String]$DriverName, +function Install-Driver_HP() { + [String]$DriverName = 'HP Universal Printing PCL 6'; - [Parameter(Mandatory)] - [ValidateNotNullOrEmpty()] - [String]$ChocolateyPackage -) { - begin { Enter-Scope; } - end { Exit-Scope; } + if (Get-PrinterDriver -Name $DriverName -ErrorAction SilentlyContinue) { + Invoke-Info "Driver $DriverName already installed, skipping..."; + return $DriverName; + } - process { - try { - Install-ManagedPackage -PackageName $ChocolateyPackage; - } catch { - throw "Unable to install package $ChocolateyPackage"; - } + Invoke-Info 'Installing HP Universal Print Driver...'; + Install-ManagedPackage -PackageName 'hp-universal-print-driver-pcl'; + + return $DriverName; +} + +function Install-Driver_KonciaMinolta() { + [String]$DriverName = 'Konica Minolta Universal PCL'; + + if (Get-PrinterDriver -Name $DriverName -ErrorAction SilentlyContinue) { + Invoke-Info "Driver $DriverName already installed, skipping..."; + return $DriverName; } + + Invoke-Info 'Installing Konica Minolta Universal PCL driver...'; + Install-ManagedPackage -PackageName 'kmupd'; + + return $DriverName; } -function Install-Driver( +function Install-Driver_ByDriverName( [String]$DriverName, [String]$ChocolateyPackage - ) { begin { Enter-Scope; } end { Exit-Scope; } @@ -122,37 +144,52 @@ function Install-Driver( Invoke-Info "Driver $DriverName already installed, skipping..."; return $DriverName; } elseif ($ChocolateyPackage) { - Install-Driver_Choco -DriverName $DriverName -ChocolateyPackage $ChocolateyPackage; + Install-ManagedPackage -PackageName $ChocolateyPackage; return $DriverName; - } elseif ($Manufacturer) { - switch ($Manufacturer) { - 'Ricoh' { Install-Driver_Ricoh; } + } + + Invoke-Info 'No chocolatey package or manufacturer specified, trying to find driver already installed.'; + [TimeSpan]$Local:WaitTimeout = New-TimeSpan -Minutes 5; + do { + Invoke-Info "Waiting for driver $DriverName to be installed; $($Local:WaitTimeout.TotalSeconds) seconds remaining..."; + [DateTime]$Local:StartTime = Get-Date; + + if (Get-PrinterDriver -Name $DriverName -ErrorAction SilentlyContinue) { + Invoke-Info "Driver $DriverName found, proceeding..."; + return; } - } else { - Invoke-Info 'No chocolatey package or manufacturer specified, trying to find driver already installed.'; - [TimeSpan]$Local:WaitTimeout = New-TimeSpan -Minutes 5; - do { - Invoke-Info "Waiting for driver $DriverName to be installed; $($Local:WaitTimeout.TotalSeconds) seconds remaining..."; - [DateTime]$Local:StartTime = Get-Date; - - if (Get-PrinterDriver -Name $DriverName -ErrorAction SilentlyContinue) { - Invoke-Info "Driver $DriverName found, proceeding..."; - return; - } - - [DateTime]$Local:EndTime = Get-Date; - [TimeSpan]$Local:ProcessingTime -= ($Local:EndTime - $Local:StartTime); - $Local:WaitTimeout -= $Local:ProcessingTime; - - if ($Local:ProcessingTime.Milliseconds -lt 1000) { - Invoke-Verbose 'Processing time took less than 1 second, sleeping for the remainder of the second.'; - Start-Sleep -Milliseconds (1000 - $Local:ProcessingTime.Milliseconds); - } else { - Invoke-Verbose 'Wait timeout took longer than 1 second, skipping sleep.'; - } - } while ($Local:WaitTimeout.TotalSeconds -gt 0) - - throw "Unable to find driver $DriverName"; + + [DateTime]$Local:EndTime = Get-Date; + [TimeSpan]$Local:ProcessingTime -= ($Local:EndTime - $Local:StartTime); + $Local:WaitTimeout -= $Local:ProcessingTime; + + if ($Local:ProcessingTime.Milliseconds -lt 1000) { + Invoke-Verbose 'Processing time took less than 1 second, sleeping for the remainder of the second.'; + Start-Sleep -Milliseconds (1000 - $Local:ProcessingTime.Milliseconds); + } else { + Invoke-Verbose 'Wait timeout took longer than 1 second, skipping sleep.'; + } + } while ($Local:WaitTimeout.TotalSeconds -gt 0) + + throw "Unable to find driver $DriverName"; + } +} + +function Install-Driver_ByManufacturer { + [OutputType([String])] + param( + [String]$DriverName + ) + + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + switch ($Manufacturer) { + 'Ricoh' { return Install-Driver_Ricoh; } + 'HP' { return Install-Driver_HP; } + 'Konica Minolta' { return Install-Driver_KonciaMinolta; } + default { throw "Unknown manufacturer $Manufacturer"; } } } } @@ -212,14 +249,25 @@ function Install-PrinterImpl( Invoke-RunMain $PSCmdlet { [String]$Local:TrimmedPrinterName = $PrinterName.Trim(); [String]$Local:TrimmedPrinterIP = $PrinterIP.Trim(); - [String]$Local:TrimmedPrinterDriver = $PrinterDriver.Trim(); - [String]$Local:TrimmedChocoDriver = $ChocoDriver.Trim(); if (-not $Force -and (-not (Test-Connection -ComputerName $Local:TrimmedPrinterIP -Count 1 -Quiet))) { - Invoke-Info "Unable to contact printer $Local:TrimmedPrinterIP, exiting."; + Invoke-Warn "Unable to contact printer $Local:TrimmedPrinterIP, exiting."; return; } - [String]$Local:PrinterDriver = Install-Driver -DriverName $Local:TrimmedPrinterDriver -ChocolateyPackage $Local:TrimmedChocoDriver; - Install-PrinterImpl -PrinterName $Local:TrimmedPrinterName -PrinterIP $Local:TrimmedPrinterIP -PrinterDriver $Local:TrimmedPrinterDriver; + [String]$Local:PrinterDriver = $null; + if ($PSCmdlet.ParameterSetName -eq 'ByDriverName') { + [String]$Local:TrimmedPrinterDriver = $PrinterDriver.Trim(); + [String]$Local:TrimmedChocoDriver = $ChocoDriver.Trim(); + $Local:PrinterDriver = Install-Driver_ByDriverName -DriverName $Local:TrimmedPrinterDriver -ChocolateyPackage $Local:TrimmedChocoDriver; + } elseif ($PSCmdlet.ParameterSetName -eq 'ByManufacturer') { + $Local:PrinterDriver = Install-Driver_ByManufacturer -Manufacturer $Local:TrimmedPrinterManufacturer; + } + + if (-not $Local:PrinterDriver) { + Invoke-Error 'Unable to find or install printer driver, exiting.'; + Invoke-FailedExit -ExitCode 1000; + } + + Install-PrinterImpl -PrinterName $Local:TrimmedPrinterName -PrinterIP $Local:TrimmedPrinterIP -PrinterDriver $Local:PrinterDriver; } From 54ab1fc0b020bfa570d97ef11c098c9bb34d9493 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 10:59:28 +1100 Subject: [PATCH 195/341] feat(Get-InstalledSoftware): Allow only processing for select clients and caching fixes --- src/common/Input.psm1 | 17 ++++- src/n-sight/Get-InstalledSoftware.ps1 | 102 +++++++++++++++----------- 2 files changed, 74 insertions(+), 45 deletions(-) diff --git a/src/common/Input.psm1 b/src/common/Input.psm1 index 9876d670..81113ec6 100644 --- a/src/common/Input.psm1 +++ b/src/common/Input.psm1 @@ -449,12 +449,25 @@ function Get-PopupSelection { [Object[]]$Items, [Parameter()] - [switch]$AllowNone + [Switch]$AllowNone, + + [Parameter()] + [Switch]$AllowMultiple ) + $ViewArgs = @{ + Title = $Title; + }; + + if ($AllowMultiple) { + $ViewArgs.OutputMode = 'Multiple'; + } else { + $ViewArgs.PassThru = $True; + } + $Local:Selection; while (-not $Local:Selection) { - $Local:Selection = $Items | Out-GridView -Title $Title -PassThru; + $Local:Selection = $Items | Out-GridView @ViewArgs; if ((-not $AllowNone) -and (-not $Local:Selection)) { Invoke-Info 'No Item was selected, re-running selection...'; } diff --git a/src/n-sight/Get-InstalledSoftware.ps1 b/src/n-sight/Get-InstalledSoftware.ps1 index 6eaed3b0..a64ce6c7 100644 --- a/src/n-sight/Get-InstalledSoftware.ps1 +++ b/src/n-sight/Get-InstalledSoftware.ps1 @@ -1,7 +1,10 @@ +#Requires -Version 7.0 + Using module ../common/Environment.psm1 Using module ../common/Logging.psm1 Using module ../common/Scope.psm1 Using module ../common/Cache.psm1 +Using module ../common/Input.psm1 Using module ImportExcel @@ -9,8 +12,9 @@ Using module ImportExcel param ( [String]$Endpoint = 'system-monitor.com', + [Parameter(Mandatory)] [ValidateLength(32, 32)] - [String]$ApiKey = '', + [String]$ApiKey, [ValidateSet('Workstation', 'Server')] [String[]]$DeviceTypes = @('Workstation', 'Server') @@ -199,11 +203,7 @@ function Out-ToExcel { } Invoke-RunMain $PSCmdlet { - if (-not (Get-Variable Clients -Scope Global)) { - Invoke-Debug 'Creating global clients variable.'; - $Local:Clients = @{ }; - } - + $Local:Clients = @{ }; $Local:RawClients = (Get-NableClient); [Int]$Local:PercentPerItem = 100 / $Local:RawClients.items.client.Count; @@ -211,42 +211,67 @@ Invoke-RunMain $PSCmdlet { Invoke-Debug "Processing clients: $($Local:RawClients.items.client.Count)"; - for ($i = 0; $i -lt $Local:RawClients.items.client.Count; $i++) { - $Local:Client = $Local:RawClients.items.client[$i]; - $ClientId = $Local:Client.clientid; + # Query user for what clients to process with a multi-select list. + $Local:SelectedClients = (Get-PopupSelection ` + -AllowMultiple ` + -Title 'Select Clients to Process' ` + -Items ($Local:RawClients.items.client | ForEach-Object { + [PSCustomObject]@{ + Name = $_.name.'#cdata-section'; + ClientId = $_.clientid; + WorkstationCount = $_.workstation_count; + ServerCount = $_.server_count; + } + })) | Where-Object { $null -ne $_ }; + + if ($null -eq $Local:SelectedClients -or $Local:SelectedClients.Count -eq 0) { + Invoke-Error 'No clients selected to process.'; + return; + } + + Invoke-Info "Processing $($Local:SelectedClients.Count) clients."; + + foreach ($Client in $Local:SelectedClients) { + $ClientId = $Client.ClientId; + Invoke-Debug "Processing client: $($Local:Client.Name) with ID: $ClientId"; - Invoke-Debug "Processing client: $($Local:Client.name.'#cdata-section')"; - Write-Progress -Activity 'Calling API' -Status "$Local:PercentComplete% Complete" -CurrentOperation "Processing client [$($Local:Client.name)]..." -PercentComplete $Local:PercentComplete; + Invoke-Debug "Processing client: $($Local:Client.Name)"; + Write-Progress ` + -Activity 'Calling API' ` + -Status "$Local:PercentComplete% Complete" ` + -CurrentOperation "Processing client [$($Local:Client.name)]..." ` + -PercentComplete $Local:PercentComplete; if ($Local:Clients[$ClientId] -and $Local:Clients[$ClientId].completed) { Invoke-Debug "Client already processed: $ClientId"; continue; } - $Local:Clients[$ClientId] = @{ name = $Local:Client.name.'#cdata-section'; completed = $false; }; + $Local:Clients[$ClientId] = @{ name = $Local:Client.Name; completed = $false; }; $Local:Clients[$ClientId].sites = @{ }; $Local:Sites = (Get-NableSite -ClientIds $ClientId); if ($Local:Sites -eq $null -or $Local:Sites.Count -eq 0) { + Invoke-Verbose "No sites found for client: $ClientId"; continue; } - $Local:Sites | ForEach-Object { - $SiteId = $_.siteid; + foreach ($Local:Site in $Local:Sites) { + $SiteId = $Local:Site.siteid; Invoke-Debug "Processing site: $SiteId"; if ($Local:Clients[$ClientId].sites[$SiteId] -and $Local:Clients[$ClientId].sites[$SiteId].completed) { Invoke-Debug "Site already processed: $SiteId"; - return; + continue; } - $Local:Clients[$ClientId].sites[$SiteId] = @{ name = $_.name.'#cdata-section'; completed = $false }; + $Local:Clients[$ClientId].sites[$SiteId] = @{ name = $Local:Site.name.'#cdata-section'; completed = $false }; #region Workstations function Set-DeviceSoftware { [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSUseShouldProcessForStateChangingFunctions', - $null, + '', Justification = 'Only reading data from the API, no changes are being made to the system.' )] param( @@ -264,17 +289,17 @@ Invoke-RunMain $PSCmdlet { [Object]$Clients ) - Get-CachedContent -Name "NSIGHT_${ClientId}_${SiteId}_${DeviceType}" -CreateBlock { + Get-CachedContent -Name "NSIGHT_${ClientId}_${SiteId}_${DeviceType}" -MaxAge (New-TimeSpan -Days 1) -CreateBlock { $Clients[$ClientId].sites[$SiteId].${DeviceType} = @{ }; $Local:Table = $Clients[$ClientId].sites[$SiteId].${DeviceType}; $Local:Devices = (Get-NableDevice -SiteIds $SiteId -DeviceType $DeviceType); if ($null -eq $Local:Devices -or $Local:Devices.Count -eq 0) { - return $null; + return $Local:Table | ConvertTo-Json -Depth 9; } - $Local:Devices | ForEach-Object { - $AssetId = $_.assetid; + foreach ($Local:Device in $Local:Devices) { + $AssetId = $Local:Device.assetid; Invoke-Debug "Processing ${DeviceType}: $AssetId"; if ($Local:Table[$AssetId] -and $Local:Table[$AssetId].completed) { @@ -282,7 +307,7 @@ Invoke-RunMain $PSCmdlet { return; } - $Local:Table[$AssetId] = @{ type = $DeviceType; name = $_.name.'#cdata-section'; user = $_.user.'#cdata-section'; completed = $false }; + $Local:Table[$AssetId] = @{ type = $DeviceType; name = $Local:Device.name.'#cdata-section'; user = $Local:Device.user.'#cdata-section'; completed = $false }; $Local:Table[$AssetId].software = @{ }; $Local:Software = (Get-NableDeviceoftware -DeviceIds $AssetId); @@ -290,26 +315,27 @@ Invoke-RunMain $PSCmdlet { return; } - $Local:Software | ForEach-Object { - $SoftwareId = $_.softwareid; + foreach ($Local:Program in $Local:Software) { + $SoftwareId = $Local:Program.softwareid; Invoke-Debug "Processing software: $SoftwareId"; - $Local:Table[$AssetId].software[$SoftwareId] = @{ name = $_.name.'#cdata-section'; version = $_.version.'#cdata-section'; }; + $Local:Table[$AssetId].software[$SoftwareId] = @{ name = $Local:Program.name.'#cdata-section'; version = $Local:Program.version.'#cdata-section'; }; }; $Local:Table[$AssetId].completed = $true; }; - return $Local:Table | ConvertTo-Json; + return $Local:Table | ConvertTo-Json -Depth 9; } -ParseBlock { param($RawContent) - return ConvertFrom-Json $RawContent; - } + $Clients[$ClientId].sites[$SiteId].${DeviceType} = ConvertFrom-Json $RawContent -AsHashtable; + }; } - Set-DeviceSoftware -DeviceType Workstation -SiteId $SiteId -ClientId $ClientId -Clients $Local:Clients; - Set-DeviceSoftware -DeviceType Server -SiteId $SiteId -ClientId $ClientId -Clients $Local:Clients; + foreach ($DeviceType in $DeviceTypes) { + Set-DeviceSoftware -DeviceType $DeviceType -SiteId $SiteId -ClientId $ClientId -Clients $Local:Clients; + } $Local:Clients[$ClientId].sites[$SiteId].completed = $true; }; @@ -319,17 +345,6 @@ Invoke-RunMain $PSCmdlet { }; Write-Progress -Activity 'Calling API' -PercentComplete 100 -Completed; - # $Local:Clients = Get-CachedContent -Name 'NSIGHT_CLIENTS' -CreateBlock { - # $Local:RawClients = Get-NableClient; - - # $Local:RawClients.items.client | ForEach-Object { - # []$Local:Client = $_; - # [String]$Local:ClientId = $Local:Client.clientid; - - - # } - # } - $Local:Data = @{ Headers = @('Client', 'Site', 'DeviceType', 'Device', 'User', 'Software', 'Version'); Matrix = New-Object 'System.Collections.Generic.List[System.Object]'; @@ -377,8 +392,9 @@ Invoke-RunMain $PSCmdlet { }; } - Add-ToMatrix -Data:$Local:Data -Client $Client -Site $Site -DeviceType Workstation; - Add-ToMatrix -Data:$Local:Data -Client $Client -Site $Site -DeviceType Server; + foreach ($DeviceType in $DeviceTypes) { + Add-ToMatrix -Data:$Local:Data -Client $Client -Site $Site -DeviceType $DeviceType; + } }; }; From f63f642c7fef3e00347660c1161070577a9005bc Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 11:00:37 +1100 Subject: [PATCH 196/341] feat(Invoke-RebootNotice): Add time window parameter for reboot notice display Also fixes an issue which caused the message to display more than it should. --- src/automation/Invoke-RebootNotice.ps1 | 58 +++++++++++++++++++++----- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/src/automation/Invoke-RebootNotice.ps1 b/src/automation/Invoke-RebootNotice.ps1 index 576fa29b..4618d3cd 100644 --- a/src/automation/Invoke-RebootNotice.ps1 +++ b/src/automation/Invoke-RebootNotice.ps1 @@ -5,13 +5,19 @@ This script checks for a few conditions with their own reasons to determine if a reboot is required. If a reboot is required the user is sent a message with the reason and a request to reboot. - The script will only send the message once per day at maximum, this is to avoid spamming the user with messages. + The script will only display the message if the current time is within one of the time windows specified. + This will be multiple times per day if there are more than one time window, but only once per time window. The script will exit with an exit code of 5100 if a reboot is required, and with an exit code of 0 if no reboot is required. .PARAMETER MaxUpTime The maximum amount of time the computer can be up before a reboot is required. The default is 7 days. +.PARAMETER TimeWindows + An array of time windows in which the message can be displayed. + The default is 7-9, and 16-19. + The format is an array of tuples with the first element being the start hour and the second element being the end hour. + For example, [Tuple]::Create(7, 9) would be a time window from 7 to 9. .INPUTS None .OUTPUTS @@ -22,6 +28,9 @@ .\Invoke-RebootNotice.ps1 -MaxUpTime [TimeSpan]::FromDays(1) Runs the script with a maximum uptime of 1 day instead of the default 7. + + .\Invoke-RebootNotice.ps1 -TimeWindows @([Tuple]::Create(7, 9), [Tuple]::Create(12-2), [Tuple]::Create(16, 19)) + Runs the script with time windows from 7-9, 12-14, and 16-19. #> Using module ../common/Environment.psm1 @@ -30,8 +39,15 @@ Using module ../common/Scope.psm1 Using module ../common/Flag.psm1 Using module ../common/Exit.psm1 +using namespace System.Collections.Generic + +[CmdletBinding()] param( - [TimeSpan]$MaxUpTime = [TimeSpan]::FromDays(7) + [TimeSpan]$MaxUpTime = [TimeSpan]::FromDays(7), + [Tuple[int,int][]]$TimeWindows = @( + [Tuple]::Create(7, 9), + [Tuple]::Create(16, 19) + ) ) function Format-Time { @@ -66,7 +82,7 @@ function Get-ShouldRestart { if ((Get-CimInstance -Class Win32_OperatingSystem).LastBootUpTime -lt (Get-Date).Add(-$MaxUpTime)) { return [PSCustomObject]@{ required = $true - reason = "This computer hasn't been restarted for more than $(Format-Time $MaxUpTime)" + reason = "This computer hasn't been restarted for more than $(Format-Time $MaxUpTime)" } } @@ -88,13 +104,32 @@ function Get-ShouldRestart { Invoke-RunMain $PSCmdlet { $Local:RequiresRestart = Get-ShouldRestart; if (-not $Local:RequiresRestart.required) { - Invoke-Info "No reboot required."; + Invoke-Info 'No reboot required.'; + return; + } + + [Tuple[DateTime,DateTime][]]$Local:DateTimeWindows = $TimeWindows | ForEach-Object { + [Tuple]::Create([DateTime]::Now.Date.AddHours($_.Item1), [DateTime]::Now.Date.AddHours($_.Item2)) + }; + + $Local:Now = Get-Date; + $Local:WithinTimeWindow = $null; + foreach ($Local:TimeWindow in $Local:DateTimeWindows) { + Invoke-Debug "Checking time window: $Local:TimeWindow"; + if ($Local:TimeWindow[0] -le $Local:Now -and $Local:TimeWindow[1] -ge $Local:Now) { + Invoke-Debug "Within time window: $Local:TimeWindow"; + $Local:WithinTimeWindow = $Local:TimeWindow; + break; + } + } + + if ($null -eq $Local:WithinTimeWindow) { + Invoke-Info 'Not within time window to show reboot notice.'; return; } - # Only show the message once per day at maximum - # Use a flag to track the last time the message was shown - $Local:DisplayedMessage = Get-Flag 'REBOOT_HELPER_DISPLAYED'; + $Local:DisplayedMessage = Get-Flag "REBOOT_HELPER_DISPLAYED_$($Local:WithinTimeWindow[0].Hour)-$($Local:WithinTimeWindow[1].Hour)"; + Invoke-Debug "Displayed message: $($Local:DisplayedMessage)"; [Boolean]$Local:ShouldDisplayMessage = $True; if ($Local:DisplayedMessage.Exists()) { [String]$Local:RawLastDisplayed = $Local:DisplayedMessage.GetData(); @@ -105,7 +140,7 @@ Invoke-RunMain $PSCmdlet { [Boolean]$Local:DisplayedToday = $Local:LastDisplayed.Date -eq (Get-Date).Date; [Boolean]$Local:DisplayedWithinHour = $Local:LastDisplayed -gt (Get-Date).AddHours(-1); - if ($Local:DisplayedToday -and $Local:DisplayedWithinHour) { + if ($Local:DisplayedToday -or $Local:DisplayedWithinHour) { Invoke-Info "Reboot notice was already displayed today at $Local:LastDisplayed"; $Local:ShouldDisplayMessage = $False; } @@ -125,7 +160,7 @@ At your earliest convenience, please perform a restart. $Local:Message | . msg * /TIME:3600; if ($LASTEXITCODE -ne 0) { - Invoke-Error "Failed to send reboot notice."; + Invoke-Error 'Failed to send reboot notice.'; } else { Invoke-Info 'Reboot notice sent.'; $Local:DisplayedMessage.Set((Get-Date)); @@ -135,6 +170,7 @@ At your earliest convenience, please perform a restart. } } - Invoke-Error $Local:RequiresRestart.Reason; - Invoke-FailedExit -ExitCode 5100; + $ExitCode = Register-ExitCode $Local:RequiresRestart.reason; + # Invoke-Error $Local:RequiresRestart.Reason; + Invoke-FailedExit $ExitCode; }; From c4baea03b190d2c8bf9a725939d160f7c63d9c31 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 11:03:35 +1100 Subject: [PATCH 197/341] style: formatting updates --- src/microsoft/windows/AutoSetup.ps1 | 103 ++++++++++------------------ 1 file changed, 35 insertions(+), 68 deletions(-) diff --git a/src/microsoft/windows/AutoSetup.ps1 b/src/microsoft/windows/AutoSetup.ps1 index 6f9f8177..38c3cd3d 100644 --- a/src/microsoft/windows/AutoSetup.ps1 +++ b/src/microsoft/windows/AutoSetup.ps1 @@ -146,8 +146,7 @@ function Test-ConfigValueOrSave { Invoke-Info "Saving install info to $($InstallInfo.Path)..."; try { $InstallInfo | ConvertTo-Json | Set-Content -Path:$($InstallInfo.Path) -Force; - } - catch { + } catch { Invoke-Error "There was an issue saving the install info to $Local:File"; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:FAILED_SETUP_ENVIRONMENT; } @@ -191,12 +190,10 @@ function Update-ToWin11( if ($Queue) { Invoke-Info 'Windows 11 upgrade completed successfully, rebooting now...'; Add-QueuedTask -QueuePhase $Phase -ForceReboot:$True; - } - else { + } else { Invoke-Info 'Windows 11 upgrade completed successfully, please reboot to continue...'; } - } - catch { + } catch { Invoke-Error 'Failed to start Windows 11 upgrade'; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:FAILED_SETUP_ENVIRONMENT; } @@ -226,8 +223,7 @@ function Invoke-EnsureLocalScript { try { Copy-Item -Path $MyInvocation.PSCommandPath -Destination $Local:Into -Force; - } - catch { + } catch { Invoke-Error 'Failed to copy script to temp folder'; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:FAILED_SETUP_ENVIRONMENT; } @@ -257,8 +253,7 @@ function Get-InstallInfo( If (Test-Path $Local:File) { try { [PSCustomObject]$Local:InstallInfo = Get-Content -Path $Local:File -Raw | ConvertFrom-Json; - } - catch { + } catch { Invoke-Error "There was an issue reading the install info from $Local:File"; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:FAILED_SETUP_ENVIRONMENT; } @@ -320,8 +315,7 @@ function Remove-QueuedTask { $Local:Task | Unregister-ScheduledTask -ErrorAction Stop -Confirm:$false; Invoke-Verbose -Message "Removed scheduled task [$TaskName]..."; } - } - catch { + } catch { Invoke-Verbose -Message "Scheduled task [$TaskName] does not exist, skipping removal..."; return; } @@ -414,19 +408,13 @@ function Invoke-Phase_SetupWindows { end { Exit-Scope; } process { + [String[]]$Local:ScreenSteps; + $Local:WindowsVersion = [System.Environment]::OSVersion.Version; switch ($Local:WindowsVersion.Major) { 10 { Invoke-Info 'Windows 10 detected, continuing...'; - [String]$Local:Manufacturer = (Get-WmiObject -Class Win32_ComputerSystem).Manufacturer; - - if ($Local:Manufacturer -eq 'HP') { - Invoke-Info 'HP device detected, continuing...'; - } - else { - Invoke-Error "This script is only supported on HP devices, not $($Local:Manufacturer)"; - Invoke-FailedExit -ExitCode $Script:FAILED_SETUP_ENVIRONMENT; - } + [String]$Local:Manufacturer = (Get-CimInstance -Class Win32_ComputerSystem).Manufacturer; Add-Type -AssemblyName System.Windows.Forms; Add-Type -AssemblyName Microsoft.VisualBasic; @@ -460,7 +448,7 @@ function Invoke-Phase_SetupWindows { '{TAB}{TAB}{TAB}{TAB}{ENTER}', # Terms and Conditions 'localadmin{ENTER}{ENTER}', # Create Local Account '{ENTER}+{TAB}{ENTER}', # Privacy Settings - '+{TAB}{ENTER}' + '+{TAB}{ENTER}' # No Cortana ); switch ($Local:Manufacturer) { @@ -472,12 +460,6 @@ function Invoke-Phase_SetupWindows { # Do nothing. } } - - $Local:ScreenSteps | ForEach-Object { - Start-Sleep -Seconds 1; - [System.Windows.Forms.SendKeys]::SendWait($_); - } - } default { Invoke-Error "This script is only supported on Windows 10, not Windows $($Local:WindowsVersion.Major)"; @@ -485,6 +467,11 @@ function Invoke-Phase_SetupWindows { } } + $Local:ScreenSteps | ForEach-Object { + Start-Sleep -Seconds 1; + [System.Windows.Forms.SendKeys]::SendWait($_); + } + return $null; } } @@ -506,8 +493,7 @@ function Invoke-PhaseConfigure([Parameter(Mandatory)][ValidateNotNullOrEmpty()][ if ($Local:ExistingName -eq $Local:DeviceName) { Invoke-Info "Device name is already set to $Local:DeviceName."; - } - else { + } else { Invoke-Info "Device name is not set to $Local:DeviceName, setting it now..."; Rename-Computer -NewName $Local:DeviceName; (Get-RebootFlag).Set($null); @@ -524,8 +510,7 @@ function Invoke-PhaseConfigure([Parameter(Mandatory)][ValidateNotNullOrEmpty()][ Set-ItemProperty -Path $Local:RegKey -Name 'DefaultPassword' -Value '' | Out-Null; Invoke-Info 'Auto-login registry keys set.'; - } - catch { + } catch { Invoke-Error 'Failed to set auto-login registry keys'; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:FAILED_REGISTRY; } @@ -583,8 +568,7 @@ function Invoke-PhaseCleanup { Write-Progress -Activity $Local:ProgressActivity -Status 'No items found.' -PercentComplete 100 -Completed; Invoke-Debug 'No Items found'; return; - } - else { + } else { Write-Progress -Activity $Local:ProgressActivity -Status "Processing $($Local:InputItems.Count) items..."; Invoke-Debug "Processing $($Local:InputItems.Count) items..."; } @@ -601,8 +585,7 @@ function Invoke-PhaseCleanup { try { $ErrorActionPreference = 'Stop'; $ProcessItem.InvokeReturnAsIs($Local:Item); - } - catch { + } catch { Invoke-Warn "Failed to process item [$Local:ItemName]"; Invoke-Debug -Message "Due to reason - $($_.Exception.Message)"; try { @@ -610,10 +593,8 @@ function Invoke-PhaseCleanup { if ($null -eq $FailedProcessItem) { $Local:FailedItems.Add($Local:Item); - } - else { $FailedProcessItem.InvokeReturnAsIs($Local:Item); } - } - catch { + } else { $FailedProcessItem.InvokeReturnAsIs($Local:Item); } + } catch { Invoke-Warn "Failed to process item [$Local:ItemName] in failed process item block"; } } @@ -645,8 +626,7 @@ function Invoke-PhaseCleanup { $ErrorActionPreference = 'Stop'; $Local:Instance = Get-Service -Name $ServiceName; - } - catch { + } catch { Invoke-Warn "Skipped service $ServiceName as it isn't installed."; } @@ -659,8 +639,7 @@ function Invoke-PhaseCleanup { $Local:Instance | Stop-Service -Force -Confirm:$false; Invoke-Info "Stopped service $Local:Instance"; } - } - catch { + } catch { Invoke-Info -Message "Failed to stop $Local:Instance"; } @@ -672,8 +651,7 @@ function Invoke-PhaseCleanup { $Local:Instance | Set-Service -StartupType Disabled -Confirm:$false; Invoke-Info "Disabled service $ServiceName"; } - } - catch { + } catch { Invoke-Warn "Failed to disable $ServiceName"; Invoke-Debug -Message "Due to reason - $($_.Exception.Message)"; } @@ -740,8 +718,7 @@ function Invoke-PhaseCleanup { $Local:Product = Get-CimInstance -Query "SELECT * FROM Win32_Product WHERE Name = '$($Program.Name)'"; if (-not $Local:Product) { throw "Can't find MSI Package for program [$($Program.Name)]"; - } - else { + } else { if ($PSCmdlet.ShouldProcess("Removing MSI program [$($Local:Product.Name)]")) { msiexec /x $Local:Product.IdentifyingNumber /quiet /noreboot | Out-Null; Invoke-Info "Sucessfully removed program [$($Local:Product.Name)]"; @@ -815,8 +792,7 @@ function Invoke-PhaseCleanup { pnputil /delete-driver $Local:FileName /uninstall /force | Out-Null; Invoke-Info "Removed driver: [$Local:FileName]"; } - } - catch { + } catch { Invoke-Warn "Failed to remove driver: $($Local:FileName): $($_.Exception.Message)"; } }; @@ -851,8 +827,7 @@ function Invoke-PhaseCleanup { if ($PSCmdlet.ShouldProcess("Creating registry path [$Local:RegistryPath]")) { New-Item -Path $Local:RegistryPath -Force | Out-Null; } - } - else { + } else { Invoke-Info "Registry path [$Local:RegistryPath] already exists, skipping creation..."; } @@ -866,8 +841,7 @@ function Invoke-PhaseCleanup { New-ItemProperty -Path $Local:RegistryPath -Name $Local:ValueName -Value $Local:ValueData -PropertyType $Local:RegistryTable.KIND | Out-Null; Invoke-Info "Created registry value [$Local:ValueName] with data [$Local:ValueData] in path [$Local:RegistryPath]"; } - } - else { + } else { Invoke-Info "Registry value [$Local:ValueName] already exists in path [$Local:RegistryPath], skipping creation..."; } } @@ -913,8 +887,7 @@ function Invoke-PhaseInstall([Parameter(Mandatory)][ValidateNotNullOrEmpty()][PS try { $ErrorActionPreference = 'Stop'; Invoke-WebRequest -Uri $Local:Uri -OutFile 'agent.zip' -UseBasicParsing; - } - catch { + } catch { Invoke-Error "Failed to download agent from [$Local:Uri]"; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:AGENT_FAILED_DOWNLOAD; } @@ -924,8 +897,7 @@ function Invoke-PhaseInstall([Parameter(Mandatory)][ValidateNotNullOrEmpty()][PS $ErrorActionPreference = 'Stop'; Expand-Archive -Path 'agent.zip' -DestinationPath $PWD -Force | Out-Null; - } - catch { + } catch { Invoke-Error 'Failed to expand archive'; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:AGENT_FAILED_EXPAND; } @@ -936,8 +908,7 @@ function Invoke-PhaseInstall([Parameter(Mandatory)][ValidateNotNullOrEmpty()][PS [String]$Local:OutputExe = Get-ChildItem -Path $PWD -Filter '*.exe' -File; $Local:OutputExe | Assert-NotNull -Message 'Failed to find agent executable'; - } - catch { + } catch { Invoke-Info 'Failed to find agent executable'; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:AGENT_FAILED_FIND; } @@ -950,8 +921,7 @@ function Invoke-PhaseInstall([Parameter(Mandatory)][ValidateNotNullOrEmpty()][PS $Local:Installer.ExitCode | Assert-Equals -Expected 0 -Message "Agent installer failed with exit code [$($Local:Installer.ExitCode)]"; (Get-RebootFlag).Set($null); - } - catch { + } catch { Invoke-Error "Failed to install agent from [$Local:OutputExe]"; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:AGENT_FAILED_INSTALL; } @@ -996,8 +966,7 @@ function Invoke-PhaseFinish { Remove-ItemProperty -Path $Local:RegKey -Name 'AutoAdminLogon' -Force -ErrorAction Stop; Remove-ItemProperty -Path $Local:RegKey -Name 'DefaultUserName' -Force -ErrorAction Stop; Remove-ItemProperty -Path $Local:RegKey -Name 'DefaultPassword' -Force -ErrorAction Stop; - } - catch { + } catch { Invoke-Error 'Failed to remove auto-login registry keys'; Invoke-FailedExit -ErrorRecord $_ -ExitCode $Script:FAILED_REGISTRY; } @@ -1022,8 +991,7 @@ Invoke-RunMain $PSCmdlet { If ((Get-RunningFlag).IsRunning()) { Invoke-Error 'The script is already running in another session, exiting...'; Exit $Script:ALREADY_RUNNING; - } - else { + } else { (Get-RunningFlag).Set($null); Remove-QueuedTask; } @@ -1047,8 +1015,7 @@ Invoke-RunMain $PSCmdlet { $null = Install-Module -Name 'PSReadLine' -MinimumVersion '2.3.4' -Force; try { $null = Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine -Force -ErrorAction SilentlyContinue; - } - catch { + } catch { # It actually did succeed, but it throws an error. } From 5186f5caa209f02491fdeb67d30cf9bb546ab58d Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 17:19:48 +1100 Subject: [PATCH 198/341] perf(Analyser): Cache functions and aliases between scans --- .../Analyser/Rules/UseOfUndefinedFunction.cs | 43 ++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index 66ab6441..7ecfaf88 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -16,7 +16,11 @@ public class UseOfUndefinedFunction : Rule { /// A list of all the built-in functions that are provided in a standard session. /// This includes modules that are imported by default. /// - private static readonly IEnumerable BuiltinsFunctions = GetDefaultSessionFunctions(); + private static readonly HashSet BuiltinsFunctions = GetDefaultSessionFunctions().ToHashSet(); + + // Don't use a concurrent dictionary as just having it per thread is actually faster. + private static readonly ThreadLocal>> AvailableFunctionsAndAliasesForAst = new(() => []); + private static readonly ThreadLocal>> AvailableFunctionsAndAliasesForRemote = new(() => []); public override bool SupportsModule(T compiledModule) => compiledModule is CompiledLocalModule; @@ -34,7 +38,7 @@ public override bool ShouldProcess( case string function: return function == callName; default: - Logger.Warn($"Supression data is not a string or IEnumerable for rule {this.GetType().Name}"); + Logger.Warn($"Supression data is not a string or IEnumerable for rule {this.GetType().Name}, received {supression?.Data?.GetType()?.Name}"); return false; } }); @@ -47,9 +51,17 @@ public override IEnumerable Analyse( var callName = SanatiseName(commandAst.GetCommandName()); if (BuiltinsFunctions.Contains(callName)) yield break; - if (AstHelper.FindAvailableFunctions(AstHelper.FindRoot(node), false).Select(definition => SanatiseName(definition.Name)).Contains(callName)) yield break; - if (AstHelper.FindAvailableAliases(AstHelper.FindRoot(node), false).Select(SanatiseName).Contains(callName)) yield break; - if (importedModules.Any(module => module.GetExportedFunctions().Select(SanatiseName).Contains(callName))) yield break; + + var rootNode = AstHelper.FindRoot(node); + if (GetAvailableFunctionsAndAliasesForAst(rootNode).Contains(callName)) yield break; + + foreach (var module in importedModules) { + if (module is CompiledLocalModule localModule) { + if (GetAvailableFunctionsAndAliasesForAst(localModule.Document.Ast).Contains(callName)) yield break; + } else { + if (GetAvailableFunctionsAndAliasesForRemote(module).Contains(callName)) yield break; + } + } yield return Issue.Warning( $"Undefined function '{commandAst.GetCommandName()}'", @@ -95,4 +107,25 @@ public static IEnumerable GetDefaultSessionFunctions() { defaultFunctions.AddRange(ps.Select(commandName => ((string)commandName.BaseObject).Replace(".exe", ""))); return defaultFunctions.Distinct().Select(SanatiseName); } + + private static HashSet GetAvailableFunctionsAndAliasesForAst(Ast rootNode) { + if (!AvailableFunctionsAndAliasesForAst.Value!.TryGetValue(rootNode, out var set)) { + set = []; + set.UnionWith(AstHelper.FindAvailableFunctions(rootNode, false).Select(definition => SanatiseName(definition.Name))); + set.UnionWith(AstHelper.FindAvailableAliases(rootNode, false).Select(SanatiseName)); + AvailableFunctionsAndAliasesForAst.Value[rootNode] = set; + } + + return set; + } + + private static HashSet GetAvailableFunctionsAndAliasesForRemote(Compiled module) { + if (!AvailableFunctionsAndAliasesForRemote.Value!.TryGetValue(module.ComputedHash, out var set)) { + set = []; + set.UnionWith(module.GetExportedFunctions().Select(SanatiseName)); + AvailableFunctionsAndAliasesForRemote.Value.TryAdd(module.ComputedHash, set); + } + + return set; + } } From 39330e7fb7cceaa26fd8e5917ea5123c121d1ab9 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 17:21:14 +1100 Subject: [PATCH 199/341] refactor(Analyser): Mark the extent as the usage of PSCmdlet instead of a random location if possible --- src/Compiler/Analyser/Rules/MissingCmdlet.cs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Compiler/Analyser/Rules/MissingCmdlet.cs b/src/Compiler/Analyser/Rules/MissingCmdlet.cs index 1725c9f8..a9955caf 100644 --- a/src/Compiler/Analyser/Rules/MissingCmdlet.cs +++ b/src/Compiler/Analyser/Rules/MissingCmdlet.cs @@ -9,6 +9,9 @@ namespace Compiler.Analyser.Rules; /// /// Ensures that the script contains a param block with the CmdletBinding Attribute at the top level. +/// +/// This is applied to all scripts as a general rule, however is only important to scripts using the +/// Invoke-RunMain $PSCmdlet function due to the usage of the $PSCmdlet object. /// public class MissingCmdlet : Rule { public override bool SupportsModule(T compiledModule) => compiledModule is CompiledScript; @@ -38,8 +41,8 @@ IEnumerable importedModules /// Gets the error location for the issue. /// /// If the script block has a top level param block, then its extent is returned. - /// Otherwise an extent covering the location after the using statements, - /// but before the first command, function or variable assignment is returned. + /// If the script usage of the $PSCmdlet object with the Invoke-RunMain function, then that extent is returned. + /// If an extent covering the location after the using statements, but before the first command, function or variable assignment is returned. /// /// /// @@ -48,6 +51,19 @@ private static IScriptExtent GetErrorLocation(ScriptBlockAst scriptBlockAst) { return scriptBlockAst.ParamBlock.Extent; } + // Find the usage of the $PSCmdlet object + + if (scriptBlockAst.Find(ast => ast is CommandAst commandAst + && (string)commandAst.CommandElements[0].SafeGetValue() == "Invoke-RunMain", false) + is CommandAst invokeRunMain + ) { + // If there are named arguments look for the -Cmdlet parameter, otherwise get the first argument + var cmdletArgument = invokeRunMain.Find(ast => ast is CommandParameterAst commandParameterAst && commandParameterAst.ParameterName == "Cmdlet", false) + ?? invokeRunMain.CommandElements[1]; + + return cmdletArgument.Extent; + } + var lastUsing = scriptBlockAst.FindAll(ast => ast is UsingStatementAst, false).LastOrDefault(); var first = scriptBlockAst.Find(ast => ast is CommandAst or FunctionDefinitionAst or AssignmentStatementAst, false); From 7a5c04e84ef7372e4b4a198eb84bc01e0dc11068 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 17:42:25 +1100 Subject: [PATCH 200/341] refactor(Compiler): Different colours for warnings vs errors --- src/Compiler/Analyser/Issue.cs | 3 ++- src/Compiler/AstHelper.cs | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Compiler/Analyser/Issue.cs b/src/Compiler/Analyser/Issue.cs index 82ceb856..65a10b2d 100644 --- a/src/Compiler/Analyser/Issue.cs +++ b/src/Compiler/Analyser/Issue.cs @@ -28,7 +28,8 @@ public override string ToString() => AstHelper.GetPrettyAstError( this.Extent, this.Parent, Some(this.ActualMessage), - this.Module.Map(mod => mod is PathedModuleSpec pathed ? pathed.FullPath : mod.Name) + this.Module.Map(mod => mod is PathedModuleSpec pathed ? pathed.FullPath : mod.Name), + this.Severity ); public virtual bool Equals(Issue? other) { diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index 63eb6c4c..f66d99b2 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -225,11 +225,19 @@ public static string GetPrettyAstError( [NotNull] IScriptExtent extent, [NotNull] Ast parentAst, [NotNull] Option message, - [NotNull] Option realFilePath = default) { + [NotNull] Option realFilePath = default, + [NotNull] IssueSeverity severity = IssueSeverity.Error) { ArgumentNullException.ThrowIfNull(extent); ArgumentNullException.ThrowIfNull(parentAst); ArgumentNullException.ThrowIfNull(message); + + var problemColour = severity switch { + IssueSeverity.Error => "#8b0000", + IssueSeverity.Warning => "#f9f1a5", + _ => "#808080" + }; + var startingLine = extent.StartLineNumber; var endingLine = extent.EndLineNumber; var startingColumn = extent.StartColumnNumber - 1; @@ -248,10 +256,10 @@ public static string GetPrettyAstError( for (var i = 0; i < extentRegion.Length; i++) { var line = extentRegion[i]; line = i switch { - 0 when i == extentRegion.Length - 1 => string.Concat(line[0..startingColumn], line[startingColumn..endingColumn].Pastel(ConsoleColor.DarkRed), line[endingColumn..]), - 0 => string.Concat(line[0..startingColumn], line[startingColumn..].Pastel(ConsoleColor.DarkRed)), - var _ when i == extentRegion.Length - 1 => string.Concat(line[0..endingColumn].Pastel(ConsoleColor.DarkRed), line[endingColumn..]), - _ => line.Pastel(ConsoleColor.DarkRed) + 0 when i == extentRegion.Length - 1 => string.Concat(line[0..startingColumn], line[startingColumn..endingColumn].Pastel(problemColour), line[endingColumn..]), + 0 => string.Concat(line[0..startingColumn], line[startingColumn..].Pastel(problemColour)), + var _ when i == extentRegion.Length - 1 => string.Concat(line[0..endingColumn].Pastel(problemColour), line[endingColumn..]), + _ => line.Pastel(problemColour) }; var sb = new StringBuilder() @@ -275,13 +283,12 @@ public static string GetPrettyAstError( var fileName = realFilePath.UnwrapOrElse(() => parentAst.Extent.File is null ? "Unknown file" : parentAst.Extent.File); var location = TextSpan.New(startingLine, startingColumn, endingLine, endingColumn).Unwrap(); // Safety: Extents should always be valid. - return $""" {"File".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} {fileName.Pastel(ConsoleColor.Gray)} {"Where".PadRight(firstColumnIndent).Pastel(ConsoleColor.Cyan)}{colouredPipe} {location.ToString().Pastel(ConsoleColor.Gray)} {string.Join('\n', printableLines)} - {firstColumnIndentString}{colouredPipe} {errorPointer.Pastel(ConsoleColor.DarkRed)} - {firstColumnIndentString}{colouredPipe} {message.UnwrapOrElse(static () => "Unknown Error").Pastel(ConsoleColor.DarkRed)} + {firstColumnIndentString}{colouredPipe} {errorPointer.Pastel(problemColour)} + {firstColumnIndentString}{colouredPipe} {message.UnwrapOrElse(static () => "Unknown Error").Pastel(problemColour)} """; } From ea65420bed157a768db4edd937dafc1694a5b5d1 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 18:01:44 +1100 Subject: [PATCH 201/341] refactor(Connection): Enhance session management with connection IDs for Exchange and IPPSSession --- src/common/Connection.psm1 | 43 ++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/common/Connection.psm1 b/src/common/Connection.psm1 index 599849cc..cf599034 100644 --- a/src/common/Connection.psm1 +++ b/src/common/Connection.psm1 @@ -7,13 +7,8 @@ Using module ExchangeOnlineManagement Using module AzureAD Using module MSOnline -[CmdletBinding()] -[Compiler.Analyser.SuppressAnalyserAttribute( - CheckType = 'UseOfUndefinedFunction', - Data = 'Get-ConnectionInformation', 'Get-IPPSSession', 'Get-AzureADCurrentSessionInfo', 'Get-MgContext', 'Get-MsolCompanyInformation', 'Connect-AzureAD', 'Disconnect-AzureAD', - Justification = 'wmic is not available on the builder machine' -)] -param() +$Script:ExchangeSessionId; +$Script:IPPSSessionId; function Local:Invoke-NonNullParams { [CmdletBinding()] @@ -40,15 +35,33 @@ function Local:Invoke-NonNullParams { $Script:Services = @{ ExchangeOnline = @{ Matchable = $True; - Context = { Get-ConnectionInformation | Select-Object -ExpandProperty UserPrincipalName; }; - Connect = { param($AccessToken) Invoke-NonNullParams 'Connect-ExchangeOnline' ($PSBoundParameters + @{ ShowBanner = $False }); }; + Context = { + if ($Script:ExchangeSessionId) { + Get-ConnectionInformation -ConnectionId:$Script:ExchangeSessionId | Select-Object -ExpandProperty UserPrincipalName; + } else { + $null; + } + }; + Connect = { param($AccessToken) + Invoke-NonNullParams 'Connect-ExchangeOnline' ($PSBoundParameters + @{ ShowBanner = $False }); + $Script:ExchangeSessionId = Get-ConnectionInformation | Select-Object -Last 1 -ExpandProperty ConnectionId; + }; Disconnect = { Disconnect-ExchangeOnline -Confirm:$False }; }; SecurityComplience = @{ Matchable = $True; - Context = { Get-IPPSSession | Select-Object -ExpandProperty UserPrincipalName; }; - Connect = { Connect-IPPSSession -ShowBanner:$False }; - Disconnect = { Disconnect-IPPSSession }; + Context = { + if ($Script:IPPSSessionId) { + Get-ConnectionInformation -ConnectionId:$Script:IPPSSessionId | Select-Object -ExpandProperty UserPrincipalName; + } else { + $null; + } + }; + Connect = { + Connect-IPPSSession -ShowBanner:$False; + $Script:IPPSSessionId = Get-ConnectionInformation | Select-Object -Last 1 -ExpandProperty ConnectionId; + }; + Disconnect = { Disconnect-ExchangeOnline -Confirm:$False; }; }; AzureAD = @{ Matchable = $True; @@ -60,7 +73,7 @@ $Script:Services = @{ Matchable = $False; Context = { Get-MsolCompanyInformation | Select-Object -ExpandProperty DisplayName; }; Connect = { param($AccessToken) Invoke-NonNullParams 'Connect-MsolService' @{ MsGraphAccessToken = $PSBoundParameters['AccessToken'] }; }; - Disconnect = { Disconnect-MsolService }; + Disconnect = { [Microsoft.Online.Administration.Automation.ConnectMsolService]::ClearUserSessionState() }; }; Graph = @{ Matchable = $True; @@ -153,9 +166,6 @@ function Local:Connect-ServiceInternal { end { Exit-Scope; } process { - Invoke-Info "Connecting to $Local:Service..."; - Invoke-Verbose "Scopes: $($Scopes -join ', ')"; - try { if ($PSCmdlet.ShouldProcess("Connect to $Local:Service")) { $null = & $Script:Services[$Local:Service].Connect -Scopes:$Scopes -AccessToken:$AccessToken; @@ -319,6 +329,7 @@ function Connect-Service( try { if ($AccessToken) { Invoke-Info "Connecting to $Local:Service with access token..."; } else { Invoke-Info "Connecting to $Local:Service..."; } + Invoke-Verbose "Scopes: $($Scopes -join ', ')"; Connect-ServiceInternal -Service:$Local:Service -Scopes:$Scopes -AccessToken:$AccessToken; } catch { From 43469affe07122bed7758cfded4c94433e1f51bb Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 19:06:29 +1100 Subject: [PATCH 202/341] chore: Script changes for new compilter --- src/automation/Backup-BitLocker.ps1 | 3 + src/automation/Disable-FastStartup.ps1 | 3 + src/automation/Invoke-Expression.ps1 | 1 + src/automation/Invoke-RemoteRunner.ps1 | 1 + src/automation/Remove-Administrators.ps1 | 1 + src/microsoft/Common.psm1 | 16 +- src/microsoft/Security.ps1 | 13 +- .../admin/New-PartnerApplication.ps1 | 1 + src/microsoft/admin/Update-DKIM.ps1 | 3 + src/microsoft/entra/Get-MFAChanges.ps1 | 1 + src/microsoft/entra/StaffLocation.ps1 | 1 + src/microsoft/intune/Setup.ps1 | 1 + .../reports/{Exchange.ps1 => Exchange.psm1} | 0 src/microsoft/security/Exchange.ps1 | 1 + src/microsoft/security/Retention.ps1 | 3 + src/microsoft/security/SecureScore.ps1 | 4 + src/microsoft/security/Setup-Alerts.ps1 | 1 + src/microsoft/windows/AutoSetup.ps1 | 31 +++- src/misc/Export-KaseyaQuotes.ps1 | 2 +- src/misc/Setup-SecretManagement.ps1 | 1 + src/n-sight/Fix-AgentUpdateLoop.ps1 | 145 +++++++++--------- src/n-sight/Invoke-EnvTest.ps1 | 3 + 22 files changed, 139 insertions(+), 97 deletions(-) rename src/microsoft/reports/{Exchange.ps1 => Exchange.psm1} (100%) diff --git a/src/automation/Backup-BitLocker.ps1 b/src/automation/Backup-BitLocker.ps1 index 61cdbe9f..bba967ce 100644 --- a/src/automation/Backup-BitLocker.ps1 +++ b/src/automation/Backup-BitLocker.ps1 @@ -7,6 +7,9 @@ Using module ../common/Ensure.psm1 Using namespace Microsoft.BitLocker.Structures +[CmdletBinding()] +param() + #region - Error Codes $Script:ERROR_BITLOCKER_DISABLED = Register-ExitCode 'BitLocker is not enabled on the system drive.'; $Script:ERROR_NO_RECOVERY_PASSWORD = Register-ExitCode 'BitLocker is not configured to use a recovery password.'; diff --git a/src/automation/Disable-FastStartup.ps1 b/src/automation/Disable-FastStartup.ps1 index 7809c50e..012c7beb 100644 --- a/src/automation/Disable-FastStartup.ps1 +++ b/src/automation/Disable-FastStartup.ps1 @@ -20,6 +20,9 @@ Using module ../common/Environment.psm1 Using module ../common/Ensure.psm1 Using module ../common/Registry.psm1 +[CmdletBinding()] +param() + Invoke-RunMain $PSCmdlet { Invoke-EnsureAdministrator; diff --git a/src/automation/Invoke-Expression.ps1 b/src/automation/Invoke-Expression.ps1 index df645fd5..de5becf5 100644 --- a/src/automation/Invoke-Expression.ps1 +++ b/src/automation/Invoke-Expression.ps1 @@ -1,6 +1,7 @@ Using module ../common/Environment.psm1 Using module ../common/Exit.psm1 +[CmdletBinding()] Param( [Parameter(Mandatory)] [ScriptBlock]$Expression diff --git a/src/automation/Invoke-RemoteRunner.ps1 b/src/automation/Invoke-RemoteRunner.ps1 index 9861f4ac..7354a295 100644 --- a/src/automation/Invoke-RemoteRunner.ps1 +++ b/src/automation/Invoke-RemoteRunner.ps1 @@ -6,6 +6,7 @@ Using module ../common/Scope.psm1 Using module ../common/Exit.psm1 Using module ../common/Cache.psm1 +[CmdletBinding()] Param( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] diff --git a/src/automation/Remove-Administrators.ps1 b/src/automation/Remove-Administrators.ps1 index dcf87a5b..43e1c122 100644 --- a/src/automation/Remove-Administrators.ps1 +++ b/src/automation/Remove-Administrators.ps1 @@ -8,6 +8,7 @@ Using module ../common/Assert.psm1 Using module ../common/Scope.psm1 Using module ../common/UsersAndAccounts.psm1 +[CmdletBinding()] Param( [Parameter()] [Switch]$NoModify, diff --git a/src/microsoft/Common.psm1 b/src/microsoft/Common.psm1 index f6a33d4d..851ea3ca 100644 --- a/src/microsoft/Common.psm1 +++ b/src/microsoft/Common.psm1 @@ -1,15 +1,19 @@ +Using Module ../common/Logging.psm1 +Using Module ../common/Scope.psm1 +Using Module ../common/Connection.psm1 +Using Module ../common/Input.psm1 + Using Module Microsoft.Graph.Authentication Using Module Microsoft.Graph.Identity.DirectoryManagement Using Module Microsoft.Graph.Users Using Module ExchangeOnlineManagement - -Using Module ..\common\Logging.psm1 -Using Module ..\common\Scope.psm1 -Using Module ..\common\Connection.psm1 +Using module PartnerCenter +Using module Az.Accounts +Using module Az.KeyVault Using namespace Microsoft.Graph.PowerShell.Models -Function Get-PrimaryDomain { +function Get-PrimaryDomain { Get-MgDomain | Where-Object { $_.IsDefault -eq $True }; } @@ -252,8 +256,6 @@ function Invoke-ForEachCustomer { end { Exit-Scope; } process { - Invoke-EnsureModule 'PartnerCenter','Az.Accounts','Az.KeyVault'; - Invoke-Info 'Please sign in with the Azure AD account that has access to the Delegated Access Tokens...'; Connect-AzAccount -UseDeviceAuthentication; diff --git a/src/microsoft/Security.ps1 b/src/microsoft/Security.ps1 index de2b0454..1e9b6c52 100644 --- a/src/microsoft/Security.ps1 +++ b/src/microsoft/Security.ps1 @@ -3,6 +3,8 @@ Using module ../common/Connection.psm1 Using module ./Common.psm1 Using module Microsoft.Online.SharePoint.PowerShell +Using module AzureAD +Using module ExchangeOnlineManagement [CmdletBinding()] Param( @@ -144,16 +146,5 @@ Invoke-RunMain $PSCmdlet { 'Sharepoint' { # Invoke-EnsureModule Microsoft.Online.Sharepoint.Powershell; } - 'Exchange' { - # Invoke-EnsureModule ExchangeOnlineManagement; - - Disable-Outlook_StorageProviders - - Set-Exchange_SafeAttachmentsPolicy - Set-Exchange_SafeLinksPolicy - - Enable-Exchange_MailboxAuditing - Enable-Exchange_MailTips - } } }; diff --git a/src/microsoft/admin/New-PartnerApplication.ps1 b/src/microsoft/admin/New-PartnerApplication.ps1 index 32035a16..92a7cc11 100644 --- a/src/microsoft/admin/New-PartnerApplication.ps1 +++ b/src/microsoft/admin/New-PartnerApplication.ps1 @@ -32,6 +32,7 @@ Using module PartnerCenter Using namespace Microsoft.Open.AzureAD.Model +[CmdletBinding()] Param( [Parameter(Mandatory)] [string]$DisplayName, diff --git a/src/microsoft/admin/Update-DKIM.ps1 b/src/microsoft/admin/Update-DKIM.ps1 index e96a08a6..b48a9cda 100644 --- a/src/microsoft/admin/Update-DKIM.ps1 +++ b/src/microsoft/admin/Update-DKIM.ps1 @@ -8,6 +8,9 @@ Using module Microsoft.Graph.Identity.DirectoryManagement Using namespace Microsoft.Graph.PowerShell.Models +[CmdletBinding()] +param() + # foreach ($domain in $domains) { # # Get the domain name # $domainName = $domain.Name diff --git a/src/microsoft/entra/Get-MFAChanges.ps1 b/src/microsoft/entra/Get-MFAChanges.ps1 index 59972981..b268b787 100644 --- a/src/microsoft/entra/Get-MFAChanges.ps1 +++ b/src/microsoft/entra/Get-MFAChanges.ps1 @@ -10,6 +10,7 @@ Using module ../../common/Assert.psm1 Using module ../../common/Input.psm1 Using module ImportExcel +Using module MSOnline [CmdletBinding(SupportsShouldProcess)] Param( diff --git a/src/microsoft/entra/StaffLocation.ps1 b/src/microsoft/entra/StaffLocation.ps1 index c3665e4f..0f798741 100644 --- a/src/microsoft/entra/StaffLocation.ps1 +++ b/src/microsoft/entra/StaffLocation.ps1 @@ -19,6 +19,7 @@ Using module ../../common/Connection.psm1 Using module Microsoft.Graph.Identity.SignIns Using module Microsoft.Graph.Authentication Using module Microsoft.Graph.Groups +Using module Microsoft.Graph.Users Using namespace Microsoft.Graph.PowerShell.Models Using namespace System.Management.Automation diff --git a/src/microsoft/intune/Setup.ps1 b/src/microsoft/intune/Setup.ps1 index f01175f6..689f50db 100644 --- a/src/microsoft/intune/Setup.ps1 +++ b/src/microsoft/intune/Setup.ps1 @@ -12,6 +12,7 @@ Using module ../../common/Exit.psm1 Using module Microsoft.Graph.Authentication Using module Microsoft.Graph.Beta.DeviceManagement Using module Microsoft.Graph.Beta.Groups +Using module Microsoft.Graph.Beta.Identity.DirectoryManagement using namespace Microsoft.Graph.Beta.PowerShell.Models diff --git a/src/microsoft/reports/Exchange.ps1 b/src/microsoft/reports/Exchange.psm1 similarity index 100% rename from src/microsoft/reports/Exchange.ps1 rename to src/microsoft/reports/Exchange.psm1 diff --git a/src/microsoft/security/Exchange.ps1 b/src/microsoft/security/Exchange.ps1 index e8cc8ace..0f9645f3 100644 --- a/src/microsoft/security/Exchange.ps1 +++ b/src/microsoft/security/Exchange.ps1 @@ -7,6 +7,7 @@ Using module ../../common/Input.psm1 Using module ../../common/Connection.psm1 Using module ../Common.psm1 +[CmdletBinding()] Param( [Parameter(Mandatory)] [ValidateSet('MailBox', 'Policies', 'Outlook')] diff --git a/src/microsoft/security/Retention.ps1 b/src/microsoft/security/Retention.ps1 index 3550d131..11b342ce 100644 --- a/src/microsoft/security/Retention.ps1 +++ b/src/microsoft/security/Retention.ps1 @@ -6,6 +6,9 @@ Using module ../../common/Connection.psm1 Using module ExchangeOnlineManagement +[CmdletBinding()] +param() + [String]$Script:RetentionPolicy = 'Log Retention Policy'; [String]$Script:RetentionPolicyDescription = 'One year retention policy for all activities'; [String]$Script:RetentionPolicyDuration = 'TwelveMonths'; diff --git a/src/microsoft/security/SecureScore.ps1 b/src/microsoft/security/SecureScore.ps1 index d20c9fbb..4e630345 100644 --- a/src/microsoft/security/SecureScore.ps1 +++ b/src/microsoft/security/SecureScore.ps1 @@ -1,8 +1,12 @@ Using module ../../common/Environment.psm1 +Using module ../../common/Input.psm1 Using module ../Common.psm1 Using module Microsoft.Graph.Beta.Security +[CmdletBinding()] +param() + function Get-SecureScore( [System.DateTime]$Date = (Get-Date) ) { diff --git a/src/microsoft/security/Setup-Alerts.ps1 b/src/microsoft/security/Setup-Alerts.ps1 index b136b28f..86aab686 100644 --- a/src/microsoft/security/Setup-Alerts.ps1 +++ b/src/microsoft/security/Setup-Alerts.ps1 @@ -8,6 +8,7 @@ Using module ../Common.psm1 Using module ExchangeOnlineManagement +[CmdletBinding()] param( [Parameter()] [Switch]$UpdatePolicies diff --git a/src/microsoft/windows/AutoSetup.ps1 b/src/microsoft/windows/AutoSetup.ps1 index 38c3cd3d..e486f822 100644 --- a/src/microsoft/windows/AutoSetup.ps1 +++ b/src/microsoft/windows/AutoSetup.ps1 @@ -1,11 +1,16 @@ #Requires -Version 5.1 #Requires -RunAsAdministrator -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 -Using module ..\..\common\Scope.psm1 -Using module ..\..\common\Exit.psm1 -Using module ..\..\common\Flag.psm1 +Using module ../../common/Environment.psm1 +Using module ../../common/Logging.psm1 +Using module ../../common/Scope.psm1 +Using module ../../common/Exit.psm1 +Using module ../../common/Flag.psm1 +Using module ../../common/Input.psm1 +Using module ../../common/Assert.psm1 +Using module ../../common/Ensure.psm1 +Using module ../../common/Windows.psm1 +Using module ../../common/Temp.psm1 Using module PSWindowsUpdate @@ -403,6 +408,19 @@ function Add-QueuedTask( #region - Phase Functions +function Invoke-Phase_PreInit { + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + Invoke-EnsureLocalScript; + Sync-Time; + + # Sync time if not already done then restart if time was out of sync. + # Turn off Sleep when off power but let screen turn off. + } +} + function Invoke-Phase_SetupWindows { begin { Enter-Scope; } end { Exit-Scope; } @@ -943,7 +961,6 @@ function Invoke-PhaseUpdate { process { [String]$Local:NextPhase = if ($RecursionLevel -ge 2) { 'Finish' } else { 'Update' }; - Invoke-EnsureModule -Modules @('PSWindowsUpdate'); Get-WindowsUpdate -Install -AcceptAll -AutoReboot:$false -IgnoreReboot -IgnoreUserInput -Confirm:$false | Out-Null; (Get-RebootFlag).Set($null); @@ -1002,6 +1019,8 @@ Invoke-RunMain $PSCmdlet { return; } + Invoke-Phase_PreInit; + Invoke-EnsureLocalScript; Invoke-EnsureNetwork -Name $NetworkName -Password $NetworkPassword; diff --git a/src/misc/Export-KaseyaQuotes.ps1 b/src/misc/Export-KaseyaQuotes.ps1 index 5c0cde9e..be6741cb 100644 --- a/src/misc/Export-KaseyaQuotes.ps1 +++ b/src/misc/Export-KaseyaQuotes.ps1 @@ -6,7 +6,7 @@ Using module ../common/Utils.psm1 [CmdletBinding()] param( - [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, HelpMessage = 'Where to save the output file.')] + [Parameter(Mandatory, HelpMessage = 'Where to save the output file.')] [Alias('PSPath')] [ValidateNotNullOrEmpty()] [String]$OutputPath, diff --git a/src/misc/Setup-SecretManagement.ps1 b/src/misc/Setup-SecretManagement.ps1 index dc338afc..9693baea 100644 --- a/src/misc/Setup-SecretManagement.ps1 +++ b/src/misc/Setup-SecretManagement.ps1 @@ -1,3 +1,4 @@ +#!ignore #Requires -Version 7.4 Using module ../common/Environment.psm1 diff --git a/src/n-sight/Fix-AgentUpdateLoop.ps1 b/src/n-sight/Fix-AgentUpdateLoop.ps1 index 6dc993e2..21612707 100644 --- a/src/n-sight/Fix-AgentUpdateLoop.ps1 +++ b/src/n-sight/Fix-AgentUpdateLoop.ps1 @@ -1,3 +1,4 @@ +#!ignore <# .SYNOPSIS A script to fix the scenario where the N-sight RMM Agent gets stuck in a loop. @@ -18,47 +19,50 @@ arising out of the use of or inability to use the sample scripts or documentation. #> -$script:logFileName = "FixWinAgentUpdateLoop.log" -$script:logFilePath = "C:\Technical Support" +[CmdletBinding()] +param() + +$script:logFileName = 'FixWinAgentUpdateLoop.log' +$script:logFilePath = 'C:\Technical Support' $script:combinedPathAndAndName = "$($script:logFilePath)\$($script:logFileName)" function writeToLog($state, $message) { - $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) + $script:timestamp = '[{0:dd/MM/yy} {0:HH:mm:ss}]' -f (Get-Date) switch -regex -Wildcard ($state) { - "I" { - $state = "INFO" + 'I' { + $state = 'INFO' } - "E" { - $state = "ERROR" + 'E' { + $state = 'ERROR' } - "W" { - $state = "WARNING" + 'W' { + $state = 'WARNING' } - "F" { - $state = "FAILURE" + 'F' { + $state = 'FAILURE' } - "V" { - $state = "VERBOSE" + 'V' { + $state = 'VERBOSE' } - "" { - $state = "INFO" + '' { + $state = 'INFO' } Default { - $state = "INFO" - } + $state = 'INFO' } + } Write-Host "$($timeStamp) - [$state]: $message" - Write-Output "$($timeStamp) - [$state]: $message" | Out-file $script:combinedPathAndAndName -Append + Write-Output "$($timeStamp) - [$state]: $message" | Out-File $script:combinedPathAndAndName -Append } function createLogFileAndWorkingDirectory () { #Create the logFilePath - if(!(test-path $script:logFilePath)) { + if (!(Test-Path $script:logFilePath)) { try { - New-Item -ItemType Directory -Path $script:logFilePath -ErrorAction Stop| Out-Null + New-Item -ItemType Directory -Path $script:logFilePath -ErrorAction Stop | Out-Null writeToLog V "Logfile Directory $($script:logFilePath) has been created." } catch { $errorMessage = "We have failed to create the folder $($logFilePath) which is the working directory of the script. Error thrown was: $($error[0])." @@ -81,7 +85,7 @@ function createLogFileAndWorkingDirectory () { function stopService () { try { - $service = get-service -name "Advanced Monitoring Agent" -ErrorAction stop + $service = Get-Service -Name 'Advanced Monitoring Agent' -ErrorAction stop } catch { writeToLog E "The Advanced Monitoring Agent service doesn't exist. Therefore this script will exit." exit 0 @@ -89,111 +93,108 @@ function stopService () { $script:existingStartType = ($service | Select-Object -Property StartType).StartType - writeToLog V "Setting Service Startup Type to Disabled, to stop the Agent re-starting itself during maintenance." + writeToLog V 'Setting Service Startup Type to Disabled, to stop the Agent re-starting itself during maintenance.' $service | Set-Service -StartupType Disabled - writeToLog I "Stopping Service." + writeToLog I 'Stopping Service.' $service | Stop-Service -ErrorAction SilentlyContinue - $service = get-service -name "Advanced Monitoring Agent" + $service = Get-Service -Name 'Advanced Monitoring Agent' - if($service.status -ne "Stopped") { + if ($service.status -ne 'Stopped') { $script:needToCheckServiceAfterKillingProcesses = $true writeToLog V "The service is in state $($service.status) after attempting to be stopped. Will check service after stopping processes." } else { - writeToLog V "The service is stopped." + writeToLog V 'The service is stopped.' } - } +} function killProcesses () { - writeToLog I "Ending processes." + writeToLog I 'Ending processes.' try { - writeToLog V "Checking if process winagent.exe is still running." - $process = get-process -ProcessName winagent -ErrorAction Stop - writeToLog V "winagent.exe is still running. Attempting to stop." + writeToLog V 'Checking if process winagent.exe is still running.' + $process = Get-Process -ProcessName winagent -ErrorAction Stop + writeToLog V 'winagent.exe is still running. Attempting to stop.' $process | Stop-Process -Force Start-Sleep -Seconds 3; - $process = get-process -ProcessName winagent -ErrorAction Stop - writeToLog E "winagent.exe is still running. This device will need manual intervention." + $process = Get-Process -ProcessName winagent -ErrorAction Stop + writeToLog E 'winagent.exe is still running. This device will need manual intervention.' exit 0 } catch { writeToLog V "winagent.exe isn't running. Moving on." } try { - writeToLog V "Checking if process _new_winagent.exe is still running." - $process = get-process -ProcessName _new_winagent -ErrorAction Stop - writeToLog V "_new_winagent.exe is still running. Attempting to stop." + writeToLog V 'Checking if process _new_winagent.exe is still running.' + $process = Get-Process -ProcessName _new_winagent -ErrorAction Stop + writeToLog V '_new_winagent.exe is still running. Attempting to stop.' $process | Stop-Process -Force Start-Sleep -Seconds 3; - $process = get-process -ProcessName _new_winagent -ErrorAction Stop - writeToLog E "_new_winagent.exe is still running. This device will need manual intervention." + $process = Get-Process -ProcessName _new_winagent -ErrorAction Stop + writeToLog E '_new_winagent.exe is still running. This device will need manual intervention.' exit 0 } catch { writeToLog V "Process _new_winagent.exe isn't running. Moving on." } try { - writeToLog V "Checking if process _new_setup.exe is still running." - $process = get-process -ProcessName _new_setup -ErrorAction Stop - writeToLog V "_new_setup.exe is still running. Attempting to stop." + writeToLog V 'Checking if process _new_setup.exe is still running.' + $process = Get-Process -ProcessName _new_setup -ErrorAction Stop + writeToLog V '_new_setup.exe is still running. Attempting to stop.' $process | Stop-Process -Force Start-Sleep -Seconds 3; - $process = get-process -ProcessName _new_setup -ErrorAction Stop - writeToLog E "_new_setup.exe is still running. This device will need manual intervention." + $process = Get-Process -ProcessName _new_setup -ErrorAction Stop + writeToLog E '_new_setup.exe is still running. This device will need manual intervention.' exit 0 } catch { writeToLog V "Process _new_setup.exe isn't running. Moving on." } - if($script:needToCheckServiceAfterKillingProcesses) { - $service = get-service -name "Advanced Monitoring Agent" - if($service.status -ne "Stopped") { + if ($script:needToCheckServiceAfterKillingProcesses) { + $service = Get-Service -Name 'Advanced Monitoring Agent' + if ($service.status -ne 'Stopped') { writeToLog E "The service is in state $($service.status) after the processes were stopped. This shouldn't happen." exit 0 } else { - writeToLog V "The service is stopped." + writeToLog V 'The service is stopped.' } } } function deleteStagingFolder () { - writeToLog I "Deleting Staging folder contents." - $AgentLocationGP = "\Advanced Monitoring Agent GP" - $AgentLocation = "\Advanced Monitoring Agent" + writeToLog I 'Deleting Staging folder contents.' + $AgentLocationGP = '\Advanced Monitoring Agent GP' + $AgentLocation = '\Advanced Monitoring Agent' - If((Get-WmiObject Win32_OperatingSystem).OSArchitecture -like "*64*"){ + If ((Get-WmiObject Win32_OperatingSystem).OSArchitecture -like '*64*') { #Check Agent Install Location - $PathTester = "C:\Program Files (x86)" + $AgentLocationGP + "\debug.log" - If(!(Test-Path $PathTester)){ - $PathTester = "C:\Program Files (x86)" + $AgentLocation + "\staging" - Remove-item $PathTester\* -recurse -Force + $PathTester = 'C:\Program Files (x86)' + $AgentLocationGP + '\debug.log' + If (!(Test-Path $PathTester)) { + $PathTester = 'C:\Program Files (x86)' + $AgentLocation + '\staging' + Remove-Item $PathTester\* -Recurse -Force + } Else { + $PathTester = 'C:\Program Files (x86)' + $AgentLocationGP + '\staging' + Remove-Item $PathTester\* -Recurse -Force } - Else { - $PathTester = "C:\Program Files (x86)" + $AgentLocationGP + "\staging" - Remove-item $PathTester\* -recurse -Force - } - } - Else { + } Else { #Check Agent Install Location - $PathTester = "C:\Program Files" + $AgentLocationGP + "\debug.log" - If(!(Test-Path $PathTester)){ - $PathTester = "C:\Program Files" + $AgentLocation + "\staging" - Remove-item $PathTester\* -recurse -Force - } - Else { - $PathTester = "C:\Program Files" + $AgentLocationGP + "\staging" - Remove-item $PathTester\* -recurse -Force + $PathTester = 'C:\Program Files' + $AgentLocationGP + '\debug.log' + If (!(Test-Path $PathTester)) { + $PathTester = 'C:\Program Files' + $AgentLocation + '\staging' + Remove-Item $PathTester\* -Recurse -Force + } Else { + $PathTester = 'C:\Program Files' + $AgentLocationGP + '\staging' + Remove-Item $PathTester\* -Recurse -Force } } - writeToLog V "Staging folder contents have been deleted." + writeToLog V 'Staging folder contents have been deleted.' } function restartAgentService () { try { - $service = get-service -name "Advanced Monitoring Agent" -ErrorAction stop + $service = Get-Service -Name 'Advanced Monitoring Agent' -ErrorAction stop } catch { writeToLog E "The Advanced Monitoring Agent service doesn't exist. Even though it existed the last time we checked. This is a very rare edge case where the Agent has probably been uninstalled in this window." exit 0 @@ -201,7 +202,7 @@ function restartAgentService () { writeToLog V "Setting Service Startup Type to $script:existingStartType." $service | Set-Service -StartupType $script:existingStartType - writeToLog I "Starting Agent Service." + writeToLog I 'Starting Agent Service.' $service | Start-Service } diff --git a/src/n-sight/Invoke-EnvTest.ps1 b/src/n-sight/Invoke-EnvTest.ps1 index 62a578f6..cf7ccdcb 100644 --- a/src/n-sight/Invoke-EnvTest.ps1 +++ b/src/n-sight/Invoke-EnvTest.ps1 @@ -6,6 +6,9 @@ Using module ../common/Environment.psm1 Using module ../common/Logging.psm1 +[CmdletBinding()] +param() + Invoke-RunMain $PSCmdlet { Invoke-Info 'Printing environment variables...' [Object[]]$Local:EnvironmentVariables = Get-ChildItem -Path 'env:'; From 98cad359af02b5b31252dec607ef5cd37948b566 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 24 Oct 2024 19:06:49 +1100 Subject: [PATCH 203/341] chore: Remove unfinished or scripts being replaced by CIPP --- src/common/Windows.psm1 | 73 +++++++++++++++++++ .../entra/Disable-EnterpriseUserConsent.ps1 | 23 ------ src/microsoft/entra/New-User.ps1 | 47 ------------ src/microsoft/entra/OffboardUser.ps1 | 45 ------------ src/microsoft/entra/TravelAccess.ps1 | 21 ------ src/microsoft/security/Sharepoint.ps1 | 1 - 6 files changed, 73 insertions(+), 137 deletions(-) create mode 100644 src/common/Windows.psm1 delete mode 100644 src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 delete mode 100644 src/microsoft/entra/New-User.ps1 delete mode 100644 src/microsoft/entra/OffboardUser.ps1 delete mode 100644 src/microsoft/entra/TravelAccess.ps1 delete mode 100644 src/microsoft/security/Sharepoint.ps1 diff --git a/src/common/Windows.psm1 b/src/common/Windows.psm1 new file mode 100644 index 00000000..ce9daede --- /dev/null +++ b/src/common/Windows.psm1 @@ -0,0 +1,73 @@ +<# +.SYNOPSIS + Gets the last successful time synchronization time. + +.OUTPUTS + System.DateTime + + Returns the last successful time synchronization time, or the Unix epoch if the time could not be parsed. + +.EXAMPLE + Get-LastSyncTime + + Gets the last successful time synchronization time. +#> +function Get-LastSyncTime { + [OutputType([DateTime])] + param() + + process { + $Regex = '^Last Successful Sync Time: (?[\d/:APM\s]+)$'; + $Result = w32tm /query /status | Select-String -Pattern $Regex; + + Try { + $LastSyncTime = [DateTime]::Parse($Result.Matches[0].Groups['DateTime'].Value); + } Catch { + $LastSyncTime = Get-Date -Year 1970 -Month 1 -Day 1; + } + + return $LastSyncTime; + } +} + +<# +.SYNOPSIS + Syncs the system time with the default time server if the time is out of the supplied threshold. + +.PARAMETER Threshold + The time threshold to check against. Default is 7 days. + +.OUTPUTS + System.Boolean + + Returns $True if the system time was out of sync and was successfully synced, otherwise $False. + +.EXAMPLE + Sync-Time -Threshold (New-TimeSpan -Days 1) + + Syncs the system time if the time is out of sync by more than 1 day. + +.EXAMPLE + Sync-Time + + Syncs the system time if the time is out of sync by more than the default 7 days. +#> +function Sync-Time { + [OutputType([System.Boolean])] + param( + [ValidateNotNullOrEmpty()] + [timespan]$Threshold = (New-TimeSpan -Days 7) + ) + + process { + [DateTime]$LastSyncTime = Get-LastSyncTime; + [DateTime]$CurrentTime = Get-Date; + + if (($CurrentTime - $LastSyncTime) -gt $Threshold) { + w32tm /resync /force; + return $True; + } + + return $False; + } +} diff --git a/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 b/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 deleted file mode 100644 index 315b22db..00000000 --- a/src/microsoft/entra/Disable-EnterpriseUserConsent.ps1 +++ /dev/null @@ -1,23 +0,0 @@ -Using module ../../common/Environment.psm1 -Using module ../../common/Connection.psm1 -Using module Microsoft.Graph.Identity.SignIns - -function Disable-EnterpriseConsent_UserConsent { - Connect-Service Graph -Scopes 'Policy.ReadWrite.Authorization'; - - [HashTable]$Private:Body = @{ - "permissionGrantPolicyIdsAssignedToDefaultUserRole" = @( - "managePermissionGrantsForOwnedResource.{other-current-policies}" - ) - }; - - Update-MgPolicyAuthorizationPolicy -AuthorizationPolicyId authorizationPolicy -BodyParameter:$Private:Body; -} - -function Set-EnterpriseConsent_ForwardRequestsToAlerts { - -} - -Invoke-RunMain $PSCmdlet { - -}; diff --git a/src/microsoft/entra/New-User.ps1 b/src/microsoft/entra/New-User.ps1 deleted file mode 100644 index b0b93bdc..00000000 --- a/src/microsoft/entra/New-User.ps1 +++ /dev/null @@ -1,47 +0,0 @@ -Using module ../../common/Environment.psm1 -Using module ../../common/Connection.psm1 -Using module ../../common/Input.psm1 - -Using module Microsoft.Graph.Identity.DirectoryManagement - -function Get-RandomPassword { - # Generate a random password using RPGen -} - -function Save-ToHudu { - # Get Company -} - -function New-User { - # Determine what licenses are required by prompting the user, - # Use a auto complete input box to allow the user to select the licenses -} - -Invoke-RunMain $PSCmdlet { - Connect-Service -Services @('Graph') -Scopes @('User.ReadWrite.All', 'Directory.ReadWrite.All'); - - #region - Get user details - - $Private:ValidDomains = Get-MgDomain; - - # TODO :: Is Validation required? - $Private:UserDetails = @{ - Name = @{ - FirstName = Get-UserInput 'First Name' 'What is the first name of the user?'; - LastName = Get-UserInput 'Last Name' 'What is the last name of the user?'; - }; - - PhoneNumber = Get-UserInput 'Phone Number' 'What is the phone number of the user?' -AllowEmpty; - - Email = @{ - Name = Get-UserInput 'Email Address' 'What is the email address of the user?'; - Domain = Get-UserSelection - }; - }; - - $Private:Licenses = @{ - Business = @('Basic', 'Standard', 'Premium') - Defender = @('Office', 'Cloud') - }; - #endregion -}; diff --git a/src/microsoft/entra/OffboardUser.ps1 b/src/microsoft/entra/OffboardUser.ps1 deleted file mode 100644 index e4ddfaaf..00000000 --- a/src/microsoft/entra/OffboardUser.ps1 +++ /dev/null @@ -1,45 +0,0 @@ -Using module ../../common/Environment.psm1 -Using module ../../common/Input.psm1 -Using module ../../common/Connection.psm1 -Using module ../Common.psm1 - -Using module ExchangeOnlineManagement -Using module Microsoft.Graph.Users - -Using namespace Microsoft.Graph.PowerShell.Models; - -function Update-Mailbox { - param( - [Parameter(Mandatory)] - [MicrosoftGraphUser]$User - ) - - Set-MailBox -Identity:$User.Mail -Type:Shared -HiddenFromAddressListsEnabled:$True; - - # Forward and/or delegate the mailbox to another user - # Set the mailbox to auto-reply if requested -} - -function Update-User { - # Revoke Sessions - # Disable User - # Change name to prefix with "zArchived - " - # Remove from all groups - # Remove all roles - # Remove all licenses (This may need to be done after everything else) -} - -Invoke-RunMain $PSCmdlet { - Connect-Service 'Graph','ExchangeOnline' -Scopes @('User.ReadWrite.All', 'Directory.ReadWrite.All'); - - # TODO :: Filter by licensed and enabled - [Microsoft.Graph.PowerShell.Models.MicrosoftGraphUser[]]$Private:Users = Get-MgUser -Filter ''; - [Microsoft.Graph.PowerShell.Models.MicrosoftGraphUser]$Local:User = Get-UserSelection ` - -Title 'Which account?' ` - -Question 'Select the account you want to offboard/archive' ` - -Choices $Local:Users ` - -FormatChoice { param([Microsoft.Graph.PowerShell.Models.MicrosoftGraphUser]$Item) $Item.UserPrincipalName }; - - Update-Mailbox -User:$Local:User; - Update-User -User:$Local:User; -}; diff --git a/src/microsoft/entra/TravelAccess.ps1 b/src/microsoft/entra/TravelAccess.ps1 deleted file mode 100644 index a496c8ad..00000000 --- a/src/microsoft/entra/TravelAccess.ps1 +++ /dev/null @@ -1,21 +0,0 @@ -#Requires -Version 5.1 - -Using module ../../common/Environment.psm1 - -Invoke-RunMain $PSCmdlet { - # Sign into EntraID - - # Ensure that the "Travel Access" Group exists, if not create it. - # Ensure that the "Blocked Countries" Named Location exists, if not create it. - # Ensure that the "Travel Countries" Named Location exists, if not create it. - # Ensure that Conditional Access Policy "Travel Access" exists, if not create it. - - # Prompt for selection of users to grant / remove access to. - # Prompt for which locations are required or were granted. - - # If removing access, remove the "Travel Access" Group from the user. - # If granting access, add the "Travel Access" Group to the user. - - # If removing access, check the users recent sign-in history and that they are back in australia or office location. - # If granting access, remove the required countries from the named location "Blocked Countries" and add the required countries to the named location "Travel Countries". -} diff --git a/src/microsoft/security/Sharepoint.ps1 b/src/microsoft/security/Sharepoint.ps1 deleted file mode 100644 index 1637c293..00000000 --- a/src/microsoft/security/Sharepoint.ps1 +++ /dev/null @@ -1 +0,0 @@ -#@compile-ignore From f38bf69dd0509bc2d7b700bddb3be3ae46fb46d7 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 25 Oct 2024 11:38:31 +1100 Subject: [PATCH 204/341] fix: Incorrect command usage --- src/microsoft/Common.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/microsoft/Common.psm1 b/src/microsoft/Common.psm1 index 851ea3ca..805a8a09 100644 --- a/src/microsoft/Common.psm1 +++ b/src/microsoft/Common.psm1 @@ -268,7 +268,7 @@ function Invoke-ForEachCustomer { Invoke-Info 'Getting Partner Center token...' [System.Management.Automation.PSCredential]$Private:Credential = New-Object System.Management.Automation.PSCredential -ArgumentList $Private:AppilicationID, $Private:ApplicationSecret; - $Private:GraphToken = Get-PartnerAccessToken -ApplicationId $Private:AppilicationID -Credential $Private:Credential -RefreshToken $Private:RefreshToken -Scopes 'https://graph.microsoft.com/.default' -ServicePrincipal; + $Private:GraphToken = New-PartnerAccessToken -ApplicationId $Private:AppilicationID -Credential $Private:Credential -RefreshToken $Private:RefreshToken -Scopes 'https://graph.microsoft.com/.default' -ServicePrincipal; Invoke-Info 'Getting Partner Center customers...'; Connect-MgGraph -AccessToken $Private:GraphToken.AccessToken -NoWelcome; @@ -277,7 +277,7 @@ function Invoke-ForEachCustomer { foreach ($Private:Customer in $Private:Customers) { Invoke-Info 'Getting customer token...'; - $Private:GraphToken = Get-PartnerAccessToken -ApplicationId $Private:AppilicationID -Credential $Private:Credential -RefreshToken $Private:RefreshToken -Scopes 'https://management.azure.com' -ServicePrincipal -TenantId $Private:Customer.TenantId; + $Private:GraphToken = New-PartnerAccessToken -ApplicationId $Private:AppilicationID -Credential $Private:Credential -RefreshToken $Private:RefreshToken -Scopes 'https://management.azure.com' -ServicePrincipal -TenantId $Private:Customer.TenantId; Invoke-Info 'Connecting to services...'; Connect-MgGraph -AccessToken $Private:GraphToken.AccessToken -NoWelcome; Connect-ExchangeOnline -AccessToken $Private:GraphToken.AccessToken -NoWelcome; From e28cd78b6039b88e277e7a3378e25e74f65f32ec Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 25 Oct 2024 16:30:35 +1100 Subject: [PATCH 205/341] fix(Compiler): Prevent the template from being picked up for compiling --- src/Compiler/Module/Compiled/Script.cs | 2 +- src/Compiler/Resources/ScriptTemplate.ps1 | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index c566bc72..938e3bdf 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -24,7 +24,7 @@ RequirementGroup requirements var info = Assembly.GetExecutingAssembly().GetName(); using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.ScriptTemplate.ps1")!; using var streamReader = new StreamReader(templateStream, Encoding.UTF8); - return streamReader.ReadToEnd(); + return streamReader.ReadToEnd()[9..]; // Remove the #!ignore line. }); public virtual BidirectionalGraph> Graph { get; } = new(); diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index c75020d3..c6c28292 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -1,3 +1,4 @@ +#!ignore [Diagnostics.CodeAnalysis.SuppressMessageAttribute( 'PSAvoidGlobalVars', 'Global:CompiledScript', From 111b11ca5aa6d17295985006a03d1ad37d46c1bb Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 25 Oct 2024 16:31:59 +1100 Subject: [PATCH 206/341] fix(Compiler): Fix missing parents for debuggable files A debuggable file could been a .psm1 file in a directory which wasn't covered for creation. --- src/Compiler/Program.cs | 5 +++++ src/Compiler/packages.lock.json | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 8ec06a7c..8784e221 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -378,6 +378,11 @@ Option outputDirectory && module is PathedModuleSpec pathedModuleSpec && !outputDebuggables.Contains(module.Hash) ) { + // We could be outputting a psm1 which would not have its structure copied + // Lets make sure its output path is created. + var outputParent = Directory.GetParent(GetOutputLocation(sourceDirectory, outDir, pathedModuleSpec.FullPath))!; + if (!outputParent.Exists) outputParent.Create(); + Output( sourceDirectory, outDir, diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index bacdae1c..72008b0b 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,6 +20,12 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[8.0.10, )", + "resolved": "8.0.10", + "contentHash": "xT8jYjlroY7SLbGtoV9vUTVW/TPgodL4Egc31a444Xe0TMytLZ3UlKQ0kxMZsy/CrWsFB6wtKnSG1SsXcWreew==" + }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.5, )", From 981a64c8d1519e97f8fcd745ff247d7215fd58ae Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 25 Oct 2024 16:32:34 +1100 Subject: [PATCH 207/341] feat(Compiler): Summary of files with errors and where to find them. --- src/Compiler/Program.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 8784e221..d34bf85c 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -368,7 +368,7 @@ Option outputDirectory var printedBefore = false; // This is to prevent a newline before the first error var errorQueue = new Deque(); errorQueue.AddRange(errorSet); - var outputDebuggables = new List(); + var outputDebuggables = new Dictionary(); do { var err = errorQueue.PopFirst(); @@ -376,7 +376,7 @@ Option outputDirectory && err is WrappedErrorWithDebuggableContent wrappedDebuggable && wrappedDebuggable.Module.IsSome(out var module) && module is PathedModuleSpec pathedModuleSpec - && !outputDebuggables.Contains(module.Hash) + && !outputDebuggables.ContainsKey(module.Hash) ) { // We could be outputting a psm1 which would not have its structure copied // Lets make sure its output path is created. @@ -391,7 +391,7 @@ Option outputDirectory true ); - outputDebuggables.Add(module.Hash); + outputDebuggables.Add(module.Hash, Path.GetRelativePath(sourceDirectory, pathedModuleSpec.FullPath)); } if (err is WrappedErrorWithDebuggableContent wrappedErr) { @@ -434,6 +434,13 @@ Option outputDirectory } } while (errorQueue.Count > 0); + if (outputDebuggables.Count > 0) { + Logger.Error($""" + Encountered ${outputDebuggables.Count} files with errors while compiling, the debuggable content has been output to the following files: + {string.Join("\n", outputDebuggables.Select(kv => $"\t{kv.Value}"))} + """); + } + return 1; } From d5a2a37592d26fa4dac8420488a143b80e5dcf62 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 25 Oct 2024 16:32:54 +1100 Subject: [PATCH 208/341] fix: missing cmdletbinding --- src/hudu/Update-Entra-Integration.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hudu/Update-Entra-Integration.ps1 b/src/hudu/Update-Entra-Integration.ps1 index 7dc86aad..d93be728 100644 --- a/src/hudu/Update-Entra-Integration.ps1 +++ b/src/hudu/Update-Entra-Integration.ps1 @@ -5,6 +5,7 @@ Using module ../common/Logging.psm1 Using module ../common/Input.psm1 Using module ../common/Utils.psm1 +[CmdletBinding()] Param( [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] From b263ca69289527022e1042205c54a0f00346996a Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 29 Oct 2024 14:42:48 +1100 Subject: [PATCH 209/341] feat(ExternalScripts): Add external script management with patching support --- .github/workflows/external.yaml | 23 ++++ resources/schemas/ExternalScript.jsonc | 29 +++++ src/external/README.md | 13 +++ src/external/Update.ps1 | 110 ++++++++++++++++++ .../patches/Nodeware_parameters.patch | 15 +++ src/external/scripts/Deploy-Nodeware.ps1 | 30 +++++ src/external/sources/Nodeware.jsonc | 8 ++ 7 files changed, 228 insertions(+) create mode 100644 .github/workflows/external.yaml create mode 100644 resources/schemas/ExternalScript.jsonc create mode 100644 src/external/README.md create mode 100644 src/external/Update.ps1 create mode 100644 src/external/patches/Nodeware_parameters.patch create mode 100644 src/external/scripts/Deploy-Nodeware.ps1 create mode 100644 src/external/sources/Nodeware.jsonc diff --git a/.github/workflows/external.yaml b/.github/workflows/external.yaml new file mode 100644 index 00000000..4d086fa6 --- /dev/null +++ b/.github/workflows/external.yaml @@ -0,0 +1,23 @@ +name: External Script Updater + +on: + schedule: + - cron: '0 12 * * *' + +jobs: + update: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - name: Update External Scripts + shell: pwsh + run: ./src/external/Update.ps1 + + - name: Commit Changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore(external): Update external scripts" + file_pattern: "src/external/scripts/*" diff --git a/resources/schemas/ExternalScript.jsonc b/resources/schemas/ExternalScript.jsonc new file mode 100644 index 00000000..de6c3e61 --- /dev/null +++ b/resources/schemas/ExternalScript.jsonc @@ -0,0 +1,29 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/AMTSupport/scripts/main/resources/schemas/ExternalScript.json", + "type": "object", + "properties": { + "Output": { + "type": "string", + "description": "Name of the script file for output" + }, + "Source": { + "type": "string", + "description": "URL to the raw script file that is to be downloaded" + }, + "Patches": { + "type": "array", + "description": "Array of patch files to be applied to the script", + "items": [ + { + "type": "string", + "description": "Relative path to the patch file from this json file" + } + ] + } + }, + "required": [ + "Output", + "Source" + ] +} diff --git a/src/external/README.md b/src/external/README.md new file mode 100644 index 00000000..4f517207 --- /dev/null +++ b/src/external/README.md @@ -0,0 +1,13 @@ +# External Scripts + +This directory contains scripts which are our own, but have been pulled from their sources and are integrated into the project. +These scripts are automatically updated by the `update_external.sh` script. + +## Scripts + + - `update_external.sh` + This script maintains the external scripts in this directory, this handles patching, updating and cleaning up the scripts. + +## Creating a new Patch + +When creating the patch, you should remove the `#!ignore` and hash from the first line if it was downloaded using the `update_external.sh` script. diff --git a/src/external/Update.ps1 b/src/external/Update.ps1 new file mode 100644 index 00000000..26ec42ea --- /dev/null +++ b/src/external/Update.ps1 @@ -0,0 +1,110 @@ +#!ignore + +Using module '../common/Environment.psm1' +Using module '../common/Logging.psm1' +Using module '../common/Scope.psm1' + +<# +.SYNOPSIS + Update the external scripts. + +.PARAMETER Definitions + Where to find the script definitions. + +.PARAMETER Output + Where to save the scripts to. + +.PARAMETER Force + Force the update of the scripts even if the hash matches remote. +#> +[CmdletBinding()] +param( + [String]$Definitions = ($PSScriptRoot + './sources/'), + + [String]$Output = ($PSScriptRoot + './scripts/'), + + [Switch]$Force +) + +function Compare-LocalToRemote { + [OutputType([Boolean])] + param( + [String]$LocalFile, + [String]$RemoteURI + ) + + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + if (-not (Test-Path -Path $LocalFile -PathType Leaf)) { + return $False; + } + + # In the LocalFile we store a hash of the raw remote file we downloaded, its on the first line after #!ignore + $LocalHash = (Get-Content -Path $LocalFile -TotalCount 1).Substring(9); + $RemoteHash = (Invoke-WebRequest -Uri $RemoteURI -Method Head).Headers['ETag']; + + return $LocalHash -eq $RemoteHash; + } +} + +function Get-RemoteAndPatch { + param( + [String]$RemoteURI, + [String]$OutputPath, + [String[]]$Patches + ) + + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + $Request = Invoke-WebRequest -Uri $RemoteURI -Method Get; + + [String]$Content; + if ($Request.Headers['Content-Type'] -eq 'application/octet-stream') { + $Content = [System.Text.Encoding]::UTF8.GetString($Request.Content); + } else { + $Content = $Request.Content; + } + $Content | Out-File -FilePath $OutputPath -Force; + + if ($Patches -and $Patches.Length -gt 0) { + Invoke-Info "Applying patches to $($OutputPath)."; + # $Command = "git apply --verbose $Patches"; + # Invoke-Debug "Running: $Command"; + # Invoke-Expression $Command; + git apply $Patches + $Content = Get-Content -Path $OutputPath -Raw; + } + + $Hash = $Request.Headers['ETag']; + $Content = "#!ignore $Hash`n$Content"; + $Content | Out-File -FilePath $OutputPath -Force; + } +} + +Invoke-RunMain $PSCmdlet { + $WantedDefinitions = Get-ChildItem -Path $Definitions -Filter '*.json?' -File; + + foreach ($RawDefinition in $WantedDefinitions) { + Invoke-Info "Processing $($RawDefinition.Name)."; + $Definition = Get-Content -Path $RawDefinition.FullName | ConvertFrom-Json; + + if (-not $Definition.Source -or -not $Definition.Output) { + Invoke-Error "Invalid definition file $($RawDefinition.Name)."; + continue; + } + + Invoke-Debug "Processing $($Definition.Output)."; + $OutputPath = $Output + $Definition.Output; + + if (-not $Force -and (Compare-LocalToRemote -LocalFile $OutputPath -RemoteURI $Definition.Source)) { + Invoke-Info "No update required for $($Definition.Output)."; + continue; + } + + Get-RemoteAndPatch -RemoteURI $Definition.Source -OutputPath $OutputPath -Patches $Definition.Patches; + } +}; diff --git a/src/external/patches/Nodeware_parameters.patch b/src/external/patches/Nodeware_parameters.patch new file mode 100644 index 00000000..27bda71b --- /dev/null +++ b/src/external/patches/Nodeware_parameters.patch @@ -0,0 +1,15 @@ +diff --git a/src/external/scripts/Deploy-Nodeware.ps1 b/src/external/scripts/Deploy-Nodeware.ps1 +index ddb216c..aca42e1 100644 +--- a/src/external/scripts/Deploy-Nodeware.ps1 ++++ b/src/external/scripts/Deploy-Nodeware.ps1 +@@ -1,6 +1,7 @@ +-$customerID = '' +-# Enter numerical portion of customer ID between the single quotes +-# No other modifications are required ++param( ++ [Parameter(Mandatory)] ++ $customerID ++) + + $url = "https://downloads.nodeware.com/agent/windows/NodewareAgentSetup.msi" + $msiName = "NodewareAgentSetup.msi" diff --git a/src/external/scripts/Deploy-Nodeware.ps1 b/src/external/scripts/Deploy-Nodeware.ps1 new file mode 100644 index 00000000..3b38238d --- /dev/null +++ b/src/external/scripts/Deploy-Nodeware.ps1 @@ -0,0 +1,30 @@ +#!ignore "33efd32f2e789eb049f02a03631054ff" +param( + [Parameter(Mandatory)] + $customerID +) + +$url = "https://downloads.nodeware.com/agent/windows/NodewareAgentSetup.msi" +$msiName = "NodewareAgentSetup.msi" +$tempDir = [System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "NodewareInstallTemp") +$msiPath = [System.IO.Path]::Combine($tempDir, $msiName) + +try { + if (-not (Test-Path -Path $tempDir -PathType Container)) { + New-Item -Path $tempDir -ItemType Directory | Out-Null + } + Invoke-WebRequest -Uri $url -OutFile $msiPath + + if (Test-Path -Path $msiPath -PathType Leaf) { + Start-Process -FilePath "msiexec.exe" -ArgumentList "/i $msiPath /q CUSTOMERID=$customerID" -Wait + } else { + Write-Error "Failed to download the NodewareAgentSetup MSI." + } +} catch { + Write-Error "An error occurred: $_" +} finally { + # Clean up the temp directory and MSI file + Remove-Item -Path $msiPath -Force -ErrorAction SilentlyContinue + Remove-Item -Path $tempDir -Force -Recurse -ErrorAction SilentlyContinue +} + diff --git a/src/external/sources/Nodeware.jsonc b/src/external/sources/Nodeware.jsonc new file mode 100644 index 00000000..1fbee866 --- /dev/null +++ b/src/external/sources/Nodeware.jsonc @@ -0,0 +1,8 @@ +{ + "$schema": "../../../resources/schemas/ExternalScript.jsonc", + "Output": "Deploy-Nodeware.ps1", + "Source": "https://downloads.nodeware.com/deploy/agent-deploy.ps1", + "Patches": [ + "./patches/Nodeware_parameters.patch" + ] +} From 027c7587a770deba1fcb11429e9c3169cbc76e3c Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 29 Oct 2024 16:52:14 +1100 Subject: [PATCH 210/341] fix: error due to env being removed before possible restart of script --- src/common/Environment.psm1 | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/common/Environment.psm1 b/src/common/Environment.psm1 index 8f5ea10b..639cea5f 100644 --- a/src/common/Environment.psm1 +++ b/src/common/Environment.psm1 @@ -2,7 +2,7 @@ Using module ./Utils.psm1 Using module ./Logging.psm1 Using module ./Exit.psm1 -Using namespace System.Management.Automation.Language; +Using namespace System.Management.Automation.Language Using namespace System.Collections.Generic [System.Boolean]$Script:ScriptRestarted = $False; @@ -10,7 +10,7 @@ Using namespace System.Collections.Generic [System.Collections.Generic.List[String]]$Script:ImportedModules = [System.Collections.Generic.List[String]]::new(); $Script:ModuleSnapshot = Get-Module | Select-Object -ExpandProperty Path | Where-Object { # Also Exclude our own modules - $_.Name -notmatch '(Environment|Logging|Scope|Utils|Exit)' + $_ -notmatch '(Environment|Logging|Scope|Utils|Exit).psm1$' }; #region - Utility Functions @@ -92,18 +92,6 @@ function Invoke-Teardown { $PSDefaultParameterValues.Remove('*:InformationAction'); $PSDefaultParameterValues.Remove('*:Verbose'); $PSDefaultParameterValues.Remove('*:Debug'); - - if (-not (Get-Variable -Name 'CompiledScript' -ValueOnly -ErrorAction SilentlyContinue)) { - Get-Module | ForEach-Object { - if ($Script:ModuleSnapshot -notcontains $_.Path) { - Write-Debug "Removing module $_."; - $_ | Remove-Module -Force -Confirm:$False -Verbose:$False -Debug:$False; - if (Get-Module -Name $_.Name) { - Write-Warning "Failed to remove module $_."; - } - } - } - } } <# @@ -242,6 +230,15 @@ function Invoke-RunMain { $Script:ScriptRestarting = $False; $Script:ScriptRestarted = $True; # Bread trail for the script to know it's been restarted. Invoke-Inner @PSBoundParameters; + } else { + if (-not (Get-Variable -Name 'CompiledScript' -ValueOnly -ErrorAction SilentlyContinue)) { + Get-Module | ForEach-Object { + if ($Script:ModuleSnapshot -notcontains $_.Path) { + Write-Debug "Removing module $_."; + $_ | Remove-Module -Force -Confirm:$False -Verbose:$False -Debug:$False; + } + } + } } } } From 282f6e3a84e459576e50987e5d283932a180fb1d Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 29 Oct 2024 17:18:52 +1100 Subject: [PATCH 211/341] fix(Compiler): Inconsistent module resolving Was missing an override for equals inside PathedModuleSpec which caused non matching modules to equal. --- .editorconfig | 4 ++ PSScriptAnalyzerSettings.psd1 | 1 - src/Compiler/Module/Resolvable/Local.cs | 28 +++++++----- src/Compiler/Module/Resolvable/Resolvable.cs | 11 ++--- src/Compiler/Program.cs | 4 +- src/Compiler/Requirements/ModuleSpec.cs | 38 +++++++++-------- tests/Compiler/Module/Compiled/Compiled.cs | 7 ++- tests/Compiler/Module/Compiled/Local.cs | 5 +-- tests/Compiler/Module/Resolvable/Local.cs | 45 ++++---------------- tests/Compiler/Requirements/ModuleSpec.cs | 19 ++++----- tests/Compiler/Utils.cs | 45 ++++++++++++++++++-- 11 files changed, 116 insertions(+), 91 deletions(-) diff --git a/.editorconfig b/.editorconfig index bd7b66e6..18014c46 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,6 +10,10 @@ insert_final_newline = true max_line_length = 130 rulers = 80,100,120 +[*.{patch,diff}] +trim_trailing_whitespace = false +insert_final_newline = false + [*.{cmd,bat,cmd,vbs,bas}] end_of_line = crlf diff --git a/PSScriptAnalyzerSettings.psd1 b/PSScriptAnalyzerSettings.psd1 index 421572b9..e1e98589 100644 --- a/PSScriptAnalyzerSettings.psd1 +++ b/PSScriptAnalyzerSettings.psd1 @@ -23,4 +23,3 @@ }; }; } - diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index dc7cbfa2..6a332cc3 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -44,7 +44,7 @@ ModuleSpec moduleSpec ) : this( moduleSpec is PathedModuleSpec pathedModuleSpec ? pathedModuleSpec - : new PathedModuleSpec(Path.GetFullPath(Path.Combine(parentPath, moduleSpec.Name))) + : new PathedModuleSpec(parentPath, moduleSpec.Name) ) { if (!Path.IsPathRooted(parentPath)) throw InvalidModulePathError.NotAnAbsolutePath(parentPath); if (!Directory.Exists(parentPath)) throw InvalidModulePathError.ParentNotADirectory(parentPath); @@ -113,13 +113,19 @@ public override Task> ResolveRequirements() { module.Value.TryGetValue("MinimumVersion", out var minimumVersion); module.Value.TryGetValue("MaximumVersion", out var maximumVersion); module.Value.TryGetValue("RequiredVersion", out var requiredVersion); - var spec = new ModuleSpec( - module.Key, - (Guid?)guid, - (Version?)minimumVersion, - (Version?)maximumVersion, - (Version?)requiredVersion - ); + + ModuleSpec spec; + var parentPath = Directory.GetParent(this.ModuleSpec.FullPath)!.FullName; + var possibleKeyFullPath = Path.GetFullPath(Path.Join(parentPath, module.Key)); + spec = File.Exists(possibleKeyFullPath) + ? new PathedModuleSpec(this.ModuleSpec.SourceRoot, possibleKeyFullPath) + : new ModuleSpec( + module.Key, + (Guid?)guid, + (Version?)minimumVersion, + (Version?)maximumVersion, + (Version?)requiredVersion + ); if (spec.Name.EndsWith("Analyser.psm1", StringComparison.OrdinalIgnoreCase)) { foundAnalyserModule = true; @@ -172,8 +178,10 @@ public override Task> ResolveRequirements() { // Add a reference to the Analyser.psm1 file to ensure all files have access to the SuppressAnalyserAttribute if (!foundAnalyserModule) { lock (this.Requirements) { - this.Requirements.AddRequirement(new ModuleSpec(GetExportedResource("ModuleUtils.psm1").Unwrap())); // Safety - We know this will always be present in the resources. - this.Requirements.AddRequirement(new ModuleSpec(GetExportedResource("Analyser.psm1").Unwrap())); // Safety - We know this will always be present in the resources. + var moduleUtilsPath = GetExportedResource("ModuleUtils.psm1").Unwrap(); + var analyserPath = GetExportedResource("Analyser.psm1").Unwrap(); + this.Requirements.AddRequirement(new PathedModuleSpec(Directory.GetParent(moduleUtilsPath)!.FullName, moduleUtilsPath)); // Safety - We know this will always be present in the resources. + this.Requirements.AddRequirement(new PathedModuleSpec(Directory.GetParent(analyserPath)!.FullName, analyserPath)); // Safety - We know this will always be present in the resources. } } diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index 1af74585..95f78e2b 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -57,6 +57,7 @@ internal static async Task> TryCreate( var parentPath = Path.GetDirectoryName(localParent.ModuleSpec.FullPath)!; try { Logger.Debug($"Looking for {moduleSpec.Name} module in {parentPath}."); + var pathedModuleSpec = new PathedModuleSpec(parentPath, moduleSpec.Name); resolvable = new ResolvableLocalModule(parentPath, moduleSpec); } catch (ExceptionalException err) when (err.ToError() is InvalidModulePathError) { // Silent fall through to remote. @@ -122,7 +123,11 @@ [NotNull] Option>> CompilingTask ///
      public readonly BidirectionalGraph> Graph = new(); - public ResolvableParent() { + public readonly string SourceRoot; + + public ResolvableParent([NotNull] string sourceRoot) { + this.SourceRoot = sourceRoot; + #region Deduplication and merging of Resolvables using events this.Graph.VertexAdded += vertex => Logger.Debug($"Vertex added: {vertex.ModuleSpec.Name}"); this.Graph.VertexRemoved += vertex => Logger.Debug($"Vertex removed: {vertex.ModuleSpec.Name}"); @@ -201,10 +206,6 @@ public async Task> FindResolvable([NotNull] ModuleSpec mod } public async Task> WaitForCompiled(ModuleSpec moduleSpec) { - if (this.RunningTasks.Count > 0) { - await Task.WhenAll(this.RunningTasks.Select(task => task.Item2)); - } - var resolvable = this.Graph.Vertices.FirstOrDefault(res => res.ModuleSpec == moduleSpec); if (resolvable is null) { return FinFail(Error.New($"No resolvable found for {moduleSpec}.")); diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index d34bf85c..c66df667 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -79,10 +79,10 @@ private static async Task Main(string[] args) { EnsureDirectoryStructure(opts.Input!, opts.Output, filesToCompile); - var superParent = new ResolvableParent(); + var superParent = new ResolvableParent(opts.Input!); filesToCompile.ToList().ForEach(async scriptPath => { - var pathedModuleSpec = new PathedModuleSpec(Path.GetFullPath(scriptPath)); + var pathedModuleSpec = new PathedModuleSpec(opts.Input!, Path.GetFullPath(scriptPath)); if ((await Resolvable.TryCreateScript(pathedModuleSpec, superParent)).IsErr(out var error, out var resolvableScript)) { Errors.Add(error.Enrich(pathedModuleSpec)); return; diff --git a/src/Compiler/Requirements/ModuleSpec.cs b/src/Compiler/Requirements/ModuleSpec.cs index dced5628..3aa789e2 100644 --- a/src/Compiler/Requirements/ModuleSpec.cs +++ b/src/Compiler/Requirements/ModuleSpec.cs @@ -16,6 +16,8 @@ namespace Compiler.Requirements; public sealed class PathedModuleSpec : ModuleSpec { private Option LazyHash = None; + public readonly string SourceRoot; + public readonly string FullPath; public override byte[] Hash { @@ -31,34 +33,35 @@ public override byte[] Hash { /// /// Creates a new PathedModuleSpec from a full path. /// - /// - /// - /// - /// - /// + /// The absolute root for where all the source files are located. + /// The full path to the file. /// /// Thrown when the file cannot be found, or read. /// public PathedModuleSpec( - string fullPath, - Guid? id = null, - Version? minimumVersion = null, - Version? maximumVersion = null, - Version? requiredVersion = null - ) : base(Path.GetFileNameWithoutExtension(fullPath), id, minimumVersion, maximumVersion, requiredVersion) { + string sourceRoot, + string fullPath + ) : base(Path.GetFileNameWithoutExtension(Path.GetRelativePath(sourceRoot, fullPath))) { + this.SourceRoot = sourceRoot; this.FullPath = fullPath; this.Weight = 73; } - // TODO - this may not be the best way to do this. public override ModuleMatch CompareTo(ModuleSpec other) { - if (other is not PathedModuleSpec && other.Id == null && other.MinimumVersion == null && other.MaximumVersion == null && other.RequiredVersion == null) { - var otherMaybeFileName = Path.GetFileNameWithoutExtension(other.Name); - if (this.Name == otherMaybeFileName) return ModuleMatch.PreferOurs; - } + if (ReferenceEquals(this, other)) return ModuleMatch.Same; + if (this.FullPath == (other as PathedModuleSpec)?.FullPath) return ModuleMatch.Same; - return base.CompareTo(other); + return ModuleMatch.None; } + + public override bool Equals(object? obj) { + if (obj is null || obj is not PathedModuleSpec other) return false; + if (ReferenceEquals(this, other)) return true; + + return this.FullPath == other.FullPath; + } + + public override int GetHashCode() => HashCode.Combine(this.SourceRoot, this.FullPath); } public class ModuleSpec : Requirement { @@ -250,4 +253,3 @@ public override bool Equals(object? obj) { public override string ToString() => JsonSerializer.Serialize(this, SerializerOptions); } - diff --git a/tests/Compiler/Module/Compiled/Compiled.cs b/tests/Compiler/Module/Compiled/Compiled.cs index 6f7f651a..89ec573e 100644 --- a/tests/Compiler/Module/Compiled/Compiled.cs +++ b/tests/Compiler/Module/Compiled/Compiled.cs @@ -60,6 +60,9 @@ public static IEnumerable AddRequirementHashData { var hashableBytes = new byte[random.Next(10, 100)]; random.NextBytes(hashableBytes); + var sourceRoot = Path.Combine(TestUtils.RepositoryDirectory(), "src"); + var environmentPath = Path.Combine(sourceRoot, "common/Environment.psm1"); + yield return new TestCaseData( hashableBytes, new RequirementGroup() { @@ -67,7 +70,7 @@ public static IEnumerable AddRequirementHashData { { typeof(ModuleSpec), new HashSet { new ModuleSpec("PSWindowsUpdate"), new ModuleSpec("PSReadLine", requiredVersion: new (2, 3, 5)), - new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/Environment.psm1") + new PathedModuleSpec(sourceRoot, environmentPath) } }, { typeof(PSEditionRequirement), new HashSet { new PSEditionRequirement(PSEdition.Core) @@ -85,7 +88,7 @@ public static IEnumerable AddRequirementHashData { new RequirementGroup() { StoredRequirements = { { typeof(ModuleSpec), new HashSet { - new PathedModuleSpec($"{Environment.CurrentDirectory}/../../../../../src/common/Environment.psm1") + new PathedModuleSpec(sourceRoot, environmentPath) } }, } } diff --git a/tests/Compiler/Module/Compiled/Local.cs b/tests/Compiler/Module/Compiled/Local.cs index 5564926e..17ba1c2c 100644 --- a/tests/Compiler/Module/Compiled/Local.cs +++ b/tests/Compiler/Module/Compiled/Local.cs @@ -2,7 +2,6 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Management.Automation.Language; -using System.Reflection; using Compiler.Module.Compiled; using Compiler.Requirements; using Compiler.Text; @@ -35,9 +34,9 @@ public static RealCompiled GetRandomCompiledModule(CompiledLocalModule? parent = var createLocalModule = parent is null || random.NextBool(); if (createLocalModule) { var document = CompiledDocument.FromBuilder(new TextEditor(new TextDocument(["Write-Host 'Hello, World!'"]))).Unwrap(); - var modulePath = TestContext.CurrentContext.WorkDirectory + $"/{random.GetString(6)}.psm1"; + var modulePath = Path.Combine(TestContext.CurrentContext.WorkDirectory, $"{random.GetString(6)}.psm1"); File.Create(modulePath).Close(); - var moduleSpec = new PathedModuleSpec(modulePath); + var moduleSpec = new PathedModuleSpec(TestContext.CurrentContext.WorkDirectory, modulePath); var requirementGroup = new RequirementGroup(); requirementGroup.AddRequirement(new RunAsAdminRequirement()); diff --git a/tests/Compiler/Module/Resolvable/Local.cs b/tests/Compiler/Module/Resolvable/Local.cs index e4b1e271..4d2ba216 100644 --- a/tests/Compiler/Module/Resolvable/Local.cs +++ b/tests/Compiler/Module/Resolvable/Local.cs @@ -30,7 +30,7 @@ string filePath Directory.CreateDirectory(parentPath); File.Create(actualFileLocation).Close(); - var moduleSpec = new ModuleSpec(filePath); + var moduleSpec = new ModuleSpec(actualFileLocation); var module = new ResolvableLocalModule(parentPath, moduleSpec); Assert.Multiple(() => { @@ -45,6 +45,7 @@ string filePath [Repeat(10), Parallelizable] [TestCaseSource(typeof(TestData), nameof(TestData.GetModuleMatch_MatchesByOnlyName))] public ModuleMatch GetModuleMatch_MatchesByOnlyName( + string sourceRoot, string moduleOne, string moduleTwo ) { @@ -52,9 +53,8 @@ string moduleTwo (moduleTwo, moduleOne) = (moduleOne, moduleTwo); } - var random = TestContext.CurrentContext.Random; - var moduleSpecOne = new PathedModuleSpec(moduleOne, random.NextGuid()); - var moduleSpecTwo = new PathedModuleSpec(moduleTwo, random.NextGuid()); + var moduleSpecOne = new PathedModuleSpec(sourceRoot, moduleOne); + var moduleSpecTwo = new PathedModuleSpec(sourceRoot, moduleTwo); var module = new ResolvableLocalModule(moduleSpecOne); return module.GetModuleMatchFor(moduleSpecTwo); @@ -77,7 +77,7 @@ public bool Equals( [Test, Repeat(10), Parallelizable] public void GetHashCode_NeverDiffersFromModuleSpec() { - var (module, _) = TestData.GetRandomModules(true); + var (module, _) = TestUtils.GetRandomModules(true); Assert.That(module.GetHashCode(), Is.EqualTo(module.ModuleSpec.GetHashCode())); } @@ -118,14 +118,14 @@ public static IEnumerable Constructor_ReturnsData { public static IEnumerable GetModuleMatch_MatchesByOnlyName { get { - var (childOne, childTwo) = GetRandomFilePaths(true); + var (sourceRoot, (childOne, childTwo)) = TestUtils.GenerateTestSources(true); - yield return new TestCaseData(childOne, childTwo) + yield return new TestCaseData(sourceRoot, childOne, childTwo) .Returns(ModuleMatch.None) .SetName("NoMatch") .SetDescription("Returns ModuleMatch.None when there is not a name match"); - yield return new TestCaseData(childOne, childOne) + yield return new TestCaseData(sourceRoot, childOne, childOne) .Returns(ModuleMatch.Same) .SetName("NameMatch") .SetDescription("Returns ModuleMatch.Same when there is a name match"); @@ -134,7 +134,7 @@ public static IEnumerable GetModuleMatch_MatchesByOnlyName { public static IEnumerable Equals_Data { get { - var (moduleOne, moduleTwo) = GetRandomModules(true); + var (moduleOne, moduleTwo) = TestUtils.GetRandomModules(true); yield return new TestCaseData(moduleOne, moduleTwo) .Returns(false) @@ -152,31 +152,4 @@ public static IEnumerable Equals_Data { .SetDescription("Returns false when the module spec is null."); } } - - public static (ResolvableLocalModule, ResolvableLocalModule) GetRandomModules(bool createFiles) { - var (childOne, childTwo) = GetRandomFilePaths(createFiles); - - var moduleSpecOne = new PathedModuleSpec(childOne, Guid.NewGuid()); - var moduleOne = new ResolvableLocalModule(moduleSpecOne); - - var moduleSpecTwo = new PathedModuleSpec(childTwo, Guid.NewGuid()); - var moduleTwo = new ResolvableLocalModule(moduleSpecTwo); - - return (moduleOne, moduleTwo); - } - - private static (string, string) GetRandomFilePaths(bool createFiles) { - var random = TestContext.CurrentContext.Random; - var parent = Path.Combine(TestPath, random.GetString(6)); - var childOne = Path.Combine(parent, random.GetString(6) + ".psm1"); - var childTwo = Path.Combine(parent, random.GetString(6) + ".psm1"); - - if (createFiles) { - Directory.CreateDirectory(parent); - File.Create(childOne).Close(); - File.Create(childTwo).Close(); - } - - return (childOne, childTwo); - } } diff --git a/tests/Compiler/Requirements/ModuleSpec.cs b/tests/Compiler/Requirements/ModuleSpec.cs index dafb0230..22227160 100644 --- a/tests/Compiler/Requirements/ModuleSpec.cs +++ b/tests/Compiler/Requirements/ModuleSpec.cs @@ -384,7 +384,6 @@ public static IEnumerable MatchTestCases { #endregion } } - public static IEnumerable MergeSpecCases { get { yield return new TestCaseData(new ModuleSpec( @@ -527,29 +526,27 @@ public static IEnumerable MergeSpecCases { )); } } - public static IEnumerable ComparePathedSpecCases { get { - var testScript1 = Path.GetFullPath($"{TestUtils.RepositoryDirectory()}/resources/test.ps1"); - var testScript2 = Path.GetFullPath($"{TestUtils.RepositoryDirectory()}/resources/test2.ps1"); + var (sourceRoot, (testScript1, testScript2)) = TestUtils.GenerateTestSources(); yield return new TestCaseData( - new PathedModuleSpec(testScript1), - new PathedModuleSpec(testScript1) + new PathedModuleSpec(sourceRoot, testScript1), + new PathedModuleSpec(sourceRoot, testScript1) ).Returns(ModuleMatch.Same); yield return new TestCaseData( - new PathedModuleSpec(testScript1), - new PathedModuleSpec(testScript2) + new PathedModuleSpec(sourceRoot, testScript1), + new PathedModuleSpec(sourceRoot, testScript2) ).Returns(ModuleMatch.None); yield return new TestCaseData( - new PathedModuleSpec(testScript1), + new PathedModuleSpec(sourceRoot, testScript1), new ModuleSpec("./test.ps1") - ).Returns(ModuleMatch.PreferOurs); + ).Returns(ModuleMatch.None); yield return new TestCaseData( - new PathedModuleSpec(testScript1), + new PathedModuleSpec(sourceRoot, testScript1), new ModuleSpec("./test2.ps1") ).Returns(ModuleMatch.None); } diff --git a/tests/Compiler/Utils.cs b/tests/Compiler/Utils.cs index 4f857165..eba5465a 100644 --- a/tests/Compiler/Utils.cs +++ b/tests/Compiler/Utils.cs @@ -2,15 +2,18 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using System.Runtime.CompilerServices; +using Compiler.Module.Resolvable; using Compiler.Requirements; namespace Compiler.Test; public class TestUtils { public static PathedModuleSpec GetModuleSpecFromContent(string content) { - var tempFile = Path.GetTempFileName(); + var sourceRoot = TestContext.CurrentContext.WorkDirectory; + var tempFile = Path.GetFullPath($"{sourceRoot}/{TestContext.CurrentContext.Random.GetString(6)}.ps1"); + File.WriteAllText(tempFile, content); - return new PathedModuleSpec(tempFile); + return new PathedModuleSpec(sourceRoot, tempFile); } private static string CallerFilePath([CallerFilePath] string? callerFilePath = null) => @@ -19,5 +22,41 @@ private static string CallerFilePath([CallerFilePath] string? callerFilePath = n public static string ProjectDirectory() => Path.GetDirectoryName(CallerFilePath())!; public static string RepositoryDirectory() => Path.GetDirectoryName(Path.Combine(ProjectDirectory(), "../../"))!; -} + /// + /// Generate test sources inside the current test context directory. + /// + /// + /// A tuple containing the source root directory, and a tuple containing the paths of the generated scripts. + /// + public static (string, Tuple) GenerateTestSources(bool createFiles = true) { + const int numberOfScripts = 2; + + var random = TestContext.CurrentContext.Random; + var sourceRoot = Path.Combine(TestContext.CurrentContext.WorkDirectory, random.GetString(6)); + var testScripts = new string[numberOfScripts]; + + if (createFiles) Directory.CreateDirectory(sourceRoot); + + for (var i = 0; i < numberOfScripts; i++) { + var path = Path.GetFullPath($"{sourceRoot}/{random.GetString(6)}.ps1"); + if (createFiles) File.Create(path).Close(); + testScripts[i] = path; + } + + return (sourceRoot, new(testScripts[0], testScripts[1])); + } + + + public static (ResolvableLocalModule, ResolvableLocalModule) GetRandomModules(bool createFiles) { + var (sourceRoot, (childOne, childTwo)) = GenerateTestSources(createFiles); + + var moduleSpecOne = new PathedModuleSpec(sourceRoot, childOne); + var moduleOne = new ResolvableLocalModule(moduleSpecOne); + + var moduleSpecTwo = new PathedModuleSpec(sourceRoot, childTwo); + var moduleTwo = new ResolvableLocalModule(moduleSpecTwo); + + return (moduleOne, moduleTwo); + } +} From 6f50ce52f833dcbc3815670bd785a6b30268c8cd Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 29 Oct 2024 17:19:28 +1100 Subject: [PATCH 212/341] chore: upgrade target framework to net9.0-windows --- src/Compiler/Compiler.csproj | 2 +- src/Compiler/packages.lock.json | 2460 ++++++++++++------------- tests/Compiler/Compiler.Test.csproj | 2 +- tests/Compiler/packages.lock.json | 2620 +++++++++++++-------------- 4 files changed, 2542 insertions(+), 2542 deletions(-) diff --git a/src/Compiler/Compiler.csproj b/src/Compiler/Compiler.csproj index 586eb9f5..e6bf2197 100644 --- a/src/Compiler/Compiler.csproj +++ b/src/Compiler/Compiler.csproj @@ -2,7 +2,7 @@ Program - net8.0-windows + net9.0-windows enable enable Exe diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 72008b0b..8f5fce13 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -1,1231 +1,1231 @@ -{ - "version": 1, - "dependencies": { - "net8.0-windows7.0": { - "CommandLineParser": { - "type": "Direct", - "requested": "[2.9.1, )", - "resolved": "2.9.1", - "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" - }, - "Extended.Collections": { - "type": "Direct", - "requested": "[1.1.1, )", - "resolved": "1.1.1", - "contentHash": "PvLjUHQeX6MwjF34eQhU6EE1fCRC5zYcX/u10n+ZUkzgv+hRtZSHj1JzAg7AQ5a6iEcLZ2yCb5VBDzdupErDNQ==" - }, - "LanguageExt.Core": { - "type": "Direct", - "requested": "[5.0.0-beta-07, )", - "resolved": "5.0.0-beta-07", - "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" - }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[8.0.10, )", - "resolved": "8.0.10", - "contentHash": "xT8jYjlroY7SLbGtoV9vUTVW/TPgodL4Egc31a444Xe0TMytLZ3UlKQ0kxMZsy/CrWsFB6wtKnSG1SsXcWreew==" - }, - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.5, )", - "resolved": "7.4.5", - "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.8", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", - "Microsoft.PowerShell.Commands.Management": "7.4.5", - "Microsoft.PowerShell.Commands.Utility": "7.4.5", - "Microsoft.PowerShell.ConsoleHost": "7.4.5", - "Microsoft.PowerShell.Security": "7.4.5", - "Microsoft.WSMan.Management": "7.4.5", - "Microsoft.Windows.Compatibility": "8.0.8", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.5", - "System.Net.Http.WinHttpHandler": "8.0.2", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "NLog": { - "type": "Direct", - "requested": "[5.3.2, )", - "resolved": "5.3.2", - "contentHash": "cQRQZuDMjSyMe9EQBnI9v55YAMMz8GAfFd6fFJ6tc/kXnG7Hze8p1I8MgvWSBG6E36wA8vSxRrlm8uSIG+SENg==" - }, - "NuGet.Commands": { - "type": "Direct", - "requested": "[6.9.1, )", - "resolved": "6.9.1", - "contentHash": "pI2X+KRQYsVcmjJUIAXT+8fvUCZgNWBQiSizKCOltRqaMjtUHLetfADfz7jfreOBohsDxNzhBnNqPQ8MU/Gjxw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "NuGet.Credentials": "6.9.1", - "NuGet.ProjectModel": "6.9.1" - } - }, - "NuGet.Common": { - "type": "Direct", - "requested": "[6.9.1, )", - "resolved": "6.9.1", - "contentHash": "FbuWZBjQ1NJXBDqCwSddN2yvw3Plq3sTCIh0nc66Hu8jrNr+BOaxlKZv78jvJ+pSy8BvurYOdF9sl9KoORjrtg==", - "dependencies": { - "NuGet.Frameworks": "6.9.1" - } - }, - "Pastel": { - "type": "Direct", - "requested": "[5.1.0, )", - "resolved": "5.1.0", - "contentHash": "jQ0fTkHZvgQsmbr5qU0IdCP1PWuUfmEmekIsTwysWK/iIwmT9Mbm0x5GpjYSTEwHTNVEpjYhBhyKVdzESgRCpg==" - }, - "QuikGraph": { - "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "sG+mrPpXwxlXknRK5VqWUGiOmDACa9X+3ftlkQIMgOZUqxVOQSe0+HIU9PTjwqazy0pqSf8MPDXYFGl0GYWcKw==" - }, - "QuikGraph.Graphviz": { - "type": "Direct", - "requested": "[2.5.0, )", - "resolved": "2.5.0", - "contentHash": "pCKpErtHGxUi72OT+2aIg1pdHdUqpqEM5J/i9rmVsEVDE4X0xb1HBPWdxv/FLZmbBjk0ZogZXZttUL3CnAPpNw==", - "dependencies": { - "QuikGraph": "2.5.0" - } - }, - "System.Management.Automation": { - "type": "Direct", - "requested": "[7.4.5, )", - "resolved": "7.4.5", - "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Formats.Asn1": "8.0.1", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Windows.Forms": { - "type": "Direct", - "requested": "[4.0.0, )", - "resolved": "4.0.0", - "contentHash": "WL3QPG1q88aIWO0JPOlkCeyNE+FK4ufSKY5j6J6qAFQyfCFiiOYxi8RAhev9H0CS/wmKbIK8qr8xZBod85oWKw==" - }, - "JetBrains.Annotations": { - "type": "Transitive", - "resolved": "2021.2.0", - "contentHash": "kKSyoVfndMriKHLfYGmr0uzQuI4jcc3TKGyww7buJFCYeHb/X0kodYBPL7n9454q7v6ASiRmDgpPGaDGerg/Hg==" - }, - "Json.More.Net": { - "type": "Transitive", - "resolved": "1.9.3", - "contentHash": "BKIsKHXR2Jq+LdLdxPo3L09Lv0ld9xs1fAMvSAe2cf2YOl3at9vw0RrMlhC2ookDi7VtrgHXzc2Et5mVBOAUdw==", - "dependencies": { - "System.Text.Json": "6.0.2" - } - }, - "JsonPointer.Net": { - "type": "Transitive", - "resolved": "3.0.3", - "contentHash": "mCGQc15lHLp1R2CVhWiipnZurHXm93+LbPPAT/vXQm5PdHt6WQuYLhaEF8VZ+aXL9P2I6bGND6pDTEfqFs6gig==", - "dependencies": { - "Json.More.Net": "1.8.0" - } - }, - "JsonSchema.Net": { - "type": "Transitive", - "resolved": "5.2.7", - "contentHash": "8un7Xq2MoKiWNo0HQtf2sPr3764W9NjNELIx3l9d3fIKEjg3tYtrZmxN+CgXKtzku4g52CqYUZuI+o0ue226vw==", - "dependencies": { - "JetBrains.Annotations": "2021.2.0", - "Json.More.Net": "1.9.0", - "JsonPointer.Net": "3.0.3" - } - }, - "Markdig.Signed": { - "type": "Transitive", - "resolved": "0.33.0", - "contentHash": "/BE/XANxmocgEqajbWB/ur4Jei+j1FkXppWH9JFmEuoq8T3xJndkQKZVCW/7lTdc9Ru6kfEAkwSXFOv30EkU2Q==" - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Transitive", - "resolved": "4.8.0", - "contentHash": "/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "7.0.0", - "System.Reflection.Metadata": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.8.0", - "contentHash": "+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.8.0]" - } - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" - }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "8.0.8", - "contentHash": "wnjTFjEvvSbOs3iMfl6CeJcUgPHZMYUB9uAQbGQGxGwVRl4GydNpMSkVntTzoi7AqQeYumU9yDSNeVbpq+ebow==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.Management.Infrastructure": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "cGZi0q5IujCTVYKo9h22Pw+UwfZDV82HXO8HTxMG2HqntPlT3Ls8jY6punLp4YzCypJNpfCAu2kae3TIyuAiJw==", - "dependencies": { - "Microsoft.Management.Infrastructure.Runtime.Unix": "3.0.0", - "Microsoft.Management.Infrastructure.Runtime.Win": "3.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.5", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.8", - "System.Management.Automation": "7.4.5", - "System.Text.Json": "8.0.4", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.MarkdownRender": { - "type": "Transitive", - "resolved": "7.2.1", - "contentHash": "o5oUwL23R/KnjQPD2Oi49WAG5j4O4VLo1fPRSyM/aq0HuTrY2RnF4B3MCGk13BfcmK51p9kPlHZ1+8a/ZjO4Jg==", - "dependencies": { - "Markdig.Signed": "0.31.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", - "dependencies": { - "System.Security.AccessControl": "4.7.0", - "System.Security.Principal.Windows": "4.7.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.Windows.Compatibility": { - "type": "Transitive", - "resolved": "8.0.8", - "contentHash": "9FWk4D5mNFz99rT7NvsqrDdT/6bjkNtxo7CPwajyudBTMXi7kro8ixr5pUnFYrhUBfimR+OUGDYk/se4NxJ6sA==", - "dependencies": { - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Microsoft.Win32.SystemEvents": "8.0.0", - "System.CodeDom": "8.0.0", - "System.ComponentModel.Composition": "8.0.0", - "System.ComponentModel.Composition.Registration": "8.0.0", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Data.Odbc": "8.0.0", - "System.Data.OleDb": "8.0.0", - "System.Data.SqlClient": "4.8.6", - "System.Diagnostics.EventLog": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.AccountManagement": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0", - "System.Drawing.Common": "8.0.8", - "System.IO.Packaging": "8.0.0", - "System.IO.Ports": "8.0.0", - "System.Management": "8.0.0", - "System.Reflection.Context": "8.0.0", - "System.Runtime.Caching": "8.0.0", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Cryptography.ProtectedData": "8.0.0", - "System.Security.Cryptography.Xml": "8.0.1", - "System.Security.Permissions": "8.0.0", - "System.ServiceModel.Duplex": "4.10.0", - "System.ServiceModel.Http": "4.10.0", - "System.ServiceModel.NetTcp": "4.10.0", - "System.ServiceModel.Primitives": "4.10.0", - "System.ServiceModel.Security": "4.10.0", - "System.ServiceModel.Syndication": "8.0.0", - "System.ServiceProcess.ServiceController": "8.0.0", - "System.Speech": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0", - "System.Threading.AccessControl": "8.0.0", - "System.Web.Services.Description": "4.10.0" - } - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.5", - "System.Management.Automation": "7.4.5", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "NuGet.Configuration": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "GM06pcUzWdNsizeGciqCjAhryfI1F/rQPETLDF+8pDRgzVpA+wKAR01/4aFU+IXzugnQ9LqOb5YyCRuR1OVZiQ==", - "dependencies": { - "NuGet.Common": "6.9.1", - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "NuGet.Credentials": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "elTErAznCWoqOLILVDN4FTa3+rpVVdUbHUaOUqJkk9+Z/ZSqyDPbCIhLaqTkPkWqoKa93gqzX9IFwURkMphPnw==", - "dependencies": { - "NuGet.Protocol": "6.9.1" - } - }, - "NuGet.DependencyResolver.Core": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "gVWIEScv1K40H2Fvs6HGaOzRMpG+r1RUqYpBdh7gqQ18kgsswWUSr90jCNtBb7PUYKkMU1oAhxTslj/gQjO+Vw==", - "dependencies": { - "NuGet.Configuration": "6.9.1", - "NuGet.LibraryModel": "6.9.1", - "NuGet.Protocol": "6.9.1" - } - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "DaKh3lenPUvzGccPkbI97BIvA27z+/UsL3ankfoZlX/4vBVDK5N1sheFTQ+GuJf+IgSzsJz/A21SPUpQLHwUtA==" - }, - "NuGet.LibraryModel": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "xlOpbZTc4862vKHkZHLJ5VgDteo+78ftVkajB8rKgSpevnBqwPKv2Y5OfUxct9HCqWYw0ikVfNf/qfjqnQCV1Q==", - "dependencies": { - "NuGet.Common": "6.9.1", - "NuGet.Versioning": "6.9.1" - } - }, - "NuGet.Packaging": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "6FyasOxKInCELJ+pGy8f17ub9st6ofFeNcBNTo7CRiPJlxyhJfKGKNpfe3HHYwvnZhc3Vdfr0kSR+f1BVGDuTA==", - "dependencies": { - "Newtonsoft.Json": "13.0.3", - "NuGet.Configuration": "6.9.1", - "NuGet.Versioning": "6.9.1", - "System.Security.Cryptography.Pkcs": "6.0.4" - } - }, - "NuGet.ProjectModel": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "x98QkS3oloaJfdSsDFOGTH5oeoHHTDoyTO7oyg/7g60be14AQowLqgPQV52Kuscl4lknx/3259RTxyDcbkdifQ==", - "dependencies": { - "NuGet.DependencyResolver.Core": "6.9.1" - } - }, - "NuGet.Protocol": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "h3bdjqUY4jvwM02D/7QM4FR8x/bbf4Pyjrc1Etw7an2OrWKPUSx0vJPdapKzioxIw7GXl/aVUM/DCeIc3S9brA==", - "dependencies": { - "NuGet.Packaging": "6.9.1" - } - }, - "NuGet.Versioning": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "ypnSvEtpNGo48bAWn95J1oHChycCXcevFSbn53fqzLxlXFSZP7dawu8p/7mHAfGufZQSV2sBpW80XQGIfXO8kQ==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", - "dependencies": { - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" - } - }, - "runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Ee7Sz5llLpTgyKIWzKI/GeuRSbFkOABgJRY00SqTY0OkTYtkB+9l5rFZfE7fxPA3c22RfytCBYkUdAkcmwMjQg==", - "dependencies": { - "runtime.linux-arm.runtime.native.System.IO.Ports": "8.0.0", - "runtime.linux-arm64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.linux-x64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.osx-arm64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.osx-x64.runtime.native.System.IO.Ports": "8.0.0" - } - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==" - }, - "System.ComponentModel.Composition": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bGhUX5BTivJ9Wax0qnJy7uGq7dn/TQkEpJ2Fpu1etg8dbPwyDkUzNPc1d3I2/jUr9y4wDI3a1dkSmi8X21Pzbw==" - }, - "System.ComponentModel.Composition.Registration": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "BVMXYqX7Z0Zdq3tc94UKJL/cOWq4LF3ufexfdPuUDrDl4ekbbfwPVzsusVbx+aq6Yx60CJnmJLyHtM3V2Q7BBQ==", - "dependencies": { - "System.ComponentModel.Composition": "8.0.0", - "System.Reflection.Context": "8.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JlYi9XVvIREURRUlGMr1F6vOFLk7YSY4p1vHo4kX3tQ0AGrjqlRWHDi66ImHhy6qwXBG3BJ6Y1QlYQ+Qz6Xgww==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0", - "System.Security.Cryptography.ProtectedData": "8.0.0" - } - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.Drawing.Common": { - "type": "Transitive", - "resolved": "8.0.8", - "contentHash": "4ZM1wvLjz9nVVExsfPAaSl/qOvU+QNedJL5rQ+2Wbow+iGeyO0e7XN07707rMBgaffEeeLrCZBwC0oHUuvRdPw==", - "dependencies": { - "Microsoft.Win32.SystemEvents": "8.0.0" - } - }, - "System.Formats.Asn1": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" - }, - "System.IO.Packaging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "8g1V4YRpdGAxFcK8v9OjuMdIOJSpF30Zb1JGicwVZhly3I994WFyBdV6mQEo8d3T+URQe55/M0U0eIH0Hts1bg==" - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Private.ServiceModel": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "BcUV7OERlLqGxDXZuIyIMMmk1PbqBblLRbAoigmzIUx/M8A+8epvyPyXRpbgoucKH7QmfYdQIev04Phx2Co08A==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "5.0.0", - "Microsoft.Extensions.ObjectPool": "5.0.10", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.DispatchProxy": "4.7.1", - "System.Security.Cryptography.Xml": "6.0.1", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Reflection.Context": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "k76ubeIBOeIVg7vkQ4I+LoB8sY1EzFIc3oHEtoiNLhXleb7TBLXUQu0CFZ4sPlXJzWNabRf+gn1T7lyhOBxIMA==" - }, - "System.Reflection.DispatchProxy": { - "type": "Transitive", - "resolved": "4.7.1", - "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "MclTG61lsD9sYdpNz9xsKBzjsmsfCtcMZYXz/IUr2zlhaTaABonlr1ESeompTgM+Xk+IwtGYU7/voh3YWB/fWw==", - "dependencies": { - "System.Collections.Immutable": "7.0.0" - } - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==" - }, - "System.Security.Cryptography.Xml": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "hqu2ztecOf3BYg5q1R7QcyliX9L7r3mfsWtaRitAxcezH8hyZMB7zCmhi186hsUZXk1KxsAHXwyPEW+xvUED6g==", - "dependencies": { - "System.Security.Cryptography.Pkcs": "8.0.0" - } - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "v/BBylw7XevuAsHXoX9dDUUfmBIcUf7Lkz8K3ZXIKz3YRKpw8YftpSir4n4e/jDTKFoaK37AsC3xnk+GNFI1Ow==", - "dependencies": { - "System.Windows.Extensions": "8.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceModel.Duplex": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "IZ8ZahvTenWML7/jGUXSCm6jHlxpMbcb+Hy+h5p1WP9YVtb+Er7FHRRGizqQMINEdK6HhWpD6rzr5PdxNyusdg==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Http": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "hodkn0rPTYmoZ9EIPwcleUrOi1gZBPvU0uFvzmJbyxl1lIpVM5GxTrs/pCETStjOXCiXhBDoZQYajquOEfeW/w==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.NetTcp": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "tP7GN7ehqSIQEz7yOJEtY8ziTpfavf2IQMPKa7r9KGQ75+uEW6/wSlWez7oKQwGYuAHbcGhpJvdG6WoVMKYgkw==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Primitives": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "aNcdry95wIP1J+/HcLQM/f/AA73LnBQDNc2uCoZ+c1//KpVRp8nMZv5ApMwK+eDNVdCK8G0NLInF+xG3mfQL+g==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3" - } - }, - "System.ServiceModel.Security": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "vqelKb7DvP2inb6LDJ5Igi8wpOYdtLXn5luDW5qEaqkV2sYO1pKlVYBpr6g6m5SevzbdZlVNu67dQiD/H6EdGQ==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Syndication": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CJxIUwpBkMCPmIx46tFVOt0zpRrYurUHLW6tJBcmyj+MyWpKc6MMcS69B7IdlV/bgtgys073wMIHZX9QOQ1OFA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Web.Services.Description": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "ORCkTkUo9f1o4ACG+H6SV+0XSxVZ461w3cHzYxEU41y6aKWp1CeNTMYbtdxMw1we6c6t4Hqq15PdcLVcdqno/g==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - } - }, - "net8.0-windows7.0/win-x64": { - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.5, )", - "resolved": "7.4.5", - "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.8", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", - "Microsoft.PowerShell.Commands.Management": "7.4.5", - "Microsoft.PowerShell.Commands.Utility": "7.4.5", - "Microsoft.PowerShell.ConsoleHost": "7.4.5", - "Microsoft.PowerShell.Security": "7.4.5", - "Microsoft.WSMan.Management": "7.4.5", - "Microsoft.Windows.Compatibility": "8.0.8", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.5", - "System.Net.Http.WinHttpHandler": "8.0.2", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "System.Management.Automation": { - "type": "Direct", - "requested": "[7.4.5, )", - "resolved": "7.4.5", - "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Formats.Asn1": "8.0.1", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.5", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.8", - "System.Management.Automation": "7.4.5", - "System.Text.Json": "8.0.4", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", - "dependencies": { - "System.Security.AccessControl": "4.7.0", - "System.Security.Principal.Windows": "4.7.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.5", - "System.Management.Automation": "7.4.5", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - } - } - } +{ + "version": 1, + "dependencies": { + "net9.0-windows7.0": { + "CommandLineParser": { + "type": "Direct", + "requested": "[2.9.1, )", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "Extended.Collections": { + "type": "Direct", + "requested": "[1.1.1, )", + "resolved": "1.1.1", + "contentHash": "PvLjUHQeX6MwjF34eQhU6EE1fCRC5zYcX/u10n+ZUkzgv+hRtZSHj1JzAg7AQ5a6iEcLZ2yCb5VBDzdupErDNQ==" + }, + "LanguageExt.Core": { + "type": "Direct", + "requested": "[5.0.0-beta-07, )", + "resolved": "5.0.0-beta-07", + "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[9.0.0-rc.2.24473.5, )", + "resolved": "9.0.0-rc.2.24473.5", + "contentHash": "mXyCgKqBIo/KOpY09FqjOU8d+LME2qowzzvBd1/viYmSpAKYfQ2w1WDOlh0FniY4xnrB/wmDiAo4frJvfCqT0w==" + }, + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.8", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", + "Microsoft.PowerShell.Commands.Management": "7.4.5", + "Microsoft.PowerShell.Commands.Utility": "7.4.5", + "Microsoft.PowerShell.ConsoleHost": "7.4.5", + "Microsoft.PowerShell.Security": "7.4.5", + "Microsoft.WSMan.Management": "7.4.5", + "Microsoft.Windows.Compatibility": "8.0.8", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.5", + "System.Net.Http.WinHttpHandler": "8.0.2", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "NLog": { + "type": "Direct", + "requested": "[5.3.2, )", + "resolved": "5.3.2", + "contentHash": "cQRQZuDMjSyMe9EQBnI9v55YAMMz8GAfFd6fFJ6tc/kXnG7Hze8p1I8MgvWSBG6E36wA8vSxRrlm8uSIG+SENg==" + }, + "NuGet.Commands": { + "type": "Direct", + "requested": "[6.9.1, )", + "resolved": "6.9.1", + "contentHash": "pI2X+KRQYsVcmjJUIAXT+8fvUCZgNWBQiSizKCOltRqaMjtUHLetfADfz7jfreOBohsDxNzhBnNqPQ8MU/Gjxw==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "NuGet.Credentials": "6.9.1", + "NuGet.ProjectModel": "6.9.1" + } + }, + "NuGet.Common": { + "type": "Direct", + "requested": "[6.9.1, )", + "resolved": "6.9.1", + "contentHash": "FbuWZBjQ1NJXBDqCwSddN2yvw3Plq3sTCIh0nc66Hu8jrNr+BOaxlKZv78jvJ+pSy8BvurYOdF9sl9KoORjrtg==", + "dependencies": { + "NuGet.Frameworks": "6.9.1" + } + }, + "Pastel": { + "type": "Direct", + "requested": "[5.1.0, )", + "resolved": "5.1.0", + "contentHash": "jQ0fTkHZvgQsmbr5qU0IdCP1PWuUfmEmekIsTwysWK/iIwmT9Mbm0x5GpjYSTEwHTNVEpjYhBhyKVdzESgRCpg==" + }, + "QuikGraph": { + "type": "Direct", + "requested": "[2.5.0, )", + "resolved": "2.5.0", + "contentHash": "sG+mrPpXwxlXknRK5VqWUGiOmDACa9X+3ftlkQIMgOZUqxVOQSe0+HIU9PTjwqazy0pqSf8MPDXYFGl0GYWcKw==" + }, + "QuikGraph.Graphviz": { + "type": "Direct", + "requested": "[2.5.0, )", + "resolved": "2.5.0", + "contentHash": "pCKpErtHGxUi72OT+2aIg1pdHdUqpqEM5J/i9rmVsEVDE4X0xb1HBPWdxv/FLZmbBjk0ZogZXZttUL3CnAPpNw==", + "dependencies": { + "QuikGraph": "2.5.0" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Formats.Asn1": "8.0.1", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Windows.Forms": { + "type": "Direct", + "requested": "[4.0.0, )", + "resolved": "4.0.0", + "contentHash": "WL3QPG1q88aIWO0JPOlkCeyNE+FK4ufSKY5j6J6qAFQyfCFiiOYxi8RAhev9H0CS/wmKbIK8qr8xZBod85oWKw==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.2.0", + "contentHash": "kKSyoVfndMriKHLfYGmr0uzQuI4jcc3TKGyww7buJFCYeHb/X0kodYBPL7n9454q7v6ASiRmDgpPGaDGerg/Hg==" + }, + "Json.More.Net": { + "type": "Transitive", + "resolved": "1.9.3", + "contentHash": "BKIsKHXR2Jq+LdLdxPo3L09Lv0ld9xs1fAMvSAe2cf2YOl3at9vw0RrMlhC2ookDi7VtrgHXzc2Et5mVBOAUdw==", + "dependencies": { + "System.Text.Json": "6.0.2" + } + }, + "JsonPointer.Net": { + "type": "Transitive", + "resolved": "3.0.3", + "contentHash": "mCGQc15lHLp1R2CVhWiipnZurHXm93+LbPPAT/vXQm5PdHt6WQuYLhaEF8VZ+aXL9P2I6bGND6pDTEfqFs6gig==", + "dependencies": { + "Json.More.Net": "1.8.0" + } + }, + "JsonSchema.Net": { + "type": "Transitive", + "resolved": "5.2.7", + "contentHash": "8un7Xq2MoKiWNo0HQtf2sPr3764W9NjNELIx3l9d3fIKEjg3tYtrZmxN+CgXKtzku4g52CqYUZuI+o0ue226vw==", + "dependencies": { + "JetBrains.Annotations": "2021.2.0", + "Json.More.Net": "1.9.0", + "JsonPointer.Net": "3.0.3" + } + }, + "Markdig.Signed": { + "type": "Transitive", + "resolved": "0.33.0", + "contentHash": "/BE/XANxmocgEqajbWB/ur4Jei+j1FkXppWH9JFmEuoq8T3xJndkQKZVCW/7lTdc9Ru6kfEAkwSXFOv30EkU2Q==" + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.21.0", + "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "5.0.0" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.8.0", + "contentHash": "/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "7.0.0", + "System.Reflection.Metadata": "7.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.8.0", + "contentHash": "+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.8.0]" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "wnjTFjEvvSbOs3iMfl6CeJcUgPHZMYUB9uAQbGQGxGwVRl4GydNpMSkVntTzoi7AqQeYumU9yDSNeVbpq+ebow==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Management.Infrastructure": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "cGZi0q5IujCTVYKo9h22Pw+UwfZDV82HXO8HTxMG2HqntPlT3Ls8jY6punLp4YzCypJNpfCAu2kae3TIyuAiJw==", + "dependencies": { + "Microsoft.Management.Infrastructure.Runtime.Unix": "3.0.0", + "Microsoft.Management.Infrastructure.Runtime.Win": "3.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.8", + "System.Management.Automation": "7.4.5", + "System.Text.Json": "8.0.4", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.MarkdownRender": { + "type": "Transitive", + "resolved": "7.2.1", + "contentHash": "o5oUwL23R/KnjQPD2Oi49WAG5j4O4VLo1fPRSyM/aq0HuTrY2RnF4B3MCGk13BfcmK51p9kPlHZ1+8a/ZjO4Jg==", + "dependencies": { + "Markdig.Signed": "0.31.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.Windows.Compatibility": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "9FWk4D5mNFz99rT7NvsqrDdT/6bjkNtxo7CPwajyudBTMXi7kro8ixr5pUnFYrhUBfimR+OUGDYk/se4NxJ6sA==", + "dependencies": { + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Microsoft.Win32.SystemEvents": "8.0.0", + "System.CodeDom": "8.0.0", + "System.ComponentModel.Composition": "8.0.0", + "System.ComponentModel.Composition.Registration": "8.0.0", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Data.Odbc": "8.0.0", + "System.Data.OleDb": "8.0.0", + "System.Data.SqlClient": "4.8.6", + "System.Diagnostics.EventLog": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.AccountManagement": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0", + "System.Drawing.Common": "8.0.8", + "System.IO.Packaging": "8.0.0", + "System.IO.Ports": "8.0.0", + "System.Management": "8.0.0", + "System.Reflection.Context": "8.0.0", + "System.Runtime.Caching": "8.0.0", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Cryptography.ProtectedData": "8.0.0", + "System.Security.Cryptography.Xml": "8.0.1", + "System.Security.Permissions": "8.0.0", + "System.ServiceModel.Duplex": "4.10.0", + "System.ServiceModel.Http": "4.10.0", + "System.ServiceModel.NetTcp": "4.10.0", + "System.ServiceModel.Primitives": "4.10.0", + "System.ServiceModel.Security": "4.10.0", + "System.ServiceModel.Syndication": "8.0.0", + "System.ServiceProcess.ServiceController": "8.0.0", + "System.Speech": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0", + "System.Threading.AccessControl": "8.0.0", + "System.Web.Services.Description": "4.10.0" + } + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.5", + "System.Management.Automation": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "NuGet.Configuration": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "GM06pcUzWdNsizeGciqCjAhryfI1F/rQPETLDF+8pDRgzVpA+wKAR01/4aFU+IXzugnQ9LqOb5YyCRuR1OVZiQ==", + "dependencies": { + "NuGet.Common": "6.9.1", + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "NuGet.Credentials": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "elTErAznCWoqOLILVDN4FTa3+rpVVdUbHUaOUqJkk9+Z/ZSqyDPbCIhLaqTkPkWqoKa93gqzX9IFwURkMphPnw==", + "dependencies": { + "NuGet.Protocol": "6.9.1" + } + }, + "NuGet.DependencyResolver.Core": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "gVWIEScv1K40H2Fvs6HGaOzRMpG+r1RUqYpBdh7gqQ18kgsswWUSr90jCNtBb7PUYKkMU1oAhxTslj/gQjO+Vw==", + "dependencies": { + "NuGet.Configuration": "6.9.1", + "NuGet.LibraryModel": "6.9.1", + "NuGet.Protocol": "6.9.1" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "DaKh3lenPUvzGccPkbI97BIvA27z+/UsL3ankfoZlX/4vBVDK5N1sheFTQ+GuJf+IgSzsJz/A21SPUpQLHwUtA==" + }, + "NuGet.LibraryModel": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "xlOpbZTc4862vKHkZHLJ5VgDteo+78ftVkajB8rKgSpevnBqwPKv2Y5OfUxct9HCqWYw0ikVfNf/qfjqnQCV1Q==", + "dependencies": { + "NuGet.Common": "6.9.1", + "NuGet.Versioning": "6.9.1" + } + }, + "NuGet.Packaging": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "6FyasOxKInCELJ+pGy8f17ub9st6ofFeNcBNTo7CRiPJlxyhJfKGKNpfe3HHYwvnZhc3Vdfr0kSR+f1BVGDuTA==", + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "NuGet.Configuration": "6.9.1", + "NuGet.Versioning": "6.9.1", + "System.Security.Cryptography.Pkcs": "6.0.4" + } + }, + "NuGet.ProjectModel": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "x98QkS3oloaJfdSsDFOGTH5oeoHHTDoyTO7oyg/7g60be14AQowLqgPQV52Kuscl4lknx/3259RTxyDcbkdifQ==", + "dependencies": { + "NuGet.DependencyResolver.Core": "6.9.1" + } + }, + "NuGet.Protocol": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "h3bdjqUY4jvwM02D/7QM4FR8x/bbf4Pyjrc1Etw7an2OrWKPUSx0vJPdapKzioxIw7GXl/aVUM/DCeIc3S9brA==", + "dependencies": { + "NuGet.Packaging": "6.9.1" + } + }, + "NuGet.Versioning": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "ypnSvEtpNGo48bAWn95J1oHChycCXcevFSbn53fqzLxlXFSZP7dawu8p/7mHAfGufZQSV2sBpW80XQGIfXO8kQ==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Ee7Sz5llLpTgyKIWzKI/GeuRSbFkOABgJRY00SqTY0OkTYtkB+9l5rFZfE7fxPA3c22RfytCBYkUdAkcmwMjQg==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "8.0.0", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.linux-x64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.osx-arm64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.osx-x64.runtime.native.System.IO.Ports": "8.0.0" + } + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==" + }, + "System.ComponentModel.Composition": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bGhUX5BTivJ9Wax0qnJy7uGq7dn/TQkEpJ2Fpu1etg8dbPwyDkUzNPc1d3I2/jUr9y4wDI3a1dkSmi8X21Pzbw==" + }, + "System.ComponentModel.Composition.Registration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "BVMXYqX7Z0Zdq3tc94UKJL/cOWq4LF3ufexfdPuUDrDl4ekbbfwPVzsusVbx+aq6Yx60CJnmJLyHtM3V2Q7BBQ==", + "dependencies": { + "System.ComponentModel.Composition": "8.0.0", + "System.Reflection.Context": "8.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JlYi9XVvIREURRUlGMr1F6vOFLk7YSY4p1vHo4kX3tQ0AGrjqlRWHDi66ImHhy6qwXBG3BJ6Y1QlYQ+Qz6Xgww==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0", + "System.Security.Cryptography.ProtectedData": "8.0.0" + } + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "4ZM1wvLjz9nVVExsfPAaSl/qOvU+QNedJL5rQ+2Wbow+iGeyO0e7XN07707rMBgaffEeeLrCZBwC0oHUuvRdPw==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "8.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" + }, + "System.IO.Packaging": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "8g1V4YRpdGAxFcK8v9OjuMdIOJSpF30Zb1JGicwVZhly3I994WFyBdV6mQEo8d3T+URQe55/M0U0eIH0Hts1bg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "BcUV7OERlLqGxDXZuIyIMMmk1PbqBblLRbAoigmzIUx/M8A+8epvyPyXRpbgoucKH7QmfYdQIev04Phx2Co08A==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Reflection.Context": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "k76ubeIBOeIVg7vkQ4I+LoB8sY1EzFIc3oHEtoiNLhXleb7TBLXUQu0CFZ4sPlXJzWNabRf+gn1T7lyhOBxIMA==" + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "MclTG61lsD9sYdpNz9xsKBzjsmsfCtcMZYXz/IUr2zlhaTaABonlr1ESeompTgM+Xk+IwtGYU7/voh3YWB/fWw==", + "dependencies": { + "System.Collections.Immutable": "7.0.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==" + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "hqu2ztecOf3BYg5q1R7QcyliX9L7r3mfsWtaRitAxcezH8hyZMB7zCmhi186hsUZXk1KxsAHXwyPEW+xvUED6g==", + "dependencies": { + "System.Security.Cryptography.Pkcs": "8.0.0" + } + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "v/BBylw7XevuAsHXoX9dDUUfmBIcUf7Lkz8K3ZXIKz3YRKpw8YftpSir4n4e/jDTKFoaK37AsC3xnk+GNFI1Ow==", + "dependencies": { + "System.Windows.Extensions": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Duplex": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "IZ8ZahvTenWML7/jGUXSCm6jHlxpMbcb+Hy+h5p1WP9YVtb+Er7FHRRGizqQMINEdK6HhWpD6rzr5PdxNyusdg==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "hodkn0rPTYmoZ9EIPwcleUrOi1gZBPvU0uFvzmJbyxl1lIpVM5GxTrs/pCETStjOXCiXhBDoZQYajquOEfeW/w==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.NetTcp": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "tP7GN7ehqSIQEz7yOJEtY8ziTpfavf2IQMPKa7r9KGQ75+uEW6/wSlWez7oKQwGYuAHbcGhpJvdG6WoVMKYgkw==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "aNcdry95wIP1J+/HcLQM/f/AA73LnBQDNc2uCoZ+c1//KpVRp8nMZv5ApMwK+eDNVdCK8G0NLInF+xG3mfQL+g==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3" + } + }, + "System.ServiceModel.Security": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "vqelKb7DvP2inb6LDJ5Igi8wpOYdtLXn5luDW5qEaqkV2sYO1pKlVYBpr6g6m5SevzbdZlVNu67dQiD/H6EdGQ==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Syndication": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CJxIUwpBkMCPmIx46tFVOt0zpRrYurUHLW6tJBcmyj+MyWpKc6MMcS69B7IdlV/bgtgys073wMIHZX9QOQ1OFA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.4", + "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Web.Services.Description": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "ORCkTkUo9f1o4ACG+H6SV+0XSxVZ461w3cHzYxEU41y6aKWp1CeNTMYbtdxMw1we6c6t4Hqq15PdcLVcdqno/g==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } + }, + "net9.0-windows7.0/win-x64": { + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.8", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", + "Microsoft.PowerShell.Commands.Management": "7.4.5", + "Microsoft.PowerShell.Commands.Utility": "7.4.5", + "Microsoft.PowerShell.ConsoleHost": "7.4.5", + "Microsoft.PowerShell.Security": "7.4.5", + "Microsoft.WSMan.Management": "7.4.5", + "Microsoft.Windows.Compatibility": "8.0.8", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.5", + "System.Net.Http.WinHttpHandler": "8.0.2", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Formats.Asn1": "8.0.1", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.8", + "System.Management.Automation": "7.4.5", + "System.Text.Json": "8.0.4", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.5", + "System.Management.Automation": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } + } + } } \ No newline at end of file diff --git a/tests/Compiler/Compiler.Test.csproj b/tests/Compiler/Compiler.Test.csproj index 54d5f514..25645a98 100644 --- a/tests/Compiler/Compiler.Test.csproj +++ b/tests/Compiler/Compiler.Test.csproj @@ -1,7 +1,7 @@ - net8.0-windows + net9.0-windows enable enable false diff --git a/tests/Compiler/packages.lock.json b/tests/Compiler/packages.lock.json index 479d7783..d0d95f11 100644 --- a/tests/Compiler/packages.lock.json +++ b/tests/Compiler/packages.lock.json @@ -1,1311 +1,1311 @@ -{ - "version": 1, - "dependencies": { - "net8.0-windows7.0": { - "coverlet.collector": { - "type": "Direct", - "requested": "[6.0.0, )", - "resolved": "6.0.0", - "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" - }, - "coverlet.msbuild": { - "type": "Direct", - "requested": "[6.0.2, )", - "resolved": "6.0.2", - "contentHash": "8b4jBNH7mcQy1otyQErjjIUuGD74XxKZ1wvDufbY7jhWwckl7wIa+icjwdPYeI0aYMS4Tp63LIZvyMFjWwOMDw==" - }, - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.8.0, )", - "resolved": "17.8.0", - "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", - "dependencies": { - "Microsoft.CodeCoverage": "17.8.0", - "Microsoft.TestPlatform.TestHost": "17.8.0" - } - }, - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.5, )", - "resolved": "7.4.5", - "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.8", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", - "Microsoft.PowerShell.Commands.Management": "7.4.5", - "Microsoft.PowerShell.Commands.Utility": "7.4.5", - "Microsoft.PowerShell.ConsoleHost": "7.4.5", - "Microsoft.PowerShell.Security": "7.4.5", - "Microsoft.WSMan.Management": "7.4.5", - "Microsoft.Windows.Compatibility": "8.0.8", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.5", - "System.Net.Http.WinHttpHandler": "8.0.2", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "Moq": { - "type": "Direct", - "requested": "[4.20.70, )", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", - "dependencies": { - "Castle.Core": "5.1.1" - } - }, - "NUnit": { - "type": "Direct", - "requested": "[4.1.0, )", - "resolved": "4.1.0", - "contentHash": "MT/DpAhjtiytzhTgTqIhBuWx4y26PKfDepYUHUM+5uv4TsryHC2jwFo5e6NhWkApCm/G6kZ80dRjdJFuAxq3rg==" - }, - "NUnit.Analyzers": { - "type": "Direct", - "requested": "[4.2.0, )", - "resolved": "4.2.0", - "contentHash": "4fJojPkzdoa4nB2+p6U+fITvPnVvwWSnsmiJ/Dl30xqiL3oxNbYvfeSLVd91hOmEjoUqSwN3Z7j1aFedjqWbUA==" - }, - "NUnit3TestAdapter": { - "type": "Direct", - "requested": "[4.5.0, )", - "resolved": "4.5.0", - "contentHash": "s8JpqTe9bI2f49Pfr3dFRfoVSuFQyraTj68c3XXjIS/MRGvvkLnrg6RLqnTjdShX+AdFUCCU/4Xex58AdUfs6A==" - }, - "System.Management.Automation": { - "type": "Direct", - "requested": "[7.4.5, )", - "resolved": "7.4.5", - "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Formats.Asn1": "8.0.1", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "Castle.Core": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", - "dependencies": { - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "CommandLineParser": { - "type": "Transitive", - "resolved": "2.9.1", - "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" - }, - "Extended.Collections": { - "type": "Transitive", - "resolved": "1.1.1", - "contentHash": "PvLjUHQeX6MwjF34eQhU6EE1fCRC5zYcX/u10n+ZUkzgv+hRtZSHj1JzAg7AQ5a6iEcLZ2yCb5VBDzdupErDNQ==" - }, - "JetBrains.Annotations": { - "type": "Transitive", - "resolved": "2021.2.0", - "contentHash": "kKSyoVfndMriKHLfYGmr0uzQuI4jcc3TKGyww7buJFCYeHb/X0kodYBPL7n9454q7v6ASiRmDgpPGaDGerg/Hg==" - }, - "Json.More.Net": { - "type": "Transitive", - "resolved": "1.9.3", - "contentHash": "BKIsKHXR2Jq+LdLdxPo3L09Lv0ld9xs1fAMvSAe2cf2YOl3at9vw0RrMlhC2ookDi7VtrgHXzc2Et5mVBOAUdw==", - "dependencies": { - "System.Text.Json": "6.0.2" - } - }, - "JsonPointer.Net": { - "type": "Transitive", - "resolved": "3.0.3", - "contentHash": "mCGQc15lHLp1R2CVhWiipnZurHXm93+LbPPAT/vXQm5PdHt6WQuYLhaEF8VZ+aXL9P2I6bGND6pDTEfqFs6gig==", - "dependencies": { - "Json.More.Net": "1.8.0" - } - }, - "JsonSchema.Net": { - "type": "Transitive", - "resolved": "5.2.7", - "contentHash": "8un7Xq2MoKiWNo0HQtf2sPr3764W9NjNELIx3l9d3fIKEjg3tYtrZmxN+CgXKtzku4g52CqYUZuI+o0ue226vw==", - "dependencies": { - "JetBrains.Annotations": "2021.2.0", - "Json.More.Net": "1.9.0", - "JsonPointer.Net": "3.0.3" - } - }, - "LanguageExt.Core": { - "type": "Transitive", - "resolved": "5.0.0-beta-07", - "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" - }, - "Markdig.Signed": { - "type": "Transitive", - "resolved": "0.33.0", - "contentHash": "/BE/XANxmocgEqajbWB/ur4Jei+j1FkXppWH9JFmEuoq8T3xJndkQKZVCW/7lTdc9Ru6kfEAkwSXFOv30EkU2Q==" - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Transitive", - "resolved": "4.8.0", - "contentHash": "/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "7.0.0", - "System.Reflection.Metadata": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.8.0", - "contentHash": "+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.8.0]" - } - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" - }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "8.0.8", - "contentHash": "wnjTFjEvvSbOs3iMfl6CeJcUgPHZMYUB9uAQbGQGxGwVRl4GydNpMSkVntTzoi7AqQeYumU9yDSNeVbpq+ebow==" - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.Management.Infrastructure": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "cGZi0q5IujCTVYKo9h22Pw+UwfZDV82HXO8HTxMG2HqntPlT3Ls8jY6punLp4YzCypJNpfCAu2kae3TIyuAiJw==", - "dependencies": { - "Microsoft.Management.Infrastructure.Runtime.Unix": "3.0.0", - "Microsoft.Management.Infrastructure.Runtime.Win": "3.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.5", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.8", - "System.Management.Automation": "7.4.5", - "System.Text.Json": "8.0.4", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.MarkdownRender": { - "type": "Transitive", - "resolved": "7.2.1", - "contentHash": "o5oUwL23R/KnjQPD2Oi49WAG5j4O4VLo1fPRSyM/aq0HuTrY2RnF4B3MCGk13BfcmK51p9kPlHZ1+8a/ZjO4Jg==", - "dependencies": { - "Markdig.Signed": "0.31.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", - "dependencies": { - "NuGet.Frameworks": "6.5.0", - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.8.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", - "dependencies": { - "System.Security.AccessControl": "4.7.0", - "System.Security.Principal.Windows": "4.7.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.Windows.Compatibility": { - "type": "Transitive", - "resolved": "8.0.8", - "contentHash": "9FWk4D5mNFz99rT7NvsqrDdT/6bjkNtxo7CPwajyudBTMXi7kro8ixr5pUnFYrhUBfimR+OUGDYk/se4NxJ6sA==", - "dependencies": { - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Microsoft.Win32.SystemEvents": "8.0.0", - "System.CodeDom": "8.0.0", - "System.ComponentModel.Composition": "8.0.0", - "System.ComponentModel.Composition.Registration": "8.0.0", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Data.Odbc": "8.0.0", - "System.Data.OleDb": "8.0.0", - "System.Data.SqlClient": "4.8.6", - "System.Diagnostics.EventLog": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.AccountManagement": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0", - "System.Drawing.Common": "8.0.8", - "System.IO.Packaging": "8.0.0", - "System.IO.Ports": "8.0.0", - "System.Management": "8.0.0", - "System.Reflection.Context": "8.0.0", - "System.Runtime.Caching": "8.0.0", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Cryptography.ProtectedData": "8.0.0", - "System.Security.Cryptography.Xml": "8.0.1", - "System.Security.Permissions": "8.0.0", - "System.ServiceModel.Duplex": "4.10.0", - "System.ServiceModel.Http": "4.10.0", - "System.ServiceModel.NetTcp": "4.10.0", - "System.ServiceModel.Primitives": "4.10.0", - "System.ServiceModel.Security": "4.10.0", - "System.ServiceModel.Syndication": "8.0.0", - "System.ServiceProcess.ServiceController": "8.0.0", - "System.Speech": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0", - "System.Threading.AccessControl": "8.0.0", - "System.Web.Services.Description": "4.10.0" - } - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.5", - "System.Management.Automation": "7.4.5", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "NLog": { - "type": "Transitive", - "resolved": "5.3.2", - "contentHash": "cQRQZuDMjSyMe9EQBnI9v55YAMMz8GAfFd6fFJ6tc/kXnG7Hze8p1I8MgvWSBG6E36wA8vSxRrlm8uSIG+SENg==" - }, - "NuGet.Commands": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "pI2X+KRQYsVcmjJUIAXT+8fvUCZgNWBQiSizKCOltRqaMjtUHLetfADfz7jfreOBohsDxNzhBnNqPQ8MU/Gjxw==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", - "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", - "NuGet.Credentials": "6.9.1", - "NuGet.ProjectModel": "6.9.1" - } - }, - "NuGet.Common": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "FbuWZBjQ1NJXBDqCwSddN2yvw3Plq3sTCIh0nc66Hu8jrNr+BOaxlKZv78jvJ+pSy8BvurYOdF9sl9KoORjrtg==", - "dependencies": { - "NuGet.Frameworks": "6.9.1" - } - }, - "NuGet.Configuration": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "GM06pcUzWdNsizeGciqCjAhryfI1F/rQPETLDF+8pDRgzVpA+wKAR01/4aFU+IXzugnQ9LqOb5YyCRuR1OVZiQ==", - "dependencies": { - "NuGet.Common": "6.9.1", - "System.Security.Cryptography.ProtectedData": "4.4.0" - } - }, - "NuGet.Credentials": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "elTErAznCWoqOLILVDN4FTa3+rpVVdUbHUaOUqJkk9+Z/ZSqyDPbCIhLaqTkPkWqoKa93gqzX9IFwURkMphPnw==", - "dependencies": { - "NuGet.Protocol": "6.9.1" - } - }, - "NuGet.DependencyResolver.Core": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "gVWIEScv1K40H2Fvs6HGaOzRMpG+r1RUqYpBdh7gqQ18kgsswWUSr90jCNtBb7PUYKkMU1oAhxTslj/gQjO+Vw==", - "dependencies": { - "NuGet.Configuration": "6.9.1", - "NuGet.LibraryModel": "6.9.1", - "NuGet.Protocol": "6.9.1" - } - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "DaKh3lenPUvzGccPkbI97BIvA27z+/UsL3ankfoZlX/4vBVDK5N1sheFTQ+GuJf+IgSzsJz/A21SPUpQLHwUtA==" - }, - "NuGet.LibraryModel": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "xlOpbZTc4862vKHkZHLJ5VgDteo+78ftVkajB8rKgSpevnBqwPKv2Y5OfUxct9HCqWYw0ikVfNf/qfjqnQCV1Q==", - "dependencies": { - "NuGet.Common": "6.9.1", - "NuGet.Versioning": "6.9.1" - } - }, - "NuGet.Packaging": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "6FyasOxKInCELJ+pGy8f17ub9st6ofFeNcBNTo7CRiPJlxyhJfKGKNpfe3HHYwvnZhc3Vdfr0kSR+f1BVGDuTA==", - "dependencies": { - "Newtonsoft.Json": "13.0.3", - "NuGet.Configuration": "6.9.1", - "NuGet.Versioning": "6.9.1", - "System.Security.Cryptography.Pkcs": "6.0.4" - } - }, - "NuGet.ProjectModel": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "x98QkS3oloaJfdSsDFOGTH5oeoHHTDoyTO7oyg/7g60be14AQowLqgPQV52Kuscl4lknx/3259RTxyDcbkdifQ==", - "dependencies": { - "NuGet.DependencyResolver.Core": "6.9.1" - } - }, - "NuGet.Protocol": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "h3bdjqUY4jvwM02D/7QM4FR8x/bbf4Pyjrc1Etw7an2OrWKPUSx0vJPdapKzioxIw7GXl/aVUM/DCeIc3S9brA==", - "dependencies": { - "NuGet.Packaging": "6.9.1" - } - }, - "NuGet.Versioning": { - "type": "Transitive", - "resolved": "6.9.1", - "contentHash": "ypnSvEtpNGo48bAWn95J1oHChycCXcevFSbn53fqzLxlXFSZP7dawu8p/7mHAfGufZQSV2sBpW80XQGIfXO8kQ==" - }, - "Pastel": { - "type": "Transitive", - "resolved": "5.1.0", - "contentHash": "jQ0fTkHZvgQsmbr5qU0IdCP1PWuUfmEmekIsTwysWK/iIwmT9Mbm0x5GpjYSTEwHTNVEpjYhBhyKVdzESgRCpg==" - }, - "QuikGraph": { - "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "sG+mrPpXwxlXknRK5VqWUGiOmDACa9X+3ftlkQIMgOZUqxVOQSe0+HIU9PTjwqazy0pqSf8MPDXYFGl0GYWcKw==" - }, - "QuikGraph.Graphviz": { - "type": "Transitive", - "resolved": "2.5.0", - "contentHash": "pCKpErtHGxUi72OT+2aIg1pdHdUqpqEM5J/i9rmVsEVDE4X0xb1HBPWdxv/FLZmbBjk0ZogZXZttUL3CnAPpNw==", - "dependencies": { - "QuikGraph": "2.5.0" - } - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", - "dependencies": { - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" - } - }, - "runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Ee7Sz5llLpTgyKIWzKI/GeuRSbFkOABgJRY00SqTY0OkTYtkB+9l5rFZfE7fxPA3c22RfytCBYkUdAkcmwMjQg==", - "dependencies": { - "runtime.linux-arm.runtime.native.System.IO.Ports": "8.0.0", - "runtime.linux-arm64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.linux-x64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.osx-arm64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.osx-x64.runtime.native.System.IO.Ports": "8.0.0" - } - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==" - }, - "System.ComponentModel.Composition": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bGhUX5BTivJ9Wax0qnJy7uGq7dn/TQkEpJ2Fpu1etg8dbPwyDkUzNPc1d3I2/jUr9y4wDI3a1dkSmi8X21Pzbw==" - }, - "System.ComponentModel.Composition.Registration": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "BVMXYqX7Z0Zdq3tc94UKJL/cOWq4LF3ufexfdPuUDrDl4ekbbfwPVzsusVbx+aq6Yx60CJnmJLyHtM3V2Q7BBQ==", - "dependencies": { - "System.ComponentModel.Composition": "8.0.0", - "System.Reflection.Context": "8.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JlYi9XVvIREURRUlGMr1F6vOFLk7YSY4p1vHo4kX3tQ0AGrjqlRWHDi66ImHhy6qwXBG3BJ6Y1QlYQ+Qz6Xgww==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0", - "System.Security.Cryptography.ProtectedData": "8.0.0" - } - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.Drawing.Common": { - "type": "Transitive", - "resolved": "8.0.8", - "contentHash": "4ZM1wvLjz9nVVExsfPAaSl/qOvU+QNedJL5rQ+2Wbow+iGeyO0e7XN07707rMBgaffEeeLrCZBwC0oHUuvRdPw==", - "dependencies": { - "Microsoft.Win32.SystemEvents": "8.0.0" - } - }, - "System.Formats.Asn1": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" - }, - "System.IO.Packaging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "8g1V4YRpdGAxFcK8v9OjuMdIOJSpF30Zb1JGicwVZhly3I994WFyBdV6mQEo8d3T+URQe55/M0U0eIH0Hts1bg==" - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Private.ServiceModel": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "BcUV7OERlLqGxDXZuIyIMMmk1PbqBblLRbAoigmzIUx/M8A+8epvyPyXRpbgoucKH7QmfYdQIev04Phx2Co08A==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "5.0.0", - "Microsoft.Extensions.ObjectPool": "5.0.10", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.DispatchProxy": "4.7.1", - "System.Security.Cryptography.Xml": "6.0.1", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Reflection.Context": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "k76ubeIBOeIVg7vkQ4I+LoB8sY1EzFIc3oHEtoiNLhXleb7TBLXUQu0CFZ4sPlXJzWNabRf+gn1T7lyhOBxIMA==" - }, - "System.Reflection.DispatchProxy": { - "type": "Transitive", - "resolved": "4.7.1", - "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "MclTG61lsD9sYdpNz9xsKBzjsmsfCtcMZYXz/IUr2zlhaTaABonlr1ESeompTgM+Xk+IwtGYU7/voh3YWB/fWw==", - "dependencies": { - "System.Collections.Immutable": "7.0.0" - } - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==" - }, - "System.Security.Cryptography.Xml": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "hqu2ztecOf3BYg5q1R7QcyliX9L7r3mfsWtaRitAxcezH8hyZMB7zCmhi186hsUZXk1KxsAHXwyPEW+xvUED6g==", - "dependencies": { - "System.Security.Cryptography.Pkcs": "8.0.0" - } - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "v/BBylw7XevuAsHXoX9dDUUfmBIcUf7Lkz8K3ZXIKz3YRKpw8YftpSir4n4e/jDTKFoaK37AsC3xnk+GNFI1Ow==", - "dependencies": { - "System.Windows.Extensions": "8.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceModel.Duplex": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "IZ8ZahvTenWML7/jGUXSCm6jHlxpMbcb+Hy+h5p1WP9YVtb+Er7FHRRGizqQMINEdK6HhWpD6rzr5PdxNyusdg==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Http": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "hodkn0rPTYmoZ9EIPwcleUrOi1gZBPvU0uFvzmJbyxl1lIpVM5GxTrs/pCETStjOXCiXhBDoZQYajquOEfeW/w==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.NetTcp": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "tP7GN7ehqSIQEz7yOJEtY8ziTpfavf2IQMPKa7r9KGQ75+uEW6/wSlWez7oKQwGYuAHbcGhpJvdG6WoVMKYgkw==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Primitives": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "aNcdry95wIP1J+/HcLQM/f/AA73LnBQDNc2uCoZ+c1//KpVRp8nMZv5ApMwK+eDNVdCK8G0NLInF+xG3mfQL+g==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3" - } - }, - "System.ServiceModel.Security": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "vqelKb7DvP2inb6LDJ5Igi8wpOYdtLXn5luDW5qEaqkV2sYO1pKlVYBpr6g6m5SevzbdZlVNu67dQiD/H6EdGQ==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Syndication": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CJxIUwpBkMCPmIx46tFVOt0zpRrYurUHLW6tJBcmyj+MyWpKc6MMcS69B7IdlV/bgtgys073wMIHZX9QOQ1OFA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "8.0.4", - "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", - "dependencies": { - "System.Text.Encodings.Web": "8.0.0" - } - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Web.Services.Description": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "ORCkTkUo9f1o4ACG+H6SV+0XSxVZ461w3cHzYxEU41y6aKWp1CeNTMYbtdxMw1we6c6t4Hqq15PdcLVcdqno/g==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - }, - "System.Windows.Forms": { - "type": "Transitive", - "resolved": "4.0.0", - "contentHash": "WL3QPG1q88aIWO0JPOlkCeyNE+FK4ufSKY5j6J6qAFQyfCFiiOYxi8RAhev9H0CS/wmKbIK8qr8xZBod85oWKw==" - }, - "compiler": { - "type": "Project", - "dependencies": { - "CommandLineParser": "[2.9.1, )", - "Extended.Collections": "[1.1.1, )", - "LanguageExt.Core": "[5.0.0-beta-07, )", - "NLog": "[5.3.2, )", - "NuGet.Commands": "[6.9.1, )", - "NuGet.Common": "[6.9.1, )", - "Pastel": "[5.1.0, )", - "QuikGraph": "[2.5.0, )", - "QuikGraph.Graphviz": "[2.5.0, )", - "System.Management.Automation": "[7.4.5, )", - "System.Windows.Forms": "[4.0.0, )" - } - } - }, - "net8.0-windows7.0/win-x64": { - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.5, )", - "resolved": "7.4.5", - "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.ObjectPool": "8.0.8", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", - "Microsoft.PowerShell.Commands.Management": "7.4.5", - "Microsoft.PowerShell.Commands.Utility": "7.4.5", - "Microsoft.PowerShell.ConsoleHost": "7.4.5", - "Microsoft.PowerShell.Security": "7.4.5", - "Microsoft.WSMan.Management": "7.4.5", - "Microsoft.Windows.Compatibility": "8.0.8", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.5", - "System.Net.Http.WinHttpHandler": "8.0.2", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "System.Management.Automation": { - "type": "Direct", - "requested": "[7.4.5, )", - "resolved": "7.4.5", - "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.1", - "System.DirectoryServices": "8.0.0", - "System.Formats.Asn1": "8.0.1", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.1", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.5", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.8", - "System.Management.Automation": "7.4.5", - "System.Text.Json": "8.0.4", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", - "dependencies": { - "System.Management.Automation": "7.4.5" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", - "dependencies": { - "System.Security.AccessControl": "4.7.0", - "System.Security.Principal.Windows": "4.7.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.5", - "System.Management.Automation": "7.4.5", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.5", - "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - } - } - } +{ + "version": 1, + "dependencies": { + "net9.0-windows7.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "tW3lsNS+dAEII6YGUX/VMoJjBS1QvsxqJeqLaJXub08y1FSjasFPtQ4UBUsudE9PNrzLjooClMsPtY2cZLdXpQ==" + }, + "coverlet.msbuild": { + "type": "Direct", + "requested": "[6.0.2, )", + "resolved": "6.0.2", + "contentHash": "8b4jBNH7mcQy1otyQErjjIUuGD74XxKZ1wvDufbY7jhWwckl7wIa+icjwdPYeI0aYMS4Tp63LIZvyMFjWwOMDw==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.8.0, )", + "resolved": "17.8.0", + "contentHash": "BmTYGbD/YuDHmApIENdoyN1jCk0Rj1fJB0+B/fVekyTdVidr91IlzhqzytiUgaEAzL1ZJcYCme0MeBMYvJVzvw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.8.0", + "Microsoft.TestPlatform.TestHost": "17.8.0" + } + }, + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.8", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", + "Microsoft.PowerShell.Commands.Management": "7.4.5", + "Microsoft.PowerShell.Commands.Utility": "7.4.5", + "Microsoft.PowerShell.ConsoleHost": "7.4.5", + "Microsoft.PowerShell.Security": "7.4.5", + "Microsoft.WSMan.Management": "7.4.5", + "Microsoft.Windows.Compatibility": "8.0.8", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.5", + "System.Net.Http.WinHttpHandler": "8.0.2", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "NUnit": { + "type": "Direct", + "requested": "[4.1.0, )", + "resolved": "4.1.0", + "contentHash": "MT/DpAhjtiytzhTgTqIhBuWx4y26PKfDepYUHUM+5uv4TsryHC2jwFo5e6NhWkApCm/G6kZ80dRjdJFuAxq3rg==" + }, + "NUnit.Analyzers": { + "type": "Direct", + "requested": "[4.2.0, )", + "resolved": "4.2.0", + "contentHash": "4fJojPkzdoa4nB2+p6U+fITvPnVvwWSnsmiJ/Dl30xqiL3oxNbYvfeSLVd91hOmEjoUqSwN3Z7j1aFedjqWbUA==" + }, + "NUnit3TestAdapter": { + "type": "Direct", + "requested": "[4.5.0, )", + "resolved": "4.5.0", + "contentHash": "s8JpqTe9bI2f49Pfr3dFRfoVSuFQyraTj68c3XXjIS/MRGvvkLnrg6RLqnTjdShX+AdFUCCU/4Xex58AdUfs6A==" + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Formats.Asn1": "8.0.1", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "CommandLineParser": { + "type": "Transitive", + "resolved": "2.9.1", + "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==" + }, + "Extended.Collections": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "PvLjUHQeX6MwjF34eQhU6EE1fCRC5zYcX/u10n+ZUkzgv+hRtZSHj1JzAg7AQ5a6iEcLZ2yCb5VBDzdupErDNQ==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.2.0", + "contentHash": "kKSyoVfndMriKHLfYGmr0uzQuI4jcc3TKGyww7buJFCYeHb/X0kodYBPL7n9454q7v6ASiRmDgpPGaDGerg/Hg==" + }, + "Json.More.Net": { + "type": "Transitive", + "resolved": "1.9.3", + "contentHash": "BKIsKHXR2Jq+LdLdxPo3L09Lv0ld9xs1fAMvSAe2cf2YOl3at9vw0RrMlhC2ookDi7VtrgHXzc2Et5mVBOAUdw==", + "dependencies": { + "System.Text.Json": "6.0.2" + } + }, + "JsonPointer.Net": { + "type": "Transitive", + "resolved": "3.0.3", + "contentHash": "mCGQc15lHLp1R2CVhWiipnZurHXm93+LbPPAT/vXQm5PdHt6WQuYLhaEF8VZ+aXL9P2I6bGND6pDTEfqFs6gig==", + "dependencies": { + "Json.More.Net": "1.8.0" + } + }, + "JsonSchema.Net": { + "type": "Transitive", + "resolved": "5.2.7", + "contentHash": "8un7Xq2MoKiWNo0HQtf2sPr3764W9NjNELIx3l9d3fIKEjg3tYtrZmxN+CgXKtzku4g52CqYUZuI+o0ue226vw==", + "dependencies": { + "JetBrains.Annotations": "2021.2.0", + "Json.More.Net": "1.9.0", + "JsonPointer.Net": "3.0.3" + } + }, + "LanguageExt.Core": { + "type": "Transitive", + "resolved": "5.0.0-beta-07", + "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" + }, + "Markdig.Signed": { + "type": "Transitive", + "resolved": "0.33.0", + "contentHash": "/BE/XANxmocgEqajbWB/ur4Jei+j1FkXppWH9JFmEuoq8T3xJndkQKZVCW/7lTdc9Ru6kfEAkwSXFOv30EkU2Q==" + }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.21.0", + "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "5.0.0" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" + }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.4", + "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.8.0", + "contentHash": "/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.4", + "System.Collections.Immutable": "7.0.0", + "System.Reflection.Metadata": "7.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.8.0", + "contentHash": "+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.8.0]" + } + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "KC8SXWbGIdoFVdlxKk9WHccm0llm9HypcHMLUUFabRiTS3SO2fQXNZfdiF3qkEdTJhbRrxhdRxjL4jbtwPq4Ew==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.ObjectPool": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "wnjTFjEvvSbOs3iMfl6CeJcUgPHZMYUB9uAQbGQGxGwVRl4GydNpMSkVntTzoi7AqQeYumU9yDSNeVbpq+ebow==" + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Management.Infrastructure": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "cGZi0q5IujCTVYKo9h22Pw+UwfZDV82HXO8HTxMG2HqntPlT3Ls8jY6punLp4YzCypJNpfCAu2kae3TIyuAiJw==", + "dependencies": { + "Microsoft.Management.Infrastructure.Runtime.Unix": "3.0.0", + "Microsoft.Management.Infrastructure.Runtime.Win": "3.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.8", + "System.Management.Automation": "7.4.5", + "System.Text.Json": "8.0.4", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.MarkdownRender": { + "type": "Transitive", + "resolved": "7.2.1", + "contentHash": "o5oUwL23R/KnjQPD2Oi49WAG5j4O4VLo1fPRSyM/aq0HuTrY2RnF4B3MCGk13BfcmK51p9kPlHZ1+8a/ZjO4Jg==", + "dependencies": { + "Markdig.Signed": "0.31.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", + "dependencies": { + "NuGet.Frameworks": "6.5.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.8.0", + "contentHash": "9ivcl/7SGRmOT0YYrHQGohWiT5YCpkmy/UEzldfVisLm6QxbLaK3FAJqZXI34rnRLmqqDCeMQxKINwmKwAPiDw==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.8.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.Windows.Compatibility": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "9FWk4D5mNFz99rT7NvsqrDdT/6bjkNtxo7CPwajyudBTMXi7kro8ixr5pUnFYrhUBfimR+OUGDYk/se4NxJ6sA==", + "dependencies": { + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Microsoft.Win32.SystemEvents": "8.0.0", + "System.CodeDom": "8.0.0", + "System.ComponentModel.Composition": "8.0.0", + "System.ComponentModel.Composition.Registration": "8.0.0", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Data.Odbc": "8.0.0", + "System.Data.OleDb": "8.0.0", + "System.Data.SqlClient": "4.8.6", + "System.Diagnostics.EventLog": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.AccountManagement": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0", + "System.Drawing.Common": "8.0.8", + "System.IO.Packaging": "8.0.0", + "System.IO.Ports": "8.0.0", + "System.Management": "8.0.0", + "System.Reflection.Context": "8.0.0", + "System.Runtime.Caching": "8.0.0", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Cryptography.ProtectedData": "8.0.0", + "System.Security.Cryptography.Xml": "8.0.1", + "System.Security.Permissions": "8.0.0", + "System.ServiceModel.Duplex": "4.10.0", + "System.ServiceModel.Http": "4.10.0", + "System.ServiceModel.NetTcp": "4.10.0", + "System.ServiceModel.Primitives": "4.10.0", + "System.ServiceModel.Security": "4.10.0", + "System.ServiceModel.Syndication": "8.0.0", + "System.ServiceProcess.ServiceController": "8.0.0", + "System.Speech": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0", + "System.Threading.AccessControl": "8.0.0", + "System.Web.Services.Description": "4.10.0" + } + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.5", + "System.Management.Automation": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" + }, + "NLog": { + "type": "Transitive", + "resolved": "5.3.2", + "contentHash": "cQRQZuDMjSyMe9EQBnI9v55YAMMz8GAfFd6fFJ6tc/kXnG7Hze8p1I8MgvWSBG6E36wA8vSxRrlm8uSIG+SENg==" + }, + "NuGet.Commands": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "pI2X+KRQYsVcmjJUIAXT+8fvUCZgNWBQiSizKCOltRqaMjtUHLetfADfz7jfreOBohsDxNzhBnNqPQ8MU/Gjxw==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "NuGet.Credentials": "6.9.1", + "NuGet.ProjectModel": "6.9.1" + } + }, + "NuGet.Common": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "FbuWZBjQ1NJXBDqCwSddN2yvw3Plq3sTCIh0nc66Hu8jrNr+BOaxlKZv78jvJ+pSy8BvurYOdF9sl9KoORjrtg==", + "dependencies": { + "NuGet.Frameworks": "6.9.1" + } + }, + "NuGet.Configuration": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "GM06pcUzWdNsizeGciqCjAhryfI1F/rQPETLDF+8pDRgzVpA+wKAR01/4aFU+IXzugnQ9LqOb5YyCRuR1OVZiQ==", + "dependencies": { + "NuGet.Common": "6.9.1", + "System.Security.Cryptography.ProtectedData": "4.4.0" + } + }, + "NuGet.Credentials": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "elTErAznCWoqOLILVDN4FTa3+rpVVdUbHUaOUqJkk9+Z/ZSqyDPbCIhLaqTkPkWqoKa93gqzX9IFwURkMphPnw==", + "dependencies": { + "NuGet.Protocol": "6.9.1" + } + }, + "NuGet.DependencyResolver.Core": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "gVWIEScv1K40H2Fvs6HGaOzRMpG+r1RUqYpBdh7gqQ18kgsswWUSr90jCNtBb7PUYKkMU1oAhxTslj/gQjO+Vw==", + "dependencies": { + "NuGet.Configuration": "6.9.1", + "NuGet.LibraryModel": "6.9.1", + "NuGet.Protocol": "6.9.1" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "DaKh3lenPUvzGccPkbI97BIvA27z+/UsL3ankfoZlX/4vBVDK5N1sheFTQ+GuJf+IgSzsJz/A21SPUpQLHwUtA==" + }, + "NuGet.LibraryModel": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "xlOpbZTc4862vKHkZHLJ5VgDteo+78ftVkajB8rKgSpevnBqwPKv2Y5OfUxct9HCqWYw0ikVfNf/qfjqnQCV1Q==", + "dependencies": { + "NuGet.Common": "6.9.1", + "NuGet.Versioning": "6.9.1" + } + }, + "NuGet.Packaging": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "6FyasOxKInCELJ+pGy8f17ub9st6ofFeNcBNTo7CRiPJlxyhJfKGKNpfe3HHYwvnZhc3Vdfr0kSR+f1BVGDuTA==", + "dependencies": { + "Newtonsoft.Json": "13.0.3", + "NuGet.Configuration": "6.9.1", + "NuGet.Versioning": "6.9.1", + "System.Security.Cryptography.Pkcs": "6.0.4" + } + }, + "NuGet.ProjectModel": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "x98QkS3oloaJfdSsDFOGTH5oeoHHTDoyTO7oyg/7g60be14AQowLqgPQV52Kuscl4lknx/3259RTxyDcbkdifQ==", + "dependencies": { + "NuGet.DependencyResolver.Core": "6.9.1" + } + }, + "NuGet.Protocol": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "h3bdjqUY4jvwM02D/7QM4FR8x/bbf4Pyjrc1Etw7an2OrWKPUSx0vJPdapKzioxIw7GXl/aVUM/DCeIc3S9brA==", + "dependencies": { + "NuGet.Packaging": "6.9.1" + } + }, + "NuGet.Versioning": { + "type": "Transitive", + "resolved": "6.9.1", + "contentHash": "ypnSvEtpNGo48bAWn95J1oHChycCXcevFSbn53fqzLxlXFSZP7dawu8p/7mHAfGufZQSV2sBpW80XQGIfXO8kQ==" + }, + "Pastel": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "jQ0fTkHZvgQsmbr5qU0IdCP1PWuUfmEmekIsTwysWK/iIwmT9Mbm0x5GpjYSTEwHTNVEpjYhBhyKVdzESgRCpg==" + }, + "QuikGraph": { + "type": "Transitive", + "resolved": "2.5.0", + "contentHash": "sG+mrPpXwxlXknRK5VqWUGiOmDACa9X+3ftlkQIMgOZUqxVOQSe0+HIU9PTjwqazy0pqSf8MPDXYFGl0GYWcKw==" + }, + "QuikGraph.Graphviz": { + "type": "Transitive", + "resolved": "2.5.0", + "contentHash": "pCKpErtHGxUi72OT+2aIg1pdHdUqpqEM5J/i9rmVsEVDE4X0xb1HBPWdxv/FLZmbBjk0ZogZXZttUL3CnAPpNw==", + "dependencies": { + "QuikGraph": "2.5.0" + } + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", + "dependencies": { + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" + } + }, + "runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Ee7Sz5llLpTgyKIWzKI/GeuRSbFkOABgJRY00SqTY0OkTYtkB+9l5rFZfE7fxPA3c22RfytCBYkUdAkcmwMjQg==", + "dependencies": { + "runtime.linux-arm.runtime.native.System.IO.Ports": "8.0.0", + "runtime.linux-arm64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.linux-x64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.osx-arm64.runtime.native.System.IO.Ports": "8.0.0", + "runtime.osx-x64.runtime.native.System.IO.Ports": "8.0.0" + } + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==" + }, + "System.ComponentModel.Composition": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "bGhUX5BTivJ9Wax0qnJy7uGq7dn/TQkEpJ2Fpu1etg8dbPwyDkUzNPc1d3I2/jUr9y4wDI3a1dkSmi8X21Pzbw==" + }, + "System.ComponentModel.Composition.Registration": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "BVMXYqX7Z0Zdq3tc94UKJL/cOWq4LF3ufexfdPuUDrDl4ekbbfwPVzsusVbx+aq6Yx60CJnmJLyHtM3V2Q7BBQ==", + "dependencies": { + "System.ComponentModel.Composition": "8.0.0", + "System.Reflection.Context": "8.0.0" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "JlYi9XVvIREURRUlGMr1F6vOFLk7YSY4p1vHo4kX3tQ0AGrjqlRWHDi66ImHhy6qwXBG3BJ6Y1QlYQ+Qz6Xgww==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0", + "System.Security.Cryptography.ProtectedData": "8.0.0" + } + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "vaoWjvkG1aenR2XdjaVivlCV9fADfgyhW5bZtXT23qaEea0lWiUljdQuze4E31vKM7ZWJaSUsbYIKE3rnzfZUg==" + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "8.0.8", + "contentHash": "4ZM1wvLjz9nVVExsfPAaSl/qOvU+QNedJL5rQ+2Wbow+iGeyO0e7XN07707rMBgaffEeeLrCZBwC0oHUuvRdPw==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "8.0.0" + } + }, + "System.Formats.Asn1": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" + }, + "System.IO.Packaging": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "8g1V4YRpdGAxFcK8v9OjuMdIOJSpF30Zb1JGicwVZhly3I994WFyBdV6mQEo8d3T+URQe55/M0U0eIH0Hts1bg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" + }, + "System.Numerics.Vectors": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" + }, + "System.Private.ServiceModel": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "BcUV7OERlLqGxDXZuIyIMMmk1PbqBblLRbAoigmzIUx/M8A+8epvyPyXRpbgoucKH7QmfYdQIev04Phx2Co08A==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "6.0.1", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Reflection.Context": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "k76ubeIBOeIVg7vkQ4I+LoB8sY1EzFIc3oHEtoiNLhXleb7TBLXUQu0CFZ4sPlXJzWNabRf+gn1T7lyhOBxIMA==" + }, + "System.Reflection.DispatchProxy": { + "type": "Transitive", + "resolved": "4.7.1", + "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "MclTG61lsD9sYdpNz9xsKBzjsmsfCtcMZYXz/IUr2zlhaTaABonlr1ESeompTgM+Xk+IwtGYU7/voh3YWB/fWw==", + "dependencies": { + "System.Collections.Immutable": "7.0.0" + } + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==" + }, + "System.Security.Cryptography.Xml": { + "type": "Transitive", + "resolved": "8.0.1", + "contentHash": "hqu2ztecOf3BYg5q1R7QcyliX9L7r3mfsWtaRitAxcezH8hyZMB7zCmhi186hsUZXk1KxsAHXwyPEW+xvUED6g==", + "dependencies": { + "System.Security.Cryptography.Pkcs": "8.0.0" + } + }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "v/BBylw7XevuAsHXoX9dDUUfmBIcUf7Lkz8K3ZXIKz3YRKpw8YftpSir4n4e/jDTKFoaK37AsC3xnk+GNFI1Ow==", + "dependencies": { + "System.Windows.Extensions": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceModel.Duplex": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "IZ8ZahvTenWML7/jGUXSCm6jHlxpMbcb+Hy+h5p1WP9YVtb+Er7FHRRGizqQMINEdK6HhWpD6rzr5PdxNyusdg==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Http": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "hodkn0rPTYmoZ9EIPwcleUrOi1gZBPvU0uFvzmJbyxl1lIpVM5GxTrs/pCETStjOXCiXhBDoZQYajquOEfeW/w==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.NetTcp": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "tP7GN7ehqSIQEz7yOJEtY8ziTpfavf2IQMPKa7r9KGQ75+uEW6/wSlWez7oKQwGYuAHbcGhpJvdG6WoVMKYgkw==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Primitives": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "aNcdry95wIP1J+/HcLQM/f/AA73LnBQDNc2uCoZ+c1//KpVRp8nMZv5ApMwK+eDNVdCK8G0NLInF+xG3mfQL+g==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3" + } + }, + "System.ServiceModel.Security": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "vqelKb7DvP2inb6LDJ5Igi8wpOYdtLXn5luDW5qEaqkV2sYO1pKlVYBpr6g6m5SevzbdZlVNu67dQiD/H6EdGQ==", + "dependencies": { + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3" + } + }, + "System.ServiceModel.Syndication": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CJxIUwpBkMCPmIx46tFVOt0zpRrYurUHLW6tJBcmyj+MyWpKc6MMcS69B7IdlV/bgtgys073wMIHZX9QOQ1OFA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.4", + "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Web.Services.Description": { + "type": "Transitive", + "resolved": "4.10.3", + "contentHash": "ORCkTkUo9f1o4ACG+H6SV+0XSxVZ461w3cHzYxEU41y6aKWp1CeNTMYbtdxMw1we6c6t4Hqq15PdcLVcdqno/g==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + }, + "System.Windows.Forms": { + "type": "Transitive", + "resolved": "4.0.0", + "contentHash": "WL3QPG1q88aIWO0JPOlkCeyNE+FK4ufSKY5j6J6qAFQyfCFiiOYxi8RAhev9H0CS/wmKbIK8qr8xZBod85oWKw==" + }, + "compiler": { + "type": "Project", + "dependencies": { + "CommandLineParser": "[2.9.1, )", + "Extended.Collections": "[1.1.1, )", + "LanguageExt.Core": "[5.0.0-beta-07, )", + "NLog": "[5.3.2, )", + "NuGet.Commands": "[6.9.1, )", + "NuGet.Common": "[6.9.1, )", + "Pastel": "[5.1.0, )", + "QuikGraph": "[2.5.0, )", + "QuikGraph.Graphviz": "[2.5.0, )", + "System.Management.Automation": "[7.4.5, )", + "System.Windows.Forms": "[4.0.0, )" + } + } + }, + "net9.0-windows7.0/win-x64": { + "Microsoft.PowerShell.SDK": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "POa9ARY/dyJy+rivTJ9skJ+qwbN5prjVgdxkdxiU7r77PZjBpY8fq2W/vsDuA7AqkL7q7Cb7IbdxWnxJgaFSPQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "Microsoft.Extensions.ObjectPool": "8.0.8", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.5", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.5", + "Microsoft.PowerShell.Commands.Management": "7.4.5", + "Microsoft.PowerShell.Commands.Utility": "7.4.5", + "Microsoft.PowerShell.ConsoleHost": "7.4.5", + "Microsoft.PowerShell.Security": "7.4.5", + "Microsoft.WSMan.Management": "7.4.5", + "Microsoft.Windows.Compatibility": "8.0.8", + "System.Data.SqlClient": "4.8.6", + "System.IO.Packaging": "8.0.0", + "System.Management.Automation": "7.4.5", + "System.Net.Http.WinHttpHandler": "8.0.2", + "System.Private.ServiceModel": "4.10.3", + "System.ServiceModel.Duplex": "4.10.3", + "System.ServiceModel.Http": "4.10.3", + "System.ServiceModel.NetTcp": "4.10.3", + "System.ServiceModel.Primitives": "4.10.3", + "System.ServiceModel.Security": "4.10.3", + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" + } + }, + "System.Management.Automation": { + "type": "Direct", + "requested": "[7.4.5, )", + "resolved": "7.4.5", + "contentHash": "M8diPEl3ycy5juoSwCQkJVyiG6pHjv9IPD/bvqcnrQfAsbYzqDLVQLzfurHVrQHKvqAWB4k3xwtHMyYjG8xR9Q==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Management.Infrastructure": "3.0.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.5", + "Microsoft.PowerShell.Native": "7.4.0", + "Microsoft.Security.Extensions": "1.2.0", + "Microsoft.Win32.Registry.AccessControl": "8.0.0", + "Newtonsoft.Json": "13.0.3", + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.DiagnosticSource": "8.0.1", + "System.DirectoryServices": "8.0.0", + "System.Formats.Asn1": "8.0.1", + "System.Management": "8.0.0", + "System.Security.AccessControl": "6.0.1", + "System.Security.Cryptography.Pkcs": "8.0.0", + "System.Security.Permissions": "8.0.0", + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "Microsoft.Management.Infrastructure.CimCmdlets": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "EFil5FH6/AaNXjpKfh97BaY9/jp7HbrPwjEpKxD3/4NsvilJExAfSTeCXo0nl6jGA0KuU9iSZmzLw+NqnvzIbA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.Management.Infrastructure.Runtime.Unix": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" + }, + "Microsoft.Management.Infrastructure.Runtime.Win": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" + }, + "Microsoft.PowerShell.Commands.Diagnostics": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VART8UZ6cUXlEHGG+Elb7hn0TNL9+ISIOt8F0IxilmBbSTa79Ry3RFur+joWgTe2jLUHSpdHD5Nx1vmgfIdFUw==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.Commands.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "O1qelje0o0/IcsS3U7rK8QW4H7WLZFo2WtIH07Nx31eX0CM/1MZrzGTOKE2c5KU/805HUsmZNltA0XJu/ba1dQ==", + "dependencies": { + "Microsoft.PowerShell.Security": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.PowerShell.Commands.Utility": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "5VcmxTv8LKyI2CrBVzl++o1Lc0nWth3WqhdTCUOHwWe69JWtsKIyTJk6YXx/tA8d9cJ9GXbtnZLQ2LC+IL0t6Q==", + "dependencies": { + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", + "Markdig.Signed": "0.33.0", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", + "Microsoft.PowerShell.MarkdownRender": "7.2.1", + "System.Drawing.Common": "8.0.8", + "System.Management.Automation": "7.4.5", + "System.Text.Json": "8.0.4", + "System.Threading.AccessControl": "8.0.0" + } + }, + "Microsoft.PowerShell.ConsoleHost": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "VOfuT4zf2lecjOf4ppyWaBj7as9rk+T3n5enGv/wb8Wrc4xRRp/fO/CZNjBFqE1jsWqZgghTWpIsAdgr2oMYPA==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.PowerShell.CoreCLR.Eventing": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "yygq1fnGM1cYINM9XfsWUo4K2AAWuKFM/IkTGNlhAMIvxdmPgawgzb9Ygm4u1KNrjdFiJEXsqKqQsMxE9yOwhw==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "Microsoft.PowerShell.Native": { + "type": "Transitive", + "resolved": "7.4.0", + "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" + }, + "Microsoft.PowerShell.Security": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "slQplgdH36PvPpv4YZy0srkj3eKvENBmk1Rt/UHu/D0Eio4TIBNRqVLb3Y7824YE/VGuC4DBmQl6f6/UyCbZ2g==", + "dependencies": { + "System.Management.Automation": "7.4.5" + } + }, + "Microsoft.Security.Extensions": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "KSrRMb5vNi0CWSGG1++id2ZOs/1QhRqROt+qgbEAdQuGjGrFcl4AOl4/exGPUYz2wUnU42nvJqon1T3U0kPXLA==", + "dependencies": { + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" + } + }, + "Microsoft.Win32.Registry.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" + }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" + }, + "Microsoft.WSMan.Management": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "6Rksg7i6GSctvvsB3P7uhU8ub9lVAPa/zsPn1GrZ8eLSApZVZqO4zQFMuylCosXsn9p8h/ktytFSpM2u9k8ujw==", + "dependencies": { + "Microsoft.WSMan.Runtime": "7.4.5", + "System.Management.Automation": "7.4.5", + "System.ServiceProcess.ServiceController": "8.0.0" + } + }, + "Microsoft.WSMan.Runtime": { + "type": "Transitive", + "resolved": "7.4.5", + "contentHash": "vXoYVMP88tJ/EOkIB8/vFSc+aXjA+creJFGFIpFpLruSNDPjWHFHplnIkMXmgzHi5JITGSDt3JTz22e21qJhIg==" + }, + "runtime.linux-arm.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" + }, + "runtime.linux-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" + }, + "runtime.linux-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" + }, + "runtime.osx-arm64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" + }, + "runtime.osx-x64.runtime.native.System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" + }, + "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" + }, + "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" + }, + "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" + }, + "System.Data.Odbc": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", + "dependencies": { + "System.Text.Encoding.CodePages": "8.0.0" + } + }, + "System.Data.OleDb": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.Diagnostics.PerformanceCounter": "8.0.0" + } + }, + "System.Data.SqlClient": { + "type": "Transitive", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", + "dependencies": { + "Microsoft.Win32.Registry": "4.7.0", + "System.Security.Principal.Windows": "4.7.0", + "runtime.native.System.Data.SqlClient.sni": "4.7.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" + }, + "System.DirectoryServices.AccountManagement": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0", + "System.DirectoryServices": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" + }, + "System.IO.Ports": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", + "dependencies": { + "runtime.native.System.IO.Ports": "8.0.0" + } + }, + "System.Management": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", + "dependencies": { + "System.CodeDom": "8.0.0" + } + }, + "System.Net.Http.WinHttpHandler": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "PNtuWFl55FSigmCWX+Rj3h/1C5igGw3G4+cvnEe2kkwMDSWX08L/GuBw5S5Fc8R9PvOj+CRUHMY9w/Va8MKWHQ==" + }, + "System.Runtime.Caching": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "IQ4NXP/B3Ayzvw0rDQzVTYsCKyy0Jp9KI6aYcK7UnGVlR9+Awz++TIPCQtPYfLJfOpm8ajowMR09V7quD3sEHw==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", + "dependencies": { + "System.Formats.Asn1": "8.0.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.ServiceProcess.ServiceController": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", + "dependencies": { + "System.Diagnostics.EventLog": "8.0.0" + } + }, + "System.Speech": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Threading.AccessControl": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" + }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" + } + } + } } \ No newline at end of file From 7b2a75f18e749df5d33c37a56a025a5a0128f0b0 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 29 Oct 2024 17:21:04 +1100 Subject: [PATCH 213/341] ci: update dotnet version for building --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 0c6ad653..62a3082e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -25,7 +25,7 @@ jobs: uses: actions/setup-dotnet@v4 with: cache: true - dotnet-version: 8.0.x + dotnet-version: 9.0.x cache-dependency-path: "src/Compiler/packages.lock.json" - name: Install dependencies From abb2a34c7266a8e9c7af1113ece1552a38773c32 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 29 Oct 2024 17:45:19 +1100 Subject: [PATCH 214/341] chore: remove deprecated script --- src/microsoft/Common.psm1 | 2 +- .../admin/New-PartnerApplication.ps1 | 132 ------------------ .../windows/Extract-DownloadedTo.ps1 | 1 - src/microsoft/windows/Invoke-Downloadable.ps1 | 1 - 4 files changed, 1 insertion(+), 135 deletions(-) delete mode 100644 src/microsoft/admin/New-PartnerApplication.ps1 diff --git a/src/microsoft/Common.psm1 b/src/microsoft/Common.psm1 index 805a8a09..093b3dbd 100644 --- a/src/microsoft/Common.psm1 +++ b/src/microsoft/Common.psm1 @@ -23,7 +23,7 @@ function Get-AlertsUser { [String]$SupportEmail = 'amtsupport@amt.com.au' ) - begin { Enter-Scope; Connect-Service -Services Graph,ExchangeOnline -Scopes 'User.ReadWrite.All','OrgContact.Read.All','Domain.Read.All'; } + begin { Enter-Scope; Connect-Service -Services Graph, ExchangeOnline -Scopes 'User.ReadWrite.All', 'OrgContact.Read.All', 'Domain.Read.All'; } end { Exit-Scope -ReturnValue $Local:User; } process { diff --git a/src/microsoft/admin/New-PartnerApplication.ps1 b/src/microsoft/admin/New-PartnerApplication.ps1 deleted file mode 100644 index 92a7cc11..00000000 --- a/src/microsoft/admin/New-PartnerApplication.ps1 +++ /dev/null @@ -1,132 +0,0 @@ -<# -.SYNOPSIS - This script will create the required Azure AD application. - -.EXAMPLE - .\Create-AzureADApplication.ps1 -DisplayName "Partner Center Web App" - - .\Create-AzureADApplication.ps1 -DisplayName "Partner Center Web App" -TenantId eb210c1e-b697-4c06-b4e3-8b104c226b9a - - .\Create-AzureADApplication.ps1 -DisplayName "Partner Center Web App" -TenantId tenant01.onmicrosoft.com - -.PARAMETER DisplayName - Display name for the Azure AD application that will be created. - -.PARAMETER TenantId - [OPTIONAL] The domain or tenant identifier for the Azure AD tenant that should be utilized to create the various resources. - -.NOTES - This script was adapted from here: https://www.cyberdrain.com/using-the-secure-application-model-with-partnercenter-2-0-for-office365/ -#> - -#Requires -Version 5.1 -#Requires -PSEdition Desktop - -Using module ../../common/Analyser.psm1 -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Exit.psm1 - -Using module AzureAD -Using module PartnerCenter - -Using namespace Microsoft.Open.AzureAD.Model - -[CmdletBinding()] -Param( - [Parameter(Mandatory)] - [string]$DisplayName, - - [Parameter()] - [string]$TenantId -) - -try { - if ([string]::IsNullOrEmpty($TenantId)) { - Connect-AzureAD | Out-Null - - $TenantId = $(Get-AzureADTenantDetail).ObjectId - } else { - Connect-AzureAD -TenantId $TenantId | Out-Null - } -} catch [Microsoft.Azure.Common.Authentication.AadAuthenticationCanceledException] { - # The authentication attempt was canceled by the end-user. Execution of the script should be halted. - Invoke-Warn 'The authentication attempt was canceled. Execution of the script will be halted...'; - Invoke-FailedExit -ExitCode 1 -ErrorRecord $_; -} catch { - # An unexpected error has occurred. The end-user should be notified so that the appropriate action can be taken. - Invoke-FailedExit -ExitCode 1 -ErrorRecord $_; -} - -$adAppAccess = [RequiredResourceAccess]@{ - ResourceAppId = '00000002-0000-0000-c000-000000000000'; - ResourceAccess = - [ResourceAccess]@{ - Id = '5778995a-e1bf-45b8-affa-663a9f3f4d04'; - Type = 'Role' - }, - [ResourceAccess]@{ - Id = 'a42657d6-7f20-40e3-b6f0-cee03008a62a'; - Type = 'Scope' - }, - [ResourceAccess]@{ - Id = '311a71cc-e848-46a1-bdf8-97ff7156d8e6'; - Type = 'Scope' - } -} - -$graphAppAccess = [RequiredResourceAccess]@{ - ResourceAppId = '00000003-0000-0000-c000-000000000000'; - ResourceAccess = - [ResourceAccess]@{ - Id = 'bf394140-e372-4bf9-a898-299cfc7564e5'; - Type = 'Role' - }, - [ResourceAccess]@{ - Id = '7ab1d382-f21e-4acd-a863-ba3e13f7da61'; - Type = 'Role' - } -} - -$partnerCenterAppAccess = [RequiredResourceAccess]@{ - ResourceAppId = 'fa3d9a0c-3fb0-42cc-9193-47c7ecd2edbd'; - ResourceAccess = - [ResourceAccess]@{ - Id = '1cebfa2a-fb4d-419e-b5f9-839b4383e05a'; - Type = 'Scope' - } -} - -$SessionInfo = Get-AzureADCurrentSessionInfo - -Invoke-Info 'Creating the Azure AD application and related resources...'; - -$app = New-AzureADApplication -AvailableToOtherTenants $true -DisplayName $DisplayName -IdentifierUris "https://$($SessionInfo.TenantDomain)/$((New-Guid).ToString())" -RequiredResourceAccess $adAppAccess, $graphAppAccess, $partnerCenterAppAccess -ReplyUrls @('urn:ietf:wg:oauth:2.0:oob', 'https://localhost', 'http://localhost', 'http://localhost:8400') -$password = New-AzureADApplicationPasswordCredential -ObjectId $app.ObjectId -$spn = New-AzureADServicePrincipal -AppId $app.AppId -DisplayName $DisplayName - -$adminAgentsGroup = Get-AzureADGroup -Filter "DisplayName eq 'AdminAgents'" -Add-AzureADGroupMember -ObjectId $adminAgentsGroup.ObjectId -RefObjectId $spn.ObjectId - -Invoke-Info 'Sleeping for 30 seconds to allow app creation on O365' -Start-Sleep 30 -Invoke-Info 'Please approve General consent form.' -$PasswordToSecureString = $password.value | ConvertTo-SecureString -AsPlainText -Force -$credential = New-Object System.Management.Automation.PSCredential($($app.AppId), $PasswordToSecureString) -$token = New-PartnerAccessToken -ApplicationId "$($app.AppId)" -Scopes 'https://api.partnercenter.microsoft.com/user_impersonation' -ServicePrincipal -Credential $credential -Tenant $($spn.AppOwnerTenantID) -UseAuthorizationCode -Invoke-Info 'Please approve Exchange consent form.'; -$Exchangetoken = New-PartnerAccessToken -ApplicationId 'a0c73c16-a7e3-4564-9a95-2bdf47383716' -Scopes 'https://outlook.office365.com/.default' -Tenant $($spn.AppOwnerTenantID) -UseDeviceAuthentication -Invoke-Info 'Please approve Azure consent form.'; -$Azuretoken = New-PartnerAccessToken -ApplicationId "$($app.AppId)" -Scopes 'https://management.azure.com/user_impersonation' -ServicePrincipal -Credential $credential -Tenant $($spn.AppOwnerTenantID) -UseAuthorizationCode -Invoke-Info "Last initation required: Please browse to https://login.microsoftonline.com/$($spn.AppOwnerTenantID)/adminConsent?client_id=$($app.AppId)" -Invoke-Info 'Press any key after auth. An error report about incorrect URIs is expected!' -[void][System.Console]::ReadKey($true); -Invoke-Info '######### Secrets #########'; -Invoke-Info "`$ApplicationId = '$($app.AppId)'"; -Invoke-Info "`$ApplicationSecret = '$($password.Value)'"; -Invoke-Info "`$TenantID = '$($spn.AppOwnerTenantID)'"; -Invoke-Info "`$RefreshToken = '$($token.refreshtoken)'"; -Invoke-Info "`$ExchangeRefreshToken = '$($ExchangeToken.Refreshtoken)'"; -Invoke-Info "`$AzureRefreshToken = '$($Azuretoken.Refreshtoken)'"; -Invoke-Info '######### Secrets #########'; -Invoke-Info ' SAVE THESE IN A SECURE LOCATION '; diff --git a/src/microsoft/windows/Extract-DownloadedTo.ps1 b/src/microsoft/windows/Extract-DownloadedTo.ps1 index 757606c4..ede689f1 100644 --- a/src/microsoft/windows/Extract-DownloadedTo.ps1 +++ b/src/microsoft/windows/Extract-DownloadedTo.ps1 @@ -57,4 +57,3 @@ Invoke-RunMain $PSCmdlet { Move-Item -Path $Local:DownloadedItem -Destination $ExtractTo; } }; - diff --git a/src/microsoft/windows/Invoke-Downloadable.ps1 b/src/microsoft/windows/Invoke-Downloadable.ps1 index 5c62bdde..c1b7fa19 100644 --- a/src/microsoft/windows/Invoke-Downloadable.ps1 +++ b/src/microsoft/windows/Invoke-Downloadable.ps1 @@ -78,4 +78,3 @@ Invoke-RunMain $PSCmdlet { Invoke-Exec -Executable:$Local:Executable -ExecutableArgs:$ExecArgs; } }; - From fe87f8003009f9502144f9231432713af10bc694 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 31 Oct 2024 14:20:03 +1100 Subject: [PATCH 215/341] feat(Compiler): Add Export Definitions for AzureAD The AzureAD module seems to be broken when attempting to Import it inside the powershell session managed by C#, complaining about the processor arch being MSIL and not matching the AMD64 requirement. Due to this we can't get any export information from AzureAD. --- .vscode/launch.json | 7 +- .vscode/settings.json | 15 +- resources/schemas/ExtraModuleInfo.jsonc | 29 +++ src/Compiler/Module/Compiled/Remote.cs | 2 +- .../Resources/ExtraModuleInfo/AzureAD.jsonc | 238 ++++++++++++++++++ .../ExchangeOnlineManagement.jsonc | 1 + 6 files changed, 285 insertions(+), 7 deletions(-) create mode 100644 resources/schemas/ExtraModuleInfo.jsonc create mode 100644 src/Compiler/Resources/ExtraModuleInfo/AzureAD.jsonc diff --git a/.vscode/launch.json b/.vscode/launch.json index 141d7089..93992b6c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,10 @@ "request": "launch", "script": "${file}", "cwd": "${cwd}", - "args": ["-Verbose", "-Debug"], + "args": [ + "-Verbose", + "-Debug" + ], "createTemporaryIntegratedConsole": true, "attachDotnetDebugger": true }, @@ -57,7 +60,7 @@ "type": "coreclr", "request": "attach", "processId": "${command:pickProcess}", - "justMyCode": true + "justMyCode": false } ], "inputs": [ diff --git a/.vscode/settings.json b/.vscode/settings.json index 38d0565d..428f2c84 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,13 +9,15 @@ "powershell.codeFormatting.pipelineIndentationStyle": "IncreaseIndentationForFirstPipeline", "powershell.codeFormatting.useConstantStrings": true, "powershell.codeFormatting.useCorrectCasing": true, - "powershell.codeFormatting.whitespaceAfterSeparator": false, + "powershell.codeFormatting.whitespaceAfterSeparator": true, "powershell.codeFormatting.whitespaceBetweenParameters": true, "powershell.codeFormatting.whitespaceInsideBrace": true, "powershell.pester.codeLens": false, "powershell.scriptAnalysis.settingsPath": "PSScriptAnalyzerSettings.psd1", - "poshProTools.ignoredPaths": "compiled", - "pester.testFilePath": ["tests/*.[tT]ests.[pP][sS]1"], + "poshProTools.ignoredPaths": "compiled/*", + "pester.testFilePath": [ + "tests/*.[tT]ests.[pP][sS]1" + ], "markiscodecoverage.searchCriteria": "tests\\Compiler\\Coverage\\coverage.info", "markiscodecoverage.enableDecorations": true, "poshProTools.disableNewsNotification": true, @@ -27,5 +29,10 @@ 120, 130 ], - "files.eol": "\n" + "files.eol": "\n", + "path-intellisense.autoSlashAfterDirectory": true, + "path-intellisense.autoTriggerNextSuggestion": true, + "powershell.analyzeOpenDocumentsOnly": true, + "powershell.developer.editorServicesLogLevel": "Diagnostic", + "powershell.integratedConsole.suppressStartupBanner": true } diff --git a/resources/schemas/ExtraModuleInfo.jsonc b/resources/schemas/ExtraModuleInfo.jsonc new file mode 100644 index 00000000..0d1f0bdd --- /dev/null +++ b/resources/schemas/ExtraModuleInfo.jsonc @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Schema for defining additional information for a module.", + "type": "object", + "properties": { + "FunctionsToExport": { + "type": "array", + "description": "Array of function names that are exported from the module", + "items": { + "type": "string" + } + }, + "CmdletsToExport": { + "type": "array", + "description": "Array of cmdlet names that are exported from the module", + "items": { + "type": "string" + } + }, + "AliasesToExport": { + "type": "array", + "description": "Array of alias names that are exported from the module", + "items": { + "type": "string" + } + } + }, + "required": [] +} diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 3a353cde..1c5252c6 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -74,7 +74,7 @@ public IEnumerable GetExported(object? data, CommandTypes commandTypes) archive.ExtractToDirectory(tempOutput); } - var sessionState = InitialSessionState.CreateDefault2(); + var sessionState = InitialSessionState.CreateDefault(); sessionState.ImportPSModulesFromPath(tempModuleRootPath); var pwsh = PowerShell.Create(sessionState); exported.AddRange(pwsh.Runspace.SessionStateProxy.InvokeCommand diff --git a/src/Compiler/Resources/ExtraModuleInfo/AzureAD.jsonc b/src/Compiler/Resources/ExtraModuleInfo/AzureAD.jsonc new file mode 100644 index 00000000..2957b27c --- /dev/null +++ b/src/Compiler/Resources/ExtraModuleInfo/AzureAD.jsonc @@ -0,0 +1,238 @@ +{ + "$schema": "../../../../resources/schemas/ExtraModuleInfo.jsonc", + "AliasesToExport": [ + "Get-AzureADApplicationProxyConnectorGroupMembers" + ], + "CmdletsToExport": [ + "Add-AzureADApplicationOwner", + "Add-AzureADDeviceRegisteredOwner", + "Add-AzureADDeviceRegisteredUser", + "Add-AzureADDirectoryRoleMember", + "Add-AzureADGroupMember", + "Add-AzureADGroupOwner", + "Add-AzureADMSAdministrativeUnitMember", + "Add-AzureADMSApplicationOwner", + "Add-AzureADMSLifecyclePolicyGroup", + "Add-AzureADMSScopedRoleMembership", + "Add-AzureADMSServicePrincipalDelegatedPermissionClassification", + "Add-AzureADServicePrincipalOwner", + "Confirm-AzureADDomain", + "Connect-AzureAD", + "Disconnect-AzureAD", + "Enable-AzureADDirectoryRole", + "Get-AzureADApplication", + "Get-AzureADApplicationExtensionProperty", + "Get-AzureADApplicationKeyCredential", + "Get-AzureADApplicationLogo", + "Get-AzureADApplicationOwner", + "Get-AzureADApplicationPasswordCredential", + "Get-AzureADApplicationProxyApplication", + "Get-AzureADApplicationProxyApplicationConnectorGroup", + "Get-AzureADApplicationProxyConnector", + "Get-AzureADApplicationProxyConnectorGroup", + "Get-AzureADApplicationProxyConnectorGroupMember", + "Get-AzureADApplicationProxyConnectorMemberOf", + "Get-AzureADApplicationServiceEndpoint", + "Get-AzureADContact", + "Get-AzureADContactDirectReport", + "Get-AzureADContactManager", + "Get-AzureADContactMembership", + "Get-AzureADContactThumbnailPhoto", + "Get-AzureADContract", + "Get-AzureADCurrentSessionInfo", + "Get-AzureADDeletedApplication", + "Get-AzureADDevice", + "Get-AzureADDeviceConfiguration", + "Get-AzureADDeviceRegisteredOwner", + "Get-AzureADDeviceRegisteredUser", + "Get-AzureADDirectoryRole", + "Get-AzureADDirectoryRoleMember", + "Get-AzureADDirectoryRoleTemplate", + "Get-AzureADDomain", + "Get-AzureADDomainNameReference", + "Get-AzureADDomainServiceConfigurationRecord", + "Get-AzureADDomainVerificationDnsRecord", + "Get-AzureADExtensionProperty", + "Get-AzureADGroup", + "Get-AzureADGroupAppRoleAssignment", + "Get-AzureADGroupMember", + "Get-AzureADGroupOwner", + "Get-AzureADMSAdministrativeUnit", + "Get-AzureADMSAdministrativeUnitMember", + "Get-AzureADMSApplication", + "Get-AzureADMSApplicationExtensionProperty", + "Get-AzureADMSApplicationOwner", + "Get-AzureADMSAuthorizationPolicy", + "Get-AzureADMSConditionalAccessPolicy", + "Get-AzureADMSDeletedDirectoryObject", + "Get-AzureADMSDeletedGroup", + "Get-AzureADMSGroup", + "Get-AzureADMSGroupLifecyclePolicy", + "Get-AzureADMSGroupPermissionGrant", + "Get-AzureADMSIdentityProvider", + "Get-AzureADMSLifecyclePolicyGroup", + "Get-AzureADMSNamedLocationPolicy", + "Get-AzureADMSPermissionGrantConditionSet", + "Get-AzureADMSPermissionGrantPolicy", + "Get-AzureADMSRoleAssignment", + "Get-AzureADMSRoleDefinition", + "Get-AzureADMSScopedRoleMembership", + "Get-AzureADMSServicePrincipalDelegatedPermissionClassification", + "Get-AzureADOAuth2PermissionGrant", + "Get-AzureADObjectByObjectId", + "Get-AzureADServiceAppRoleAssignedTo", + "Get-AzureADServiceAppRoleAssignment", + "Get-AzureADServicePrincipal", + "Get-AzureADServicePrincipalCreatedObject", + "Get-AzureADServicePrincipalKeyCredential", + "Get-AzureADServicePrincipalMembership", + "Get-AzureADServicePrincipalOAuth2PermissionGrant", + "Get-AzureADServicePrincipalOwnedObject", + "Get-AzureADServicePrincipalOwner", + "Get-AzureADServicePrincipalPasswordCredential", + "Get-AzureADSubscribedSku", + "Get-AzureADTenantDetail", + "Get-AzureADTrustedCertificateAuthority", + "Get-AzureADUser", + "Get-AzureADUserAppRoleAssignment", + "Get-AzureADUserCreatedObject", + "Get-AzureADUserDirectReport", + "Get-AzureADUserExtension", + "Get-AzureADUserLicenseDetail", + "Get-AzureADUserManager", + "Get-AzureADUserMembership", + "Get-AzureADUserOAuth2PermissionGrant", + "Get-AzureADUserOwnedDevice", + "Get-AzureADUserOwnedObject", + "Get-AzureADUserRegisteredDevice", + "Get-AzureADUserThumbnailPhoto", + "Get-CrossCloudVerificationCode", + "New-AzureADApplication", + "New-AzureADApplicationExtensionProperty", + "New-AzureADApplicationKeyCredential", + "New-AzureADApplicationPasswordCredential", + "New-AzureADApplicationProxyApplication", + "New-AzureADApplicationProxyConnectorGroup", + "New-AzureADDevice", + "New-AzureADDomain", + "New-AzureADGroup", + "New-AzureADGroupAppRoleAssignment", + "New-AzureADMSAdministrativeUnit", + "New-AzureADMSApplication", + "New-AzureADMSApplicationExtensionProperty", + "New-AzureADMSApplicationKey", + "New-AzureADMSApplicationPassword", + "New-AzureADMSConditionalAccessPolicy", + "New-AzureADMSGroup", + "New-AzureADMSGroupLifecyclePolicy", + "New-AzureADMSIdentityProvider", + "New-AzureADMSInvitation", + "New-AzureADMSNamedLocationPolicy", + "New-AzureADMSPermissionGrantConditionSet", + "New-AzureADMSPermissionGrantPolicy", + "New-AzureADMSRoleAssignment", + "New-AzureADMSRoleDefinition", + "New-AzureADServiceAppRoleAssignment", + "New-AzureADServicePrincipal", + "New-AzureADServicePrincipalKeyCredential", + "New-AzureADServicePrincipalPasswordCredential", + "New-AzureADTrustedCertificateAuthority", + "New-AzureADUser", + "New-AzureADUserAppRoleAssignment", + "Remove-AzureADApplication", + "Remove-AzureADApplicationExtensionProperty", + "Remove-AzureADApplicationKeyCredential", + "Remove-AzureADApplicationOwner", + "Remove-AzureADApplicationPasswordCredential", + "Remove-AzureADApplicationProxyApplication", + "Remove-AzureADApplicationProxyApplicationConnectorGroup", + "Remove-AzureADApplicationProxyConnectorGroup", + "Remove-AzureADContact", + "Remove-AzureADContactManager", + "Remove-AzureADDeletedApplication", + "Remove-AzureADDevice", + "Remove-AzureADDeviceRegisteredOwner", + "Remove-AzureADDeviceRegisteredUser", + "Remove-AzureADDirectoryRoleMember", + "Remove-AzureADDomain", + "Remove-AzureADGroup", + "Remove-AzureADGroupAppRoleAssignment", + "Remove-AzureADGroupMember", + "Remove-AzureADGroupOwner", + "Remove-AzureADMSAdministrativeUnit", + "Remove-AzureADMSAdministrativeUnitMember", + "Remove-AzureADMSApplication", + "Remove-AzureADMSApplicationExtensionProperty", + "Remove-AzureADMSApplicationKey", + "Remove-AzureADMSApplicationOwner", + "Remove-AzureADMSApplicationPassword", + "Remove-AzureADMSApplicationVerifiedPublisher", + "Remove-AzureADMSConditionalAccessPolicy", + "Remove-AzureADMSDeletedDirectoryObject", + "Remove-AzureADMSGroup", + "Remove-AzureADMSGroupLifecyclePolicy", + "Remove-AzureADMSIdentityProvider", + "Remove-AzureADMSLifecyclePolicyGroup", + "Remove-AzureADMSNamedLocationPolicy", + "Remove-AzureADMSPermissionGrantConditionSet", + "Remove-AzureADMSPermissionGrantPolicy", + "Remove-AzureADMSRoleAssignment", + "Remove-AzureADMSRoleDefinition", + "Remove-AzureADMSScopedRoleMembership", + "Remove-AzureADMSServicePrincipalDelegatedPermissionClassification", + "Remove-AzureADOAuth2PermissionGrant", + "Remove-AzureADServiceAppRoleAssignment", + "Remove-AzureADServicePrincipal", + "Remove-AzureADServicePrincipalKeyCredential", + "Remove-AzureADServicePrincipalOwner", + "Remove-AzureADServicePrincipalPasswordCredential", + "Remove-AzureADTrustedCertificateAuthority", + "Remove-AzureADUser", + "Remove-AzureADUserAppRoleAssignment", + "Remove-AzureADUserExtension", + "Remove-AzureADUserManager", + "Reset-AzureADMSLifeCycleGroup", + "Restore-AzureADDeletedApplication", + "Restore-AzureADMSDeletedDirectoryObject", + "Revoke-AzureADSignedInUserAllRefreshToken", + "Revoke-AzureADUserAllRefreshToken", + "Select-AzureADGroupIdsContactIsMemberOf", + "Select-AzureADGroupIdsGroupIsMemberOf", + "Select-AzureADGroupIdsServicePrincipalIsMemberOf", + "Select-AzureADGroupIdsUserIsMemberOf", + "Set-AzureADApplication", + "Set-AzureADApplicationLogo", + "Set-AzureADApplicationProxyApplication", + "Set-AzureADApplicationProxyApplicationConnectorGroup", + "Set-AzureADApplicationProxyApplicationCustomDomainCertificate", + "Set-AzureADApplicationProxyApplicationSingleSignOn", + "Set-AzureADApplicationProxyConnector", + "Set-AzureADApplicationProxyConnectorGroup", + "Set-AzureADDevice", + "Set-AzureADDomain", + "Set-AzureADGroup", + "Set-AzureADMSAdministrativeUnit", + "Set-AzureADMSApplication", + "Set-AzureADMSApplicationLogo", + "Set-AzureADMSApplicationVerifiedPublisher", + "Set-AzureADMSAuthorizationPolicy", + "Set-AzureADMSConditionalAccessPolicy", + "Set-AzureADMSGroup", + "Set-AzureADMSGroupLifecyclePolicy", + "Set-AzureADMSIdentityProvider", + "Set-AzureADMSNamedLocationPolicy", + "Set-AzureADMSPermissionGrantConditionSet", + "Set-AzureADMSPermissionGrantPolicy", + "Set-AzureADMSRoleDefinition", + "Set-AzureADServicePrincipal", + "Set-AzureADTenantDetail", + "Set-AzureADTrustedCertificateAuthority", + "Set-AzureADUser", + "Set-AzureADUserExtension", + "Set-AzureADUserLicense", + "Set-AzureADUserManager", + "Set-AzureADUserPassword", + "Set-AzureADUserThumbnailPhoto", + "Update-AzureADSignedInUserPassword" + ] +} diff --git a/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc b/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc index cd252d68..451b78a7 100644 --- a/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc +++ b/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc @@ -1,4 +1,5 @@ { + "$schema": "../../../../resources/schemas/ExtraModuleInfo.jsonc", "FunctionsToExport": [ // Commands present once Connect-ExchangeOnline is run "Add-AvailabilityAddressSpace", From 94f28e342341924e5fa01cb3bdd6b1f126252c75 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 1 Nov 2024 13:17:13 +1100 Subject: [PATCH 216/341] refactor(Compiler): Improve Thread Safety in ResolvableParent. This also seems to fix an issue that was somehow cloning instances of a compiled object. --- src/Compiler/Module/Resolvable/Resolvable.cs | 144 ++++++++++--------- src/Compiler/packages.lock.json | 6 - 2 files changed, 76 insertions(+), 74 deletions(-) diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index 95f78e2b..f3680eea 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -114,9 +114,9 @@ [NotNull] Option>> CompilingTask private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private readonly List<(ModuleSpec, Task)> RunningTasks = []; + private readonly List<(ModuleSpec Key, Task Task)> RunningTasks = []; - public readonly Dictionary Resolvables = []; + public readonly ConcurrentDictionary Resolvables = []; /// /// A graph of resolvable roots and their dependencies. @@ -175,9 +175,7 @@ public void QueueResolve([NotNull] Resolvable rootModule, Action this.Graph.AddVertex(rootModule); } - lock (this.Resolvables) { - this.Resolvables[rootModule.ModuleSpec] = new(None, onCompletion.AsOption(), None); - } + this.Resolvables.TryAdd(rootModule.ModuleSpec, new(None, onCompletion.AsOption(), None)); } /// @@ -190,23 +188,29 @@ public async Task> FindResolvable([NotNull] ModuleSpec mod .FirstOrDefault(resolvable => resolvable.ModuleSpec.CompareTo(moduleSpec) != ModuleMatch.None); var fromRunningTask = this.RunningTasks - .Where(task => !ReferenceEquals(task.Item1, moduleSpec)) - .FirstOrDefault(task => task.Item1.CompareTo(moduleSpec) != ModuleMatch.None); + .Where(task => !ReferenceEquals(task.Key, moduleSpec)) + .FirstOrDefault(task => task.Key.CompareTo(moduleSpec) != ModuleMatch.None); if (resolvable is not null) { return new ResolvedMatch(resolvable, resolvable.ModuleSpec.CompareTo(moduleSpec)); - } else if (fromRunningTask.Item1 is not null) { - Logger.Debug($"{moduleSpec} is waiting for {fromRunningTask.Item1} to complete."); - await fromRunningTask.Item2; - var awaitedResolvable = this.Graph.Vertices.FirstOrDefault(resolvable => ReferenceEquals(fromRunningTask.Item1, resolvable.ModuleSpec))!; - return new ResolvedMatch(awaitedResolvable, fromRunningTask.Item1.CompareTo(moduleSpec)); + } else if (fromRunningTask.Key is not null) { + Logger.Debug($"{moduleSpec} is waiting for {fromRunningTask.Key} to complete."); + await fromRunningTask.Task; + lock (this.Graph) { + var awaitedResolvable = this.Graph.Vertices.FirstOrDefault(resolvable => ReferenceEquals(fromRunningTask.Key, resolvable.ModuleSpec))!; + return new ResolvedMatch(awaitedResolvable, fromRunningTask.Key.CompareTo(moduleSpec)); + } } return None; } public async Task> WaitForCompiled(ModuleSpec moduleSpec) { - var resolvable = this.Graph.Vertices.FirstOrDefault(res => res.ModuleSpec == moduleSpec); + Resolvable? resolvable; + lock (this.Graph) { + resolvable = this.Graph.Vertices.FirstOrDefault(res => res.ModuleSpec == moduleSpec); + } + if (resolvable is null) { return FinFail(Error.New($"No resolvable found for {moduleSpec}.")); } @@ -228,30 +232,28 @@ public async Task> FindResolvable([NotNull] ModuleSpec mod // otherwise we need to start the compilation. if (waitHandle.IsSome(out var runningTask)) { return await runningTask; - } else { - var compilingTask = Task.Run(async () => { - var newlyCompiledModule = await resolvable.IntoCompiled(); + } - lock (this.Resolvables) { - this.Resolvables[moduleSpec] = resolvableInfo with { - Compiled = newlyCompiledModule - }; - } + this.Resolvables.TryUpdate(moduleSpec, resolvableInfo with { + CompilingTask = Task.Run(async () => await resolvable.IntoCompiled()) + }, resolvableInfo); - newlyCompiledModule.IfSucc(module => onCompletion.IfSome( - onCompletion => onCompletion((module as CompiledScript)!) // Safety: We know it's a compiled script - )); + var submittedInfo = this.Resolvables[moduleSpec]; + if (submittedInfo.CompilingTask.IsSome(out var task)) { + var taskResult = await task; - return newlyCompiledModule; - }); + this.Resolvables.TryUpdate(moduleSpec, submittedInfo with { + Compiled = taskResult, + CompilingTask = None + }, submittedInfo); - lock (this.Resolvables) { - this.Resolvables[moduleSpec] = resolvableInfo with { - CompilingTask = compilingTask - }; - } + taskResult.IfSucc(module => onCompletion.IfSome(action => action((CompiledScript)module))); - return await compilingTask; + return taskResult; + } else if (submittedInfo.Compiled.IsSome(out var compiled)) { + return compiled; + } else { + return FinFail(Error.New($"Failed to compile {moduleSpec}, no task or compiled found, submittedInfo: {submittedInfo}")); } } @@ -267,7 +269,7 @@ public async Task StartCompilation() { var compiledModule = await this.WaitForCompiled(resolvable.ModuleSpec); compiledModule.IfFail(err => Program.Errors.Add(err.Enrich(resolvable.ModuleSpec))); - Logger.Trace($"Finished compiling top level script {resolvable.ModuleSpec.Name}"); + Logger.Trace($"{(compiledModule.IsFail ? "Unsuccessfully" : "Successfully")} compiled script {resolvable.ModuleSpec.Name}"); }).ContinueWith(task => { if (task.IsFaulted) { Logger.Error(task.Exception, "Failed to compile top level script."); @@ -289,12 +291,14 @@ public async Task StartCompilation() { /// Creates all the links between the modules and their dependencies. /// private async Task ResolveDepedencyGraph() { - var iterating = new ConcurrentQueue<(Resolvable?, ModuleSpec)>(this.Graph.Vertices.Select(resolvable => ((Resolvable?)null, resolvable.ModuleSpec))); + Queue<(Resolvable?, ModuleSpec)> iterating; + lock (this.Graph) { + iterating = new(this.Graph.Vertices.Select(res => ((Resolvable?)null, res.ModuleSpec))); + } + do { if (iterating.TryDequeue(out var item)) { var (parentResolvable, workingModuleSpec) = item; - var alreadyBeingProcessed = this.RunningTasks.Any(task => task.Item1 == workingModuleSpec); - this.RunningTasks.Add((workingModuleSpec, Task.Run(async () => { Logger.Trace($"Resolving {workingModuleSpec} with parent {parentResolvable?.ModuleSpec}."); @@ -326,22 +330,24 @@ private async Task ResolveDepedencyGraph() { }))); } - this.RunningTasks.RemoveAll(task => task.Item2.IsCompleted); + this.RunningTasks.RemoveAll(task => task.Task.IsCompleted); - if (this.RunningTasks.Count > 0) { + if (this.RunningTasks.Count != 0) { Logger.Debug($"Waiting for tasks to complete, {this.RunningTasks.Count} running with {iterating.Count} left to process."); - await Task.WhenAny(this.RunningTasks.Select(task => task.Item2)); + await Task.WhenAny(this.RunningTasks.Select(task => task.Task)); } - } while (!iterating.IsEmpty || this.RunningTasks.Count > 0); + } while (iterating.Count != 0 || this.RunningTasks.Count != 0); Logger.Debug("Finished resolving all modules."); - var dotGraph = this.Graph.ToGraphviz(alg => { - alg.FormatVertex += (sender, args) => { - args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; - }; - }); - Console.WriteLine(dotGraph); + if (Program.IsDebugging) { + var dotGraph = this.Graph.ToGraphviz(alg => { + alg.FormatVertex += (sender, args) => { + args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; + }; + }); + Console.WriteLine(dotGraph); + } } /// @@ -425,13 +431,17 @@ [.. mergeWith] this.Graph.TryGetInEdges(foundResolvable, out var inEdges); this.Graph.TryGetOutEdges(foundResolvable, out var outEdges); - inEdges.ToList().ForEach(edge => this.Graph.AddVerticesAndEdge(new Edge(edge.Source, resultingResolvable))); - outEdges.ToList().ForEach(edge => this.Graph.AddVerticesAndEdge(new Edge(resultingResolvable, edge.Target))); + inEdges.ToList().ForEach(edge => { + this.Graph.AddVerticesAndEdge(new Edge(edge.Source, resultingResolvable)); + this.Graph.RemoveEdge(edge); + }); + outEdges.ToList().ForEach(edge => { + this.Graph.AddVerticesAndEdge(new Edge(resultingResolvable, edge.Target)); + this.Graph.RemoveEdge(edge); + }); - lock (this.Resolvables) { - if (this.Resolvables.TryGetValue(foundResolvable.ModuleSpec, out var resolvableInfo)) { - this.Resolvables[resultingResolvable.ModuleSpec] = resolvableInfo; - } + if (this.Resolvables.Remove(foundResolvable.ModuleSpec, out var resolvableInfo)) { + this.Resolvables[resultingResolvable.ModuleSpec] = resolvableInfo; } } } else { @@ -439,26 +449,24 @@ [.. mergeWith] if (newResolvable.IsErr(out var err, out resultingResolvable)) return FinFail>(err); } - if (parentResolvable != null) { - if (this.Graph.Edges.Any(edge => edge.Source == parentResolvable && edge.Target == resultingResolvable)) { - Logger.Debug("Edge already exists, skipping."); - return FinSucc>(None); - } + lock (this.Graph) { + if (parentResolvable != null) { + if (this.Graph.Edges.Any(edge => edge.Source == parentResolvable && edge.Target == resultingResolvable)) { + Logger.Debug("Edge already exists, skipping."); + return FinSucc>(None); + } - lock (parentResolvable.Requirements) { - if (!parentResolvable.Requirements.RemoveRequirement(moduleToResolve)) - Logger.Warn($"Failed to remove requirement {moduleToResolve} from {parentResolvable.ModuleSpec}."); + lock (parentResolvable.Requirements) { + if (!parentResolvable.Requirements.RemoveRequirement(moduleToResolve)) + Logger.Warn($"Failed to remove requirement {moduleToResolve} from {parentResolvable.ModuleSpec}."); + } + this.Graph.AddVerticesAndEdge(new Edge(parentResolvable, resultingResolvable)); + } else { + this.Graph.AddVertex(resultingResolvable); } - this.Graph.AddVerticesAndEdge(new Edge(parentResolvable, resultingResolvable)); - } else { - this.Graph.AddVertex(resultingResolvable); } - if (!this.Resolvables.TryGetValue(resultingResolvable.ModuleSpec, out var _)) { - lock (this.Resolvables) { - this.Resolvables[resultingResolvable.ModuleSpec] = new(None, None, None); - } - } + this.Resolvables.TryAdd(resultingResolvable.ModuleSpec, new(None, None, None)); return FinSucc(Some(resultingResolvable)); } diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 8f5fce13..9eb0ba44 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,12 +20,6 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[9.0.0-rc.2.24473.5, )", - "resolved": "9.0.0-rc.2.24473.5", - "contentHash": "mXyCgKqBIo/KOpY09FqjOU8d+LME2qowzzvBd1/viYmSpAKYfQ2w1WDOlh0FniY4xnrB/wmDiAo4frJvfCqT0w==" - }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.5, )", From b476205bc1505a60593aab8b940a4e4a39602fd2 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 1 Nov 2024 14:46:04 +1100 Subject: [PATCH 217/341] refactor(Compiler): Cache instances of ExtraModuleInfo --- src/Compiler/Module/Compiled/Remote.cs | 43 +++++++++++++------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 1c5252c6..f740bdc4 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -16,17 +16,20 @@ namespace Compiler.Module.Compiled; public class CompiledRemoteModule : Compiled { - private record ExtraModuleInfo( + private sealed record ExtraModuleInfo( string[]? FunctionsToExport, string[]? CmdletsToExport, string[]? AliasesToExport - ); + ) { + public static readonly ExtraModuleInfo Empty = new(null, null, null); + }; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly JsonSerializerOptions JsonSerializerOptions = new() { ReadCommentHandling = JsonCommentHandling.Skip }; + private readonly Lazy ThisExtraModuleInfo; private Hashtable? PowerShellManifest; private ZipArchive? ZipArchive; @@ -49,10 +52,22 @@ byte[] bytes null => new Version(0, 0, 1), var other => throw new InvalidDataException($"ModuleVersion must be a string, but was {other.GetType()}") }; + + this.ThisExtraModuleInfo = new(() => { + var info = Assembly.GetExecutingAssembly().GetName(); + var extraModuleInfoResource = $"{info.Name}.Resources.ExtraModuleInfo.{this.ModuleSpec.Name}.json"; + using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(extraModuleInfoResource) + ?? Assembly.GetExecutingAssembly().GetManifestResourceStream($"{extraModuleInfoResource}c"); + if (templateStream == null) return ExtraModuleInfo.Empty; + + using var streamReader = new StreamReader(templateStream, Encoding.UTF8); + return JsonSerializer.Deserialize(streamReader.ReadToEnd(), JsonSerializerOptions) + ?? ExtraModuleInfo.Empty; + }); } public override string StringifyContent() { - var base64 = Convert.ToBase64String(this.Bytes); + var base64 = Convert.ToBase64String(this.ContentBytes); return $"'{base64}'"; } @@ -91,28 +106,14 @@ public IEnumerable GetExported(object? data, CommandTypes commandTypes) throw new InvalidDataException($"{commandTypes}sToExport must be a string or an array of strings, but was {data.GetType()}"); } - var info = Assembly.GetExecutingAssembly().GetName(); - var extraModuleInfoResource = $"{info.Name}.Resources.ExtraModuleInfo.{this.ModuleSpec.Name}.json"; - using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(extraModuleInfoResource) - ?? Assembly.GetExecutingAssembly().GetManifestResourceStream($"{extraModuleInfoResource}c"); - if (templateStream == null) return exported; - - using var streamReader = new StreamReader(templateStream, Encoding.UTF8); - var extraModuleInfo = JsonSerializer.Deserialize(streamReader.ReadToEnd(), JsonSerializerOptions); - if (extraModuleInfo == null) { - Logger.Warn($"Failed to parse extra module info for {this.ModuleSpec.Name}"); - return exported; - } - var extraExports = commandTypes switch { - CommandTypes.Function => extraModuleInfo.FunctionsToExport, - CommandTypes.Cmdlet => extraModuleInfo.CmdletsToExport, - CommandTypes.Alias => extraModuleInfo.AliasesToExport, + CommandTypes.Function => this.ThisExtraModuleInfo.Value.FunctionsToExport, + CommandTypes.Cmdlet => this.ThisExtraModuleInfo.Value.CmdletsToExport, + CommandTypes.Alias => this.ThisExtraModuleInfo.Value.AliasesToExport, _ => throw new ArgumentOutOfRangeException(nameof(commandTypes), commandTypes, null) }; - if (extraExports == null) return exported; + if (extraExports != null) exported.AddRange(extraExports); - exported.AddRange(extraExports); return exported; } From 1e6340456d13e20f5489f6e0280d8997b1286ce6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 1 Nov 2024 14:48:10 +1100 Subject: [PATCH 218/341] fix(Compiler): Fix inconsistency of ComputedHash The AddRequirementHashBytes method now also adds the ComputedHash for all Compiled Module Dependencies so that changes to a dependencies content are properly reflected to the top level scripts hash. --- src/Compiler/Module/Compiled/Compiled.cs | 73 +++++++--- src/Compiler/Module/Compiled/Local.cs | 22 ++- src/Compiler/Module/Compiled/Remote.cs | 10 +- src/Compiler/Module/Compiled/Script.cs | 27 ++-- src/Compiler/Text/Document.cs | 42 +++--- tests/Compiler/Module/Compiled/Compiled.cs | 49 +++++-- tests/Compiler/Module/Compiled/Local.cs | 147 +++++++++++++-------- tests/Compiler/Module/Compiled/Remote.cs | 6 +- tests/Compiler/Module/Compiled/Script.cs | 11 +- 9 files changed, 249 insertions(+), 138 deletions(-) diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 8a12e1ba..cd161d62 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -3,22 +3,42 @@ using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; +using System.Runtime.CompilerServices; using System.Security.Cryptography; +using System.Text; using Compiler.Requirements; +using LanguageExt; +using NLog; namespace Compiler.Module.Compiled; -public abstract class Compiled { +[method: Pure] +public abstract class Compiled(ModuleSpec moduleSpec, RequirementGroup requirements) { + public Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] contentBytes) : this(moduleSpec, requirements) => this.ContentBytes = contentBytes; + + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + public virtual List Parents { get; } = []; - public virtual ModuleSpec ModuleSpec { get; } + public virtual ModuleSpec ModuleSpec { get; } = moduleSpec; + + public virtual RequirementGroup Requirements { get; } = requirements; - public virtual RequirementGroup Requirements { get; } + public abstract byte[] ContentBytes { get; init; } /// /// Gets combined the hash of the content and requirements of the module. /// - public string ComputedHash; + public string ComputedHash { + // For some reason these values are not always gotten at their latest after an update, its like its doing some bullshit premature optimization. + // So we need to tell the compiler to not optimize this method. + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + get { + var byteList = new List((byte[])this.ContentBytes.Clone()); + this.AddRequirementHashBytes(byteList, this.Requirements); + return Convert.ToHexString(SHA256.HashData([.. byteList])); + } + } /// /// The version of the module, not necessarily the same as the version of the module spec. @@ -30,17 +50,6 @@ public abstract class Compiled { /// public abstract ContentType Type { get; } - [Pure] - protected Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] hashableBytes) { - this.ModuleSpec = moduleSpec; - this.Requirements = requirements; - - var byteList = new List((byte[])hashableBytes.Clone()); - AddRequirementHashBytes(byteList, requirements); - this.ComputedHash = Convert.ToHexString(SHA256.HashData([.. byteList])); - } - - public string GetNameHash() => $"{this.ModuleSpec.Name}-{this.ComputedHash[..6]}"; public abstract string StringifyContent(); @@ -63,8 +72,17 @@ public virtual string GetPowerShellObject() => $$""" } """; - public Compiled GetRootParent() { - if (this.Parents.Count == 0) return this; + /// + /// Gets the absolute parent of the module, which should always be the executing script. + /// + /// + /// The absolute parent of the module. + /// + /// + public virtual CompiledScript? GetRootParent() { + if (this.Parents.Count == 0) return null; // If it was a script it would have overriden this method. // All parents should point to the same root parent eventually. var parent = this.Parents[0]; @@ -72,7 +90,7 @@ public Compiled GetRootParent() { parent = parent.Parents[0]; } - return parent; + return parent as CompiledScript; } /// @@ -109,12 +127,25 @@ public Compiled[] GetSiblings() { return siblings.FirstOrDefault(compiled => compiled.ModuleSpec == moduleSpec); } - public static void AddRequirementHashBytes( + [Pure] + public void AddRequirementHashBytes( [NotNull] List hashableBytes, [NotNull] RequirementGroup requirementGroup ) { - var requirements = requirementGroup.GetRequirements(); - requirements.ToList().ForEach(requirement => hashableBytes.AddRange(requirement.Hash)); + hashableBytes.AddRange(requirementGroup.GetRequirements() + .Select(req => req.Hash) + .Flatten()); + + var rootGraph = this.GetRootParent()!.Graph; + if (!rootGraph.ContainsVertex(this)) { + // How tf did this happen? + Logger.Error($"Module {this.ModuleSpec.Name} is not in the graph of its root parent."); + } + + hashableBytes.AddRange(this.GetRootParent()!.Graph.OutEdges(this).ToList() + .Select(edge => edge.Target.ComputedHash) + .Select(Encoding.UTF8.GetBytes) + .Flatten()); } } diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index 439dbcaa..248917b5 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -3,6 +3,7 @@ using System.Collections; using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; using System.Text; using Compiler.Requirements; using Compiler.Text; @@ -10,18 +11,25 @@ namespace Compiler.Module.Compiled; - -public class CompiledLocalModule( - PathedModuleSpec moduleSpec, - CompiledDocument document, - RequirementGroup requirements -) : Compiled(moduleSpec, requirements, Encoding.UTF8.GetBytes(document.GetContent())) { +public class CompiledLocalModule : Compiled { public override ContentType Type { get; } = ContentType.UTF8String; // Local modules are always version 0.0.1, as they are not versioned. public override Version Version { get; } = new Version(0, 0, 1); - public virtual CompiledDocument Document { get; } = document; + public virtual CompiledDocument Document { get; } + + public override byte[] ContentBytes { get; init; } + + [Pure] + public CompiledLocalModule( + PathedModuleSpec moduleSpec, + CompiledDocument document, + RequirementGroup requirements + ) : base(moduleSpec, requirements) { + this.Document = document; + this.ContentBytes = Encoding.UTF8.GetBytes(this.StringifyContent()); + } public override string StringifyContent() => new StringBuilder() .AppendLine("<#ps1#> @'") diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index f740bdc4..6690396c 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -33,18 +33,18 @@ private sealed record ExtraModuleInfo( private Hashtable? PowerShellManifest; private ZipArchive? ZipArchive; - public readonly byte[] Bytes; - public override ContentType Type => ContentType.Zip; public override Version Version { get; } + public override byte[] ContentBytes { get; init; } + public CompiledRemoteModule( ModuleSpec moduleSpec, RequirementGroup requirements, byte[] bytes - ) : base(moduleSpec, requirements, bytes) { - this.Bytes = bytes; + ) : base(moduleSpec, requirements) { + this.ContentBytes = bytes; var manifest = this.GetPowerShellManifest(); this.Version = manifest["ModuleVersion"] switch { @@ -132,7 +132,7 @@ public override IEnumerable GetExportedFunctions() { return exportedFunctions; } - private ZipArchive GetZipArchive() => this.ZipArchive ??= new ZipArchive(new MemoryStream((byte[])this.Bytes.Clone()), ZipArchiveMode.Read, false); + private ZipArchive GetZipArchive() => this.ZipArchive ??= new ZipArchive(new MemoryStream((byte[])this.ContentBytes.Clone()), ZipArchiveMode.Read, false); private Hashtable GetPowerShellManifest() { if (this.PowerShellManifest != null) return this.PowerShellManifest; diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 938e3bdf..f339a0ff 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -15,11 +15,7 @@ namespace Compiler.Module.Compiled; -public partial class CompiledScript( - PathedModuleSpec moduleSpec, - CompiledDocument document, - RequirementGroup requirements -) : CompiledLocalModule(moduleSpec, document, requirements) { +public partial class CompiledScript : CompiledLocalModule { private static readonly Lazy Template = new(() => { var info = Assembly.GetExecutingAssembly().GetName(); using var templateStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.ScriptTemplate.ps1")!; @@ -29,23 +25,22 @@ RequirementGroup requirements public virtual BidirectionalGraph> Graph { get; } = new(); - /// - /// Creates a new compiled script. - /// - /// - /// - /// - /// - private CompiledScript( - ResolvableScript thisResolvable, + public CompiledScript( + PathedModuleSpec moduleSpec, CompiledDocument document, RequirementGroup requirements - ) : this(thisResolvable.ModuleSpec, document, requirements) { + ) : base(moduleSpec, document, requirements) { this.Graph.AddVertex(this); // Add the parent-child relationships to each module. this.Graph.EdgeAdded += edge => edge.Target.Parents.Add(edge.Source); } + private CompiledScript( + ResolvableScript thisResolvable, + CompiledDocument document, + RequirementGroup requirements + ) : this(thisResolvable.ModuleSpec, document, requirements) { } + public static async Task> Create( ResolvableScript thisResolvable, CompiledDocument document, @@ -151,6 +146,8 @@ public override string GetPowerShellObject() { return filledTemplate; } + public override CompiledScript GetRootParent() => this; + /// /// Utility method for indenting a string. /// diff --git a/src/Compiler/Text/Document.cs b/src/Compiler/Text/Document.cs index 6676bfe8..6a060fd9 100644 --- a/src/Compiler/Text/Document.cs +++ b/src/Compiler/Text/Document.cs @@ -85,30 +85,32 @@ public static Fin FromBuilder(TextEditor builder, int indentBy if (indentBy != 0) builder.AddEdit(() => new IndentUpdater(indentBy)); var lines = builder.Document.GetLines().ToList(); - var spanUpdates = new List(); - var sortedUpdaters = builder.TextUpdaters.OrderBy(updater => updater.Updater.Priority).ToList(); - Logger.Debug($"Applying in order->{string.Join("\n\t", sortedUpdaters)}"); - foreach (var textUpdater in sortedUpdaters) { - spanUpdates.ForEach(textUpdater.Updater.PushByUpdate); - Fin> updateResult; - try { - updateResult = textUpdater.Updater.Apply(lines); - } catch (Exception e) { - return Error.New( - $"Error applying update: {textUpdater}", - e - ); - } + if (builder.TextUpdaters.Count != 0) { + var spanUpdates = new List(); + var sortedUpdaters = builder.TextUpdaters.OrderBy(updater => updater.Updater.Priority).ToList(); + Logger.Debug($"Applying in order->{string.Join("\n\t", sortedUpdaters)}"); + foreach (var textUpdater in sortedUpdaters) { + spanUpdates.ForEach(textUpdater.Updater.PushByUpdate); + Fin> updateResult; + try { + updateResult = textUpdater.Updater.Apply(lines); + } catch (Exception e) { + return Error.New( + $"Error applying update: {textUpdater}", + e + ); + } - if (updateResult.IsErr(out var err, out var updates)) { - if (err is WrappedErrorWithDebuggableContent wrappedError) { - return err; + if (updateResult.IsErr(out var err, out var updates)) { + if (err is WrappedErrorWithDebuggableContent wrappedError) { + return err; + } + + return new WrappedErrorWithDebuggableContent($"Error applying update: {textUpdater}", string.Join('\n', lines), err); } - return new WrappedErrorWithDebuggableContent($"Error applying update: {textUpdater}", string.Join('\n', lines), err); + spanUpdates.AddRange(updates); } - - spanUpdates.AddRange(updates); } return AstHelper.GetAstReportingErrors( diff --git a/tests/Compiler/Module/Compiled/Compiled.cs b/tests/Compiler/Module/Compiled/Compiled.cs index 89ec573e..91c16ce4 100644 --- a/tests/Compiler/Module/Compiled/Compiled.cs +++ b/tests/Compiler/Module/Compiled/Compiled.cs @@ -1,11 +1,12 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. -using static Compiler.Module.Compiled.Compiled; using Compiler.Requirements; using System.Collections; using Moq; using RealCompiled = Compiler.Module.Compiled.Compiled; +using Compiler.Module.Compiled; +using QuikGraph; namespace Compiler.Test.Module.Compiled; @@ -16,12 +17,13 @@ public void AddRequirementHashBytes_AlwaysSameResult( byte[] hashableBytes, RequirementGroup requirementGroup ) { + var module = TestData.GetMockCompiledModule(hashableBytes); var random = TestContext.CurrentContext.Random; List bytesList; var hashResults = new List(); do { bytesList = new List(hashableBytes); - AddRequirementHashBytes(bytesList, requirementGroup); + module.Object.AddRequirementHashBytes(bytesList, requirementGroup); hashResults.Add([.. hashableBytes]); } while (hashResults.Count < random.Next(2, 5)); @@ -34,22 +36,22 @@ RequirementGroup requirementGroup } [Test] - public void GetRootParent_WhenNoParents_ReturnsSelf() { + public void GetRootParent_WhenNoParents_ReturnsNull() { var mockCompiled = TestData.GetMockCompiledModule(); mockCompiled.Setup(x => x.Parents).Returns([]); - Assert.That(mockCompiled.Object.GetRootParent(), Is.EqualTo(mockCompiled.Object)); + Assert.That(mockCompiled.Object.GetRootParent(), Is.Null); } [Test] public void GetRootParent_WhenHasParents_ReturnsRootParent() { - var rootParent = TestData.GetMockCompiledModule(); + var rootParent = CompiledLocalModuleTests.TestData.CreateModule(); var parent = TestData.GetMockCompiledModule(); var mockCompiled = TestData.GetMockCompiledModule(); mockCompiled.Setup(x => x.Parents).Returns([parent.Object]); - parent.Setup(x => x.Parents).Returns([rootParent.Object]); + parent.Setup(x => x.Parents).Returns([rootParent]); - Assert.That(mockCompiled.Object.GetRootParent(), Is.EqualTo(rootParent.Object)); + Assert.That(mockCompiled.Object.GetRootParent(), Is.EqualTo(rootParent)); } } @@ -96,15 +98,40 @@ public static IEnumerable AddRequirementHashData { } } - public static Mock GetMockCompiledModule() { + public static Mock GetMockCompiledModule(byte[]? bytes = null, CompiledScript? parent = null) { + parent ??= CompiledLocalModuleTests.TestData.CreateModule(); + var random = TestContext.CurrentContext.Random; var moduleSpec = new ModuleSpec(random.GetString(6)); var requirements = new RequirementGroup(); - var hashableBytes = new byte[random.Next(10, 100)]; - random.NextBytes(hashableBytes); + if (bytes is null) { + bytes = new byte[random.Next(10, 100)]; + random.NextBytes(bytes); + } - return new Mock(moduleSpec, requirements, hashableBytes) { + var mock = new Mock(moduleSpec, requirements, bytes) { CallBase = true }; + CompiledUtils.AddDependency(parent, mock.Object); + + return mock; + } +} + +public static class CompiledUtils { + public static void AddDependency(RealCompiled parent, RealCompiled dependency) { + var rootParent = parent.GetRootParent()!; + + dependency.Parents.Add(parent); + parent.Requirements.AddRequirement(dependency.ModuleSpec); + rootParent.Graph.AddVerticesAndEdge(new Edge(rootParent, dependency)); + } + + public static void RemoveDependency(RealCompiled parent, RealCompiled dependency) { + var rootParent = parent.GetRootParent()!; + + dependency.Parents.Remove(parent); + parent.Requirements.RemoveRequirement(dependency.ModuleSpec); + rootParent.Graph.RemoveEdge(new Edge(rootParent, dependency)); } } diff --git a/tests/Compiler/Module/Compiled/Local.cs b/tests/Compiler/Module/Compiled/Local.cs index 17ba1c2c..9a597a8e 100644 --- a/tests/Compiler/Module/Compiled/Local.cs +++ b/tests/Compiler/Module/Compiled/Local.cs @@ -6,7 +6,6 @@ using Compiler.Requirements; using Compiler.Text; using Moq; -using QuikGraph; using RealCompiled = Compiler.Module.Compiled.Compiled; namespace Compiler.Test.Module.Compiled; @@ -23,69 +22,109 @@ public void StringifyContent_ReturnsValidAstContent() { Assert.That(ast, Is.Not.Null); }); } -} -file static class TestData { - public static RealCompiled GetRandomCompiledModule(CompiledLocalModule? parent = null, int depLevel = 0) { - var random = TestContext.CurrentContext.Random; - var createDependencies = depLevel < 3 && random.NextBool(); - var scriptParent = parent as CompiledScript ?? parent?.GetRootParent() as CompiledScript; + [Test, Parallelizable] + public void HashChanges( + [Values("Hello, World!")] string scriptOneHello, + [Values("Hello, World!", "Hello, Other World!")] string scriptTwoHello + ) => Assert.Multiple(() => { + var scriptOne = TestData.CreateModule($"Write-Host '{scriptOneHello}';"); + var scriptTwo = TestData.CreateModule($"Write-Host '{scriptTwoHello}';"); + + var expression = scriptOneHello == scriptTwoHello ? Is.EqualTo(scriptTwo.ComputedHash) : Is.Not.EqualTo(scriptTwo.ComputedHash); + Assert.That(scriptOne.ComputedHash, expression, "Hashes should be the same if the content is the same."); + + if (scriptOneHello == scriptTwoHello) { + var oldHash = scriptOne.ComputedHash; + + var remoteModule = CompiledRemoteModuleTests.TestData.GetTestRemoteModule(); + CompiledUtils.AddDependency(scriptOne, remoteModule); + Assert.That(scriptOne.ComputedHash, Is.Not.EqualTo(oldHash), "Hash should change when a dependency is added."); + Assert.That(scriptOne.ComputedHash, Is.Not.EqualTo(scriptTwo.ComputedHash), "Hashes should differ when a dependency is added."); + + CompiledUtils.AddDependency(scriptTwo, remoteModule); + Assert.That(scriptOne.ComputedHash, Is.EqualTo(scriptTwo.ComputedHash), "Hashes should not differ when the dependencies are the same."); + + // Check that a nested dependency changes the hash of the top module + var moduleContent = "Write-Host 'Hello, World!';"; + var randomName = TestContext.CurrentContext.Random.GetString(6); + var moduleDependencyOne = TestData.CreateModule(moduleContent, randomName); + var moduleDependencyTwo = TestData.CreateModule(moduleContent, randomName); + var nestedDependencyOne = TestData.CreateModule("Write-Host 'Hello, Nested World!';"); - var createLocalModule = parent is null || random.NextBool(); - if (createLocalModule) { - var document = CompiledDocument.FromBuilder(new TextEditor(new TextDocument(["Write-Host 'Hello, World!'"]))).Unwrap(); - var modulePath = Path.Combine(TestContext.CurrentContext.WorkDirectory, $"{random.GetString(6)}.psm1"); + CompiledUtils.AddDependency(scriptOne, moduleDependencyOne); + CompiledUtils.AddDependency(scriptTwo, moduleDependencyTwo); + CompiledUtils.AddDependency(moduleDependencyOne, nestedDependencyOne); + CompiledUtils.AddDependency(moduleDependencyTwo, nestedDependencyOne); + Assert.That(moduleDependencyOne.ComputedHash, Is.EqualTo(moduleDependencyTwo.ComputedHash), "Hashes should be the same if the dependencies are the same."); + Assert.That(scriptOne.ComputedHash, Is.EqualTo(scriptTwo.ComputedHash), "Hashes should not differ when a nested dependency matches."); + + var nestedDependencyTwo = TestData.CreateModule("Write-Host 'Hello, Other Nested World!';"); + CompiledUtils.RemoveDependency(moduleDependencyTwo, nestedDependencyOne); + CompiledUtils.AddDependency(moduleDependencyTwo, nestedDependencyTwo); + Assert.That(moduleDependencyOne.ComputedHash, Is.Not.EqualTo(moduleDependencyTwo.ComputedHash), "Hashes should differ when the dependency changes."); + Assert.That(scriptOne.ComputedHash, Is.Not.EqualTo(scriptTwo.ComputedHash), "Hashes should differ when a nested dependency changes."); + } + }); + + public static class TestData { + private static (PathedModuleSpec, CompiledDocument, RequirementGroup) PrepareRandomModule(string? contents = null, string? fileNameNoExt = null) { + var random = TestContext.CurrentContext.Random; + contents ??= $"""Write-Host "Hello, {random.GetString(10)}!";"""; + var document = CompiledDocument.FromBuilder(new TextEditor(new TextDocument(contents.Split('\n')))).Unwrap(); + var modulePath = Path.Combine(TestContext.CurrentContext.WorkDirectory, $"{fileNameNoExt ?? random.GetString(6)}.psm1"); File.Create(modulePath).Close(); var moduleSpec = new PathedModuleSpec(TestContext.CurrentContext.WorkDirectory, modulePath); - var requirementGroup = new RequirementGroup(); - requirementGroup.AddRequirement(new RunAsAdminRequirement()); - - // Gotta create a script module - if (depLevel == 0 || scriptParent is null) { - var scriptMock = new Mock(moduleSpec, document, requirementGroup) { - CallBase = true - }; - - var graph = new BidirectionalGraph>(); - graph.AddVertex(scriptMock.Object); - graph.EdgeAdded += edge => { - edge.Target.Parents.Add(edge.Source); - edge.Target.GetRootParent().Requirements.AddRequirement(edge.Target.ModuleSpec); - }; - - if (createDependencies) { - var dependencies = new List(); - for (var i = 0; i < random.Next(1, 5); i++) { - var dependency = GetRandomCompiledModule(scriptMock.Object, depLevel + 1); - dependencies.Add(dependency); - graph.AddVertex(dependency); - graph.AddEdge(new Edge(scriptMock.Object, dependency)); + + return (moduleSpec, document, new RequirementGroup()); + + } + + public static T CreateModule(string? contents = null, string? fileNameNoExt = null) where T : RealCompiled { + var (moduleSpec, document, requirementGroup) = PrepareRandomModule(contents, fileNameNoExt); + return new Mock(moduleSpec, document, requirementGroup) { + CallBase = true + }.Object; + } + + public static RealCompiled GetRandomCompiledModule(CompiledLocalModule? parent = null, int depLevel = 0, bool createDependencies = true) { + var random = TestContext.CurrentContext.Random; + createDependencies = !createDependencies && depLevel < 3 && random.NextBool(); + var scriptParent = parent as CompiledScript ?? parent?.GetRootParent(); + + var createLocalModule = parent is null || random.NextBool(); + if (createLocalModule) { + // Gotta create a script module + if (depLevel == 0 || scriptParent is null) { + var compiledScript = CreateModule(); + + if (createDependencies) { + for (var i = 0; i < random.Next(1, 5); i++) { + var dependency = GetRandomCompiledModule(compiledScript, depLevel + 1, createDependencies); + CompiledUtils.AddDependency(compiledScript, dependency); + } } - } - return scriptMock.Object; - } else { - var module = new CompiledLocalModule(moduleSpec, document, requirementGroup); - scriptParent!.Graph.AddVerticesAndEdge(new Edge(scriptParent, module)); - module.Parents.Add(scriptParent); - - if (createDependencies) { - var dependencies = new List(); - for (var i = 0; i < random.Next(1, 5); i++) { - var dependency = GetRandomCompiledModule(module, depLevel + 1); - dependencies.Add(dependency); - scriptParent.Graph.AddVertex(dependency); - scriptParent.Graph.AddEdge(new Edge(module, dependency)); + return compiledScript; + } else { + var module = CreateModule(); + CompiledUtils.AddDependency(scriptParent, module); + + if (createDependencies) { + for (var i = 0; i < random.Next(1, 5); i++) { + var dependency = GetRandomCompiledModule(module, depLevel + 1, createDependencies); + CompiledUtils.AddDependency(module, dependency); + } } + + return module; } + } else { + var remoteModule = CompiledRemoteModuleTests.TestData.GetTestRemoteModule(); + CompiledUtils.AddDependency(scriptParent!, remoteModule); - return module; + return remoteModule; } - } else { - var remoteModule = CompiledRemoteModuleTests.TestData.GetTestRemoteModule(); - scriptParent!.Graph.AddVerticesAndEdge(new Edge(scriptParent, remoteModule)); - - return remoteModule; } } } diff --git a/tests/Compiler/Module/Compiled/Remote.cs b/tests/Compiler/Module/Compiled/Remote.cs index b5d0012a..9f5d43e2 100644 --- a/tests/Compiler/Module/Compiled/Remote.cs +++ b/tests/Compiler/Module/Compiled/Remote.cs @@ -32,9 +32,9 @@ public void StringifyContent_CanBeConvertedBack() { Assert.Multiple(() => { Assert.That(bytes, Is.Not.Empty); - Assert.That(bytes, Is.EqualTo(module.Bytes)); + Assert.That(bytes, Is.EqualTo(module.ContentBytes)); - using var zipArchive = new ZipArchive(new MemoryStream(module.Bytes), ZipArchiveMode.Read, false); + using var zipArchive = new ZipArchive(new MemoryStream(module.ContentBytes), ZipArchiveMode.Read, false); Assert.That(zipArchive, Is.Not.Null); Assert.That(zipArchive.Entries, Is.Not.Empty); Assert.That(zipArchive.Entries, Is.All.Property(nameof(ZipArchiveEntry.Length)).GreaterThan(0)); @@ -58,7 +58,7 @@ public static CompiledRemoteModule GetTestRemoteModule() { var info = Assembly.GetExecutingAssembly().GetName(); using var nupkgStream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{info.Name}.Resources.{moduleName}.{moduleVersion}.nupkg")!; var bytes = new byte[nupkgStream.Length]; - nupkgStream.Read(bytes, 0, bytes.Length); + nupkgStream.ReadExactly(bytes); var mock = new Mock(moduleSpec, requirementGroup, bytes) { CallBase = true diff --git a/tests/Compiler/Module/Compiled/Script.cs b/tests/Compiler/Module/Compiled/Script.cs index 3a1d6b08..6d7d8d59 100644 --- a/tests/Compiler/Module/Compiled/Script.cs +++ b/tests/Compiler/Module/Compiled/Script.cs @@ -1,8 +1,15 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. -namespace Compiler.Test.Module.Compiled; +using Compiler.Module.Compiled; -file static class TestData { +namespace Compiler.Test.Module.Compiled; +[TestFixture] +public sealed class CompiledScriptTests { + [Test] + public void GetRootParent_ReturnsSelf() { + var module = CompiledLocalModuleTests.TestData.CreateModule(); + Assert.That(module.GetRootParent(), Is.EqualTo(module)); + } } From fa3de39abea9ba5e4137cc1a53ff49877e761e9e Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 1 Nov 2024 16:35:08 +1100 Subject: [PATCH 219/341] fix(Compiler): Empty name when compiling a single script --- src/Compiler/Program.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index c66df667..aa702d3a 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -81,8 +81,9 @@ private static async Task Main(string[] args) { var superParent = new ResolvableParent(opts.Input!); + var sourceRoot = File.Exists(opts.Input) ? Path.GetDirectoryName(opts.Input)! : opts.Input; filesToCompile.ToList().ForEach(async scriptPath => { - var pathedModuleSpec = new PathedModuleSpec(opts.Input!, Path.GetFullPath(scriptPath)); + var pathedModuleSpec = new PathedModuleSpec(sourceRoot, Path.GetFullPath(scriptPath)); if ((await Resolvable.TryCreateScript(pathedModuleSpec, superParent)).IsErr(out var error, out var resolvableScript)) { Errors.Add(error.Enrich(pathedModuleSpec)); return; @@ -90,7 +91,7 @@ private static async Task Main(string[] args) { superParent.QueueResolve(resolvableScript, compiled => { Output( - opts.Input!, + sourceRoot, opts.Output, scriptPath, compiled.GetPowerShellObject(), @@ -106,7 +107,7 @@ private static async Task Main(string[] args) { Logger.Trace("Finished compilation."); - await OutputErrors(Errors, opts.Input!, opts.Output); + await OutputErrors(Errors, sourceRoot, opts.Output); return 1; }, From 8183a755d4e62340a9a1274696ff94bf802c5fde Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 1 Nov 2024 18:31:30 +1100 Subject: [PATCH 220/341] refactor: Rename schemas files to has suffixed with .schema.jsonc --- ...ript.jsonc => ExternalScript.schema.jsonc} | 0 ...nfo.jsonc => ExtraModuleInfo.schema.jsonc} | 0 resources/test2.ps1 | 31 ++++-- .../Resources/ExtraModuleInfo/AzureAD.jsonc | 2 +- .../ExchangeOnlineManagement.jsonc | 2 +- .../Resources/ExtraModuleInfo/MSOnline.jsonc | 101 ++++++++++++++++++ src/external/sources/Nodeware.jsonc | 2 +- 7 files changed, 124 insertions(+), 14 deletions(-) rename resources/schemas/{ExternalScript.jsonc => ExternalScript.schema.jsonc} (100%) rename resources/schemas/{ExtraModuleInfo.jsonc => ExtraModuleInfo.schema.jsonc} (100%) create mode 100644 src/Compiler/Resources/ExtraModuleInfo/MSOnline.jsonc diff --git a/resources/schemas/ExternalScript.jsonc b/resources/schemas/ExternalScript.schema.jsonc similarity index 100% rename from resources/schemas/ExternalScript.jsonc rename to resources/schemas/ExternalScript.schema.jsonc diff --git a/resources/schemas/ExtraModuleInfo.jsonc b/resources/schemas/ExtraModuleInfo.schema.jsonc similarity index 100% rename from resources/schemas/ExtraModuleInfo.jsonc rename to resources/schemas/ExtraModuleInfo.schema.jsonc diff --git a/resources/test2.ps1 b/resources/test2.ps1 index c6da9dcf..f26e6dc5 100644 --- a/resources/test2.ps1 +++ b/resources/test2.ps1 @@ -1,11 +1,20 @@ -Using module ../src/common/Environment.psm1 -Using module ../src/common/Logging.psm1 -Using module ../src/common/Exit.psm1 - -[CmdletBinding()] -param() - -Invoke-RunMain $PSCmdlet { - Write-Error 'This is an error message!' -Category InvalidOperation; - Invoke-FailedExit 1050; -} +Using module ../src/common/Environment.psm1 +Using module ../src/common/Logging.psm1 +Using module ../src/common/Exit.psm1 +Using module ../src/common/Analyser.psm1 + +[CmdletBinding()] +param() + +Invoke-RunMain $PSCmdlet { + [Compiler.Analyser.SuppressAnalyserAttribute( + 'UseOfUndefinedFunction', + 'thiscommand' + )] + param() + + Write-Error 'This is an error message!' -Category InvalidOperation; + Invoke-FailedExit 1050; + + thiscommand; +} diff --git a/src/Compiler/Resources/ExtraModuleInfo/AzureAD.jsonc b/src/Compiler/Resources/ExtraModuleInfo/AzureAD.jsonc index 2957b27c..7d21c727 100644 --- a/src/Compiler/Resources/ExtraModuleInfo/AzureAD.jsonc +++ b/src/Compiler/Resources/ExtraModuleInfo/AzureAD.jsonc @@ -1,5 +1,5 @@ { - "$schema": "../../../../resources/schemas/ExtraModuleInfo.jsonc", + "$schema": "../../../../resources/schemas/ExtraModuleInfo.schema.jsonc", "AliasesToExport": [ "Get-AzureADApplicationProxyConnectorGroupMembers" ], diff --git a/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc b/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc index 451b78a7..6e93d616 100644 --- a/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc +++ b/src/Compiler/Resources/ExtraModuleInfo/ExchangeOnlineManagement.jsonc @@ -1,5 +1,5 @@ { - "$schema": "../../../../resources/schemas/ExtraModuleInfo.jsonc", + "$schema": "../../../../resources/schemas/ExtraModuleInfo.schema.jsonc", "FunctionsToExport": [ // Commands present once Connect-ExchangeOnline is run "Add-AvailabilityAddressSpace", diff --git a/src/Compiler/Resources/ExtraModuleInfo/MSOnline.jsonc b/src/Compiler/Resources/ExtraModuleInfo/MSOnline.jsonc new file mode 100644 index 00000000..badf9e1b --- /dev/null +++ b/src/Compiler/Resources/ExtraModuleInfo/MSOnline.jsonc @@ -0,0 +1,101 @@ +{ + "$schema": "../../../../resources/schemas/ExtraModuleInfo.schema.jsonc", + "CmdletsToExport": [ + "Add-MsolAdministrativeUnitMember", + "Add-MsolForeignGroupToRole", + "Add-MsolGroupMember", + "Add-MsolRoleMember", + "Add-MsolScopedRoleMember", + "Confirm-MsolDomain", + "Confirm-MsolEmailVerifiedDomain", + "Connect-MsolService", + "Convert-MsolDomainToFederated", + "Convert-MsolDomainToStandard", + "Convert-MsolFederatedUser", + "Disable-MsolDevice", + "Enable-MsolDevice", + "Get-MsolAccountSku", + "Get-MsolAdministrativeUnit", + "Get-MsolAdministrativeUnitMember", + "Get-MsolCompanyAllowedDataLocation", + "Get-MsolCompanyInformation", + "Get-MsolContact", + "Get-MsolDevice", + "Get-MsolDeviceRegistrationServicePolicy", + "Get-MsolDirSyncConfiguration", + "Get-MsolDirSyncFeatures", + "Get-MsolDirSyncProvisioningError", + "Get-MsolDomain", + "Get-MsolDomainFederationSettings", + "Get-MsolDomainVerificationDns", + "Get-MsolFederationProperty", + "Get-MsolGroup", + "Get-MsolGroupMember", + "Get-MsolHasObjectsWithDirSyncProvisioningErrors", + "Get-MsolPartnerContract", + "Get-MsolPartnerInformation", + "Get-MsolPasswordPolicy", + "Get-MsolRole", + "Get-MsolRoleMember", + "Get-MsolScopedRoleMember", + "Get-MsolServicePrincipal", + "Get-MsolServicePrincipalCredential", + "Get-MsolSubscription", + "Get-MsolUser", + "Get-MsolUserByStrongAuthentication", + "Get-MsolUserRole", + "New-MsolAdministrativeUnit", + "New-MsolDomain", + "New-MsolFederatedDomain", + "New-MsolGroup", + "New-MsolLicenseOptions", + "New-MsolServicePrincipal", + "New-MsolServicePrincipalAddresses", + "New-MsolServicePrincipalCredential", + "New-MsolUser", + "New-MsolWellKnownGroup", + "Redo-MsolProvisionContact", + "Redo-MsolProvisionGroup", + "Redo-MsolProvisionUser", + "Remove-MsolAdministrativeUnit", + "Remove-MsolAdministrativeUnitMember", + "Remove-MsolApplicationPassword", + "Remove-MsolContact", + "Remove-MsolDevice", + "Remove-MsolDomain", + "Remove-MsolFederatedDomain", + "Remove-MsolForeignGroupFromRole", + "Remove-MsolGroup", + "Remove-MsolGroupMember", + "Remove-MsolRoleMember", + "Remove-MsolScopedRoleMember", + "Remove-MsolServicePrincipal", + "Remove-MsolServicePrincipalCredential", + "Remove-MsolUser", + "Reset-MsolStrongAuthenticationMethodByUpn", + "Restore-MsolUser", + "Set-MsolADFSContext", + "Set-MsolAdministrativeUnit", + "Set-MsolCompanyAllowedDataLocation", + "Set-MsolCompanyContactInformation", + "Set-MsolCompanyMultiNationalEnabled", + "Set-MsolCompanySecurityComplianceContactInformation", + "Set-MsolCompanySettings", + "Set-MsolDeviceRegistrationServicePolicy", + "Set-MsolDirSyncConfiguration", + "Set-MsolDirSyncEnabled", + "Set-MsolDirSyncFeature", + "Set-MsolDomain", + "Set-MsolDomainAuthentication", + "Set-MsolDomainFederationSettings", + "Set-MsolGroup", + "Set-MsolPartnerInformation", + "Set-MsolPasswordPolicy", + "Set-MsolServicePrincipal", + "Set-MsolUser", + "Set-MsolUserLicense", + "Set-MsolUserPassword", + "Set-MsolUserPrincipalName", + "Update-MsolFederatedDomain" + ] +} diff --git a/src/external/sources/Nodeware.jsonc b/src/external/sources/Nodeware.jsonc index 1fbee866..20ed6b8a 100644 --- a/src/external/sources/Nodeware.jsonc +++ b/src/external/sources/Nodeware.jsonc @@ -1,5 +1,5 @@ { - "$schema": "../../../resources/schemas/ExternalScript.jsonc", + "$schema": "../../../resources/schemas/ExternalScript.schema.jsonc", "Output": "Deploy-Nodeware.ps1", "Source": "https://downloads.nodeware.com/deploy/agent-deploy.ps1", "Patches": [ From cd63fb50570d8eccb3061b98ce7281f603a64de1 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 1 Nov 2024 18:31:45 +1100 Subject: [PATCH 221/341] test(Compiler): Add unit tests for Program and enhance test utilities --- tests/Compiler/AstHelper.cs | 1 + tests/Compiler/Compiler.cs | 17 +++++++- tests/Compiler/Program.cs | 79 +++++++++++++++++++++++++++++++++++++ tests/Compiler/Utils.cs | 51 ++++++++++++++++++++---- 4 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 tests/Compiler/Program.cs diff --git a/tests/Compiler/AstHelper.cs b/tests/Compiler/AstHelper.cs index 4e0d9438..76ba7b20 100644 --- a/tests/Compiler/AstHelper.cs +++ b/tests/Compiler/AstHelper.cs @@ -11,6 +11,7 @@ namespace Compiler.Test; +[TestFixture] public class AstHelperTests { [TestCaseSource(typeof(TestData.ChildAndRoot), nameof(TestData.ChildAndRoot.Data))] public void FindRoot_ReturnsRootAst( diff --git a/tests/Compiler/Compiler.cs b/tests/Compiler/Compiler.cs index facdbf9d..d3e3d2ad 100644 --- a/tests/Compiler/Compiler.cs +++ b/tests/Compiler/Compiler.cs @@ -1,7 +1,9 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Collections.Concurrent; using Compiler; +using Microsoft.CodeAnalysis.CSharp.Syntax; [SetUpFixture] [System.Diagnostics.CodeAnalysis.SuppressMessage( @@ -9,9 +11,22 @@ "CA1050:Declare types in namespaces", Justification = "Required for NUnit to run no matter the namespace." )] -public class GlobalSetup { +public sealed class GlobalSetup { + public static ConcurrentBag RequiresCleanup { get; } = []; + [OneTimeSetUp] public static void Setup() => Program.SetupLogger(new Program.Options() { Verbosity = 3 }); + + [OneTimeTearDown] + public static void Teardown() { + foreach (var file in RequiresCleanup) { + if (Directory.Exists(file)) { + Directory.Delete(file, true); + } else if (File.Exists(file)) { + File.Delete(file); + } + } + } } diff --git a/tests/Compiler/Program.cs b/tests/Compiler/Program.cs new file mode 100644 index 00000000..9043b86c --- /dev/null +++ b/tests/Compiler/Program.cs @@ -0,0 +1,79 @@ +// Copyright (c) James Draycott. All Rights Reserved. +// Licensed under the GPL3 License, See LICENSE in the project root for license information. + +using System.Globalization; +using System.Text; + +namespace Compiler.Test; + +[TestFixture] +public class ProgramTests { + [Test, Parallelizable] + public void GetFilesToCompile( + [Values(1, 10, 100)] int numberOfFiles, + [Values(0, 1, 10)] int nestedLevel, + [Values(false, true)] bool includeSomeIgnoredFiles + ) { + var (rootPath, files) = TestData.GenerateTestFiles(numberOfFiles, nestedLevel, includeSomeIgnoredFiles); + var result = Program.GetFilesToCompile(rootPath).Unwrap(); + + Assert.That(result, Is.EquivalentTo(files)); + } + + [Test, Parallelizable, Repeat(10)] + public void EnsureDirectoryStructure( + [Values(1, 10, 100)] int numberOfFiles, + [Values(0, 1, 10)] int nestedLevel + ) { + var (rootPath, files) = TestData.GenerateTestFiles(numberOfFiles, nestedLevel, false); + var outputPath = TestUtils.GenerateUniqueDirectory(); + Program.EnsureDirectoryStructure(rootPath, outputPath, files); + + foreach (var file in files) { + var expectedPath = file.Replace(rootPath, outputPath); + Assert.That(Directory.Exists(Directory.GetParent(expectedPath)!.FullName), Is.True); + } + } +} + +file static class TestData { + public static ValueTuple GenerateTestFiles(int numberofFiles, int nestedLevel, bool includeSomeIgnoredFiles) { + var random = TestContext.CurrentContext.Random; + var rootPath = TestUtils.GenerateUniqueDirectory(); + Directory.CreateDirectory(rootPath); + + var expectedFiles = new List(); + var filesPerLevel = new Dictionary(); + for (var i = 0; i < numberofFiles; i++) { + var level = random.Next(0, nestedLevel + 1); + if (filesPerLevel.TryGetValue(level, out var levelCount)) { + filesPerLevel[level] = 0; + } + + filesPerLevel[level] = levelCount + 1; + } + + var lastLevel = rootPath; + for (var i = 0; i < nestedLevel || (nestedLevel == 0 && i == 0); i++) { + var levelPath = lastLevel = TestUtils.GenerateUniqueDirectory(lastLevel, true); + + if (!filesPerLevel.TryGetValue(i, out var filesAtLevel)) continue; + for (var j = 0; j < filesAtLevel; j++) { + var filePath = TestUtils.GenerateUniqueFile(levelPath, ".ps1", false); + var text = new StringBuilder(); + + // Always add an ignored if there aren't any incase there is only one file. + if (includeSomeIgnoredFiles && random.Next(0, 2) == 0) { + text.AppendLine("#!ignore"); + } else { + expectedFiles.Add(filePath); + } + + text.Append(CultureInfo.InvariantCulture, $"""Write-Host "Hello World from {filePath}"""); + File.WriteAllText(filePath, text.ToString()); + } + } + + return (rootPath, expectedFiles.ToArray()); + } +} diff --git a/tests/Compiler/Utils.cs b/tests/Compiler/Utils.cs index eba5465a..32de74bd 100644 --- a/tests/Compiler/Utils.cs +++ b/tests/Compiler/Utils.cs @@ -9,8 +9,8 @@ namespace Compiler.Test; public class TestUtils { public static PathedModuleSpec GetModuleSpecFromContent(string content) { - var sourceRoot = TestContext.CurrentContext.WorkDirectory; - var tempFile = Path.GetFullPath($"{sourceRoot}/{TestContext.CurrentContext.Random.GetString(6)}.ps1"); + var sourceRoot = GenerateUniqueDirectory(); + var tempFile = GenerateUniqueFile(sourceRoot, ".ps1"); File.WriteAllText(tempFile, content); return new PathedModuleSpec(sourceRoot, tempFile); @@ -32,16 +32,13 @@ private static string CallerFilePath([CallerFilePath] string? callerFilePath = n public static (string, Tuple) GenerateTestSources(bool createFiles = true) { const int numberOfScripts = 2; - var random = TestContext.CurrentContext.Random; - var sourceRoot = Path.Combine(TestContext.CurrentContext.WorkDirectory, random.GetString(6)); + var sourceRoot = GenerateUniqueDirectory(); var testScripts = new string[numberOfScripts]; if (createFiles) Directory.CreateDirectory(sourceRoot); for (var i = 0; i < numberOfScripts; i++) { - var path = Path.GetFullPath($"{sourceRoot}/{random.GetString(6)}.ps1"); - if (createFiles) File.Create(path).Close(); - testScripts[i] = path; + testScripts[i] = GenerateUniqueFile(sourceRoot, ".ps1", createFiles); } return (sourceRoot, new(testScripts[0], testScripts[1])); @@ -59,4 +56,44 @@ public static (ResolvableLocalModule, ResolvableLocalModule) GetRandomModules(bo return (moduleOne, moduleTwo); } + + /// + /// Generate a unique directory inside the supplied parent. + /// + /// The parent directory to create the unique directory inside, or the current test context directory if null + /// The path of the generated directory. + /// + /// The directory is created and added to the cleanup list to be deleted after the test run. + /// + public static string GenerateUniqueDirectory(string? parent = null, bool createDirectory = true) { + var random = TestContext.CurrentContext.Random; + var root = parent ?? TestContext.CurrentContext.WorkDirectory; + string uniqueDirectory; + do { + uniqueDirectory = Path.Combine(root, random.GetString(6)); + } while (Directory.Exists(uniqueDirectory)); + + if (createDirectory) Directory.CreateDirectory(uniqueDirectory); + GlobalSetup.RequiresCleanup.Add(uniqueDirectory); + + return uniqueDirectory; + } + + /// + /// Generate a unique file inside the supplied parent. + /// + /// The parent directory to create the unique file inside, or the current test context directory if null + /// The path of the generated file. + public static string GenerateUniqueFile(string? parent = null, string extension = ".ps1", bool createFile = true) { + var random = TestContext.CurrentContext.Random; + var root = parent ?? GenerateUniqueDirectory(); + string uniqueFile; + do { + uniqueFile = Path.Combine(root, $"{random.GetString(6)}{extension}"); + } while (File.Exists(uniqueFile)); + + if (createFile) File.Create(uniqueFile).Close(); + + return uniqueFile; + } } From 3bdfc13de55ea46936d018c5bfee339f0561c95e Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 5 Nov 2024 11:00:23 +1100 Subject: [PATCH 222/341] refactor(Compiler): Handle issues with input better & tests --- src/Compiler/Errors.cs | 11 +++++++++++ src/Compiler/Program.cs | 3 ++- tests/Compiler/Program.cs | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/Compiler/Errors.cs b/src/Compiler/Errors.cs index 6fb23995..0a3efc76 100644 --- a/src/Compiler/Errors.cs +++ b/src/Compiler/Errors.cs @@ -193,6 +193,17 @@ public virtual bool Equals(WrappedErrorWithDebuggableContent? other) { public override int GetHashCode() => HashCode.Combine(this.Content, this.InnerException, this.Module); } +public sealed record InvalidInputError : Exceptional { + private InvalidInputError(string message) : base(message, 623) { } + + public static InvalidInputError InvalidFileType( + string inputPath, + string expectedExtension + ) => new($"The file {inputPath} is not a {expectedExtension} file"); + + public static InvalidInputError NonExistent(string inputPath) => new($"The path {inputPath} does not exist"); +} + public static class ErrorUtils { public static T Enrich( this T error, diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index aa702d3a..45d3df87 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -255,13 +255,14 @@ public static string GetOutputLocation( public static Fin> GetFilesToCompile(string input) { var files = new List(); if (File.Exists(input)) { + if (!input.EndsWith(".ps1", StringComparison.OrdinalIgnoreCase)) return InvalidInputError.InvalidFileType(input, ".ps1"); files.Add(input); } else if (Directory.Exists(input)) { foreach (var file in Directory.EnumerateFiles(input, "*.ps1", SearchOption.AllDirectories)) { files.Add(file); } } else { - return LanguageExt.Common.Error.New($"Input {input} is not a file or directory."); + return LanguageExt.Common.Error.New(new FileNotFoundException($"Input {input} is not a file or directory")); } files.RemoveAll(static file => { diff --git a/tests/Compiler/Program.cs b/tests/Compiler/Program.cs index 9043b86c..b6cc5a1e 100644 --- a/tests/Compiler/Program.cs +++ b/tests/Compiler/Program.cs @@ -10,7 +10,7 @@ namespace Compiler.Test; public class ProgramTests { [Test, Parallelizable] public void GetFilesToCompile( - [Values(1, 10, 100)] int numberOfFiles, + [Values(0, 1, 10, 100)] int numberOfFiles, [Values(0, 1, 10)] int nestedLevel, [Values(false, true)] bool includeSomeIgnoredFiles ) { @@ -18,11 +18,41 @@ public void GetFilesToCompile( var result = Program.GetFilesToCompile(rootPath).Unwrap(); Assert.That(result, Is.EquivalentTo(files)); + + if (numberOfFiles == 0) { + Assert.That(result, Is.Empty); + } + } + + [Test] + public void GetFilesToCompile_ErrorOnNonExistingPath() { + var path = TestUtils.GenerateUniqueDirectory(null, false); + var result = Program.GetFilesToCompile(path); + + Assert.That(result.IsFail, Is.True); + Assert.Multiple(() => { + var exception = result.UnwrapError(); + Assert.That(exception.Message, Does.Contain(path)); + Assert.That(exception.Is(), Is.True); + }); + } + + [Test] + public void GetFilesToCompile_ErrorOnIncorrectFileType() { + var path = TestUtils.GenerateUniqueFile(null, ".psm1", true); + var result = Program.GetFilesToCompile(path); + + Assert.That(result.IsFail, Is.True); + Assert.Multiple(() => { + var exception = result.UnwrapError(); + Assert.That(exception.Message, Does.Contain(path)); + Assert.That(exception, Is.InstanceOf()); + }); } [Test, Parallelizable, Repeat(10)] public void EnsureDirectoryStructure( - [Values(1, 10, 100)] int numberOfFiles, + [Values(0, 1, 10, 100)] int numberOfFiles, [Values(0, 1, 10)] int nestedLevel ) { var (rootPath, files) = TestData.GenerateTestFiles(numberOfFiles, nestedLevel, false); @@ -33,6 +63,10 @@ public void EnsureDirectoryStructure( var expectedPath = file.Replace(rootPath, outputPath); Assert.That(Directory.Exists(Directory.GetParent(expectedPath)!.FullName), Is.True); } + + if (numberOfFiles == 0) { + Assert.That(Directory.GetFiles(outputPath), Is.Empty); + } } } From 9d57ed907835ca10a882fdb305332758874536f6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 7 Nov 2024 18:55:42 +1100 Subject: [PATCH 223/341] fix: Fix crash while outputting file and implement additional tests --- src/Compiler/Program.cs | 10 +++-- tests/Compiler/Program.cs | 94 +++++++++++++++++++++++++++++++++++++++ tests/Compiler/Utils.cs | 10 ++++- 3 files changed, 109 insertions(+), 5 deletions(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 45d3df87..90cff826 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -306,16 +306,17 @@ public static async void Output( string? outputDirectory, string fileName, string content, - bool overwrite) { + bool forceOverwrite + ) { if (string.IsNullOrWhiteSpace(outputDirectory)) { // Output to console to allow for piping - Console.OpenStandardOutput().Write(Encoding.UTF8.GetBytes(content)); + Console.Out.Write(content); return; } var outputPath = GetOutputLocation(sourceDirectory, outputDirectory, fileName); if (File.Exists(outputPath)) { - var removeFile = overwrite; + var removeFile = forceOverwrite; if (!removeFile) { Logger.Info($"File {outputPath} already exists. Overwrite? (Y/n)"); var response = Console.ReadLine(); @@ -331,6 +332,9 @@ public static async void Output( Errors.Add(LanguageExt.Common.Error.New("Unable to delete file", (Exception)err)); return; } + } else { + Logger.Trace("Skipping file"); + return; } } diff --git a/tests/Compiler/Program.cs b/tests/Compiler/Program.cs index b6cc5a1e..d4a5a671 100644 --- a/tests/Compiler/Program.cs +++ b/tests/Compiler/Program.cs @@ -1,8 +1,10 @@ // Copyright (c) James Draycott. All Rights Reserved. // Licensed under the GPL3 License, See LICENSE in the project root for license information. +using System.Collections; using System.Globalization; using System.Text; +using Moq; namespace Compiler.Test; @@ -68,9 +70,101 @@ public void EnsureDirectoryStructure( Assert.That(Directory.GetFiles(outputPath), Is.Empty); } } + + [Test] + public void Output_ToFile( + [Values(false, true)] bool overwrite, + [Values("FooBar", null)] string? expectedContent = default + ) { + const string content = "Hello World"; + expectedContent ??= content; + + var sourceDirectory = TestUtils.GenerateUniqueDirectory(); + var outputDirectory = TestUtils.GenerateUniqueDirectory(); + var sourceFile = TestUtils.GenerateUniqueFile(sourceDirectory, ".ps1", true, content); + + var relativePath = Path.GetRelativePath(sourceDirectory, sourceFile); + var outputPath = Path.Combine(outputDirectory, relativePath); + + // Mock the input stream to always return 'n' for overwrite. + var inputStream = new Mock(); + inputStream.Setup(x => x.ReadLine()).Returns("n"); + Console.SetIn(inputStream.Object); + + Program.EnsureDirectoryStructure(sourceDirectory, outputDirectory, [sourceFile]); + Program.Output(sourceDirectory, outputDirectory, sourceFile, content, overwrite); + Program.Output(sourceDirectory, outputDirectory, sourceFile, expectedContent, overwrite); + + Assert.Multiple(() => { + Assert.That(File.Exists(outputPath), Is.True); + Assert.That(File.ReadAllText(outputPath), Is.EqualTo(overwrite ? expectedContent : content)); + }); + } + + [Test] + public void Output_ToFileOverwrites() { + const string content = "Hello World"; + var sourceDirectory = TestUtils.GenerateUniqueDirectory(); + var outputDirectory = TestUtils.GenerateUniqueDirectory(); + var sourceFile = TestUtils.GenerateUniqueFile(sourceDirectory, ".ps1", true, content); + + var relativePath = Path.GetRelativePath(sourceDirectory, sourceFile); + var outputPath = Path.Combine(outputDirectory, relativePath); + + // Mock the input stream to always return 'y' for overwrite. + var inputStream = new Mock(); + inputStream.Setup(x => x.ReadLine()).Returns("y"); + Console.SetIn(inputStream.Object); + + Program.EnsureDirectoryStructure(sourceDirectory, outputDirectory, [sourceFile]); + Program.Output(sourceDirectory, outputDirectory, sourceFile, "FooBar", true); + Program.Output(sourceDirectory, outputDirectory, sourceFile, content, false); + + Assert.Multiple(() => { + Assert.That(File.Exists(outputPath), Is.True); + Assert.That(File.ReadAllText(outputPath), Is.EqualTo(content)); + }); + } + + [Test] + public void Output_ToConsole() { + const string content = "Hello World"; + var sourceDirectory = TestUtils.GenerateUniqueDirectory(); + var sourceFile = TestUtils.GenerateUniqueFile(sourceDirectory, ".ps1", true); + + var writer = new StringWriter(); + Console.SetOut(writer); + + Program.Output(sourceDirectory, null, sourceFile, content, false); + Assert.That(writer.ToString(), Is.EqualTo(content)); + } } file static class TestData { + public static IEnumerable OutputData { + get { + var sourceDirectory = TestUtils.GenerateUniqueDirectory(); + var outputDirectory = TestUtils.GenerateUniqueDirectory(); + var sourceFile = TestUtils.GenerateUniqueFile(sourceDirectory, ".ps1", true); + + yield return new TestCaseData(sourceDirectory, null, sourceFile, false) + .SetDescription("Output to console"); + + yield return new TestCaseData(sourceDirectory, outputDirectory, sourceFile, false) + .SetDescription("Output to file without overwrite"); + + + var outputFile = Path.Combine(outputDirectory, Path.GetRelativePath(sourceDirectory, sourceFile)); + File.WriteAllText(outputFile, "Foo Bar"); + + yield return new TestCaseData(sourceDirectory, outputDirectory, sourceFile, false, "Foo Bar") + .SetDescription("Output to file without overwrite"); + + yield return new TestCaseData(sourceDirectory, outputDirectory, sourceFile, true) + .SetDescription("Output to file with overwrite"); + } + } + public static ValueTuple GenerateTestFiles(int numberofFiles, int nestedLevel, bool includeSomeIgnoredFiles) { var random = TestContext.CurrentContext.Random; var rootPath = TestUtils.GenerateUniqueDirectory(); diff --git a/tests/Compiler/Utils.cs b/tests/Compiler/Utils.cs index 32de74bd..3d1b190a 100644 --- a/tests/Compiler/Utils.cs +++ b/tests/Compiler/Utils.cs @@ -84,7 +84,7 @@ public static string GenerateUniqueDirectory(string? parent = null, bool createD /// /// The parent directory to create the unique file inside, or the current test context directory if null /// The path of the generated file. - public static string GenerateUniqueFile(string? parent = null, string extension = ".ps1", bool createFile = true) { + public static string GenerateUniqueFile(string? parent = null, string extension = ".ps1", bool createFile = true, string? content = default) { var random = TestContext.CurrentContext.Random; var root = parent ?? GenerateUniqueDirectory(); string uniqueFile; @@ -92,7 +92,13 @@ public static string GenerateUniqueFile(string? parent = null, string extension uniqueFile = Path.Combine(root, $"{random.GetString(6)}{extension}"); } while (File.Exists(uniqueFile)); - if (createFile) File.Create(uniqueFile).Close(); + if (createFile) { + if (content is not null) { + File.WriteAllText(uniqueFile, content); + } else { + File.Create(uniqueFile).Close(); + } + } return uniqueFile; } From 94aa82237c0d55ac2a1b2016569a2e09f0735659 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 28 Jan 2025 08:52:01 +1100 Subject: [PATCH 224/341] chore: Update share link --- other/sentinel_rogue_repair.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other/sentinel_rogue_repair.ps1 b/other/sentinel_rogue_repair.ps1 index 597a27e1..793a84e9 100644 --- a/other/sentinel_rogue_repair.ps1 +++ b/other/sentinel_rogue_repair.ps1 @@ -135,7 +135,7 @@ function Get-SentinelInstaller { # TODO: Get the latest installer from the API instead of hardcoding try { Write-Host "Downloading SentinelOne installer..." - $Url = "https://nextcloud.racci.dev/s/MPsaSBsJDfQb6fX/download/SentinelOneInstaller_windows_64bit_v23_1_4_650.exe" + $Url = "https://nextcloud.racci.dev/s/nd7TsNG4FzTen9d/download/SentinelOneInstaller_windows_64bit_v23_1_4_650.exe" Invoke-WebRequest -Uri $Url -OutFile $Installer -UseBasicParsing -ErrorAction Stop } catch { Write-Host "Failed to download SentinelOne installer!" -ForegroundColor Red From 021b8cab03fca3a378d30008c55a16419ca8f08c Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 28 Jan 2025 14:29:21 +1100 Subject: [PATCH 225/341] fix(Environment): Remove unused logging parameters from Invoke-RunMain function --- src/common/Environment.psm1 | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/common/Environment.psm1 b/src/common/Environment.psm1 index 639cea5f..819ffba3 100644 --- a/src/common/Environment.psm1 +++ b/src/common/Environment.psm1 @@ -80,8 +80,8 @@ function Invoke-Setup { $PSDefaultParameterValues['*:ErrorAction'] = 'Stop'; $PSDefaultParameterValues['*:WarningAction'] = 'Continue'; $PSDefaultParameterValues['*:InformationAction'] = 'Continue'; - $PSDefaultParameterValues['*:Verbose'] = $Logging.Verbose; - $PSDefaultParameterValues['*:Debug'] = $Logging.Debug; + $PSDefaultParameterValues['*:Verbose'] = $VerbosePreference; + $PSDefaultParameterValues['*:Debug'] = $DebugPreference; $Global:ErrorActionPreference = 'Stop'; } @@ -151,12 +151,6 @@ function Invoke-RunMain { begin { # If the script is being restarted, we have already done this. if (-not $Script:ScriptRestarted) { - foreach ($Local:Param in @('Verbose', 'Debug')) { - if ($Cmdlet.MyInvocation.BoundParameters.ContainsKey($Local:Param)) { - $Logging[$Local:Param] = $Cmdlet.MyInvocation.BoundParameters[$Local:Param]; - } - } - if (-not $HideDisclaimer) { Invoke-Info -UnicodePrefix '⚠️' -Message 'Disclaimer: This script is provided as is, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. In no event shall the author or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the script or the use or other dealings in the script.'; } @@ -251,9 +245,7 @@ function Invoke-RunMain { -Cmdlet $Cmdlet ` -Main $Main ` -DontImport:$DontImport ` - -HideDisclaimer:($HideDisclaimer -or $False) ` - -Verbose:(Get-OrFalse $Cmdlet.MyInvocation.BoundParameters 'Verbose') ` - -Debug:(Get-OrFalse $Cmdlet.MyInvocation.BoundParameters 'Debug'); + -HideDisclaimer:($HideDisclaimer -or $False); } Export-ModuleMember -Function Invoke-RunMain, Test-IsNableRunner -Variable ScriptRestarted, ScriptRestarting; From ad0d4b68796fa1cbf3e6d2a7d362964e51de8b41 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 28 Jan 2025 14:33:48 +1100 Subject: [PATCH 226/341] feat(Environment): Introduce Invoke-BlockWrapper for better script block handling and refactor Invoke-RunMain This fixes reporting the wrapping error from Invoking the script block. Adds a new ImportAction parameter that is run if the script is imported as a module. Fixes the detection of import vs being ran. --- src/common/Environment.psm1 | 137 +++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 63 deletions(-) diff --git a/src/common/Environment.psm1 b/src/common/Environment.psm1 index 819ffba3..8a4f7d17 100644 --- a/src/common/Environment.psm1 +++ b/src/common/Environment.psm1 @@ -34,41 +34,6 @@ function Get-OrFalse { } } -function Test-ExplicitlyCalled { - Param( - [Parameter(Mandatory)] - [ValidateNotNull()] - [System.Management.Automation.InvocationInfo]$Invocation - ) - - process { - # $Global:PSCallStack = Get-PSCallStack; - - # Being ran from terminal - # CommandOrigin: Runspace - # InvocationName: relative path to script name - if ($Invocation.CommandOrigin -eq 'Runspace' -and ($Invocation.InvocationName | Split-Path -Leaf) -eq $Invocation.MyCommand.Name) { - return $True; - } - - # Being imported - # CommandOrigin: Internal - # - - - # if ($Invocation.MyCommand.CommandType -eq 'Script') { - # Write-Host 'The script is being run directly from the terminal.' - # } elseif ($null -ne $Invocation.MyCommand.Module) { - # Write-Host 'The script has been imported using Import-Module.' - # } elseif ($Invocation.MyCommand.CommandType -eq 'Script' -or $Invocation.MyCommand.CommandType -eq 'ExternalScript') { - # Write-Host 'The script is being run from within another script.' - # } else { - # Write-Host 'The script context is unclear.' - # } - return $True; - } -} - function Test-IsNableRunner { $WindowName = $Host.UI.RawUI.WindowTitle; if (-not $WindowName) { return $False; }; @@ -94,6 +59,52 @@ function Invoke-Teardown { $PSDefaultParameterValues.Remove('*:Debug'); } +<# +.DESCRIPTION + Wrapper function to invoke a script block with the context of a cmdlet. + + This also handles the output and errors of the script block, + ensuring they are treated as if they were executed in the context of the cmdlet. + +.PARAMETER Cmdlet + The PSCmdlet object that is invoking the script block. + +.PARAMETER ScriptBlock + The script block to be invoked in the context of the cmdlet. +#> +function Invoke-BlockWrapper { + [CmdletBinding()] + Param( + [Parameter(Mandatory)] + [System.Management.Automation.Cmdlet]$Cmdlet, + + [Parameter(Mandatory)] + [ScriptBlock]$ScriptBlock + ) + + process { + $Result = $Cmdlet.InvokeCommand.InvokeScript( + $Cmdlet.SessionState, + $Main, + [System.Management.Automation.Runspaces.PipelineResultTypes]::All, + $Cmdlet.MyInvocation.BoundParameters + ); + + if ($Cmdlet.InvokeCommand.HasErrors) { + Invoke-Verbose 'Throwing error from wrapped script block!'; + $Error.RemoveAt(-0); + # FIXME - Throw all errors. + $PSCmdlet.ThrowTerminatingError($Cmdlet.InvokeCommand.Streams.Error[0]); + } + + + if ($Result.Count -gt 0) { + Invoke-Verbose 'Writing output from main function.'; + $Result | ForEach-Object { Write-Output $_; } + } + } +} + <# .SYNOPSIS Runs the main function of a script while ensuring that all common modules have been imported. @@ -103,44 +114,56 @@ function Invoke-Teardown { It will ensure that all common modules have been imported, and then invoke the main function of the script. This function will automatically clone the repo if required, otherwise try and find the repo on the local machine. -.PARAMETER Invocation - The InvocationInfo object of the script. +.PARAMETER Cmdlet + The PSCmdlet object that is invoking the script. + This is used to determine if the script is being run directly or imported, as well as enrich the environment with the calling context. .PARAMETER Main The main function of the script, which will be invoked only if the script is being run directly. If the script is being imported, this function will not be invoked. + +.PARAMETER ImportAction + An optional script block that will be invoked if the script is being imported. + This is useful for scripts that need to perform some action when imported, but not when run directly. #> function Invoke-RunMain { Param( + # If this ends up being null then the script is being imported. [Parameter(Mandatory)] - [ValidateNotNull()] + [AllowNull()] [System.Management.Automation.PSCmdlet]$Cmdlet, [Parameter(Mandatory)] [ValidateNotNull()] [ScriptBlock]$Main, + [Parameter()] + [ScriptBlock]$ImportAction, + [Parameter(DontShow)] [Switch]$NotStrict = $False, [Parameter(DontShow)] - [Switch]$DontImport = (-not (Test-ExplicitlyCalled -Invocation:$Cmdlet.MyInvocation)), + [Switch]$DontImport = $False, [Parameter(DontShow)] - [Switch]$HideDisclaimer = ($DontImport -or (Test-IsNableRunner)) + [Switch]$HideDisclaimer = ($DontImport -or (Test-IsNableRunner) -or $null -eq $Cmdlet) ) # Workaround for embedding modules in a script, can't use Invoke if a scriptblock contains begin/process/clean blocks function Invoke-Inner { Param( [Parameter(Mandatory)] - [ValidateNotNull()] + [AllowNull()] [System.Management.Automation.PSCmdlet]$Cmdlet, [Parameter(Mandatory)] [ValidateNotNull()] [ScriptBlock]$Main, + [Parameter()] + [ScriptBlock]$ImportAction, + [Parameter(DontShow)] [Switch]$DontImport, @@ -166,44 +189,32 @@ function Invoke-RunMain { process { try { - # FIXME :: it's not working as expected, currently not executing if ran from within a script. - if (Test-ExplicitlyCalled -Invocation:$Cmdlet.MyInvocation) { + if ($null -ne $Cmdlet) { Invoke-Verbose -UnicodePrefix '🚀' -Message 'Running main function.'; + Invoke-BlockWrapper -Cmdlet $Cmdlet -ScriptBlock $Main; + Invoke-Info 'Main function finished successfully.'; + } else { + Invoke-Verbose -UnicodePrefix '📦' -Message 'Script is being imported, skipping main function.'; - $Result = $Cmdlet.InvokeCommand.InvokeScript( - $Cmdlet.SessionState, - $Main, - [System.Management.Automation.Runspaces.PipelineResultTypes]::All, - $Cmdlet.MyInvocation.BoundParameters - ); - - if ($Cmdlet.InvokeCommand.HasErrors) { - Invoke-Info 'Throwing error from main function.'; - throw $Cmdlet.InvokeCommand.Streams.Error[0]; - } - - if ($Result.Count -gt 0) { - Invoke-Info 'Writing output from main function.'; - $Result | ForEach-Object { Write-Output $_; } + if ($ImportAction) { + Invoke-Verbose -UnicodePrefix '📦' -Message 'Running import action.'; + Invoke-BlockWrapper -Cmdlet $Cmdlet -ScriptBlock $ImportAction; + Invoke-Info 'Import action finished successfully.'; } - - Invoke-Info 'Main function finished successfully.'; } } catch [System.Management.Automation.ParseException] { Invoke-Error 'Unable to execute script due to a parse error.'; Invoke-FailedExit -ExitCode 9998 -ErrorRecord $_ -DontExit; } catch [System.Management.Automation.RuntimeException] { - $CatchingError = $_.Exception.ErrorRecord; + $CatchingError = $_.Exception.InnerException.ErrorRecord; switch ($CatchingError.FullyQualifiedErrorId) { 'QuickExit' { Invoke-Verbose -UnicodePrefix '✅' -Message 'Main function finished successfully.'; } - # TODO - Remove the error from the record. 'FailedExit' { [Int]$Local:ExitCode = $CatchingError.TargetObject; Invoke-Verbose -Message "Script exited with an error code of $Local:ExitCode."; $LASTEXITCODE = $Local:ExitCode; - $Error.RemoveAt(0); } 'RestartScript' { $Script:ScriptRestarting = $True; From b74a9a5b8b56e4eb678e8a8e4bb0a8ab30ae28b2 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 28 Jan 2025 14:34:16 +1100 Subject: [PATCH 227/341] refactor(Logging): Simplify logging preference checks and enhance parameter handling --- src/common/Logging.psm1 | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/common/Logging.psm1 b/src/common/Logging.psm1 index 716de330..6c7dc2d7 100644 --- a/src/common/Logging.psm1 +++ b/src/common/Logging.psm1 @@ -4,14 +4,6 @@ Using module @{ ModuleVersion = '2.3.2'; } -[HashTable]$Script:Logging = @{ - Error = $True; - Warning = $True; - Information = $True; - Verbose = $VerbosePreference -ne 'SilentlyContinue'; - Debug = $DebugPreference -ne 'SilentlyContinue'; -}; - function Test-IsNableRunner { $WindowName = $Host.UI.RawUI.WindowTitle; if (-not $WindowName) { return $False; }; @@ -183,7 +175,7 @@ function Invoke-Verbose { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '🔍' }; PSMessage = $Message; PSColour = 'Yellow'; - ShouldWrite = $Script:Logging.Verbose; + ShouldWrite = $VerbosePreference -ne 'SilentlyContinue'; PassThru = $PassThru; }; @@ -220,7 +212,7 @@ function Invoke-Debug { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '🐛' }; PSMessage = $Message; PSColour = 'Magenta'; - ShouldWrite = $Script:Logging.Debug; + ShouldWrite = $DebugPreference -ne 'SilentlyContinue'; PassThru = $PassThru; }; @@ -257,7 +249,7 @@ function Invoke-Info { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { 'ℹ️' }; PSMessage = $Message; PSColour = 'Cyan'; - ShouldWrite = $Script:Logging.Information; + ShouldWrite = $InformationPreference -ne 'Ignore'; PassThru = $PassThru; }; @@ -278,7 +270,10 @@ function Invoke-Warn { [Parameter(ParameterSetName = 'Splat', Position = 1, ValueFromPipelineByPropertyName, HelpMessage = 'The Unicode Prefix to use if the terminal supports Unicode.')] [ValidateNotNullOrEmpty()] [Alias('Prefix')] - [String]$UnicodePrefix + [String]$UnicodePrefix, + + [Parameter(HelpMessage = 'Return the formatted message instead of writing it to the console.')] + [Switch]$PassThru ) process { @@ -291,7 +286,8 @@ function Invoke-Warn { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '⚠️' }; PSMessage = $Message; PSColour = 'Yellow'; - ShouldWrite = $Script:Logging.Warning; + ShouldWrite = $WarningPreference -ne 'SilentlyContinue'; + PassThru = $PassThru; }; Invoke-Write @Local:Params; @@ -311,7 +307,10 @@ function Invoke-Error { [Parameter(ParameterSetName = 'Splat', Position = 1, ValueFromPipelineByPropertyName, HelpMessage = 'The Unicode Prefix to use if the terminal supports Unicode.')] [ValidateNotNullOrEmpty()] [Alias('Prefix')] - [String]$UnicodePrefix + [String]$UnicodePrefix, + + [Parameter(HelpMessage = 'Return the formatted message instead of writing it to the console.')] + [Switch]$PassThru ) process { @@ -324,7 +323,8 @@ function Invoke-Error { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '❌' }; PSMessage = $Message; PSColour = 'Red'; - ShouldWrite = $Script:Logging.Error; + ShouldWrite = $ErrorActionPreference -ne 'SilentlyContinue'; + PassThru = $PassThru; }; Invoke-Write @Local:Params; From 24b4b2ab14c3c61365132cf55b292d2ad392a4d6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 28 Jan 2025 14:34:45 +1100 Subject: [PATCH 228/341] fix(Connection): Improve null parameter handling and enhance context retrieval with error handling --- src/common/Connection.psm1 | 42 +++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/common/Connection.psm1 b/src/common/Connection.psm1 index cf599034..1b9779fd 100644 --- a/src/common/Connection.psm1 +++ b/src/common/Connection.psm1 @@ -24,9 +24,11 @@ function Local:Invoke-NonNullParams { end { Exit-Scope; } process { + $RemoveKeys = @(); $Params.GetEnumerator() | Where-Object { $null -eq $_.Value } | ForEach-Object { - $Params.Remove($_.Key); + $RemoveKeys = $RemoveKeys + $_.Key; } + $RemoveKeys | ForEach-Object { $Params.Remove($_); } Invoke-Debug "Invoking Expression '$FunctionName $($Params.GetEnumerator() | ForEach-Object { "-$($_.Key):$($_.Value)" })'"; & $FunctionName @Params; }; @@ -77,7 +79,13 @@ $Script:Services = @{ }; Graph = @{ Matchable = $True; - Context = { Get-MgContext | Select-Object -ExpandProperty Account; }; + Context = { + try { + Get-MgContext | Select-Object -ExpandProperty Account; + } catch { + $null; + } + }; Connect = { param($Scopes, $AccessToken) if ($AccessToken) { Connect-MgGraph -AccessToken:$AccessToken -NoWelcome; @@ -93,7 +101,11 @@ $Script:Services = @{ } } - if (-not (Get-MgContext)) { + try { + $Local:Context = Get-MgContext; + } catch { } + + if (-not $Local:Context) { Connect-MgGraph -Scopes:$Scopes -NoWelcome; } }; @@ -101,9 +113,9 @@ $Script:Services = @{ IsValid = { param([String[]]$Scopes) - $Local:Context = Get-MgContext; - - if ($null -eq $Local:Context) { + try { + $Local:Context = Get-MgContext; + } catch { return $False; } @@ -279,8 +291,8 @@ function Connect-Service( [String]$Local:Account; foreach ($Local:Service in $Services) { - [String]$Local:Context = try { - Get-ServiceContext -Service $Local:Service; + try { + [String]$Local:Context = Get-ServiceContext -Service $Local:Service; } catch { Invoke-Debug "Failed to get connection information for $Local:Service"; Format-Error -InvocationInfo $_.InvocationInfo; @@ -336,10 +348,16 @@ function Connect-Service( Invoke-FailedExit -ExitCode $Script:ERROR_COULDNT_CONNECT -FormatArgs @($Local:Service) -ErrorRecord $_; } - if ($Local:Account -and (Test-NotMatchableOrSameContext -ServiceA:$Local:Service -ServiceB:$Local:LastService)) { - Invoke-Warn 'Not all services are connected with the same account, please reconnect with the same account.'; - Disconnect-ServiceInternal -Service $Local:Service; - continue; + if ($Local:LastService) { + Invoke-Info 'Checking if all services are connected with the same account...'; + Invoke-Info "Service A: $Local:Service"; + Invoke-Info "Service B: $Local:LastService"; + + if ($Local:Account -and (Test-NotMatchableOrSameContext -ServiceA:$Local:Service -ServiceB:$Local:LastService)) { + Invoke-Warn 'Not all services are connected with the same account, please reconnect with the same account.'; + Disconnect-ServiceInternal -Service $Local:Service; + continue; + } } if (-not $Local:Account -and (Test-IsMatchable $Local:Service)) { From 65250e597a577c8cce3947772d6d9c7769558307 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 30 Jan 2025 14:22:34 +1100 Subject: [PATCH 229/341] fix(Environment): Actually execute the correct scriptblocks --- src/common/Environment.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Environment.psm1 b/src/common/Environment.psm1 index 8a4f7d17..f59e844d 100644 --- a/src/common/Environment.psm1 +++ b/src/common/Environment.psm1 @@ -85,7 +85,7 @@ function Invoke-BlockWrapper { process { $Result = $Cmdlet.InvokeCommand.InvokeScript( $Cmdlet.SessionState, - $Main, + $ScriptBlock, [System.Management.Automation.Runspaces.PipelineResultTypes]::All, $Cmdlet.MyInvocation.BoundParameters ); From 67543a22d5492df9191b80aa8efb1a5bd712354d Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 30 Jan 2025 15:09:31 +1100 Subject: [PATCH 230/341] fix: module imports for powershell 5.1. --- src/automation/Backup-BitLocker.ps1 | 8 ++++---- src/automation/Disable-AdobeUpdater.ps1 | 6 +++--- src/automation/Disable-FastStartup.ps1 | 6 +++--- src/automation/Invoke-Expression.ps1 | 4 ++-- src/automation/Invoke-PackageManager.ps1 | 10 +++++----- src/automation/Invoke-RebootNotice.ps1 | 10 +++++----- src/automation/Invoke-RemoteRunner.ps1 | 10 +++++----- src/automation/Remove-Administrators.ps1 | 14 ++++++------- src/automation/Set-Wallpaper.ps1 | 16 +++++++-------- src/automation/Uninstall-Applications.ps1 | 8 ++++---- src/common/Analyser.psm1 | 2 +- src/common/Assert.psm1 | 4 ++-- src/common/Connection.psm1 | 8 ++++---- src/common/Ensure.psm1 | 10 +++++----- src/common/Environment.psm1 | 6 +++--- src/common/Event.psm1 | 2 +- src/common/Exit.psm1 | 2 +- src/common/Flag.psm1 | 4 ++-- src/common/Input.psm1 | 8 ++++---- src/common/Logging.psm1 | 2 +- src/common/PackageManager.psm1 | 8 ++++---- src/common/Registry.psm1 | 5 +++-- src/common/Scope.psm1 | 2 +- src/common/Temp.psm1 | 2 +- src/common/UsersAndAccounts.psm1 | 6 +++--- src/common/Utils.psm1 | 8 ++++---- src/hudu/Common.psm1 | 10 +++++----- src/hudu/Database.ps1 | 10 +++++----- src/hudu/New-ExcelSheet.ps1 | 10 +++++----- src/hudu/Update-Entra-Integration.ps1 | 8 ++++---- src/hudu/Update-Links.ps1 | 8 ++++---- src/microsoft/Common.psm1 | 8 ++++---- src/microsoft/Security.ps1 | 6 +++--- src/microsoft/admin/Invoke-ForCustomer.ps1 | 14 ++++++------- src/microsoft/admin/Update-DKIM.ps1 | 6 +++--- src/microsoft/entra/Get-MFAChanges.ps1 | 16 +++++++-------- src/microsoft/entra/StaffLocation.ps1 | 8 ++++---- src/microsoft/intune/Setup.ps1 | 10 +++++----- src/microsoft/reports/Exchange.psm1 | 4 ++-- src/microsoft/security/Exchange.ps1 | 12 +++++------ src/microsoft/security/Retention.ps1 | 6 +++--- src/microsoft/security/SecureScore.ps1 | 6 +++--- src/microsoft/security/Setup-Alerts.ps1 | 10 +++++----- src/microsoft/windows/AutoSetup.ps1 | 20 +++++++++---------- src/microsoft/windows/Invoke-Downloadable.ps1 | 10 +++++----- src/microsoft/windows/Setup-Printer.ps1 | 12 +++++------ src/microsoft/windows/Setup-Wireguard.ps1 | 16 +++++++-------- src/misc/Export-KaseyaQuotes.ps1 | 10 +++++----- src/misc/Setup-SecretManagement.ps1 | 8 ++++---- src/n-sight/Get-InstalledSoftware.ps1 | 10 +++++----- src/n-sight/Invoke-EnvTest.ps1 | 4 ++-- 51 files changed, 207 insertions(+), 206 deletions(-) diff --git a/src/automation/Backup-BitLocker.ps1 b/src/automation/Backup-BitLocker.ps1 index bba967ce..7c45c7bc 100644 --- a/src/automation/Backup-BitLocker.ps1 +++ b/src/automation/Backup-BitLocker.ps1 @@ -1,9 +1,9 @@ #Requires -Version 5.1 -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Exit.psm1 -Using module ../common/Ensure.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Exit.psm1 +Using module ..\common\Ensure.psm1 Using namespace Microsoft.BitLocker.Structures diff --git a/src/automation/Disable-AdobeUpdater.ps1 b/src/automation/Disable-AdobeUpdater.ps1 index a6faf043..69795345 100644 --- a/src/automation/Disable-AdobeUpdater.ps1 +++ b/src/automation/Disable-AdobeUpdater.ps1 @@ -19,9 +19,9 @@ ``` #> -Using module ../common/Environment.psm1 -Using module ../common/Ensure.psm1 -Using module ../common/Registry.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Ensure.psm1 +Using module ..\common\Registry.psm1 [CmdletBinding()] param() diff --git a/src/automation/Disable-FastStartup.ps1 b/src/automation/Disable-FastStartup.ps1 index 012c7beb..8b190f0e 100644 --- a/src/automation/Disable-FastStartup.ps1 +++ b/src/automation/Disable-FastStartup.ps1 @@ -16,9 +16,9 @@ System, Windows, Power, Boot #> -Using module ../common/Environment.psm1 -Using module ../common/Ensure.psm1 -Using module ../common/Registry.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Ensure.psm1 +Using module ..\common\Registry.psm1 [CmdletBinding()] param() diff --git a/src/automation/Invoke-Expression.ps1 b/src/automation/Invoke-Expression.ps1 index de5becf5..dd8b81ae 100644 --- a/src/automation/Invoke-Expression.ps1 +++ b/src/automation/Invoke-Expression.ps1 @@ -1,5 +1,5 @@ -Using module ../common/Environment.psm1 -Using module ../common/Exit.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Exit.psm1 [CmdletBinding()] Param( diff --git a/src/automation/Invoke-PackageManager.ps1 b/src/automation/Invoke-PackageManager.ps1 index a0f2a64e..4c7b5128 100644 --- a/src/automation/Invoke-PackageManager.ps1 +++ b/src/automation/Invoke-PackageManager.ps1 @@ -1,8 +1,8 @@ -Using module ../common/Environment.psm1 -Using module ../common/Exit.psm1 -Using module ../common/Ensure.psm1 -Using module ../common/Logging.psm1 -Using module ../common/PackageManager.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Exit.psm1 +Using module ..\common\Ensure.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\PackageManager.psm1 [CmdletBinding(SupportsShouldProcess)] Param( diff --git a/src/automation/Invoke-RebootNotice.ps1 b/src/automation/Invoke-RebootNotice.ps1 index 4618d3cd..98592665 100644 --- a/src/automation/Invoke-RebootNotice.ps1 +++ b/src/automation/Invoke-RebootNotice.ps1 @@ -33,11 +33,11 @@ Runs the script with time windows from 7-9, 12-14, and 16-19. #> -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Scope.psm1 -Using module ../common/Flag.psm1 -Using module ../common/Exit.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\Flag.psm1 +Using module ..\common\Exit.psm1 using namespace System.Collections.Generic diff --git a/src/automation/Invoke-RemoteRunner.ps1 b/src/automation/Invoke-RemoteRunner.ps1 index 7354a295..e6ac3c99 100644 --- a/src/automation/Invoke-RemoteRunner.ps1 +++ b/src/automation/Invoke-RemoteRunner.ps1 @@ -1,10 +1,10 @@ #Requires -Version 5.1 -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Scope.psm1 -Using module ../common/Exit.psm1 -Using module ../common/Cache.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\Exit.psm1 +Using module ..\common\Cache.psm1 [CmdletBinding()] Param( diff --git a/src/automation/Remove-Administrators.ps1 b/src/automation/Remove-Administrators.ps1 index 43e1c122..83fef6d2 100644 --- a/src/automation/Remove-Administrators.ps1 +++ b/src/automation/Remove-Administrators.ps1 @@ -1,12 +1,12 @@ #Requires -Version 5.1 -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Exit.psm1 -Using module ../common/Ensure.psm1 -Using module ../common/Assert.psm1 -Using module ../common/Scope.psm1 -Using module ../common/UsersAndAccounts.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Exit.psm1 +Using module ..\common\Ensure.psm1 +Using module ..\common\Assert.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\UsersAndAccounts.psm1 [CmdletBinding()] Param( diff --git a/src/automation/Set-Wallpaper.ps1 b/src/automation/Set-Wallpaper.ps1 index 9d51b2ba..635e723c 100644 --- a/src/automation/Set-Wallpaper.ps1 +++ b/src/automation/Set-Wallpaper.ps1 @@ -1,11 +1,11 @@ -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Utils.psm1 -Using module ../common/Scope.psm1 -Using module ../common/Registry.psm1 -Using module ../common/Assert.psm1 -Using module ../common/Ensure.psm1 -Using module ../common/Exit.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Utils.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\Registry.psm1 +Using module ..\common\Assert.psm1 +Using module ..\common\Ensure.psm1 +Using module ..\common\Exit.psm1 Using module RunAsUser diff --git a/src/automation/Uninstall-Applications.ps1 b/src/automation/Uninstall-Applications.ps1 index 021c2bb9..7b57ce27 100644 --- a/src/automation/Uninstall-Applications.ps1 +++ b/src/automation/Uninstall-Applications.ps1 @@ -1,7 +1,7 @@ -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Utils.psm1 -Using module ../common/Analyser.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Utils.psm1 +Using module ..\common\Analyser.psm1 [CmdletBinding(SupportsShouldProcess)] param( diff --git a/src/common/Analyser.psm1 b/src/common/Analyser.psm1 index da196802..577b57fd 100644 --- a/src/common/Analyser.psm1 +++ b/src/common/Analyser.psm1 @@ -1,4 +1,4 @@ -Using module ./ModuleUtils.psm1 +Using module .\ModuleUtils.psm1 <# .SYNOPSIS diff --git a/src/common/Assert.psm1 b/src/common/Assert.psm1 index 4a853067..a40ba018 100644 --- a/src/common/Assert.psm1 +++ b/src/common/Assert.psm1 @@ -1,7 +1,7 @@ #Requires -Version 5.1 -Using module ./Logging.psm1 -Using module ./Exit.psm1 +Using module .\Logging.psm1 +Using module .\Exit.psm1 function Assert-NotNull( [Parameter(ValueFromPipeline)] diff --git a/src/common/Connection.psm1 b/src/common/Connection.psm1 index 1b9779fd..07b235b3 100644 --- a/src/common/Connection.psm1 +++ b/src/common/Connection.psm1 @@ -1,7 +1,7 @@ -Using module ./Logging.psm1 -Using module ./Scope.psm1 -Using module ./Exit.psm1 -Using module ./Input.psm1 +Using module .\Logging.psm1 +Using module .\Scope.psm1 +Using module .\Exit.psm1 +Using module .\Input.psm1 Using module Microsoft.Graph.Authentication Using module ExchangeOnlineManagement Using module AzureAD diff --git a/src/common/Ensure.psm1 b/src/common/Ensure.psm1 index 08812668..3bed2cef 100644 --- a/src/common/Ensure.psm1 +++ b/src/common/Ensure.psm1 @@ -1,8 +1,8 @@ -Using module ./Utils.psm1 -Using module ./Logging.psm1 -Using module ./Scope.psm1 -Using module ./Exit.psm1 -Using module ./Temp.psm1 +Using module .\Utils.psm1 +Using module .\Logging.psm1 +Using module .\Scope.psm1 +Using module .\Exit.psm1 +Using module .\Temp.psm1 Using module @{ ModuleName = 'Microsoft.PowerShell.PSResourceGet'; diff --git a/src/common/Environment.psm1 b/src/common/Environment.psm1 index f59e844d..9731a194 100644 --- a/src/common/Environment.psm1 +++ b/src/common/Environment.psm1 @@ -1,6 +1,6 @@ -Using module ./Utils.psm1 -Using module ./Logging.psm1 -Using module ./Exit.psm1 +Using module .\Utils.psm1 +Using module .\Logging.psm1 +Using module .\Exit.psm1 Using namespace System.Management.Automation.Language Using namespace System.Collections.Generic diff --git a/src/common/Event.psm1 b/src/common/Event.psm1 index c60d5b68..3bafeb36 100644 --- a/src/common/Event.psm1 +++ b/src/common/Event.psm1 @@ -1,4 +1,4 @@ -Using module ./ModuleUtils.psm1 +Using module .\ModuleUtils.psm1 [HashTable]$Script:Events = @{}; diff --git a/src/common/Exit.psm1 b/src/common/Exit.psm1 index 8187fdbb..1b8e5dc5 100644 --- a/src/common/Exit.psm1 +++ b/src/common/Exit.psm1 @@ -1,4 +1,4 @@ -Using module ./Logging.psm1 +Using module .\Logging.psm1 [HashTable]$Global:ExitHandlers = @{}; [HashTable]$Global:ExitCodes = @{}; diff --git a/src/common/Flag.psm1 b/src/common/Flag.psm1 index cc2f603e..ff3f256c 100644 --- a/src/common/Flag.psm1 +++ b/src/common/Flag.psm1 @@ -1,5 +1,5 @@ -Using module ./Logging.psm1 -Using module ./ModuleUtils.psm1 +Using module .\Logging.psm1 +Using module .\ModuleUtils.psm1 class Flag { [String][ValidateNotNull()]$Context; diff --git a/src/common/Input.psm1 b/src/common/Input.psm1 index 81113ec6..2967a9b9 100644 --- a/src/common/Input.psm1 +++ b/src/common/Input.psm1 @@ -1,7 +1,7 @@ -Using module ./Utils.psm1 -Using module ./Logging.psm1 -Using module ./Scope.psm1 -Using module ./Assert.psm1 +Using module .\Utils.psm1 +Using module .\Logging.psm1 +Using module .\Scope.psm1 +Using module .\Assert.psm1 Using module @{ ModuleName = 'PSReadLine'; diff --git a/src/common/Logging.psm1 b/src/common/Logging.psm1 index 6c7dc2d7..2c392df3 100644 --- a/src/common/Logging.psm1 +++ b/src/common/Logging.psm1 @@ -1,4 +1,4 @@ -Using module ./PSStyle.psm1 +Using module .\PSStyle.psm1 Using module @{ ModuleName = 'PSReadLine'; ModuleVersion = '2.3.2'; diff --git a/src/common/PackageManager.psm1 b/src/common/PackageManager.psm1 index 9b34343b..1da9b378 100644 --- a/src/common/PackageManager.psm1 +++ b/src/common/PackageManager.psm1 @@ -1,9 +1,9 @@ #Requires -Version 5.1 -Using module ./Logging.psm1 -Using module ./Scope.psm1 -Using module ./Exit.psm1 -Using module ./Utils.psm1 +Using module .\Logging.psm1 +Using module .\Scope.psm1 +Using module .\Exit.psm1 +Using module .\Utils.psm1 enum PackageManager { Chocolatey diff --git a/src/common/Registry.psm1 b/src/common/Registry.psm1 index 32a4a547..0813555b 100644 --- a/src/common/Registry.psm1 +++ b/src/common/Registry.psm1 @@ -1,5 +1,5 @@ -Using module ./Logging.psm1 -Using module ./Scope.psm1 +Using module .\Logging.psm1 +Using module .\Scope.psm1 function Invoke-EnsureRegistryPath { [CmdletBinding(SupportsShouldProcess)] @@ -106,6 +106,7 @@ function Set-RegistryKey { if ($PSCmdlet.ShouldProcess($Path, 'Set')) { Invoke-Verbose "Setting registry key '$Path' to '$Value'..."; Set-ItemProperty -Path $Path -Name $Key -Value $Value -Type $Kind; + [Microsoft.Win32.Registry]::SetValue($Path, $Key, $Value, $Kind); } } } diff --git a/src/common/Scope.psm1 b/src/common/Scope.psm1 index 85584dab..f6841792 100644 --- a/src/common/Scope.psm1 +++ b/src/common/Scope.psm1 @@ -1,6 +1,6 @@ #Requires -Version 5.1 -Using module ./Logging.psm1 +Using module .\Logging.psm1 [System.Collections.Stack]$Script:InvocationStack = [System.Collections.Stack]::new(); [String]$Script:Tab = ' '; diff --git a/src/common/Temp.psm1 b/src/common/Temp.psm1 index d632e940..b3a56b23 100644 --- a/src/common/Temp.psm1 +++ b/src/common/Temp.psm1 @@ -1,4 +1,4 @@ -Using module ./Logging.psm1 +Using module .\Logging.psm1 function Get-NamedTempFolder { Param( diff --git a/src/common/UsersAndAccounts.psm1 b/src/common/UsersAndAccounts.psm1 index c94bac19..ba118f14 100644 --- a/src/common/UsersAndAccounts.psm1 +++ b/src/common/UsersAndAccounts.psm1 @@ -1,8 +1,8 @@ #Requires -Version 5.1 -Using module ./Logging.psm1 -Using module ./Scope.psm1 -Using module ./Exit.psm1 +Using module .\Logging.psm1 +Using module .\Scope.psm1 +Using module .\Exit.psm1 #region - Caching diff --git a/src/common/Utils.psm1 b/src/common/Utils.psm1 index f0790c9d..26bf8346 100644 --- a/src/common/Utils.psm1 +++ b/src/common/Utils.psm1 @@ -1,6 +1,6 @@ -Using module ./Logging.psm1 -Using module ./Scope.psm1 -Using module ./Exit.psm1 +Using module .\Logging.psm1 +Using module .\Scope.psm1 +Using module .\Exit.psm1 <# .SYNOPSIS @@ -1037,5 +1037,5 @@ function Test-IsWindows11 { } Export-ModuleMember ` - -Function Test-IsWindows11, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Export-Types, Add-ModuleCallback, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag ` + -Function Test-IsWindows11, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag ` -Alias await, async, lazy; diff --git a/src/hudu/Common.psm1 b/src/hudu/Common.psm1 index 4ea9a632..66fa5e21 100644 --- a/src/hudu/Common.psm1 +++ b/src/hudu/Common.psm1 @@ -1,8 +1,8 @@ -Using module ../common/Logging.psm1 -Using module ../common/Scope.psm1 -Using module ../common/Input.psm1 -Using module ../common/Exit.psm1 -Using module ../common/Utils.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\Input.psm1 +Using module ..\common\Exit.psm1 +Using module ..\common\Utils.psm1 function Get-HuduApiKey { begin { Enter-Scope; } diff --git a/src/hudu/Database.ps1 b/src/hudu/Database.ps1 index 0a1d29d9..e9d4fe40 100644 --- a/src/hudu/Database.ps1 +++ b/src/hudu/Database.ps1 @@ -1,8 +1,8 @@ -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Input.psm1 -Using module ../common/Utils.psm1 -Using module ./Common.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Input.psm1 +Using module ..\common\Utils.psm1 +Using module .\Common.psm1 [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Update')] Param( diff --git a/src/hudu/New-ExcelSheet.ps1 b/src/hudu/New-ExcelSheet.ps1 index 7f5cb1ed..ff6bcdcb 100644 --- a/src/hudu/New-ExcelSheet.ps1 +++ b/src/hudu/New-ExcelSheet.ps1 @@ -1,10 +1,10 @@ #Requires -Version 5.1 -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Scope.psm1 -Using module ../common/Ensure.psm1 -Using module ./Common.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\Ensure.psm1 +Using module .\Common.psm1 Using module ImportExcel using namespace OfficeOpenXml diff --git a/src/hudu/Update-Entra-Integration.ps1 b/src/hudu/Update-Entra-Integration.ps1 index d93be728..7411be11 100644 --- a/src/hudu/Update-Entra-Integration.ps1 +++ b/src/hudu/Update-Entra-Integration.ps1 @@ -1,9 +1,9 @@ #Requires -Version 7.1 -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Input.psm1 -Using module ../common/Utils.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Input.psm1 +Using module ..\common\Utils.psm1 [CmdletBinding()] Param( diff --git a/src/hudu/Update-Links.ps1 b/src/hudu/Update-Links.ps1 index 241bb9d8..494eee4d 100644 --- a/src/hudu/Update-Links.ps1 +++ b/src/hudu/Update-Links.ps1 @@ -1,7 +1,7 @@ -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Scope.psm1 -Using module ./Common.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Scope.psm1 +Using module .\Common.psm1 <# .SYNOPSIS diff --git a/src/microsoft/Common.psm1 b/src/microsoft/Common.psm1 index 093b3dbd..ec47c6cb 100644 --- a/src/microsoft/Common.psm1 +++ b/src/microsoft/Common.psm1 @@ -1,7 +1,7 @@ -Using Module ../common/Logging.psm1 -Using Module ../common/Scope.psm1 -Using Module ../common/Connection.psm1 -Using Module ../common/Input.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\Connection.psm1 +Using module ..\common\Input.psm1 Using Module Microsoft.Graph.Authentication Using Module Microsoft.Graph.Identity.DirectoryManagement diff --git a/src/microsoft/Security.ps1 b/src/microsoft/Security.ps1 index 1e9b6c52..165732eb 100644 --- a/src/microsoft/Security.ps1 +++ b/src/microsoft/Security.ps1 @@ -1,6 +1,6 @@ -Using module ../common/Environment.psm1 -Using module ../common/Connection.psm1 -Using module ./Common.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Connection.psm1 +Using module .\Common.psm1 Using module Microsoft.Online.SharePoint.PowerShell Using module AzureAD diff --git a/src/microsoft/admin/Invoke-ForCustomer.ps1 b/src/microsoft/admin/Invoke-ForCustomer.ps1 index 981a5878..9d3d3bb9 100644 --- a/src/microsoft/admin/Invoke-ForCustomer.ps1 +++ b/src/microsoft/admin/Invoke-ForCustomer.ps1 @@ -1,10 +1,10 @@ -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Scope.psm1 -Using module ../../common/Input.psm1 -Using module ../../common/Utils.psm1 -Using module ../../common/Connection.psm1 -Using module ../../common/Exit.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Input.psm1 +Using module ..\..\common\Utils.psm1 +Using module ..\..\common\Connection.psm1 +Using module ..\..\common\Exit.psm1 Using module Microsoft.Graph.Authentication Using module Microsoft.Graph.Identity.DirectoryManagement diff --git a/src/microsoft/admin/Update-DKIM.ps1 b/src/microsoft/admin/Update-DKIM.ps1 index b48a9cda..8dfc4b50 100644 --- a/src/microsoft/admin/Update-DKIM.ps1 +++ b/src/microsoft/admin/Update-DKIM.ps1 @@ -1,8 +1,8 @@ #Requires -Version 7.1 -Using module ../../common/Environment.psm1 -Using module ../../common/Connection.psm1 -Using module ../../common/Logging.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Connection.psm1 +Using module ..\..\common\Logging.psm1 Using module Microsoft.Graph.Identity.DirectoryManagement diff --git a/src/microsoft/entra/Get-MFAChanges.ps1 b/src/microsoft/entra/Get-MFAChanges.ps1 index b268b787..c0fb5716 100644 --- a/src/microsoft/entra/Get-MFAChanges.ps1 +++ b/src/microsoft/entra/Get-MFAChanges.ps1 @@ -1,13 +1,13 @@ #Requires -Version 5.1 -Using module ../../common/Environment.psm1 -Using module ../../common/Connection.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Ensure.psm1 -Using module ../../common/Scope.psm1 -Using module ../../common/Exit.psm1 -Using module ../../common/Assert.psm1 -Using module ../../common/Input.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Connection.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Ensure.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Exit.psm1 +Using module ..\..\common\Assert.psm1 +Using module ..\..\common\Input.psm1 Using module ImportExcel Using module MSOnline diff --git a/src/microsoft/entra/StaffLocation.ps1 b/src/microsoft/entra/StaffLocation.ps1 index 0f798741..bb6f044f 100644 --- a/src/microsoft/entra/StaffLocation.ps1 +++ b/src/microsoft/entra/StaffLocation.ps1 @@ -11,10 +11,10 @@ - Intune Device Configuration Profile (Optional) #> -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Input.psm1 -Using module ../../common/Connection.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Input.psm1 +Using module ..\..\common\Connection.psm1 Using module Microsoft.Graph.Identity.SignIns Using module Microsoft.Graph.Authentication diff --git a/src/microsoft/intune/Setup.ps1 b/src/microsoft/intune/Setup.ps1 index 689f50db..f8196530 100644 --- a/src/microsoft/intune/Setup.ps1 +++ b/src/microsoft/intune/Setup.ps1 @@ -3,11 +3,11 @@ Before use, must opt into beta shcemas, after logging into MSGraph run Update-MSGraphEnvironment -SchemaVersion 'beta'; #> -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Connection.psm1 -Using module ../../common/Scope.psm1 -Using module ../../common/Exit.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Connection.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Exit.psm1 Using module Microsoft.Graph.Authentication Using module Microsoft.Graph.Beta.DeviceManagement diff --git a/src/microsoft/reports/Exchange.psm1 b/src/microsoft/reports/Exchange.psm1 index 229e741b..206997c4 100644 --- a/src/microsoft/reports/Exchange.psm1 +++ b/src/microsoft/reports/Exchange.psm1 @@ -1,5 +1,5 @@ -Using module ../../common/Environment.psm1 -Using module ../../common/Connection.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Connection.psm1 Using module ExchangeOnlineManagement function Get-SharedMailboxes { diff --git a/src/microsoft/security/Exchange.ps1 b/src/microsoft/security/Exchange.ps1 index 0f9645f3..0c82429d 100644 --- a/src/microsoft/security/Exchange.ps1 +++ b/src/microsoft/security/Exchange.ps1 @@ -1,11 +1,11 @@ #Requires -Modules ExchangeOnlineManagement -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Scope.psm1 -Using module ../../common/Input.psm1 -Using module ../../common/Connection.psm1 -Using module ../Common.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Input.psm1 +Using module ..\..\common\Connection.psm1 +Using module ..\Common.psm1 [CmdletBinding()] Param( diff --git a/src/microsoft/security/Retention.ps1 b/src/microsoft/security/Retention.ps1 index 11b342ce..f6614957 100644 --- a/src/microsoft/security/Retention.ps1 +++ b/src/microsoft/security/Retention.ps1 @@ -1,8 +1,8 @@ #Requires -Version 5.1 -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Connection.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Connection.psm1 Using module ExchangeOnlineManagement diff --git a/src/microsoft/security/SecureScore.ps1 b/src/microsoft/security/SecureScore.ps1 index 4e630345..461b043e 100644 --- a/src/microsoft/security/SecureScore.ps1 +++ b/src/microsoft/security/SecureScore.ps1 @@ -1,6 +1,6 @@ -Using module ../../common/Environment.psm1 -Using module ../../common/Input.psm1 -Using module ../Common.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Input.psm1 +Using module ..\Common.psm1 Using module Microsoft.Graph.Beta.Security diff --git a/src/microsoft/security/Setup-Alerts.ps1 b/src/microsoft/security/Setup-Alerts.ps1 index 86aab686..095a5529 100644 --- a/src/microsoft/security/Setup-Alerts.ps1 +++ b/src/microsoft/security/Setup-Alerts.ps1 @@ -1,10 +1,10 @@ #Requires -Version 5.1 -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Scope.psm1 -Using module ../../common/Connection.psm1 -Using module ../Common.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Connection.psm1 +Using module ..\Common.psm1 Using module ExchangeOnlineManagement diff --git a/src/microsoft/windows/AutoSetup.ps1 b/src/microsoft/windows/AutoSetup.ps1 index e486f822..db2fc6df 100644 --- a/src/microsoft/windows/AutoSetup.ps1 +++ b/src/microsoft/windows/AutoSetup.ps1 @@ -1,16 +1,16 @@ #Requires -Version 5.1 #Requires -RunAsAdministrator -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Scope.psm1 -Using module ../../common/Exit.psm1 -Using module ../../common/Flag.psm1 -Using module ../../common/Input.psm1 -Using module ../../common/Assert.psm1 -Using module ../../common/Ensure.psm1 -Using module ../../common/Windows.psm1 -Using module ../../common/Temp.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Exit.psm1 +Using module ..\..\common\Flag.psm1 +Using module ..\..\common\Input.psm1 +Using module ..\..\common\Assert.psm1 +Using module ..\..\common\Ensure.psm1 +Using module ..\..\common\Windows.psm1 +Using module ..\..\common\Temp.psm1 Using module PSWindowsUpdate diff --git a/src/microsoft/windows/Invoke-Downloadable.ps1 b/src/microsoft/windows/Invoke-Downloadable.ps1 index c1b7fa19..4084ca14 100644 --- a/src/microsoft/windows/Invoke-Downloadable.ps1 +++ b/src/microsoft/windows/Invoke-Downloadable.ps1 @@ -1,8 +1,8 @@ -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Scope.psm1 -Using module ../../common/Utils.psm1 -Using module ../../common/Temp.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Utils.psm1 +Using module ..\..\common\Temp.psm1 [CmdletBinding(SupportsShouldProcess)] diff --git a/src/microsoft/windows/Setup-Printer.ps1 b/src/microsoft/windows/Setup-Printer.ps1 index 040731a0..c052437f 100644 --- a/src/microsoft/windows/Setup-Printer.ps1 +++ b/src/microsoft/windows/Setup-Printer.ps1 @@ -1,11 +1,11 @@ #Requires -Version 5.1 -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Scope.psm1 -Using module ../../common/PackageManager.psm1 -Using module ../../common/Temp.psm1 -Using module ../../common/Exit.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\PackageManager.psm1 +Using module ..\..\common\Temp.psm1 +Using module ..\..\common\Exit.psm1 <# .PARAMETER PrinterName diff --git a/src/microsoft/windows/Setup-Wireguard.ps1 b/src/microsoft/windows/Setup-Wireguard.ps1 index 98f4ecb4..2d183d3c 100644 --- a/src/microsoft/windows/Setup-Wireguard.ps1 +++ b/src/microsoft/windows/Setup-Wireguard.ps1 @@ -1,13 +1,13 @@ #Requires -Version 5.1 -Using module ../../common/Environment.psm1 -Using module ../../common/Logging.psm1 -Using module ../../common/Input.psm1 -Using module ../../common/Ensure.psm1 -Using module ../../common/Utils.psm1 -Using module ../../common/PackageManager.psm1 -Using module ../../common/UsersAndAccounts.psm1 -Using module ../../common/Registry.psm1 +Using module ..\..\common\Environment.psm1 +Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Input.psm1 +Using module ..\..\common\Ensure.psm1 +Using module ..\..\common\Utils.psm1 +Using module ..\..\common\PackageManager.psm1 +Using module ..\..\common\UsersAndAccounts.psm1 +Using module ..\..\common\Registry.psm1 [CmdletBinding(SupportsShouldProcess)] param ( diff --git a/src/misc/Export-KaseyaQuotes.ps1 b/src/misc/Export-KaseyaQuotes.ps1 index be6741cb..cc4beb01 100644 --- a/src/misc/Export-KaseyaQuotes.ps1 +++ b/src/misc/Export-KaseyaQuotes.ps1 @@ -1,8 +1,8 @@ -Using module ../common/Environment.psm1 -Using module ../common/Input.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Exit.psm1 -Using module ../common/Utils.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Input.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Exit.psm1 +Using module ..\common\Utils.psm1 [CmdletBinding()] param( diff --git a/src/misc/Setup-SecretManagement.ps1 b/src/misc/Setup-SecretManagement.ps1 index 9693baea..baa862d0 100644 --- a/src/misc/Setup-SecretManagement.ps1 +++ b/src/misc/Setup-SecretManagement.ps1 @@ -1,10 +1,10 @@ #!ignore #Requires -Version 7.4 -Using module ../common/Environment.psm1 -Using module ../common/Ensure.psm1 -Using module ../common/Input.psm1 -Using module ../common/Utils.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Ensure.psm1 +Using module ..\common\Input.psm1 +Using module ..\common\Utils.psm1 Using module Microsoft.PowerShell.SecretManagement diff --git a/src/n-sight/Get-InstalledSoftware.ps1 b/src/n-sight/Get-InstalledSoftware.ps1 index a64ce6c7..914a2c19 100644 --- a/src/n-sight/Get-InstalledSoftware.ps1 +++ b/src/n-sight/Get-InstalledSoftware.ps1 @@ -1,10 +1,10 @@ #Requires -Version 7.0 -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 -Using module ../common/Scope.psm1 -Using module ../common/Cache.psm1 -Using module ../common/Input.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\Cache.psm1 +Using module ..\common\Input.psm1 Using module ImportExcel diff --git a/src/n-sight/Invoke-EnvTest.ps1 b/src/n-sight/Invoke-EnvTest.ps1 index cf7ccdcb..fce0f13a 100644 --- a/src/n-sight/Invoke-EnvTest.ps1 +++ b/src/n-sight/Invoke-EnvTest.ps1 @@ -3,8 +3,8 @@ Used to print environment variables and other information within a N-Able ScriptRunner environment. #> -Using module ../common/Environment.psm1 -Using module ../common/Logging.psm1 +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 [CmdletBinding()] param() From c35416b7ae204cbe24b1e385f54a9554f46f70c1 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 31 Jan 2025 17:04:06 +1100 Subject: [PATCH 231/341] fix(Compiler): Not passing parameters through to the real script to execute --- src/Compiler/Resources/ScriptTemplate.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index c6c28292..9eaed14e 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -73,7 +73,7 @@ begin { } process { try { - $Result = Start-Job { & $Using:ScriptPath @PSBoundParameters } | Receive-Job -Wait -AutoRemoveJob; + $Result = Start-Job { & $Using:ScriptPath @Using:PSBoundParameters } | Receive-Job -Wait -AutoRemoveJob; } finally { $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; $Script:REMOVE_ORDER | ForEach-Object { Get-Module -Name $_ | Remove-Module -Force; } From 7052ec62d78ae0860ba9e0f3218eda5e4e818c4c Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 31 Jan 2025 17:42:06 +1100 Subject: [PATCH 232/341] feat(ModuleUtils): Allow Add-ModuleCallback to be used multiple times, chaining blocks. --- src/common/ModuleUtils.psm1 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/common/ModuleUtils.psm1 b/src/common/ModuleUtils.psm1 index 050cd9ee..f2c61b80 100644 --- a/src/common/ModuleUtils.psm1 +++ b/src/common/ModuleUtils.psm1 @@ -139,7 +139,16 @@ function Add-ModuleCallback { throw [System.InvalidOperationException]::new('This function must be called from within a module.'); } - $Module.OnRemove = $ScriptBlock; + if ($Module.OnRemove) { + $PreviousScriptBlock = $Module.OnRemove; + $Module.OnRemove = { + & $PreviousScriptBlock; + & $ScriptBlock; + }.GetNewClosure(); + return; + } else { + $Module.OnRemove = $ScriptBlock; + } } Export-ModuleMember -Function Export-Types, Add-ModuleCallback; From 5c145eefd1cfc5dc691b3413c9c85994dd7f99be Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 3 Feb 2025 14:00:11 +1100 Subject: [PATCH 233/341] fix(Compiler): Insertion of Analyser module for all modules --- src/Compiler/Module/Resolvable/Local.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 6a332cc3..3f17e42d 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -94,9 +94,6 @@ public override ModuleMatch GetModuleMatchFor(ModuleSpec requirement) { } public override Task> ResolveRequirements() { - string[] dontAddTo = ["Analyser", "ModuleUtils"]; - var foundAnalyserModule = dontAddTo.Contains(Path.GetFileNameWithoutExtension(this.ModuleSpec.Name)); - AstHelper.FindDeclaredModules(this.RequirementsAst).ToList().ForEach(module => { if (module.Value.TryGetValue("AST", out var obj) && obj is Ast ast) { this.Editor.AddExactEdit( @@ -127,10 +124,6 @@ public override Task> ResolveRequirements() { (Version?)requiredVersion ); - if (spec.Name.EndsWith("Analyser.psm1", StringComparison.OrdinalIgnoreCase)) { - foundAnalyserModule = true; - } - lock (this.Requirements) { this.Requirements.AddRequirement(spec); } @@ -152,6 +145,7 @@ public override Task> ResolveRequirements() { } }); + // FIXME - This gets duplicated. if (this.RequirementsAst.ScriptRequirements is not null) { if (this.RequirementsAst.ScriptRequirements.IsElevationRequired) { lock (this.Requirements) { @@ -174,14 +168,15 @@ public override Task> ResolveRequirements() { } } - // TODO - Cleanup this fuckfest of a workaround. + string[] dontAddTo = ["Analyser", "ModuleUtils"]; + var dontAddAnalyser = dontAddTo.Contains(this.ModuleSpec.Name) || + this.Requirements.GetRequirements().Any(spec => dontAddTo.Contains(spec.Name, StringComparer.OrdinalIgnoreCase)); + // Add a reference to the Analyser.psm1 file to ensure all files have access to the SuppressAnalyserAttribute - if (!foundAnalyserModule) { + if (!dontAddAnalyser) { lock (this.Requirements) { - var moduleUtilsPath = GetExportedResource("ModuleUtils.psm1").Unwrap(); var analyserPath = GetExportedResource("Analyser.psm1").Unwrap(); - this.Requirements.AddRequirement(new PathedModuleSpec(Directory.GetParent(moduleUtilsPath)!.FullName, moduleUtilsPath)); // Safety - We know this will always be present in the resources. - this.Requirements.AddRequirement(new PathedModuleSpec(Directory.GetParent(analyserPath)!.FullName, analyserPath)); // Safety - We know this will always be present in the resources. + this.Requirements.AddRequirement(new PathedModuleSpec(Directory.GetParent(analyserPath)!.FullName, analyserPath)); // Safety - We know this will always be present in the resources. } } From f5ba6dce6314baafbf6337b95e4e9b71ce3ae498 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 3 Feb 2025 14:01:08 +1100 Subject: [PATCH 234/341] feat(scripts): Add script and module for upgrading to Windows 11 --- src/microsoft/windows/Update-ToWin11.ps1 | 23 +++ src/microsoft/windows/Update-ToWin11.psm1 | 175 ++++++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 src/microsoft/windows/Update-ToWin11.ps1 create mode 100644 src/microsoft/windows/Update-ToWin11.psm1 diff --git a/src/microsoft/windows/Update-ToWin11.ps1 b/src/microsoft/windows/Update-ToWin11.ps1 new file mode 100644 index 00000000..2c39f66e --- /dev/null +++ b/src/microsoft/windows/Update-ToWin11.ps1 @@ -0,0 +1,23 @@ +#Requires -RunAsAdministrator + +Using module ..\..\common\Environment.psm1 +Using module .\Update-ToWin11.psm1 + +[CmdletBinding()] +param( + [Parameter()] + [ValidateNotNull()] + [Switch]$CheckOnly, + + [Parameter()] + [ValidateNotNull()] + [Switch]$AlwaysShowResults = $CheckOnly +) + +Invoke-RunMain $PSCmdlet { + if (-not (Test-CanUpgrade -AlwaysShowResults:$AlwaysShowResults) -or $CheckOnly) { + return; + } + + Update-ToWin11; +} diff --git a/src/microsoft/windows/Update-ToWin11.psm1 b/src/microsoft/windows/Update-ToWin11.psm1 new file mode 100644 index 00000000..4c29c51f --- /dev/null +++ b/src/microsoft/windows/Update-ToWin11.psm1 @@ -0,0 +1,175 @@ +#Requires -RunAsAdministrator + +Using module ..\..\common\Scope.psm1 +Using module ..\..\common\Logging.psm1 + +function Get-SupportedProcessor { + [CmdletBinding()] + param( + [Parameter(Mandatory)] + [String]$Brand + ) + + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + $Brand = $Brand -replace 'GenuineIntel', 'Intel' ` + -replace 'AuthenticAMD', 'AMD'; + + $ProcessorsUrl = "https://learn.microsoft.com/en-us/windows-hardware/design/minimum/supported/windows-11-supported-$Brand-processors"; + $ProcessorsRequest = Invoke-WebRequest -Uri $ProcessorsUrl -UseBasicParsing; + $ParsedHtml = New-Object -Com 'HTMLFile'; + if ($PSVersionTable.PSVersion.Major -lt 6) { + # Fucking peice of shit. + $CorrectEncoding = [System.Text.Encoding]::UTF8.GetString($ProcessorsRequest.RawContentStream.ToArray()); + $ParsedHtml.IHTMLDocument2_write($CorrectEncoding) + } else { + $ParsedHtml.write([ref]$ProcessorsRequest.Content); + } + $RawProcessors = (($ParsedHtml.getElementsByTagName('table') | Select-Object -First 1 | Select-Object -ExpandProperty innerText)) -split '\r\n'; + + if ($Brand -eq 'Intel') { + $SupportedProcessors = $RawProcessors | ForEach-Object { + $_ -replace '®', '®,' ` + -replace 'Processor', 'Processor,'; # Single outlier that needs to be split + }; + } elseif ($Brand -eq 'AMD') { + $SupportedProcessors = $RawProcessors | ForEach-Object { + $Split = $_.Substring(3) -split ','; + + # Ordering is important here, as we want to split on the most specific first + $BrandModelSplitPoints = @( + 'Ryzen™ Threadripper™ PRO' + 'Ryzen™ Embedded' + 'Ryzen Embedded R2000 Series' + 'Ryzen™ \d [A-z]+' + 'Ryzen™ \d' + 'Ryzen™' + 'EPYC™' + 'Athlon™' + 'AMD' + ); + + $BrandModel = $Split -split "($($BrandModelSplitPoints -join '|'))"; + "AMD,$($BrandModel[1]),$($BrandModel[2])" -replace '™',''; + }; + } elseif ($Brand -eq 'Qualcomm') { + $SupportedProcessors = $RawProcessors | ForEach-Object { + $_ -replace '®', ',' ` + -replace '™', ','; + }; + } else { + Invoke-Error "Unsupported processor brand: $Brand"; + return $null; + } + + $SupportedProcessors = $SupportedProcessors -replace '\[\d+\]', ''; + + $Headers = @("Manufactuer", "Brand", "Model"); + $SupportedProcessors = $SupportedProcessors | Select-Object -Skip 1 | ConvertFrom-Csv -Header $Headers -Delimiter ','; + + return $SupportedProcessors; + } +} + +function Test-CanUpgrade { + [CmdletBinding()] + [OutputType([Boolean])] + param( + [Switch]$AlwaysShowResults + ) + + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + if ($env:OS -ne 'Windows_NT') { + Invoke-Error 'This script is only supported on Windows.'; + return $False; + } + + [String]$Private:OSCaption = (Get-CimInstance -Query 'select caption from win32_operatingsystem' | Select-Object -Property Caption).Caption; + if ($Private:OSCaption -match 'Windows 11') { + Invoke-Info 'Already running Windows 11, no need to upgrade.'; + if (-not $AlwaysShowResults) { + return $False; + } + } + + $Processor = Get-CimInstance -ClassName Win32_Processor; + $SupportedProcessors = Get-SupportedProcessor -Brand $Processor.Manufacturer; + $CPUIsSupported = $null -ne ($SupportedProcessors | Where-Object { + "$($Processor.Name)".Contains("$($_.Manufactuer) $($_.Brand) $($_.Model)"); + }); + + $Tpm = Get-Tpm; + $Result = @{ + 'TPM Present' = $Tpm.TpmPresent; + 'TPM Version 2.0' = $Tpm.ManufacturerVersionFull20 -notlike '*not supported*'; + 'Processor Compatible' = $CPUIsSupported; + '64 Bit OS' = [System.Environment]::Is64BitOperatingSystem; + }; + + if ($Result.Values -contains $False -or $Result["64 Bit OS"] -eq $False) { + Invoke-Error 'Your system does not meet the minimum requirements to upgrade to Windows 11, see the details below:'; + $Result.GetEnumerator() | ForEach-Object { + if (-not $_.Value) { + Invoke-Error "$($_.Key): $($_.Value)"; + } + } + return $False; + } + + if ($AlwaysShowResults) { + Invoke-Info 'Your system meets the minimum requirements to upgrade to Windows 11, see the details below:'; + $Result.GetEnumerator() | ForEach-Object { + Invoke-Info "$($_.Key): $($_.Value)"; + } + } + + $Private:RequiredSpace = 25GB; + $Private:AvailableSpace = (Get-Volume -DriveLetter C).SizeRemaining; + if ($Private:AvailableSpace -lt $Private:RequiredSpace) { + Invoke-Error "Not enough space to upgrade to Windows 11, you need at least 25GB of free space on your system drive."; + return $False; + } + + return $True; + } +} + +function Update-ToWin11 { + [CmdletBinding()] + param() + + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + $Private:Dir = "$env:TEMP\Windows11Upgrade"; + if (-not (Test-Path $Private:Dir)) { + New-Item -ItemType Directory -Path $Private:Dir; + } + + $Private:OutputFile = "$Private:Dir\Windows11InstallationAssistant.exe"; + Invoke-WebRequest -Uri 'https://go.microsoft.com/fwlink/?linkid=2171764' -OutFile $Private:OutputFile -UseBasicParsing; + Unblock-File -Path $Private:OutputFile; + + Invoke-Info 'Starting Windows 11 upgrade, this will take a while with no progress bar...'; + try { + # TODO - Maybe use the processes resource monitor to determine if its downloading, copying or what? + # Dont auto reboot + Start-Process -FilePath $Private:OutputFile -ArgumentList "/QuietInstall /SkipEULA /auto upgrade /UninstallUponUpgrade /copylogs $Private:Dir" -Wait; + + # send ui message after complete, + + Invoke-Info 'Windows 11 upgrade completed successfully, please reboot to continue...'; + } catch { + Invoke-Error "There was an error upgrading to Windows 11, please check the logs for more information inside $Private:Dir"; + $PSCmdlet.ThrowTerminatingError($_); + } + } +} + +Export-ModuleMember -Function 'Update-ToWin11', 'Test-CanUpgrade', 'Get-SupportedProcessor'; From 372c5bb94422ac2873a64217321c9586cc3d5821 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 3 Feb 2025 19:11:10 +1100 Subject: [PATCH 235/341] fix(Analyser): Compatability for Windows PS --- src/common/Analyser.psm1 | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/common/Analyser.psm1 b/src/common/Analyser.psm1 index 577b57fd..f76a71d6 100644 --- a/src/common/Analyser.psm1 +++ b/src/common/Analyser.psm1 @@ -16,14 +16,20 @@ using System; namespace Compiler.Analyser { [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)] - public sealed class SuppressAnalyserAttribute( - string CheckType, - object Data = null, - string Justification = "" - ) : Attribute { - public string CheckType { get; } - public object Data { get; } - public string Justification { get; } + public sealed class SuppressAnalyserAttribute : Attribute { + public readonly string CheckType; + public readonly object Data; + public readonly string Justification; + + public SuppressAnalyserAttribute( + string CheckType, + object Data = null, + string Justification = "" + ) { + this.CheckType = CheckType; + this.Data = Data; + this.Justification = Justification; + } } } '@; From e7592d49ffc447df92394d0e3b6f025c856a2194 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 3 Feb 2025 19:12:38 +1100 Subject: [PATCH 236/341] fix(Analyser): Eranious internal PS Error. Was recieving an ArgumentOutOfRangeException when loading the Analyser module on Windows PowerShell, for some ungodly reason adding this one gate fixes it despite it already should of been stopped at CompiledScript. --- src/common/Analyser.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Analyser.psm1 b/src/common/Analyser.psm1 index f76a71d6..1ebf4a72 100644 --- a/src/common/Analyser.psm1 +++ b/src/common/Analyser.psm1 @@ -8,7 +8,7 @@ Using module .\ModuleUtils.psm1 #> $CSFilePath = "$PSScriptRoot\..\Compiler\Analyser\Suppression.cs"; -if (-not (Get-Variable -Name 'CompiledScript' -Scope Global -ValueOnly -ErrorAction SilentlyContinue) -and (Test-Path -Path $CSFilePath -PathType Leaf)) { +if ($PSVersionTable.PSVersion.Major -ge 6 -and -not (Get-Variable -Name 'CompiledScript' -Scope Global -ValueOnly -ErrorAction SilentlyContinue) -and (Test-Path -Path $CSFilePath -PathType Leaf)) { Add-Type -LiteralPath $CSFilePath; } else { $SuppressionCSharp = @' From a84d56d9c8905719c71cdac2335f6539af25178d Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 3 Feb 2025 19:15:23 +1100 Subject: [PATCH 237/341] fix(ScriptTemplate): Use UTF8Bom for PS < 6 Fixes Unicode characters in Windows PS. Also ensures that logging preferences and other cmdletbinding parameters are properly passed through to the job. --- .editorconfig | 4 +++ src/Compiler/AstHelper.cs | 41 +++++++++++++++-------- src/Compiler/Module/Compiled/Compiled.cs | 2 +- src/Compiler/Resources/ModuleUtils.psm1 | 1 - src/Compiler/Resources/ScriptTemplate.ps1 | 35 +++++++++++++++++-- src/Compiler/packages.lock.json | 6 ++++ 6 files changed, 70 insertions(+), 19 deletions(-) delete mode 120000 src/Compiler/Resources/ModuleUtils.psm1 diff --git a/.editorconfig b/.editorconfig index 18014c46..d47c343c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,6 +10,10 @@ insert_final_newline = true max_line_length = 130 rulers = 80,100,120 +# Actually go fuck yourself microsoft. +[*.{ps1,psm1}] +charset = utf-8-bom + [*.{patch,diff}] trim_trailing_whitespace = false insert_final_newline = false diff --git a/src/Compiler/AstHelper.cs b/src/Compiler/AstHelper.cs index f66d99b2..264dc7fe 100644 --- a/src/Compiler/AstHelper.cs +++ b/src/Compiler/AstHelper.cs @@ -113,20 +113,36 @@ public static IEnumerable FindAvailableAliases(Ast ast, bool onlyExporte availableAliases.AddRange(allFunctionsWithAliases.SelectMany(function => function.Body.ParamBlock.Attributes .Where(attribute => attribute.TypeName.GetReflectionAttributeType() == attributeType) .SelectMany(attribute => { - var aliasesObject = attribute.NamedArguments.FirstOrDefault(namedArg => namedArg.ArgumentName is "aliasNames")?.Argument - ?? attribute.PositionalArguments.FirstOrDefault(); + var aliasesObjects = new List(); + if (attribute.NamedArguments.Any(namedArg => namedArg.ArgumentName is "aliasNames")) { + aliasesObjects.Add(attribute.NamedArguments.First(namedArg => namedArg.ArgumentName is "aliasNames").Argument); + } else if (attribute.PositionalArguments.Count != 0) { + aliasesObjects.AddRange(attribute.PositionalArguments); + } + + if (aliasesObjects is null) return []; + + var aliases = new List(); + foreach (var aliasesObject in aliasesObjects) { + switch (aliasesObject) { + case ArrayLiteralAst arrayLiteralAst: + aliases.AddRange(arrayLiteralAst.Elements.Select(element => element.SafeGetValue()).Cast()); + break; + case StringConstantExpressionAst stringConstantAst: + aliases.Add(stringConstantAst.Value); + break; + default: + Logger.Error($"Unknown alias type: {aliasesObject}"); + break; + } + } - return aliasesObject switch { - ArrayLiteralAst arrayLiteralAst => arrayLiteralAst.Elements.Select(element => element.SafeGetValue()).Cast(), - StringConstantExpressionAst stringConstantAst => [stringConstantAst.Value], - _ => [], - }; + return aliases; }) )); availableAliases.AddRange(allAstFunctionCalls.SelectMany(static commandAst => commandAst.CommandElements - .Where(static commandElement => commandElement is CommandParameterAst) - .Cast() + .OfType() .Where(static param => param.ParameterName == "Name") .Select(param => { var value = param.Argument ?? commandAst.CommandElements[commandAst.CommandElements.IndexOf(param) + 1] as ExpressionAst; @@ -159,8 +175,7 @@ private static IEnumerable GetWantedExports(Ast ast, string kind, IEnumera foreach (var exportCommand in exportCommands) { // TODO - Support unnamed export param eg `Export-ModuleMember *` var namedParameters = exportCommand.CommandElements - .Where(commandElement => commandElement is CommandParameterAst) - .Cast() + .OfType() .Where(param => param.ParameterName.Equals(kind, StringComparison.OrdinalIgnoreCase)); foreach (var namedParameter in namedParameters) { @@ -204,7 +219,6 @@ public static Fin GetAstReportingErrors( out Token[] tokens ) { ArgumentNullException.ThrowIfNull(astContent); - ArgumentNullException.ThrowIfNull(filePath); ArgumentNullException.ThrowIfNull(ignoredErrors); var ast = Parser.ParseInput(astContent, filePath.ValueUnsafe(), out tokens, out var parserErrors); @@ -229,7 +243,6 @@ public static string GetPrettyAstError( [NotNull] IssueSeverity severity = IssueSeverity.Error) { ArgumentNullException.ThrowIfNull(extent); ArgumentNullException.ThrowIfNull(parentAst); - ArgumentNullException.ThrowIfNull(message); var problemColour = severity switch { @@ -249,7 +262,7 @@ public static string GetPrettyAstError( while (parentAst.Parent != null) { parentAst = parentAst.Parent; - }; + } var extentRegion = parentAst.Extent.Text.Split('\n')[(startingLine - 1)..endingLine]; var printableLines = new string[extentRegion.Length]; diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index cd161d62..1fbd3071 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -105,7 +105,7 @@ public Compiled[] GetSiblings() { var rootParent = this.GetRootParent(); if (rootParent is not CompiledScript script) return []; - return script.Graph.Vertices.Where(compiled => compiled != this).ToArray(); + return [.. script.Graph.Vertices.Where(compiled => compiled != this)]; } /// diff --git a/src/Compiler/Resources/ModuleUtils.psm1 b/src/Compiler/Resources/ModuleUtils.psm1 deleted file mode 120000 index 31c2ef84..00000000 --- a/src/Compiler/Resources/ModuleUtils.psm1 +++ /dev/null @@ -1 +0,0 @@ -../../common/ModuleUtils.psm1 \ No newline at end of file diff --git a/src/Compiler/Resources/ScriptTemplate.ps1 b/src/Compiler/Resources/ScriptTemplate.ps1 index 9eaed14e..a350d84c 100644 --- a/src/Compiler/Resources/ScriptTemplate.ps1 +++ b/src/Compiler/Resources/ScriptTemplate.ps1 @@ -10,7 +10,7 @@ begin { <#!DEFINE EMBEDDED_MODULES#> <#!DEFINE IMPORT_ORDER#> - [String]$Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath 'AMT/PowerShell/Modules'; + [String]$Local:PrivatePSModulePath = $env:ProgramData | Join-Path -ChildPath "AMT/PowerShell/Modules/PS$($PSVersionTable.PSVersion.Major)"; if (-not (Test-Path -Path $Local:PrivatePSModulePath)) { Write-Verbose "Creating module root folder: $Local:PrivatePSModulePath"; New-Item -Path $Local:PrivatePSModulePath -ItemType Directory | Out-Null; @@ -20,6 +20,11 @@ begin { $Env:PSModulePath = "$Local:PrivatePSModulePath;" + $Env:PSModulePath; } + # Must use UTF-8 Bom for PS < 6 to properly handle Unicode characters. + $Local:PSBelow6 = $PSVersionTable.PSVersion.Major -lt 6; + $Local:Bom = [Byte[]](0xEF, 0xBB, 0xBF); + $Local:Encoding = 'UTF8'; + $Script:ScriptPath; $Script:EMBEDDED_MODULES | ForEach-Object { $Local:Name = $_.Name; @@ -42,10 +47,24 @@ begin { 'UTF8String' { $Local:FileSuffix = if ($null -eq $Script:ScriptPath) { 'ps1' } else { 'psm1' }; $Local:InnerModulePath = Join-Path -Path $Local:ModuleFolderPath -ChildPath "$Local:NameHash.$Local:FileSuffix"; + if (-not (Test-Path -Path $Local:InnerModulePath)) { Write-Verbose "Writing content to module file: $Local:InnerModulePath" - Set-Content -Path $Local:InnerModulePath -Value $Content; + Set-Content -Path $Local:InnerModulePath -Value $Content -Encoding $Local:Encoding; + } else { + $Local:Params = @{ Path = $Local:InnerModulePath; TotalCount = $Local:Bom.Length; }; + if ($Local:PSBelow6) { $Local:Params.Add('Encoding', 'Byte'); } else { $Local:Params.Add('AsByteStream', $True); } + + $Local:WantBom = $Local:PSBelow6 + $Local:IsBomEncoded = [Collections.Generic.SortedSet[String]]::CreateSetComparer().Equals((Get-Content @Local:Params), $Local:Bom); + + if ($Local:WantBom -ne $Local:IsBomEncoded) { + Write-Debug "Replacing module to ensure correct UTF-8 encoding: $Local:InnerModulePath" + + Set-Content -Path $Local:InnerModulePath -Value $Content -Encoding $Local:Encoding -Force; + } } + if ($null -eq $Script:ScriptPath) { $Script:ScriptPath = $Local:InnerModulePath; } @@ -73,7 +92,17 @@ begin { } process { try { - $Result = Start-Job { & $Using:ScriptPath @Using:PSBoundParameters } | Receive-Job -Wait -AutoRemoveJob; + $Result = Start-Job { + $VerbosePreference = $Using:VerbosePreference; + $DebugPreference = $Using:DebugPreference; + $InformationPreference = $Using:InformationPreference; + $WarningPreference = $Using:WarningPreference; + $ErrorActionPreference = $Using:ErrorActionPreference; + $WhatIfPreference = $Using:WhatIfPreference; + $ConfirmPreference = $Using:ConfirmPreference; + + & $Using:ScriptPath @Using:PSBoundParameters + } | Receive-Job -Wait -AutoRemoveJob; } finally { $Env:PSModulePath = ($Env:PSModulePath -split ';' | Select-Object -Skip 1) -join ';'; $Script:REMOVE_ORDER | ForEach-Object { Get-Module -Name $_ | Remove-Module -Force; } diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 9eb0ba44..5281e292 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,6 +20,12 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[9.0.1, )", + "resolved": "9.0.1", + "contentHash": "BKFAkdhUUJivAoKuSWcT23WH9E+AWQMJootzt9X+lnesOD2a2yNIe1ZQFtxB8H3ayskLBD5gYyIbj5GIfw7rZg==" + }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.5, )", From 0ecb6b0d71d1c195b683defe07aa896fbed877e8 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 3 Feb 2025 19:15:45 +1100 Subject: [PATCH 238/341] feat(Environment): Enhance module setup and teardown handling --- src/common/Environment.psm1 | 200 ++++++++++++++++++------------------ 1 file changed, 98 insertions(+), 102 deletions(-) diff --git a/src/common/Environment.psm1 b/src/common/Environment.psm1 index 9731a194..de7bd5a9 100644 --- a/src/common/Environment.psm1 +++ b/src/common/Environment.psm1 @@ -1,6 +1,7 @@ Using module .\Utils.psm1 Using module .\Logging.psm1 Using module .\Exit.psm1 +Using module .\ModuleUtils.psm1 Using namespace System.Management.Automation.Language Using namespace System.Collections.Generic @@ -42,11 +43,14 @@ function Test-IsNableRunner { #endregion function Invoke-Setup { - $PSDefaultParameterValues['*:ErrorAction'] = 'Stop'; - $PSDefaultParameterValues['*:WarningAction'] = 'Continue'; - $PSDefaultParameterValues['*:InformationAction'] = 'Continue'; - $PSDefaultParameterValues['*:Verbose'] = $VerbosePreference; - $PSDefaultParameterValues['*:Debug'] = $DebugPreference; + $PSDefaultParameterValues['*:ErrorAction'] = $ErrorActionPreference; + $PSDefaultParameterValues['*:WarningAction'] = $WarningPreference; + $PSDefaultParameterValues['*:InformationAction'] = $InformationPreference; + $PSDefaultParameterValues['*:Verbose'] = $VerbosePreference -ne 'SilentlyContinue' -and $DebugPreference -ne 'Ignore'; ; + $PSDefaultParameterValues['*:Debug'] = $DebugPreference -ne 'SilentlyContinue' -and $DebugPreference -ne 'Ignore'; + + # Only log module if wanting to debug, its a bit spammy otherwise. + $PSDefaultParameterValues["*-Module:Verbose"] = $PSDefaultParameterValues['*:Debug']; $Global:ErrorActionPreference = 'Stop'; } @@ -105,6 +109,34 @@ function Invoke-BlockWrapper { } } +function Remove-FinishedModule { + [CmdletBinding()] + param( + [Switch]$Teardown + ) + + if ($Teardown) { + Invoke-Handlers; + Invoke-Teardown; + } + + if ($Script:ScriptRestarting) { + Invoke-Verbose -UnicodePrefix '🔄' -Message 'Restarting script.'; + $Script:ScriptRestarting = $False; + $Script:ScriptRestarted = $True; # Bread trail for the script to know it's been restarted. + Invoke-RunMain @PSBoundParameters; + } else { + if (-not (Get-Variable -Name 'CompiledScript' -ValueOnly -ErrorAction SilentlyContinue)) { + Get-Module | ForEach-Object { + if ($Script:ModuleSnapshot -notcontains $_.Path) { + Write-Debug "Removing module $_."; + $_ | Remove-Module -Force -Confirm:$False; + } + } + } + } +} + <# .SYNOPSIS Runs the main function of a script while ensuring that all common modules have been imported. @@ -127,6 +159,7 @@ function Invoke-BlockWrapper { This is useful for scripts that need to perform some action when imported, but not when run directly. #> function Invoke-RunMain { + [CmdletBinding()] Param( # If this ends up being null then the script is being imported. [Parameter(Mandatory)] @@ -141,122 +174,85 @@ function Invoke-RunMain { [ScriptBlock]$ImportAction, [Parameter(DontShow)] - [Switch]$NotStrict = $False, + [Switch]$NotStrict, [Parameter(DontShow)] - [Switch]$DontImport = $False, + [Switch]$HideDisclaimer = ($DontImport -or (Test-IsNableRunner) -or $null), + + $Callstack = (Get-PSCallStack), [Parameter(DontShow)] - [Switch]$HideDisclaimer = ($DontImport -or (Test-IsNableRunner) -or $null -eq $Cmdlet) + $CallingModule = (Get-PSCallStack)[0].InvocationInfo.MyCommand.ScriptBlock.Module ) - # Workaround for embedding modules in a script, can't use Invoke if a scriptblock contains begin/process/clean blocks - function Invoke-Inner { - Param( - [Parameter(Mandatory)] - [AllowNull()] - [System.Management.Automation.PSCmdlet]$Cmdlet, - - [Parameter(Mandatory)] - [ValidateNotNull()] - [ScriptBlock]$Main, - - [Parameter()] - [ScriptBlock]$ImportAction, - - [Parameter(DontShow)] - [Switch]$DontImport, + begin { + # If the script is being restarted, we have already done this. + if (-not $Script:ScriptRestarted) { + if (-not $NotStrict) { + Set-StrictMode -Version 3; + } - [Parameter(DontShow)] - [Switch]$HideDisclaimer - ) + if (-not $HideDisclaimer) { + Invoke-Info -UnicodePrefix '⚠️' -Message 'Disclaimer: This script is provided as is, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. In no event shall the author or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the script or the use or other dealings in the script.'; + } - begin { - # If the script is being restarted, we have already done this. - if (-not $Script:ScriptRestarted) { - if (-not $HideDisclaimer) { - Invoke-Info -UnicodePrefix '⚠️' -Message 'Disclaimer: This script is provided as is, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. In no event shall the author or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the script or the use or other dealings in the script.'; - } + Invoke-Setup; + } + } - if ($Local:DontImport) { - Invoke-Verbose -UnicodePrefix '♻️' -Message 'Skipping module import.'; - return; + process { + try { + if ($null -ne $Cmdlet) { + Invoke-Verbose -UnicodePrefix '🚀' -Message 'Running main function.'; + Invoke-BlockWrapper -Cmdlet $Cmdlet -ScriptBlock $Main; + Invoke-Info 'Main function finished successfully.'; + } else { + Invoke-Verbose -UnicodePrefix '📦' -Message 'Script is being imported, skipping main function.'; + + if ($ImportAction) { + Invoke-Verbose -UnicodePrefix '📦' -Message 'Running import action.'; + Invoke-BlockWrapper -Cmdlet:$PSCmdlet -ScriptBlock $ImportAction; + Invoke-Info 'Import action finished successfully.'; } - - Invoke-Setup; } - } + } catch [System.Management.Automation.ParseException] { + Invoke-Error 'Unable to execute script due to a parse error.'; + Invoke-FailedExit -ExitCode 9998 -ErrorRecord $_ -DontExit; + } catch [System.Management.Automation.RuntimeException] { + if ($null -ne $_.Exception.InnerException) { + $CatchingError = $_.Exception.InnerException.ErrorRecord; + } else { + $CatchingError = $_.Exception.ErrorRecord; + } - process { - try { - if ($null -ne $Cmdlet) { - Invoke-Verbose -UnicodePrefix '🚀' -Message 'Running main function.'; - Invoke-BlockWrapper -Cmdlet $Cmdlet -ScriptBlock $Main; - Invoke-Info 'Main function finished successfully.'; - } else { - Invoke-Verbose -UnicodePrefix '📦' -Message 'Script is being imported, skipping main function.'; - - if ($ImportAction) { - Invoke-Verbose -UnicodePrefix '📦' -Message 'Running import action.'; - Invoke-BlockWrapper -Cmdlet $Cmdlet -ScriptBlock $ImportAction; - Invoke-Info 'Import action finished successfully.'; - } + switch ($CatchingError.FullyQualifiedErrorId) { + 'QuickExit' { + Invoke-Verbose -UnicodePrefix '✅' -Message 'Main function finished successfully.'; } - } catch [System.Management.Automation.ParseException] { - Invoke-Error 'Unable to execute script due to a parse error.'; - Invoke-FailedExit -ExitCode 9998 -ErrorRecord $_ -DontExit; - } catch [System.Management.Automation.RuntimeException] { - $CatchingError = $_.Exception.InnerException.ErrorRecord; - switch ($CatchingError.FullyQualifiedErrorId) { - 'QuickExit' { - Invoke-Verbose -UnicodePrefix '✅' -Message 'Main function finished successfully.'; - } - 'FailedExit' { - [Int]$Local:ExitCode = $CatchingError.TargetObject; - Invoke-Verbose -Message "Script exited with an error code of $Local:ExitCode."; - $LASTEXITCODE = $Local:ExitCode; - } - 'RestartScript' { - $Script:ScriptRestarting = $True; - } - default { - Invoke-Error 'Uncaught Exception during script execution'; - Invoke-FailedExit -ExitCode 9999 -ErrorRecord $CatchingError -DontExit; - } + 'FailedExit' { + [Int]$Local:ExitCode = $CatchingError.TargetObject; + Invoke-Verbose -Message "Script exited with an error code of $Local:ExitCode."; + $LASTEXITCODE = $Local:ExitCode; } - } finally { - if (-not $Local:DontImport) { - Invoke-Handlers; - Invoke-Teardown; + 'RestartScript' { + $Script:ScriptRestarting = $True; } - - if ($Script:ScriptRestarting) { - Invoke-Verbose -UnicodePrefix '🔄' -Message 'Restarting script.'; - $Script:ScriptRestarting = $False; - $Script:ScriptRestarted = $True; # Bread trail for the script to know it's been restarted. - Invoke-Inner @PSBoundParameters; - } else { - if (-not (Get-Variable -Name 'CompiledScript' -ValueOnly -ErrorAction SilentlyContinue)) { - Get-Module | ForEach-Object { - if ($Script:ModuleSnapshot -notcontains $_.Path) { - Write-Debug "Removing module $_."; - $_ | Remove-Module -Force -Confirm:$False -Verbose:$False -Debug:$False; - } - } - } + default { + Invoke-Error 'Uncaught Exception during script execution'; + Invoke-FailedExit -ExitCode 9999 -ErrorRecord $CatchingError -DontExit; } } + } finally { + if ($null -eq $Cmdlet) { + Invoke-Verbose "Queueing teardown for when module $CallingModule is removed."; + Add-ModuleCallback -Module $CallingModule -ScriptBlock { + Remove-FinishedModule; + } + } else { + Remove-FinishedModule -Teardown; + } } } - - if (-not $NotStrict) { - Set-StrictMode -Version 3; - } - Invoke-Inner ` - -Cmdlet $Cmdlet ` - -Main $Main ` - -DontImport:$DontImport ` - -HideDisclaimer:($HideDisclaimer -or $False); } Export-ModuleMember -Function Invoke-RunMain, Test-IsNableRunner -Variable ScriptRestarted, ScriptRestarting; From bd68afb5b99b605ff9004c8cb76c83531d71b1e6 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 3 Feb 2025 19:16:07 +1100 Subject: [PATCH 239/341] test(Analyser): Add tests for MissingCmdlet support and enhance TestData templates --- .../Compiler/Analyser/Rules/MissingCmdlet.cs | 13 ++++++++ tests/Compiler/AstHelper.cs | 30 +++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/tests/Compiler/Analyser/Rules/MissingCmdlet.cs b/tests/Compiler/Analyser/Rules/MissingCmdlet.cs index 696b8de5..184604cf 100644 --- a/tests/Compiler/Analyser/Rules/MissingCmdlet.cs +++ b/tests/Compiler/Analyser/Rules/MissingCmdlet.cs @@ -2,12 +2,25 @@ // Licensed under the GPL3 License, See LICENSE in the project root for license information. using Compiler.Analyser.Rules; +using Compiler.Module.Compiled; +using Compiler.Test.Module.Compiled; using static LanguageExt.Prelude; namespace Compiler.Test.Analyser.Rules; [TestFixture] public class MissingCmdletTests { + [Test] + public void OnlySupportsCompiledScript() { + var rule = new MissingCmdlet(); + Assert.Multiple(() => { + var compiledScript = CompiledLocalModuleTests.TestData.CreateModule(); + var module = CompiledLocalModuleTests.TestData.CreateModule(); + Assert.That(rule.SupportsModule(compiledScript), Is.True); + Assert.That(rule.SupportsModule(module), Is.False); + }); + } + [TestCaseSource(typeof(Data), nameof(Data.TestCases))] public bool Test(string script) { var visitor = new RuleVisitor([new MissingCmdlet()], []); diff --git a/tests/Compiler/AstHelper.cs b/tests/Compiler/AstHelper.cs index 76ba7b20..43bd40a6 100644 --- a/tests/Compiler/AstHelper.cs +++ b/tests/Compiler/AstHelper.cs @@ -476,6 +476,13 @@ public static IEnumerable Aliases { }> """; + var templateByAttributeArray = /*ps1*/ """ + + """; + var nameTemplate = "Test-Alias{0}"; var counts = new[] { 1, 2, 5 }; for (var i = 0; i < counts.Length * 2; i++) { @@ -483,9 +490,12 @@ public static IEnumerable Aliases { var count = counts[i / 2]; var (byFunctionContent, expectedByFunction) = GetTemplatedData(templateByFunction, nameTemplate, count, Environment.NewLine, "Alias", withExport); var (byAttributeContent, expectedByAttribute) = GetTemplatedData(templateByAttribute, nameTemplate, count, Environment.NewLine, "Alias", withExport); + var (byAttributeArrayContent, expectedByAttributeArray) = GetTemplatedData(templateByAttributeArray, nameTemplate, count, Environment.NewLine, "Alias", withExport); yield return new TestCaseData(byFunctionContent, expectedByFunction, withExport); yield return new TestCaseData(byAttributeContent, expectedByAttribute, withExport); + yield return new TestCaseData(byAttributeArrayContent, expectedByAttributeArray, withExport); + } } } @@ -511,12 +521,28 @@ bool withExport var data = new StringBuilder().Append(beforeZone); for (var i = 0; i < count; i++) { var name = nameTemplate.Replace("{0}", i.ToString(CultureInfo.InvariantCulture)); + exportNames.Add(name); + // Find each instance of {name} and add it to the export names + while (copyableZone.Contains("{name}")) { + var index = copyableZone.IndexOf("{name}", StringComparison.Ordinal); + var originalIndex = index; + var originalEnd = index + 6; + // Go back and forward for all connecting characters, including only a-z and - characters + var start = originalIndex; + while (start > 0 && (char.IsLetter(copyableZone[start - 1]) || copyableZone[start - 1] == '-')) start--; + var end = originalEnd; + while (end < copyableZone.Length - 1 && (char.IsLetter(copyableZone[end + 1]) || copyableZone[start + 1] == '-')) end++; + + name = copyableZone[start..end].Replace("{name}", name); + // exportNames.Add(name); + copyableZone = copyableZone.Remove(start, end - start).Insert(start, name); + } + data.Append(copyableZone.Replace("{name}", name).Replace("{0}", i.ToString(CultureInfo.InvariantCulture))); if (i != count - 1) data.Append(seperator); - - exportNames.Add(name); } + exportNames = [.. exportNames.Distinct()]; data.Append(afterZone); if (withExport) { From c90184d3ee486cf089d551fbffa82e8aed140286 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 3 Feb 2025 19:16:20 +1100 Subject: [PATCH 240/341] chore: Add new launch configurations for .NET CLR and Windows PowerShell --- .vscode/launch.json | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 93992b6c..8dd60a98 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -60,7 +60,24 @@ "type": "coreclr", "request": "attach", "processId": "${command:pickProcess}", - "justMyCode": false + "justMyCode": false, + "requireExactSource": false + }, + { + "name": ".NET CLR Attach", + "type": "clr", + "request": "attach", + "processId": "${command:pickProcess}", + "justMyCode": false, + "requireExactSource": false + }, + { + "name": "Launch Windows Powershell with Debugger", + "type": "clr", + "request": "launch", + "justMyCode": false, + "requireExactSource": false, + "program": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", } ], "inputs": [ From c5a955c3a60274fcb19c7f61052cf872b06ecd88 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 4 Feb 2025 14:15:30 +1100 Subject: [PATCH 241/341] feat(ModuleUtils): Allow overriding type accelerators from the same module --- src/common/ModuleUtils.psm1 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/common/ModuleUtils.psm1 b/src/common/ModuleUtils.psm1 index f2c61b80..b5462e30 100644 --- a/src/common/ModuleUtils.psm1 +++ b/src/common/ModuleUtils.psm1 @@ -60,6 +60,14 @@ function Export-Types { $ExistingTypeAccelerators = $TypeAcceleratorsClass::Get; foreach ($Type in $Types) { if ($Type.FullName -in $ExistingTypeAccelerators.Keys) { + # Allow overriding if the exporter is the same module that originally made it. + $Local:LoadedType = $ExistingTypeAccelerators[$Type.FullName]; + $Local:Assembly = $Local:LoadedType.Module.Assembly; + $Local:LoadingFile = ($Local:Assembly.CustomAttributes.NamedArguments | Where-Object { $_.MemberName -eq 'ScriptFile' }).TypedValue.Value; + if ($Local:LoadingFile -eq $Module.Path) { + continue; + } + $Message = @( "Unable to register type accelerator '$($Type.FullName)'" 'Accelerator already exists.' From 061af2416ba9ce34919ccd3e17d5ebf16724aa20 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 4 Feb 2025 14:15:48 +1100 Subject: [PATCH 242/341] chore: Remove unused Microsoft.NET.ILLink.Tasks dependency from packages.lock.json --- src/Compiler/packages.lock.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Compiler/packages.lock.json b/src/Compiler/packages.lock.json index 5281e292..9eb0ba44 100644 --- a/src/Compiler/packages.lock.json +++ b/src/Compiler/packages.lock.json @@ -20,12 +20,6 @@ "resolved": "5.0.0-beta-07", "contentHash": "bZSoYS0eR9LZO4uHgWsEKMmejPPmf7dKaQHKj7thpUGacJ7SiCi887h97JXzBaVWea7EjY+1gAu8z05cbJ7M2Q==" }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "BKFAkdhUUJivAoKuSWcT23WH9E+AWQMJootzt9X+lnesOD2a2yNIe1ZQFtxB8H3ayskLBD5gYyIbj5GIfw7rZg==" - }, "Microsoft.PowerShell.SDK": { "type": "Direct", "requested": "[7.4.5, )", From a01f2cdcdce7efd2084bd8da0c371be5e7fd3d76 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 4 Feb 2025 17:55:01 +1100 Subject: [PATCH 243/341] fix(Logging): Colour in compiled job --- src/common/Logging.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Logging.psm1 b/src/common/Logging.psm1 index 2c392df3..81134311 100644 --- a/src/common/Logging.psm1 +++ b/src/common/Logging.psm1 @@ -21,7 +21,7 @@ function Test-SupportsUnicode { } function Test-SupportsColour { - $Host.UI.SupportsVirtualTerminal -and -not (Test-IsNableRunner); + -not (Test-IsNableRunner); } function Invoke-Write { From 07dea89e9a65ed4281935fbfa1ae81462767535b Mon Sep 17 00:00:00 2001 From: DaRacci Date: Tue, 4 Feb 2025 17:57:23 +1100 Subject: [PATCH 244/341] feat(Logging): Enhance error formatting with console width handling and ellipsis. Ensures that the error fits on a single line and each side is trimmed to an even amount to supply the most context around the statement. Techinally if the statement is large enough it will start chopping it off at the end, but thats kind of an edge case i dont want to deal with for now. --- src/common/Logging.psm1 | 68 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/src/common/Logging.psm1 b/src/common/Logging.psm1 index 81134311..e6cee4b4 100644 --- a/src/common/Logging.psm1 +++ b/src/common/Logging.psm1 @@ -121,6 +121,64 @@ function Format-Error( [String]$Local:Statement = $TrimmedLine; } + # FIXME : If the statement is larger than the width it starts cutting it off from the right side. + # Remove 10 from the total width to allow for padding & line context. + # Then an additional 6 to account for possible ellipsis. + $Padding = 16; + $Local:ConsoleWidth = $Host.UI.RawUI.BufferSize.Width - $Padding; + if ($Local:TrimmedLine.Length -gt $Local:ConsoleWidth) { + + $Local:TrimLength = $Local:TrimmedLine.Length - $Local:ConsoleWidth; + $Local:LeftSide = $Local:StatementIndex - 1; + $Local:RightSide = $Local:TrimmedLine.Length - $Local:StatementIndex - $Local:Statement.Length; + + $GreaterSide; + $LesserSide; + if ($LeftSide -ge $RightSide) { + $GreaterSide = $LeftSide; + $LesserSide = $RightSide; + } else { + $GreaterSide = $RightSide; + $LesserSide = $LeftSide; + }; + $Difference = [System.Math]::Min($GreaterSide - $LesserSide, $TrimLength); + + $StartIndex = 0; + $EndIndex = $TrimmedLine.Length - $Difference; + if ($GreaterSide -eq $LeftSide) { + $TrimLength -= $Difference; + $StartIndex = $Difference; + $Local:StatementIndex -= $Difference; + + if ($TrimLength -gt 0) { + $FromEachSide = [System.Math]::Ceiling($TrimLength / 2); + $EndIndex -= $TrimLength; + $StartIndex += $FromEachSide; + $Local:StatementIndex -= $FromEachSide; + } + } else { + $TrimLength -= $Difference; + + if ($TrimLength -gt 0) { + $FromEachSide = [System.Math]::Ceiling($TrimLength / 2); + $EndIndex -= $TrimLength; + $StartIndex += $FromEachSide; + $Local:StatementIndex -= $FromEachSide; + } + } + + $Local:TrimmedLine = $Local:TrimmedLine.Substring($StartIndex, $EndIndex); + + # If either side is trimmed then add the ellipsis. + if ($StartIndex -gt 0) { + $Local:TrimmedLine = "...$Local:TrimmedLine"; + $Local:StatementIndex += 3; + } + if ($EndIndex -lt $Local:TrimmedLine.Length) { + $Local:TrimmedLine = "$Local:TrimmedLine..."; + } + } + [String]$Local:Underline = (' ' * ($Local:StatementIndex + 10)) + ('^' * $Local:Statement.Length); # Position the message to the same indent as the statement. @@ -420,11 +478,11 @@ function Invoke-Progress { [String]$Activity, [Parameter(HelpMessage = ' - The status message to display in the progress bar. - This is formatted with three placeholders: - The current completion percentage. - The index of the item being processed. - The total number of items being processed. + The status message to display in the progress bar. + This is formatted with three placeholders: + The current completion percentage. + The index of the item being processed. + The total number of items being processed. ')] [String]$Status, From f72ab5efb7fc96703a7dd3fbe271af66b9dcfc4f Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 7 Feb 2025 14:40:18 +1100 Subject: [PATCH 245/341] fix(Compiler): Ensure the output scripts are marked with BOM for PS5 --- src/Compiler/Program.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 90cff826..a06fe38c 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -340,7 +340,9 @@ bool forceOverwrite Logger.Trace($"Writing to file {outputPath}"); using var fileStream = File.Open(outputPath, FileMode.CreateNew, FileAccess.Write, FileShare.None); - await fileStream.WriteAsync(Encoding.UTF8.GetBytes(content)); + var encoder = new UTF8Encoding(true); + fileStream.Write(encoder.GetPreamble(), 0, encoder.GetPreamble().Length); + await fileStream.WriteAsync(encoder.GetBytes(content)); } public static async Task OutputErrors( From 17ae70dfca89ecde56803085e9d8d02b817627dd Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 7 Feb 2025 14:40:45 +1100 Subject: [PATCH 246/341] fix(script/Update-ToWin11): Fix Intel processor detection --- src/microsoft/windows/Update-ToWin11.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/microsoft/windows/Update-ToWin11.psm1 b/src/microsoft/windows/Update-ToWin11.psm1 index 4c29c51f..a2018aa0 100644 --- a/src/microsoft/windows/Update-ToWin11.psm1 +++ b/src/microsoft/windows/Update-ToWin11.psm1 @@ -31,7 +31,8 @@ function Get-SupportedProcessor { if ($Brand -eq 'Intel') { $SupportedProcessors = $RawProcessors | ForEach-Object { - $_ -replace '®', '®,' ` + $_ -replace '®', '(R),' ` + -replace '™', '(TM),' ` -replace 'Processor', 'Processor,'; # Single outlier that needs to be split }; } elseif ($Brand -eq 'AMD') { From d1d32b0fa651a01db6e2e6aa6be2d1a5d3486fd7 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 10 Feb 2025 09:18:13 +1100 Subject: [PATCH 247/341] fix(Compiler): Update temporary module export path to include process ID and add ModuleUtils dependency. Ensures that the output files are up to date by being in a unique folder. Also adds back the ModuleUtils to the builtins as it was removed believing it was working without due to it being cached in the temp folder. --- src/Compiler/Module/Resolvable/Local.cs | 4 +++- src/Compiler/Resources/ModuleUtils.psm1 | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) create mode 120000 src/Compiler/Resources/ModuleUtils.psm1 diff --git a/src/Compiler/Module/Resolvable/Local.cs b/src/Compiler/Module/Resolvable/Local.cs index 3f17e42d..bb220b07 100644 --- a/src/Compiler/Module/Resolvable/Local.cs +++ b/src/Compiler/Module/Resolvable/Local.cs @@ -12,7 +12,7 @@ namespace Compiler.Module.Resolvable; public partial class ResolvableLocalModule : Resolvable { - private static readonly string TempModuleExportPath = Path.Combine(Path.GetTempPath(), "Compiler", "ExportedModules"); + private static readonly string TempModuleExportPath = Path.Combine(Path.GetTempPath(), "Compiler", $"ExportedModules_{Environment.ProcessId}"); private static readonly ConcurrentDictionary> EmbeddedResources = []; internal readonly ScriptBlockAst RequirementsAst; @@ -176,7 +176,9 @@ public override Task> ResolveRequirements() { if (!dontAddAnalyser) { lock (this.Requirements) { var analyserPath = GetExportedResource("Analyser.psm1").Unwrap(); + var moduleUtilsPath = GetExportedResource("ModuleUtils.psm1").Unwrap(); this.Requirements.AddRequirement(new PathedModuleSpec(Directory.GetParent(analyserPath)!.FullName, analyserPath)); // Safety - We know this will always be present in the resources. + this.Requirements.AddRequirement(new PathedModuleSpec(Directory.GetParent(moduleUtilsPath)!.FullName, moduleUtilsPath)); // Safety - We know this will always be present in the resources. } } diff --git a/src/Compiler/Resources/ModuleUtils.psm1 b/src/Compiler/Resources/ModuleUtils.psm1 new file mode 120000 index 00000000..31c2ef84 --- /dev/null +++ b/src/Compiler/Resources/ModuleUtils.psm1 @@ -0,0 +1 @@ +../../common/ModuleUtils.psm1 \ No newline at end of file From 80e98961c1fafa1b3d8e260129fbbba18038cd68 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 10 Feb 2025 12:18:34 +1100 Subject: [PATCH 248/341] fix(script/Update-ToWin11): Add SkipCheck parameter and improve processor unicode handling. Allows unicode to work properly no matter if ps5 loads it incorrectly. --- src/microsoft/windows/Update-ToWin11.ps1 | 6 ++- src/microsoft/windows/Update-ToWin11.psm1 | 53 +++++++++++++++-------- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/microsoft/windows/Update-ToWin11.ps1 b/src/microsoft/windows/Update-ToWin11.ps1 index 2c39f66e..fc7cd91c 100644 --- a/src/microsoft/windows/Update-ToWin11.ps1 +++ b/src/microsoft/windows/Update-ToWin11.ps1 @@ -5,6 +5,10 @@ Using module .\Update-ToWin11.psm1 [CmdletBinding()] param( + [Parameter()] + [ValidateNotNull()] + [Switch]$SkipCheck, + [Parameter()] [ValidateNotNull()] [Switch]$CheckOnly, @@ -15,7 +19,7 @@ param( ) Invoke-RunMain $PSCmdlet { - if (-not (Test-CanUpgrade -AlwaysShowResults:$AlwaysShowResults) -or $CheckOnly) { + if (-not $SkipCheck -and -not (Test-CanUpgrade -AlwaysShowResults:$AlwaysShowResults) -or $CheckOnly) { return; } diff --git a/src/microsoft/windows/Update-ToWin11.psm1 b/src/microsoft/windows/Update-ToWin11.psm1 index a2018aa0..9d386372 100644 --- a/src/microsoft/windows/Update-ToWin11.psm1 +++ b/src/microsoft/windows/Update-ToWin11.psm1 @@ -2,6 +2,10 @@ Using module ..\..\common\Scope.psm1 Using module ..\..\common\Logging.psm1 +Using module ..\..\common\Registry.psm1 + +$TradeMarkUnicode = [char]0x2122; +$RegisteredTradeMarkUnicode = [char]0x00AE; function Get-SupportedProcessor { [CmdletBinding()] @@ -31,8 +35,8 @@ function Get-SupportedProcessor { if ($Brand -eq 'Intel') { $SupportedProcessors = $RawProcessors | ForEach-Object { - $_ -replace '®', '(R),' ` - -replace '™', '(TM),' ` + $_ -replace $RegisteredTradeMarkUnicode, '(R),' ` + -replace $TradeMarkUnicode, '(TM),' ` -replace 'Processor', 'Processor,'; # Single outlier that needs to be split }; } elseif ($Brand -eq 'AMD') { @@ -41,24 +45,24 @@ function Get-SupportedProcessor { # Ordering is important here, as we want to split on the most specific first $BrandModelSplitPoints = @( - 'Ryzen™ Threadripper™ PRO' - 'Ryzen™ Embedded' + "Ryzen$TradeMarkUnicode Threadripper$TradeMarkUnicode PRO" + "Ryzen$TradeMarkUnicode Embedded" 'Ryzen Embedded R2000 Series' - 'Ryzen™ \d [A-z]+' - 'Ryzen™ \d' - 'Ryzen™' - 'EPYC™' - 'Athlon™' + "Ryzen$TradeMarkUnicode \d [A-z]+" + "Ryzen$TradeMarkUnicode \d" + "Ryzen$TradeMarkUnicode" + "EPYC$TradeMarkUnicode" + "Athlon$TradeMarkUnicode" 'AMD' ); $BrandModel = $Split -split "($($BrandModelSplitPoints -join '|'))"; - "AMD,$($BrandModel[1]),$($BrandModel[2])" -replace '™',''; + "AMD,$($BrandModel[1]),$($BrandModel[2])" -replace $TradeMarkUnicode, ''; }; } elseif ($Brand -eq 'Qualcomm') { $SupportedProcessors = $RawProcessors | ForEach-Object { - $_ -replace '®', ',' ` - -replace '™', ','; + $_ -replace $RegisteredTradeMarkUnicode, ',' ` + -replace $TradeMarkUnicode, ','; }; } else { Invoke-Error "Unsupported processor brand: $Brand"; @@ -115,9 +119,7 @@ function Test-CanUpgrade { if ($Result.Values -contains $False -or $Result["64 Bit OS"] -eq $False) { Invoke-Error 'Your system does not meet the minimum requirements to upgrade to Windows 11, see the details below:'; $Result.GetEnumerator() | ForEach-Object { - if (-not $_.Value) { - Invoke-Error "$($_.Key): $($_.Value)"; - } + Invoke-Error "$($_.Key): $($_.Value)"; } return $False; } @@ -140,6 +142,21 @@ function Test-CanUpgrade { } } +function Write-SetupError([Bool]$MaybeSuccess) { + $RegPath = 'HKLM:\SYSTEM\Setup\setupdiag\results'; + $Success = Get-RegistryKey $RegPath 'OperationCompletedSuccessfully'; + if ($Success -and $MaybeSuccess) { + Invoke-Info 'Windows 11 upgrade completed successfully'; + } else { + $FailureData = Get-RegistryKey $RegPath 'FailureData'; + $FailureDetails = Get-RegistryKey $RegPath 'FailureDetails'; + + Invoke-Error "Windows 11 upgrade failed, see the details below:"; + Invoke-Error "Failure Data: $FailureData"; + Invoke-Error "Failure Details: $FailureDetails"; + } +} + function Update-ToWin11 { [CmdletBinding()] param() @@ -163,11 +180,11 @@ function Update-ToWin11 { # Dont auto reboot Start-Process -FilePath $Private:OutputFile -ArgumentList "/QuietInstall /SkipEULA /auto upgrade /UninstallUponUpgrade /copylogs $Private:Dir" -Wait; - # send ui message after complete, - - Invoke-Info 'Windows 11 upgrade completed successfully, please reboot to continue...'; + # send ui message after complete + Write-SetupError $True; } catch { Invoke-Error "There was an error upgrading to Windows 11, please check the logs for more information inside $Private:Dir"; + Write-SetupError $False; $PSCmdlet.ThrowTerminatingError($_); } } From 3efb0f9b9187d4b25cb3a5485c9bbf20b69a49c2 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 10 Feb 2025 18:40:09 +1100 Subject: [PATCH 249/341] fix(Registry): Add output type for Test-RegistryKey and expand property in Get-RegistryKey --- src/common/Registry.psm1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/common/Registry.psm1 b/src/common/Registry.psm1 index 0813555b..89e16763 100644 --- a/src/common/Registry.psm1 +++ b/src/common/Registry.psm1 @@ -37,6 +37,7 @@ function Invoke-EnsureRegistryPath { function Test-RegistryKey { [CmdletBinding()] + [OutputType([Boolean])] param ( [Parameter(Mandatory)] [String]$Path, @@ -74,7 +75,7 @@ function Get-RegistryKey { process { if (Test-RegistryKey -Path $Path -Key $Key) { - return Get-ItemProperty -Path $Path -Name $Key; + return Get-ItemProperty -Path $Path -Name $Key | Select-Object -ExpandProperty $Key; } return $Null; From 865d763322f762e392458c5840d063b45d8c1119 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 10 Feb 2025 18:41:20 +1100 Subject: [PATCH 250/341] fix(script/Update-ToWin11): Enhance error handling and add support for blocking driver detection during upgrade --- src/Compiler/Program.cs | 2 + src/microsoft/windows/Update-ToWin11.psm1 | 45 ++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index a06fe38c..3406cfb6 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -28,6 +28,8 @@ namespace Compiler; +// TODO - Auto replace unicode characters with [char]0x{0:X4} in strings +// Fucking N-Sight forces encoding in UTF-8 without bom which breaks unicode in PS5 public class Program { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); diff --git a/src/microsoft/windows/Update-ToWin11.psm1 b/src/microsoft/windows/Update-ToWin11.psm1 index 9d386372..b186e8e2 100644 --- a/src/microsoft/windows/Update-ToWin11.psm1 +++ b/src/microsoft/windows/Update-ToWin11.psm1 @@ -145,7 +145,7 @@ function Test-CanUpgrade { function Write-SetupError([Bool]$MaybeSuccess) { $RegPath = 'HKLM:\SYSTEM\Setup\setupdiag\results'; $Success = Get-RegistryKey $RegPath 'OperationCompletedSuccessfully'; - if ($Success -and $MaybeSuccess) { + if ($False -and $MaybeSuccess -and $Success -eq 'True') { Invoke-Info 'Windows 11 upgrade completed successfully'; } else { $FailureData = Get-RegistryKey $RegPath 'FailureData'; @@ -154,6 +154,38 @@ function Write-SetupError([Bool]$MaybeSuccess) { Invoke-Error "Windows 11 upgrade failed, see the details below:"; Invoke-Error "Failure Data: $FailureData"; Invoke-Error "Failure Details: $FailureDetails"; + + # $ErrorCode = $FailureDetails | Select-String -Pattern 'ErrorCode = (0x\d+),' | ForEach-Object { $_.Matches.Groups[1].Value }; + # $ScanResultFile = "$env:SystemDrive\`$WINDOWS.~BT\Sources\Panther\ScanResult.xml"; + $ScanResultFile = "C:\Users\JamesDraycott\AppData\Local\Temp\ScanResult.xml"; + if (Test-Path $ScanResultFile) { + Invoke-Verbose 'Checking for blocking drivers...'; + + $PnpDevices = Get-PnpDevice -PresentOnly; + $PnpDeviceInfs = @{}; + $PnpDevices | ForEach-Object { + $InfPath = $_ | Get-PnpDeviceProperty -KeyName 'DEVPKEY_Device_DriverInfPath'; + $PnpDeviceInfs[$_.InstanceId] = $InfPath.Data; + } + + $DriverPackages = (Select-Xml -Path $ScanResultFile -XPath '/*').Node.DriverPackages.DriverPackage; + $DriverPackages | ForEach-Object { + $Driver = $_; + if ($Driver.BlockMigration -eq 'True') { + $DriverName = $Driver.Inf; + $DriverDetails = Get-WindowsDriver -Online -Driver $DriverName; + $InUseByDevices = $PnpDevices | Where-Object { + $PnpDeviceInfs[$_.InstanceId] -eq $DriverName; + } + + Invoke-Error @" +Driver: $DriverName is blocking the upgrade to Windows 11, see the details below: + In Use By Devices: $($InUseByDevices | Select-Object -ExpandProperty FriendlyName -Join ', ') + Driver Details: $DriverDetails +"@ + } + } + } } } @@ -176,6 +208,15 @@ function Update-ToWin11 { Invoke-Info 'Starting Windows 11 upgrade, this will take a while with no progress bar...'; try { + $UnsupportedFeatures = @('Printing-PrintToPDFServices-Features', 'Printing-XPSServices-Features'); + $UnsupportedFeatures | ForEach-Object { + $Status = Get-WindowsOptionalFeature -FeatureName $_ -Online; + if ($Status.State -eq 'Enabled' -or $Status.State -eq 'EnablePending') { + Invoke-Info "Disabling feature: $_"; + Disable-WindowsOptionalFeature -FeatureName $_ -Online; + } + } + # TODO - Maybe use the processes resource monitor to determine if its downloading, copying or what? # Dont auto reboot Start-Process -FilePath $Private:OutputFile -ArgumentList "/QuietInstall /SkipEULA /auto upgrade /UninstallUponUpgrade /copylogs $Private:Dir" -Wait; @@ -190,4 +231,4 @@ function Update-ToWin11 { } } -Export-ModuleMember -Function 'Update-ToWin11', 'Test-CanUpgrade', 'Get-SupportedProcessor'; +Export-ModuleMember -Function 'Update-ToWin11', 'Test-CanUpgrade', 'Get-SupportedProcessor', 'Write-SetupError'; From 644b546239898cdb1b4e841632cbb586460031c0 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 10 Feb 2025 18:45:14 +1100 Subject: [PATCH 251/341] fix(Compiler): Refactor ContentBytes handling to be Lazy and improve error logging --- src/Compiler/Analyser/Rules/RuleVisitor.cs | 2 +- .../Analyser/Rules/UseOfUndefinedFunction.cs | 2 +- src/Compiler/Module/Compiled/Compiled.cs | 13 +++++++++---- src/Compiler/Module/Compiled/Local.cs | 4 +--- src/Compiler/Module/Compiled/Remote.cs | 10 +++------- src/Compiler/Module/Compiled/Script.cs | 2 +- src/Compiler/Module/Resolvable/Resolvable.cs | 4 ++-- 7 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/Compiler/Analyser/Rules/RuleVisitor.cs b/src/Compiler/Analyser/Rules/RuleVisitor.cs index b22c80ec..fd7b1142 100644 --- a/src/Compiler/Analyser/Rules/RuleVisitor.cs +++ b/src/Compiler/Analyser/Rules/RuleVisitor.cs @@ -31,7 +31,7 @@ public override AstVisitAction DefaultVisit(Ast ast) { if (GetSupressions(ast).IsErr(out var err, out var suppressions)) { this.Issues.AddRange(((ManyErrors)err).Errors.Cast()); return AstVisitAction.SkipChildren; - }; + } foreach (var rule in this.Rules) { // If the key doesn't exist assume we support it, this allows for usage outside of the visitor like in tests. diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index 7ecfaf88..44af51f3 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -16,7 +16,7 @@ public class UseOfUndefinedFunction : Rule { /// A list of all the built-in functions that are provided in a standard session. /// This includes modules that are imported by default. /// - private static readonly HashSet BuiltinsFunctions = GetDefaultSessionFunctions().ToHashSet(); + private static readonly HashSet BuiltinsFunctions = [.. GetDefaultSessionFunctions()]; // Don't use a concurrent dictionary as just having it per thread is actually faster. private static readonly ThreadLocal>> AvailableFunctionsAndAliasesForAst = new(() => []); diff --git a/src/Compiler/Module/Compiled/Compiled.cs b/src/Compiler/Module/Compiled/Compiled.cs index 1fbd3071..d63c87e4 100644 --- a/src/Compiler/Module/Compiled/Compiled.cs +++ b/src/Compiler/Module/Compiled/Compiled.cs @@ -14,7 +14,11 @@ namespace Compiler.Module.Compiled; [method: Pure] public abstract class Compiled(ModuleSpec moduleSpec, RequirementGroup requirements) { - public Compiled(ModuleSpec moduleSpec, RequirementGroup requirements, byte[] contentBytes) : this(moduleSpec, requirements) => this.ContentBytes = contentBytes; + public Compiled( + ModuleSpec moduleSpec, + RequirementGroup requirements, + Lazy contentBytes + ) : this(moduleSpec, requirements) => this.ContentBytes = contentBytes; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); @@ -24,7 +28,8 @@ public abstract class Compiled(ModuleSpec moduleSpec, RequirementGroup requireme public virtual RequirementGroup Requirements { get; } = requirements; - public abstract byte[] ContentBytes { get; init; } + [NotNull] + public Lazy? ContentBytes { get; protected set; } /// /// Gets combined the hash of the content and requirements of the module. @@ -34,7 +39,7 @@ public string ComputedHash { // So we need to tell the compiler to not optimize this method. [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] get { - var byteList = new List((byte[])this.ContentBytes.Clone()); + var byteList = new List((byte[])this.ContentBytes!.Value.Clone()); this.AddRequirementHashBytes(byteList, this.Requirements); return Convert.ToHexString(SHA256.HashData([.. byteList])); } @@ -142,7 +147,7 @@ [NotNull] RequirementGroup requirementGroup Logger.Error($"Module {this.ModuleSpec.Name} is not in the graph of its root parent."); } - hashableBytes.AddRange(this.GetRootParent()!.Graph.OutEdges(this).ToList() + hashableBytes.AddRange(rootGraph.OutEdges(this).ToList() .Select(edge => edge.Target.ComputedHash) .Select(Encoding.UTF8.GetBytes) .Flatten()); diff --git a/src/Compiler/Module/Compiled/Local.cs b/src/Compiler/Module/Compiled/Local.cs index 248917b5..04343c0b 100644 --- a/src/Compiler/Module/Compiled/Local.cs +++ b/src/Compiler/Module/Compiled/Local.cs @@ -19,8 +19,6 @@ public class CompiledLocalModule : Compiled { public virtual CompiledDocument Document { get; } - public override byte[] ContentBytes { get; init; } - [Pure] public CompiledLocalModule( PathedModuleSpec moduleSpec, @@ -28,7 +26,7 @@ public CompiledLocalModule( RequirementGroup requirements ) : base(moduleSpec, requirements) { this.Document = document; - this.ContentBytes = Encoding.UTF8.GetBytes(this.StringifyContent()); + this.ContentBytes = new(() => Encoding.UTF8.GetBytes(this.StringifyContent())); } public override string StringifyContent() => new StringBuilder() diff --git a/src/Compiler/Module/Compiled/Remote.cs b/src/Compiler/Module/Compiled/Remote.cs index 6690396c..1fcf24b0 100644 --- a/src/Compiler/Module/Compiled/Remote.cs +++ b/src/Compiler/Module/Compiled/Remote.cs @@ -37,15 +37,11 @@ private sealed record ExtraModuleInfo( public override Version Version { get; } - public override byte[] ContentBytes { get; init; } - public CompiledRemoteModule( ModuleSpec moduleSpec, RequirementGroup requirements, byte[] bytes - ) : base(moduleSpec, requirements) { - this.ContentBytes = bytes; - + ) : base(moduleSpec, requirements, new Lazy(bytes)) { var manifest = this.GetPowerShellManifest(); this.Version = manifest["ModuleVersion"] switch { string version => Version.Parse(version), @@ -67,7 +63,7 @@ byte[] bytes } public override string StringifyContent() { - var base64 = Convert.ToBase64String(this.ContentBytes); + var base64 = Convert.ToBase64String(this.ContentBytes!.Value); return $"'{base64}'"; } @@ -132,7 +128,7 @@ public override IEnumerable GetExportedFunctions() { return exportedFunctions; } - private ZipArchive GetZipArchive() => this.ZipArchive ??= new ZipArchive(new MemoryStream((byte[])this.ContentBytes.Clone()), ZipArchiveMode.Read, false); + private ZipArchive GetZipArchive() => this.ZipArchive ??= new ZipArchive(new MemoryStream((byte[])this.ContentBytes.Value.Clone()), ZipArchiveMode.Read, false); private Hashtable GetPowerShellManifest() { if (this.PowerShellManifest != null) return this.PowerShellManifest; diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index f339a0ff..7da3e5c0 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -141,7 +141,7 @@ public override string GetPowerShellObject() { if (FillTemplate(template, replacements).IsErr(out var error, out var filledTemplate)) { Program.Errors.Add(error); return string.Empty; - }; + } return filledTemplate; } diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index f3680eea..cd8d45c1 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -272,7 +272,7 @@ public async Task StartCompilation() { Logger.Trace($"{(compiledModule.IsFail ? "Unsuccessfully" : "Successfully")} compiled script {resolvable.ModuleSpec.Name}"); }).ContinueWith(task => { if (task.IsFaulted) { - Logger.Error(task.Exception, "Failed to compile top level script."); + Logger.Error(task.Exception, "Failed to compile top level script {0}", resolvable.ModuleSpec.Name); Program.Errors.Add(task.Exception); } })); @@ -418,7 +418,7 @@ [.. mergeWith] goto default; default: break; - }; + } if (resultingResolvable is null) { return FinFail>(Error.New($"Failed to resolve {moduleToResolve.Name}.")); From f9f39020b250401277794069a3f15a5cdb967dbc Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 17 Feb 2025 17:58:06 +1100 Subject: [PATCH 252/341] fix(Exit): Change global variables to script scope --- .vscode/settings.json | 6 ++---- src/common/Exit.psm1 | 41 +++++++++++++++++++---------------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 428f2c84..5aa3f994 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,9 +15,6 @@ "powershell.pester.codeLens": false, "powershell.scriptAnalysis.settingsPath": "PSScriptAnalyzerSettings.psd1", "poshProTools.ignoredPaths": "compiled/*", - "pester.testFilePath": [ - "tests/*.[tT]ests.[pP][sS]1" - ], "markiscodecoverage.searchCriteria": "tests\\Compiler\\Coverage\\coverage.info", "markiscodecoverage.enableDecorations": true, "poshProTools.disableNewsNotification": true, @@ -34,5 +31,6 @@ "path-intellisense.autoTriggerNextSuggestion": true, "powershell.analyzeOpenDocumentsOnly": true, "powershell.developer.editorServicesLogLevel": "Diagnostic", - "powershell.integratedConsole.suppressStartupBanner": true + "powershell.integratedConsole.suppressStartupBanner": true, + "pester.runTestsInNewProcess": true } diff --git a/src/common/Exit.psm1 b/src/common/Exit.psm1 index 1b8e5dc5..0cf6134d 100644 --- a/src/common/Exit.psm1 +++ b/src/common/Exit.psm1 @@ -1,17 +1,17 @@ Using module .\Logging.psm1 -[HashTable]$Global:ExitHandlers = @{}; -[HashTable]$Global:ExitCodes = @{}; -[Boolean]$Global:ExitHandlersRun = $false; +[HashTable]$Script:ExitHandlers = @{}; +[HashTable]$Script:ExitCodes = @{}; +[Boolean]$Script:ExitHandlersRun = $false; function Invoke-Handlers([switch]$IsFailure) { - if ($Global:ExitHandlersRun) { + if ($Script:ExitHandlersRun) { Invoke-Debug -Message 'Exit handlers already run, skipping...'; return; } - foreach ($Local:ExitHandlerName in $Global:ExitHandlers.Keys) { - [PSCustomObject]$Local:ExitHandler = $Global:ExitHandlers[$Local:ExitHandlerName]; + foreach ($Local:ExitHandlerName in $Script:ExitHandlers.Keys) { + [PSCustomObject]$Local:ExitHandler = $Script:ExitHandlers[$Local:ExitHandlerName]; if ($Local:ExitHandler.OnlyFailure -and (-not $IsFailure)) { continue; } @@ -24,7 +24,7 @@ function Invoke-Handlers([switch]$IsFailure) { } } - $Global:ExitHandlersRun = $true; + $Script:ExitHandlersRun = $true; } function Invoke-FailedExit { @@ -48,17 +48,14 @@ function Invoke-FailedExit { [System.Management.Automation.Cmdlet]$CallingCmdlet = $PSCmdlet ) - [String]$Local:ExitDescription = $Global:ExitCodes[$ExitCode]; - if ($null -ne $Local:ExitDescription -and $Local:ExitDescription.Length -gt 0) { - if ($FormatArgs) { - [String]$Local:ExitDescription = $Local:ExitDescription -f $FormatArgs; - } + [String]$ExitDescription = $Script:ExitCodes[$ExitCode]; + if (-not [String]::IsNullOrEmpty($ExitDescription)) { + if ($FormatArgs) { $ExitDescription = $ExitDescription -f $FormatArgs } - Invoke-Error $Local:ExitDescription; - } elseif ($ExitCode -lt 1000) { - Invoke-FailedExit -ExitCode $Script:INVALID_ERROR_CODE -FormatArgs $ExitCode; + Invoke-Error $ExitDescription; } elseif ($ExitCode -ne 0 -and $ExitCode -ne 9999) { - Invoke-Warn "No exit description found for code '$ExitCode'"; + $Category = [Enum]::ToObject([System.Management.Automation.ErrorCategory], 1) + Invoke-Error -Message "Exit code $Category"; } # FIXME - Not getting to correct depth of exception @@ -168,11 +165,11 @@ function Register-ExitHandler { [PSCustomObject]$Local:Value = @{ OnlyFailure = $OnlyFailure; Script = $ExitHandler }; Invoke-Debug "Registering exit handler '$Local:TrimmedName'"; - if ($Global:ExitHandlers[$Local:TrimmedName]) { + if ($Script:ExitHandlers[$Local:TrimmedName]) { Invoke-Warn "Exit handler '$Local:TrimmedName' already registered, overwriting..."; - $Global:ExitHandlers[$Local:TrimmedName] = $Local:Value; + $Script:ExitHandlers[$Local:TrimmedName] = $Local:Value; } else { - $Global:ExitHandlers.add($Local:TrimmedName, $Local:Value); + $Script:ExitHandlers.add($Local:TrimmedName, $Local:Value); } } @@ -185,12 +182,12 @@ function Register-ExitCode { ) $Local:TrimmedDescription = $Description.Trim(); - $Local:ExitCode = $Global:ExitCodes | Where-Object { $_.Value -eq $Local:TrimmedDescription }; + $Local:ExitCode = $Script:ExitCodes | Where-Object { $_.Value -eq $Local:TrimmedDescription }; if (-not $Local:ExitCode) { - $Local:ExitCode = $Global:ExitCodes.Count + 1001; + $Local:ExitCode = $Script:ExitCodes.Count + 1001; Invoke-Debug "Registering exit code '$Local:ExitCode' with description '$Local:TrimmedDescription'..."; - $Global:ExitCodes.add($Local:ExitCode, $Local:TrimmedDescription); + $Script:ExitCodes.add($Local:ExitCode, $Local:TrimmedDescription); } return $Local:ExitCode; From fcca2ff4752b5bca257943b0ec42fa2e8c6b6216 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 20 Feb 2025 15:17:00 +1100 Subject: [PATCH 253/341] refactor(tests): reorganize test structure. Most tests are failing at this point and need to be fixed --- .github/workflows/test.yaml | 18 +- tests/PesterConfiguration.psd1 | 23 +++ tests/common/01-Logging.Tests.ps1 | 178 ------------------ tests/common/01-Scope.Tests.ps1 | 80 -------- tests/common/02-Event.Tests.ps1 | 64 ------- tests/common/02-Exit.Tests.ps1 | 71 ------- tests/common/05-Assert.Tests.ps1 | 29 --- tests/common/40-Temp.Tests.ps1 | 4 - tests/common/50-Input.Tests.ps1 | 44 ----- tests/common/Assert/Assert-Equal.Tests.ps1 | 15 ++ tests/common/Assert/Assert-NotNull.Tests.ps1 | 12 ++ tests/common/Base.ps1 | 14 -- .../Register-EventSubscription.Tests.ps1 | 24 +++ tests/common/Event/Submit-Event.Tests.ps1 | 21 +++ .../Unregister-EventSubscription.Tests.ps1 | 20 ++ tests/common/Exit/Invoke-FailedExit.Tests.ps1 | 39 ++++ tests/common/Exit/Invoke-Handlers.Tests.ps1 | 31 +++ .../{99-Flag.Tests.ps1 => Flag.Tests.ps1} | 6 +- tests/common/Input/Get-UserInput.Tests.ps1 | 25 +++ tests/common/Input/Validation.Tests.ps1 | 17 ++ tests/common/Logging/Invoke-Level.Tests.ps1 | 117 ++++++++++++ tests/common/Logging/Invoke-Write.Tests.ps1 | 39 ++++ tests/common/Scope/Enter-Scope.Tests.ps1 | 35 ++++ tests/common/Scope/Exit-Scope.Tests.ps1 | 2 + tests/common/Scope/Format-ScopeName.Tests.ps1 | 54 ++++++ .../common/Utils/Remove-EncodingBom.Tests.ps1 | 61 ++++++ .../Utils.Tests.ps1} | 5 +- utils/Invoke-CodeCoverage.ps1 | 20 -- 28 files changed, 552 insertions(+), 516 deletions(-) create mode 100644 tests/PesterConfiguration.psd1 delete mode 100644 tests/common/01-Logging.Tests.ps1 delete mode 100644 tests/common/01-Scope.Tests.ps1 delete mode 100644 tests/common/02-Event.Tests.ps1 delete mode 100644 tests/common/02-Exit.Tests.ps1 delete mode 100644 tests/common/05-Assert.Tests.ps1 delete mode 100644 tests/common/40-Temp.Tests.ps1 delete mode 100644 tests/common/50-Input.Tests.ps1 create mode 100644 tests/common/Assert/Assert-Equal.Tests.ps1 create mode 100644 tests/common/Assert/Assert-NotNull.Tests.ps1 delete mode 100644 tests/common/Base.ps1 create mode 100644 tests/common/Event/Register-EventSubscription.Tests.ps1 create mode 100644 tests/common/Event/Submit-Event.Tests.ps1 create mode 100644 tests/common/Event/Unregister-EventSubscription.Tests.ps1 create mode 100644 tests/common/Exit/Invoke-FailedExit.Tests.ps1 create mode 100644 tests/common/Exit/Invoke-Handlers.Tests.ps1 rename tests/common/{99-Flag.Tests.ps1 => Flag.Tests.ps1} (95%) create mode 100644 tests/common/Input/Get-UserInput.Tests.ps1 create mode 100644 tests/common/Input/Validation.Tests.ps1 create mode 100644 tests/common/Logging/Invoke-Level.Tests.ps1 create mode 100644 tests/common/Logging/Invoke-Write.Tests.ps1 create mode 100644 tests/common/Scope/Enter-Scope.Tests.ps1 create mode 100644 tests/common/Scope/Exit-Scope.Tests.ps1 create mode 100644 tests/common/Scope/Format-ScopeName.Tests.ps1 create mode 100644 tests/common/Utils/Remove-EncodingBom.Tests.ps1 rename tests/common/{00-Utils.Tests.ps1 => Utils/Utils.Tests.ps1} (98%) delete mode 100644 utils/Invoke-CodeCoverage.ps1 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index f687e734..1afdec8d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -43,17 +43,25 @@ jobs: runs-on: ubuntu-latest permissions: contents: read + checks: write steps: - name: Checkout Repo uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Install Dependencies shell: pwsh - run: | - Install-Module -Name Pester -Scope CurrentUser -Force + run: Install-Module -Name Pester -Scope CurrentUser -Force - name: Run Pester Tests shell: pwsh - run: .\utils\Invoke-CodeCoverage.ps1 + run: | + $Config = Import-PowerShellDataFile -Path "tests/PesterConfiguration.psd1"; + Invoke-Pester -Configuration $Config -PassThru + + - name: Upload test results + id: test-results + uses: natescherer/pester-tests-report@combined + with: + test_results_path: "tests/TestResults/PesterTestResults.xml" + github_token: ${{ secrets.GITHUB_TOKEN }} + tests_fail_step: true diff --git a/tests/PesterConfiguration.psd1 b/tests/PesterConfiguration.psd1 new file mode 100644 index 00000000..885ba8e6 --- /dev/null +++ b/tests/PesterConfiguration.psd1 @@ -0,0 +1,23 @@ +[PesterConfiguration]@{ + Run = @{ + Path = 'tests'; + PassThru = $True; + TestExtension = '.Tests.ps1'; + } + Filter = @{ } + CodeCoverage = @{ + Enabled = $True; + CoveragePercentTarget = 80; + OutputFormat = 'JaCoCo'; + OutputPath = 'tests\Coverage\CodeCoverage.xml'; + } + TestResult = @{ + Enabled = $True; + OutputFormat = 'NUnit2.5'; + OutputPath = 'tests\TestResults\PesterTestResults.xml'; + } + Output = @{ + Verbosity = 'Detailed'; + StackTraceVerbosity = 'Filtered' + } +} diff --git a/tests/common/01-Logging.Tests.ps1 b/tests/common/01-Logging.Tests.ps1 deleted file mode 100644 index 27c71094..00000000 --- a/tests/common/01-Logging.Tests.ps1 +++ /dev/null @@ -1,178 +0,0 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} - -BeforeAll { - function Get-ShouldBeString([String]$String) { - $Local:FixedString = $String -replace "`n", "`n+ "; - - if (Test-SupportsUnicode) { - # There is an extra space at the end of the string - $Local:FixedString = " $Local:FixedString" - } - - return $Local:FixedString; - } - - function Get-Stripped([Parameter(ValueFromPipeline)][String]$String) { - # Replace all non-ASCII characters with a nothing string - # Replace all ANSI escape sequences with a nothing string - $String -replace '[^\u0000-\u007F]', '' -replace '\x1B\[[0-9;]*m', ''; - } -} - -Describe 'Logging Tests' { - # TODO - Context 'Unicode & Colour Support' { - - } - - Context 'Invoke-Write' { - It 'Should not write anything if $ShouldWrite is $false' { - @{ - PSPrefix = '🌟' - PSMessage = 'Test message' - PSColour = 'Green' - ShouldWrite = $false - } | Invoke-Write -InformationVariable Output; - - $Output | Select-Object -First 1 | Should -Be $null; - } - - It 'Should write the message if $ShouldWrite is $true' { - $Params = @{ - PSPrefix = '🌟' - PSMessage = 'Test message' - PSColour = 'Green' - ShouldWrite = $true - }; - - $Params | Invoke-Write -InformationVariable Output; - $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.PSMessage); - } - - It 'Should replace newline characters in the message' { - $Params = @{ - PSPrefix = '🌟' - PSMessage = "Test message`nSecond line" - PSColour = 'Green' - ShouldWrite = $true - }; - - $Params | Invoke-Write -InformationVariable Output; - $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.PSMessage); - } - } - - Context 'Invoke-Info' { - It 'Should write when $Global:Logging.Information is $true' { - $Global:Logging.Information = $true; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Info -InformationVariable Output; - $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); - } - - It 'Should not write when $Global:Logging.Information is $false' { - $Global:Logging.Information = $false; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Info -InformationVariable Output; - $Output | Select-Object -First 1 | Should -Be $null; - } - } - - Context 'Invoke-Verbose' { - It 'Should write when $Global:Logging.Verbose is $true' { - $Global:Logging.Verbose = $true; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Verbose -InformationVariable Output; - $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); - } - - It 'Should not write when $Global:Logging.Verbose is $false' { - $Global:Logging.Verbose = $false; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Verbose -InformationVariable Output; - $Output | Select-Object -First 1 | Should -Be $null; - } - } - - Context 'Invoke-Debug' { - It 'Should write when $Global:Logging.Debug is $true' { - $Global:Logging.Debug = $true; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Debug -InformationVariable Output; - $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); - } - - It 'Should not write when $Global:Logging.Debug is $false' { - $Global:Logging.Debug = $false; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Debug -InformationVariable Output; - $Output | Select-Object -First 1 | Should -Be $null; - } - } - - Context 'Invoke-Error' { - It 'Should write when $Global:Logging.Error is $true' { - $Global:Logging.Error = $true; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Error -InformationVariable Output; - $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); - } - - It 'Should not write when $Global:Logging.Error is $false' { - $Global:Logging.Error = $false; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Error -InformationVariable Output; - $Output | Select-Object -First 1 | Should -Be $null; - } - } - - Context 'Invoke-Warn' { - It 'Should write when $Global:Logging.Warning is $true' { - $Global:Logging.Warning = $true; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Warn -InformationVariable Output; - $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); - } - - It 'Should not write when $Global:Logging.Warning is $false' { - $Global:Logging.Warning = $false; - $Params = @{ - Message = 'Test message' - }; - - $Params | Invoke-Warn -InformationVariable Output; - $Output | Select-Object -First 1 | Should -Be $null; - } - } - - -} diff --git a/tests/common/01-Scope.Tests.ps1 b/tests/common/01-Scope.Tests.ps1 deleted file mode 100644 index 8a56891a..00000000 --- a/tests/common/01-Scope.Tests.ps1 +++ /dev/null @@ -1,80 +0,0 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} - -Describe 'Scope.psm1 Tests' { - Context 'Formatting Tests' { - It 'Should format a single scope correctly' { - Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-StackTop -MockWith { return @{Invocation = @{MyCommand = @{Name = 'It' } }; }; }; - - Format-ScopeName -IsExit:$False | Should -Be 'It'; - Should -Invoke -CommandName Get-StackTop -ModuleName:$ModuleName -Times 1; - } - - It 'Should format multiple scopes correctly' { - Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-StackTop -MockWith { return @{Invocation = @{MyCommand = @{Name = 'It' } }; }; }; - Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-Stack -MockWith { return [System.Collections.Stack]::new(@( - @{MyCommand = @{Name = 'Describe' } }, - @{MyCommand = @{Name = 'Context' } }, - @{MyCommand = @{Name = 'It' } } - ));}; - - Format-ScopeName -IsExit:$False | Should -Be 'Describe > Context > It'; - Should -Invoke -CommandName Get-StackTop -ModuleName:$ModuleName -Times 1; - Should -Invoke -CommandName Get-Stack -ModuleName:$ModuleName -Times 1; - } - - It 'Should format multiple scopes correctly with exit' { - Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-StackTop -MockWith { return @{Invocation = @{MyCommand = @{Name = 'It' } }; }; }; - Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-Stack -MockWith { return [System.Collections.Stack]::new(@( - @{Invocation = @{MyCommand = @{Name = 'Describe' } } }, - @{Invocation = @{MyCommand = @{Name = 'Context' } } }, - @{Invocation = @{MyCommand = @{Name = 'It' } } } - ));}; - - Format-ScopeName -IsExit:$True | Should -Be 'Describe > Context < It'; - Should -Invoke -CommandName Get-StackTop -ModuleName:$ModuleName -Times 1; - Should -Invoke -CommandName Get-Stack -ModuleName:$ModuleName -Times 1; - } - - It 'Formatting variabels should work' { - $Private:Formatted = Format-Variable @{ foo = 'bar'; hello = 'world'; this = @('super', @{ cool = 'list'; }) }; - $Private:Formatted | Should -Be @" -{ - foo = bar - hello = world - this = [ - super, - { - cool = list - } - ] -} -"@; - } - } - - Context 'Enter-Scope Tests' { - It 'Should push a new scope' { - Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-Stack -MockWith { return [System.Collections.Stack]::new() }; - Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-StackTop -MockWith { return @{Invocation = @{MyCommand = @{Name = 'Describe' }; }; }; }; - - function Test-Scope { - begin { Enter-Scope; } - } - - Test-Scope; - Should -Invoke -CommandName Get-Stack -ModuleName:$ModuleName -Times 1; - Should -Invoke -CommandName Get-StackTop -ModuleName:$ModuleName -Times 1; - Should -Invoke -CommandName Push-Stack -ModuleName:$ModuleName -Times 1; - } - } - - Context 'Exit-Scope Tests' { - - } - - Context "Depth Tests" { - - } -} diff --git a/tests/common/02-Event.Tests.ps1 b/tests/common/02-Event.Tests.ps1 deleted file mode 100644 index 2e979d8c..00000000 --- a/tests/common/02-Event.Tests.ps1 +++ /dev/null @@ -1,64 +0,0 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} - -class TestEvent { - [String]$Name - TestEvent([String]$Name) { $this.Name = $Name } -} - -BeforeAll { - [Type]$Script:EventType = [TestEvent]; - [ScriptBlock]$Script:Callback = { param($EventInstance) $Global:foo = 'bar'; }; - - Register-Event -EventType:$Script:EventType; -} - -Describe 'Event System' { - AfterEach { - $Script:Events[$EventType].Subscriptions.Clear(); - } - - Context 'Register-EventSubscription Function' { - It 'Should add a subscription to the event' { - Register-EventSubscription -EventType:$Script:EventType -Callback:$Script:Callback; - - Invoke-Info "$((Get-Event -EventType:$EventType).Subscriptions)"; - - (Get-Event -EventType:$EventType).Subscriptions.Count | Should -BeExactly 1; - } - - It 'Should return the a unique identifier for the subscription' { - [Int]$Private:Instances = 100; - [Guid[]]$Private:Ids = @(); - for ($i = 0; $i -lt $Private:Instances; $i++) { - $Private:Ids += Register-EventSubscription -EventType:$Script:EventType -Callback:$Script:Callback; - } - - ($Private:Ids | Sort-Object -Unique).Count | Should -BeExactly $Private:Instances; - } - } - - Context 'Submit-Event Function' { - BeforeAll { - $Script:Events = [System.Collections.Generic.Dictionary[Type, Event]]::new() - } - - It 'Should dispatch the event to all subscribers' { - Register-EventSubscription -EventType $EventType -Callback $Callback; - Submit-Event -EventInstance ([TestEvent]::new('Test')) | Should -Be 'Test' - } - } - - Context 'Unregister-EventSubscription Function' { - BeforeAll { - $Script:Events = [System.Collections.Generic.Dictionary[Type, Event]]::new() - } - - It 'Should remove a subscription from the event' { - $Id = Register-EventSubscription -EventType $EventType -Callback $Callback; - Unregister-EventSubscription -EventType $EventType -Id $Id; - $Script:Events[$EventType].Subscriptions.Count | Should -Be 0 - } - } -} diff --git a/tests/common/02-Exit.Tests.ps1 b/tests/common/02-Exit.Tests.ps1 deleted file mode 100644 index 1d76e3f0..00000000 --- a/tests/common/02-Exit.Tests.ps1 +++ /dev/null @@ -1,71 +0,0 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} - -Describe 'Exit Tests' { - Context 'Invoke-FailedExit' { - It 'Should throw with a FailedExit ErrorRecord with the ExitCode as the TargetObject' { - $Local:ThrownError; - try { - Invoke-FailedExit -ExitCode 1; - } - catch { - $Local:ThrownError = $_; - } - - $Local:ThrownError | Should -Not -BeNullOrEmpty; - $Local:ThrownError.TargetObject | Should -BeExactly 1; - } - - It 'Should not throw if DontExit is $true' { - Invoke-FailedExit -ExitCode 1 -DontExit; - } - - It 'Should emit a warning if the ExitCode is not a registered error code' { - Mock -ModuleName:$ModuleName -Verifiable -CommandName Invoke-Warn -MockWith { } -ParameterFilter { $Message -eq 'No exit description found for code ''1050''' }; - - try { Invoke-FailedExit -ExitCode 1050 } catch { }; - - Should -ModuleName:$ModuleName -Invoke -CommandName:'Invoke-Warn' -Times 1; - } - - It 'Should not emit an error if the ExitCode is registered' { - - Mock -ModuleName:$ModuleName -CommandName Invoke-FailedExit -MockWith { } -ParameterFilter { $ExitCode -eq $ExitCode; }; - - try { Invoke-FailedExit -ExitCode $ExitCode } catch { }; - - Should -Not -Invoke -CommandName Invoke-Warn; - } - } - - Context 'Invoke-QuickExit' { - - } - - Context 'Handlers' { - It 'Should call Invoke-Handlers with IsFailure $false if ExitCode is 0' { - Mock -Verifiable -ModuleName:$ModuleName -CommandName Invoke-Handlers -MockWith { } -ParameterFilter { $IsFailure -eq $False; }; - - try { Invoke-QuickExit } catch { }; - - Should -InvokeVerifiable; - Should -Invoke -CommandName Invoke-Handlers -ModuleName:$ModuleName -Times 1; - } - - It 'Should call Invoke-Handlers with IsFailure $true if ExitCode is not 0' { - Mock -Verifiable -ModuleName:$ModuleName -CommandName Invoke-Handlers -MockWith { } -ParameterFilter { $IsFailure -eq $True; }; - - Invoke-FailedExit -ExitCode $Code -DontExit; - - Should -InvokeVerifiable; - Should -Invoke -CommandName Invoke-Handlers -ModuleName:$ModuleName -Times 1; - } -ForEach (1..100 | ForEach-Object { - @{ Code = $_ } - }) - } - - Context 'Script Tests' { - - } -} diff --git a/tests/common/05-Assert.Tests.ps1 b/tests/common/05-Assert.Tests.ps1 deleted file mode 100644 index e3e2f86b..00000000 --- a/tests/common/05-Assert.Tests.ps1 +++ /dev/null @@ -1,29 +0,0 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} - -Describe 'Assert.psm1 Tests' { - Context 'Assert-NotNull' { - It 'Should throw an error if the object is null' { - { Assert-NotNull -Object $null } | Should -Throw - } - - It 'Should throw an error if the object is empty' { - { Assert-NotNull -Object '' } | Should -Throw - } - - It 'Should not throw an error if the object is not null' { - Assert-NotNull -Object 'foo'; - } - } - - Context 'Assert-Equals' { - It 'Should throw an error if the object does not equal the expected value' { - { Assert-Equals -Object 'foo' -Expected 'bar' } | Should -Throw - } - - It 'Should not throw an error if the object equals the expected value' { - Assert-Equals -Object 'foo' -Expected 'foo'; - } - } -} diff --git a/tests/common/40-Temp.Tests.ps1 b/tests/common/40-Temp.Tests.ps1 deleted file mode 100644 index a0fca124..00000000 --- a/tests/common/40-Temp.Tests.ps1 +++ /dev/null @@ -1,4 +0,0 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} - diff --git a/tests/common/50-Input.Tests.ps1 b/tests/common/50-Input.Tests.ps1 deleted file mode 100644 index e23ab056..00000000 --- a/tests/common/50-Input.Tests.ps1 +++ /dev/null @@ -1,44 +0,0 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} - -BeforeAll { - [Void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); - - function Send-Input([String]$String) { - return Start-Job -ScriptBlock { - Start-Sleep -Seconds 1; - - [System.Windows.Forms.SendKeys]::SendWait($using:String); - [System.Windows.Forms.SendKeys]::SendWait('{ENTER}'); - }; - } -} - -Describe 'Input tests' { - Context 'Validations' { - It 'Should export the validations variable for use in other tests' { - $Validations | Should -BeOfType 'Hashtable'; - } - - It 'email validation should return true for ' { - $Email -match $Validations.Email; - } -ForEach @( - { Email = 'test@testing.com' }, - { Email = 'test@testing.com.au' }, - { Email = 'test@mail.testing.com.au' }, - { Email = 'test.user@testing.com' } - ) - } - - Context 'Get-UserInput' { - # It 'Should return the user input' { - - # Send-Input -String 'Test'; - # $UserInput = Get-UserInput -Title 'Test' -Question 'Question'; - - # $UserInput | Should -BeOfType 'String'; - # $UserInput | Should -Be 'Test'; - # } - } -} diff --git a/tests/common/Assert/Assert-Equal.Tests.ps1 b/tests/common/Assert/Assert-Equal.Tests.ps1 new file mode 100644 index 00000000..f96570e0 --- /dev/null +++ b/tests/common/Assert/Assert-Equal.Tests.ps1 @@ -0,0 +1,15 @@ +BeforeDiscovery { Import-Module $PSScriptRoot/../../../src/common/Assert.psm1 } +AfterAll { Remove-Module Assert } + +Describe 'Assert-Equal Tests' { + It 'Should throw an error if the object does not equal the expected value' { + { Assert-Equal -Object 'foo' -Expected 'bar' } | Should -Throw; + } + + It 'Should not throw an error if the object equals the expected value' { + Assert-Equal -Object 'foo' -Expected 'foo'; + } + + Context 'Error Message Formatting' { + } +} diff --git a/tests/common/Assert/Assert-NotNull.Tests.ps1 b/tests/common/Assert/Assert-NotNull.Tests.ps1 new file mode 100644 index 00000000..b8211d68 --- /dev/null +++ b/tests/common/Assert/Assert-NotNull.Tests.ps1 @@ -0,0 +1,12 @@ +BeforeDiscovery { Import-Module $PSScriptRoot/../../../src/common/Assert.psm1 } +AfterAll { Remove-Module Assert } + +Describe 'Assert-NotNull Tests' { + It 'Should throw an error if the object is null' { + { Assert-NotNull -Object $null } | Should -Throw + } + + It 'Should not throw an error if the object is not null' { + Assert-NotNull -Object 'foo'; + } +} diff --git a/tests/common/Base.ps1 b/tests/common/Base.ps1 deleted file mode 100644 index d3e2fbcf..00000000 --- a/tests/common/Base.ps1 +++ /dev/null @@ -1,14 +0,0 @@ -$VerbosePreference = 'Continue'; -$DebugPreference = 'Continue'; -Import-Module -Name $PSScriptRoot/../../src/common/Environment.psm1; - -if ((Get-PSCallStack)[3].Command -or -not ((Get-PSCallStack)[0].Command -match "|$($PSCommandPath | Split-Path -Leaf)")) { - $Local:ModuleName = ((Get-PSCallStack)[0].InvocationInfo.PSCommandPath | Split-Path -LeafBase) -replace '\.Tests$', ''; - Import-Module -Name "$PSScriptRoot/../../src/common/$Local:ModuleName.psm1"; - - if (-not (Get-Module -Name $Local:ModuleName)) { - throw "Module $Local:ModuleName is not available."; - } -} - -return $Local:ModuleName; diff --git a/tests/common/Event/Register-EventSubscription.Tests.ps1 b/tests/common/Event/Register-EventSubscription.Tests.ps1 new file mode 100644 index 00000000..e5ae66fa --- /dev/null +++ b/tests/common/Event/Register-EventSubscription.Tests.ps1 @@ -0,0 +1,24 @@ +BeforeDiscovery { + . $PSScriptRoot/../../../src/common/Event.psm1; +} + +Describe 'Register-EventSubscription Tests' { + AfterEach { + $Script:Events[$EventType].Subscriptions.Clear(); + } + + It 'Should add a subscription to the event' { + Register-EventSubscription -EventType:$Script:EventType -Callback:$Script:Callback; + (Get-Event -EventType:$EventType).Subscriptions.Count | Should -BeExactly 1; + } + + It 'Should return the a unique identifier for the subscription' { + [Int]$Private:Instances = 100; + [Guid[]]$Private:Ids = @(); + for ($i = 0; $i -lt $Private:Instances; $i++) { + $Private:Ids += Register-EventSubscription -EventType:$Script:EventType -Callback:$Script:Callback; + } + + ($Private:Ids | Sort-Object -Unique).Count | Should -BeExactly $Private:Instances; + } +} diff --git a/tests/common/Event/Submit-Event.Tests.ps1 b/tests/common/Event/Submit-Event.Tests.ps1 new file mode 100644 index 00000000..ac72a76f --- /dev/null +++ b/tests/common/Event/Submit-Event.Tests.ps1 @@ -0,0 +1,21 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Event.psm1" } +AfterAll { Remove-Module Event } + +Describe 'Submit-Event Tests' { + BeforeAll { + class TestEvent { + [String]$Name + TestEvent([String]$Name) { $this.Name = $Name } + } + + [Type]$Script:EventType = [TestEvent]; + [ScriptBlock]$Script:Callback = { param($EventInstance) $Global:foo = 'bar'; }; + + Register-Event -EventType:$Script:EventType; + } + + It 'Should dispatch the event to all subscribers' { + Register-EventSubscription -EventType $EventType -Callback $Callback; + Submit-Event -EventInstance ([TestEvent]::new('Test')) | Should -Be 'Test' + } +} diff --git a/tests/common/Event/Unregister-EventSubscription.Tests.ps1 b/tests/common/Event/Unregister-EventSubscription.Tests.ps1 new file mode 100644 index 00000000..e0c9588d --- /dev/null +++ b/tests/common/Event/Unregister-EventSubscription.Tests.ps1 @@ -0,0 +1,20 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Event.psm1" } +AfterAll { Remove-Module Event } + +class TestEvent { + [String]$Name + TestEvent([String]$Name) { $this.Name = $Name } +} + +Describe 'Unregister-EventSubscription Tests' { + BeforeAll { + [Type]$Script:EventType = [TestEvent]; + [ScriptBlock]$Script:Callback = { }; + } + + It 'Should remove a subscription from the event' { + $Id = Register-EventSubscription -EventType $EventType -Callback $Callback; + Unregister-EventSubscription -EventType $EventType -Id $Id; + $Script:Events[$EventType].Subscriptions.Count | Should -Be 0 + } +} diff --git a/tests/common/Exit/Invoke-FailedExit.Tests.ps1 b/tests/common/Exit/Invoke-FailedExit.Tests.ps1 new file mode 100644 index 00000000..ade446d4 --- /dev/null +++ b/tests/common/Exit/Invoke-FailedExit.Tests.ps1 @@ -0,0 +1,39 @@ +BeforeDiscovery { + . $PSScriptRoot/../../../src/common/Exit.psm1; +} + +Describe 'Invoke-FailedExit Tests' { + It 'Should throw with a FailedExit ErrorRecord with the ExitCode as the TargetObject' { + $Local:ThrownError; + try { + Invoke-FailedExit -ExitCode 1; + } + catch { + $Local:ThrownError = $_; + } + + $Local:ThrownError | Should -Not -BeNullOrEmpty; + $Local:ThrownError.TargetObject | Should -BeExactly 1; + } + + It 'Should not throw if DontExit is $true' { + Invoke-FailedExit -ExitCode 1 -DontExit; + } + + It 'Should emit a warning if the ExitCode is not a registered error code' { + Mock -ModuleName:$ModuleName -Verifiable -CommandName Invoke-Warn -MockWith { } -ParameterFilter { $Message -eq 'No exit description found for code ''1050''' }; + + try { Invoke-FailedExit -ExitCode 1050 } catch { }; + + Should -ModuleName:$ModuleName -Invoke -CommandName:'Invoke-Warn' -Times 1; + } + + It 'Should not emit an error if the ExitCode is registered' { + + Mock -ModuleName:$ModuleName -CommandName Invoke-FailedExit -MockWith { } -ParameterFilter { $ExitCode -eq $ExitCode; }; + + try { Invoke-FailedExit -ExitCode $ExitCode } catch { }; + + Should -Not -Invoke -CommandName Invoke-Warn; + } +} diff --git a/tests/common/Exit/Invoke-Handlers.Tests.ps1 b/tests/common/Exit/Invoke-Handlers.Tests.ps1 new file mode 100644 index 00000000..958ef26e --- /dev/null +++ b/tests/common/Exit/Invoke-Handlers.Tests.ps1 @@ -0,0 +1,31 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Exit.psm1" } +AfterAll { Remove-Module Exit } +BeforeAll { $ModuleName = 'Exit' } + +Describe 'Invoke-Handlers Tests' { + It 'Should call Invoke-Handlers with IsFailure $false if ExitCode is 0' { + Mock -Verifiable -ModuleName:$ModuleName -CommandName Invoke-Handlers -MockWith { } -ParameterFilter { $IsFailure -eq $False; }; + + try { Invoke-QuickExit } catch { }; + + Should -InvokeVerifiable; + Should -Invoke -CommandName Invoke-Handlers -ModuleName:$ModuleName -Times 1; + } + + It 'Should call Invoke-Handlers with IsFailure $true if ExitCode is not 0' { + Mock -Verifiable -ModuleName:$ModuleName -CommandName Invoke-Handlers -MockWith { } -ParameterFilter { $IsFailure -eq $True; }; + + Invoke-FailedExit -ExitCode 1000 -DontExit; + + Should -InvokeVerifiable; + } + + It 'Should never call Invoke-Handlers more than once' { + Mock -Verifiable -ModuleName:$ModuleName -CommandName Invoke-Handlers -MockWith { }; + + try { Invoke-QuickExit } catch { }; + try { Invoke-QuickExit } catch { }; + + Should -Invoke -CommandName Invoke-Handlers -ModuleName:$ModuleName -Times 1; + } +} diff --git a/tests/common/99-Flag.Tests.ps1 b/tests/common/Flag.Tests.ps1 similarity index 95% rename from tests/common/99-Flag.Tests.ps1 rename to tests/common/Flag.Tests.ps1 index 51ed54a2..2e7e9686 100644 --- a/tests/common/99-Flag.Tests.ps1 +++ b/tests/common/Flag.Tests.ps1 @@ -1,7 +1,5 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} - +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../src/common/Flag.psm1" } +AfterAll { Remove-Module Flag } Describe 'Flags.psm1 Tests' { AfterEach { $Flag.Remove(); } diff --git a/tests/common/Input/Get-UserInput.Tests.ps1 b/tests/common/Input/Get-UserInput.Tests.ps1 new file mode 100644 index 00000000..e21a44f5 --- /dev/null +++ b/tests/common/Input/Get-UserInput.Tests.ps1 @@ -0,0 +1,25 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Input.psm1" } +AfterAll { Remove-Module Input } + +BeforeAll { + [Void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); + + function Send-Input([String]$String) { + return Start-Job -ScriptBlock { + Start-Sleep -Seconds 1; + + [System.Windows.Forms.SendKeys]::SendWait($using:String); + [System.Windows.Forms.SendKeys]::SendWait('{ENTER}'); + }; + } +} + + +Describe 'Get-UserInput Tests' { + It 'Should return the user input' { + Mock -CommandName Read-Host -MockWith { 'test' }; + + $Result = Get-UserInput -Title 'Hello' -Question 'World'; + $Result | Should -BeExactly 'test'; + } +} diff --git a/tests/common/Input/Validation.Tests.ps1 b/tests/common/Input/Validation.Tests.ps1 new file mode 100644 index 00000000..517117b7 --- /dev/null +++ b/tests/common/Input/Validation.Tests.ps1 @@ -0,0 +1,17 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Input.psm1" } +AfterAll { Remove-Module Input } + +Describe 'Validate Input Tests' { + It 'Should export the validations variable for use in other tests' { + $Validations | Should -BeOfType 'Hashtable'; + } + + It 'email validation should return true for ' { + $Email -match $Validations.Email; + } -ForEach @( + { Email = 'test@testing.com' }, + { Email = 'test@testing.com.au' }, + { Email = 'test@mail.testing.com.au' }, + { Email = 'test.user@testing.com' } + ) +} diff --git a/tests/common/Logging/Invoke-Level.Tests.ps1 b/tests/common/Logging/Invoke-Level.Tests.ps1 new file mode 100644 index 00000000..9fecf667 --- /dev/null +++ b/tests/common/Logging/Invoke-Level.Tests.ps1 @@ -0,0 +1,117 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Logging.psm1" } +AfterAll { Remove-Module Logging } + +BeforeAll { + function Get-ShouldBeString([String]$String) { + $Local:FixedString = $String -replace "`n", "`n+ "; + + if (Test-SupportsUnicode) { + # There is an extra space at the end of the string + $Local:FixedString = " $Local:FixedString" + } + + return $Local:FixedString; + } + + function Get-Stripped([Parameter(ValueFromPipeline)][String]$String) { + # Replace all non-ASCII characters with a nothing string + # Replace all ANSI escape sequences with a nothing string + $String -replace '[^\u0000-\u007F]', '' -replace '\x1B\[[0-9;]*m', ''; + } + + $Params = @{ + Message = 'Test message' + }; +} + +Describe 'Invoke-Level Tests' { + Context 'Invoke-Error Tests' { + It 'Should write when $ErrorActionPreference is Continue' { + $Global:ErrorActionPreference = 'Continue'; + $Params | Invoke-Error -InformationVariable Output; + $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); + } + + It 'Should not write when $ErrorActionPreference is SilentlyContinue or Ignore' { + $Global:ErrorActionPreference = 'SilentlyContinue'; + $Params | Invoke-Error -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + + $Global:ErrorActionPreference = 'Ignore'; + $Params | Invoke-Error -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + } + } + + Context 'Invoke-Warn Tests' { + It 'Should write when $WarningPreference is Continue' { + $Global:WarningPreference = 'Continue'; + $Params | Invoke-Warn -InformationVariable Output; + $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); + } + + It 'Should not write when $WarningPreference is SilentlyContinue or Ignore' { + $Global:WarningPreference = 'SilentlyContinue'; + $Params | Invoke-Warn -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + + $Global:WarningPreference = 'Ignore'; + $Params | Invoke-Warn -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + } + } + + Context 'Invoke-Info Tests' { + It 'Should write when $InformationPreference is Continue' { + $Global:InformationPreference = 'Continue'; + $Params | Invoke-Info -InformationVariable Output; + $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); + } + + It 'Should not write when $InformationPreference is SilentlyContinue or Ignore' { + $Global:InformationPreference = 'SilentlyContinue'; + $Params | Invoke-Info -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + + $Global:InformationPreference = 'Ignore'; + $Params | Invoke-Info -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + } + } + + Context 'Invoke-Verbose Tests' { + It 'Should write when $VerbosePreference is Continue' { + $Global:VerbosePreference = 'Continue'; + $Params | Invoke-Verbose -InformationVariable Output; + $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); + } + + It 'Should not write when $VerbosePreference is SilentlyContinue or Ignore' { + $Global:VerbosePreference = 'SilentlyContinue'; + $Params | Invoke-Verbose -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + + $Global:VerbosePreference = 'Ignore'; + $Params | Invoke-Verbose -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + } + } + + Context 'Invoke-Debug Tests' { + It 'Should write when $DebugPreference is Continue' { + $Global:DebugPreference = 'Continue'; + $Params | Invoke-Debug -InformationVariable Output; + $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.Message); + } + + It 'Should not write when $DebugPreference is SilentlyContinue or Ignore' { + $Global:DebugPreference = 'SilentlyContinue'; + $Params | Invoke-Debug -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + + $Global:DebugPreference = 'Ignore'; + $Params | Invoke-Debug -InformationVariable Output; + $Output | Select-Object -First 1 | Should -Be $null; + } + } +} diff --git a/tests/common/Logging/Invoke-Write.Tests.ps1 b/tests/common/Logging/Invoke-Write.Tests.ps1 new file mode 100644 index 00000000..a9d68d2d --- /dev/null +++ b/tests/common/Logging/Invoke-Write.Tests.ps1 @@ -0,0 +1,39 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Logging.psm1" } +AfterAll { Remove-Module Logging } + +Describe 'Invoke-Write Tests' { + It 'Should not write anything if $ShouldWrite is $false' { + @{ + PSPrefix = '🌟' + PSMessage = 'Test message' + PSColour = 'Green' + ShouldWrite = $false + } | Invoke-Write -InformationVariable Output; + + $Output | Select-Object -First 1 | Should -Be $null; + } + + It 'Should write the message if $ShouldWrite is $true' { + $Params = @{ + PSPrefix = '🌟' + PSMessage = 'Test message' + PSColour = 'Green' + ShouldWrite = $true + }; + + $Params | Invoke-Write -InformationVariable Output; + $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.PSMessage); + } + + It 'Should replace newline characters in the message' { + $Params = @{ + PSPrefix = '🌟' + PSMessage = "Test message`nSecond line" + PSColour = 'Green' + ShouldWrite = $true + }; + + $Params | Invoke-Write -InformationVariable Output; + $Output | Select-Object -First 1 | Get-Stripped | Should -Be (Get-ShouldBeString $Params.PSMessage); + } +} diff --git a/tests/common/Scope/Enter-Scope.Tests.ps1 b/tests/common/Scope/Enter-Scope.Tests.ps1 new file mode 100644 index 00000000..dec5f41c --- /dev/null +++ b/tests/common/Scope/Enter-Scope.Tests.ps1 @@ -0,0 +1,35 @@ +BeforeDiscovery { Import-Module $PSScriptRoot/../../../src/common/Scope.psm1 } +AfterAll { Remove-Module Scope } +BeforeAll { $ModuleName = 'Scope' } + +Describe 'Enter-Scope Tests' { + BeforeEach { + InModuleScope $ModuleName { + $Script:InvocationStack = [System.Collections.Stack]::new(); + } + } + + It 'Should push a new scope' { + function Test-Scope { + begin { Enter-Scope; } + } + + Test-Scope; + InModuleScope $ModuleName { + (Get-Stack).Count | Should -Be 1; + (Get-StackTop).Invocation.MyCommand.Name | Should -Be 'Test-Scope'; + } + } + + It 'Should push a new scope to the top of the stack' { + function Test-ScopeOne { begin { Enter-Scope; } } + function Test-ScopeTwo { begin { Enter-Scope; } } + + Test-ScopeOne; + Test-ScopeTwo; + InModuleScope $ModuleName { + (Get-Stack).Count | Should -Be 2; + (Get-StackTop).Invocation.MyCommand.Name | Should -Be 'Test-ScopeTwo'; + } + } +} diff --git a/tests/common/Scope/Exit-Scope.Tests.ps1 b/tests/common/Scope/Exit-Scope.Tests.ps1 new file mode 100644 index 00000000..ca9880e7 --- /dev/null +++ b/tests/common/Scope/Exit-Scope.Tests.ps1 @@ -0,0 +1,2 @@ +BeforeDiscovery { Import-Module $PSScriptRoot/../../../src/common/Scope.psm1 } +AfterAll { Remove-Module Scope } diff --git a/tests/common/Scope/Format-ScopeName.Tests.ps1 b/tests/common/Scope/Format-ScopeName.Tests.ps1 new file mode 100644 index 00000000..f14516d4 --- /dev/null +++ b/tests/common/Scope/Format-ScopeName.Tests.ps1 @@ -0,0 +1,54 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Scope.psm1" } +AfterAll { Remove-Module Scope } +BeforeAll { $ModuleName = 'Scope' } + +Describe 'Format-ScopeName Tests' { + It 'Should format a single scope correctly' { + Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-StackTop -MockWith { return @{Invocation = @{MyCommand = @{Name = 'It' } }; }; }; + + Format-ScopeName -IsExit:$False | Should -Be 'It'; + Should -Invoke -CommandName Get-StackTop -ModuleName:$ModuleName -Times 1; + } + + It 'Should format multiple scopes correctly' { + Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-StackTop -MockWith { return @{Invocation = @{MyCommand = @{Name = 'It' } }; }; }; + Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-Stack -MockWith { return [System.Collections.Stack]::new(@( + @{MyCommand = @{Name = 'Describe' } }, + @{MyCommand = @{Name = 'Context' } }, + @{MyCommand = @{Name = 'It' } } + ));}; + + Format-ScopeName -IsExit:$False | Should -Be 'Describe > Context > It'; + Should -Invoke -CommandName Get-StackTop -ModuleName:$ModuleName -Times 1; + Should -Invoke -CommandName Get-Stack -ModuleName:$ModuleName -Times 1; + } + + It 'Should format multiple scopes correctly with exit' { + Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-StackTop -MockWith { return @{Invocation = @{MyCommand = @{Name = 'It' } }; }; }; + Mock -Verifiable -ModuleName:$ModuleName -CommandName Get-Stack -MockWith { return [System.Collections.Stack]::new(@( + @{Invocation = @{MyCommand = @{Name = 'Describe' } } }, + @{Invocation = @{MyCommand = @{Name = 'Context' } } }, + @{Invocation = @{MyCommand = @{Name = 'It' } } } + ));}; + + Format-ScopeName -IsExit:$True | Should -Be 'Describe > Context < It'; + Should -Invoke -CommandName Get-StackTop -ModuleName:$ModuleName -Times 1; + Should -Invoke -CommandName Get-Stack -ModuleName:$ModuleName -Times 1; + } + + It 'Formatting variabels should work' { + $Private:Formatted = Format-Variable @{ foo = 'bar'; hello = 'world'; this = @('super', @{ cool = 'list'; }) }; + $Private:Formatted | Should -Be @" +{ + foo = bar + hello = world + this = [ + super, + { + cool = list + } + ] +} +"@; + } +} diff --git a/tests/common/Utils/Remove-EncodingBom.Tests.ps1 b/tests/common/Utils/Remove-EncodingBom.Tests.ps1 new file mode 100644 index 00000000..41d86469 --- /dev/null +++ b/tests/common/Utils/Remove-EncodingBom.Tests.ps1 @@ -0,0 +1,61 @@ +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Utils.psm1" } +AfterAll { Remove-Module Utils } + +BeforeAll { + $EncodingWithBom = @{ + UTF8 = [System.Text.UTF8Encoding]::new($True); + UTF16_BE = [System.Text.UnicodeEncoding]::new($True, $True); + UTF16_LE = [System.Text.UnicodeEncoding]::new($False, $True); + UTF32_BE = [System.Text.UTF32Encoding]::new($True, $True); + UTF32_LE = [System.Text.UTF32Encoding]::new($False, $True); + } + + function Test-Bom { + [CmdletBinding()] + param( + [ValidateNotNull()] + [System.Text.Encoding]$Encoding + ) + + $Bom = $Encoding.GetPreamble(); + $Content = $Bom + $Encoding.GetBytes('Hello, World!'); + $ContentLength = $Content.Length; + + $Content[0..$($Bom.Length - 1)] | Should -BeExactly $Bom; + $Content = Remove-EncodingBom $Content $Encoding; + $Content[0..$($Bom.Length - 1)] | Should -Not -BeExactly $Bom; + $Content.Length | Should -Be ($ContentLength - $Bom.Length); + $Content | Should -BeExactly $Encoding.GetBytes('Hello, World!'); + } +} + +Describe 'Remove-EncodingBom Tests' { + It 'Should remove the BOM from UTF8' { + Test-Bom $EncodingWithBom.UTF8; + } + + It 'Should remove the BOM from UTF16_BE' { + Test-Bom $EncodingWithBom.UTF16_BE; + } + + It 'Should remove the BOM from UTF16_LE' { + Test-Bom $EncodingWithBom.UTF16_LE; + } + + It 'Should remove the BOM from UTF32_BE' { + Test-Bom $EncodingWithBom.UTF32_BE; + } + + It 'Should remove the BOM from UTF32_LE' { + Test-Bom $EncodingWithBom.UTF32_LE; + } + + It 'Should do nothing when no BOM' { + $Content = [System.Text.Encoding]::UTF8.GetBytes('Hello, World!'); + $ContentLength = $Content.Length; + + $Content = Remove-EncodingBom $Content $EncodingWithBom.UTF8; + $Content.Length | Should -Be $ContentLength; + $Content | Should -BeExactly $EncodingWithBom.UTF8.GetBytes('Hello, World!'); + } +} diff --git a/tests/common/00-Utils.Tests.ps1 b/tests/common/Utils/Utils.Tests.ps1 similarity index 98% rename from tests/common/00-Utils.Tests.ps1 rename to tests/common/Utils/Utils.Tests.ps1 index 862ea0ed..66d91bb6 100644 --- a/tests/common/00-Utils.Tests.ps1 +++ b/tests/common/Utils/Utils.Tests.ps1 @@ -1,6 +1,5 @@ -BeforeDiscovery { - $Script:ModuleName = & $PSScriptRoot/Base.ps1; -} +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Utils.psm1" } +AfterAll { Remove-Module Utils } Describe 'Utils Tests' { Context 'AST Helper functions' { diff --git a/utils/Invoke-CodeCoverage.ps1 b/utils/Invoke-CodeCoverage.ps1 deleted file mode 100644 index 899f36ab..00000000 --- a/utils/Invoke-CodeCoverage.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -Using namespace Pester; - -[PesterConfiguration]$Config = [PesterConfiguration]@{ - Run = @{ - Container = $True; - Path = '.'; - }; - CodeCoverage = @{ - Enabled = $True; - RecursePaths = $True; - CoveragePercentTarget = 80; - Path = "$PSScriptRoot/../src/common"; - OutputPath = "$PSScriptRoot/../artifacts/coverage"; - }; - Should = @{ - ErrorAction = 'Continue'; - }; -} - -Invoke-Pester -Configuration $Config From 42794d24ee6aabf1e8f57178881549ea01bc54be Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 20 Feb 2025 15:41:07 +1100 Subject: [PATCH 254/341] feat(external): implement nsight scripts into externals Ensure the output files encoding matched what it originally was. Adds a validation check for when these external scripts are updated. --- .github/workflows/external.yaml | 9 +- src/common/Scope.psm1 | 6 +- src/common/Utils.psm1 | 86 +- src/external/Update.ps1 | 181 +- .../scripts/N-Sight}/Fix-AgentUpdateLoop.ps1 | 0 .../scripts/N-Sight}/N-sightRMMCleanup.ps1 | 1460 ++++++++--------- .../scripts/N-Sight}/PMECleanup.ps1 | 1176 ++++++------- .../scripts/N-Sight}/TakeControlCleanup.ps1 | 1098 ++++++------- .../scripts/N-Sight/WindowsAgentCleanup.ps1 | 842 ++++++++++ .../scripts/N-Sight}/avdCleanup.ps1 | 896 +++++----- .../sources/N-Sight/N-sightRMMCleanup.jsonc | 6 + src/external/sources/N-Sight/PMECleanup.jsonc | 6 + .../sources/N-Sight/TakeControlCleanup.jsonc | 6 + .../sources/N-Sight/WindowsAgentCleanup.jsonc | 6 + src/external/sources/N-Sight/avdCleanup.jsonc | 6 + src/n-sight/cleaners/README.md | 19 - src/n-sight/cleaners/Update.ps1 | 77 - src/n-sight/cleaners/WindowsAgentCleanup.ps1 | 831 ---------- src/n-sight/{cleaners => }/edr-ecosystem.ps1 | 6 +- 19 files changed, 3434 insertions(+), 3283 deletions(-) rename src/{n-sight => external/scripts/N-Sight}/Fix-AgentUpdateLoop.ps1 (100%) rename src/{n-sight/cleaners => external/scripts/N-Sight}/N-sightRMMCleanup.ps1 (97%) rename src/{n-sight/cleaners => external/scripts/N-Sight}/PMECleanup.ps1 (95%) rename src/{n-sight/cleaners => external/scripts/N-Sight}/TakeControlCleanup.ps1 (96%) create mode 100644 src/external/scripts/N-Sight/WindowsAgentCleanup.ps1 rename src/{n-sight/cleaners => external/scripts/N-Sight}/avdCleanup.ps1 (96%) create mode 100644 src/external/sources/N-Sight/N-sightRMMCleanup.jsonc create mode 100644 src/external/sources/N-Sight/PMECleanup.jsonc create mode 100644 src/external/sources/N-Sight/TakeControlCleanup.jsonc create mode 100644 src/external/sources/N-Sight/WindowsAgentCleanup.jsonc create mode 100644 src/external/sources/N-Sight/avdCleanup.jsonc delete mode 100644 src/n-sight/cleaners/README.md delete mode 100644 src/n-sight/cleaners/Update.ps1 delete mode 100644 src/n-sight/cleaners/WindowsAgentCleanup.ps1 rename src/n-sight/{cleaners => }/edr-ecosystem.ps1 (97%) diff --git a/.github/workflows/external.yaml b/.github/workflows/external.yaml index 4d086fa6..a5b92824 100644 --- a/.github/workflows/external.yaml +++ b/.github/workflows/external.yaml @@ -2,7 +2,8 @@ name: External Script Updater on: schedule: - - cron: '0 12 * * *' + - cron: '0 0 * * *' + workflow_dispatch: jobs: update: @@ -12,10 +13,14 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Update External Scripts + - name: Run Update Script shell: pwsh run: ./src/external/Update.ps1 + - name: Validate Scripts + shell: pwsh + run: ./src/external/Update.ps1 -Validate + - name: Commit Changes uses: stefanzweifel/git-auto-commit-action@v5 with: diff --git a/src/common/Scope.psm1 b/src/common/Scope.psm1 index f6841792..59196fe0 100644 --- a/src/common/Scope.psm1 +++ b/src/common/Scope.psm1 @@ -5,7 +5,6 @@ Using module .\Logging.psm1 [System.Collections.Stack]$Script:InvocationStack = [System.Collections.Stack]::new(); [String]$Script:Tab = ' '; -# Used so we can mock in tests. function Get-Stack { Get-Variable -Name 'InvocationStack' -ValueOnly; } @@ -131,7 +130,7 @@ function Enter-Scope( ) { (Get-Stack).Push(@{ Invocation = $Invocation; StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); }); - if (-not $Global:Logging.Verbose) { return; } # If we aren't logging don't bother with the rest of the function. + if ($VerbosePreference -eq 'SilentlyContinue' -or $VerbosePreference -eq 'Ignore') { return; } # If we aren't logging don't bother with the rest of the function. if ($null -eq $ArgumentFormatter) { $ArgumentFormatter = @{}; } @@ -184,4 +183,5 @@ function Exit-Scope( (Get-Stack).Pop() | Out-Null; } -Export-ModuleMember -Function Get-StackTop, Format-Parameters, Format-Variable, Format-ScopeName, Enter-Scope, Exit-Scope; +Export-ModuleMember ` + -Function Get-StackTop, Format-Parameters, Format-Variable, Format-ScopeName, Enter-Scope, Exit-Scope; diff --git a/src/common/Utils.psm1 b/src/common/Utils.psm1 index 26bf8346..befce60b 100644 --- a/src/common/Utils.psm1 +++ b/src/common/Utils.psm1 @@ -214,6 +214,7 @@ function Get-ReturnType { #> function Test-ReturnType { [CmdletBinding()] + [OutputType([Boolean])] param( [Parameter(Mandatory, HelpMessage = 'The AST object to test.')] [ValidateNotNullOrEmpty()] @@ -1036,6 +1037,89 @@ function Test-IsWindows11 { return $Private:OSCaption -match 'Windows 11'; } +function Remove-EncodingBom { +[CmdletBinding()] + [OutputType([Byte[]])] + param( + [Parameter(Mandatory)] + [Byte[]]$Bytes, + + [Parameter(Mandatory)] + [System.Text.Encoding]$Encoding + ) + + begin { + $Bom = $Encoding.GetPreamble(); + $BomLength = $Bom.Length; + $Comparer = [Collections.Generic.SortedSet[String]]::CreateSetComparer(); + } + + process { + if ($Bytes.Length -ge $BomLength -and $Comparer.Equals($Bytes[0..($BomLength - 1)], $Bom)) { + return $Bytes[$BomLength..($Bytes.Length - 1)]; + } + + return $Bytes; + } +} + +function Get-ContentEncoding { +[OutputType([System.Text.Encoder])] + param( + [Parameter(Mandatory, ParameterSetName = 'Bytes')] + [byte[]]$ContentBytes, + + [Parameter(Mandatory, ParameterSetName = 'Path')] + [String]$Path + ) + + begin { + $Bytes = switch ($PSCmdlet.ParameterSetName) { + 'Bytes' { $ContentBytes } + 'Path' { + if (-not (Test-Path -LiteralPath $Path)) { + throw [System.IO.FileNotFoundException]::new("The file $Path does not exist."); + } + + $Stream = [System.IO.File]::OpenRead($Path); + $ReadLength = [System.Math]::Min($Stream.Length, 4); + try { + $Bytes = New-Object byte[] $ReadLength; + $Stream.Read($Bytes, 0, $ReadLength) | Out-Null; + $Bytes; + } finally { + $Stream.Close(); + } + } + } + + $Comparer = [Collections.Generic.SortedSet[String]]::CreateSetComparer(); + $Encoders = @( + [System.Text.UTF8Encoding]::new($True), # UTF-8 with BOM + [System.Text.UnicodeEncoding]::new($True, $True), # UTF-16 Unicode Big-Endian + [System.Text.UnicodeEncoding]::new($False, $True), # UTF-16 Unicode Little-Endian + [System.Text.UTF32Encoding]::new($True, $True), # UTF-32 Big-Endian + [System.Text.UTF32Encoding]::new($False, $True) # UTF-32 Little-Endian + ); + } + + process { + if ($Bytes.Length -lt 4) { + return [System.Text.Encoding]::UTF8; + } + + foreach ($Encoder in $Encoders) { + $Bom = $Encoder.GetPreamble(); + $BomLength = $Bom.Length; + if ($Bytes.Length -ge $BomLength -and $Comparer.Equals($Bytes[0..($BomLength - 1)], $Bom)) { + return $Encoder; + } + } + + return [System.Text.Encoding]::UTF8; + } +} + Export-ModuleMember ` - -Function Test-IsWindows11, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag ` + -Function Test-IsWindows11, Get-ContentEncoding, Remove-EncodingBom, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag ` -Alias await, async, lazy; diff --git a/src/external/Update.ps1 b/src/external/Update.ps1 index 26ec42ea..2dc26cc9 100644 --- a/src/external/Update.ps1 +++ b/src/external/Update.ps1 @@ -1,8 +1,9 @@ #!ignore -Using module '../common/Environment.psm1' -Using module '../common/Logging.psm1' -Using module '../common/Scope.psm1' +Using module ..\common\Environment.psm1 +Using module ..\common\Logging.psm1 +Using module ..\common\Scope.psm1 +Using module ..\common\Utils.psm1 <# .SYNOPSIS @@ -17,13 +18,25 @@ Using module '../common/Scope.psm1' .PARAMETER Force Force the update of the scripts even if the hash matches remote. #> -[CmdletBinding()] +[CmdletBinding(DefaultParameterSetName = 'Update')] param( - [String]$Definitions = ($PSScriptRoot + './sources/'), - - [String]$Output = ($PSScriptRoot + './scripts/'), - - [Switch]$Force + [Parameter(ParameterSetName = 'Update')] + [Parameter(ParameterSetName = 'Validate')] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path -Path $_ -PathType Container })] + [String]$Definitions = ($PSScriptRoot + '/sources/'), + + [Parameter(ParameterSetName = 'Update')] + [Parameter(ParameterSetName = 'Validate')] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path -Path $_ -PathType Container })] + [String]$Output = ($PSScriptRoot + '/scripts/'), + + [Parameter(ParameterSetName = 'Update')] + [Switch]$Force, + + [Parameter(ParameterSetName = 'Validate')] + [Switch]$Validate ) function Compare-LocalToRemote { @@ -49,6 +62,45 @@ function Compare-LocalToRemote { } } +function Out-WithEncoding { + [OutputType([Void])] + param( + [Parameter(Mandatory, ParameterSetName = 'Content')] + [Parameter(Mandatory, ParameterSetName = 'ContentBytes')] + [String]$Path, + + [Parameter(Mandatory, ParameterSetName = 'Content')] + [String]$Content, + + [Parameter(Mandatory, ParameterSetName = 'ContentBytes')] + [Byte[]]$ContentBytes, + + [Parameter(Mandatory, ParameterSetName = 'Content')] + [Parameter(Mandatory, ParameterSetName = 'ContentBytes')] + [System.Text.Encoding]$Encoding + ) + + begin { Enter-Scope; } + end { Exit-Scope; } + + process { + $WriteStream = [System.IO.File]::OpenWrite($Path); + if ($Encoding.GetPreamble().Length -gt 0) { + $WriteStream.Write($Encoding.GetPreamble(), 0, $Encoding.GetPreamble().Length); + } + + $Bytes = if ($PSCmdlet.ParameterSetName -eq 'ContentBytes') { + $ContentBytes; + } else { + $Encoding.GetBytes($Content); + } + + $Bytes = Remove-EncodingBom $Bytes $Encoding; + $WriteStream.Write($Bytes, 0, $Bytes.Length); + $WriteStream.Close(); + } +} + function Get-RemoteAndPatch { param( [String]$RemoteURI, @@ -62,49 +114,116 @@ function Get-RemoteAndPatch { process { $Request = Invoke-WebRequest -Uri $RemoteURI -Method Get; - [String]$Content; + [String]$Content = ''; + [String]$Encoding = [System.Text.Encoding]::UTF8; if ($Request.Headers['Content-Type'] -eq 'application/octet-stream') { - $Content = [System.Text.Encoding]::UTF8.GetString($Request.Content); + [System.Text.Encoding]$Encoding = Get-ContentEncoding -ContentBytes $Request.Content; + $Content = $Encoding.GetString($Request.Content); } else { $Content = $Request.Content; } - $Content | Out-File -FilePath $OutputPath -Force; + + Out-WithEncoding -Path $OutputPath -Content $Content -Encoding $Encoding; if ($Patches -and $Patches.Length -gt 0) { Invoke-Info "Applying patches to $($OutputPath)."; - # $Command = "git apply --verbose $Patches"; - # Invoke-Debug "Running: $Command"; - # Invoke-Expression $Command; git apply $Patches $Content = Get-Content -Path $OutputPath -Raw; } $Hash = $Request.Headers['ETag']; - $Content = "#!ignore $Hash`n$Content"; - $Content | Out-File -FilePath $OutputPath -Force; + $IgnoreAndHash = $Encoding.GetBytes("#!ignore $Hash`n"); + [Byte[]]$Content = Remove-EncodingBom $Encoding.GetBytes($Content) $Encoding; + $Content = $IgnoreAndHash + $Content; + Out-WithEncoding -Path $OutputPath -ContentBytes $Content -Encoding $Encoding; } } -Invoke-RunMain $PSCmdlet { - $WantedDefinitions = Get-ChildItem -Path $Definitions -Filter '*.json?' -File; +function Test-ScriptsAreParsable { + [OutputType([Bool])] + param( + [Parameter(Mandatory, ParameterSetName = 'RecursiveDirectory')] + [ValidateNotNullOrEmpty()] + [ValidateScript({ Test-Path -Path $_ -PathType Container })] + [String]$Path, + + [Parameter(Mandatory, ParameterSetName = 'ExplicitFiles')] + [String[]]$Files + ) - foreach ($RawDefinition in $WantedDefinitions) { - Invoke-Info "Processing $($RawDefinition.Name)."; - $Definition = Get-Content -Path $RawDefinition.FullName | ConvertFrom-Json; + begin { Enter-Scope; } + end { Exit-Scope; } - if (-not $Definition.Source -or -not $Definition.Output) { - Invoke-Error "Invalid definition file $($RawDefinition.Name)."; - continue; + process { + $Scripts = if ($PSCmdlet.ParameterSetName -eq 'RecursiveDirectory') { + Get-ChildItem -Path $Path -Filter '*.ps1' -File -Recurse; + } else { + $Files | ForEach-Object { Get-Item -Path $_; }; } - Invoke-Debug "Processing $($Definition.Output)."; - $OutputPath = $Output + $Definition.Output; + $HadErrors = $False; + foreach ($Script in $Scripts) { + Invoke-Info "Parsing $($Script.Name)."; + [System.Management.Automation.Language.ParseError[]]$Errors = $null; + $null = [System.Management.Automation.Language.Parser]::ParseFile($Script.FullName, [ref]$null, [ref]$Errors); + + if ($Errors) { + $HadErrors = $True; + Invoke-Error "Failed to parse $($Script.Name) with $($Errors.Count) errors."; + foreach ($ParserError in $Errors) { + Format-Error -ErrorRecord $ParserError; + } + } + } - if (-not $Force -and (Compare-LocalToRemote -LocalFile $OutputPath -RemoteURI $Definition.Source)) { - Invoke-Info "No update required for $($Definition.Output)."; - continue; + return -not $HadErrors; + } +} + +Invoke-RunMain $PSCmdlet { + $Definitions = Resolve-Path -Path $Definitions; + $Output = Resolve-Path -Path $Output; + $WantedDefinitions = Get-ChildItem -Path $Definitions -Filter '*.json?' -File -Recurse; + + if ($PSCmdlet.ParameterSetName -eq 'Update') { + $FilesForValidation = @(); + foreach ($RawDefinition in $WantedDefinitions) { + Invoke-Info "Processing $($RawDefinition.Name)."; + $Definition = Get-Content -Path $RawDefinition.FullName | ConvertFrom-Json; + + if (-not $Definition.Source -or -not $Definition.Output) { + Invoke-Error "Invalid definition file $($RawDefinition.Name)."; + continue; + } + + Invoke-Debug "Processing $($Definition.Output)."; + $OutputPath = $Output + $Definition.Output; + + $OutputDirectory = Split-Path -Path $OutputPath; + if (-not (Test-Path -Path $OutputDirectory -PathType Container)) { + $null = New-Item -Path $OutputDirectory -ItemType Directory -Force; + } + + if (-not $Force -and (Compare-LocalToRemote -LocalFile $OutputPath -RemoteURI $Definition.Source)) { + Invoke-Info "No update required for $($Definition.Output)."; + continue; + } + + Get-RemoteAndPatch -RemoteURI $Definition.Source -OutputPath $OutputPath -Patches $Definition.Patches; + $FilesForValidation += $OutputPath; } - Get-RemoteAndPatch -RemoteURI $Definition.Source -OutputPath $OutputPath -Patches $Definition.Patches; + if ($FilesForValidation.Length -gt 0) { + if (-not (Test-ScriptsAreParsable -Files $FilesForValidation)) { + exit 1 + }; + } + } + + if ($PSCmdlet.ParameterSetName -eq 'Validate') { + Invoke-Info "Validating scripts in $($Output)."; + if (-not (Test-ScriptsAreParsable -Path $Output)) { + exit 1 + } } }; diff --git a/src/n-sight/Fix-AgentUpdateLoop.ps1 b/src/external/scripts/N-Sight/Fix-AgentUpdateLoop.ps1 similarity index 100% rename from src/n-sight/Fix-AgentUpdateLoop.ps1 rename to src/external/scripts/N-Sight/Fix-AgentUpdateLoop.ps1 diff --git a/src/n-sight/cleaners/N-sightRMMCleanup.ps1 b/src/external/scripts/N-Sight/N-sightRMMCleanup.ps1 similarity index 97% rename from src/n-sight/cleaners/N-sightRMMCleanup.ps1 rename to src/external/scripts/N-Sight/N-sightRMMCleanup.ps1 index 801c06f3..fc00e975 100644 --- a/src/n-sight/cleaners/N-sightRMMCleanup.ps1 +++ b/src/external/scripts/N-Sight/N-sightRMMCleanup.ps1 @@ -1,730 +1,730 @@ -#!ignore -# '================================================================================================================================================================== -# 'Disclaimer -# 'The sample scripts are not supported under any N-able support program or service. -# 'The sample scripts are provided AS IS without warranty of any kind. -# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. -# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. -# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever -# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) -# 'arising out of the use of or inability to use the sample scripts or documentation. -# '================================================================================================================================================================== - -Param ( - [string]$verbose = "Y" -) - -function setupLogging() { - $script:logFilePath = $env:ProgramData + "\MspPlatform\Tech Tribes\N-sight RMM Cleanup\debug.log" - - $script:logFolder = Split-Path $logFilePath - $script:logFile = Split-Path $logFilePath -Leaf - - If (($logFolder -match '.+?\\$') -eq $false) { - $script:logFolder = $script:logFolder + "\" - } - - $logFolderExists = Test-Path $logFolder - $logFileExists = Test-Path $logFilePath - - If ($logFolderExists -eq $false) { - New-Item -ItemType "directory" -Path $logFolder | Out-Null - } - - If ($logFileExists -eq $true) { - Remove-Item $logFilePath -ErrorAction SilentlyContinue - Start-Sleep 2 - New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null - } Else { - New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null - } - - [float]$script:currentVersion = 1.05 - writeToLog I "Started processing the N-sightRMMCleanup script." - writeToLog I "Running script version: $currentVersion" -} - -function validateUserInput() { - If ($verbose.ToLower() -eq "y") { - $script:verboseMode = $true - writeToLog V "You have defined to have the script output the verbose log entries." - } Else { - $script:verboseMode = $false - writeToLog I "Will output logs in regular mode." - } - - writeToLog V "Input Parameters have been successfully validated." - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function getAgentPath() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - If ($currentPSVersion -lt [version]5.1) { - writeToLog W "Device is currently using this powershell version so may fail due to compatibility issues:`r`n`t$currentPSVersion" - $script:legacyPS = $true - } Else { - writeToLog V "Confirmed device is using supported Powershell version:`r`n`t$currentPSVersion" - $script:legacyPS = $false - } - - try { - $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog W "Will continue with validating agent path." - } - - $Items = $Keys | Foreach-Object { - Get-ItemProperty $_.PsPath - } - - ForEach ($Item in $Items) { - If ($Item.DisplayName -like "Advanced Monitoring Agent" -or $Item.DisplayName -like "Advanced Monitoring Agent GP"){ - $script:localFolder = $Item.installLocation - $script:registryPath = $Item.PsPath - $registryName = $Item.PSChildName - $registryDisplayName = $Item.DisplayName - $registryVersion = $Item.DisplayVersion - $registryInstallDate = $Item.InstallDate - break - } - } - - try { - $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog W "Will continue with validating agent path." - } - - $Items = $Keys | Foreach-Object { - Get-ItemProperty $_.PsPath - } - - ForEach ($Item in $Items) { - If ($Item.DisplayName -like "Advanced Monitoring Agent" -or $Item.DisplayName -like "Advanced Monitoring Agent GP"){ - $script:localFolder = $Item.installLocation - $script:registryPath = $Item.PsPath - $registryName = $Item.PSChildName - $registryDisplayName = $Item.DisplayName - $registryVersion = $Item.DisplayVersion - $registryInstallDate = $Item.InstallDate - break - } - } - - If (!$script:localFolder) { - writeToLog F "Installation path for the Advanced Monitoring Agent location was not found." - writeToLog F "Failing script." - Exit 1001 - } - - If (($script:localFolder -match '.+?\\$') -eq $false) { - $script:localFolder = $script:localFolder + "\" - } - - writeToLog V "Determined registry path as:`r`n`t$registryPath" - writeToLog V "Determined key name as:`r`n`t$registryName" - writeToLog V "Determined DisplayName as:`r`n`t$registryDisplayName" - writeToLog V "Determined version as:`r`n`t$registryVersion" - writeToLog V "Determined installed date as:`r`n`t$registryInstallDate" - - writeToLog V "Detected Advanced Monitoring Agent install location:`r`n`t$localFolder" - - If (!(Test-Path ("$localFolder" + "unins000.exe"))) { - writeToLog W "The uninstaller is not present (likely GP deployment)." - writetoLog W "Downloading uninstaller." - downloadUnins - } Else { - writeToLog I "The unins000.exe is present." - } - - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function moveUninstaller() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - # If '_iu14D2N.tmp' is present on the device, then we will try to kill it - try { - $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop - } catch { - writeToLog W "Error detecting uninstaller lock file, due to:" - writeToLog W $_ - } - - If ($null -ne $uninsLockProcTest) { - writeToLog I "Detected $uninsLockProcTest on the device, removing." - try { - Stop-Process $uninsLockProcTest -Force -ErrorAction Stop - } catch { - writeToLog W "Error stopping uninstall lock process:" - writeToLog W $_ - } - } - - $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" - $uninsLockPathTest = Test-Path $uninsLockPath - - If ($uninsLockPathTest -eq $true) { - writeToLog W "Detected $uninsLockPath on the device, removing." - Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force - } - - $newUninsExePath = $logFolder + "unins000.exe" - $newUninsDatPath = $logFolder + "unins000.dat" - - $newUninsExeTest = Test-Path $newUninsExePath - $newUninsDatTest = Test-Path $newUninsDatPath - - If ($newUninsExeTest -eq $true) { - writeToLog W "Previous unins000.exe found in the log folder, will forcibly remove." - - try { - Remove-Item $newUninsExePath -Force -Recurse -ErrorAction Stop - } - catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog F "Error occurred when removing old unins000.exe from device, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog F "Failing script." - Exit 1001 - } - } - If ($newUninsDatTest -eq $true) { - writeToLog W "Previous unins000.dat found in the log folder, will forcibly remove." - - try { - Remove-Item $newUninsDatPath -Force -Recurse -ErrorAction Stop - } - catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog F "Error occurred when removing old unins000.dat from device, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog F "Failing script." - Exit 1001 - } - } - - writeToLog V "Testing location of the uninstaller." - -# Now the SI package is downloaded, continue on with uninstalling original Advanced Monitoring Agent. - $uninstaller = $localFolder + "unins000.exe" - $uninsCheck = Test-Path $uninstaller - - writeToLog V "Determined uninstaller location as:`r`n`t$uninstaller" - writeToLog V "Uninstaller detected returned as:`r`n`t$uninsCheck" - - If ($uninsCheck -eq $false) { - writeToLog W "Failed to locate the uninstaller in the Advanced Monitoring Agent installation directory." - writeToLog W "Will attempt to download instead." - downloadUnins - } Else { - # Copying both unins000.exe and unins000.dat to temp folder, due to issues with .dat being in use with another process - try { - Copy-Item ($localFolder + "unins*") $logFolder -Force -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog F "Error occurred when copying uninstaller over to temporary location, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog F "Due to this, uninstall cannot be performed." - writeToLog F "Failing script." - Exit 1001 - } - - writeToLog V "Uninstaller now moved to the following location:`r`n`t$logFolder" - } - - $script:uninsExePath = $logFolder + "unins000.exe" - $script:uninsDatPath = $logFolder + "unins000.dat" - - $uninsCheckExe = Test-Path $uninsExePath - $uninsCheckDat = Test-Path $uninsDatPath - - If (($uninsCheckExe -eq $false) -or ($uninsCheckDat -eq $false)) { - writeToLog F "Failed to copy uninstaller to the temporary location." - writeToLog F "Failing script." - Exit 1001 - } - - writeToLog V "Uninstaller exe detection for new location returned as:`r`n`t$uninsCheckExe" - writeToLog V "Uninstaller dat detection for new location returned as:`r`n`t$uninsCheckDat" - -# If '_iu14D2N.tmp' is present on the device, the uninstall will not be able to occur - try { - $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error detecting uninstaller lock file, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - - $uninsLockPathTest = Test-Path "$Env:USERPROFILE\AppData\Local\Temp\_iu*" - - If ((($uninsLockProcTest.ProcessName -like "_iu*") -eq $true) -or ($uninsLockPathTest -eq $true)) { - writeToLog F "Detected _iu14D2N.tmp on the device, which is locking the uninstall of the Advanced Monitoring Agent." - writeToLog F "Due to this, it is not possible to complete the uninstall of the Advanced Monitoring Agent." - writeToLog F "Please reboot the device and try running the script again." - writeToLog F "Failing script." - Exit 1001 - } - - writeToLog V "Uninstall lock not detected on the device, nor found as a running process/existing file." - - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function downloadUnins() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $uninsURL = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/AMARemoval/unins000.zip" - - $script:downloadLocation = $logFolder - $script:localFile = "unins000.zip" - - $source = $uninsURL - $dest = $downloadLocation+$localFile - - writeToLog I "Downloading the Advanced Monitoring Agent uninstaller." - writeToLog V "This is being directed to the following location:`r`n`t$dest" - - $oldZipPresent = Test-Path $dest - - If ($oldZipPresent -eq $true) { - writeToLog V "Previous unins000.zip present on device, removing." - Remove-Item $dest -Force | Out-Null - } - - $wc = New-Object System.Net.WebClient - - try { - $wc.DownloadFile($source, $dest) - } - catch [System.Net.WebException] { - writeToLog F "The Agent uninstaller zip file failed to download, due to:" - - If ($_.Exception.InnerException) { - $innerException = $_.Exception.InnerException.Message - writeToLog F $innerException - writeToLog F "Failing script." - Exit 1001 - } Else { - $exception = $_.Exception.Message - writeToLog F $exception - writeToLog F "Failing script." - Exit 1001 - } - } - - $script:extractLocation = $logFolder - - writeToLog I "Extracting zip for the Advanced Monitoring Agent uninstaller." - - $downloadedFile = $dest - - try { - If ($legacyPS -eq $false) { - Expand-Archive $downloadedFile $logFolder -ErrorAction Stop - } Else { - $filePath = $downloadedFile - $script:shell = New-Object -ComObject Shell.Application - $zipFile = $shell.NameSpace($filePath) - $destinationFolder = $shell.NameSpace($logFolder) - - $copyFlags = 0x00 - $copyFlags += 0x04 - $copyFlags += 0x10 - - $destinationFolder.CopyHere($zipFile.Items(), $copyFlags) - } - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog E "Error occurred when extracting the Advanced Monitoring Agent uninstaller, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog F "Failing script." - } - <# - If ($missingCmdlet -eq $true) { - writeToLog W "Expand-Archive not an applicable cmdlet, due to an old version of Powershell." - writeToLog V "Will attempt extracting the uninstaller files using the Shell.Application object." - - $script:shell = new-object -com Shell.Application - $shell.namespace($logFolder).copyhere($shell.namespace($downloadedFile).items(),16) - - } Else { - try { - Expand-Archive $downloadedFile $logFolder -Force -ErrorAction Stop - } - catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when extracting the Advanced Monitoring Agent uninstaller from the zip file, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog F "Failing script." - Exit 1001 - } - } - #> - - $uninstallerPath = $logFolder + "unins000.exe" - $extractTest = Test-Path $uninstallerPath - - writeToLog V "Testing path:`r`n`t$uninstallerPath" - writeToLog V "Extract location detection returned as:`r`n`t$extractTest" - - If ($extractTest -ne $true) { - writeToLog F "An issue occurred when trying to extract the Advanced Monitoring Agent uninstaller to the following location:`r`n`t$uninstallerPath" - writeToLog F "Failing script." - Exit 1001 - } - - $extractFile = (Get-ChildItem $extractLocation).FullName - - writeToLog I "Advanced Monitoring Agent uninstaller extracted successfully, which is extracted to:`r`n`t$extractFile" - - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function stopAgentServices() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - writeToLog I "Attempting to stop the Advanced Monitoring Agent services, to assist with the uninstall process." - - $script:amaServiceName = "Advanced Monitoring Agent" - $script:amaWPServiceName = "Advanced Monitoring Agent Web Protection" - $script:amaNMServiceName = "Advanced Monitoring Agent Network Management" - - try { - $script:amaService = Get-Service $amaServiceName -ErrorAction Stop -WarningAction SilentlyContinue - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when detecting the Advanced Monitoring Agent service, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - - try { - Stop-Service $amaService -Force -ErrorAction Stop -WarningAction SilentlyContinue | Out-Null - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when stopping the Advanced Monitoring Agent service, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - - Start-Sleep 5 - - try { - $script:amaService = Get-Service $amaServiceName -ErrorAction Stop -WarningAction SilentlyContinue - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when detecting the Advanced Monitoring Agent service, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - - writeToLog I "Advanced Monitoring Agent Windows Service Status: $($amaService.Status)" - - writeToLog I "Removing the Advanced Monitoring Agent service." - - try { - $script:amaService = sc.exe delete $amaServiceName -ErrorAction Stop -WarningAction SilentlyContinue - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when removing the Advanced Monitoring Agent service, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - - writeToLog I "Moving onto auxiliary Advanced Monitoring Agent services." - - If (Get-Service $amaWPServiceName -ErrorAction SilentlyContinue) { - If ((Get-Service $amaWPServiceName).Status -eq "Running") { - writeToLog V "Found the $amaWPServiceName service running, will now attempt to stop." - try { - Stop-Service $amaWPServiceName -Force -ErrorAction Stop -WarningAction SilentlyContinue | Out-Null - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when stopping the $amaWPServiceName service, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - } - } - If (Get-Service $amaNMServiceName -ErrorAction SilentlyContinue) { - If ((Get-Service $amaNMServiceName).Status -eq "Running") { - writeToLog V "Found the $amaNMServiceName service running, will now attempt to stop." - try { - Stop-Service $amaNMServiceName -Force -ErrorAction Stop -WarningAction SilentlyContinue | Out-Null - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when stopping the $amaNMServiceName service, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - } - } - - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function performUninstall() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $uninsExePath = $localFolder + "unins000.exe" - $uninsDatPath = $localFolder + "unins000.dat" - - writeToLog I "Now running the Advanced Monitoring Agent uninstaller." - writeToLog I "Invoking the uninstaller from the following location:`r`n`t$uninsExePath" - - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $uninsExePath - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = "/SILENT" - - $installArgs = $pinfo.Arguments - writeToLog V "Uninstall Arguments set: $installArgs" - - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - $script:exitCode = $p.ExitCode - - If ($exitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" - } - - Start-Sleep 10 - - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function postUninstall() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - # Confirm pid is removed - try { - $winagentProcess = Get-Process -Name "winagent" -ErrorAction SilentlyContinue | Select-Object Name,ProcessName,Id - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when stopping the $amaNMServiceName service, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - - If ($winagentProcess) { - writeToLog W "Winagent process detected:`r`n`tName: $($winagentProcess.Name)`r`n`tFullName: $($winagentProcess.ProcessName)`r`n`tProcessID: $($winagentProcess.Id)" - writeToLog W "Winagent process is still running on the device, attempting to terminate process." - - try { - $winagentProcess | Stop-Process -Force -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred when terminating the 'winagent' process, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - } Else { - writeToLog V "Confirmed the Advanced Monitoring Agent process (winagent) is no longer present." - } - - # Confirm service is removed - try { - $script:amaService = Get-Service $amaServiceName -ErrorAction SilentlyContinue - } catch { - } - - If ($null -eq $amaService) { - writeToLog V "Confirmed the Advanced Monitoring Agent Windows Service no longer exists." - } Else { - writeToLog W "The Advanced Monitoring Agent service still exists on the device." - } - - writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) -} - -function cleanupAgentData() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $winagentPath = $localFolder + "winagent.exe" - $agentSettingsPath = $localFolder + "settings.ini" - - $winagentExists = Test-Path $winagentPath - $agentSettingsExists = Test-Path $agentSettingsPath - - If ($agentSettingsExists -eq $true) { - writeToLog W "Settings.ini still exists on the device, forcibly removing file." - - try { - Remove-Item $agentSettingsPath -Force -ErrorAction Stop - } - catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Unable to remove settings.ini from device, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - } Else { - writeToLog V "Confirmed settings.ini no longer exists on the device." - } - - If ($winagentExists -eq $true) { - writeToLog F "The Advanced Monitoring Agent is still installed." - writeToLog F "Failing script." - Exit 1001 - } Else { - writeToLog I "The Advanced Monitoring Agent's Winagent.exe application no longer exists, so removal has been successful." - writeToLog V "Cleaning up the Advanced Monitoring Agent install location." - - try { - Remove-Item $localFolder -Force -Recurse -ErrorAction Stop - } - catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Unable to remove Advanced Monitoring Agent folder from device, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - } - - writeToLog V "Checking if registry entry is present." - writeToLog V "Registry Path:`r`n`t$registryPath" - - $regExists = Test-Path $registryPath - - If ($regExists -eq $true) { - writeToLog V "Path still exists, will remove." - - try { - Remove-Item $registryPath -force -ErrorAction Stop - } - catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Unable to remove path from registry, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - } - } Else { - writeToLog V "Registry Path no longer exists." - } - - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function performEcosytemUninstall() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $ecoPath = "C:\Program Files (x86)\Solarwinds MSP\Ecosystem Agent\unins000.exe" - - If (!(Test-Path $ecoPath)) { - writeToLog E "The uninstaller for the Ecosystem Agent doesn't exist." - writeToLog W "Ecosystem Agent removal cannot proceed." - } Else { - - writeToLog I "Now running the Ecosystem uninstaller." - writeToLog I "Invoking the uninstaller from the following location:`r`n`t$ecoPath" - - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $ecoPath - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = "/VERYSILENT" - - $installArgs = $pinfo.Arguments - writeToLog V "Uninstall Arguments set: $installArgs" - - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - $script:exitCode = $p.ExitCode - - If ($exitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" - } - - Start-Sleep 10 - } - - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function writeToLog($state, $message) { - - $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) - - switch -regex -Wildcard ($state) { - "I" { - $state = "INFO" - $colour = "Cyan" - } - "E" { - $state = "ERROR" - $colour = "Red" - } - "W" { - $state = "WARNING" - $colour = "Yellow" - } - "F" { - $state = "FAILURE" - $colour = "Red" - } - "C" { - $state = "COMPLETE" - $colour = "Green" - } - "V" { - If ($verboseMode -eq $true) { - $state = "VERBOSE" - $colour = "Magenta" - } Else { - return - } - } - "" { - $state = "INFO" - } - Default { - $state = "INFO" - } - } - - Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour - Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue -} - -function main() { -# Main function, set to run other functions - setupLogging - validateUserInput - getAgentPath - # moveUninstaller - stopAgentServices - performUninstall - postUninstall - cleanupAgentData - performEcosytemUninstall -} - -main +#!ignore "6d8c860193b8dd929f999d0fb4ee7040" +# '================================================================================================================================================================== +# 'Disclaimer +# 'The sample scripts are not supported under any N-able support program or service. +# 'The sample scripts are provided AS IS without warranty of any kind. +# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. +# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. +# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever +# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) +# 'arising out of the use of or inability to use the sample scripts or documentation. +# '================================================================================================================================================================== + +Param ( + [string]$verbose = "Y" +) + +function setupLogging() { + $script:logFilePath = $env:ProgramData + "\MspPlatform\Tech Tribes\N-sight RMM Cleanup\debug.log" + + $script:logFolder = Split-Path $logFilePath + $script:logFile = Split-Path $logFilePath -Leaf + + If (($logFolder -match '.+?\\$') -eq $false) { + $script:logFolder = $script:logFolder + "\" + } + + $logFolderExists = Test-Path $logFolder + $logFileExists = Test-Path $logFilePath + + If ($logFolderExists -eq $false) { + New-Item -ItemType "directory" -Path $logFolder | Out-Null + } + + If ($logFileExists -eq $true) { + Remove-Item $logFilePath -ErrorAction SilentlyContinue + Start-Sleep 2 + New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null + } Else { + New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null + } + + [float]$script:currentVersion = 1.05 + writeToLog I "Started processing the N-sightRMMCleanup script." + writeToLog I "Running script version: $currentVersion" +} + +function validateUserInput() { + If ($verbose.ToLower() -eq "y") { + $script:verboseMode = $true + writeToLog V "You have defined to have the script output the verbose log entries." + } Else { + $script:verboseMode = $false + writeToLog I "Will output logs in regular mode." + } + + writeToLog V "Input Parameters have been successfully validated." + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function getAgentPath() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + If ($currentPSVersion -lt [version]5.1) { + writeToLog W "Device is currently using this powershell version so may fail due to compatibility issues:`r`n`t$currentPSVersion" + $script:legacyPS = $true + } Else { + writeToLog V "Confirmed device is using supported Powershell version:`r`n`t$currentPSVersion" + $script:legacyPS = $false + } + + try { + $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog W "Will continue with validating agent path." + } + + $Items = $Keys | Foreach-Object { + Get-ItemProperty $_.PsPath + } + + ForEach ($Item in $Items) { + If ($Item.DisplayName -like "Advanced Monitoring Agent" -or $Item.DisplayName -like "Advanced Monitoring Agent GP"){ + $script:localFolder = $Item.installLocation + $script:registryPath = $Item.PsPath + $registryName = $Item.PSChildName + $registryDisplayName = $Item.DisplayName + $registryVersion = $Item.DisplayVersion + $registryInstallDate = $Item.InstallDate + break + } + } + + try { + $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog W "Will continue with validating agent path." + } + + $Items = $Keys | Foreach-Object { + Get-ItemProperty $_.PsPath + } + + ForEach ($Item in $Items) { + If ($Item.DisplayName -like "Advanced Monitoring Agent" -or $Item.DisplayName -like "Advanced Monitoring Agent GP"){ + $script:localFolder = $Item.installLocation + $script:registryPath = $Item.PsPath + $registryName = $Item.PSChildName + $registryDisplayName = $Item.DisplayName + $registryVersion = $Item.DisplayVersion + $registryInstallDate = $Item.InstallDate + break + } + } + + If (!$script:localFolder) { + writeToLog F "Installation path for the Advanced Monitoring Agent location was not found." + writeToLog F "Failing script." + Exit 1001 + } + + If (($script:localFolder -match '.+?\\$') -eq $false) { + $script:localFolder = $script:localFolder + "\" + } + + writeToLog V "Determined registry path as:`r`n`t$registryPath" + writeToLog V "Determined key name as:`r`n`t$registryName" + writeToLog V "Determined DisplayName as:`r`n`t$registryDisplayName" + writeToLog V "Determined version as:`r`n`t$registryVersion" + writeToLog V "Determined installed date as:`r`n`t$registryInstallDate" + + writeToLog V "Detected Advanced Monitoring Agent install location:`r`n`t$localFolder" + + If (!(Test-Path ("$localFolder" + "unins000.exe"))) { + writeToLog W "The uninstaller is not present (likely GP deployment)." + writetoLog W "Downloading uninstaller." + downloadUnins + } Else { + writeToLog I "The unins000.exe is present." + } + + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function moveUninstaller() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + # If '_iu14D2N.tmp' is present on the device, then we will try to kill it + try { + $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop + } catch { + writeToLog W "Error detecting uninstaller lock file, due to:" + writeToLog W $_ + } + + If ($null -ne $uninsLockProcTest) { + writeToLog I "Detected $uninsLockProcTest on the device, removing." + try { + Stop-Process $uninsLockProcTest -Force -ErrorAction Stop + } catch { + writeToLog W "Error stopping uninstall lock process:" + writeToLog W $_ + } + } + + $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" + $uninsLockPathTest = Test-Path $uninsLockPath + + If ($uninsLockPathTest -eq $true) { + writeToLog W "Detected $uninsLockPath on the device, removing." + Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force + } + + $newUninsExePath = $logFolder + "unins000.exe" + $newUninsDatPath = $logFolder + "unins000.dat" + + $newUninsExeTest = Test-Path $newUninsExePath + $newUninsDatTest = Test-Path $newUninsDatPath + + If ($newUninsExeTest -eq $true) { + writeToLog W "Previous unins000.exe found in the log folder, will forcibly remove." + + try { + Remove-Item $newUninsExePath -Force -Recurse -ErrorAction Stop + } + catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog F "Error occurred when removing old unins000.exe from device, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog F "Failing script." + Exit 1001 + } + } + If ($newUninsDatTest -eq $true) { + writeToLog W "Previous unins000.dat found in the log folder, will forcibly remove." + + try { + Remove-Item $newUninsDatPath -Force -Recurse -ErrorAction Stop + } + catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog F "Error occurred when removing old unins000.dat from device, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog F "Failing script." + Exit 1001 + } + } + + writeToLog V "Testing location of the uninstaller." + +# Now the SI package is downloaded, continue on with uninstalling original Advanced Monitoring Agent. + $uninstaller = $localFolder + "unins000.exe" + $uninsCheck = Test-Path $uninstaller + + writeToLog V "Determined uninstaller location as:`r`n`t$uninstaller" + writeToLog V "Uninstaller detected returned as:`r`n`t$uninsCheck" + + If ($uninsCheck -eq $false) { + writeToLog W "Failed to locate the uninstaller in the Advanced Monitoring Agent installation directory." + writeToLog W "Will attempt to download instead." + downloadUnins + } Else { + # Copying both unins000.exe and unins000.dat to temp folder, due to issues with .dat being in use with another process + try { + Copy-Item ($localFolder + "unins*") $logFolder -Force -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog F "Error occurred when copying uninstaller over to temporary location, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog F "Due to this, uninstall cannot be performed." + writeToLog F "Failing script." + Exit 1001 + } + + writeToLog V "Uninstaller now moved to the following location:`r`n`t$logFolder" + } + + $script:uninsExePath = $logFolder + "unins000.exe" + $script:uninsDatPath = $logFolder + "unins000.dat" + + $uninsCheckExe = Test-Path $uninsExePath + $uninsCheckDat = Test-Path $uninsDatPath + + If (($uninsCheckExe -eq $false) -or ($uninsCheckDat -eq $false)) { + writeToLog F "Failed to copy uninstaller to the temporary location." + writeToLog F "Failing script." + Exit 1001 + } + + writeToLog V "Uninstaller exe detection for new location returned as:`r`n`t$uninsCheckExe" + writeToLog V "Uninstaller dat detection for new location returned as:`r`n`t$uninsCheckDat" + +# If '_iu14D2N.tmp' is present on the device, the uninstall will not be able to occur + try { + $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error detecting uninstaller lock file, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + + $uninsLockPathTest = Test-Path "$Env:USERPROFILE\AppData\Local\Temp\_iu*" + + If ((($uninsLockProcTest.ProcessName -like "_iu*") -eq $true) -or ($uninsLockPathTest -eq $true)) { + writeToLog F "Detected _iu14D2N.tmp on the device, which is locking the uninstall of the Advanced Monitoring Agent." + writeToLog F "Due to this, it is not possible to complete the uninstall of the Advanced Monitoring Agent." + writeToLog F "Please reboot the device and try running the script again." + writeToLog F "Failing script." + Exit 1001 + } + + writeToLog V "Uninstall lock not detected on the device, nor found as a running process/existing file." + + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function downloadUnins() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $uninsURL = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/AMARemoval/unins000.zip" + + $script:downloadLocation = $logFolder + $script:localFile = "unins000.zip" + + $source = $uninsURL + $dest = $downloadLocation+$localFile + + writeToLog I "Downloading the Advanced Monitoring Agent uninstaller." + writeToLog V "This is being directed to the following location:`r`n`t$dest" + + $oldZipPresent = Test-Path $dest + + If ($oldZipPresent -eq $true) { + writeToLog V "Previous unins000.zip present on device, removing." + Remove-Item $dest -Force | Out-Null + } + + $wc = New-Object System.Net.WebClient + + try { + $wc.DownloadFile($source, $dest) + } + catch [System.Net.WebException] { + writeToLog F "The Agent uninstaller zip file failed to download, due to:" + + If ($_.Exception.InnerException) { + $innerException = $_.Exception.InnerException.Message + writeToLog F $innerException + writeToLog F "Failing script." + Exit 1001 + } Else { + $exception = $_.Exception.Message + writeToLog F $exception + writeToLog F "Failing script." + Exit 1001 + } + } + + $script:extractLocation = $logFolder + + writeToLog I "Extracting zip for the Advanced Monitoring Agent uninstaller." + + $downloadedFile = $dest + + try { + If ($legacyPS -eq $false) { + Expand-Archive $downloadedFile $logFolder -ErrorAction Stop + } Else { + $filePath = $downloadedFile + $script:shell = New-Object -ComObject Shell.Application + $zipFile = $shell.NameSpace($filePath) + $destinationFolder = $shell.NameSpace($logFolder) + + $copyFlags = 0x00 + $copyFlags += 0x04 + $copyFlags += 0x10 + + $destinationFolder.CopyHere($zipFile.Items(), $copyFlags) + } + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog E "Error occurred when extracting the Advanced Monitoring Agent uninstaller, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog F "Failing script." + } + <# + If ($missingCmdlet -eq $true) { + writeToLog W "Expand-Archive not an applicable cmdlet, due to an old version of Powershell." + writeToLog V "Will attempt extracting the uninstaller files using the Shell.Application object." + + $script:shell = new-object -com Shell.Application + $shell.namespace($logFolder).copyhere($shell.namespace($downloadedFile).items(),16) + + } Else { + try { + Expand-Archive $downloadedFile $logFolder -Force -ErrorAction Stop + } + catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when extracting the Advanced Monitoring Agent uninstaller from the zip file, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog F "Failing script." + Exit 1001 + } + } + #> + + $uninstallerPath = $logFolder + "unins000.exe" + $extractTest = Test-Path $uninstallerPath + + writeToLog V "Testing path:`r`n`t$uninstallerPath" + writeToLog V "Extract location detection returned as:`r`n`t$extractTest" + + If ($extractTest -ne $true) { + writeToLog F "An issue occurred when trying to extract the Advanced Monitoring Agent uninstaller to the following location:`r`n`t$uninstallerPath" + writeToLog F "Failing script." + Exit 1001 + } + + $extractFile = (Get-ChildItem $extractLocation).FullName + + writeToLog I "Advanced Monitoring Agent uninstaller extracted successfully, which is extracted to:`r`n`t$extractFile" + + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function stopAgentServices() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + writeToLog I "Attempting to stop the Advanced Monitoring Agent services, to assist with the uninstall process." + + $script:amaServiceName = "Advanced Monitoring Agent" + $script:amaWPServiceName = "Advanced Monitoring Agent Web Protection" + $script:amaNMServiceName = "Advanced Monitoring Agent Network Management" + + try { + $script:amaService = Get-Service $amaServiceName -ErrorAction Stop -WarningAction SilentlyContinue + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when detecting the Advanced Monitoring Agent service, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + + try { + Stop-Service $amaService -Force -ErrorAction Stop -WarningAction SilentlyContinue | Out-Null + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when stopping the Advanced Monitoring Agent service, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + + Start-Sleep 5 + + try { + $script:amaService = Get-Service $amaServiceName -ErrorAction Stop -WarningAction SilentlyContinue + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when detecting the Advanced Monitoring Agent service, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + + writeToLog I "Advanced Monitoring Agent Windows Service Status: $($amaService.Status)" + + writeToLog I "Removing the Advanced Monitoring Agent service." + + try { + $script:amaService = sc.exe delete $amaServiceName -ErrorAction Stop -WarningAction SilentlyContinue + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when removing the Advanced Monitoring Agent service, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + + writeToLog I "Moving onto auxiliary Advanced Monitoring Agent services." + + If (Get-Service $amaWPServiceName -ErrorAction SilentlyContinue) { + If ((Get-Service $amaWPServiceName).Status -eq "Running") { + writeToLog V "Found the $amaWPServiceName service running, will now attempt to stop." + try { + Stop-Service $amaWPServiceName -Force -ErrorAction Stop -WarningAction SilentlyContinue | Out-Null + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when stopping the $amaWPServiceName service, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + } + } + If (Get-Service $amaNMServiceName -ErrorAction SilentlyContinue) { + If ((Get-Service $amaNMServiceName).Status -eq "Running") { + writeToLog V "Found the $amaNMServiceName service running, will now attempt to stop." + try { + Stop-Service $amaNMServiceName -Force -ErrorAction Stop -WarningAction SilentlyContinue | Out-Null + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when stopping the $amaNMServiceName service, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + } + } + + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function performUninstall() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $uninsExePath = $localFolder + "unins000.exe" + $uninsDatPath = $localFolder + "unins000.dat" + + writeToLog I "Now running the Advanced Monitoring Agent uninstaller." + writeToLog I "Invoking the uninstaller from the following location:`r`n`t$uninsExePath" + + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $uninsExePath + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = "/SILENT" + + $installArgs = $pinfo.Arguments + writeToLog V "Uninstall Arguments set: $installArgs" + + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + $script:exitCode = $p.ExitCode + + If ($exitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" + } + + Start-Sleep 10 + + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function postUninstall() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + # Confirm pid is removed + try { + $winagentProcess = Get-Process -Name "winagent" -ErrorAction SilentlyContinue | Select-Object Name,ProcessName,Id + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when stopping the $amaNMServiceName service, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + + If ($winagentProcess) { + writeToLog W "Winagent process detected:`r`n`tName: $($winagentProcess.Name)`r`n`tFullName: $($winagentProcess.ProcessName)`r`n`tProcessID: $($winagentProcess.Id)" + writeToLog W "Winagent process is still running on the device, attempting to terminate process." + + try { + $winagentProcess | Stop-Process -Force -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred when terminating the 'winagent' process, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + } Else { + writeToLog V "Confirmed the Advanced Monitoring Agent process (winagent) is no longer present." + } + + # Confirm service is removed + try { + $script:amaService = Get-Service $amaServiceName -ErrorAction SilentlyContinue + } catch { + } + + If ($null -eq $amaService) { + writeToLog V "Confirmed the Advanced Monitoring Agent Windows Service no longer exists." + } Else { + writeToLog W "The Advanced Monitoring Agent service still exists on the device." + } + + writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) +} + +function cleanupAgentData() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $winagentPath = $localFolder + "winagent.exe" + $agentSettingsPath = $localFolder + "settings.ini" + + $winagentExists = Test-Path $winagentPath + $agentSettingsExists = Test-Path $agentSettingsPath + + If ($agentSettingsExists -eq $true) { + writeToLog W "Settings.ini still exists on the device, forcibly removing file." + + try { + Remove-Item $agentSettingsPath -Force -ErrorAction Stop + } + catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Unable to remove settings.ini from device, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + } Else { + writeToLog V "Confirmed settings.ini no longer exists on the device." + } + + If ($winagentExists -eq $true) { + writeToLog F "The Advanced Monitoring Agent is still installed." + writeToLog F "Failing script." + Exit 1001 + } Else { + writeToLog I "The Advanced Monitoring Agent's Winagent.exe application no longer exists, so removal has been successful." + writeToLog V "Cleaning up the Advanced Monitoring Agent install location." + + try { + Remove-Item $localFolder -Force -Recurse -ErrorAction Stop + } + catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Unable to remove Advanced Monitoring Agent folder from device, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + } + + writeToLog V "Checking if registry entry is present." + writeToLog V "Registry Path:`r`n`t$registryPath" + + $regExists = Test-Path $registryPath + + If ($regExists -eq $true) { + writeToLog V "Path still exists, will remove." + + try { + Remove-Item $registryPath -force -ErrorAction Stop + } + catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Unable to remove path from registry, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + } + } Else { + writeToLog V "Registry Path no longer exists." + } + + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function performEcosytemUninstall() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $ecoPath = "C:\Program Files (x86)\Solarwinds MSP\Ecosystem Agent\unins000.exe" + + If (!(Test-Path $ecoPath)) { + writeToLog E "The uninstaller for the Ecosystem Agent doesn't exist." + writeToLog W "Ecosystem Agent removal cannot proceed." + } Else { + + writeToLog I "Now running the Ecosystem uninstaller." + writeToLog I "Invoking the uninstaller from the following location:`r`n`t$ecoPath" + + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $ecoPath + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = "/VERYSILENT" + + $installArgs = $pinfo.Arguments + writeToLog V "Uninstall Arguments set: $installArgs" + + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + $script:exitCode = $p.ExitCode + + If ($exitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" + } + + Start-Sleep 10 + } + + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function writeToLog($state, $message) { + + $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) + + switch -regex -Wildcard ($state) { + "I" { + $state = "INFO" + $colour = "Cyan" + } + "E" { + $state = "ERROR" + $colour = "Red" + } + "W" { + $state = "WARNING" + $colour = "Yellow" + } + "F" { + $state = "FAILURE" + $colour = "Red" + } + "C" { + $state = "COMPLETE" + $colour = "Green" + } + "V" { + If ($verboseMode -eq $true) { + $state = "VERBOSE" + $colour = "Magenta" + } Else { + return + } + } + "" { + $state = "INFO" + } + Default { + $state = "INFO" + } + } + + Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour + Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue +} + +function main() { +# Main function, set to run other functions + setupLogging + validateUserInput + getAgentPath + # moveUninstaller + stopAgentServices + performUninstall + postUninstall + cleanupAgentData + performEcosytemUninstall +} + +main \ No newline at end of file diff --git a/src/n-sight/cleaners/PMECleanup.ps1 b/src/external/scripts/N-Sight/PMECleanup.ps1 similarity index 95% rename from src/n-sight/cleaners/PMECleanup.ps1 rename to src/external/scripts/N-Sight/PMECleanup.ps1 index 97a5e231..7c23a624 100644 --- a/src/n-sight/cleaners/PMECleanup.ps1 +++ b/src/external/scripts/N-Sight/PMECleanup.ps1 @@ -1,588 +1,588 @@ -#!ignore -# '================================================================================================================================================================== -# 'Disclaimer -# 'The sample scripts are not supported under any N-able support program or service. -# 'The sample scripts are provided AS IS without warranty of any kind. -# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. -# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. -# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever -# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) -# 'arising out of the use of or inability to use the sample scripts or documentation. -# '================================================================================================================================================================== - -Param ( - [string]$verbose = "Y" -) - -function setupLogging() { - $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\Feature Cleanup Utility\debug.log" - - $script:logFolder = Split-Path $logFilePath - $script:logFile = Split-Path $logFilePath -Leaf - - If (($logFolder -match '.+?\\$') -eq $false) { - $script:logFolder = $logFolder + "\" - } - - $script:scriptLocation = $logFolder + "PMECleanup.ps1" - - [float]$script:currentVersion = 1.14 - writeToLog I "Started processing the PME Cleanup script." - writeToLog I "Running script version: $currentVersion" -} - -function validateUserInput() { -# Ensures the provided input from user is valid - If ($verbose.ToLower() -eq "y") { - $script:verboseMode = $true - writeToLog V "You have defined to have the script output the verbose log entries." - } Else { - $script:verboseMode = $false - writeToLog I "Will output logs in regular mode." - } - - writeToLog V "Input Parameters have been successfully validated." - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function initialSetup() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $osVersion = (Get-WmiObject Win32_OperatingSystem).Caption - # Workaround for WMI timeout or WMI returning no data - If (($null -eq $osVersion) -or ($OSVersion -like "*OS - Alias not found*")) { - $osVersion = (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('ProductName') - } - writeToLog I "Detected Operating System:`r`n`t$OSVersion" - - $osArch = (Get-WmiObject Win32_OperatingSystem).OSArchitecture - writeToLog I "Detected Operating System Aarchitecture: $osArch" - - $psVersion = $PSVersionTable.PSVersion - writeToLog I "Detected PowerShell Version:`r`n`t$psVersion" - - $dotNetVersion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where-Object { $_.PSChildName -Match '^(?!S)\p{L}'} | Select-Object PSChildName, version - - foreach ($i in $dotNetVersion) { - writeToLog I ".NET Version: $($i.PSChildName) = $($i.Version)" - } - - writeToLog I "Setting TLS to version 1.2." - # Set security protocol to TLS 1.2 to avoid TLS errors - [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - - $tlsValue = [Net.ServicePointManager]::SecurityProtocol - - writeToLog V "Confirming TLS Value set:`r`n`t$tlsValue" - - writeToLog I "Checking if device has TLS 1.2 Cipher Suites." - [System.Collections.ArrayList]$enabled = @() - - $cipherslists = @('TLS_DHE_RSA_WITH_AES_128_GCM_SHA256','TLS_DHE_RSA_WITH_AES_256_GCM_SHA384','TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256','TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384') - $ciphersenabledkey = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\' | Select-Object -ExpandProperty Functions - - ForEach ($a in $ciphersenabledkey) { - If ($cipherslists -eq $a){ - $enabled.Add($a) | Out-Null - } - } - - If ($enabled.count -ne 0) { - writeToLog I "Cipher Suite(s) found:" - Foreach ($i in $enabled) { - writeToLog I "Detected Cipher: $i" - } - } Else { - writeToLog W "Device is not fully patched, no secure Cipher Suite(s) were found." - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function getAgentPath() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - try { - $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop - } catch { - writeToLog F "Error during the lookup of the CurrentVersion\Uninstall Path in the registry:" - writeToLog F $_ - postRuntime - Exit 1001 - } - - $Items = $Keys | Foreach-Object { - Get-ItemProperty $_.PsPath - } - - ForEach ($Item in $Items) { - If ($Item.DisplayName -like "Patch Management Service Controller") { - $script:localFolder = $Item.installLocation - break - } - } - - try { - $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop - } catch { - writeToLog F "Error during the lookup of the WOW6432Node Path in the registry:" - writeToLog F $_ - } - - $Items = $Keys | Foreach-Object { - Get-ItemProperty $_.PsPath - } - - ForEach ($Item in $Items) { - If ($Item.DisplayName -like "*Patch Management Service Controller*") { - $script:localFolder = $Item.installLocation - break - } - } - - If (!$localFolder) { - writeToLog F "PME installation not found." - writeToLog F "Will do post-cleanup but marking script as failed." - runPMEV2Uninstaller - removeProcesses - removePMEServices - removePMEFoldersAndKeys - postRuntime - Exit 1001 - } - - If (!(Test-Path $localFolder)) { - writeToLog F "The PME install location is pointing to a path that doesn't exist." - runPMEV2Uninstaller - removeProcesses - removePMEServices - removePMEFoldersAndKeys - postRuntime - Exit 1001 - } - - If (($localFolder -match '.+?\\$') -eq $false) { - $script:localFolder = $script:localFolder + "\" - } - - $script:pmeFolder = (Split-Path $localFolder) + "\" - - writeToLog V "PME Folder located:`r`n`t$pmeFolder" - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function determinePMEVersion() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - try { - $pmeVersionRaw = Get-Process -Name *PME.Agent -FileVersionInfo | Select-Object ProductName,ProductVersion,FileVersion | Sort-Object -unique -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog F "Error occurred locating an applicable PME Agent process, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog F "Failing script." - postRuntime - Exit 1001 - } - - $pmeProductName = $pmeVersionRaw.ProductName - $pmeProductVersion = $pmeVersionRaw.ProductVersion - - writeToLog V "Detected PME Version: $pmeProductVersion" - - If ($pmeProductName -eq "SolarWinds.MSP.PME.Agent") { - writeToLog I "Detected installed PME Version is: $pmeProductVersion" - $script:legacyPME = $true - } ElseIf ($pmeProductName -eq "PME.Agent") { - writeToLog I "Detected installed PME Version is: $pmeProductVersion" - $script:legacyPME = $false - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function runPMEV1Uninstaller() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $hash = @{ - "$($pmeFolder)PME\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; - "$($pmeFolder)patchman\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; - "$($pmeFolder)CacheService\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; - "$($pmeFolder)RpcServer\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" - } - - foreach ($key in $hash.Keys) { - If (Test-Path $key) { - $datItem = $key - $datItem = $datItem -replace "exe","dat" - - If (!(Test-Path $datItem)) { - writeToLog W "Dat file not found. Will attempt downloading." - downloadFileToLocation $hash[$key] $datItem - - If (!(Test-Path $datItem)) { - writeToLog F "Unable to download dat file for uninstaller to run." - writeToLog F "PME must be removed manually. Failing script." - postRuntime - Exit 1001 - } - } - - writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." - - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $key - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = "/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART" - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - $script:exitCode = $p.ExitCode - - If ($exitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" - } - - Start-Sleep -s 5 - - } Else { - writeToLog W "$key Uninstaller doesn't exist on the device." - } - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function runPMEV2Uninstaller() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $hash = @{ - "$($pmeFolder)PME\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; - "$($pmeFolder)patchman\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; - "$($pmeFolder)FileCacheServiceAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; - "$($pmeFolder)RequestHandlerAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" - } - - foreach ($key in $hash.Keys) { - write-host "Checking $key" - $keyName = (split-path $key).split('\')[-1] - if (Test-Path $key) { - $datItem = $key - $datItem = $datItem -replace "exe","dat" - - write-host "Dat Item:`r`n`t$datItem" - - if (!(Test-Path $datItem)) { - writeToLog W "Could not find the following dat file:`r`n`t$datItem" - writeToLog W "Dat file not found. Will attempt downloading." - downloadFileToLocation $hash[$key] $datItem - - if (!(Test-Path $datItem)) { - writeToLog F "Unable to download dat file for uninstaller to run." - writeToLog F "PME must be removed manually. Failing script." - postRuntime - exit 1001 - } - } - - writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." - - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $key - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = "/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /LOG=`"C:\ProgramData\MspPlatform\Tech Tribes\Feature Cleanup Utility\$keyName-uninstall.log`"" - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - $script:exitCode = $p.ExitCode - - If ($exitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" - } - - Start-Sleep -s 5 - - } Else { - writeToLog W "$key Uninstaller doesn't exist on the device." - } - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function removeProcesses() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - try { - $script:pmeProcess = Get-Process -processname "*PME*" -ErrorAction Stop - $script:rpcProcess = Get-Process -processname "*RequestHandlerAgent*" -ErrorAction Stop - $script:cacheServiceProcess = Get-Process -processname "*Cache*" -ErrorAction Stop - } catch { - writeToLog E "Error detecting process:" - writeToLog E $_ - } - - If ($null -ne $pmeProcess) { - writeToLog I "Detected $pmeProcess on the device, removing." - try { - Stop-Process $pmeProcess -Force -ErrorAction Stop - } catch { - writeToLog E "Error stopping PME process:" - writeToLog E $_ - } - } Else { - writeToLog I "Did not detect the PME process on the device." - } - - If ($null -ne $rpcProcess) { - writeToLog I "Detected $rpcProcess on the device, removing." - try { - Stop-Process $rpcProcess -Force -ErrorAction Stop - } catch { - writeToLog E "Error stopping RPC process:" - writeToLog E $_ - } - } Else { - writeToLog I "Did not detect PME's RPC process on the device." - } - If ($null -ne $cacheServiceProcess) { - writeToLog I "Detected $cacheServiceProcess on the device, removing." - try { - Stop-Process $cacheServiceProcess -Force -ErrorAction Stop - } catch { - writeToLog E "Error stopping Cache Service process:" - writeToLog E $_ - } - } Else { - writeToLog I "Did not detect PME's Cache Service process on the device." - } - - # If '_iu14D2N.tmp' is present on the device, then we will try to kill it - try { - $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop - } catch { - writeToLog E "Error detecting uninstaller lock file, due to:" - writeToLog E $_ - } - - If ($null -ne $uninsLockProcTest) { - writeToLog I "Detected $uninsLockProcTest on the device, removing." - try { - Stop-Process $uninsLockProcTest -Force -ErrorAction Stop - } catch { - writeToLog E "Error stopping uninstall lock process:" - writeToLog E $_ - } - } - - $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" - $uninsLockPathTest = Test-Path $uninsLockPath - - If ($uninsLockPathTest -eq $true) { - writeToLog I "Detected $uninsLockPath on the device, removing." - Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function downloadFileToLocation ($URL, $Location) { - - $wc = New-Object System.Net.WebClient - - try { - $wc.DownloadFile($URL, $Location) - } catch { - writeToLog E "Exception when downloading file $Location from source $URL." - } -} - -function removePMEServices() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "PME.Agent.PmeService" - $array += "SolarWinds.MSP.RpcServerService" - $array += "SolarWinds.MSP.CacheService" - - foreach ($serviceName in $array) { - - If (Get-Service $serviceName -ErrorAction SilentlyContinue) { - writeToLog I "Detected the $serviceName service on the device, will now remove service." - - try { - $stopService = Stop-Service -Name $serviceName -ErrorAction Stop - $deleteService = sc.exe delete $serviceName -ErrorAction Stop - } catch { - writeToLog I "The service cannot be removed automatically. Please remove manually." - $removalError = $error[0] - writeToLog I "Exception from removal attempt is: $removalError" - } - writeToLog I "$serviceName service is now removed." - } Else { - writeToLog W "$serviceName service not found." - } - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function removePMEFoldersAndKeys() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "C:\ProgramData\SolarWinds MSP\PME" - $array += "C:\ProgramData\MspPlatform\PME" - $array += "C:\ProgramData\MspPlatform\PME.Agent.PmeService" - - $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.CacheService" - $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.CacheService" - $array += "C:\ProgramData\MspPlatform\FileCacheServiceAgent" - - $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.Diagnostics" - $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.RpcServerService" - $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.RpcServerService" - $array += "C:\ProgramData\MspPlatform\RequestHandlerAgent" - - $array += "C:\Program Files (x86)\SolarWinds MSP\CacheService\" - $array += "C:\Program Files (x86)\MspPlatform\FileCacheServiceAgent\" - $array += "C:\Program Files (x86)\SolarWinds MSP\PME\" - $array += "C:\Program Files (x86)\MspPlatform\PME\" - $array += "C:\Program Files (x86)\SolarWinds MSP\RpcServer\" - $array += "C:\Program Files (x86)\MspPlatform\RequestHandlerAgent\" - - $array += "$($script:LocalFolder)patchman" - $array += "$($script:LocalFolder)CacheService" - $array += "$($script:LocalFolder)RpcServer" - $array += "$($script:LocalFolder)FileCacheServiceAgent" - $array += "$($script:LocalFolder)RequestHandlerAgent" - - If ((Test-Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall") -eq $true) { - $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" - - foreach ($entry in $recurse) { - foreach ($key in Get-ItemProperty -path "Registry::$entry") { - if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { - $temp = $entry.name -replace "HKEY_LOCAL_MACHINE", "HKLM:" - $array += $temp - } - } - } - } - - $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" - - foreach ($entry in $recurse) { - foreach ($key in Get-ItemProperty -path "Registry::$entry") { - if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { - $temp = $entry.name -replace "HKEY_LOCAL_MACHINE", "HKLM:" - $array += $temp - } - } - } - - foreach ($FolderLocation in $Array) { - if (Test-Path $FolderLocation) { - writeToLog I "$FolderLocation exists. Removing item..." - - try { - remove-item $folderLocation -recurse -force - } catch { - writeToLog I "The item $FolderLocation exists but cannot be removed automatically. Please remove manually." - $removalError = $error[0] - writeToLog E "Exception from removal attempt is: $removalError" - } - } else { - writeToLog W "$FolderLocation doesn't exist - moving on..." - } - } - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function postRuntime() { - try { - Remove-Item $scriptLocation -Force -ErrorAction SilentlyContinue - } - catch { - } - - try { - Remove-Item $xmlLocation -Force -ErrorAction SilentlyContinue - } - catch { - } -} - -function writeToLog($state, $message) { - - $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) - - switch -regex -Wildcard ($state) { - "I" { - $state = "INFO" - $colour = "Cyan" - } - "E" { - $state = "ERROR" - $colour = "Red" - } - "W" { - $state = "WARNING" - $colour = "Yellow" - } - "F" { - $state = "FAILURE" - $colour = "Red" - } - "C" { - $state = "COMPLETE" - $colour = "Green" - } - "V" { - If ($verboseMode -eq $true) { - $state = "VERBOSE" - $colour = "Magenta" - } Else { - return - } - } - "" { - $state = "INFO" - } - Default { - $state = "INFO" - } - } - - Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour - Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue -} - -function main(){ - setupLogging - validateUserInput - getAgentPath - determinePMEVersion - - If ($legacyPME -eq $true) { - runPMEV1Uninstaller - } Else { - runPMEV2Uninstaller - } - - removeProcesses - removePMEServices - removePMEFoldersAndKeys - - writeToLog I "PME Cleanup now complete." - postRuntime -} -main +#!ignore "947e90c09c394e715cd00d2fc57e7e09" +# '================================================================================================================================================================== +# 'Disclaimer +# 'The sample scripts are not supported under any N-able support program or service. +# 'The sample scripts are provided AS IS without warranty of any kind. +# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. +# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. +# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever +# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) +# 'arising out of the use of or inability to use the sample scripts or documentation. +# '================================================================================================================================================================== + +Param ( + [string]$verbose = "Y" +) + +function setupLogging() { + $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\Feature Cleanup Utility\debug.log" + + $script:logFolder = Split-Path $logFilePath + $script:logFile = Split-Path $logFilePath -Leaf + + If (($logFolder -match '.+?\\$') -eq $false) { + $script:logFolder = $logFolder + "\" + } + + $script:scriptLocation = $logFolder + "PMECleanup.ps1" + + [float]$script:currentVersion = 1.14 + writeToLog I "Started processing the PME Cleanup script." + writeToLog I "Running script version: $currentVersion" +} + +function validateUserInput() { +# Ensures the provided input from user is valid + If ($verbose.ToLower() -eq "y") { + $script:verboseMode = $true + writeToLog V "You have defined to have the script output the verbose log entries." + } Else { + $script:verboseMode = $false + writeToLog I "Will output logs in regular mode." + } + + writeToLog V "Input Parameters have been successfully validated." + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function initialSetup() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $osVersion = (Get-WmiObject Win32_OperatingSystem).Caption + # Workaround for WMI timeout or WMI returning no data + If (($null -eq $osVersion) -or ($OSVersion -like "*OS - Alias not found*")) { + $osVersion = (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('ProductName') + } + writeToLog I "Detected Operating System:`r`n`t$OSVersion" + + $osArch = (Get-WmiObject Win32_OperatingSystem).OSArchitecture + writeToLog I "Detected Operating System Aarchitecture: $osArch" + + $psVersion = $PSVersionTable.PSVersion + writeToLog I "Detected PowerShell Version:`r`n`t$psVersion" + + $dotNetVersion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where-Object { $_.PSChildName -Match '^(?!S)\p{L}'} | Select-Object PSChildName, version + + foreach ($i in $dotNetVersion) { + writeToLog I ".NET Version: $($i.PSChildName) = $($i.Version)" + } + + writeToLog I "Setting TLS to version 1.2." + # Set security protocol to TLS 1.2 to avoid TLS errors + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + + $tlsValue = [Net.ServicePointManager]::SecurityProtocol + + writeToLog V "Confirming TLS Value set:`r`n`t$tlsValue" + + writeToLog I "Checking if device has TLS 1.2 Cipher Suites." + [System.Collections.ArrayList]$enabled = @() + + $cipherslists = @('TLS_DHE_RSA_WITH_AES_128_GCM_SHA256','TLS_DHE_RSA_WITH_AES_256_GCM_SHA384','TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256','TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384') + $ciphersenabledkey = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\' | Select-Object -ExpandProperty Functions + + ForEach ($a in $ciphersenabledkey) { + If ($cipherslists -eq $a){ + $enabled.Add($a) | Out-Null + } + } + + If ($enabled.count -ne 0) { + writeToLog I "Cipher Suite(s) found:" + Foreach ($i in $enabled) { + writeToLog I "Detected Cipher: $i" + } + } Else { + writeToLog W "Device is not fully patched, no secure Cipher Suite(s) were found." + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function getAgentPath() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop + } catch { + writeToLog F "Error during the lookup of the CurrentVersion\Uninstall Path in the registry:" + writeToLog F $_ + postRuntime + Exit 1001 + } + + $Items = $Keys | Foreach-Object { + Get-ItemProperty $_.PsPath + } + + ForEach ($Item in $Items) { + If ($Item.DisplayName -like "Patch Management Service Controller") { + $script:localFolder = $Item.installLocation + break + } + } + + try { + $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop + } catch { + writeToLog F "Error during the lookup of the WOW6432Node Path in the registry:" + writeToLog F $_ + } + + $Items = $Keys | Foreach-Object { + Get-ItemProperty $_.PsPath + } + + ForEach ($Item in $Items) { + If ($Item.DisplayName -like "*Patch Management Service Controller*") { + $script:localFolder = $Item.installLocation + break + } + } + + If (!$localFolder) { + writeToLog F "PME installation not found." + writeToLog F "Will do post-cleanup but marking script as failed." + runPMEV2Uninstaller + removeProcesses + removePMEServices + removePMEFoldersAndKeys + postRuntime + Exit 1001 + } + + If (!(Test-Path $localFolder)) { + writeToLog F "The PME install location is pointing to a path that doesn't exist." + runPMEV2Uninstaller + removeProcesses + removePMEServices + removePMEFoldersAndKeys + postRuntime + Exit 1001 + } + + If (($localFolder -match '.+?\\$') -eq $false) { + $script:localFolder = $script:localFolder + "\" + } + + $script:pmeFolder = (Split-Path $localFolder) + "\" + + writeToLog V "PME Folder located:`r`n`t$pmeFolder" + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function determinePMEVersion() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $pmeVersionRaw = Get-Process -Name *PME.Agent -FileVersionInfo | Select-Object ProductName,ProductVersion,FileVersion | Sort-Object -unique -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog F "Error occurred locating an applicable PME Agent process, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog F "Failing script." + postRuntime + Exit 1001 + } + + $pmeProductName = $pmeVersionRaw.ProductName + $pmeProductVersion = $pmeVersionRaw.ProductVersion + + writeToLog V "Detected PME Version: $pmeProductVersion" + + If ($pmeProductName -eq "SolarWinds.MSP.PME.Agent") { + writeToLog I "Detected installed PME Version is: $pmeProductVersion" + $script:legacyPME = $true + } ElseIf ($pmeProductName -eq "PME.Agent") { + writeToLog I "Detected installed PME Version is: $pmeProductVersion" + $script:legacyPME = $false + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function runPMEV1Uninstaller() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $hash = @{ + "$($pmeFolder)PME\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; + "$($pmeFolder)patchman\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; + "$($pmeFolder)CacheService\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; + "$($pmeFolder)RpcServer\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" + } + + foreach ($key in $hash.Keys) { + If (Test-Path $key) { + $datItem = $key + $datItem = $datItem -replace "exe","dat" + + If (!(Test-Path $datItem)) { + writeToLog W "Dat file not found. Will attempt downloading." + downloadFileToLocation $hash[$key] $datItem + + If (!(Test-Path $datItem)) { + writeToLog F "Unable to download dat file for uninstaller to run." + writeToLog F "PME must be removed manually. Failing script." + postRuntime + Exit 1001 + } + } + + writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." + + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $key + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = "/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART" + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + $script:exitCode = $p.ExitCode + + If ($exitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" + } + + Start-Sleep -s 5 + + } Else { + writeToLog W "$key Uninstaller doesn't exist on the device." + } + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function runPMEV2Uninstaller() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $hash = @{ + "$($pmeFolder)PME\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; + "$($pmeFolder)patchman\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; + "$($pmeFolder)FileCacheServiceAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; + "$($pmeFolder)RequestHandlerAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" + } + + foreach ($key in $hash.Keys) { + write-host "Checking $key" + $keyName = (split-path $key).split('\')[-1] + if (Test-Path $key) { + $datItem = $key + $datItem = $datItem -replace "exe","dat" + + write-host "Dat Item:`r`n`t$datItem" + + if (!(Test-Path $datItem)) { + writeToLog W "Could not find the following dat file:`r`n`t$datItem" + writeToLog W "Dat file not found. Will attempt downloading." + downloadFileToLocation $hash[$key] $datItem + + if (!(Test-Path $datItem)) { + writeToLog F "Unable to download dat file for uninstaller to run." + writeToLog F "PME must be removed manually. Failing script." + postRuntime + exit 1001 + } + } + + writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." + + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $key + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = "/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /LOG=`"C:\ProgramData\MspPlatform\Tech Tribes\Feature Cleanup Utility\$keyName-uninstall.log`"" + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + $script:exitCode = $p.ExitCode + + If ($exitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" + } + + Start-Sleep -s 5 + + } Else { + writeToLog W "$key Uninstaller doesn't exist on the device." + } + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function removeProcesses() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $script:pmeProcess = Get-Process -processname "*PME*" -ErrorAction Stop + $script:rpcProcess = Get-Process -processname "*RequestHandlerAgent*" -ErrorAction Stop + $script:cacheServiceProcess = Get-Process -processname "*Cache*" -ErrorAction Stop + } catch { + writeToLog E "Error detecting process:" + writeToLog E $_ + } + + If ($null -ne $pmeProcess) { + writeToLog I "Detected $pmeProcess on the device, removing." + try { + Stop-Process $pmeProcess -Force -ErrorAction Stop + } catch { + writeToLog E "Error stopping PME process:" + writeToLog E $_ + } + } Else { + writeToLog I "Did not detect the PME process on the device." + } + + If ($null -ne $rpcProcess) { + writeToLog I "Detected $rpcProcess on the device, removing." + try { + Stop-Process $rpcProcess -Force -ErrorAction Stop + } catch { + writeToLog E "Error stopping RPC process:" + writeToLog E $_ + } + } Else { + writeToLog I "Did not detect PME's RPC process on the device." + } + If ($null -ne $cacheServiceProcess) { + writeToLog I "Detected $cacheServiceProcess on the device, removing." + try { + Stop-Process $cacheServiceProcess -Force -ErrorAction Stop + } catch { + writeToLog E "Error stopping Cache Service process:" + writeToLog E $_ + } + } Else { + writeToLog I "Did not detect PME's Cache Service process on the device." + } + + # If '_iu14D2N.tmp' is present on the device, then we will try to kill it + try { + $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop + } catch { + writeToLog E "Error detecting uninstaller lock file, due to:" + writeToLog E $_ + } + + If ($null -ne $uninsLockProcTest) { + writeToLog I "Detected $uninsLockProcTest on the device, removing." + try { + Stop-Process $uninsLockProcTest -Force -ErrorAction Stop + } catch { + writeToLog E "Error stopping uninstall lock process:" + writeToLog E $_ + } + } + + $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" + $uninsLockPathTest = Test-Path $uninsLockPath + + If ($uninsLockPathTest -eq $true) { + writeToLog I "Detected $uninsLockPath on the device, removing." + Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function downloadFileToLocation ($URL, $Location) { + + $wc = New-Object System.Net.WebClient + + try { + $wc.DownloadFile($URL, $Location) + } catch { + writeToLog E "Exception when downloading file $Location from source $URL." + } +} + +function removePMEServices() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "PME.Agent.PmeService" + $array += "SolarWinds.MSP.RpcServerService" + $array += "SolarWinds.MSP.CacheService" + + foreach ($serviceName in $array) { + + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + writeToLog I "Detected the $serviceName service on the device, will now remove service." + + try { + $stopService = Stop-Service -Name $serviceName -ErrorAction Stop + $deleteService = sc.exe delete $serviceName -ErrorAction Stop + } catch { + writeToLog I "The service cannot be removed automatically. Please remove manually." + $removalError = $error[0] + writeToLog I "Exception from removal attempt is: $removalError" + } + writeToLog I "$serviceName service is now removed." + } Else { + writeToLog W "$serviceName service not found." + } + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function removePMEFoldersAndKeys() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "C:\ProgramData\SolarWinds MSP\PME" + $array += "C:\ProgramData\MspPlatform\PME" + $array += "C:\ProgramData\MspPlatform\PME.Agent.PmeService" + + $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.CacheService" + $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.CacheService" + $array += "C:\ProgramData\MspPlatform\FileCacheServiceAgent" + + $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.Diagnostics" + $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.RpcServerService" + $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.RpcServerService" + $array += "C:\ProgramData\MspPlatform\RequestHandlerAgent" + + $array += "C:\Program Files (x86)\SolarWinds MSP\CacheService\" + $array += "C:\Program Files (x86)\MspPlatform\FileCacheServiceAgent\" + $array += "C:\Program Files (x86)\SolarWinds MSP\PME\" + $array += "C:\Program Files (x86)\MspPlatform\PME\" + $array += "C:\Program Files (x86)\SolarWinds MSP\RpcServer\" + $array += "C:\Program Files (x86)\MspPlatform\RequestHandlerAgent\" + + $array += "$($script:LocalFolder)patchman" + $array += "$($script:LocalFolder)CacheService" + $array += "$($script:LocalFolder)RpcServer" + $array += "$($script:LocalFolder)FileCacheServiceAgent" + $array += "$($script:LocalFolder)RequestHandlerAgent" + + If ((Test-Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall") -eq $true) { + $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" + + foreach ($entry in $recurse) { + foreach ($key in Get-ItemProperty -path "Registry::$entry") { + if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { + $temp = $entry.name -replace "HKEY_LOCAL_MACHINE", "HKLM:" + $array += $temp + } + } + } + } + + $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" + + foreach ($entry in $recurse) { + foreach ($key in Get-ItemProperty -path "Registry::$entry") { + if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { + $temp = $entry.name -replace "HKEY_LOCAL_MACHINE", "HKLM:" + $array += $temp + } + } + } + + foreach ($FolderLocation in $Array) { + if (Test-Path $FolderLocation) { + writeToLog I "$FolderLocation exists. Removing item..." + + try { + remove-item $folderLocation -recurse -force + } catch { + writeToLog I "The item $FolderLocation exists but cannot be removed automatically. Please remove manually." + $removalError = $error[0] + writeToLog E "Exception from removal attempt is: $removalError" + } + } else { + writeToLog W "$FolderLocation doesn't exist - moving on..." + } + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function postRuntime() { + try { + Remove-Item $scriptLocation -Force -ErrorAction SilentlyContinue + } + catch { + } + + try { + Remove-Item $xmlLocation -Force -ErrorAction SilentlyContinue + } + catch { + } +} + +function writeToLog($state, $message) { + + $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) + + switch -regex -Wildcard ($state) { + "I" { + $state = "INFO" + $colour = "Cyan" + } + "E" { + $state = "ERROR" + $colour = "Red" + } + "W" { + $state = "WARNING" + $colour = "Yellow" + } + "F" { + $state = "FAILURE" + $colour = "Red" + } + "C" { + $state = "COMPLETE" + $colour = "Green" + } + "V" { + If ($verboseMode -eq $true) { + $state = "VERBOSE" + $colour = "Magenta" + } Else { + return + } + } + "" { + $state = "INFO" + } + Default { + $state = "INFO" + } + } + + Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour + Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue +} + +function main(){ + setupLogging + validateUserInput + getAgentPath + determinePMEVersion + + If ($legacyPME -eq $true) { + runPMEV1Uninstaller + } Else { + runPMEV2Uninstaller + } + + removeProcesses + removePMEServices + removePMEFoldersAndKeys + + writeToLog I "PME Cleanup now complete." + postRuntime +} +main \ No newline at end of file diff --git a/src/n-sight/cleaners/TakeControlCleanup.ps1 b/src/external/scripts/N-Sight/TakeControlCleanup.ps1 similarity index 96% rename from src/n-sight/cleaners/TakeControlCleanup.ps1 rename to src/external/scripts/N-Sight/TakeControlCleanup.ps1 index b98889df..01734631 100644 --- a/src/n-sight/cleaners/TakeControlCleanup.ps1 +++ b/src/external/scripts/N-Sight/TakeControlCleanup.ps1 @@ -1,549 +1,549 @@ -#!ignore -# '================================================================================================================================================================== -# 'Disclaimer -# 'The sample scripts are not supported under any N-able support program or service. -# 'The sample scripts are provided AS IS without warranty of any kind. -# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. -# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. -# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever -# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) -# 'arising out of the use of or inability to use the sample scripts or documentation. -# '================================================================================================================================================================== - -Param ( - [string]$verbose = "Y" -) - -function setupLogging() { - $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\Feature Cleanup Utility\debug.log" - - $script:logFolder = Split-Path $logFilePath - $script:logFile = Split-Path $logFilePath -Leaf - - If (($logFolder -match '.+?\\$') -eq $false) { - $script:logFolder = $logFolder + "\" - } - - $script:scriptLocation = $logFolder + "TakeControlCleanup.ps1" - - [float]$script:currentVersion = 1.02 - writeToLog I "Started processing the Take Control Cleanup script." - writeToLog I "Running script version: $currentVersion" -} - -function validateUserInput() { - # Handles input params and determines if log output is verbose - If ($verbose.ToLower() -eq "y") { - $script:verboseMode = $true - writeToLog V "You have defined to have the script output the verbose log entries." - } Else { - $script:verboseMode = $false - writeToLog I "Will output logs in regular mode." - } - - writeToLog V "Input Parameters have been successfully validated." - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function initialSetup() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $osVersion = (Get-WmiObject Win32_OperatingSystem).Caption - # Workaround for WMI timeout or WMI returning no data - If (($null -eq $osVersion) -or ($OSVersion -like "*OS - Alias not found*")) { - $osVersion = (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('ProductName') - } - writeToLog I "Detected Operating System:`r`n`t$OSVersion" - - $osArch = (Get-WmiObject Win32_OperatingSystem).OSArchitecture - writeToLog I "Detected Operating System Aarchitecture: $osArch" - - $psVersion = $PSVersionTable.PSVersion - writeToLog I "Detected PowerShell Version:`r`n`t$psVersion" - - $dotNetVersion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where-Object { $_.PSChildName -Match '^(?!S)\p{L}'} | Select-Object PSChildName, version - - foreach ($i in $dotNetVersion) { - writeToLog I ".NET Version: $($i.PSChildName) = $($i.Version)" - } - - writeToLog I "Setting TLS to version 1.2." - # Set security protocol to TLS 1.2 to avoid TLS errors - [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - - $tlsValue = [Net.ServicePointManager]::SecurityProtocol - - writeToLog V "Confirming TLS Value set:`r`n`t$tlsValue" - - writeToLog I "Checking if device has TLS 1.2 Cipher Suites." - [System.Collections.ArrayList]$enabled = @() - - $cipherslists = @('TLS_DHE_RSA_WITH_AES_128_GCM_SHA256','TLS_DHE_RSA_WITH_AES_256_GCM_SHA384','TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256','TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384') - $ciphersenabledkey = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\' | Select-Object -ExpandProperty Functions - - ForEach ($a in $ciphersenabledkey) { - If ($cipherslists -eq $a){ - $enabled.Add($a) | Out-Null - } - } - - If ($enabled.count -ne 0) { - writeToLog I "Cipher Suite(s) found:" - Foreach ($i in $enabled) { - writeToLog I "Detected Cipher: $i" - } - } Else { - writeToLog W "Device is not fully patched, no secure Cipher Suite(s) were found." - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function getAgentPath() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "GetSupportService_LOGICnow" - $array += "GetSupportService_N-Central" - - ForEach ($key in $array) { - - $regPath = "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BeAnyWhere Support Express\" + $key - - If (Test-Path $regPath) { - writeToLog V "Registry entry exists for $key" - - try { - $Keys = Get-ItemProperty $regPath -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to read Item Properties for registry entry $key, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - ForEach ($Item in $Keys) { - $script:installPath = $Item.Install_Dir - $script:installedVersion = $Item.Version - } - - If (!(Test-Path $installPath)) { - writeToLog W "The Take Control install location is pointing to a path that doesn't exist." - writeToLog I "Will continue with post-cleanup." - - $script:installPath = $logFolder - $script:downloadUninstaller = $true - downloadTCUninstaller - } Else { - writeToLog V "Install Path:`r`n`t$installPath" - writeToLog V "Installed Version:`r`n`t$installedVersion" - - If (($installPath -match '.+?\\$') -eq $false) { - $script:installPath = $script:installPath + "\" - } - - writeToLog V "Take Control Folder located:`r`n`t$installPath" - - $script:uninstallerPath = $installPath + "uninstall.exe" - - If (!(Test-Path $uninstallerPath)) { - writeToLog W "Unable to locate uninstall.exe on the device." - writeToLog W "Uninstaller Path:`r`n`t$uninstallerPath" - writeToLog W "Will download uninstall.exe since it is missing." - $script:downloadUninstaller = $true - downloadTCUninstaller - } Else { - writeToLog V "Confirmed uninstall.exe is present on the device:`r`n`t$uninstallerPath" - } - } - - clearFileLocks - removeTmpUninstaller - performUninstall - - } Else { - writeToLog W "The $key entry does not exist in registry." - } - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function clearFileLocks() { - # Detect and remove _installing/_uninstalling.lock files prior to cleanup - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $script:installLockFile = $installPath + "*installing.lock" - $script:uninstallLockFile = $installPath + "*uninstalling.lock" - - writeToLog I "Testing if _installing.lock is present on the device, using the following path:`r`n`t$installLockFile" - - If (Test-Path $installLockFile) { - writeToLog W "Detected _installing.lock on the device." - $script:installLockCreation = (Get-Item $installLockFile).LastWriteTime.DateTime - writeToLog W "This was created at: $installLockCreation" - writeToLog W "Will now forcibly remove .lock file." - - try { - Remove-Item $installLockFile -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Unable to delete the _installing.lock file, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - If (Test-Path $installLockFile) { - writeToLog W "The _installing.lock file is still present on the device." - } - - } Else { - writeToLog I "The _installing.lock file was not found on the device." - } - - writeToLog V "Testing if _uninstalling.lock is present on the device, using the following path:`r`n`t$uninstallLockFile" - - If (Test-Path $uninstallLockFile) { - writeToLog W "Detected _uninstalling.lock on the device." - $script:uninstallLockCreation = (Get-Item $uninstallLockFile).LastWriteTime.DateTime - writeToLog W "This was created at: $uninstallLockCreation" - writeToLog W "Will now forcibly remove .lock file." - - try { - Remove-Item $uninstallLockFile -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Unable to delete the _installing.lock file, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - If (Test-Path $installLockFile) { - writeToLog W "The _uninstalling.lock file is still present on the device." - } - - } Else { - writeToLog I "The _uninstalling.lock file was not found on the device." - } - - writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) -} - -function removeTmpUninstaller() { - # Detect and remove _iu14D2N.tmp if present - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - # If '_iu14D2N.tmp' is present on the device, then we will try to kill it - try { - $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to detect uninstaller lock process, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - If ($null -ne $uninsLockProcTest) { - writeToLog I "Detected the $uninsLockProcTest process on the device, will terminate." - - try { - Stop-Process $uninsLockProcTest -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to terminate the uninstaller lock process, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" - - If (Test-Path $uninsLockPath) { - writeToLog W "Detected $uninsLockPath on the device, removing." - - try { - Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove the uninstaller lock file, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - writeToLog V "Uninstall lock not detected on the device, nor found as a running process/existing file." - - writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) -} - -function downloadTCUninstaller() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - # Download the Site Installation Package from new location - $uninsUrl = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Take%20Control/uninstall.exe" - - $script:downloadLocation = $installPath - $script:localFile = "uninstaller.exe" - - $source = $uninsUrl - $dest = $downloadLocation+$localFile - - writeToLog I "Downloading the Take Control uninstaller." - writeToLog V "This is being directed to the following location:`r`n`t$dest" - - $wc = New-Object System.Net.WebClient - - try { - $wc.DownloadFile($source, $dest) - } - catch [System.Net.WebException] { - writeToLog F "The uninstaller failed to download, due to:" - - If ($_.Exception.InnerException) { - $innerException = $_.Exception.InnerException.Message - writeToLog F $innerException - writeToLog F "Failing script." - Exit 1001 - } Else { - $exception = $_.Exception.Message - writeToLog F $exception - writeToLog F "Failing script." - Exit 1001 - } - } - - writeToLog I "The Take Control uninstaller has downloaded successfully." - - $script:uninstallerPath = $dest - - writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) -} - -function performUninstall() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $switches = "/S" - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $uninstallerPath - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = $switches - - writeToLog V "Using switch: $switches" - writeToLog V "Running the following uninstaller:`r`n`t$uninstallerPath" - - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - Start-Sleep 10 - $script:exitCode = $p.ExitCode - - If ($exitcode -eq 0) { - writeToLog I "Successfully returned exit code 0 from uninstall action." - } Else { - $stdout = $p.StandardOutput.ReadToEnd() - $stderr = $p.StandardError.ReadToEnd() - - writeToLog F "Ran into a failure during uninstall, exit code returned: $exitcode" - writeToLog F "Standard Output:`r`n`t$stdout" - writeToLog F "Standard Error:`r`n`t$stderr" - writeToLog F "Failing script." - Exit 1001 - } - - $timeoutInSecs = 600 - writeToLog V "Timeout set to $timeoutInSecs seconds." - - writeToLog V "Starting stopwatch." - $sw = [Diagnostics.Stopwatch]::StartNew() - - while (($sw.Elapsed.TotalSeconds -lt $timeoutInSecs) -and (Test-Path $uninstallLockFile)) { - $result = Test-Path $uninstallLockFile - writeToLog V "Current uninstall timespan: $($sw.Elapsed.TotalSeconds) seconds." - Start-Sleep 10 - writeToLog V "The _uninstalling.lock file is still present on the device (File Exists = $result)." - } - writeToLog V "Lock file no longer exists." - $sw.Stop() - writeToLog V "Uninstall action took $($sw.Elapsed.Seconds) seconds to complete." - - writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) -} - -function removeMSPAProcesses() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "BASupSrvc" - $array += "BASupSrvcCnfg" - $array += "BASupSrvcUpdater" - $array += "BASupTSHelper" - $array += "BASupClpHlp" - - ForEach ($process in $array) { - If (Get-Process $process -ErrorAction SilentlyContinue) { - writeToLog I "Detected the $process process on the device, will now terminate." - - try { - Stop-Process -Name $process -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "The process could not be terminated, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - } Else { - writeToLog I "The $process process does not exist on the device." - } - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function removeMSPAServices() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "BASupportExpressStandaloneService_LOGICnow" - $array += "BASupportExpressSrvcUpdater_LOGICnow" - $array += "BASupportExpressStandaloneService_N_Central" - $array += "BASupportExpressSrvcUpdater_N_Central" - - ForEach ($serviceName in $array) { - If (Get-Service $serviceName -ErrorAction SilentlyContinue) { - writeToLog I "Detected the $serviceName service on the device, will now remove service." - - try { - Stop-Service -Name $serviceName -ErrorAction Stop - sc.exe delete $serviceName -ErrorAction Stop - } catch { - writeToLog I "The service cannot be removed automatically. Please remove manually." - $removalError = $error[0] - writeToLog I "Exception from removal attempt is: $removalError" - } - writeToLog I "$serviceName service is now removed." - } Else { - writeToLog I "$serviceName service does not exist on the device." - } - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function removeMSPAFoldersAndKeys() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $array = @() - $array += "C:\Program Files (x86)\Take Control Agent" - $array += "C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central" - $array += "C:\Program Files (x86)\Take Control Agent_<#INSTANCE_NAME#>" - $array += "C:\Program Files\Take Control Agent" - $array += "C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central" - $array += "C:\ProgramData\GetSupportService_LOGICnow" - $array += "C:\ProgramData\GetSupportService_N-Central" - $array += "C:\ProgramData\GetSupportService_LOGICNow_<#INSTANCE_NAME#>" - $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BACE_LOGICnow" - $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BACE_N-Central" - $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BeAnyWhere Support Express\GetSupportService_LOGICnow" - $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BeAnyWhere Support Express\GetSupportService_N-Central" - - ForEach ($item in $Array) { - If (Test-Path $item) { - writeToLog V "Detected $item, foribly removing item." - - try { - Remove-Item $item -Recurse -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "The item $item exists but cannot be removed, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } Else { - writeToLog V "The $item doesn't exist, skipping." - } - } - - writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) -} - -function postRuntime() { - try { - Remove-Item $scriptLocation -Force -ErrorAction SilentlyContinue - } - catch { - } - - try { - Remove-Item $xmlLocation -Force -ErrorAction SilentlyContinue - } - catch { - } -} - -function writeToLog($state, $message) { - - $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) - - switch -regex -Wildcard ($state) { - "I" { - $state = "INFO" - $colour = "Cyan" - } - "E" { - $state = "ERROR" - $colour = "Red" - } - "W" { - $state = "WARNING" - $colour = "Yellow" - } - "F" { - $state = "FAILURE" - $colour = "Red" - } - "C" { - $state = "COMPLETE" - $colour = "Green" - } - "V" { - If ($verboseMode -eq $true) { - $state = "VERBOSE" - $colour = "Magenta" - } Else { - return - } - } - "" { - $state = "INFO" - } - Default { - $state = "INFO" - } - } - - Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour - Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue -} - -function main() { - setupLogging - validateUserInput - getAgentPath - removeMSPAProcesses - removeMSPAServices - removeMSPAFoldersAndKeys - postRuntime -} -main +#!ignore "3b422ca6988d468f60e12d30418eaaf8" +# '================================================================================================================================================================== +# 'Disclaimer +# 'The sample scripts are not supported under any N-able support program or service. +# 'The sample scripts are provided AS IS without warranty of any kind. +# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. +# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. +# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever +# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) +# 'arising out of the use of or inability to use the sample scripts or documentation. +# '================================================================================================================================================================== + +Param ( + [string]$verbose = "Y" +) + +function setupLogging() { + $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\Feature Cleanup Utility\debug.log" + + $script:logFolder = Split-Path $logFilePath + $script:logFile = Split-Path $logFilePath -Leaf + + If (($logFolder -match '.+?\\$') -eq $false) { + $script:logFolder = $logFolder + "\" + } + + $script:scriptLocation = $logFolder + "TakeControlCleanup.ps1" + + [float]$script:currentVersion = 1.02 + writeToLog I "Started processing the Take Control Cleanup script." + writeToLog I "Running script version: $currentVersion" +} + +function validateUserInput() { + # Handles input params and determines if log output is verbose + If ($verbose.ToLower() -eq "y") { + $script:verboseMode = $true + writeToLog V "You have defined to have the script output the verbose log entries." + } Else { + $script:verboseMode = $false + writeToLog I "Will output logs in regular mode." + } + + writeToLog V "Input Parameters have been successfully validated." + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function initialSetup() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $osVersion = (Get-WmiObject Win32_OperatingSystem).Caption + # Workaround for WMI timeout or WMI returning no data + If (($null -eq $osVersion) -or ($OSVersion -like "*OS - Alias not found*")) { + $osVersion = (Get-Item "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue('ProductName') + } + writeToLog I "Detected Operating System:`r`n`t$OSVersion" + + $osArch = (Get-WmiObject Win32_OperatingSystem).OSArchitecture + writeToLog I "Detected Operating System Aarchitecture: $osArch" + + $psVersion = $PSVersionTable.PSVersion + writeToLog I "Detected PowerShell Version:`r`n`t$psVersion" + + $dotNetVersion = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where-Object { $_.PSChildName -Match '^(?!S)\p{L}'} | Select-Object PSChildName, version + + foreach ($i in $dotNetVersion) { + writeToLog I ".NET Version: $($i.PSChildName) = $($i.Version)" + } + + writeToLog I "Setting TLS to version 1.2." + # Set security protocol to TLS 1.2 to avoid TLS errors + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + + $tlsValue = [Net.ServicePointManager]::SecurityProtocol + + writeToLog V "Confirming TLS Value set:`r`n`t$tlsValue" + + writeToLog I "Checking if device has TLS 1.2 Cipher Suites." + [System.Collections.ArrayList]$enabled = @() + + $cipherslists = @('TLS_DHE_RSA_WITH_AES_128_GCM_SHA256','TLS_DHE_RSA_WITH_AES_256_GCM_SHA384','TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256','TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384') + $ciphersenabledkey = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\' | Select-Object -ExpandProperty Functions + + ForEach ($a in $ciphersenabledkey) { + If ($cipherslists -eq $a){ + $enabled.Add($a) | Out-Null + } + } + + If ($enabled.count -ne 0) { + writeToLog I "Cipher Suite(s) found:" + Foreach ($i in $enabled) { + writeToLog I "Detected Cipher: $i" + } + } Else { + writeToLog W "Device is not fully patched, no secure Cipher Suite(s) were found." + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function getAgentPath() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "GetSupportService_LOGICnow" + $array += "GetSupportService_N-Central" + + ForEach ($key in $array) { + + $regPath = "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BeAnyWhere Support Express\" + $key + + If (Test-Path $regPath) { + writeToLog V "Registry entry exists for $key" + + try { + $Keys = Get-ItemProperty $regPath -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to read Item Properties for registry entry $key, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + ForEach ($Item in $Keys) { + $script:installPath = $Item.Install_Dir + $script:installedVersion = $Item.Version + } + + If (!(Test-Path $installPath)) { + writeToLog W "The Take Control install location is pointing to a path that doesn't exist." + writeToLog I "Will continue with post-cleanup." + + $script:installPath = $logFolder + $script:downloadUninstaller = $true + downloadTCUninstaller + } Else { + writeToLog V "Install Path:`r`n`t$installPath" + writeToLog V "Installed Version:`r`n`t$installedVersion" + + If (($installPath -match '.+?\\$') -eq $false) { + $script:installPath = $script:installPath + "\" + } + + writeToLog V "Take Control Folder located:`r`n`t$installPath" + + $script:uninstallerPath = $installPath + "uninstall.exe" + + If (!(Test-Path $uninstallerPath)) { + writeToLog W "Unable to locate uninstall.exe on the device." + writeToLog W "Uninstaller Path:`r`n`t$uninstallerPath" + writeToLog W "Will download uninstall.exe since it is missing." + $script:downloadUninstaller = $true + downloadTCUninstaller + } Else { + writeToLog V "Confirmed uninstall.exe is present on the device:`r`n`t$uninstallerPath" + } + } + + clearFileLocks + removeTmpUninstaller + performUninstall + + } Else { + writeToLog W "The $key entry does not exist in registry." + } + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function clearFileLocks() { + # Detect and remove _installing/_uninstalling.lock files prior to cleanup + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $script:installLockFile = $installPath + "*installing.lock" + $script:uninstallLockFile = $installPath + "*uninstalling.lock" + + writeToLog I "Testing if _installing.lock is present on the device, using the following path:`r`n`t$installLockFile" + + If (Test-Path $installLockFile) { + writeToLog W "Detected _installing.lock on the device." + $script:installLockCreation = (Get-Item $installLockFile).LastWriteTime.DateTime + writeToLog W "This was created at: $installLockCreation" + writeToLog W "Will now forcibly remove .lock file." + + try { + Remove-Item $installLockFile -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Unable to delete the _installing.lock file, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + If (Test-Path $installLockFile) { + writeToLog W "The _installing.lock file is still present on the device." + } + + } Else { + writeToLog I "The _installing.lock file was not found on the device." + } + + writeToLog V "Testing if _uninstalling.lock is present on the device, using the following path:`r`n`t$uninstallLockFile" + + If (Test-Path $uninstallLockFile) { + writeToLog W "Detected _uninstalling.lock on the device." + $script:uninstallLockCreation = (Get-Item $uninstallLockFile).LastWriteTime.DateTime + writeToLog W "This was created at: $uninstallLockCreation" + writeToLog W "Will now forcibly remove .lock file." + + try { + Remove-Item $uninstallLockFile -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Unable to delete the _installing.lock file, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + If (Test-Path $installLockFile) { + writeToLog W "The _uninstalling.lock file is still present on the device." + } + + } Else { + writeToLog I "The _uninstalling.lock file was not found on the device." + } + + writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) +} + +function removeTmpUninstaller() { + # Detect and remove _iu14D2N.tmp if present + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + # If '_iu14D2N.tmp' is present on the device, then we will try to kill it + try { + $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to detect uninstaller lock process, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + If ($null -ne $uninsLockProcTest) { + writeToLog I "Detected the $uninsLockProcTest process on the device, will terminate." + + try { + Stop-Process $uninsLockProcTest -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to terminate the uninstaller lock process, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" + + If (Test-Path $uninsLockPath) { + writeToLog W "Detected $uninsLockPath on the device, removing." + + try { + Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove the uninstaller lock file, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + writeToLog V "Uninstall lock not detected on the device, nor found as a running process/existing file." + + writeToLog V ("### Completed running {0} function. ###`r`n" -f $MyInvocation.MyCommand) +} + +function downloadTCUninstaller() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + # Download the Site Installation Package from new location + $uninsUrl = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Take%20Control/uninstall.exe" + + $script:downloadLocation = $installPath + $script:localFile = "uninstaller.exe" + + $source = $uninsUrl + $dest = $downloadLocation+$localFile + + writeToLog I "Downloading the Take Control uninstaller." + writeToLog V "This is being directed to the following location:`r`n`t$dest" + + $wc = New-Object System.Net.WebClient + + try { + $wc.DownloadFile($source, $dest) + } + catch [System.Net.WebException] { + writeToLog F "The uninstaller failed to download, due to:" + + If ($_.Exception.InnerException) { + $innerException = $_.Exception.InnerException.Message + writeToLog F $innerException + writeToLog F "Failing script." + Exit 1001 + } Else { + $exception = $_.Exception.Message + writeToLog F $exception + writeToLog F "Failing script." + Exit 1001 + } + } + + writeToLog I "The Take Control uninstaller has downloaded successfully." + + $script:uninstallerPath = $dest + + writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) +} + +function performUninstall() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $switches = "/S" + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $uninstallerPath + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = $switches + + writeToLog V "Using switch: $switches" + writeToLog V "Running the following uninstaller:`r`n`t$uninstallerPath" + + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + Start-Sleep 10 + $script:exitCode = $p.ExitCode + + If ($exitcode -eq 0) { + writeToLog I "Successfully returned exit code 0 from uninstall action." + } Else { + $stdout = $p.StandardOutput.ReadToEnd() + $stderr = $p.StandardError.ReadToEnd() + + writeToLog F "Ran into a failure during uninstall, exit code returned: $exitcode" + writeToLog F "Standard Output:`r`n`t$stdout" + writeToLog F "Standard Error:`r`n`t$stderr" + writeToLog F "Failing script." + Exit 1001 + } + + $timeoutInSecs = 600 + writeToLog V "Timeout set to $timeoutInSecs seconds." + + writeToLog V "Starting stopwatch." + $sw = [Diagnostics.Stopwatch]::StartNew() + + while (($sw.Elapsed.TotalSeconds -lt $timeoutInSecs) -and (Test-Path $uninstallLockFile)) { + $result = Test-Path $uninstallLockFile + writeToLog V "Current uninstall timespan: $($sw.Elapsed.TotalSeconds) seconds." + Start-Sleep 10 + writeToLog V "The _uninstalling.lock file is still present on the device (File Exists = $result)." + } + writeToLog V "Lock file no longer exists." + $sw.Stop() + writeToLog V "Uninstall action took $($sw.Elapsed.Seconds) seconds to complete." + + writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) +} + +function removeMSPAProcesses() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "BASupSrvc" + $array += "BASupSrvcCnfg" + $array += "BASupSrvcUpdater" + $array += "BASupTSHelper" + $array += "BASupClpHlp" + + ForEach ($process in $array) { + If (Get-Process $process -ErrorAction SilentlyContinue) { + writeToLog I "Detected the $process process on the device, will now terminate." + + try { + Stop-Process -Name $process -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "The process could not be terminated, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + } Else { + writeToLog I "The $process process does not exist on the device." + } + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function removeMSPAServices() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "BASupportExpressStandaloneService_LOGICnow" + $array += "BASupportExpressSrvcUpdater_LOGICnow" + $array += "BASupportExpressStandaloneService_N_Central" + $array += "BASupportExpressSrvcUpdater_N_Central" + + ForEach ($serviceName in $array) { + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + writeToLog I "Detected the $serviceName service on the device, will now remove service." + + try { + Stop-Service -Name $serviceName -ErrorAction Stop + sc.exe delete $serviceName -ErrorAction Stop + } catch { + writeToLog I "The service cannot be removed automatically. Please remove manually." + $removalError = $error[0] + writeToLog I "Exception from removal attempt is: $removalError" + } + writeToLog I "$serviceName service is now removed." + } Else { + writeToLog I "$serviceName service does not exist on the device." + } + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function removeMSPAFoldersAndKeys() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $array = @() + $array += "C:\Program Files (x86)\Take Control Agent" + $array += "C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central" + $array += "C:\Program Files (x86)\Take Control Agent_<#INSTANCE_NAME#>" + $array += "C:\Program Files\Take Control Agent" + $array += "C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central" + $array += "C:\ProgramData\GetSupportService_LOGICnow" + $array += "C:\ProgramData\GetSupportService_N-Central" + $array += "C:\ProgramData\GetSupportService_LOGICNow_<#INSTANCE_NAME#>" + $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BACE_LOGICnow" + $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BACE_N-Central" + $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BeAnyWhere Support Express\GetSupportService_LOGICnow" + $array += "HKLM:\SOFTWARE\WOW6432Node\Multiplicar Negocios\BeAnyWhere Support Express\GetSupportService_N-Central" + + ForEach ($item in $Array) { + If (Test-Path $item) { + writeToLog V "Detected $item, foribly removing item." + + try { + Remove-Item $item -Recurse -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "The item $item exists but cannot be removed, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } Else { + writeToLog V "The $item doesn't exist, skipping." + } + } + + writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) +} + +function postRuntime() { + try { + Remove-Item $scriptLocation -Force -ErrorAction SilentlyContinue + } + catch { + } + + try { + Remove-Item $xmlLocation -Force -ErrorAction SilentlyContinue + } + catch { + } +} + +function writeToLog($state, $message) { + + $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) + + switch -regex -Wildcard ($state) { + "I" { + $state = "INFO" + $colour = "Cyan" + } + "E" { + $state = "ERROR" + $colour = "Red" + } + "W" { + $state = "WARNING" + $colour = "Yellow" + } + "F" { + $state = "FAILURE" + $colour = "Red" + } + "C" { + $state = "COMPLETE" + $colour = "Green" + } + "V" { + If ($verboseMode -eq $true) { + $state = "VERBOSE" + $colour = "Magenta" + } Else { + return + } + } + "" { + $state = "INFO" + } + Default { + $state = "INFO" + } + } + + Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour + Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue +} + +function main() { + setupLogging + validateUserInput + getAgentPath + removeMSPAProcesses + removeMSPAServices + removeMSPAFoldersAndKeys + postRuntime +} +main \ No newline at end of file diff --git a/src/external/scripts/N-Sight/WindowsAgentCleanup.ps1 b/src/external/scripts/N-Sight/WindowsAgentCleanup.ps1 new file mode 100644 index 00000000..8c267941 --- /dev/null +++ b/src/external/scripts/N-Sight/WindowsAgentCleanup.ps1 @@ -0,0 +1,842 @@ +#!ignore "a659a16e1fec9fdf1933507d4019dd6d" +# '================================================================================================================================================================== +# 'Disclaimer +# 'The sample scripts are not supported under any N-able support program or service. +# 'The sample scripts are provided AS IS without warranty of any kind. +# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. +# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. +# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever +# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) +# 'arising out of the use of or inability to use the sample scripts or documentation. +# '================================================================================================================================================================== + +Param ( + [string]$verbose = "Y" +) + +function setupLogging() { + $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\Windows Agent Cleanup\debug.log" + + $script:logFolder = Split-Path $logFilePath + $script:logFile = Split-Path $logFilePath -Leaf + + $logFolderExists = Test-Path $logFolder + $logFileExists = Test-Path $logFilePath + + If ($logFolderExists -eq $false) { + New-Item -ItemType "directory" -Path $logFolder | Out-Null + } + + If ($logFileExists -eq $true) { + Remove-Item $logFilePath -ErrorAction SilentlyContinue + Start-Sleep 2 + New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null + } Else { + New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null + } + + If (($logFolder -match '.+?\\$') -eq $false) { + $script:logFolder = $logFolder + "\" + } + + writeToLog I "Running script version: 1.08." +} + +function validateUserInput() { +# Ensures the provided input from user is valid + If ($verbose.ToLower() -eq "y") { + $script:verboseMode = $true + writeToLog V "You have defined to have the script output the verbose log entries." + } Else { + $script:verboseMode = $false + writeToLog I "Will output logs in regular mode." + } + + writeToLog V "Input Parameters have been successfully validated." + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function getAgentPath() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog W "Will continue with validating agent path." + } + + $Items = $Keys | Foreach-Object { + Get-ItemProperty $_.PsPath + } + + ForEach ($Item in $Items) { + If ($Item.DisplayName -like "Windows Agent") { + $script:localFolder = $Item.installLocation + $script:registryPath = $Item.PsPath + $registryName = $Item.PSChildName + $script:uninstallString = $Item.UninstallString + $registryDisplayName = $Item.DisplayName + $registryVersion = $Item.DisplayVersion + $registryInstallDate = $Item.InstallDate + break + } + } + + try { + $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog W "Will continue with validating agent path." + } + + $Items = $Keys | Foreach-Object { + Get-ItemProperty $_.PsPath + } + + ForEach ($Item in $Items) { + If ($Item.DisplayName -like "Windows Agent") { + $script:localFolder = $Item.installLocation + $script:registryPath = $Item.PsPath + $registryName = $Item.PSChildName + $script:uninstallString = $Item.UninstallString + $registryDisplayName = $Item.DisplayName + $registryVersion = $Item.DisplayVersion + $registryInstallDate = $Item.InstallDate + break + } + } + + If (!$script:localFolder) { + writeToLog W "No Windows Agent located." + writeToLog W "No uninstall can be performed but will carry on with the cleanup." + $script:agentPresent = $false + $script:localFolder = "C:\Program Files (x86)\N-able Technologies\Windows Agent\" + } Else { + $script:agentPresent = $true + + If (($script:localFolder -match '.+?\\$') -eq $false) { + $script:localFolder = $script:localFolder + "\" + } + + writeToLog I "Agent install location found:`r`n`t$localFolder" + writeToLog V "Registry location: `r`n`t$registryPath`r`n`t$registryName" + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function stopServices() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "Windows Agent Service" + $array += "Windows Agent Maintenance Service" + + foreach ($serviceName in $array) { + + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + writeToLog I "Detected the $serviceName service on the device, will now stop the service." + + try { + $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + writeToLog I "$serviceName service is now stopped." + + } Else { + writeToLog W "$serviceName service was not found." + } + + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function runUninstaller() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $uninsString = ($script:uninstallString -split 'MsiExec.exe ')[1] + + If ($uninsString.length -gt 0) { + $argumentList = $uninsString + " /qn /norestart" + writeToLog I "Starting MSI Uninstaller." + writeToLog V "Argument list confirming msi uninstall string:`r`n`t$argumentList" + + $uninstallExitCode = (Start-Process -FilePath msiexec.exe -ArgumentList $argumentList -Wait -Passthru).ExitCode + + writeToLog I "Uninstall process has now been completed." + + If ($uninstallExitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $uninstallExitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $uninstallExitCode" + } + } Else { + writeToLog V "Uninstall String length is: $($uninsString.length)" + writeToLog V "Uninstall cannot occur, will contiunue with cleanup." + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function determinePMEVersion() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $pmeVersionRaw = Get-Process -Name *PME.Agent -FileVersionInfo | Select-Object ProductName,ProductVersion,FileVersion | Sort-Object -unique -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog F "Error occurred locating an applicable PME Agent process, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog F "Failing script." + Exit 1001 + } + + $pmeProductName = $pmeVersionRaw.ProductName + $pmeProductVersion = $pmeVersionRaw.ProductVersion + + writeToLog V "Detected PME Version: $pmeProductVersion" + + If ($pmeProductName -eq "SolarWinds.MSP.PME.Agent") { + writeToLog I "Detected installed PME Version is: $pmeProductVersion" + $script:legacyPME = $true + } ElseIf ($pmeProductName -eq "PME.Agent") { + writeToLog I "Detected installed PME Version is: $pmeProductVersion" + $script:legacyPME = $false + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function runPMEV1Uninstaller() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $pmeFolder = "C:\Program Files (x86)\SolarWinds MSP\" + + $hash = @{ + "$($pmeFolder)PME\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; + "$($pmeFolder)CacheService\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; + "$($pmeFolder)RpcServer\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" + } + + foreach ($key in $hash.Keys) { + if (Test-Path $key) { + $datItem = $key + $datItem = $datItem -replace "exe","dat" + + if (!(Test-Path $datItem)) { + writeToLog W "Dat file not found. Will attempt downloading." + downloadFileToLocation $hash[$key] $datItem + + if (!(Test-Path $datItem)) { + writeToLog F "Unable to download dat file for uninstaller to run." + writeToLog F "PME must be removed manually. Failing script." + exit 1001 + } + } + + writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." + + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $key + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = "/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART" + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + $script:exitCode = $p.ExitCode + + If ($exitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" + } + + Start-Sleep -s 5 + + } Else { + writeToLog W "$key Uninstaller doesn't exist on the device." + } + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function runPMEV2Uninstaller() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $pmeFolder = "C:\Program Files (x86)\MspPlatform\" + + $hash = @{ + "$($pmeFolder)PME\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat"; + "$($pmeFolder)FileCacheServiceAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat"; + "$($pmeFolder)RequestHandlerAgent\unins000.exe" = "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat" + } + + foreach ($key in $hash.Keys) { + if (Test-Path $key) { + $datItem = $key + $datItem = $datItem -replace "exe","dat" + + if (!(Test-Path $datItem)) { + writeToLog W "Dat file not found. Will attempt downloading." + downloadFileToLocation $hash[$key] $datItem + + if (!(Test-Path $datItem)) { + writeToLog F "Unable to download dat file for uninstaller to run." + writeToLog F "PME must be removed manually. Failing script." + exit 1001 + } + } + + writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." + + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $key + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = "/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART" + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + $script:exitCode = $p.ExitCode + + If ($exitCode -ne 0) { + writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" + } Else { + writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" + } + + Start-Sleep -s 5 + + } Else { + writeToLog W "$key Uninstaller doesn't exist on the device." + } + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function removeProcesses() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $script:pmeProcess = Get-Process -processname "*PME*" -ErrorAction Stop + $script:rpcProcess = Get-Process -processname "*RPC*" -ErrorAction Stop + $script:cacheServiceProcess = Get-Process -processname "*Cache*" -ErrorAction Stop + } catch { + writeToLog E "Error detecting process:" + writeToLog E $_ + } + + If ($null -ne $pmeProcess) { + writeToLog I "Detected $pmeProcess on the device, removing." + try { + Stop-Process $pmeProcess -Force -ErrorAction Stop + } catch { + writeToLog E "Error stopping PME process:" + writeToLog E $_ + } + } Else { + writeToLog I "Did not detect the PME process on the device." + } + + If ($null -ne $rpcProcess) { + writeToLog I "Detected $rpcProcess on the device, removing." + try { + Stop-Process $rpcProcess -Force -ErrorAction Stop + } catch { + writeToLog E "Error stopping RPC process:" + writeToLog E $_ + } + } Else { + writeToLog I "Did not detect PME's RPC process on the device." + } + If ($null -ne $cacheServiceProcess) { + writeToLog I "Detected $cacheServiceProcess on the device, removing." + try { + Stop-Process $cacheServiceProcess -Force -ErrorAction Stop + } catch { + writeToLog E "Error stopping Cache Service process:" + writeToLog E $_ + } + } Else { + writeToLog I "Did not detect PME's Cache Service process on the device." + } + + # If '_iu14D2N.tmp' is present on the device, then we will try to kill it + try { + $uninsLockProcTest = Get-Process -ProcessName "_iu*" -ErrorAction Stop + } catch { + writeToLog E "Error detecting uninstaller lock file, due to:" + writeToLog E $_ + } + + If ($null -ne $uninsLockProcTest) { + writeToLog I "Detected $uninsLockProcTest on the device, removing." + try { + Stop-Process $uninsLockProcTest -Force -ErrorAction Stop + } catch { + writeToLog E "Error stopping uninstall lock process:" + writeToLog E $_ + } + } + + $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" + $uninsLockPathTest = Test-Path $uninsLockPath + + If ($uninsLockPathTest -eq $true) { + writeToLog I "Detected $uninsLockPath on the device, removing." + Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function downloadFileToLocation ($URL, $Location) { + + $wc = New-Object System.Net.WebClient + + try { + $wc.DownloadFile($URL, $Location) + } catch { + writeToLog E "Exception when downloading file $Location from source $URL." + } +} + +function removePMEServices() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "PME.Agent.PmeService" + $array += "SolarWinds.MSP.RpcServerService" + $array += "SolarWinds.MSP.CacheService" + + foreach ($serviceName in $array) { + + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + writeToLog I "Detected the $serviceName service on the device, will now remove service." + + try { + $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop + $script:deleteService = sc.exe delete $serviceName -ErrorAction Stop + } catch { + writeToLog I "The service cannot be removed automatically. Please remove manually." + $removalError = $error[0] + writeToLog I "Exception from removal attempt is: $removalError" + } + writeToLog I "$serviceName service is now removed." + } Else { + writeToLog W "$serviceName service not found." + } + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function removePMEFoldersAndKeys() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "C:\ProgramData\SolarWinds MSP\PME" + $array += "C:\ProgramData\MspPlatform\PME" + $array += "C:\ProgramData\MspPlatform\PME.Agent.PmeService" + + $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.CacheService" + $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.CacheService" + $array += "C:\ProgramData\MspPlatform\FileCacheServiceAgent" + + $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.Diagnostics" + $array += "C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.RpcServerService" + $array += "C:\ProgramData\MspPlatform\SolarWinds.MSP.RpcServerService" + $array += "C:\ProgramData\MspPlatform\RequestHandlerAgent" + + $array += "C:\Program Files (x86)\SolarWinds MSP\CacheService\" + $array += "C:\Program Files (x86)\MspPlatform\FileCacheServiceAgent\" + $array += "C:\Program Files (x86)\SolarWinds MSP\PME\" + $array += "C:\Program Files (x86)\MspPlatform\PME\" + $array += "C:\Program Files (x86)\SolarWinds MSP\RpcServer\" + $array += "C:\Program Files (x86)\MspPlatform\RequestHandlerAgent\" + + If ((Test-Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall") -eq $true) { + $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" + + foreach ($entry in $recurse) { + foreach ($key in Get-ItemProperty -path "Registry::$entry") { + if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { + $temp = $entry.name -replace "HKEY_LOCAL_MACHINE", "HKLM:" + $array += $temp + } + } + } + } + + $recurse = Get-ChildItem -path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" + + foreach ($entry in $recurse) { + foreach ($key in Get-ItemProperty -path "Registry::$entry") { + if($key.DisplayName -eq "SolarWinds MSP RPC Server" -or $key.DisplayName -eq "Request Handler Agent" -or $key.DisplayName -eq "File Cache Service Agent" -or $key.DisplayName -eq "Patch Management Service Controller" -or $key.DisplayName -eq "SolarWinds MSP Patch Management Engine" -or $key.DisplayName -eq "SolarWinds MSP Cache Service") { + $temp = $entry.name -replace "HKEY_LOCAL_MACHINE", "HKLM:" + $array += $temp + } + } + } + + foreach ($FolderLocation in $Array) { + if (Test-Path $FolderLocation) { + writeToLog I "$FolderLocation exists. Removing item..." + + try { + remove-item $folderLocation -recurse -force + } catch { + writeToLog I "The item $FolderLocation exists but cannot be removed automatically. Please remove manually." + $removalError = $error[0] + writeToLog E "Exception from removal attempt is: $removalError" + } + } else { + writeToLog W "$FolderLocation doesn't exist - moving on..." + } + } + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function killAgentProcesses() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $script:runningProcesses = Get-Process * -ErrorAction Stop | Where-Object {$_.Path -like "C:\Program Files (x86)\N-able Technologies\Windows Agent\*"} | Select-Object Name,Path + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to detect running processes, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + If ($null -ne $runningProcesses) { + writeToLog W "Found following process(es):`r`n`t $($runningProcesses.Name)" + + foreach ($process in $runningProcesses) { + try { + $process | Stop-Process -Force -ErrorAction Stop + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to stop the process: $process, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + foreach ($lockFile in Get-ChildItem -Path "C:\Program Files (x86)\N-able Technologies\Windows Agent\*" -Include * -Recurse) { + foreach ($process in $runningProcesses) { + $process.Modules | Where-Object {$_.FileName -eq $lockFile} | Stop-Process -Force -ErrorAction SilentlyContinue + } + } + } Else { + writeToLog V "No processes are running that are tied to the Windows Agent." + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function cleanupAgent() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $script:agentPathTester = Test-Path $localFolder -ErrorAction SilentlyContinue + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to locate the Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + If ($agentPathTester -eq $false) { + writeToLog I "Windows Agent installation folder ($localFolder) is not present." + } Else { + writeToLog I "Windows Agent folder is present ($localFolder), will attempt to remove." + + try { + Remove-Item $localFolder -Recurse -Force -ErrorAction Stop + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + $script:agentFolder = Split-Path $localFolder + + $agentFolderExists = Test-Path $agentFolder + + If (($agentFolder -match '.+?\\$') -eq $false) { + $script:agentFolder = $agentFolder + "\" + } + + If ($agentFolderExists -eq $false) { + writeToLog I "Windows Agent folder ($agentFolder) is not present." + } Else { + writeToLog I "Windows Agent folder is present ($agentFolder), will attempt to remove." + + try { + Remove-Item $agentFolder -Recurse -Force -ErrorAction Stop + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + $progDataFolder = "C:\ProgramData\N-Able Technologies\Windows Agent\" + + $progDataPpathTester = Test-Path $progDataFolder + + If ($progDataPpathTester -eq $false) { + writeToLog I "Program Data folder ($progDataFolder) is not present." + } Else { + try { + Remove-Item $progDataFolder -Recurse -Force -ErrorAction Stop + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove the ProgramData Windows Agent folder, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function verifyAssetTag() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + writeToLog I "Checking if Asset tags exist." + + $class='NCentralAssetTag' + $namespace='root\cimv2\NCentralAsset' + $wmiAssetTag = Get-WmiObject -Namespace $namespace -Class $class + + $wmiAssetTagLength = ($wmiAssetTag.UUID).length + + If ($wmiAssetTagLength -eq 0) { + writeToLog I "WMI Asset Tag does not exist." + } Else { + writeToLog I "WMI Asset Tag present on device." + writeToLog I "WMI Asset Tag entry: $($wmiAssetTag.UUID)" + } + + $path='HKLM:\SOFTWARE\N-able Technologies\NcentralAsset' + $name='NcentralAssetTag' + + try { + $regAssetTag = Get-ItemProperty -Path $path -Name $name -ErrorAction SilentlyContinue + } + catch { + } + + $regAssetTagLength = ($regAssetTag.NcentralAssetTag).length + + If ($regAssetTagLength -eq 0) { + writeToLog I "Registry Asset Tag does not exist." + } Else { + writeToLog I "Registry Asset Tag present on device." + writeToLog I "Registry Asset Tag entry: $($regAssetTag.NcentralAssetTag)" + } + + $xmlAssetTag = "C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml" + + If (Test-Path $xmlAssetTag) { + writeToLog I "The NcentralAsset.xml exists on the device." + } Else { + writeToLog I "The NcentralAsset.xml does not on the device." + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function cleanupAssetTag() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + writeToLog I "Cleaning up Windows Agent Asset Tags." + + $class='NCentralAssetTag' + $namespace='root\cimv2\NCentralAsset' + Get-WmiObject -Namespace $namespace -Class $class | Remove-WmiObject + + $path='HKLM:\SOFTWARE\N-able Technologies\NcentralAsset' + $name='NcentralAssetTag' + + try { + Remove-ItemProperty -Path $path -Name $name -Force -ErrorAction SilentlyContinue + } + catch { + } + + If (Test-Path -LiteralPath "C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml") { + try { + Remove-Item -path "C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml" -Force -ErrorAction SilentlyContinue + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove NcentralAsset.xml, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + writeToLog I "Successfully removed Asset Tags." + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function cleanupTakeControl() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + writeToLog I "Uninstalling Take Control silently." + + If (Test-Path -LiteralPath "C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe") { + try { + Start-Process -NoNewWindow -FilePath "C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe" -ArgumentList " /S" + } + catch { + writeToLog W "Unable to find 64-bit installation, moving to 32-bit removal." + } + writeToLog I "Successfully Removed Take Control 64 bit." + } ElseIf (Test-Path -LiteralPath "C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe") { + Start-Process -NoNewWindow -FilePath "C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe" -ArgumentList " /S" + writeToLog I "Successfully Removed Take Control 32 bit." +} + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function cleanupConfigBackup() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + writeToLog I "Removing ConnectionString_Agent.xml." + + $connectionStringXmlLocation = "C:\Program Files (x86)\N-able Technologies\Windows Agent\config\ConnectionString_Agent.xml" + + If (Test-Path $connectionStringXmlLocation) { + try { + Remove-Item -path $connectionStringXmlLocation -force -ErrorAction Stop + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to remove NcentralAsset.xml, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } Else { + writeToLog I "File does not exist." + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function writeToLog($state, $message) { + + $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) + + switch -regex -Wildcard ($state) { + "I" { + $state = "INFO" + $colour = "Cyan" + } + "E" { + $state = "ERROR" + $colour = "Red" + } + "W" { + $state = "WARNING" + $colour = "Yellow" + } + "F" { + $state = "FAILURE" + $colour = "Red" + } + "C" { + $state = "COMPLETE" + $colour = "Green" + } + "V" { + If ($verboseMode -eq $true) { + $state = "VERBOSE" + $colour = "Magenta" + } Else { + return + } + } + "" { + $state = "INFO" + } + Default { + $state = "INFO" + } + } + + Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour + Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue +} + +function main() { + setupLogging + validateUserInput + getAgentPath + + If ($agentPresent -eq $true) { + stopServices + runUninstaller + } + + writeToLog I "Agent removed. Will now perform auxiliary cleanup." + determinePMEVersion + + If ($legacyPME -eq $true) { + runPMEV1Uninstaller + } Else { + runPMEV2Uninstaller + } + + removeProcesses + removePMEServices + removePMEFoldersAndKeys + cleanupTakeControl + cleanupConfigBackup + killAgentProcesses + cleanupAgent + verifyAssetTag + cleanupAssetTag + verifyAssetTag +} +main \ No newline at end of file diff --git a/src/n-sight/cleaners/avdCleanup.ps1 b/src/external/scripts/N-Sight/avdCleanup.ps1 similarity index 96% rename from src/n-sight/cleaners/avdCleanup.ps1 rename to src/external/scripts/N-Sight/avdCleanup.ps1 index a00e70a3..e5ced143 100644 --- a/src/n-sight/cleaners/avdCleanup.ps1 +++ b/src/external/scripts/N-Sight/avdCleanup.ps1 @@ -1,448 +1,448 @@ -#!ignore -# '================================================================================================================================================================== -# 'Disclaimer -# 'The sample scripts are not supported under any N-able support program or service. -# 'The sample scripts are provided AS IS without warranty of any kind. -# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. -# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. -# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever -# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) -# 'arising out of the use of or inability to use the sample scripts or documentation. -# '================================================================================================================================================================== - -Param ( - $verbose = "Y", - [int]$timeout = 30 -) - -function setupLogging() { - $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\AVDefenderCleanup\debug.log" - - $script:logFolder = Split-Path $logFilePath - $script:logFile = Split-Path $logFilePath -Leaf - - $logFolderExists = Test-Path $logFolder - $logFileExists = Test-Path $logFilePath - - If ($logFolderExists -eq $false) { - New-Item -ItemType "directory" -Path $logFolder | Out-Null - } - - If ($logFileExists -eq $true) { - Remove-Item $logFilePath -ErrorAction SilentlyContinue - Start-Sleep 2 - New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null - } Else { - New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null - } - - If (($logFolder -match '.+?\\$') -eq $false) { - $script:logFolder = $logFolder + "\" - } - - [float]$script:currentVersion = 1.04 - writeToLog I "Started processing the avdCleanup script." - writeToLog I "Running script version: $currentVersion" -} - -function validateUserInput() { -# Ensures the provided input from user is valid - If ($verbose.ToLower() -eq "y") { - $script:verboseMode = $true - writeToLog V "You have defined to have the script output the verbose log entries." - } Else { - $script:verboseMode = $false - writeToLog I "Will output logs in regular mode." - } - - writeToLog V "Input Parameters have been successfully validated." - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function getAgentPath() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - try { - $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog W "Will continue with validating agent path." - } - - $Items = $Keys | Foreach-Object { - Get-ItemProperty $_.PsPath - } - - ForEach ($Item in $Items) { - If ($Item.DisplayName -like "Windows Agent") { - $script:localFolder = $Item.installLocation - $script:registryPath = $Item.PsPath - $registryName = $Item.PSChildName - $script:uninstallString = $Item.UninstallString - $registryDisplayName = $Item.DisplayName - $registryVersion = $Item.DisplayVersion - $registryInstallDate = $Item.InstallDate - break - } - } - - try { - $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog W "Will continue with validating agent path." - } - - $Items = $Keys | Foreach-Object { - Get-ItemProperty $_.PsPath - } - - ForEach ($Item in $Items) { - If ($Item.DisplayName -like "Windows Agent") { - $script:localFolder = $Item.installLocation - $script:registryPath = $Item.PsPath - $registryName = $Item.PSChildName - $script:uninstallString = $Item.UninstallString - $registryDisplayName = $Item.DisplayName - $registryVersion = $Item.DisplayVersion - $registryInstallDate = $Item.InstallDate - break - } - } - - If (!$script:localFolder) { - $script:agentPresent = $false - - $script:localFolder = "C:\Program Files (x86)\N-able Technologies\Windows Agent\" - writeToLog W "No Windows Agent located." - - } Else { - $script:agentPresent = $true - - If (($script:localFolder -match '.+?\\$') -eq $false) { - $script:localFolder = $script:localFolder + "\" - } - - writeToLog I "Windows Agent install location found:`r`n`t$localFolder" - writeToLog V "Registry location: `r`n`t$registryPath`r`n`t$registryName" - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function downloadUninstaller() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - # Download the Site Installation Package from new location - $uninsUrl = "https://sis.n-able.com/GenericFiles/AVDefenderUninstallTool/7.4.3.146/UninstallToolSilent.exe" - - $script:downloadLocation = $logFolder - $script:localFile = $uninsUrl.Split("/")[-1] - - $source = $uninsUrl - $dest = $downloadLocation+$localFile - - If (Test-Path $dest) { - writeToLog W "File already present, skipping download." - - } Else { - - writeToLog I "Downloading the following uninstaller:`r`n`t$localFile" - writeToLog V "This is being directed to the following location:`r`n`t$dest" - - $wc = New-Object System.Net.WebClient - - try { - $wc.DownloadFile($source, $dest) - } - catch [System.Net.WebException] { - writeToLog F "The uninstaller failed to download, due to:" - - If ($_.Exception.InnerException) { - $innerException = $_.Exception.InnerException.Message - writeToLog F $innerException - writeToLog F "Failing script." - Exit 1001 - } Else { - $exception = $_.Exception.Message - writeToLog F $exception - writeToLog F "Failing script." - Exit 1001 - } - } - - writeToLog I "The $localFile uninstaller has downloaded successfully." - } - - $script:uninstallerPath = $dest - - writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) -} - -function stopServices() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "Windows Agent Service" - $array += "Windows Agent Maintenance Service" - - foreach ($serviceName in $array) { - - If (Get-Service $serviceName -ErrorAction SilentlyContinue) { - writeToLog I "Detected the `'$serviceName`' Windows Service on the device, will now stop the service." - - try { - $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop -WarningAction SilentlyContinue - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to stop the `#$serviceName`# Windows Service, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - writeToLog I "The `'$serviceName`' Windows Service is now stopped." - - } Else { - writeToLog W "The `'$serviceName`' Windows Service was not found." - } - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function performUninstall() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $switches = "/bdparams /SILENT /bruteForce /destructive" - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $uninstallerPath - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = $switches - - writeToLog V "Using switch: $switches" - writeToLog V "Running the following uninstaller:`r`n`t$uninstallerPath" - - <# - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - Start-Sleep 10 - $script:exitCode = $p.ExitCode - - If (($exitcode -eq 0)-or ($null -eq $exitcode)) { - writeToLog I "Successfully returned exit code 0 from uninstall action." - } Else { - $stdout = $p.StandardOutput.ReadToEnd() - $stderr = $p.StandardError.ReadToEnd() - - writeToLog F "Ran into a failure during uninstall, exit code returned: $exitcode" - writeToLog F "Standard Output:`r`n`t$stdout" - writeToLog F "Standard Error:`r`n`t$stderr" - } - #> - - - writeToLog I "Timeout set to: $timeout seconds." - - $max_iterations = 1 - for ($i=0; $i -lt $max_iterations; $i++) { - # $proc = Start-Process -filePath $uninstallerPath -ArgumentList $switches -workingdirectory $programtorunpath -PassThru - $proc = Start-Process -filePath $uninstallerPath -ArgumentList $switches -PassThru - - # keep track of timeout event - $timeouted = $null # reset any previously set timeout - - # wait up to x seconds for normal termination - $proc | Wait-Process -Timeout $timeout -ErrorAction SilentlyContinue -ErrorVariable timeouted - - if ($timeouted) { - # terminate the process - # $proc | kill - - Get-Process | Where-Object {$_.ProcessName -like "uninstalltool*"} | stop-process -force - - # update internal error counter - } elseif ($proc.ExitCode -ne 0) { - # update internal error counter - } - } - - writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) -} - -function cleanupFoldersAndKeys() { - writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) - - $array = @() - $array += "HKLM:\SOFTWARE\Endpoint Security.remove" - $array += "HKLM:\SOFTWARE\Bitdefender" - $array += "HKLM:\SYSTEM\CurrentControlSet\Services\BdDci" - $array += $localFolder + "config\AVDefenderConfig.xml" - $array += $localFolder + "config\AVDefenderConfig.xml.backup" - $array += $localFolder + "config\AVDefenderErrorManager.xml" - $array += $localFolder + "config\AVDefenderErrorManager.xml.backup" - - ForEach ($item in $Array) { - If (Test-Path $item) { - writeToLog V "Detected $item, foribly removing item." - - try { - Remove-Item $item -Recurse -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "The item $item exists but cannot be removed, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } Else { - writeToLog W "The $item doesn't exist, skipping." - } - } - -writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) -} - -function killAgentProcesses() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - try { - $script:runningProcesses = Get-Process * -ErrorAction Stop | Where-Object {$_.Path -like "C:\Program Files (x86)\N-able Technologies\Windows Agent\*"} | Select-Object Name,Path - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to detect running processes, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - If ($null -ne $runningProcesses) { - writeToLog W "Found following process(es):`r`n`t $($runningProcesses.Name)" - - foreach ($process in $runningProcesses) { - try { - $process | Stop-Process -Force -ErrorAction Stop - } - catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to stop the process: $process, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - foreach ($lockFile in Get-ChildItem -Path "C:\Program Files (x86)\N-able Technologies\Windows Agent\*" -Include * -Recurse) { - foreach ($process in $runningProcesses) { - $process.Modules | Where-Object {$_.FileName -eq $lockFile} | Stop-Process -Force -ErrorAction SilentlyContinue - } - } - } Else { - writeToLog V "No processes are running that are tied to the Windows Agent." - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function startServices() { - writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) - - $array = @() - $array += "Windows Agent Service" - $array += "Windows Agent Maintenance Service" - - foreach ($serviceName in $array) { - - If (Get-Service $serviceName -ErrorAction SilentlyContinue) { - writeToLog I "Detected the `'$serviceName`' Windows Service on the device, will now start the service." - - try { - $script:startService = Start-Service -Name $serviceName -ErrorAction Stop -WarningAction SilentlyContinue - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to start the `'$serviceName`' Windows Service, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - writeToLog I "The `'$serviceName`' Windows service has now started." - - } Else { - writeToLog W "The `'$serviceName`' Windows Service was not found." - } - } - - writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) -} - -function writeToLog($state, $message) { - - $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) - - switch -regex -Wildcard ($state) { - "I" { - $state = "INFO" - $colour = "Cyan" - } - "E" { - $state = "ERROR" - $colour = "Red" - } - "W" { - $state = "WARNING" - $colour = "Yellow" - } - "F" { - $state = "FAILURE" - $colour = "Red" - } - "C" { - $state = "COMPLETE" - $colour = "Green" - } - "V" { - If ($verboseMode -eq $true) { - $state = "VERBOSE" - $colour = "Magenta" - } Else { - return - } - } - "" { - $state = "INFO" - } - Default { - $state = "INFO" - } - } - - Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour - Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue -} - -function main() { - setupLogging - validateUserInput - getAgentPath - downloadUninstaller - stopServices - performUninstall - cleanupFoldersAndKeys - killAgentProcesses - startServices - - exit 0 -} -main +#!ignore "3271b7a17cc1a89faeba83df9c07760c" +# '================================================================================================================================================================== +# 'Disclaimer +# 'The sample scripts are not supported under any N-able support program or service. +# 'The sample scripts are provided AS IS without warranty of any kind. +# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. +# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. +# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever +# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) +# 'arising out of the use of or inability to use the sample scripts or documentation. +# '================================================================================================================================================================== + +Param ( + $verbose = "Y", + [int]$timeout = 30 +) + +function setupLogging() { + $script:logFilePath = "C:\ProgramData\MspPlatform\Tech Tribes\AVDefenderCleanup\debug.log" + + $script:logFolder = Split-Path $logFilePath + $script:logFile = Split-Path $logFilePath -Leaf + + $logFolderExists = Test-Path $logFolder + $logFileExists = Test-Path $logFilePath + + If ($logFolderExists -eq $false) { + New-Item -ItemType "directory" -Path $logFolder | Out-Null + } + + If ($logFileExists -eq $true) { + Remove-Item $logFilePath -ErrorAction SilentlyContinue + Start-Sleep 2 + New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null + } Else { + New-Item -ItemType "file" -Path $logFolder -Name $logFile | Out-Null + } + + If (($logFolder -match '.+?\\$') -eq $false) { + $script:logFolder = $logFolder + "\" + } + + [float]$script:currentVersion = 1.04 + writeToLog I "Started processing the avdCleanup script." + writeToLog I "Running script version: $currentVersion" +} + +function validateUserInput() { +# Ensures the provided input from user is valid + If ($verbose.ToLower() -eq "y") { + $script:verboseMode = $true + writeToLog V "You have defined to have the script output the verbose log entries." + } Else { + $script:verboseMode = $false + writeToLog I "Will output logs in regular mode." + } + + writeToLog V "Input Parameters have been successfully validated." + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function getAgentPath() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog W "Will continue with validating agent path." + } + + $Items = $Keys | Foreach-Object { + Get-ItemProperty $_.PsPath + } + + ForEach ($Item in $Items) { + If ($Item.DisplayName -like "Windows Agent") { + $script:localFolder = $Item.installLocation + $script:registryPath = $Item.PsPath + $registryName = $Item.PSChildName + $script:uninstallString = $Item.UninstallString + $registryDisplayName = $Item.DisplayName + $registryVersion = $Item.DisplayVersion + $registryInstallDate = $Item.InstallDate + break + } + } + + try { + $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop + } catch { + $msg = $_.Exception.Message + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" + writeToLog V "This occurred on line number: $line" + writeToLog W "Will continue with validating agent path." + } + + $Items = $Keys | Foreach-Object { + Get-ItemProperty $_.PsPath + } + + ForEach ($Item in $Items) { + If ($Item.DisplayName -like "Windows Agent") { + $script:localFolder = $Item.installLocation + $script:registryPath = $Item.PsPath + $registryName = $Item.PSChildName + $script:uninstallString = $Item.UninstallString + $registryDisplayName = $Item.DisplayName + $registryVersion = $Item.DisplayVersion + $registryInstallDate = $Item.InstallDate + break + } + } + + If (!$script:localFolder) { + $script:agentPresent = $false + + $script:localFolder = "C:\Program Files (x86)\N-able Technologies\Windows Agent\" + writeToLog W "No Windows Agent located." + + } Else { + $script:agentPresent = $true + + If (($script:localFolder -match '.+?\\$') -eq $false) { + $script:localFolder = $script:localFolder + "\" + } + + writeToLog I "Windows Agent install location found:`r`n`t$localFolder" + writeToLog V "Registry location: `r`n`t$registryPath`r`n`t$registryName" + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function downloadUninstaller() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + # Download the Site Installation Package from new location + $uninsUrl = "https://sis.n-able.com/GenericFiles/AVDefenderUninstallTool/7.4.3.146/UninstallToolSilent.exe" + + $script:downloadLocation = $logFolder + $script:localFile = $uninsUrl.Split("/")[-1] + + $source = $uninsUrl + $dest = $downloadLocation+$localFile + + If (Test-Path $dest) { + writeToLog W "File already present, skipping download." + + } Else { + + writeToLog I "Downloading the following uninstaller:`r`n`t$localFile" + writeToLog V "This is being directed to the following location:`r`n`t$dest" + + $wc = New-Object System.Net.WebClient + + try { + $wc.DownloadFile($source, $dest) + } + catch [System.Net.WebException] { + writeToLog F "The uninstaller failed to download, due to:" + + If ($_.Exception.InnerException) { + $innerException = $_.Exception.InnerException.Message + writeToLog F $innerException + writeToLog F "Failing script." + Exit 1001 + } Else { + $exception = $_.Exception.Message + writeToLog F $exception + writeToLog F "Failing script." + Exit 1001 + } + } + + writeToLog I "The $localFile uninstaller has downloaded successfully." + } + + $script:uninstallerPath = $dest + + writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) +} + +function stopServices() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "Windows Agent Service" + $array += "Windows Agent Maintenance Service" + + foreach ($serviceName in $array) { + + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + writeToLog I "Detected the `'$serviceName`' Windows Service on the device, will now stop the service." + + try { + $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop -WarningAction SilentlyContinue + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to stop the `#$serviceName`# Windows Service, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + writeToLog I "The `'$serviceName`' Windows Service is now stopped." + + } Else { + writeToLog W "The `'$serviceName`' Windows Service was not found." + } + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function performUninstall() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $switches = "/bdparams /SILENT /bruteForce /destructive" + $pinfo = New-Object System.Diagnostics.ProcessStartInfo + $pinfo.FileName = $uninstallerPath + $pinfo.RedirectStandardError = $true + $pinfo.RedirectStandardOutput = $true + $pinfo.UseShellExecute = $false + $pinfo.Arguments = $switches + + writeToLog V "Using switch: $switches" + writeToLog V "Running the following uninstaller:`r`n`t$uninstallerPath" + + <# + $p = New-Object System.Diagnostics.Process + $p.StartInfo = $pinfo + $p.Start() | Out-Null + $p.WaitForExit() + Start-Sleep 10 + $script:exitCode = $p.ExitCode + + If (($exitcode -eq 0)-or ($null -eq $exitcode)) { + writeToLog I "Successfully returned exit code 0 from uninstall action." + } Else { + $stdout = $p.StandardOutput.ReadToEnd() + $stderr = $p.StandardError.ReadToEnd() + + writeToLog F "Ran into a failure during uninstall, exit code returned: $exitcode" + writeToLog F "Standard Output:`r`n`t$stdout" + writeToLog F "Standard Error:`r`n`t$stderr" + } + #> + + + writeToLog I "Timeout set to: $timeout seconds." + + $max_iterations = 1 + for ($i=0; $i -lt $max_iterations; $i++) { + # $proc = Start-Process -filePath $uninstallerPath -ArgumentList $switches -workingdirectory $programtorunpath -PassThru + $proc = Start-Process -filePath $uninstallerPath -ArgumentList $switches -PassThru + + # keep track of timeout event + $timeouted = $null # reset any previously set timeout + + # wait up to x seconds for normal termination + $proc | Wait-Process -Timeout $timeout -ErrorAction SilentlyContinue -ErrorVariable timeouted + + if ($timeouted) { + # terminate the process + # $proc | kill + + Get-Process | Where-Object {$_.ProcessName -like "uninstalltool*"} | stop-process -force + + # update internal error counter + } elseif ($proc.ExitCode -ne 0) { + # update internal error counter + } + } + + writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) +} + +function cleanupFoldersAndKeys() { + writeToLog V ("### Started running {0} function. ###" -f $MyInvocation.MyCommand) + + $array = @() + $array += "HKLM:\SOFTWARE\Endpoint Security.remove" + $array += "HKLM:\SOFTWARE\Bitdefender" + $array += "HKLM:\SYSTEM\CurrentControlSet\Services\BdDci" + $array += $localFolder + "config\AVDefenderConfig.xml" + $array += $localFolder + "config\AVDefenderConfig.xml.backup" + $array += $localFolder + "config\AVDefenderErrorManager.xml" + $array += $localFolder + "config\AVDefenderErrorManager.xml.backup" + + ForEach ($item in $Array) { + If (Test-Path $item) { + writeToLog V "Detected $item, foribly removing item." + + try { + Remove-Item $item -Recurse -Force -ErrorAction Stop + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "The item $item exists but cannot be removed, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } Else { + writeToLog W "The $item doesn't exist, skipping." + } + } + +writeToLog V ("### Completed running {0} function. ###" -f $MyInvocation.MyCommand) +} + +function killAgentProcesses() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + try { + $script:runningProcesses = Get-Process * -ErrorAction Stop | Where-Object {$_.Path -like "C:\Program Files (x86)\N-able Technologies\Windows Agent\*"} | Select-Object Name,Path + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to detect running processes, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + If ($null -ne $runningProcesses) { + writeToLog W "Found following process(es):`r`n`t $($runningProcesses.Name)" + + foreach ($process in $runningProcesses) { + try { + $process | Stop-Process -Force -ErrorAction Stop + } + catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to stop the process: $process, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + } + + foreach ($lockFile in Get-ChildItem -Path "C:\Program Files (x86)\N-able Technologies\Windows Agent\*" -Include * -Recurse) { + foreach ($process in $runningProcesses) { + $process.Modules | Where-Object {$_.FileName -eq $lockFile} | Stop-Process -Force -ErrorAction SilentlyContinue + } + } + } Else { + writeToLog V "No processes are running that are tied to the Windows Agent." + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function startServices() { + writeToLog V ("Started running {0} function." -f $MyInvocation.MyCommand) + + $array = @() + $array += "Windows Agent Service" + $array += "Windows Agent Maintenance Service" + + foreach ($serviceName in $array) { + + If (Get-Service $serviceName -ErrorAction SilentlyContinue) { + writeToLog I "Detected the `'$serviceName`' Windows Service on the device, will now start the service." + + try { + $script:startService = Start-Service -Name $serviceName -ErrorAction Stop -WarningAction SilentlyContinue + } catch { + $msg = $_.Exception + $line = $_.InvocationInfo.ScriptLineNumber + writeToLog W "Failed to start the `'$serviceName`' Windows Service, due to:`r`n`t$($msg.Message)" + writeToLog V "This occurred on line number: $line" + writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" + } + + writeToLog I "The `'$serviceName`' Windows service has now started." + + } Else { + writeToLog W "The `'$serviceName`' Windows Service was not found." + } + } + + writeToLog V ("Completed running {0} function." -f $MyInvocation.MyCommand) +} + +function writeToLog($state, $message) { + + $script:timestamp = "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date) + + switch -regex -Wildcard ($state) { + "I" { + $state = "INFO" + $colour = "Cyan" + } + "E" { + $state = "ERROR" + $colour = "Red" + } + "W" { + $state = "WARNING" + $colour = "Yellow" + } + "F" { + $state = "FAILURE" + $colour = "Red" + } + "C" { + $state = "COMPLETE" + $colour = "Green" + } + "V" { + If ($verboseMode -eq $true) { + $state = "VERBOSE" + $colour = "Magenta" + } Else { + return + } + } + "" { + $state = "INFO" + } + Default { + $state = "INFO" + } + } + + Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour + Write-Output "$($timeStamp) - [$state]: $message" | Out-file $logFilePath -Append -ErrorAction SilentlyContinue +} + +function main() { + setupLogging + validateUserInput + getAgentPath + downloadUninstaller + stopServices + performUninstall + cleanupFoldersAndKeys + killAgentProcesses + startServices + + exit 0 +} +main \ No newline at end of file diff --git a/src/external/sources/N-Sight/N-sightRMMCleanup.jsonc b/src/external/sources/N-Sight/N-sightRMMCleanup.jsonc new file mode 100644 index 00000000..42f655c3 --- /dev/null +++ b/src/external/sources/N-Sight/N-sightRMMCleanup.jsonc @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../resources/schemas/ExternalScript.schema.jsonc", + "Output": "N-Sight/N-sightRMMCleanup.ps1", + "Source": "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Cleanup Scripts/N-sightRMMCleanup.ps1", + "Patches": [] +} diff --git a/src/external/sources/N-Sight/PMECleanup.jsonc b/src/external/sources/N-Sight/PMECleanup.jsonc new file mode 100644 index 00000000..091abfd1 --- /dev/null +++ b/src/external/sources/N-Sight/PMECleanup.jsonc @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../resources/schemas/ExternalScript.schema.jsonc", + "Output": "N-Sight/PMECleanup.ps1", + "Source": "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Cleanup Scripts/PMECleanup.ps1", + "Patches": [] +} diff --git a/src/external/sources/N-Sight/TakeControlCleanup.jsonc b/src/external/sources/N-Sight/TakeControlCleanup.jsonc new file mode 100644 index 00000000..1f47b4f4 --- /dev/null +++ b/src/external/sources/N-Sight/TakeControlCleanup.jsonc @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../resources/schemas/ExternalScript.schema.jsonc", + "Output": "N-Sight/TakeControlCleanup.ps1", + "Source": "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Cleanup Scripts/TakeControlCleanup.ps1", + "Patches": [] +} diff --git a/src/external/sources/N-Sight/WindowsAgentCleanup.jsonc b/src/external/sources/N-Sight/WindowsAgentCleanup.jsonc new file mode 100644 index 00000000..4b38b5eb --- /dev/null +++ b/src/external/sources/N-Sight/WindowsAgentCleanup.jsonc @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../resources/schemas/ExternalScript.schema.jsonc", + "Output": "N-Sight/WindowsAgentCleanup.ps1", + "Source": "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Cleanup Scripts/WindowsAgentCleanup.ps1", + "Patches": [] +} diff --git a/src/external/sources/N-Sight/avdCleanup.jsonc b/src/external/sources/N-Sight/avdCleanup.jsonc new file mode 100644 index 00000000..290f6fa4 --- /dev/null +++ b/src/external/sources/N-Sight/avdCleanup.jsonc @@ -0,0 +1,6 @@ +{ + "$schema": "../../../../resources/schemas/ExternalScript.schema.jsonc", + "Output": "N-Sight/avdCleanup.ps1", + "Source": "https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Cleanup Scripts/avdCleanup.ps1", + "Patches": [] +} diff --git a/src/n-sight/cleaners/README.md b/src/n-sight/cleaners/README.md deleted file mode 100644 index e852bf46..00000000 --- a/src/n-sight/cleaners/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Cleaner Scripts - -This folder contains cleaner scripts that were extracted from N-Ables support scripts that they reluctantly provide to their customers. -These are locked behind a obfuscated script which validate case numbers and all kinds of shit. - ---- - -## Update.ps1 - -I've decoded and extracted the base script and created the `Update.ps1` file which can be used to ensure they are up to date. -The file `Update.ps1` is a script that can be used to fetch the latest versions of these scripts. - -Usage: -```powershell -./Update.ps1 -``` - - -Feel free to explore and use these cleaner scripts for your needs! diff --git a/src/n-sight/cleaners/Update.ps1 b/src/n-sight/cleaners/Update.ps1 deleted file mode 100644 index a5f60502..00000000 --- a/src/n-sight/cleaners/Update.ps1 +++ /dev/null @@ -1,77 +0,0 @@ -Using module ..\..\common\Environment.psm1 -Using module ..\..\common\Logging.psm1 -Using module ..\..\common\Exit.psm1 - -[CmdletBinding()] -param( - [String]$BaseUrl = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/FeatureCleanup/Cleanup Scripts', - - [String[]]$FilesToFetch = @( - 'avdCleanup.ps1', - 'N-sightRMMCleanup.ps1', - 'PMECleanup.ps1', - 'TakeControlCleanup.ps1', - 'WindowsAgentCleanup.ps1' - ) -) - -Function Invoke-UpdateScript { - param( - [String]$BaseUrl, - [String]$ScriptName - ) - - Invoke-Info "Checking updates for '$File'..."; - - [String]$Private:S3ObjectUrl = "$BaseUrl/$ScriptName"; - - # TODO - Fix hash check - # try { - # Invoke-Verbose "Fetching HEAD from '$S3ObjectUrl'..."; - # $null = Invoke-RestMethod -Uri $Private:S3ObjectUrl -Method Head -ResponseHeadersVariable ResponseHeaders; - # } catch { - # Invoke-Error -Message "Failed to fetch HEAD from '$S3ObjectUrl': $($_.Exception.Message)"; - # Invoke-FailedExit -ExitCode 9999 -ErrorRecord $_; - # } - - # [String]$Private:ETag = $ResponseHeaders['ETag'].Trim('"').ToUpper(); - # [String]$Private:LocalFilePath = Join-Path -Path $PSScriptRoot -ChildPath $ScriptName; - - # if (Test-Path $Private:LocalFilePath) { - # # Split string into lines, skip first line, recontruct string - # [String]$Private:FileContent = Get-Content -Path $Private:LocalFilePath -Raw; - # [String[]]$Private:SplitContent = $Private:FileContent.Split("`n", 2); - # [String]$Private:LocalFileOriginalContent = $Private:SplitContent[1]; - # [String]$Private:TempFile = [System.IO.Path]::GetTempFileName(); - # Set-Content -Path $Private:TempFile -Value $Private:LocalFileOriginalContent; - - # if (Compare-FileHashToS3ETag -Path:$Private:TempFile -ETag:$ETag) { - # Invoke-Info "File '$ScriptName' is up-to-date."; - # return; - # } - # } - - Invoke-Info "Fetching '$ScriptName' from '$S3ObjectUrl'..."; - try { - $Content = Invoke-RestMethod -Uri $S3ObjectUrl; - } catch { - Invoke-Error -Message "Failed to fetch '$S3ObjectUrl': $($_.Exception.Message)"; - Invoke-FailedExit -ExitCode 9999 -ErrorRecord $_; - } - - try { - $Content = "#@ignore`n$Content"; - Set-Content -Path $Private:LocalFilePath -Value $Content; - } catch { - Invoke-Error -Message "Failed to write '$ScriptName' to '$Private:LocalFilePath': $($_.Exception.Message)"; - Invoke-FailedExit -ExitCode 9999 -ErrorRecord $_; - } - - Invoke-Info "File '$ScriptName' has been updated."; -} - -Invoke-RunMain $PSCmdlet { - foreach ($File in $FilesToFetch) { - Invoke-UpdateScript -BaseUrl:$BaseUrl -ScriptName:$File; - } -}; diff --git a/src/n-sight/cleaners/WindowsAgentCleanup.ps1 b/src/n-sight/cleaners/WindowsAgentCleanup.ps1 deleted file mode 100644 index 71f7a82c..00000000 --- a/src/n-sight/cleaners/WindowsAgentCleanup.ps1 +++ /dev/null @@ -1,831 +0,0 @@ -#!ignore -# '================================================================================================================================================================== -# 'Disclaimer -# 'The sample scripts are not supported under any N-able support program or service. -# 'The sample scripts are provided AS IS without warranty of any kind. -# 'N-able further disclaims all implied warranties including, without limitation, any implied warranties of merchantability or of fitness for a particular purpose. -# 'The entire risk arising out of the use or performance of the sample scripts and documentation stays with you. -# 'In no event shall N-able or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever -# '(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) -# 'arising out of the use of or inability to use the sample scripts or documentation. -# '================================================================================================================================================================== - -Param ( - [string]$verbose = 'Y' -) - -function setupLogging() { - $script:logFilePath = 'C:\ProgramData\MspPlatform\Tech Tribes\Windows Agent Cleanup\debug.log' - - $script:logFolder = Split-Path $logFilePath - $script:logFile = Split-Path $logFilePath -Leaf - - $logFolderExists = Test-Path $logFolder - $logFileExists = Test-Path $logFilePath - - If ($logFolderExists -eq $false) { - New-Item -ItemType 'directory' -Path $logFolder | Out-Null - } - - If ($logFileExists -eq $true) { - Remove-Item $logFilePath -ErrorAction SilentlyContinue - Start-Sleep 2 - New-Item -ItemType 'file' -Path $logFolder -Name $logFile | Out-Null - } Else { - New-Item -ItemType 'file' -Path $logFolder -Name $logFile | Out-Null - } - - If (($logFolder -match '.+?\\$') -eq $false) { - $script:logFolder = $logFolder + '\' - } - - writeToLog I 'Running script version: 1.08.' -} - -function validateUserInput() { - # Ensures the provided input from user is valid - If ($verbose.ToLower() -eq 'y') { - $script:verboseMode = $true - writeToLog V 'You have defined to have the script output the verbose log entries.' - } Else { - $script:verboseMode = $false - writeToLog I 'Will output logs in regular mode.' - } - - writeToLog V 'Input Parameters have been successfully validated.' - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function getAgentPath() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - try { - $Keys = Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog W 'Will continue with validating agent path.' - } - - $Items = $Keys | ForEach-Object { - Get-ItemProperty $_.PsPath - } - - ForEach ($Item in $Items) { - If ($Item.DisplayName -like 'Windows Agent') { - $script:localFolder = $Item.installLocation - $script:registryPath = $Item.PsPath - $registryName = $Item.PSChildName - $script:uninstallString = $Item.UninstallString - $registryDisplayName = $Item.DisplayName - $registryVersion = $Item.DisplayVersion - $registryInstallDate = $Item.InstallDate - break - } - } - - try { - $Keys = Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Error occurred during the lookup of the CurrentVersion\Uninstall Path in the registry, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog W 'Will continue with validating agent path.' - } - - $Items = $Keys | ForEach-Object { - Get-ItemProperty $_.PsPath - } - - ForEach ($Item in $Items) { - If ($Item.DisplayName -like 'Windows Agent') { - $script:localFolder = $Item.installLocation - $script:registryPath = $Item.PsPath - $registryName = $Item.PSChildName - $script:uninstallString = $Item.UninstallString - $registryDisplayName = $Item.DisplayName - $registryVersion = $Item.DisplayVersion - $registryInstallDate = $Item.InstallDate - break - } - } - - If (!$script:localFolder) { - writeToLog W 'No Windows Agent located.' - writeToLog W 'No uninstall can be performed but will carry on with the cleanup.' - $script:agentPresent = $false - $script:localFolder = 'C:\Program Files (x86)\N-able Technologies\Windows Agent\' - } Else { - $script:agentPresent = $true - - If (($script:localFolder -match '.+?\\$') -eq $false) { - $script:localFolder = $script:localFolder + '\' - } - - writeToLog I "Agent install location found:`r`n`t$localFolder" - writeToLog V "Registry location: `r`n`t$registryPath`r`n`t$registryName" - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function stopServices() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - $array = @() - $array += 'Windows Agent Service' - $array += 'Windows Agent Maintenance Service' - - foreach ($serviceName in $array) { - - If (Get-Service $serviceName -ErrorAction SilentlyContinue) { - writeToLog I "Detected the $serviceName service on the device, will now stop the service." - - try { - $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - writeToLog I "$serviceName service is now stopped." - - } Else { - writeToLog W "$serviceName service was not found." - } - - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function runUninstaller() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - $uninsString = ($script:uninstallString -split 'MsiExec.exe ')[1] - - If ($uninsString.length -gt 0) { - $argumentList = $uninsString + ' /qn /norestart' - writeToLog I 'Starting MSI Uninstaller.' - writeToLog V "Argument list confirming msi uninstall string:`r`n`t$argumentList" - - $uninstallExitCode = (Start-Process -FilePath msiexec.exe -ArgumentList $argumentList -Wait -PassThru).ExitCode - - writeToLog I 'Uninstall process has now been completed.' - - If ($uninstallExitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $uninstallExitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $uninstallExitCode" - } - } Else { - writeToLog V "Uninstall String length is: $($uninsString.length)" - writeToLog V 'Uninstall cannot occur, will contiunue with cleanup.' - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function determinePMEVersion() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - try { - $pmeVersionRaw = Get-Process -Name *PME.Agent -FileVersionInfo | Select-Object ProductName,ProductVersion,FileVersion | Sort-Object -Unique -ErrorAction Stop - } catch { - $msg = $_.Exception.Message - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog F "Error occurred locating an applicable PME Agent process, due to:`r`n`t$msg" - writeToLog V "This occurred on line number: $line" - writeToLog F 'Failing script.' - Exit 1001 - } - - $pmeProductName = $pmeVersionRaw.ProductName - $pmeProductVersion = $pmeVersionRaw.ProductVersion - - writeToLog V "Detected PME Version: $pmeProductVersion" - - If ($pmeProductName -eq 'SolarWinds.MSP.PME.Agent') { - writeToLog I "Detected installed PME Version is: $pmeProductVersion" - $script:legacyPME = $true - } ElseIf ($pmeProductName -eq 'PME.Agent') { - writeToLog I "Detected installed PME Version is: $pmeProductVersion" - $script:legacyPME = $false - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function runPMEV1Uninstaller() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - $pmeFolder = 'C:\Program Files (x86)\SolarWinds MSP\' - - $hash = @{ - "$($pmeFolder)PME\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat'; - "$($pmeFolder)CacheService\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat'; - "$($pmeFolder)RpcServer\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat' - } - - foreach ($key in $hash.Keys) { - if (Test-Path $key) { - $datItem = $key - $datItem = $datItem -replace 'exe','dat' - - if (!(Test-Path $datItem)) { - writeToLog W 'Dat file not found. Will attempt downloading.' - downloadFileToLocation $hash[$key] $datItem - - if (!(Test-Path $datItem)) { - writeToLog F 'Unable to download dat file for uninstaller to run.' - writeToLog F 'PME must be removed manually. Failing script.' - exit 1001 - } - } - - writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." - - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $key - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = '/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART' - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - $script:exitCode = $p.ExitCode - - If ($exitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" - } - - Start-Sleep -s 5 - - } Else { - writeToLog W "$key Uninstaller doesn't exist on the device." - } - } - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function runPMEV2Uninstaller() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - $pmeFolder = 'C:\Program Files (x86)\MspPlatform\' - - $hash = @{ - "$($pmeFolder)PME\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/patchmanunins000.dat'; - "$($pmeFolder)FileCacheServiceAgent\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/cacheunins000.dat'; - "$($pmeFolder)RequestHandlerAgent\unins000.exe" = 'https://s3.amazonaws.com/new-swmsp-net-supportfiles/PermanentFiles/PMECleanup_Repository/rpcunins000.dat' - } - - foreach ($key in $hash.Keys) { - if (Test-Path $key) { - $datItem = $key - $datItem = $datItem -replace 'exe','dat' - - if (!(Test-Path $datItem)) { - writeToLog W 'Dat file not found. Will attempt downloading.' - downloadFileToLocation $hash[$key] $datItem - - if (!(Test-Path $datItem)) { - writeToLog F 'Unable to download dat file for uninstaller to run.' - writeToLog F 'PME must be removed manually. Failing script.' - exit 1001 - } - } - - writeToLog I "$key Uninstaller exists on the device. Now running uninstaller." - - $pinfo = New-Object System.Diagnostics.ProcessStartInfo - $pinfo.FileName = $key - $pinfo.RedirectStandardError = $true - $pinfo.RedirectStandardOutput = $true - $pinfo.UseShellExecute = $false - $pinfo.Arguments = '/silent /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART' - $p = New-Object System.Diagnostics.Process - $p.StartInfo = $pinfo - $p.Start() | Out-Null - $p.WaitForExit() - $script:exitCode = $p.ExitCode - - If ($exitCode -ne 0) { - writeToLog W "Did not successfully perform uninstall, as Exit Code is: $exitCode" - } Else { - writeToLog I "Successfully performed uninstall, as the returned Exit Code is: $exitCode" - } - - Start-Sleep -s 5 - - } Else { - writeToLog W "$key Uninstaller doesn't exist on the device." - } - } - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function removeProcesses() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - try { - $script:pmeProcess = Get-Process -processname '*PME*' -ErrorAction Stop - $script:rpcProcess = Get-Process -processname '*RPC*' -ErrorAction Stop - $script:cacheServiceProcess = Get-Process -processname '*Cache*' -ErrorAction Stop - } catch { - writeToLog E 'Error detecting process:' - writeToLog E $_ - } - - If ($null -ne $pmeProcess) { - writeToLog I "Detected $pmeProcess on the device, removing." - try { - Stop-Process $pmeProcess -Force -ErrorAction Stop - } catch { - writeToLog E 'Error stopping PME process:' - writeToLog E $_ - } - } Else { - writeToLog I 'Did not detect the PME process on the device.' - } - - If ($null -ne $rpcProcess) { - writeToLog I "Detected $rpcProcess on the device, removing." - try { - Stop-Process $rpcProcess -Force -ErrorAction Stop - } catch { - writeToLog E 'Error stopping RPC process:' - writeToLog E $_ - } - } Else { - writeToLog I "Did not detect PME's RPC process on the device." - } - If ($null -ne $cacheServiceProcess) { - writeToLog I "Detected $cacheServiceProcess on the device, removing." - try { - Stop-Process $cacheServiceProcess -Force -ErrorAction Stop - } catch { - writeToLog E 'Error stopping Cache Service process:' - writeToLog E $_ - } - } Else { - writeToLog I "Did not detect PME's Cache Service process on the device." - } - - # If '_iu14D2N.tmp' is present on the device, then we will try to kill it - try { - $uninsLockProcTest = Get-Process -ProcessName '_iu*' -ErrorAction Stop - } catch { - writeToLog E 'Error detecting uninstaller lock file, due to:' - writeToLog E $_ - } - - If ($null -ne $uninsLockProcTest) { - writeToLog I "Detected $uninsLockProcTest on the device, removing." - try { - Stop-Process $uninsLockProcTest -Force -ErrorAction Stop - } catch { - writeToLog E 'Error stopping uninstall lock process:' - writeToLog E $_ - } - } - - $uninsLockPath = "$Env:USERPROFILE\AppData\Local\Temp\_iu*" - $uninsLockPathTest = Test-Path $uninsLockPath - - If ($uninsLockPathTest -eq $true) { - writeToLog I "Detected $uninsLockPath on the device, removing." - Remove-Item "$Env:USERPROFILE\AppData\Local\Temp\_iu*" -Force - } - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function downloadFileToLocation ($URL, $Location) { - - $wc = New-Object System.Net.WebClient - - try { - $wc.DownloadFile($URL, $Location) - } catch { - writeToLog E "Exception when downloading file $Location from source $URL." - } -} - -function removePMEServices() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - $array = @() - $array += 'PME.Agent.PmeService' - $array += 'SolarWinds.MSP.RpcServerService' - $array += 'SolarWinds.MSP.CacheService' - - foreach ($serviceName in $array) { - - If (Get-Service $serviceName -ErrorAction SilentlyContinue) { - writeToLog I "Detected the $serviceName service on the device, will now remove service." - - try { - $script:stopService = Stop-Service -Name $serviceName -ErrorAction Stop - $script:deleteService = sc.exe delete $serviceName -ErrorAction Stop - } catch { - writeToLog I 'The service cannot be removed automatically. Please remove manually.' - $removalError = $error[0] - writeToLog I "Exception from removal attempt is: $removalError" - } - writeToLog I "$serviceName service is now removed." - } Else { - writeToLog W "$serviceName service not found." - } - } - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function removePMEFoldersAndKeys() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - $array = @() - $array += 'C:\ProgramData\SolarWinds MSP\PME' - $array += 'C:\ProgramData\MspPlatform\PME' - $array += 'C:\ProgramData\MspPlatform\PME.Agent.PmeService' - - $array += 'C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.CacheService' - $array += 'C:\ProgramData\MspPlatform\SolarWinds.MSP.CacheService' - $array += 'C:\ProgramData\MspPlatform\FileCacheServiceAgent' - - $array += 'C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.Diagnostics' - $array += 'C:\ProgramData\SolarWinds MSP\SolarWinds.MSP.RpcServerService' - $array += 'C:\ProgramData\MspPlatform\SolarWinds.MSP.RpcServerService' - $array += 'C:\ProgramData\MspPlatform\RequestHandlerAgent' - - $array += 'C:\Program Files (x86)\SolarWinds MSP\CacheService\' - $array += 'C:\Program Files (x86)\MspPlatform\FileCacheServiceAgent\' - $array += 'C:\Program Files (x86)\SolarWinds MSP\PME\' - $array += 'C:\Program Files (x86)\MspPlatform\PME\' - $array += 'C:\Program Files (x86)\SolarWinds MSP\RpcServer\' - $array += 'C:\Program Files (x86)\MspPlatform\RequestHandlerAgent\' - - If ((Test-Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall') -eq $true) { - $recurse = Get-ChildItem -Path 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall' - - foreach ($entry in $recurse) { - foreach ($key in Get-ItemProperty -Path "Registry::$entry") { - if ($key.DisplayName -eq 'SolarWinds MSP RPC Server' -or $key.DisplayName -eq 'Request Handler Agent' -or $key.DisplayName -eq 'File Cache Service Agent' -or $key.DisplayName -eq 'Patch Management Service Controller' -or $key.DisplayName -eq 'SolarWinds MSP Patch Management Engine' -or $key.DisplayName -eq 'SolarWinds MSP Cache Service') { - $temp = $entry.name -replace 'HKEY_LOCAL_MACHINE', 'HKLM:' - $array += $temp - } - } - } - } - - $recurse = Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall' - - foreach ($entry in $recurse) { - foreach ($key in Get-ItemProperty -Path "Registry::$entry") { - if ($key.DisplayName -eq 'SolarWinds MSP RPC Server' -or $key.DisplayName -eq 'Request Handler Agent' -or $key.DisplayName -eq 'File Cache Service Agent' -or $key.DisplayName -eq 'Patch Management Service Controller' -or $key.DisplayName -eq 'SolarWinds MSP Patch Management Engine' -or $key.DisplayName -eq 'SolarWinds MSP Cache Service') { - $temp = $entry.name -replace 'HKEY_LOCAL_MACHINE', 'HKLM:' - $array += $temp - } - } - } - - foreach ($FolderLocation in $Array) { - if (Test-Path $FolderLocation) { - writeToLog I "$FolderLocation exists. Removing item..." - - try { - Remove-Item $folderLocation -Recurse -Force - } catch { - writeToLog I "The item $FolderLocation exists but cannot be removed automatically. Please remove manually." - $removalError = $error[0] - writeToLog E "Exception from removal attempt is: $removalError" - } - } else { - writeToLog W "$FolderLocation doesn't exist - moving on..." - } - } - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function killAgentProcesses() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - try { - $script:runningProcesses = Get-Process * -ErrorAction Stop | Where-Object { $_.Path -like 'C:\Program Files (x86)\N-able Technologies\Windows Agent\*' } | Select-Object Name,Path - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to detect running processes, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - If ($null -ne $runningProcesses) { - writeToLog W "Found following process(es):`r`n`t $($runningProcesses.Name)" - - foreach ($process in $runningProcesses) { - try { - $process | Stop-Process -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to stop the process: $process, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - foreach ($lockFile in Get-ChildItem -Path 'C:\Program Files (x86)\N-able Technologies\Windows Agent\*' -Include * -Recurse) { - foreach ($process in $runningProcesses) { - $process.Modules | Where-Object { $_.FileName -eq $lockFile } | Stop-Process -Force -ErrorAction SilentlyContinue - } - } - } Else { - writeToLog V 'No processes are running that are tied to the Windows Agent.' - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function cleanupAgent() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - try { - $script:agentPathTester = Test-Path $localFolder -ErrorAction SilentlyContinue - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to locate the Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - - If ($agentPathTester -eq $false) { - writeToLog I "Windows Agent installation folder ($localFolder) is not present." - } Else { - writeToLog I "Windows Agent folder is present ($localFolder), will attempt to remove." - - try { - Remove-Item $localFolder -Recurse -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - $script:agentFolder = Split-Path $localFolder - - $agentFolderExists = Test-Path $agentFolder - - If (($agentFolder -match '.+?\\$') -eq $false) { - $script:agentFolder = $agentFolder + '\' - } - - If ($agentFolderExists -eq $false) { - writeToLog I "Windows Agent folder ($agentFolder) is not present." - } Else { - writeToLog I "Windows Agent folder is present ($agentFolder), will attempt to remove." - - try { - Remove-Item $agentFolder -Recurse -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - $progDataFolder = 'C:\ProgramData\N-Able Technologies\Windows Agent\' - - $progDataPpathTester = Test-Path $progDataFolder - - If ($progDataPpathTester -eq $false) { - writeToLog I "Program Data folder ($progDataFolder) is not present." - } Else { - try { - Remove-Item $progDataFolder -Recurse -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove the ProgramData Windows Agent folder, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function verifyAssetTag() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - writeToLog I 'Checking if Asset tags exist.' - - $class = 'NCentralAssetTag' - $namespace = 'root\cimv2\NCentralAsset' - $wmiAssetTag = Get-WmiObject -Namespace $namespace -Class $class - - $wmiAssetTagLength = ($wmiAssetTag.UUID).length - - If ($wmiAssetTagLength -eq 0) { - writeToLog I 'WMI Asset Tag does not exist.' - } Else { - writeToLog I 'WMI Asset Tag present on device.' - writeToLog I "WMI Asset Tag entry: $($wmiAssetTag.UUID)" - } - - $path = 'HKLM:\SOFTWARE\N-able Technologies\NcentralAsset' - $name = 'NcentralAssetTag' - - try { - $regAssetTag = Get-ItemProperty -Path $path -Name $name -ErrorAction SilentlyContinue - } catch { - } - - $regAssetTagLength = ($regAssetTag.NcentralAssetTag).length - - If ($regAssetTagLength -eq 0) { - writeToLog I 'Registry Asset Tag does not exist.' - } Else { - writeToLog I 'Registry Asset Tag present on device.' - writeToLog I "Registry Asset Tag entry: $($regAssetTag.NcentralAssetTag)" - } - - $xmlAssetTag = 'C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml' - - If (Test-Path $xmlAssetTag) { - writeToLog I 'The NcentralAsset.xml exists on the device.' - } Else { - writeToLog I 'The NcentralAsset.xml does not on the device.' - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function cleanupAssetTag() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - writeToLog I 'Cleaning up Windows Agent Asset Tags.' - - $class = 'NCentralAssetTag' - $namespace = 'root\cimv2\NCentralAsset' - Get-WmiObject -Namespace $namespace -Class $class | Remove-WmiObject - - $path = 'HKLM:\SOFTWARE\N-able Technologies\NcentralAsset' - $name = 'NcentralAssetTag' - - try { - Remove-ItemProperty -Path $path -Name $name -Force -ErrorAction SilentlyContinue - } catch { - } - - If (Test-Path -LiteralPath 'C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml') { - try { - Remove-Item -Path 'C:\Program Files (x86)\N-able Technologies\NcentralAsset.xml' -Force -ErrorAction SilentlyContinue - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove NcentralAsset.xml, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - writeToLog I 'Successfully removed Asset Tags.' - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function cleanupTakeControl() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - writeToLog I 'Uninstalling Take Control silently.' - - If (Test-Path -LiteralPath 'C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe') { - try { - Start-Process -NoNewWindow -FilePath 'C:\Program Files (x86)\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe' -ArgumentList ' /S' - } catch { - writeToLog W 'Unable to find 64-bit installation, moving to 32-bit removal.' - } - writeToLog I 'Successfully Removed Take Control 64 bit.' - } ElseIf (Test-Path -LiteralPath 'C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe') { - Start-Process -NoNewWindow -FilePath 'C:\Program Files\BeAnywhere Support Express\GetSupportService_N-Central\uninstall.exe' -ArgumentList ' /S' - writeToLog I 'Successfully Removed Take Control 32 bit.' - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function cleanupConfigBackup() { - writeToLog V ('Started running {0} function.' -f $MyInvocation.MyCommand) - - writeToLog I 'Removing ConnectionString_Agent.xml.' - - $connectionStringXmlLocation = 'C:\Program Files (x86)\N-able Technologies\Windows Agent\config\ConnectionString_Agent.xml' - - If (Test-Path $connectionStringXmlLocation) { - try { - Remove-Item -Path $connectionStringXmlLocation -Force -ErrorAction Stop - } catch { - $msg = $_.Exception - $line = $_.InvocationInfo.ScriptLineNumber - writeToLog W "Failed to remove NcentralAsset.xml, due to:`r`n`t$($msg.Message)" - writeToLog V "This occurred on line number: $line" - writeToLog V "Status:`r`n`t$($msg.Status)`r`nResponse:`r`n`t$($msg.Response)`r`nInner Exception:`r`n`t$($msg.InnerException)`r`n`r`nHResult: $($msg.HResult)`r`n`r`nTargetSite and StackTrace:`r`n$($msg.TargetSite)`r`n$($msg.StackTrace)`r`n" - } - } Else { - writeToLog I 'File does not exist.' - } - - writeToLog V ('Completed running {0} function.' -f $MyInvocation.MyCommand) -} - -function writeToLog($state, $message) { - - $script:timestamp = '[{0:dd/MM/yy} {0:HH:mm:ss}]' -f (Get-Date) - - switch -regex -Wildcard ($state) { - 'I' { - $state = 'INFO' - $colour = 'Cyan' - } - 'E' { - $state = 'ERROR' - $colour = 'Red' - } - 'W' { - $state = 'WARNING' - $colour = 'Yellow' - } - 'F' { - $state = 'FAILURE' - $colour = 'Red' - } - 'C' { - $state = 'COMPLETE' - $colour = 'Green' - } - 'V' { - If ($verboseMode -eq $true) { - $state = 'VERBOSE' - $colour = 'Magenta' - } Else { - return - } - } - '' { - $state = 'INFO' - } - Default { - $state = 'INFO' - } - } - - Write-Host "$($timeStamp) - [$state]: $message" -ForegroundColor $colour - Write-Output "$($timeStamp) - [$state]: $message" | Out-File $logFilePath -Append -ErrorAction SilentlyContinue -} - -function main() { - setupLogging - validateUserInput - getAgentPath - - If ($agentPresent -eq $true) { - stopServices - runUninstaller - } - - writeToLog I 'Agent removed. Will now perform auxiliary cleanup.' - determinePMEVersion - - If ($legacyPME -eq $true) { - runPMEV1Uninstaller - } Else { - runPMEV2Uninstaller - } - - removeProcesses - removePMEServices - removePMEFoldersAndKeys - cleanupTakeControl - cleanupConfigBackup - killAgentProcesses - cleanupAgent - verifyAssetTag - cleanupAssetTag - verifyAssetTag -} -main diff --git a/src/n-sight/cleaners/edr-ecosystem.ps1 b/src/n-sight/edr-ecosystem.ps1 similarity index 97% rename from src/n-sight/cleaners/edr-ecosystem.ps1 rename to src/n-sight/edr-ecosystem.ps1 index 164deb37..4b8d4c4e 100644 --- a/src/n-sight/cleaners/edr-ecosystem.ps1 +++ b/src/n-sight/edr-ecosystem.ps1 @@ -15,7 +15,7 @@ This will enable verbose output. #> -# Requires -RunAsAdministrator +#Requires -RunAsAdministrator #Requires -Version 5.1 Param ( @@ -28,12 +28,10 @@ function parseInput() { If ($VerbosePreference) { Write-Host "[VERBOSE] Verbose mode enabled." } - - If ($dryrun) { + If ($dryrun) { # this is extra context after the error Write-Host "[DRY] Dry run mode enabled." } } - function installWinget() { If (Get-Command winget -ErrorAction SilentlyContinue) { Write-Host "Winget is already installed." From 11aeb5ce32e302587f26f76dc6e5f01d0028100c Mon Sep 17 00:00:00 2001 From: DaRacci Date: Thu, 20 Feb 2025 17:26:38 +1100 Subject: [PATCH 255/341] fix(tests): remove unnecessary PassThru parameter from Invoke-Pester --- .github/workflows/test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 1afdec8d..d08486f1 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -56,7 +56,7 @@ jobs: shell: pwsh run: | $Config = Import-PowerShellDataFile -Path "tests/PesterConfiguration.psd1"; - Invoke-Pester -Configuration $Config -PassThru + Invoke-Pester -Configuration $Config - name: Upload test results id: test-results From 8183edb7c7f81bcfe6defb379a28168a9f7a12e2 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 24 Feb 2025 15:19:40 +1100 Subject: [PATCH 256/341] fix(logging): update preference checks to use GetVariableValue for better handling --- src/common/Logging.psm1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/Logging.psm1 b/src/common/Logging.psm1 index e6cee4b4..1045d99c 100644 --- a/src/common/Logging.psm1 +++ b/src/common/Logging.psm1 @@ -233,7 +233,7 @@ function Invoke-Verbose { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '🔍' }; PSMessage = $Message; PSColour = 'Yellow'; - ShouldWrite = $VerbosePreference -ne 'SilentlyContinue'; + ShouldWrite = $PSCmdlet.GetVariableValue('VerbosePreference') -notmatch 'SilentlyContinue|Ignore'; PassThru = $PassThru; }; @@ -270,7 +270,7 @@ function Invoke-Debug { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '🐛' }; PSMessage = $Message; PSColour = 'Magenta'; - ShouldWrite = $DebugPreference -ne 'SilentlyContinue'; + ShouldWrite = $PSCmdlet.GetVariableValue('DebugPreference') -notmatch 'SilentlyContinue|Ignore'; PassThru = $PassThru; }; @@ -307,7 +307,7 @@ function Invoke-Info { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { 'ℹ️' }; PSMessage = $Message; PSColour = 'Cyan'; - ShouldWrite = $InformationPreference -ne 'Ignore'; + ShouldWrite = $PSCmdlet.GetVariableValue('InformationPreference') -ne 'Ignore' PassThru = $PassThru; }; @@ -344,7 +344,7 @@ function Invoke-Warn { PSPrefix = if ($UnicodePrefix) { $UnicodePrefix } else { '⚠️' }; PSMessage = $Message; PSColour = 'Yellow'; - ShouldWrite = $WarningPreference -ne 'SilentlyContinue'; + ShouldWrite = $PSCmdlet.GetVariableValue('WarningPreference') -notmatch 'SilentlyContinue|Ignore'; PassThru = $PassThru; }; From 6e34b3bb300bc85104c6b84dbad01ba164f045df Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 24 Feb 2025 15:50:18 +1100 Subject: [PATCH 257/341] feat: Generator for registry scripts from simple json definitions --- .github/workflows/compile-scripts.yaml | 5 +- .github/workflows/generate.yaml | 62 ++++++ .../schemas/RegistryDefinition.schema.jsonc | 111 ++++++++++ resources/templates/Registry.ps1 | 18 ++ src/automation/registry/Generate.ps1 | 209 ++++++++++++++++++ src/automation/registry/README.md | 84 +++++++ src/automation/registry/definitions/.gitkeep | 0 src/automation/registry/generated/.gitkeep | 0 src/common/Utils.psm1 | 71 +++++- .../Utils/ConvertTo-InvokableValue.Tests.ps1 | 83 +++++++ 10 files changed, 640 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/generate.yaml create mode 100644 resources/schemas/RegistryDefinition.schema.jsonc create mode 100644 resources/templates/Registry.ps1 create mode 100644 src/automation/registry/Generate.ps1 create mode 100644 src/automation/registry/README.md create mode 100644 src/automation/registry/definitions/.gitkeep create mode 100644 src/automation/registry/generated/.gitkeep create mode 100644 tests/common/Utils/ConvertTo-InvokableValue.Tests.ps1 diff --git a/.github/workflows/compile-scripts.yaml b/.github/workflows/compile-scripts.yaml index 64d4a051..28d94751 100644 --- a/.github/workflows/compile-scripts.yaml +++ b/.github/workflows/compile-scripts.yaml @@ -43,20 +43,21 @@ jobs: - name: Checkout uses: actions/checkout@v4 + # TODO - Use a git diff to determine which files were deleted - name: Delete Compiled versions of deleted files id: delete_files run: | for file in $(find compiled -type f); do no_prefix=${file#compiled/} if [ ! -f "src/${no_prefix}" ]; then - echo ::set-output name=found_deleted::true + echo "FOUND_DELETED=true" >> $GITHUB_OUTPUT echo "Found deleted src file ${no_prefix}, deleting compiled version." rm $file fi done - name: Commit Changes - if: ${{ steps.delete_files.outputs.found_deleted == 'true' && github.event_name == 'push' }} + if: ${{ steps.delete_files.outputs.FOUND_DELETED == 'true' && github.event_name == 'push' }} uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "chore(compiled): Remove compiled versions of deleted files" diff --git a/.github/workflows/generate.yaml b/.github/workflows/generate.yaml new file mode 100644 index 00000000..9d80e020 --- /dev/null +++ b/.github/workflows/generate.yaml @@ -0,0 +1,62 @@ +name: Generate Scripts + +on: + push: + branches: [master] + paths: ["src/automation/registry/Generate.ps1", "src/automation/registry/definitions/**/*.(json|jsonc)", ".github/workflows/generate.yaml"] + pull_request: + paths: ["src/automation/registry/Generate.ps1", "src/automation/registry/definitions/**/*.(json|jsonc)", ".github/workflows/generate.yaml"] + +jobs: + generate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Collect Changes + uses: dorny/paths-filter@v3.0.2 + id: changes + with: + list-files: shell + filters: | + definition: + - 'src/automation/registry/definitions/**/*.(json|jsonc)' + definition_deleted: + - deleted: 'src/automation/registry/definitions/**/*.(json|jsonc)' + + - name: Remove Deleted Definitions + id: delete_files + if: ${{ steps.changes.outputs.definition_deleted == 'true' }} + run: | + for file in $(find src/automation/registry/definitions -type f); do + no_prefix=${file#src/automation/registry/definitions/} + if [ ! -f "src/automation/registry/Generate.ps1" ]; then + echo "Found deleted definition file ${no_prefix}, deleting." + rm $file + fi + done + + DIR="src/automation/registry" + DEFINITIONS_DIR="${DIR}/definitions" + GENERATED_DIR="${DIR}/generated" + for file in $(find ${GENERATED_DIR} -type f); do + no_prefix=${file#${GENERATED_DIR}/} + without_extension=${no_prefix%.*} + fullWithoutExtension="${DEFINITIONS_DIR}/${without_extension}" + if [ ! -f "$fullWithoutExtension.json" ] && [ ! -f "$fullWithoutExtension.jsonc" ]; then + echo "FOUND_DELETED=true" >> $GITHUB_OUTPUT + echo "Found deleted generated file ${no_prefix}, deleting." + rm $file + fi + done + echo "Cleanup completed." + + - name: Execute Generate Script + if: ${{ steps.changes.outputs.definition == 'true' }} + run: pwsh src/automation/registry/Generate.ps1 + + - name: Commit Changes + if: ${{ (steps.changes.outputs.definition == 'true' || steps.delete_files.outputs.FOUND_DELETED == 'true') && github.event_name == 'push' }} + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore(Generated): Update generated scripts" diff --git a/resources/schemas/RegistryDefinition.schema.jsonc b/resources/schemas/RegistryDefinition.schema.jsonc new file mode 100644 index 00000000..24702c88 --- /dev/null +++ b/resources/schemas/RegistryDefinition.schema.jsonc @@ -0,0 +1,111 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/AMTSupport/scripts/main/resources/schemas/RegistryDefinition.json", + "type": "object", + "definitions": { + "RegistryType": { + "type": "string", + "description": "Type of the registry value", + "enum": [ + "String", + "ExpandString", + "Binary", + "DWord", + "MultiString", + "QWord" + ] + }, + "RegistryPath": { + "type": "string", + "description": "Path of the registry key", + "patternProperties": { + "^(HKCU|HKLM)\\:\\\\[a-zA-Z0-9_\\-\\\\]+": {}, + "^(HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE)\\[a-zA-Z0-9_\\-\\\\]+": {} + } + }, + "RegistryKey": { + "type": "string", + "description": "Name of the registry key", + "pattern": "^[a-zA-Z0-9_\\-\\\\]+" + }, + "RegistryEntry": { + "type": "object", + "additionalProperties": false, + "properties": { + "Path": { + "$ref": "#/definitions/RegistryPath", + "description": "Path of the registry key" + }, + "Key": { + "$ref": "#/definitions/RegistryKey", + "description": "Name of the registry key" + }, + "Type": { + "$ref": "#/definitions/RegistryType", + "description": "Type of the registry key" + }, + "Value": { + "type": [ + "boolean", + "number", + "string", + "null", + "integer" + ], + "description": "Value of the registry key; If the value is null, the key will be deleted" + }, + "Validate": { + "type": "string", + "description": "A powershell script that will be executed against the value of the registry key to validate it; The key value will be passed as $PSItem", + "contentMediaType": "text/powershell" + } + }, + "required": [ + "Path", + "Key", + "Type" + ], + "allOf": [ + { + "if": { + "properties": { + "Value": { + "not": true, + "type": "null" + } + } + }, + "then": { + "required": [ + "Type" + ] + } + }, + { + "if": { + "properties": { + "Value": { + "type": "boolean" + } + } + }, + "then": { + "properties": { + "Type": { + "default": "DWord" + } + } + } + } + ] + } + }, + "properties": { + "entries": { + "type": "array", + "items": { + "$ref": "#/definitions/RegistryEntry" + } + } + } +} diff --git a/resources/templates/Registry.ps1 b/resources/templates/Registry.ps1 new file mode 100644 index 00000000..d3405175 --- /dev/null +++ b/resources/templates/Registry.ps1 @@ -0,0 +1,18 @@ +<# +.SYNOPSIS + This is a template file for the generated registry scripts. + +.NOTES + The marker <#REGISTRY_EDITS#\> will be replaced with the content for changing the registry. + The marker <#SRC#\> will be replaced with the scripts location to src. +#> + +using module <#SRC#>/common/Registry.psm1 +using module <#SRC#>/common/Environment.psm1 + +[CmdletBinding()] +param() + +Invoke-RunMain $PSCmdlet { + <#REGISTRY_EDITS#> +} diff --git a/src/automation/registry/Generate.ps1 b/src/automation/registry/Generate.ps1 new file mode 100644 index 00000000..003c909d --- /dev/null +++ b/src/automation/registry/Generate.ps1 @@ -0,0 +1,209 @@ +<# +.SYNOPSIS + Generates a PowerShell script to apply registry changes defined in JSON. + +.DESCRIPTION + This script reads JSON files from a folder and generates PowerShell scripts to apply the registry changes. + +.PARAMETER DefinitionPath + The container where the JSON definition files are located. + +.PARAMETER OutputPath + The container to save the generated PowerShell scripts. + +.PARAMETER Template + The template to use for the generated scripts. + This template should contain the markers <#REGISTRY_EDITS#\> and <#SRC#\>. + +.OUTPUTS + System.Void +#> + +using module ..\..\common\Logging.psm1 +using module ..\..\common\Registry.psm1 +using module ..\..\common\Environment.psm1 +using module ..\..\common\Utils.psm1 + +[CmdletBinding()] +param( + [Parameter()] + [ValidateScript({ Test-Path -Path $_ -PathType Container })] + [String]$DefinitionPath = "$PSScriptRoot/definitions", + + [Parameter()] + [String]$OutputPath = "$PSScriptRoot/generated", + + [Parameter()] + [ValidateScript({ Test-Path -Path $_ -PathType Leaf })] + [String]$Template = "$PSScriptRoot/../../../resources/templates/Registry.ps1" +) + +$REGISTRY_EDIT_MARKER = '<#REGISTRY_EDITS#>' +$SRC_MARKER = '<#SRC#>' + +<# +.SYNOPSIS + Creates the powershell code to apply a registry change. + +.PARAMETER Path + The registry path to modify. + +.PARAMETER Name + The name of the registry value to modify. + +.PARAMETER Value + The value to set. + +.PARAMETER Type + The type of the registry value to set. + +.OUTPUTS + System.String +#> +function New-RegistryAction { + [CmdletBinding()] + [OutputType([String])] + param( + [Parameter(Mandatory)] + [String]$Path, + + [Parameter(Mandatory)] + [String]$Key, + + [Parameter(Mandatory)] + [AllowNull()] + [Object]$Value, + + [Parameter(Mandatory)] + [String]$Type + ) + + $Before = @" +`$Value = $(ConvertTo-InvokableValue $Value); +`$Type = $(ConvertTo-InvokableValue $Type); +`$Path = $(ConvertTo-InvokableValue $Path); +`$Key = $(ConvertTo-InvokableValue $Key); +Get-RegistryKey -Path `$Path -Name `$Key -ErrorAction SilentlyContinue; +"@ + + if ($null -eq $Value) { + $Script = @" +$Before +if ($null -ne `$CurrentValue) { + Invoke-Verbose "Deleting registry value: Path=`$Path, Name=`$Key" + Remove-RegistryKey -Path `$Path -Key `$Key +} else { + Invoke-Verbose "Registry value already removed: Path=`$Path, Name=`$Key" +} +"@ + } else { + $Script = @" +$Before +if (`$CurrentValue -ne `$Value) { + Invoke-Verbose "Changing registry value: Path=`$Path, Name=`$Key, From=`$CurrentValue, To=`$Value" + Set-RegistryKey -Path `$Path -Key `$Key -Value `$Value -Type `$Type +} else { + Invoke-Verbose "Registry value already set correctly: Path=`$Path, Name=`$Key, Value=`$Value" +} +"@ + } + + return $Script +} + +<# +.SYNOPSIS + Converts a JSON definition file into a list of registry actions. + +.PARAMETER Definition + The path to the JSON definition file. + +.OUTPUTS + System.Collections.Generic.List[System.String] +#> +function Convert-RegistryDefinition { + [CmdletBinding()] + [OutputType([System.Collections.Generic.List[System.String]])] + param( + [Parameter(Mandatory)] + [ValidateScript({ (Test-Path -Path $_ -PathType Leaf) -and ($_ -match '\.jsonc?$') })] + [String]$Definition + ) + + $Actions = [System.Collections.Generic.List[System.String]]::new() + $Definitions = Get-Content -Path $Definition -Raw | ConvertFrom-Json + + foreach ($Entry in $Definitions.Entries) { + if ($null -eq $Entry.Path -or $null -eq $Entry.Key) { + Invoke-Warn "Missing required properties in entry: $($Entry | ConvertTo-Json)" + continue + } + + $Action = New-RegistryAction -Path $Entry.Path -Key $Entry.Key -Value $Entry.Value -Type $Entry.Type + $Actions.Add($Action) + } + + + Invoke-Verbose "Processed $($Actions.Count) registry actions." + return $Actions -join ([Environment]::NewLine) +} + +# TODO - Nested folder support +# TODO - Add hash of definition to prevent reprocessing +Invoke-RunMain $PSCmdlet { + if (-not (Test-Path -Path $OutputPath)) { + New-Item -Path $OutputPath -ItemType Directory | Out-Null + } + + $TemplateContent = Get-Content -Path $Template -Raw; + $JsonFiles = Get-ChildItem -Path $DefinitionPath -Filter '*.json?' -File + $DefinitionPathRelativeToRoot = Resolve-Path -Path $DefinitionPath -Relative -RelativeBasePath $PSScriptRoot/../..; + $SrcToRoot = Resolve-Path -Path $PSScriptRoot/../.. -Relative -RelativeBasePath $PSScriptRoot/generated; + $TemplateContent = $TemplateContent -replace $SRC_MARKER, $SrcToRoot; + $Disclaimer = @" +#!ignore +# This script is auto-generated from Generate.ps1 using the definitions in $DefinitionPathRelativeToRoot +"@; + + if ($JsonFiles.Count -eq 0) { + Invoke-Warn "No definition files found in $DefinitionPath" + return + } + + foreach ($JsonFile in $JsonFiles) { + $Actions = Convert-RegistryDefinition -Definition $JsonFile.FullName + + $ScriptContent = [System.Text.StringBuilder]::new() + $ScriptContent.AppendLine($Disclaimer) | Out-Null; + $ScriptContent.AppendLine("# Script generated from $JsonFile") | Out-Null; + + $IndexOfRegEdits = $TemplateContent.IndexOf($REGISTRY_EDIT_MARKER); + if ($IndexOfRegEdits -eq -1) { + Invoke-Warn "Template does not contain the marker $REGISTRY_EDIT_MARKER" + exit 1 + } + + $IndentLevel = ($TemplateContent.Substring(0, $IndexOfRegEdits) -split "`n" | Select-Object -Last 1).Length - ($TemplateContent.Substring(0, $IndexOfRegEdits) -split "`n" | Select-Object -Last 1).TrimStart().Length + $Indent = ' ' * $IndentLevel + + $ScriptContent.Append($TemplateContent.Substring(0, $IndexOfRegEdits)) | Out-Null; + $FirstLine = $True; + $Actions -split "`n" | ForEach-Object { + if ($FirstLine) { + $FirstLine = $False; + } else { + $ScriptContent.Append($Indent) | Out-Null; + } + + $ScriptContent.AppendLine($_) | Out-Null; + } + $ScriptContent.Append($TemplateContent.Substring($IndexOfRegEdits + $REGISTRY_EDIT_MARKER.Length)) | Out-Null; + $OutputScript = Join-Path -Path $OutputPath -ChildPath ($JsonFile.BaseName + '.ps1'); + + Invoke-Verbose "Processing complete for $JsonFile" + $ScriptContent.ToString() | Set-Content -Path $OutputScript -Encoding UTF8; + Invoke-Verbose "Registry script generated at $OutputScript" + } + + Invoke-Verbose "All JSON files processed successfully." +} diff --git a/src/automation/registry/README.md b/src/automation/registry/README.md new file mode 100644 index 00000000..e7671809 --- /dev/null +++ b/src/automation/registry/README.md @@ -0,0 +1,84 @@ +# Registry Change Scripts + +Provides a way to generate registry change scripts based on simple definitions. +Using the [json schema](../../../resources/schemas/RegistryDefinition.schema.jsonc) to define the registry changes, the scripts can be generated to apply the changes. + +--- + +## Definitions + +A simple definition may look like this: + +```jsonc +{ + "$schema": "../../../../resources/schemas/RegistryDefinition.schema.jsonc", + "entries": [ + { + "key": "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", + "values": [ + { + "name": "EnableLUA", + "type": "REG_DWORD", + "data": 0 + } + ] + } + ] +} +``` + +This definition will generate a script that will set the `EnableLUA` value to `0` in the `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System` key. + +You can declare multiple registry changes in a single definition by adding more entries to the `entries` array: + +```jsonc +{ + "$schema": "../../../../resources/schemas/RegistryDefinition.schema.jsonc", + "entries": [ + { + "key": "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", + "values": [ + { + "name": "EnableLUA", + "type": "REG_DWORD", + "data": 0 + } + ] + }, + { + "key": "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", + "values": [ + { + "name": "ConsentPromptBehaviorAdmin", + "type": "REG_DWORD", + "data": 0 + } + ] + } + ] +} +``` + +--- + +## Generation + +To generate the scripts from the definitions, the [Generate.ps1](./Generate.ps1) script is used. +This script will read the definitions from the [definitions](./definitions/) folder and generate the scripts in the [generated](./generated/) folder. +The script itself has no parameters and has the definitions and output folder based on where the script is located. + +--- + +## Structure + +- [definitions](./definitions/): Contains the descriptions used to generate the registry change scripts. +- [generated](./generated/): The output folder where the generated registry change scripts are stored. + +--- + +## Usage + +1. Add or update descriptions in the [definitions](./definitions/) folder. +2. Run the script generation tool to create the registry change scripts based on the templates and descriptions. + - This will be run automatically by the CI/CD pipeline if pushed to the master branch. +3. The generated scripts will be available in the [generated](./generated/) folder. diff --git a/src/automation/registry/definitions/.gitkeep b/src/automation/registry/definitions/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/automation/registry/generated/.gitkeep b/src/automation/registry/generated/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/common/Utils.psm1 b/src/common/Utils.psm1 index befce60b..b1b2803d 100644 --- a/src/common/Utils.psm1 +++ b/src/common/Utils.psm1 @@ -1120,6 +1120,75 @@ function Get-ContentEncoding { } } +<# +.SYNOPSIS + Converts a value into something that can be embedded into a string and will return the original value when evaluated. + +.DESCRIPTION + Functionally this uses ConvertTo-Json under the hood, except for the following types: + - Boolean: Will be converted to $True or $False. + - Null: Will be converted to $null. + - Hashtable: Will be converted to @{ ... }. + - Array: Will be converted to @(...). + - PSCustomObject: Will be converted to [PSCustomObject]@{ ... }. + - ScriptBlock: Will be converted to { ... }. + +.OUTPUTS + [String] + The string representation of the value. + +.EXAMPLE + Convert a value to a string. + ```powershell + $Value = $False; + $InvokableValue = ConvertTo-InvokableValue -Value $Value; + (Invoke-Expression $InvokableValue) -eq $Value; + ``` +#> +function ConvertTo-InvokableValue { + [CmdletBinding()] + [OutputType([String])] + param( + [Parameter(Mandatory)] + [AllowNull()] + [Object]$Value + ) + + process { + if ($null -eq $Value) { return '$null' }; + + $Type = $Value.GetType(); + + if ($Type -eq [Boolean]) { + return "`$$Value"; + } elseif ($Type -eq [Object[]]) { + $Array = @(); + foreach ($Element in $Value) { + $Array += ConvertTo-InvokableValue -Value $Element; + } + + return '@(' + ($Array -join ', ') + ')'; + } elseif ($Type -eq [Hashtable]) { + $Hashtable = @(); + foreach ($Key in $Value.Keys) { + $Hashtable += "$Key = $(ConvertTo-InvokableValue -Value $Value[$Key])"; + } + + return '@{' + ($Hashtable -join '; ') + '}'; + } elseif ($Type -eq [PSCustomObject]) { + $Hashtable = @(); + foreach ($Property in $Value.PSObject.Properties) { + $Hashtable += "$($Property.Name)=$(ConvertTo-InvokableValue -Value $Property.Value)"; + } + + return "[PSCustomObject]@{" + ($Hashtable -join '; ') + '}'; + } + + + return ConvertTo-Json -InputObject $Value; + } +} + Export-ModuleMember ` - -Function Test-IsWindows11, Get-ContentEncoding, Remove-EncodingBom, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag ` + -Function ConvertTo-InvokableValue, Test-IsWindows11, Get-ContentEncoding, Remove-EncodingBom, Get-VarOrSave, Get-Ast, Get-ReturnType, Test-ReturnType, Test-Parameters, Install-ModuleFromGitHub, Test-NetworkConnection, Wait-Task, Start-AsyncTask, Add-LazyProperty, Set-LazyVariable, Test-IsRunningAsSystem, Get-BlobCompatableHash, Compare-FileHashToS3ETag, Get-ETag ` -Alias await, async, lazy; diff --git a/tests/common/Utils/ConvertTo-InvokableValue.Tests.ps1 b/tests/common/Utils/ConvertTo-InvokableValue.Tests.ps1 new file mode 100644 index 00000000..f51335ac --- /dev/null +++ b/tests/common/Utils/ConvertTo-InvokableValue.Tests.ps1 @@ -0,0 +1,83 @@ +[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingInvokeExpression', '', Justification = 'Required for testing')] +param() + +BeforeDiscovery { Import-Module -Name "$PSScriptRoot/../../../src/common/Utils.psm1" } +AfterAll { Remove-Module Utils } + +Describe 'ConvertTo-InvokableValue tests' { + It 'Should return "$null" for null input' { + $Result = ConvertTo-InvokableValue -Value $null + $Result | Should -Be '$null' + + Invoke-Expression $Result | Should -Be $null + } + + It 'Should return "$True" for boolean True input' { + $Value = $True + $Result = ConvertTo-InvokableValue -Value $Value + $Result | Should -Be '$True' + Invoke-Expression $Result | Should -Be $Value + } + + It 'Should return "$False" for boolean False input' { + $Value = $False + $Result = ConvertTo-InvokableValue -Value $Value + $Result | Should -Be '$False' + Invoke-Expression $Result | Should -Be $Value + } + + It 'Should return JSON string for string input' { + $Value = 'Hello, World!' + $Result = ConvertTo-InvokableValue -Value $Value; + $Result | Should -Be '"Hello, World!"' + Invoke-Expression $Result | Should -Be $Value + } + + It 'Should return JSON string for integer input' { + $Value = 123 + $Result = ConvertTo-InvokableValue -Value $Value + $Result | Should -Be '123' + Invoke-Expression $Result | Should -Be $Value + } + + It 'Should return JSON string for array input' { + $Value = @(1, 2, 3) + $Result = ConvertTo-InvokableValue -Value $Value + $Result | Should -Be '@(1, 2, 3)' + Invoke-Expression $Result | Should -Be $Value + } + + Context 'Hashtable Conversions' { + It 'Should return JSON string for hashtable input' { + $Value = @{ Key = 'Value' } + $Result = ConvertTo-InvokableValue -Value $Value + $Result | Should -Be '@{Key = "Value"}' + $Result = Invoke-Expression $Result + $Result.Keys | Should -Be $Value.Keys + $Result.Values | Should -Be $Value.Values + } + + It 'Should return JSON string for nested hashtable input' { + $Value = @{ OuterKey = @{ InnerKey = 'InnerValue' } } + $Result = ConvertTo-InvokableValue -Value $Value + $Result | Should -Be '@{OuterKey = @{InnerKey = "InnerValue"}}' + Invoke-Expression $Result | ConvertTo-Json | Should -Be ($Value | ConvertTo-Json) + } + + It 'Should handle empty hashtable input' { + $Value = @{} + $Result = ConvertTo-InvokableValue -Value $Value + $Result | Should -Be '@{}' + $Result = Invoke-Expression $Result + $Result.Keys | Should -BeNullOrEmpty + $Result.Values | Should -BeNullOrEmpty + } + + It 'Should return JSON string for hashtable with multiple entries' { + $Value = @{ Key1 = 'Value1'; Key2 = 'Value2' } + $Result = ConvertTo-InvokableValue -Value $Value + $Result | Should -Be '@{Key1 = "Value1"; Key2 = "Value2"}' + Invoke-Expression $Result | ConvertTo-Json | Should -Be ($Value | ConvertTo-Json) + } + } +} From 92507624f01ae587f4df858e4f451796f6be47da Mon Sep 17 00:00:00 2001 From: DaRacci Date: Mon, 24 Feb 2025 15:58:13 +1100 Subject: [PATCH 258/341] docs: Update README.md --- README.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 605b3338..469668e9 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,16 @@ Welcome to the AMTSupport's scripts repository. This repository contains a colle - [Maintainers](#maintainers) - [License](#license) - --- ## Folder Structure -- [**compiled**](./compiled/): Contains compiled versions of the scripts for easy use. +- [**compiled**](./compiled/): Contains compiled versions of the scripts for usage outside of the repository. - [**src**](./src): Contains the source code for all the scripts. + - [**Compiler**](./src/Compiler): Contains the C# Compiler which is used to compile the scripts. + - [**Common**](./src/common): Contains common utility modules. + - [**External**](./src/external): Contains scripts that are from external sources which are patched or modified. + - [**Automation/Registry**](./src/automation/registry): Contains generated registry scripts. - [**tests**](./tests): Test scripts and test data for ensuring script reliability. - [**utils**](./utils): Utility scripts that assist in development and maintenance. @@ -30,25 +33,24 @@ Welcome to the AMTSupport's scripts repository. This repository contains a colle ## Getting Started -To get started with these scripts, you need to clone this repository to your local machine. Use the following command: +### One-Liner usage -````sh -git clone https://github.com/AMTSupport/scripts.git -cd scripts +If you know which script you are trying to run, you can use this one-liner to download and execute it directly from the repository: -./compiled/the-script-you-want-to-run.ps1 -```` +```powershell +Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/AMTSupport/scripts/master/src/compiled/

      `f(AI@y3TfGY?%V0_k*AUdP(U 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 z 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 z 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%0AIQ9dwk|@WHW>1f%&RqOyR1@m1 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 literal 0 HcmV?d00001 From 64725f9f67fa40bb61b01544f1fd8d0f4ec64883 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 6 Sep 2024 16:58:23 +1000 Subject: [PATCH 138/341] fix(Compiler): Not exiting when finished. Was just me pulling a dumb and trying to use dispose in a fucking static method. --- src/Compiler/Module/Compiled/Script.cs | 7 +------ src/Compiler/Module/Resolvable/Resolvable.cs | 2 +- src/Compiler/Program.cs | 10 ++++------ 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 521fcf4c..4767fb95 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -47,11 +47,6 @@ RequirementGroup requirements // Add the parent-child relationships to each module. this.Graph.EdgeAdded += edge => edge.Target.Parents.Add(edge.Source); var thisGraph = resolvableParent.GetGraphFromRoot(thisResolvable); - var dotGraph = thisGraph.ToGraphviz(alg => { - alg.FormatVertex += (sender, args) => args.VertexFormat.Label = args.Vertex.ModuleSpec.Name; - }); - Logger.Debug($"Graph for {thisResolvable.ModuleSpec.Name}:\n{dotGraph}"); - var loadOrder = thisGraph.TopologicalSort(); var reversedLoadOrder = loadOrder.Reverse(); Task.WhenAll(reversedLoadOrder.Select(async resolvable => { @@ -73,7 +68,7 @@ RequirementGroup requirements } else { this.Graph.AddVertex(compiledModule); } - })).Wait(); + })).Wait(10000); this.Graph.Vertices.Where(compiled => compiled is CompiledLocalModule).ToList().ForEach(compiled => { var imports = this.Graph.OutEdges(compiled).Select(edge => edge.Target); diff --git a/src/Compiler/Module/Resolvable/Resolvable.cs b/src/Compiler/Module/Resolvable/Resolvable.cs index 6deefdd6..b0b4bd71 100644 --- a/src/Compiler/Module/Resolvable/Resolvable.cs +++ b/src/Compiler/Module/Resolvable/Resolvable.cs @@ -330,7 +330,7 @@ private async Task ResolveDepedencyGraph() { if (!safeWorkingResolvable.RequirementsResolved) { if (iterating.Count == 0) { Logger.Debug("Requirements not resolved, waiting for them to be resolved."); - await safeWorkingResolvable.RequirementsWaitHandle.WaitOneAsync(-1, Program.CancelSource.Token); + await safeWorkingResolvable.RequirementsWaitHandle.WaitOneAsync(10000, Program.CancelSource.Token); } else { Logger.Debug("Requirements not resolved, pushing to the end of the queue."); iterating.Enqueue((parentResolvable, workingModuleSpec)); diff --git a/src/Compiler/Program.cs b/src/Compiler/Program.cs index 38fd69a6..cc1828f2 100644 --- a/src/Compiler/Program.cs +++ b/src/Compiler/Program.cs @@ -178,6 +178,10 @@ private static async Task Main(string[] args) { return 1; } + RunspacePool.Value.Close(); + RunspacePool.Value.Dispose(); + LogManager.Shutdown(); + return result; } @@ -407,10 +411,4 @@ internal static Fin> RunPowerShell(string script, params ob return FinSucc(result); } - - ~Program() { - RunspacePool.Value.Close(); - RunspacePool.Value.Dispose(); - LogManager.Shutdown(); - } } From bdd5ac10d364389103f543acde4e7df7880d9f4a Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 6 Sep 2024 17:14:44 +1000 Subject: [PATCH 139/341] fix(Compiler): Error when no script has no module dependencies. --- src/Compiler/Module/Compiled/Script.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Compiler/Module/Compiled/Script.cs b/src/Compiler/Module/Compiled/Script.cs index 4767fb95..4654b5ff 100644 --- a/src/Compiler/Module/Compiled/Script.cs +++ b/src/Compiler/Module/Compiled/Script.cs @@ -106,11 +106,13 @@ public override string GetPowerShellObject() { paramBlock.AppendLine("[CmdletBinding()]\nparam()"); } - var importOrder = this.Graph.TopologicalSort() - .Skip(1) // Skip the root node. - .Reverse() - .Select(module => $"'{module.GetNameHash()}'") - .Aggregate((a, b) => $"{a}, {b}"); + var importOrder = this.Graph.VertexCount > 1 + ? this.Graph.TopologicalSort() + .Skip(1) // Skip the root node. + .Reverse() + .Select(module => $"'{module.ModuleSpec.Name}'") + .Aggregate((a, b) => $"{a}, {b}") + : string.Empty; // TODO - Implement a way to replace #!DEFINE macros in the template. // This could also be how we can implement secure variables during compilation. From 926c775c89b8d02f02c6758e246b78b06f6ad1a3 Mon Sep 17 00:00:00 2001 From: DaRacci Date: Fri, 6 Sep 2024 17:41:40 +1000 Subject: [PATCH 140/341] fix(Compiler): Compare functions ignore case --- src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs index 05a033eb..cfeab527 100644 --- a/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs +++ b/src/Compiler/Analyser/Rules/UseOfUndefinedFunction.cs @@ -28,7 +28,7 @@ public override bool ShouldProcess( return !supressions.Any(supression => { switch (supression.Data) { case IEnumerable functions: - return functions.Contains(callName); + return functions.Any(function => function.Equals(callName, StringComparison.OrdinalIgnoreCase)); case string function: return function == callName; default: @@ -44,8 +44,8 @@ public override IEnumerable Analyse( var commandAst = (CommandAst)node; var callName = SanatiseName(commandAst.GetCommandName()); if (BuiltinsFunctions.Contains(callName)) yield break; - if (AstHelper.FindAvailableFunctions(AstHelper.FindRoot(node), false).Select(definition => SanatiseName(definition.Name)).Any(name => name == callName)) yield break; - if (importedModules.Any(module => module.GetExportedFunctions().Contains(callName))) yield break; + if (AstHelper.FindAvailableFunctions(AstHelper.FindRoot(node), false).Select(definition => SanatiseName(definition.Name)).Contains(callName)) yield break; + if (importedModules.Any(module => module.GetExportedFunctions().Select(SanatiseName).Contains(callName))) yield break; yield return Issue.Warning( $"Undefined function '{callName}'", @@ -58,7 +58,7 @@ public static string SanatiseName(string name) { var withOutExtension = name.Contains('.') ? name.Split('.').First() : name; var withoutScope = withOutExtension.Contains(':') ? withOutExtension.Split(':').Last() : withOutExtension; - return withoutScope; + return withoutScope.ToLowerInvariant(); } ///

      Y(kJT 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[ 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%0AUS;C3c380_)OlOQ-jnDP9FKITb{B*_3rN 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%0DZH*!P1~?Pqi&F_+=qZ?yZQFxo1PWRj31n@ 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℞LD6@*`@>i@0E;sv(M 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