From 1970b700482b76b6733f0d17efd510cad02a6831 Mon Sep 17 00:00:00 2001 From: Kaleb Luedtke Date: Tue, 5 Nov 2024 11:22:55 -0600 Subject: [PATCH 1/6] Add Spellchecking to Repository (#110) * Add base spellchecking files * Fix extra dictionaries * Move files into correct folder * Fix some spellings * Try the latest version * Add more patterns and fix some spellings * Remove files that were accidentally added --- .github/actions/spelling/README.md | 17 + .github/actions/spelling/advice.md | 25 + .github/actions/spelling/allow.txt | 39 ++ .github/actions/spelling/candidate.patterns | 527 ++++++++++++++++++ .github/actions/spelling/excludes.txt | 65 +++ .../actions/spelling/expect/generic_terms.txt | 12 + .github/actions/spelling/expect/software.txt | 8 + .github/actions/spelling/expect/usernames.txt | 4 + .../actions/spelling/expect/windows_terms.txt | 15 + .../actions/spelling/line_forbidden.patterns | 62 +++ .github/actions/spelling/patterns.txt | 70 +++ .github/actions/spelling/reject.txt | 10 + .github/workflows/spellCheck.yaml | 117 ++++ .../Microsoft.VSCode.Dsc/VSCodeExtension.md | 4 +- .../Microsoft.WindowsSandbox.DSC.psm1 | 18 +- resources/NpmDsc/NpmDsc.psm1 | 2 +- resources/PythonPip3Dsc/PythonPip3Dsc.psm1 | 20 +- ...ft.Windows.Setting.Accessibility.Tests.ps1 | 40 +- 18 files changed, 1013 insertions(+), 42 deletions(-) create mode 100644 .github/actions/spelling/README.md create mode 100644 .github/actions/spelling/advice.md create mode 100644 .github/actions/spelling/allow.txt create mode 100644 .github/actions/spelling/candidate.patterns create mode 100644 .github/actions/spelling/excludes.txt create mode 100644 .github/actions/spelling/expect/generic_terms.txt create mode 100644 .github/actions/spelling/expect/software.txt create mode 100644 .github/actions/spelling/expect/usernames.txt create mode 100644 .github/actions/spelling/expect/windows_terms.txt create mode 100644 .github/actions/spelling/line_forbidden.patterns create mode 100644 .github/actions/spelling/patterns.txt create mode 100644 .github/actions/spelling/reject.txt create mode 100644 .github/workflows/spellCheck.yaml diff --git a/.github/actions/spelling/README.md b/.github/actions/spelling/README.md new file mode 100644 index 00000000..1f699f3d --- /dev/null +++ b/.github/actions/spelling/README.md @@ -0,0 +1,17 @@ +# check-spelling/check-spelling configuration + +File | Purpose | Format | Info +-|-|-|- +[dictionary.txt](dictionary.txt) | Replacement dictionary (creating this file will override the default dictionary) | one word per line | [dictionary](https://github.com/check-spelling/check-spelling/wiki/Configuration#dictionary) +[allow.txt](allow.txt) | Add words to the dictionary | one word per line (only letters and `'`s allowed) | [allow](https://github.com/check-spelling/check-spelling/wiki/Configuration#allow) +[reject.txt](reject.txt) | Remove words from the dictionary (after allow) | grep pattern matching whole dictionary words | [reject](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-reject) +[excludes.txt](excludes.txt) | Files to ignore entirely | perl regular expression | [excludes](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-excludes) +[only.txt](only.txt) | Only check matching files (applied after excludes) | perl regular expression | [only](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-only) +[patterns.txt](patterns.txt) | Patterns to ignore from checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns) +[candidate.patterns](candidate.patterns) | Patterns that might be worth adding to [patterns.txt](patterns.txt) | perl regular expression with optional comment block introductions (all matches will be suggested) | [candidates](https://github.com/check-spelling/check-spelling/wiki/Feature:-Suggest-patterns) +[line_forbidden.patterns](line_forbidden.patterns) | Patterns to flag in checked lines | perl regular expression (order matters, first match wins) | [patterns](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-patterns) +[expect.txt](expect.txt) | Expected words that aren't in the dictionary | one word per line (sorted, alphabetically) | [expect](https://github.com/check-spelling/check-spelling/wiki/Configuration#expect) +[advice.md](advice.md) | Supplement for GitHub comment when unrecognized words are found | GitHub Markdown | [advice](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples%3A-advice) + +Note: you can replace any of these files with a directory by the same name (minus the suffix) +and then include multiple files inside that directory (with that suffix) to merge multiple files together. diff --git a/.github/actions/spelling/advice.md b/.github/actions/spelling/advice.md new file mode 100644 index 00000000..1004eeaa --- /dev/null +++ b/.github/actions/spelling/advice.md @@ -0,0 +1,25 @@ + +
If the flagged items are :exploding_head: false positives + +If items relate to a ... +* binary file (or some other file you wouldn't want to check at all). + + Please add a file path to the `excludes.txt` file matching the containing file. + + File paths are Perl 5 Regular Expressions - you can [test]( +https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your files. + + `^` refers to the file's path from the root of the repository, so `^README\.md$` would exclude [README.md]( +../tree/HEAD/README.md) (on whichever branch you're using). + +* well-formed pattern. + + If you can write a [pattern](https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns) that would match it, + try adding it to the `patterns.txt` file. + + Patterns are Perl 5 Regular Expressions - you can [test]( +https://www.regexplanet.com/advanced/perl/) yours before committing to verify it will match your lines. + + Note that patterns can't match multiline strings. + +
diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt new file mode 100644 index 00000000..ab83a805 --- /dev/null +++ b/.github/actions/spelling/allow.txt @@ -0,0 +1,39 @@ +admins +apps +appwiz +appx +arp +checkbox +checkboxes +cla +codeowner +codeowners +github +https +Icm +microsoft +MSFT +msftbot +numpy +opencode +opensource +toolset +UAC +unassign +ubuntu +uninstall +uninstaller +uninstalls +upvote +website +winget +workflows +yml +gitversion +globaltool +nonexistentpackage +inaries +prerel +uilt +Windo +ELSPROBLEMS diff --git a/.github/actions/spelling/candidate.patterns b/.github/actions/spelling/candidate.patterns new file mode 100644 index 00000000..6671c8b7 --- /dev/null +++ b/.github/actions/spelling/candidate.patterns @@ -0,0 +1,527 @@ +# marker to ignore all code on line +^.*/\* #no-spell-check-line \*/.*$ +# marker to ignore all code on line +^.*\bno-spell-check(?:-line|)(?:\s.*|)$ + +# https://cspell.org/configuration/document-settings/ +# cspell inline +^.*\b[Cc][Ss][Pp][Ee][Ll]{2}:\s*[Dd][Ii][Ss][Aa][Bb][Ll][Ee]-[Ll][Ii][Nn][Ee]\b + +# patch hunk comments +^\@\@ -\d+(?:,\d+|) \+\d+(?:,\d+|) \@\@ .* +# git index header +index [0-9a-z]{7,40}\.\.[0-9a-z]{7,40} + +# cid urls +(['"])cid:.*?\g{-1} + +# data url in parens +\(data:[^)]*?(?:[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})[^)]*\) +# data url in quotes +([`'"])data:.*?(?:[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,}).*\g{-1} +# data url +data:[-a-zA-Z=;:/0-9+]*,\S* + +# https/http/file urls +(?:\b(?:https?|ftp|file)://)[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|] + +# mailto urls +mailto:[-a-zA-Z=;:/?%&0-9+@.]{3,} + +# magnet urls +magnet:[?=:\w]+ + +# magnet urls +"magnet:[^"]+" + +# obs: +"obs:[^"]*" + +# The `\b` here means a break, it's the fancy way to handle urls, but it makes things harder to read +# In this examples content, I'm using a number of different ways to match things to show various approaches +# asciinema +\basciinema\.org/a/[0-9a-zA-Z]+ + +# apple +\bdeveloper\.apple\.com/[-\w?=/]+ +# Apple music +\bembed\.music\.apple\.com/fr/playlist/usr-share/[-\w.]+ + +# appveyor api +\bci\.appveyor\.com/api/projects/status/[0-9a-z]+ +# appveyor project +\bci\.appveyor\.com/project/(?:[^/\s"]*/){2}builds?/\d+/job/[0-9a-z]+ + +# Amazon + +# Amazon +\bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|) +# AWS S3 +\b\w*\.s3[^.]*\.amazonaws\.com/[-\w/&#%_?:=]* +# AWS execute-api +\b[0-9a-z]{10}\.execute-api\.[-0-9a-z]+\.amazonaws\.com\b +# AWS ELB +\b\w+\.[-0-9a-z]+\.elb\.amazonaws\.com\b +# AWS SNS +\bsns\.[-0-9a-z]+.amazonaws\.com/[-\w/&#%_?:=]* +# AWS VPC +vpc-\w+ + +# While you could try to match `http://` and `https://` by using `s?` in `https?://`, sometimes there +# YouTube url +\b(?:(?:www\.|)youtube\.com|youtu.be)/(?:channel/|embed/|user/|playlist\?list=|watch\?v=|v/|)[-a-zA-Z0-9?&=_%]* +# YouTube music +\bmusic\.youtube\.com/youtubei/v1/browse(?:[?&]\w+=[-a-zA-Z0-9?&=_]*) +# YouTube tag +<\s*youtube\s+id=['"][-a-zA-Z0-9?_]*['"] +# YouTube image +\bimg\.youtube\.com/vi/[-a-zA-Z0-9?&=_]* +# Google Accounts +\baccounts.google.com/[-_/?=.:;+%&0-9a-zA-Z]* +# Google Analytics +\bgoogle-analytics\.com/collect.[-0-9a-zA-Z?%=&_.~]* +# Google APIs +\bgoogleapis\.(?:com|dev)/[a-z]+/(?:v\d+/|)[a-z]+/[-@:./?=\w+|&]+ +# Google Storage +\b[-a-zA-Z0-9.]*\bstorage\d*\.googleapis\.com(?:/\S*|) +# Google Calendar +\bcalendar\.google\.com/calendar(?:/u/\d+|)/embed\?src=[@./?=\w&%]+ +\w+\@group\.calendar\.google\.com\b +# Google DataStudio +\bdatastudio\.google\.com/(?:(?:c/|)u/\d+/|)(?:embed/|)(?:open|reporting|datasources|s)/[-0-9a-zA-Z]+(?:/page/[-0-9a-zA-Z]+|) +# The leading `/` here is as opposed to the `\b` above +# ... a short way to match `https://` or `http://` since most urls have one of those prefixes +# Google Docs +/docs\.google\.com/[a-z]+/(?:ccc\?key=\w+|(?:u/\d+|d/(?:e/|)[0-9a-zA-Z_-]+/)?(?:edit\?[-\w=#.]*|/\?[\w=&]*|)) +# Google Drive +\bdrive\.google\.com/(?:file/d/|open)[-0-9a-zA-Z_?=]* +# Google Groups +\bgroups\.google\.com/(?:(?:forum/#!|d/)(?:msg|topics?|searchin)|a)/[^/\s"]+/[-a-zA-Z0-9$]+(?:/[-a-zA-Z0-9]+)* +# Google Maps +\bmaps\.google\.com/maps\?[\w&;=]* +# Google themes +themes\.googleusercontent\.com/static/fonts/[^/\s"]+/v\d+/[^.]+. +# Google CDN +\bclients2\.google(?:usercontent|)\.com[-0-9a-zA-Z/.]* +# Goo.gl +/goo\.gl/[a-zA-Z0-9]+ +# Google Chrome Store +\bchrome\.google\.com/webstore/detail/[-\w]*(?:/\w*|) +# Google Books +\bgoogle\.(?:\w{2,4})/books(?:/\w+)*\?[-\w\d=&#.]* +# Google Fonts +\bfonts\.(?:googleapis|gstatic)\.com/[-/?=:;+&0-9a-zA-Z]* +# Google Forms +\bforms\.gle/\w+ +# Google Scholar +\bscholar\.google\.com/citations\?user=[A-Za-z0-9_]+ +# Google Colab Research Drive +\bcolab\.research\.google\.com/drive/[-0-9a-zA-Z_?=]* + +# GitHub SHAs (api) +\bapi.github\.com/repos(?:/[^/\s"]+){3}/[0-9a-f]+\b +# GitHub SHAs (markdown) +(?:\[`?[0-9a-f]+`?\]\(https:/|)/(?:www\.|)github\.com(?:/[^/\s"]+){2,}(?:/[^/\s")]+)(?:[0-9a-f]+(?:[-0-9a-zA-Z/#.]*|)\b|) +# GitHub SHAs +\bgithub\.com(?:/[^/\s"]+){2}[@#][0-9a-f]+\b +# GitHub wiki +\bgithub\.com/(?:[^/]+/){2}wiki/(?:(?:[^/]+/|)_history|[^/]+(?:/_compare|)/[0-9a-f.]{40,})\b +# githubusercontent +/[-a-z0-9]+\.githubusercontent\.com/[-a-zA-Z0-9?&=_\/.]* +# githubassets +\bgithubassets.com/[0-9a-f]+(?:[-/\w.]+) +# gist github +\bgist\.github\.com/[^/\s"]+/[0-9a-f]+ +# git.io +\bgit\.io/[0-9a-zA-Z]+ +# GitHub JSON +"node_id": "[-a-zA-Z=;:/0-9+]*" +# Contributor +\[[^\]]+\]\(https://github\.com/[^/\s"]+\) +# GHSA +GHSA(?:-[0-9a-z]{4}){3} + +# GitLab commit +\bgitlab\.[^/\s"]*/\S+/\S+/commit/[0-9a-f]{7,16}#[0-9a-f]{40}\b +# GitLab merge requests +\bgitlab\.[^/\s"]*/\S+/\S+/-/merge_requests/\d+/diffs#[0-9a-f]{40}\b +# GitLab uploads +\bgitlab\.[^/\s"]*/uploads/[-a-zA-Z=;:/0-9+]* +# GitLab commits +\bgitlab\.[^/\s"]*/(?:[^/\s"]+/){2}commits?/[0-9a-f]+\b + +# binanace +accounts.binance.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]* + +# bitbucket diff +\bapi\.bitbucket\.org/\d+\.\d+/repositories/(?:[^/\s"]+/){2}diff(?:stat|)(?:/[^/\s"]+){2}:[0-9a-f]+ +# bitbucket repositories commits +\bapi\.bitbucket\.org/\d+\.\d+/repositories/(?:[^/\s"]+/){2}commits?/[0-9a-f]+ +# bitbucket commits +\bbitbucket\.org/(?:[^/\s"]+/){2}commits?/[0-9a-f]+ + +# bit.ly +\bbit\.ly/\w+ + +# bitrise +\bapp\.bitrise\.io/app/[0-9a-f]*/[\w.?=&]* + +# bootstrapcdn.com +\bbootstrapcdn\.com/[-./\w]+ + +# cdn.cloudflare.com +\bcdnjs\.cloudflare\.com/[./\w]+ + +# circleci +\bcircleci\.com/gh(?:/[^/\s"]+){1,5}.[a-z]+\?[-0-9a-zA-Z=&]+ + +# gitter +\bgitter\.im(?:/[^/\s"]+){2}\?at=[0-9a-f]+ + +# gravatar +\bgravatar\.com/avatar/[0-9a-f]+ + +# ibm +[a-z.]*ibm\.com/[-_#=:%!?~.\\/\d\w]* + +# imgur +\bimgur\.com/[^.]+ + +# Internet Archive +\barchive\.org/web/\d+/(?:[-\w.?,'/\\+&%$#_:]*) + +# discord +/discord(?:app\.com|\.gg)/(?:invite/)?[a-zA-Z0-9]{7,} + +# Disqus +\bdisqus\.com/[-\w/%.()!?&=_]* + +# medium link +\blink\.medium\.com/[a-zA-Z0-9]+ +# medium +\bmedium\.com/\@?[^/\s"]+/[-\w]+ + +# microsoft +\b(?:https?://|)(?:(?:download\.visualstudio|docs|msdn2?|research)\.microsoft|blogs\.msdn)\.com/[-_a-zA-Z0-9()=./%]* +# powerbi +\bapp\.powerbi\.com/reportEmbed/[^"' ]* +# vs devops +\bvisualstudio.com(?::443|)/[-\w/?=%&.]* +# microsoft store +\bmicrosoft\.com/store/apps/\w+ + +# mvnrepository.com +\bmvnrepository\.com/[-0-9a-z./]+ + +# now.sh +/[0-9a-z-.]+\.now\.sh\b + +# oracle +\bdocs\.oracle\.com/[-0-9a-zA-Z./_?#&=]* + +# chromatic.com +/\S+.chromatic.com\S*[")] + +# codacy +\bapi\.codacy\.com/project/badge/Grade/[0-9a-f]+ + +# compai +\bcompai\.pub/v1/png/[0-9a-f]+ + +# mailgun api +\.api\.mailgun\.net/v3/domains/[0-9a-z]+\.mailgun.org/messages/[0-9a-zA-Z=@]* +# mailgun +\b[0-9a-z]+.mailgun.org + +# /message-id/ +/message-id/[-\w@./%]+ + +# Reddit +\breddit\.com/r/[/\w_]* + +# requestb.in +\brequestb\.in/[0-9a-z]+ + +# sched +\b[a-z0-9]+\.sched\.com\b + +# Slack url +slack://[a-zA-Z0-9?&=]+ +# Slack +\bslack\.com/[-0-9a-zA-Z/_~?&=.]* +# Slack edge +\bslack-edge\.com/[-a-zA-Z0-9?&=%./]+ +# Slack images +\bslack-imgs\.com/[-a-zA-Z0-9?&=%.]+ + +# shields.io +\bshields\.io/[-\w/%?=&.:+;,]* + +# stackexchange -- https://stackexchange.com/feeds/sites +\b(?:askubuntu|serverfault|stack(?:exchange|overflow)|superuser).com/(?:questions/\w+/[-\w]+|a/) + +# Sentry +[0-9a-f]{32}\@o\d+\.ingest\.sentry\.io\b + +# Twitter markdown +\[\@[^[/\]:]*?\]\(https://twitter.com/[^/\s"')]*(?:/status/\d+(?:\?[-_0-9a-zA-Z&=]*|)|)\) +# Twitter hashtag +\btwitter\.com/hashtag/[\w?_=&]* +# Twitter status +\btwitter\.com/[^/\s"')]*(?:/status/\d+(?:\?[-_0-9a-zA-Z&=]*|)|) +# Twitter profile images +\btwimg\.com/profile_images/[_\w./]* +# Twitter media +\btwimg\.com/media/[-_\w./?=]* +# Twitter link shortened +\bt\.co/\w+ + +# facebook +\bfburl\.com/[0-9a-z_]+ +# facebook CDN +\bfbcdn\.net/[\w/.,]* +# facebook watch +\bfb\.watch/[0-9A-Za-z]+ + +# dropbox +\bdropbox\.com/sh?/[^/\s"]+/[-0-9A-Za-z_.%?=&;]+ + +# ipfs protocol +ipfs://[0-9a-z]* +# ipfs url +/ipfs/[0-9a-z]* + +# w3 +\bw3\.org/[-0-9a-zA-Z/#.]+ + +# loom +\bloom\.com/embed/[0-9a-f]+ + +# regex101 +\bregex101\.com/r/[^/\s"]+/\d+ + +# figma +\bfigma\.com/file(?:/[0-9a-zA-Z]+/)+ + +# freecodecamp.org +\bfreecodecamp\.org/[-\w/.]+ + +# image.tmdb.org +\bimage\.tmdb\.org/[/\w.]+ + +# mermaid +\bmermaid\.ink/img/[-\w]+|\bmermaid-js\.github\.io/mermaid-live-editor/#/edit/[-\w]+ + +# Wikipedia +\ben\.wikipedia\.org/wiki/[-\w%.#]+ + +# gitweb +[^"\s]+/gitweb/\S+;h=[0-9a-f]+ + +# HyperKitty lists +/archives/list/[^@/]+\@[^/\s"]*/message/[^/\s"]*/ + +# lists +/thread\.html/[^"\s]+ + +# list-management +\blist-manage\.com/subscribe(?:[?&](?:u|id)=[0-9a-f]+)+ + +# kubectl.kubernetes.io/last-applied-configuration +"kubectl.kubernetes.io/last-applied-configuration": ".*" + +# pgp +\bgnupg\.net/pks/lookup[?&=0-9a-zA-Z]* + +# Spotify +\bopen\.spotify\.com/embed/playlist/\w+ + +# Mastodon +\bmastodon\.[-a-z.]*/(?:media/|\@)[?&=0-9a-zA-Z_]* + +# scastie +\bscastie\.scala-lang\.org/[^/]+/\w+ + +# images.unsplash.com +\bimages\.unsplash\.com/(?:(?:flagged|reserve)/|)[-\w./%?=%&.;]+ + +# pastebin +\bpastebin\.com/[\w/]+ + +# heroku +\b\w+\.heroku\.com/source/archive/\w+ + +# quip +\b\w+\.quip\.com/\w+(?:(?:#|/issues/)\w+)? + +# badgen.net +\bbadgen\.net/badge/[^")\]'\s]+ + +# statuspage.io +\w+\.statuspage\.io\b + +# media.giphy.com +\bmedia\.giphy\.com/media/[^/]+/[\w.?&=]+ + +# tinyurl +\btinyurl\.com/\w+ + +# getopts +\bgetopts\s+(?:"[^"]+"|'[^']+') + +# ANSI color codes +(?:\\(?:u00|x)1b|\x1b)\[\d+(?:;\d+|)m + +# URL escaped characters +\%[0-9A-F][A-F] +# IPv6 +\b(?:[0-9a-fA-F]{0,4}:){3,7}[0-9a-fA-F]{0,4}\b +# c99 hex digits (not the full format, just one I've seen) +0x[0-9a-fA-F](?:\.[0-9a-fA-F]*|)[pP] +# Punycode +\bxn--[-0-9a-z]+ +# sha +sha\d+:[0-9]*[a-f]{3,}[0-9a-f]* +# sha-... -- uses a fancy capture +(['"]|")[0-9a-f]{40,}\g{-1} +# hex runs +\b[0-9a-fA-F]{16,}\b +# hex in url queries +=[0-9a-fA-F]*?(?:[A-F]{3,}|[a-f]{3,})[0-9a-fA-F]*?& +# ssh +(?:ssh-\S+|-nistp256) [-a-zA-Z=;:/0-9+]{12,} + +# PGP +\b(?:[0-9A-F]{4} ){9}[0-9A-F]{4}\b +# GPG keys +\b(?:[0-9A-F]{4} ){5}(?: [0-9A-F]{4}){5}\b +# Well known gpg keys +.well-known/openpgpkey/[\w./]+ + +# uuid: +\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b +# hex digits including css/html color classes: +(?:[\\0][xX]|\\u|[uU]\+|#x?|\%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|u\d+)\b +# integrity +integrity="sha\d+-[-a-zA-Z=;:/0-9+]{40,}" + +# https://www.gnu.org/software/groff/manual/groff.html +# man troff content +\\f[BCIPR] +# ' +\\\(aq + +# .desktop mime types +^MimeTypes?=.*$ +# .desktop localized entries +^[A-Z][a-z]+\[[a-z]+\]=.*$ +# Localized .desktop content +Name\[[^\]]+\]=.* + +# IServiceProvider +\bI(?=(?:[A-Z][a-z]{2,})+\b) + +# crypt +"\$2[ayb]\$.{56}" + +# scrypt / argon +\$(?:scrypt|argon\d+[di]*)\$\S+ + +# Input to GitHub JSON +content: "[-a-zA-Z=;:/0-9+]*=" + +# Python stringprefix / binaryprefix +# Note that there's a high false positive rate, remove the `?=` and search for the regex to see if the matches seem like reasonable strings +(?v# +(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_])) +# Compiler flags (Scala) +(?:^|[\t ,>"'`=(])-J-[DPWXY](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}) +# Compiler flags +(?:^|[\t ,"'`=(])-[DPWXYLlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}) +# Compiler flags (linker) +,-B +# curl arguments +\b(?:\\n|)curl(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)* +# set arguments +\bset(?:\s+-[abefimouxE]{1,2})*\s+-[abefimouxE]{3,}(?:\s+-[abefimouxE]+)* +# tar arguments +\b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+ +# tput arguments -- https://man7.org/linux/man-pages/man5/terminfo.5.html -- technically they can be more than 5 chars long... +\btput\s+(?:(?:-[SV]|-T\s*\w+)\s+)*\w{3,5}\b +# macOS temp folders +/var/folders/\w\w/[+\w]+/(?:T|-Caches-)/ diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt new file mode 100644 index 00000000..020d1043 --- /dev/null +++ b/.github/actions/spelling/excludes.txt @@ -0,0 +1,65 @@ +# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-excludes +(?:^|/)(?i)COPYRIGHT +(?:^|/)(?i)LICEN[CS]E +(?:^|/)3rdparty/ +(?:^|/)go\.sum$ +(?:^|/)package(?:-lock|)\.json$ +(?:^|/)pyproject.toml +(?:^|/)requirements(?:-dev|-doc|-test|)\.txt$ +(?:^|/)vendor/ +ignore$ +\.a$ +\.ai$ +\.avi$ +\.bmp$ +\.bz2$ +\.class$ +\.coveragerc$ +\.crt$ +\.dll$ +\.docx?$ +\.drawio$ +\.DS_Store$ +\.eot$ +\.exe$ +\.gif$ +\.git-blame-ignore-revs$ +\.gitattributes$ +\.graffle$ +\.gz$ +\.icns$ +\.ico$ +\.jar$ +\.jks$ +\.jpe?g$ +\.key$ +\.lib$ +\.lock$ +\.map$ +\.min\.. +\.mod$ +\.mp[34]$ +\.o$ +\.ocf$ +\.otf$ +\.pdf$ +\.pem$ +\.png$ +\.psd$ +\.pyc$ +\.pylintrc$ +\.s$ +\.svgz?$ +\.tar$ +\.tiff?$ +\.ttf$ +\.wav$ +\.webm$ +\.webp$ +\.woff2?$ +\.xlsx?$ +\.zip$ +^\.(?!github/) +^\.github/actions/spelling/ +^\.github/policies/moderatorTriggers\.yml$ +^\.github/workflows/spellCheck\.yml$ diff --git a/.github/actions/spelling/expect/generic_terms.txt b/.github/actions/spelling/expect/generic_terms.txt new file mode 100644 index 00000000..b6a59150 --- /dev/null +++ b/.github/actions/spelling/expect/generic_terms.txt @@ -0,0 +1,12 @@ +wildcards +ssh +Amd +usr +screenshots +currentstate +Scrollbars +Searchbox +VGpu +versioning +worktree +sortby diff --git a/.github/actions/spelling/expect/software.txt b/.github/actions/spelling/expect/software.txt new file mode 100644 index 00000000..8ed24f0c --- /dev/null +++ b/.github/actions/spelling/expect/software.txt @@ -0,0 +1,8 @@ +vscode +Linux +dotnet +dotnettool +cspell +NUnit +reportgenerator +Toolpackage diff --git a/.github/actions/spelling/expect/usernames.txt b/.github/actions/spelling/expect/usernames.txt new file mode 100644 index 00000000..90518d69 --- /dev/null +++ b/.github/actions/spelling/expect/usernames.txt @@ -0,0 +1,4 @@ +denelon +Trenly +ryfu +stephengillie diff --git a/.github/actions/spelling/expect/windows_terms.txt b/.github/actions/spelling/expect/windows_terms.txt new file mode 100644 index 00000000..27c1404c --- /dev/null +++ b/.github/actions/spelling/expect/windows_terms.txt @@ -0,0 +1,15 @@ +stickykeys +filterkeys +togglekeys +taskbar +taskkill +dotnet +LASTEXITCODE +DWord +PSobject +winuser +psm +msrc +cursorindicator +packagetype +BSODs diff --git a/.github/actions/spelling/line_forbidden.patterns b/.github/actions/spelling/line_forbidden.patterns new file mode 100644 index 00000000..69fb2740 --- /dev/null +++ b/.github/actions/spelling/line_forbidden.patterns @@ -0,0 +1,62 @@ +# reject `m_data` as there's a certain OS which has evil defines that break things if it's used elsewhere +# \bm_data\b + +# If you have a framework that uses `it()` for testing and `fit()` for debugging a specific test, +# you might not want to check in code where you were debugging w/ `fit()`, in which case, you might want +# to use this: +#\bfit\( + +# s.b. GitHub +\bGithub\b + +# s.b. GitLab +\bGitlab\b + +# s.b. JavaScript +\bJavascript\b + +# s.b. Microsoft +\bMicroSoft\b + +# s.b. another +\ban[- ]other\b + +# s.b. greater than +\bgreater then\b + +# s.b. into +#\sin to\s + +# s.b. opt-in +\sopt in\s + +# s.b. less than +\bless then\b + +# s.b. otherwise +\bother[- ]wise\b + +# s.b. nonexistent +\bnon existing\b +# \b[Nn]o[nt][- ]existent\b + +# s.b. preexisting +[Pp]re[- ]existing + +# s.b. preempt +[Pp]re[- ]empt\b + +# s.b. preemptively +[Pp]re[- ]emptively + +# s.b. reentrancy +[Rr]e[- ]entrancy + +# s.b. reentrant +[Rr]e[- ]entrant + +# s.b. workaround(s) +#\bwork[- ]arounds?\b + +# Reject duplicate words +\s([A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})\s\g{-1}\s diff --git a/.github/actions/spelling/patterns.txt b/.github/actions/spelling/patterns.txt new file mode 100644 index 00000000..95f329bf --- /dev/null +++ b/.github/actions/spelling/patterns.txt @@ -0,0 +1,70 @@ +# See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns + +# user +"user":\s*"[^"]+" + +# Ignore URLs defined by reference at the top of markdown files +^\[.*\]:\s+[Hh][Tt][Tt][Pp][Ss]:.*$ +# Ignore URLs defined at usage +\([Hh][Tt][Tt][Pp][Ss]:.*\) +# Ignore mailto protocols +\(mailto:.*\) +# Ignore all other URLs +[Hh][Tt][Tt][Pp][Ss]:.*(?=\s) +[Hh][Tt][Tt][Pp][Ss]? +[Uu][Rr][Ll] +# Ignore groupID's +"(_id|groupId)": "[a-zA-Z0-9]{24}" +# Ignore usernames, preceeded by an @ +(\[|\b)@[A-Za-z0-9-]+(\]|\b) + +# FAQ items +\`[A-Z]\`[a-z]{2,}\b + +# fabricbot +"(?:body|comment)Pattern": ".*" + +# Questionably acceptable forms of `in to` +# Personally, I prefer `log into`, but people object +# https://www.tprteaching.com/log-into-log-in-to-login/ +\b[Ll]og in to\b + +# acceptable duplicates +# ls directory listings +[-bcdlpsw](?:[-r][-w][-sx]){3}\s+\d+\s+(\S+)\s+\g{-1}\s+\d+\s+ +# C types and repeated CSS values +\s(center|div|inherit|long|LONG|none|normal|solid|thin|transparent|very)(?: \g{-1})+\s +# go templates +\s(\w+)\s+\g{-1}\s+\`(?:graphql|json|yaml): +# javadoc / .net +(?:[\\@](?:groupname|param)|(?:public|private)(?:\s+static|\s+readonly)*)\s+(\w+)\s+\g{-1}\s + +# Commit message -- Signed-off-by and friends +^\s*(?:(?:Based-on-patch|Co-authored|Helped|Mentored|Reported|Reviewed|Signed-off)-by|Thanks-to): (?:[^<]*<[^>]*>|[^<]*)\s*$ + +# Autogenerated revert commit message +^This reverts commit [0-9a-f]{40}\.$ + +# ignore long runs of a single character: +\b([A-Za-z])\g{-1}{3,}\b + +# Variations on DSC +[Dd][Ss][Cc] + +# Variations on DSC +[Dd][Ss][Cc] + +# Variations on URI +[Ui][Rr][IiLl] + +# Variations on WSB +[Ww][Ss][Bb] + +# GUIDS +\w{8}-(?:\w{4}-){3}\w{12} + +# Resource Names +name\:\s+.+$ + +# Commit Hashes +[0-9a-f]{40} diff --git a/.github/actions/spelling/reject.txt b/.github/actions/spelling/reject.txt new file mode 100644 index 00000000..b5a6d368 --- /dev/null +++ b/.github/actions/spelling/reject.txt @@ -0,0 +1,10 @@ +^attache$ +benefitting +occurences? +^dependan.* +^oer$ +Sorce +^[Ss]pae.* +^untill$ +^untilling$ +^wether.* diff --git a/.github/workflows/spellCheck.yaml b/.github/workflows/spellCheck.yaml new file mode 100644 index 00000000..5893eb94 --- /dev/null +++ b/.github/workflows/spellCheck.yaml @@ -0,0 +1,117 @@ +name: Spell Checking + +# Comment management is handled through a secondary job, for details see: +# https://github.com/check-spelling/check-spelling/wiki/Feature%3A-Restricted-Permissions +# +# `jobs.comment-push` runs when a push is made to a repository and the `jobs.spelling` job needs to make a comment +# (in odd cases, it might actually run just to collapse a comment, but that's fairly rare) +# it needs `contents: write` in order to add a comment. +# +# `jobs.comment-pr` runs when a pull_request is made to a repository and the `jobs.spelling` job needs to make a comment +# or collapse a comment (in the case where it had previously made a comment and now no longer needs to show a comment) +# it needs `pull-requests: write` in order to manipulate those comments. + +# Updating pull request branches is managed via comment handling. +# For details, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-expect-list +# +# These elements work together to make it happen: +# +# `on.issue_comment` +# This event listens to comments by users asking to update the metadata. +# +# `jobs.update` +# This job runs in response to an issue_comment and will push a new commit +# to update the spelling metadata. +# +# `with.experimental_apply_changes_via_bot` +# Tells the action to support and generate messages that enable it +# to make a commit to update the spelling metadata. +# +# `with.ssh_key` +# In order to trigger workflows when the commit is made, you can provide a +# secret (typically, a write-enabled github deploy key). +# +# For background, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-with-deploy-key + +on: + push: + branches: + - '**' + tags-ignore: + - '**' + pull_request_target: + branches: + - '**' + tags-ignore: + - '**' + types: + - 'opened' + - 'reopened' + - 'synchronize' + +jobs: + spelling: + name: Check Spelling + permissions: + contents: read + pull-requests: read + actions: read + outputs: + followup: ${{ steps.spelling.outputs.followup }} + runs-on: ubuntu-latest + if: "contains(github.event_name, 'pull_request') || github.event_name == 'push'" + concurrency: + group: spelling-${{ github.event.pull_request.number || github.ref }} + # note: If you use only_check_changed_files, you do not want cancel-in-progress + cancel-in-progress: true + steps: + - name: check-spelling + id: spelling + uses: check-spelling/check-spelling@v0.0.24 + with: + suppress_push_for_open_pull_request: 1 + checkout: true + check_file_names: 1 + spell_check_this: check-spelling/spell-check-this@prerelease + post_comment: 0 + use_magic_file: 1 + extra_dictionary_limit: 10 + extra_dictionaries: + https://github.com/streetsidesoftware/cspell-dicts/raw/098e323325a389a5d1cebcd7770807b9d11d0a17/dictionaries/software-terms/src/software-terms.txt + https://raw.githubusercontent.com/streetsidesoftware/cspell-dicts/098e323325a389a5d1cebcd7770807b9d11d0a17/dictionaries/filetypes/src/filetypes.txt + https://raw.githubusercontent.com/streetsidesoftware/cspell-dicts/098e323325a389a5d1cebcd7770807b9d11d0a17/dictionaries/powershell/src/powershell.txt + https://raw.githubusercontent.com/streetsidesoftware/cspell-dicts/098e323325a389a5d1cebcd7770807b9d11d0a17/dictionaries/win32/src/generator/win32.txt + https://github.com/streetsidesoftware/cspell-dicts/raw/098e323325a389a5d1cebcd7770807b9d11d0a17/dictionaries/python/src/common_packages.txt + check_extra_dictionaries: '' + + comment-push: + name: Report (Push) + # If your workflow isn't running on push, you can remove this job + runs-on: ubuntu-latest + needs: spelling + permissions: + contents: write + if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push' + steps: + - name: comment + uses: check-spelling/check-spelling@v0.0.24 + with: + checkout: true + spell_check_this: check-spelling/spell-check-this@prerelease + task: ${{ needs.spelling.outputs.followup }} + + comment-pr: + name: Report (PR) + # If you workflow isn't running on pull_request*, you can remove this job + runs-on: ubuntu-latest + needs: spelling + permissions: + pull-requests: write + if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request') + steps: + - name: comment + uses: check-spelling/check-spelling@v0.0.24 + with: + checkout: true + spell_check_this: check-spelling/spell-check-this@prerelease + task: ${{ needs.spelling.outputs.followup }} diff --git a/resources/Help/Microsoft.VSCode.Dsc/VSCodeExtension.md b/resources/Help/Microsoft.VSCode.Dsc/VSCodeExtension.md index 4681e7a6..7d98592b 100644 --- a/resources/Help/Microsoft.VSCode.Dsc/VSCodeExtension.md +++ b/resources/Help/Microsoft.VSCode.Dsc/VSCodeExtension.md @@ -22,7 +22,7 @@ The `VSCodeExtension` DSC Resource allows you to install, update, and remove Vis **Parameter**|**Attribute**|**DataType**|**Description**|**Allowed Values** :-----|:-----|:-----|:-----|:----- `Name`|Key|String|The name of the Visual Studio Code extension to manage.|To find extensions in VSCode, check out: https://code.visualstudio.com/docs/editor/extension-marketplace#_find-and-install-an-extension -`Version`|Optional|String|The version of the Visual Studio Code extension to install. If not specified, the latest version will be installed.| For exampe: `1.0.0` +`Version`|Optional|String|The version of the Visual Studio Code extension to install. If not specified, the latest version will be installed.| For example: `1.0.0` `Exist`|Optional|Boolean|Indicates whether the extension should exist. The default value is `$true`.|`$true`, `$false` `Insiders`|Optional|Boolean|Indicates whether to manage the extension for the Insiders version of Visual Studio Code. The default value is `$false`.|`$true`, `$false` @@ -69,4 +69,4 @@ $params = @{ Insiders = $true } Invoke-DscResource -Name VSCodeExtension -Method Set -Property $params -ModuleName Microsoft.VSCode.Dsc -``` \ No newline at end of file +``` diff --git a/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psm1 b/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psm1 index a22fb73f..81ba3178 100644 --- a/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psm1 +++ b/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psm1 @@ -28,13 +28,13 @@ class WindowsSandbox [DscProperty()] [string]$SandboxFolder - + [DscProperty()] [string]$ReadOnly [DscProperty()] [string]$LogonCommand - + [DscProperty()] [nullable[Int64]]$MemoryInMB @@ -65,7 +65,7 @@ class WindowsSandbox $currentState.WsbFilePath = $this.WsbFilePath $windowsSandboxProcess = Get-Process WindowsSandbox -ErrorAction SilentlyContinue $currentState.Ensure = $windowsSandboxProcess ? [Ensure]::Present : [Ensure]::Absent - + return $currentState } @@ -84,12 +84,12 @@ class WindowsSandbox return } - # Load the existing wsb file if it exists or create a new one. + # Load the existing WSB file if it exists or create a new one. if ($this.WsbFilePath) { if (-not(Test-Path -Path $this.WsbFilePath)) { - throw "The provided wsb file does not exist." + throw "The provided WSB file does not exist." } $xml = [xml](Get-Content -Path $this.WsbFilePath) @@ -101,7 +101,7 @@ class WindowsSandbox $root = $xml.CreateElement("Configuration") $xml.AppendChild($root) } - + <# Example Windows Sandbox configuration file (xml): Disable @@ -122,7 +122,7 @@ class WindowsSandbox Disable Enable 2048 - + #> # Override existing configurations if exists. @@ -267,7 +267,7 @@ class WindowsSandbox $root.VideoInput = ConvertBoolToEnableDisable($this.VideoInput) } - # Export wsb file and run. + # Export WSB file and run. $windowsSandboxDscTempDir = "$($env:Temp)\WindowsSandboxDsc" if (-not (Test-Path -Path $windowsSandboxDscTempDir)) { @@ -295,4 +295,4 @@ function ConvertBoolToEnableDisable() return $value ? 'Enable' : 'Disable' } -#endregion Functions \ No newline at end of file +#endregion Functions diff --git a/resources/NpmDsc/NpmDsc.psm1 b/resources/NpmDsc/NpmDsc.psm1 index 58bab9cf..0f6858d7 100644 --- a/resources/NpmDsc/NpmDsc.psm1 +++ b/resources/NpmDsc/NpmDsc.psm1 @@ -176,7 +176,7 @@ class NpmPackage function Assert-Npm { # Refresh session $path value before invoking 'npm' - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") + $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") try { Invoke-Npm -Command 'help' diff --git a/resources/PythonPip3Dsc/PythonPip3Dsc.psm1 b/resources/PythonPip3Dsc/PythonPip3Dsc.psm1 index 1a138b36..9f9f6bf4 100644 --- a/resources/PythonPip3Dsc/PythonPip3Dsc.psm1 +++ b/resources/PythonPip3Dsc/PythonPip3Dsc.psm1 @@ -4,7 +4,7 @@ using namespace System.Collections.Generic #region Functions -function Get-Pip3Path +function Get-Pip3Path { if ($IsWindows) { @@ -60,12 +60,12 @@ function Get-Pip3Path $pipExe = (Get-Command -Name 'pip3' -ErrorAction SilentlyContinue).Source - if ($pipExe) + if ($pipExe) { return $pipExe } } - else + else { throw "Operating system not supported." } @@ -162,7 +162,7 @@ function Invoke-Pip3Uninstall $command.Add((Get-PackageNameWithVersion @PSBoundParameters)) $command.Add($Arguments) - # '--yes' is needed to ignore confrimation required for uninstalls + # '--yes' is needed to ignore confirmation required for uninstalls $command.Add("--yes") return Invoke-Pip3 -command $command } @@ -176,7 +176,7 @@ function GetPip3CurrentState [hashtable[]] $Package, [Parameter(Mandatory = $true)] - [AllowNull()] + [AllowNull()] [hashtable] $Parameters ) @@ -265,13 +265,13 @@ function TryGetRegistryValue [Parameter(Mandatory = $true)] [string]$Property - ) + ) if (Test-Path -Path $Key) { try { - return (Get-ItemProperty -Path $Key | Select-Object -ExpandProperty $Property) + return (Get-ItemProperty -Path $Key | Select-Object -ExpandProperty $Property) } catch { @@ -381,7 +381,7 @@ class Pip3Package { if ($this.Test()) { - return + return } $currentPackage = $this.InstalledPackages | Where-Object { $_.PackageName -eq $this.PackageName } @@ -406,9 +406,9 @@ class Pip3Package foreach ($package in $packages) { $in = [Pip3Package]@{ - PackageName = $package.Packagename + PackageName = $package.PackageName Version = $package.version - Exist = $true + Exist = $true Arguments = $null InstalledPackages = $packages } diff --git a/tests/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.Tests.ps1 b/tests/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.Tests.ps1 index f30fb6b0..d29ca94b 100644 --- a/tests/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.Tests.ps1 +++ b/tests/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.Tests.ps1 @@ -16,7 +16,7 @@ BeforeAll { { Install-Module -Name PSDesiredStateConfiguration -Force -SkipPublisherCheck } - + Import-Module Microsoft.Windows.Setting.Accessibility # Create test registry path. @@ -54,9 +54,9 @@ Describe 'Text' { $desiredTextSize = [TextSize](Get-Random -Maximum 4 -Minimum 1) $desiredState = @{ Size = $desiredTextSize } - + Invoke-DscResource -Name Text -ModuleName Microsoft.Windows.Setting.Accessibility -Method Set -Property $desiredState - + $finalState = Invoke-DscResource -Name Text -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} $finalState.Size | Should -Be $desiredTextSize } @@ -82,9 +82,9 @@ Describe 'Magnifier' { $desiredMagnification = [MagnificationValue](Get-Random -Maximum 4 -Minimum 1) $desiredState = @{ Magnification = $desiredMagnification } - + Invoke-DscResource -Name Magnifier -ModuleName Microsoft.Windows.Setting.Accessibility -Method Set -Property $desiredState - + $finalState = Invoke-DscResource -Name Magnifier -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} $finalState.Magnification | Should -Be $desiredMagnification } @@ -110,9 +110,9 @@ Describe 'MousePointer' { $desiredPointerSize = [PointerSize](Get-Random -Maximum 4 -Minimum 1) $desiredState = @{ PointerSize = $desiredPointerSize } - + Invoke-DscResource -Name MousePointer -ModuleName Microsoft.Windows.Setting.Accessibility -Method Set -Property $desiredState - + $finalState = Invoke-DscResource -Name MousePointer -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} $finalState.PointerSize | Should -Be $desiredPointerSize } @@ -158,9 +158,9 @@ Describe 'VisualEffect' { $testResult2.InDesiredState | Should -Be $true } It 'MessageDuration' { - $firstValue = 5 #Key is missing by default, and default value is 5 when not specified. + $firstValue = 5 #Key is missing by default, and default value is 5 when not specified. $secondValue = 10 - + $initialState = Invoke-DscResource -Name VisualEffect -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} $initialState.MessageDurationInSeconds | Should -Be $firstValue @@ -219,7 +219,7 @@ Describe 'TextCursor' { $testResult2 = Invoke-DscResource -Name TextCursor -ModuleName Microsoft.Windows.Setting.Accessibility -Method Test -Property $parameters $testResult2.InDesiredState | Should -Be $true } - It 'IndicatorSize.' { + It 'IndicatorSize.' { Invoke-DscResource -Name TextCursor -ModuleName Microsoft.Windows.Setting.Accessibility -Method Set -Property @{ IndicatorSize = 1 } $initialState = Invoke-DscResource -Name TextCursor -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} @@ -238,7 +238,7 @@ Describe 'TextCursor' { $testResult2 = Invoke-DscResource -Name TextCursor -ModuleName Microsoft.Windows.Setting.Accessibility -Method Test -Property $parameters $testResult2.InDesiredState | Should -Be $true } - It 'IndicatorColor.' { + It 'IndicatorColor.' { Invoke-DscResource -Name TextCursor -ModuleName Microsoft.Windows.Setting.Accessibility -Method Set -Property @{ IndicatorColor = 16711871 } $initialState = Invoke-DscResource -Name TextCursor -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} @@ -258,9 +258,9 @@ Describe 'TextCursor' { $testResult2.InDesiredState | Should -Be $true } It 'Thickness' { #int - $firstValue = 1 #Key is missing by default, and default value is 5 when not specified. + $firstValue = 1 #Key is missing by default, and default value is 5 when not specified. $secondValue = 2 - + $initialState = Invoke-DscResource -Name TextCursor -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} $initialState.Thickness | Should -Be $firstValue @@ -280,7 +280,7 @@ Describe 'TextCursor' { } Describe 'StickyKeys' { - It 'Each property can be set' { + It 'Each property can be set' { # Get a snapshot of the current state $baselineState = Invoke-DscResource -Name StickyKeys -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} # Get a list of all the properties that can be changed @@ -310,7 +310,7 @@ Describe 'StickyKeys' { # Set all properties back to the initial state at once $parameterList = $baselineState | Select-Object -Property $propertyList - $parameters = @{} # Needs to be a hashtable for seeting them all at once + $parameters = @{} # Needs to be a hashtable for setting them all at once $parameterList.PSObject.Properties | ForEach-Object { $parameters[$_.Name] = $_.Value } $testResult = Invoke-DscResource -Name StickyKeys -ModuleName Microsoft.Windows.Setting.Accessibility -Method Test -Property $parameters $testResult.InDesiredState | Should -Be $false # Everything should still be opposite from when each property was changed individually @@ -321,7 +321,7 @@ Describe 'StickyKeys' { } Describe 'ToggleKeys' { - It 'Each property can be set' { + It 'Each property can be set' { # Get a snapshot of the current state $baselineState = Invoke-DscResource -Name ToggleKeys -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} # Get a list of all the properties that can be changed @@ -351,7 +351,7 @@ Describe 'ToggleKeys' { # Set all properties back to the initial state at once $parameterList = $baselineState | Select-Object -Property $propertyList - $parameters = @{} # Needs to be a hashtable for seeting them all at once + $parameters = @{} # Needs to be a hashtable for setting them all at once $parameterList.PSObject.Properties | ForEach-Object { $parameters[$_.Name] = $_.Value } $testResult = Invoke-DscResource -Name ToggleKeys -ModuleName Microsoft.Windows.Setting.Accessibility -Method Test -Property $parameters $testResult.InDesiredState | Should -Be $false # Everything should still be opposite from when each property was changed individually @@ -362,7 +362,7 @@ Describe 'ToggleKeys' { } Describe 'FilterKeys' { - It 'Each property can be set' { + It 'Each property can be set' { # Get a snapshot of the current state $baselineState = Invoke-DscResource -Name FilterKeys -ModuleName Microsoft.Windows.Setting.Accessibility -Method Get -Property @{} # Get a list of all the properties that can be changed @@ -392,7 +392,7 @@ Describe 'FilterKeys' { # Set all properties back to the initial state at once $parameterList = $baselineState | Select-Object -Property $propertyList - $parameters = @{} # Needs to be a hashtable for seeting them all at once + $parameters = @{} # Needs to be a hashtable for setting them all at once $parameterList.PSObject.Properties | ForEach-Object { $parameters[$_.Name] = $_.Value } $testResult = Invoke-DscResource -Name FilterKeys -ModuleName Microsoft.Windows.Setting.Accessibility -Method Test -Property $parameters $testResult.InDesiredState | Should -Be $false # Everything should still be opposite from when each property was changed individually @@ -404,4 +404,4 @@ Describe 'FilterKeys' { AfterAll { $env:TestRegistryPath = "" -} \ No newline at end of file +} From 7cda050c18ada36927d3842ce4a4767f7c7544c6 Mon Sep 17 00:00:00 2001 From: Kaleb Luedtke Date: Tue, 5 Nov 2024 11:43:54 -0600 Subject: [PATCH 2/6] Add Policy Bot Behaviors (#108) * Add behaviors for No-Recent-Activity * Add behaviors for when labels are added * Add behavior for assigning MSFT resource * Add behavior for cleaning up stale In-PR labels * Changed my mind on Blocking-Issue * Add comment triggers * Lint and add standard editor configs * Add triggers for issue open / close / update * Add recommended extensions * Set default encoding on powershell files * Add triggers for DSC Resource Labels * Final triggers * Spelling * Just doing what the bot says --- .editorconfig | 22 ++ .gitattributes | 8 + .github/actions/spelling/allow.txt | 2 +- .../actions/spelling/expect/generic_terms.txt | 2 + .github/actions/spelling/expect/usernames.txt | 3 - .../labelAdded.authorNotAuthorized.yml | 34 ++ .../policies/labelAdded.changesRequested.yml | 37 ++ .github/policies/labelAdded.needsCLA.yml | 31 ++ .../policies/labelAdded.noRecentActivity.yml | 50 +++ .github/policies/labelAdded.projectFile.yml | 34 ++ ...Management.assignIcmUsersAndModerators.yml | 37 ++ .../policies/labelManagement.issueClosed.yml | 38 ++ .../policies/labelManagement.issueOpened.yml | 117 ++++++ .../policies/labelManagement.issueUpdated.yml | 151 +++++++ .github/policies/moderatorTriggers.yml | 370 ++++++++++++++++++ .../scheduledSearch.cleanupInPRLabels.yml | 42 ++ .../scheduledSearch.closeNoRecentActivity.yml | 64 +++ .../scheduledSearch.markNoRecentActivity.yml | 68 ++++ .vscode/extensions.json | 6 + .vscode/settings.json | 8 +- 20 files changed, 1118 insertions(+), 6 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/policies/labelAdded.authorNotAuthorized.yml create mode 100644 .github/policies/labelAdded.changesRequested.yml create mode 100644 .github/policies/labelAdded.needsCLA.yml create mode 100644 .github/policies/labelAdded.noRecentActivity.yml create mode 100644 .github/policies/labelAdded.projectFile.yml create mode 100644 .github/policies/labelManagement.assignIcmUsersAndModerators.yml create mode 100644 .github/policies/labelManagement.issueClosed.yml create mode 100644 .github/policies/labelManagement.issueOpened.yml create mode 100644 .github/policies/labelManagement.issueUpdated.yml create mode 100644 .github/policies/moderatorTriggers.yml create mode 100644 .github/policies/scheduledSearch.cleanupInPRLabels.yml create mode 100644 .github/policies/scheduledSearch.closeNoRecentActivity.yml create mode 100644 .github/policies/scheduledSearch.markNoRecentActivity.yml create mode 100644 .vscode/extensions.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..151156d0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +# top-most EditorConfig file +root=true + +# Apply Windows-style newlines with a newline ending on every file, using UTF-8, and removing extra whitespace before newlines +[*] +end_of_line = crlf +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true + +# Overrides for Yaml Files - Use two spaces for indents +# editorconfig/editorconfig#329 +[*.{yml,yaml}] +indent_style = space +indent_size = 2 + +# Overrides for Markdown Files - Use tab for indents (accessibility) +[*.md] +indent_style = tab + +[{allow.txt,excludes.txt,patterns.txt}] +end_of_line = lf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..74a04a7b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,8 @@ +.editorconfig text eol=crlf +*.json text eol=crlf +*.md text eol=crlf +*.ps1 text eol=crlf +*.txt text eol=crlf +*.yml text=auto +*.yaml text=auto +.github/actions/spelling/** text eol=lf diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt index ab83a805..b5196fda 100644 --- a/.github/actions/spelling/allow.txt +++ b/.github/actions/spelling/allow.txt @@ -12,7 +12,6 @@ github https Icm microsoft -MSFT msftbot numpy opencode @@ -37,3 +36,4 @@ prerel uilt Windo ELSPROBLEMS +requ diff --git a/.github/actions/spelling/expect/generic_terms.txt b/.github/actions/spelling/expect/generic_terms.txt index b6a59150..5a88fd33 100644 --- a/.github/actions/spelling/expect/generic_terms.txt +++ b/.github/actions/spelling/expect/generic_terms.txt @@ -10,3 +10,5 @@ VGpu versioning worktree sortby +msft +automerge diff --git a/.github/actions/spelling/expect/usernames.txt b/.github/actions/spelling/expect/usernames.txt index 90518d69..5bc89190 100644 --- a/.github/actions/spelling/expect/usernames.txt +++ b/.github/actions/spelling/expect/usernames.txt @@ -1,4 +1 @@ -denelon -Trenly ryfu -stephengillie diff --git a/.github/policies/labelAdded.authorNotAuthorized.yml b/.github/policies/labelAdded.authorNotAuthorized.yml new file mode 100644 index 00000000..7a1dee06 --- /dev/null +++ b/.github/policies/labelAdded.authorNotAuthorized.yml @@ -0,0 +1,34 @@ +id: labelAdded.authorNotAuthorized +name: GitOps.PullRequestIssueManagement +description: Handlers when "Author-Not-Authorized" label is added +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: >- + When the label "Author-Not-Authorized" is added to a pull request + * Add the PR specific reply notifying the issue author + * Label with Needs-Attention + if: + - payloadType: Pull_Request + - labelAdded: + label: Author-Not-Authorized + then: + - addReply: + reply: >- + ${issueAuthor}, + + + Changes to one or more files in your PR require authorization to modify. This PR has been assigned to our on call staff to evaluate. + + + Template: msftbot/requiresApproval/MSFT + - addLabel: + label: Needs-Attention # This will automatically assign the ICM Users + # The policy service should trigger even when the label was added by the policy service + triggerOnOwnActions: true +onFailure: +onSuccess: diff --git a/.github/policies/labelAdded.changesRequested.yml b/.github/policies/labelAdded.changesRequested.yml new file mode 100644 index 00000000..bacaf0d8 --- /dev/null +++ b/.github/policies/labelAdded.changesRequested.yml @@ -0,0 +1,37 @@ +id: labelAdded.changesRequested +name: GitOps.PullRequestIssueManagement +description: Handlers when "Changes-Requested" label is added +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: >- + When the label "Changes-Requested" is added to a pull request + * Add the PR specific reply notifying the issue author + * Assign to the Author + * Label with Needs-Author-Feedback + if: + - payloadType: Pull_Request + - labelAdded: + label: Changes-Requested + then: + - addReply: + reply: >- + Hello @${issueAuthor}, + + + The package manager bot determined changes have been requested to your PR. + + + Template: msftbot/changesRequested + - assignTo: + author: True + - addLabel: + label: Needs-Author-Feedback + # The policy service should trigger even when the label was added by the policy service + triggerOnOwnActions: true +onFailure: +onSuccess: diff --git a/.github/policies/labelAdded.needsCLA.yml b/.github/policies/labelAdded.needsCLA.yml new file mode 100644 index 00000000..ac12bf16 --- /dev/null +++ b/.github/policies/labelAdded.needsCLA.yml @@ -0,0 +1,31 @@ +id: labelAdded.needsCLA +name: GitOps.PullRequestIssueManagement +description: Handlers when "Needs-CLA" label is added +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: >- + When the label "Needs-CLA" is added to a pull request + * Add the PR specific reply notifying the issue they must sign the CLA + if: + - payloadType: Pull_Request + - labelAdded: + label: Needs-CLA + then: + - addReply: + reply: >- + Hello @${issueAuthor}, + + + This PR cannot be merged until you sign the Contributor License Agreement (CLA). More information on this process can be found on the [Microsoft Open Source](https://opensource.microsoft.com/cla/) website. + + + Template: msftbot/needsCLA + # The policy service should trigger even when the label was added by the policy service + triggerOnOwnActions: true +onFailure: +onSuccess: diff --git a/.github/policies/labelAdded.noRecentActivity.yml b/.github/policies/labelAdded.noRecentActivity.yml new file mode 100644 index 00000000..c0fb40b4 --- /dev/null +++ b/.github/policies/labelAdded.noRecentActivity.yml @@ -0,0 +1,50 @@ +id: labelAdded.noRecentActivity +name: GitOps.PullRequestIssueManagement +description: Handlers when "No-Recent-Activity" label is added +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: >- + When the label "No-Recent-Activity" is added to a pull request + * Add the PR specific reply notifying the issue author of pending closure + if: + - payloadType: Pull_Request + - labelAdded: + label: No-Recent-Activity + then: + - addReply: + reply: >- + Hello @${issueAuthor}, + + + This pull request has been automatically marked as stale because it has been marked as requiring author feedback but has not had any recent activity. It will be closed if no further activity occurs **within 3 days of this comment**. + + + Template: msftbot/noRecentActivity + # The policy service should trigger even when the label was added by the policy service + triggerOnOwnActions: true + - description: >- + When the label "No-Recent-Activity" is added to an issue + * Add the issue specific reply notifying the issue author of pending closure + if: + - payloadType: Issues + - labelAdded: + label: No-Recent-Activity + then: + - addReply: + reply: >- + Hello @${issueAuthor}, + + + This issue has been automatically marked as stale because it has been marked as requiring author feedback but has not had any recent activity. It will be closed if no further activity occurs **within 3 days of this comment**. + + + Template: msftbot/noRecentActivity + # The policy service should trigger even when the label was added by the policy service + triggerOnOwnActions: true +onFailure: +onSuccess: diff --git a/.github/policies/labelAdded.projectFile.yml b/.github/policies/labelAdded.projectFile.yml new file mode 100644 index 00000000..63c493a9 --- /dev/null +++ b/.github/policies/labelAdded.projectFile.yml @@ -0,0 +1,34 @@ +id: labelAdded.projectFile +name: GitOps.PullRequestIssueManagement +description: Handlers when "Project-File" label is added +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: >- + When the label "Project-File" is added to a pull request + * Add the PR specific reply notifying the issue author + * Label with Needs-Attention + if: + - payloadType: Pull_Request + - labelAdded: + label: Project-File + then: + - addReply: + reply: >- + ${issueAuthor}, + + + Changes to one or more files in your PR require authorization to modify. This PR has been assigned to our on call staff to evaluate. + + + Template: msftbot/requiresApproval/MSFT + - addLabel: + label: Needs-Attention # This will automatically assign the ICM Users + # The policy service should trigger even when the label was added by the policy service + triggerOnOwnActions: true +onFailure: +onSuccess: diff --git a/.github/policies/labelManagement.assignIcmUsersAndModerators.yml b/.github/policies/labelManagement.assignIcmUsersAndModerators.yml new file mode 100644 index 00000000..52e85eab --- /dev/null +++ b/.github/policies/labelManagement.assignIcmUsersAndModerators.yml @@ -0,0 +1,37 @@ +id: labelAdded.assignIcmUsersAndModerators +name: GitOps.PullRequestIssueManagement +description: When these labels are added, the ICM Primary and secondary user should be assigned +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: >- + When any label below is added to a PR + * Assign the ICM users + - if: + - payloadType: Pull_Request + - or: + - labelAdded: + label: Needs-Attention + - labelAdded: + label: Internal-Error + - labelAdded: + label: Author-Not-Authorized + then: + - assignTo: + user: ryfu-msft + # - assignIcmUsers: + # teamId: 85579 + # primary: True + # secondary: False + # - assignIcmUsers: + # teamId: 85579 + # primary: False + # secondary: True + # The policy service should trigger even when the label was added by the policy service + triggerOnOwnActions: true +onFailure: +onSuccess: diff --git a/.github/policies/labelManagement.issueClosed.yml b/.github/policies/labelManagement.issueClosed.yml new file mode 100644 index 00000000..e58184d7 --- /dev/null +++ b/.github/policies/labelManagement.issueClosed.yml @@ -0,0 +1,38 @@ +id: labelManagement.issueClosed +name: GitOps.PullRequestIssueManagement +description: Handlers when an issue gets closed +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: Remove labels when an issue is closed + if: + - payloadType: Issues + - isAction: + action: Closed + then: + - removeLabel: + label: Needs-Triage + - removeLabel: + label: Needs-Attention + - removeLabel: + label: Needs-Author-Feedback + - removeLabel: + label: Help-Wanted + ## TODO: Unassign author + - description: Remove labels when a pull request is closed + if: + - payloadType: Pull_Request + - isAction: + action: Closed + then: + - removeLabel: + label: Needs-Attention + - removeLabel: + label: Needs-Author-Feedback + ## TODO: Unassign ICM Users +onFailure: +onSuccess: diff --git a/.github/policies/labelManagement.issueOpened.yml b/.github/policies/labelManagement.issueOpened.yml new file mode 100644 index 00000000..b10df136 --- /dev/null +++ b/.github/policies/labelManagement.issueOpened.yml @@ -0,0 +1,117 @@ +id: labelManagement.issueOpened +name: GitOps.PullRequestIssueManagement +description: Handlers for when an issue is first opened +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: >- + When a PR is opened/updated, if no files are modified + * Close the issue + * Add a comment + if: + - payloadType: Pull_Request + - isOpen + - or: + - isAction: + action: Opened + - isAction: + action: Synchronize + - filesMatchPattern: + pattern: ^$ + then: + - addReply: + reply: >- + Hello @${issueAuthor}, + + + This pull request does not update any files. Please review your commit history and resubmit. + + + Template: msftbot/validationError/pullRequest/noContent + - closePullRequest + - description: Add CodeFlow link to new PRs + if: + - payloadType: Pull_Request + - isAction: + action: Opened + then: + - addCodeFlowLink + # If the user is a first-time contributor, add the Needs-CLA Label + - if: + - activitySenderHasAssociation: + association: FIRST_TIME_CONTRIBUTOR + then: + - addLabel: + label: Needs-CLA + - description: Add Needs-Triage to new issues + if: + - payloadType: Issues + - isAction: + action: Opened + then: + - addLabel: + label: Needs-Triage + - description: >- + When a pull request is opened, if the files match DevOpsPipelineDefinitions/* + * Add a message to the author + * Assign to the author + * Add the "Needs-Author-Feedback" label + - description: >- + When a PR is opened/updated, if the content is in a project folder and user is not repo admin + * Add Project-File label + if: + - payloadType: Pull_Request + - isOpen + - not: + filesMatchPattern: + pattern: ^$ + - or: + - filesMatchPattern: + pattern: ^.github\\.* + - filesMatchPattern: + pattern: ^.configurations\\.* + - filesMatchPattern: + pattern: ^.vscode\\.* + - filesMatchPattern: + pattern: ^doc\\.* + - filesMatchPattern: + pattern: ^Tools\\.* + - filesMatchPattern: + pattern: ^.*\.md$ + - filesMatchPattern: + pattern: ^.gitattributes$ + - filesMatchPattern: + pattern: ^.gitignore$ + - filesMatchPattern: + pattern: ^.editorconfig$ + - filesMatchPattern: + pattern: ^LICENSE$ + - not: + activitySenderHasPermission: + permission: Admin + then: + - addLabel: + label: Project-File + - description: >- + When a PR is opened/updated, if the content is in the pipelines and user is not repo admin + * Add Author-Not-Authorized label + if: + - payloadType: Pull_Request + - isOpen + - not: + filesMatchPattern: + pattern: ^$ + - filesMatchPattern: + pattern: ^pipelines\\.* + - not: + activitySenderHasPermission: + permission: Admin + then: + - addLabel: + label: Author-Not-Authorized +onFailure: +onSuccess: diff --git a/.github/policies/labelManagement.issueUpdated.yml b/.github/policies/labelManagement.issueUpdated.yml new file mode 100644 index 00000000..b0710126 --- /dev/null +++ b/.github/policies/labelManagement.issueUpdated.yml @@ -0,0 +1,151 @@ +id: labelManagement.issueUpdated +name: GitOps.PullRequestIssueManagement +description: >- + Handlers for when an issue is updated and not closed + This primarily includes handlers for comments, reviews, and re-runs +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - description: Remove "No-Recent-Activity" when a pull request or issue is updated + if: + - or: + - payloadType: Pull_Request + - payloadType: Pull_Request_Review + - payloadType: Pull_Request_Review_Comment + - payloadType: Issue_Comment + - payloadType: Issues + - not: + isAction: + action: Closed + - hasLabel: + label: No-Recent-Activity + then: + - removeLabel: + label: No-Recent-Activity + # The policy service should not trigger itself here, or else the label would be removed immediately after being added + triggerOnOwnActions: False + - description: Clean email replies on every comment + if: + - payloadType: Issue_Comment + then: + - cleanEmailReply + - description: Sync labels with issues on all pull request events + if: + - or: + - payloadType: Pull_Request + - payloadType: Pull_Request_Review + - payloadType: Pull_Request_Review_Comment + - not: + isAction: + action: Closed + then: + - labelSync: + pattern: Blocking-Issue + - inPrLabel: + label: In-PR + - description: Remove "Help-Wanted" label when an issue goes into PR + if: + - payloadType: Issues + - labelAdded: + label: In-PR + - hasLabel: + label: Help-Wanted + then: + - removeLabel: + label: Help-Wanted + # The policy service should trigger even when the update was initiated by the policy service + triggerOnOwnActions: true + - description: >- + If an author responds to an issue which needs author feedback + * Remove the Needs-Author-Feedback Label + * Add the Needs-Attention Label + if: + - or: + - payloadType: Pull_Request_Review + - payloadType: Pull_Request_Review_Comment + - payloadType: Issue_Comment + - isActivitySender: + issueAuthor: True + - hasLabel: + label: Needs-Author-Feedback + - not: + isAction: + action: Synchronize + then: + - removeLabel: + label: Needs-Author-Feedback + - addLabel: + label: Needs-Attention # This will automatically assign the ICM Users + - description: >- + When changes are requested on a pull request + * Disable automerge + * Label with Changes-Requested + if: + - payloadType: Pull_Request_Review + - isAction: + action: Submitted + - isReviewState: + reviewState: Changes_requested + then: + - disableAutoMerge + - addLabel: + label: Changes-Requested + - description: Remove status labels when a PR is synchronized (new commits pushed) + if: + - payloadType: Pull_Request + - isAction: + action: Synchronize + then: + - removeLabel: + label: Azure-Pipeline-Passed + - removeLabel: + label: Blocking-Issue + - removeLabel: + label: Changes-Requested + # - removeLabel: + # label: Moderator-Approved + - removeLabel: + label: Needs-Attention + - removeLabel: + label: Needs-Author-Feedback + - removeLabel: + label: Unexpected-File + - description: Remove status labels when a PR is re-run + if: + - payloadType: Issue_Comment + - or: + - commentContains: + pattern: '\/[a|A][z|Z][p|P] [r|R][u|U][n|N]' + isRegex: True + - commentContains: + pattern: '\/[a|A][z|Z][u|U][r|R][e|E][p|P][i|I][p|P][e|E][l|L][i|I][n|N][e|E][s|S] [r|R][u|U][n|N]' + isRegex: True + - not: + isActivitySender: + user: microsoft-github-policy-service[bot] + issueAuthor: False + - or: + - activitySenderHasPermission: + permission: Admin + - activitySenderHasPermission: + permission: Write + then: + # Don't remove Changes-Requested here because it is just a re-run, no new commits have been added + - removeLabel: + label: Author-Not-Authorized + - removeLabel: + label: Azure-Pipeline-Passed + - removeLabel: + label: Blocking-Issue + - removeLabel: + label: Needs-Attention + - removeLabel: + label: Needs-Author-Feedback + - removeLabel: + label: Project-File +onFailure: +onSuccess: diff --git a/.github/policies/moderatorTriggers.yml b/.github/policies/moderatorTriggers.yml new file mode 100644 index 00000000..dbbc1ee5 --- /dev/null +++ b/.github/policies/moderatorTriggers.yml @@ -0,0 +1,370 @@ +id: moderatorTriggers +name: GitOps.PullRequestIssueManagement +description: Defines the users and permissions for the moderators +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + eventResponderTasks: + - if: + # If the activity sender is any one of the moderators, has Admin permission on the repo, or has Write permissions on the repo. . . + - or: + - activitySenderHasPermission: + permission: Admin + - activitySenderHasPermission: + permission: Write + - isActivitySender: + user: stephengillie + issueAuthor: False + - isActivitySender: + user: Trenly + issueAuthor: False + - isActivitySender: + user: mdanish-kh + issueAuthor: False + - isActivitySender: + user: russellbanks + issueAuthor: False + then: + # If the payload is an issue_Comment or a Pull_Request_Review_Comment + - if: + - or: + - payloadType: Issue_Comment + - payloadType: Pull_Request_Review_Comment + # Remove the Needs-Triage label + # Take different actions based on the comment pattern + then: + - removeLabel: + label: Needs-Triage + # Area-Bots + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[aA]rea[\s-][bB]ots' + isRegex: True + then: + - addLabel: + label: Area-Bots + # Area-Validation-Pipeline + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[aA]rea[\s-][vV]alidation[\s-][pP]ipeline' + isRegex: True + then: + - addLabel: + label: Area-Validation-Pipeline + # Blocking-Issue + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[bB]locking[\s-][iI]ssue' + isRegex: True + then: + - removeLabel: + label: Needs-Author-Feedback + - removeLabel: + label: Needs-Attention + - addLabel: + label: Blocking-Issue + # GitDsc + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Gg]it\.[Dd][Ss][Cc]' + isRegex: True + then: + - addLabel: + label: GitDsc + # Help-Wanted + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[hH]elp[\s-][wW]anted' + isRegex: True + then: + - addLabel: + label: Help-Wanted + # In-PR + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Ii]n[\s-][Pp][Rr]' + isRegex: True + then: + - addLabel: + label: In-PR + # Issue-Bug + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[iI]ssue[\s-][bB]ug' + isRegex: True + then: + - addLabel: + label: Issue-Bug + # Issue-Docs + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[iI]ssue[\s-][dD]ocs' + isRegex: True + then: + - addLabel: + label: Issue-Docs + # Issue-Feature + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[iI]ssue[\s-][fF]eature' + isRegex: True + then: + - addLabel: + label: Issue-Feature + # Microsoft.DotNet.Dsc + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Dd]otnet\.[Dd][Ss][Cc]' + isRegex: True + then: + - addLabel: + label: Microsoft.DotNet.Dsc + # Microsoft.VSCode.Dsc + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Vv][Ss][Cc]ode\.[Dd][Ss][Cc]' + isRegex: True + then: + - addLabel: + label: Microsoft.VSCode.Dsc + # Microsoft.Windows.Developer + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Ww]indows\.[Dd]eveloper' + isRegex: True + then: + - addLabel: + label: Microsoft.Windows.Developer + # Microsoft.Windows.Setting.Accessibility + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Ww]indows\.[Ss]ettings?\.[Aa]ccessibility' + isRegex: True + then: + - addLabel: + label: Microsoft.Windows.Setting.Accessibility + # Microsoft.Windows.Setting.Language + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Ww]indows\.[Ss]ettings?\.[Ll]anguage' + isRegex: True + then: + - addLabel: + label: Microsoft.Windows.Setting.Language + # Microsoft.Windows.Setting.System + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Ww]indows\.[Ss]ettings?\.[Ss]ystem' + isRegex: True + then: + - addLabel: + label: Microsoft.Windows.Setting.System + # Microsoft.Windows.Setting + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Ww]indows\.[Ss]ettings?' + isRegex: True + then: + - addLabel: + label: Microsoft.Windows.Setting + # Moderator-Approved + # - if: + # - commentContains: + # pattern: '\[[Pp]olicy\]\s+[mM]oderator[\s-][Aa]pproved' + # isRegex: True + # then: + # - addLabel: + # label: Moderator-Approved + # Needs-Attention + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Nn]eeds[\s-][Aa]ttention' + isRegex: True + then: + - addLabel: + label: Needs-Attention + - addReply: + reply: >- + Hello ${issueAuthor}, + + + Your pull request requires attention from a repository administrator. It has been assigned to a developer for review. + + + Template: msftbot/manualReview + # Needs-Author-Feedback + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Nn]eeds[\s-][Aa]uthor[\s-][fF]eedback' + isRegex: True + then: + - addLabel: + label: Needs-Author-Feedback + # Needs-CLA + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Nn]eeds[\s-][Cc][Ll][Aa]' + isRegex: True + then: + - addLabel: + label: Needs-CLA + # New-DSC-Resource + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Nn]ew[\s-][Dd][Ss][Cc][\s-][Rr]esource' + isRegex: True + then: + - addLabel: + label: New-DSC-Resource + # NpmDsc + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Nn][Pp][Mm]\.[Dd][Ss][Cc]' + isRegex: True + then: + - addLabel: + label: NpmDsc + # PythonPip3Dsc + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Pp]ython[Pp]ip3?[Dd][Ss][Cc]' + isRegex: True + then: + - addLabel: + label: PythonPip3Dsc + # PSA + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Pp][Ss][Aa]' + isRegex: True + then: + - addLabel: + label: Public-Service-Announcement + # YarnDsc + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[Yy]arn\.[Dd][Ss][Cc]' + isRegex: True + then: + - addLabel: + label: YarnDsc + # Unblocked + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[uU]nblocked' + isRegex: True + then: + - removeLabel: + label: Blocking-Issue + # Reset-Feedback + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[rR]eset\s+[fF]eedback' + isRegex: True + then: + - removeLabel: + label: Needs-Author-Feedback + - removeLabel: + label: Needs-Attention + # - removeLabel: + # label: Moderator-Approved + - removeLabel: + label: Changes-Requested + # Reset-Labels + - if: + - commentContains: + pattern: '\[[Pp]olicy\]\s+[rR]eset[\s-]+[lL]abels' + isRegex: True + then: + - removeLabel: + label: Area-Bots + - removeLabel: + label: Area-Validation-Pipeline + - removeLabel: + label: Blocking-Issue + - removeLabel: + label: Changes-Requested + - removeLabel: + label: Help-Wanted + - removeLabel: + label: In-PR + - removeLabel: + label: Issue-Bug + - removeLabel: + label: Issue-Docs + - removeLabel: + label: Issue-Feature + # - removeLabel: + # label: Moderator-Approved + - removeLabel: + label: Needs-Attention + - removeLabel: + label: Needs-Author-Feedback + - removeLabel: + label: Needs-CLA + - removeLabel: + label: Project-File + - removeLabel: + label: Public-Service-Announcement + ## TODO: Dismiss All Pull Request Reviews + # Duplicate of # + - if: + - commentContains: + pattern: Duplicate\s+of\s+\#?\s*\d+ + isRegex: True + then: + - addReply: + reply: >- + Hello @${issueAuthor}, + + + We've identified this as a duplicate of another issue or PR that already exists. This specific instance is being closed in favor of the linked issue. Please add your 👍 to the other issue to raise its priority. Thanks for your contribution! + + + Template: msftbot/duplicate/closed + - closeIssue + - removeLabel: + label: Needs-Triage + - removeLabel: + label: Needs-Attention + - removeLabel: + label: Needs-Author-Feedback + - addLabel: + label: Resolution-Duplicate + # Close with reason <>; + - if: + - commentContains: + pattern: "[cC]lose\\s+[wW]ith\\s+[rR]eason\\s*:[\\w\\s\\-\\(\\)\\[\\]\\{\\}\\\\\\/.+=@\\#$%&^*`~|'\",<>?]*(?=;)" + isRegex: True + then: + - closeIssue + - removeLabel: + label: Needs-Triage + - removeLabel: + label: Needs-Attention + - removeLabel: + label: Needs-Author-Feedback + # Reopen with reason <>; + - if: + - commentContains: + pattern: "[rR]eopen\\s+[wW]ith\\s+[rR]eason\\s*:[\\w\\s\\-\\(\\)\\[\\]\\{\\}\\\\\\/.+=@\\#$%&^*`~|'\",<>?]*(?=;)" + isRegex: True + then: + - reopenIssue + - removeLabel: + label: Resolution-Duplicate + - removeLabel: + label: No-Recent-Activity + # If the payload is a Pull_Request_Review and an approval, add the Moderator-Approved label + # - if: + # - payloadType: Pull_Request_Review + # - isReviewState: + # reviewState: Approved + # then: + # - addLabel: + # label: Moderator-Approved +onFailure: +onSuccess: diff --git a/.github/policies/scheduledSearch.cleanupInPRLabels.yml b/.github/policies/scheduledSearch.cleanupInPRLabels.yml new file mode 100644 index 00000000..6bf1deb5 --- /dev/null +++ b/.github/policies/scheduledSearch.cleanupInPRLabels.yml @@ -0,0 +1,42 @@ +# Due to limitations in the policy service, it isn't possible to check on the state of the linked PRs because of this +# the assumption is made that if a linked PR is merged, the issue will be closed automatically. If the issue doesn't +# close, then the PR must not have been merged and is either stale or was closed. Since there is no way to check for +# that state specifically, the policy checks to see if there has been any activity on the issue. Any comments, labels +# or other actions on the issue will reset the 15 day period. + +id: scheduledSearch.cleanupInPRLabels +name: GitOps.PullRequestIssueManagement +description: Remove the In-PR label from issues where the PR has become stale +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + scheduledSearches: + - description: >- + Search for issues where - + * Issue is Open + * Issue has the label In-PR + * Has not had activity in the last 15 days + + Then - + * Remove In-PR label + * Add Help-Wanted label + frequencies: + - hourly: + hour: 12 + filters: + - isIssue + - isOpen + - hasLabel: + label: In-PR + - noActivitySince: + days: 15 + actions: + - removeLabel: + label: In-PR + - addLabel: + label: Help-Wanted +onFailure: +onSuccess: diff --git a/.github/policies/scheduledSearch.closeNoRecentActivity.yml b/.github/policies/scheduledSearch.closeNoRecentActivity.yml new file mode 100644 index 00000000..cbc302d3 --- /dev/null +++ b/.github/policies/scheduledSearch.closeNoRecentActivity.yml @@ -0,0 +1,64 @@ +id: scheduledSearch.closeNoRecentActivity +name: GitOps.PullRequestIssueManagement +description: Close stale issues and pull requests marked with "No-Recent-Activity" and "Needs-Author-Feedback" +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + scheduledSearches: + - description: >- + Search for PR where - + * Pull Request is Open + * Pull request has the label No-Recent-Activity + * Pull request has the label Needs-Author-Feedback + * Pull request does not have the label Blocking-Issue + * Has not had activity in the last 3 days + + Then - + * Close the PR + frequencies: + - hourly: + hour: 12 + filters: + - isPullRequest + - isOpen + - hasLabel: + label: No-Recent-Activity + - hasLabel: + label: Needs-Author-Feedback + - isNotLabeledWith: + label: Blocking-Issue + - noActivitySince: + days: 3 + actions: + - closeIssue + - description: >- + Search for Issues where - + * Issue is Open + * Issue has the label No-Recent-Activity + * Issue has the label Needs-Author-Feedback + * Issue does not have the label Blocking-Issue + * Has not had activity in the last 3 days + + Then - + * Close the Issue + frequencies: + - hourly: + hour: 12 + filters: + - isIssue + - isOpen + - hasLabel: + label: No-Recent-Activity + - hasLabel: + label: Needs-Author-Feedback + - isNotLabeledWith: + label: Blocking-Issue + - noActivitySince: + days: 3 + actions: + - closeIssue +onFailure: +onSuccess: diff --git a/.github/policies/scheduledSearch.markNoRecentActivity.yml b/.github/policies/scheduledSearch.markNoRecentActivity.yml new file mode 100644 index 00000000..df7cf2d9 --- /dev/null +++ b/.github/policies/scheduledSearch.markNoRecentActivity.yml @@ -0,0 +1,68 @@ +id: scheduledSearch.markNoRecentActivity +name: GitOps.PullRequestIssueManagement +description: Add "No-Recent-Activity" to stale issues and pull requests +owner: +resource: repository +disabled: false +where: +configuration: + resourceManagementConfiguration: + scheduledSearches: + - description: >- + Search for PR where - + * Pull Request is Open + * Pull request does not have the label No-Recent-Activity + * Pull request does not have the label Blocking-Issue + * Pull request has the label Needs-Author-Feedback + * Has not had activity in the last 5 days + + Then - + * Add No-Recent-Activity label + - Triggers labelAdded.noRecentActivity.yml + frequencies: + - hourly: + hour: 12 + filters: + - isPullRequest + - isOpen + - isNotLabeledWith: + label: No-Recent-Activity + - isNotLabeledWith: + label: Blocking-Issue + - hasLabel: + label: Needs-Author-Feedback + - noActivitySince: + days: 5 + actions: + - addLabel: + label: No-Recent-Activity + - description: >- + Search for issues where - + * Issue is Open + * Issue does not have the label No-Recent-Activity + * Issue does not have the label Blocking-Issue + * Issue has the label Needs-Author-Feedback + * Has not had activity in the last 5 days + + Then - + * Add No-Recent-Activity label + - Triggers labelAdded.noRecentActivity.yml + frequencies: + - hourly: + hour: 12 + filters: + - isIssue + - isOpen + - isNotLabeledWith: + label: No-Recent-Activity + - isNotLabeledWith: + label: Blocking-Issue + - hasLabel: + label: Needs-Author-Feedback + - noActivitySince: + days: 5 + actions: + - addLabel: + label: No-Recent-Activity +onFailure: +onSuccess: diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..33d1ff21 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "redhat.vscode-yaml", + "EditorConfig.EditorConfig" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index e5dec5b4..2d799776 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,8 @@ { "powershell.codeFormatting.preset": "Allman", - "editor.formatOnSave": true -} \ No newline at end of file + "editor.formatOnSave": true, + "[powershell]": { + "files.encoding": "utf8bom", + "files.autoGuessEncoding": true + } +} From f9a5809faa10eb0b12924ad926aa25f51339c8f2 Mon Sep 17 00:00:00 2001 From: Kaleb Luedtke Date: Tue, 5 Nov 2024 11:57:59 -0600 Subject: [PATCH 3/6] Add additional labels to the remove label function (#111) --- .github/policies/moderatorTriggers.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/policies/moderatorTriggers.yml b/.github/policies/moderatorTriggers.yml index dbbc1ee5..8dc77981 100644 --- a/.github/policies/moderatorTriggers.yml +++ b/.github/policies/moderatorTriggers.yml @@ -287,6 +287,8 @@ configuration: label: Blocking-Issue - removeLabel: label: Changes-Requested + - removeLabel: + label: GitDsc - removeLabel: label: Help-Wanted - removeLabel: @@ -297,6 +299,20 @@ configuration: label: Issue-Docs - removeLabel: label: Issue-Feature + - removeLabel: + label: Microsoft.DotNet.Dsc + - removeLabel: + label: Microsoft.VSCode.Dsc + - removeLabel: + label: Microsoft.Windows.Developer + - removeLabel: + label: Microsoft.Windows.Setting.Accessibility + - removeLabel: + label: Microsoft.Windows.Setting.Language + - removeLabel: + label: Microsoft.Windows.Setting.System + - removeLabel: + label: Microsoft.Windows.Setting # - removeLabel: # label: Moderator-Approved - removeLabel: @@ -305,10 +321,18 @@ configuration: label: Needs-Author-Feedback - removeLabel: label: Needs-CLA + - removeLabel: + label: New-DSC-Resource + - removeLabel: + label: NpmDsc - removeLabel: label: Project-File - removeLabel: label: Public-Service-Announcement + - removeLabel: + label: PythonPip3Dsc + - removeLabel: + label: YarnDsc ## TODO: Dismiss All Pull Request Reviews # Duplicate of # - if: From 8d56865086a0577984175782bf98ebbd0817f575 Mon Sep 17 00:00:00 2001 From: Kaleb Luedtke Date: Tue, 5 Nov 2024 12:09:14 -0600 Subject: [PATCH 4/6] Fix some triggers (#112) --- .github/policies/moderatorTriggers.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/policies/moderatorTriggers.yml b/.github/policies/moderatorTriggers.yml index 8dc77981..662c1db1 100644 --- a/.github/policies/moderatorTriggers.yml +++ b/.github/policies/moderatorTriggers.yml @@ -69,7 +69,7 @@ configuration: # GitDsc - if: - commentContains: - pattern: '\[[Pp]olicy\]\s+[Gg]it\.[Dd][Ss][Cc]' + pattern: '\[[Pp]olicy\]\s+[Gg]it[Dd][Ss][Cc]' isRegex: True then: - addLabel: @@ -117,7 +117,7 @@ configuration: # Microsoft.DotNet.Dsc - if: - commentContains: - pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Dd]otnet\.[Dd][Ss][Cc]' + pattern: '\[[Pp]olicy\]\s+[Mm]icrosoft\.[Dd]ot[Nn]et\.[Dd][Ss][Cc]' isRegex: True then: - addLabel: @@ -246,7 +246,7 @@ configuration: # YarnDsc - if: - commentContains: - pattern: '\[[Pp]olicy\]\s+[Yy]arn\.[Dd][Ss][Cc]' + pattern: '\[[Pp]olicy\]\s+[Yy]arn[Dd][Ss][Cc]' isRegex: True then: - addLabel: From 5b8e76299aa4c51ca8e4137a8d8e60fe70a5c88e Mon Sep 17 00:00:00 2001 From: Kaleb Luedtke Date: Tue, 5 Nov 2024 12:43:59 -0600 Subject: [PATCH 5/6] Lint All Files (#115) --- .github/ISSUE_TEMPLATE/Bug_Report.yml | 2 +- .../ISSUE_TEMPLATE/Documentation_Issue.yml | 2 +- .github/ISSUE_TEMPLATE/Feature_Request.yml | 2 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 2 +- CONTRIBUTING.md | 2 +- PRIVACY.md | 2 +- SECURITY.md | 2 +- SUPPORT.md | 34 +- doc/specs/spec-template.md | 2 +- pipelines/azure-pipelines.yml | 30 +- resources/GitDsc/GitDsc.psd1 | 170 ++++----- resources/GitDsc/GitDsc.psm1 | 16 +- .../Microsoft.Dotnet.Dsc/DotNetToolPackage.md | 14 +- .../Microsoft.DotNet.Dsc.psm1 | 44 +-- .../Microsoft.VSCode.Dsc.psd1 | 22 +- .../Microsoft.VSCode.Dsc.psm1 | 124 +++--- .../Microsoft.Windows.Developer.psm1 | 16 +- ...crosoft.Windows.Setting.Accessibility.psd1 | 6 +- ...crosoft.Windows.Setting.Accessibility.psm1 | 110 +++--- .../Microsoft.WindowsSandbox.DSC.psd1 | 162 ++++---- resources/NpmDsc/NpmDsc.psd1 | 164 ++++---- resources/PythonPip3Dsc/PythonPip3Dsc.psd1 | 162 ++++---- resources/README.md | 110 +++--- resources/YarnDsc/YarnDsc.psd1 | 162 ++++---- resources/YarnDsc/YarnDsc.psm1 | 6 +- .../Microsoft.DotNet.Dsc.Tests.ps1 | 26 +- .../Microsoft.VSCode.Dsc.Tests.ps1 | 28 +- .../Microsoft.Windows.Developer.Tests.ps1 | 352 +++++++++--------- tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1 | 14 +- 30 files changed, 911 insertions(+), 879 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/Bug_Report.yml b/.github/ISSUE_TEMPLATE/Bug_Report.yml index 007623a3..06f87dbd 100644 --- a/.github/ISSUE_TEMPLATE/Bug_Report.yml +++ b/.github/ISSUE_TEMPLATE/Bug_Report.yml @@ -50,4 +50,4 @@ body: Any other software? render: shell validations: - required: true \ No newline at end of file + required: true diff --git a/.github/ISSUE_TEMPLATE/Documentation_Issue.yml b/.github/ISSUE_TEMPLATE/Documentation_Issue.yml index a4ab5afa..4288302f 100644 --- a/.github/ISSUE_TEMPLATE/Documentation_Issue.yml +++ b/.github/ISSUE_TEMPLATE/Documentation_Issue.yml @@ -7,4 +7,4 @@ body: label: Brief description of your issue placeholder: Briefly describe which document needs to be corrected and why validations: - required: true \ No newline at end of file + required: true diff --git a/.github/ISSUE_TEMPLATE/Feature_Request.yml b/.github/ISSUE_TEMPLATE/Feature_Request.yml index 99badc71..f5253709 100644 --- a/.github/ISSUE_TEMPLATE/Feature_Request.yml +++ b/.github/ISSUE_TEMPLATE/Feature_Request.yml @@ -15,4 +15,4 @@ body: label: Proposed technical implementation details placeholder: A clear and concise description of what you want to happen validations: - required: false \ No newline at end of file + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 382e1885..b6c36d66 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -8,4 +8,4 @@ contact_links: about: Have a question on something? Start a new discussion thread. - name: Review open issues url: https://github.com/microsoft/winget-dsc/issues - about: Please check if your issue or a similar issue has already been submitted \ No newline at end of file + about: Please check if your issue or a similar issue has already been submitted diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index eda6b845..d6d5af0e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,4 +3,4 @@ - [ ] I have signed the [Contributor License Agreement](https://cla.opensource.microsoft.com/microsoft/winget-dsc). - [ ] This pull request is related to an issue. ------ \ No newline at end of file +----- diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 75c153fa..5a33cac4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -136,4 +136,4 @@ Once your code has been reviewed and approved by the requisite number of team me ## Thank you -Thank you in advance for your contribution! Now, [what's next on the list](https://github.com/microsoft/winget-cli/labels/Help%20Wanted)? 😜 \ No newline at end of file +Thank you in advance for your contribution! Now, [what's next on the list](https://github.com/microsoft/winget-cli/labels/Help%20Wanted)? 😜 diff --git a/PRIVACY.md b/PRIVACY.md index 3e9b9f2c..a5a9e8ea 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -1,3 +1,3 @@ # Data Collection -The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. \ No newline at end of file +The software may collect information about you and your use of the software and send it to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may turn off the telemetry as described in the repository. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft's privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. diff --git a/SECURITY.md b/SECURITY.md index 3ec12044..82db58aa 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -38,4 +38,4 @@ We prefer all communications to be in English. Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). - \ No newline at end of file + diff --git a/SUPPORT.md b/SUPPORT.md index 1126e223..e3a09afd 100644 --- a/SUPPORT.md +++ b/SUPPORT.md @@ -1,17 +1,17 @@ -# Support - -## How to file issues and get help - -This project uses [GitHub issues][gh-issue] to [track bugs][gh-bug] and [feature requests][gh-feature]. Please search the existing issues before filing new issues to avoid duplicates. For new topics, file your bug or feature request as a new issue. - -For help and questions about using this project, please look at the [docs site for Windows Package Manager][docs] and our [Contributor's Guide][contributor] if you want to work on WinGet. - -## Microsoft Support Policy - -Support for Windows Package Manager is limited to the resources listed above. - -[gh-issue]: https://github.com/microsoft/winget-dsc/issues/new/choose -[gh-bug]: https://github.com/microsoft/winget-dsc/issues/new?assignees=&labels=Issue-Bug&projects=&template=Bug_Report.yml -[gh-feature]: https://github.com/microsoft/winget-dsc/issues/new?assignees=&labels=Issue-Feature&projects=&template=Feature_Request.yml -[docs]: https://docs.microsoft.com/windows/package-manager -[contributor]: https://github.com/microsoft/winget-dsc/blob/master/CONTRIBUTING.md \ No newline at end of file +# Support + +## How to file issues and get help + +This project uses [GitHub issues][gh-issue] to [track bugs][gh-bug] and [feature requests][gh-feature]. Please search the existing issues before filing new issues to avoid duplicates. For new topics, file your bug or feature request as a new issue. + +For help and questions about using this project, please look at the [docs site for Windows Package Manager][docs] and our [Contributor's Guide][contributor] if you want to work on WinGet. + +## Microsoft Support Policy + +Support for Windows Package Manager is limited to the resources listed above. + +[gh-issue]: https://github.com/microsoft/winget-dsc/issues/new/choose +[gh-bug]: https://github.com/microsoft/winget-dsc/issues/new?assignees=&labels=Issue-Bug&projects=&template=Bug_Report.yml +[gh-feature]: https://github.com/microsoft/winget-dsc/issues/new?assignees=&labels=Issue-Feature&projects=&template=Feature_Request.yml +[docs]: https://docs.microsoft.com/windows/package-manager +[contributor]: https://github.com/microsoft/winget-dsc/blob/master/CONTRIBUTING.md diff --git a/doc/specs/spec-template.md b/doc/specs/spec-template.md index 1ddc54ed..940ce6a2 100644 --- a/doc/specs/spec-template.md +++ b/doc/specs/spec-template.md @@ -57,4 +57,4 @@ issue id: ## Resources -[comment]: # Be sure to add links to references, resources, footnotes, etc. \ No newline at end of file +[comment]: # Be sure to add links to references, resources, footnotes, etc. diff --git a/pipelines/azure-pipelines.yml b/pipelines/azure-pipelines.yml index 8e619f41..e68067ed 100644 --- a/pipelines/azure-pipelines.yml +++ b/pipelines/azure-pipelines.yml @@ -1,5 +1,5 @@ # winget-dsc pipeline to publish artifacts -name: "$(Build.DefinitionName)-$(Build.DefinitionVersion)-$(Date:yyyyMMdd)-$(Rev:r)" +name: '$(Build.DefinitionName)-$(Build.DefinitionVersion)-$(Date:yyyyMMdd)-$(Rev:r)' # Commit triggers trigger: @@ -41,43 +41,43 @@ extends: - stage: WinGet_DSC_Artifacts_Publish jobs: - job: Publish_WinGet_DSC_Resources - displayName: "Publish WinGet DSC Resources" + displayName: 'Publish WinGet DSC Resources' templateContext: outputs: - output: pipelineArtifact - displayName: "Publish Pipeline Microsoft.Windows.Developer" + displayName: 'Publish Pipeline Microsoft.Windows.Developer' targetPath: $(Build.SourcesDirectory)\resources\Microsoft.Windows.Developer\ artifactName: Microsoft.Windows.Developer - output: pipelineArtifact - displayName: "Publish Pipeline Microsoft.Windows.Setting.Accessibility" + displayName: 'Publish Pipeline Microsoft.Windows.Setting.Accessibility' targetPath: $(Build.SourcesDirectory)\resources\Microsoft.Windows.Setting.Accessibility\ artifactName: Microsoft.Windows.Setting.Accessibility - output: pipelineArtifact - displayName: "Publish Pipeline PythonPip3Dsc" + displayName: 'Publish Pipeline PythonPip3Dsc' targetPath: $(Build.SourcesDirectory)\resources\PythonPip3Dsc\ artifactName: PythonPip3Dsc - output: pipelineArtifact - displayName: "Publish Pipeline YarnDsc" + displayName: 'Publish Pipeline YarnDsc' targetPath: $(Build.SourcesDirectory)\resources\YarnDsc\ artifactName: YarnDsc - output: pipelineArtifact - displayName: "Publish Pipeline NpmDsc" + displayName: 'Publish Pipeline NpmDsc' targetPath: $(Build.SourcesDirectory)\resources\NpmDsc\ artifactName: NpmDsc - output: pipelineArtifact - displayName: "Publish Pipeline Microsoft.WindowsSandbox.DSC" + displayName: 'Publish Pipeline Microsoft.WindowsSandbox.DSC' targetPath: $(Build.SourcesDirectory)\resources\Microsoft.WindowsSandbox.DSC\ artifactName: Microsoft.WindowsSandbox.DSC - output: pipelineArtifact - displayName: "Publish Pipeline GitDsc" + displayName: 'Publish Pipeline GitDsc' targetPath: $(Build.SourcesDirectory)\resources\GitDsc\ artifactName: GitDsc - output: pipelineArtifact - displayName: "Publish Pipeline Microsoft.VSCode.Dsc" + displayName: 'Publish Pipeline Microsoft.VSCode.Dsc' targetPath: $(Build.SourcesDirectory)\resources\Microsoft.VSCode.Dsc\ artifactName: Microsoft.VSCode.Dsc - output: pipelineArtifact - displayName: "Publish Pipeline Microsoft.DotNet.Dsc" + displayName: 'Publish Pipeline Microsoft.DotNet.Dsc' targetPath: $(Build.SourcesDirectory)\resources\Microsoft.DotNet.Dsc\ artifactName: Microsoft.DotNet.Dsc @@ -87,10 +87,10 @@ extends: fetchTags: false - task: PowerShell@2 - displayName: "Run Pester tests for DSC modules" + displayName: 'Run Pester tests for DSC modules' inputs: pwsh: true - targetType: "inline" + targetType: 'inline' script: | $env:PSModulePath += ";$(Build.SourcesDirectory)\resources" Invoke-Pester -CI @@ -99,6 +99,6 @@ extends: - task: PublishTestResults@2 inputs: - testResultsFormat: "NUnit" - testResultsFiles: "**/Test*.xml" + testResultsFormat: 'NUnit' + testResultsFiles: '**/Test*.xml' failTaskOnFailedTests: true diff --git a/resources/GitDsc/GitDsc.psd1 b/resources/GitDsc/GitDsc.psd1 index ddaa013b..fff1be9a 100644 --- a/resources/GitDsc/GitDsc.psd1 +++ b/resources/GitDsc/GitDsc.psd1 @@ -8,130 +8,130 @@ @{ -# Script module or binary module file associated with this manifest. -RootModule = 'GitDsc.psm1' + # Script module or binary module file associated with this manifest. + RootModule = 'GitDsc.psm1' -# Version number of this module. -ModuleVersion = '0.1.0' + # Version number of this module. + ModuleVersion = '0.1.0' -# Supported PSEditions -# CompatiblePSEditions = @() + # Supported PSEditions + # CompatiblePSEditions = @() -# ID used to uniquely identify this module -GUID = 'd5c78779-2fa7-4356-87cb-13bb41102e7e' + # ID used to uniquely identify this module + GUID = 'd5c78779-2fa7-4356-87cb-13bb41102e7e' -# Author of this module -Author = 'DscSamples' + # Author of this module + Author = 'DscSamples' -# Company or vendor of this module -# CompanyName = '' + # Company or vendor of this module + # CompanyName = '' -# Copyright statement for this module -# Copyright = '' + # Copyright statement for this module + # Copyright = '' -# Description of the functionality provided by this module -Description = 'DSC Resource for Git' + # Description of the functionality provided by this module + Description = 'DSC Resource for Git' -# Minimum version of the PowerShell engine required by this module -# PowerShellVersion = '' + # Minimum version of the PowerShell engine required by this module + # PowerShellVersion = '' -# Name of the PowerShell host required by this module -# PowerShellHostName = '' + # Name of the PowerShell host required by this module + # PowerShellHostName = '' -# Minimum version of the PowerShell host required by this module -# PowerShellHostVersion = '' + # Minimum version of the PowerShell host required by this module + # PowerShellHostVersion = '' -# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# DotNetFrameworkVersion = '' + # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # DotNetFrameworkVersion = '' -# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# ClrVersion = '' + # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # ClrVersion = '' -# Processor architecture (None, X86, Amd64) required by this module -# ProcessorArchitecture = '' + # Processor architecture (None, X86, Amd64) required by this module + # ProcessorArchitecture = '' -# Modules that must be imported into the global environment prior to importing this module -# RequiredModules = @() + # Modules that must be imported into the global environment prior to importing this module + # RequiredModules = @() -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() + # Assemblies that must be loaded prior to importing this module + # RequiredAssemblies = @() -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -# ScriptsToProcess = @() + # Script files (.ps1) that are run in the caller's environment prior to importing this module. + # ScriptsToProcess = @() -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() + # Type files (.ps1xml) to be loaded when importing this module + # TypesToProcess = @() -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() + # Format files (.ps1xml) to be loaded when importing this module + # FormatsToProcess = @() -# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -# NestedModules = @() + # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess + # NestedModules = @() -# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -# FunctionsToExport = @() + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + # FunctionsToExport = @() -# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. -# CmdletsToExport = @() + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + # CmdletsToExport = @() -# Variables to export from this module -# VariablesToExport = '*' + # Variables to export from this module + # VariablesToExport = '*' -# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -# AliasesToExport = @() + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + # AliasesToExport = @() -# DSC resources to export from this module -DscResourcesToExport = @( - 'GitClone', - 'GitRemote', - 'GitConfigUserName', - 'GitConfigUserEmail', - 'GitConfigFile' -) + # DSC resources to export from this module + DscResourcesToExport = @( + 'GitClone', + 'GitRemote', + 'GitConfigUserName', + 'GitConfigUserEmail', + 'GitConfigFile' + ) -# List of all modules packaged with this module -# ModuleList = @() + # List of all modules packaged with this module + # ModuleList = @() -# List of all files packaged with this module -# FileList = @() + # List of all files packaged with this module + # FileList = @() -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ - PSData = @{ + PSData = @{ - # Tags applied to this module. These help with module discovery in online galleries. - Tags = @('PSDscResource_GitClone', 'PSDscResource_GitRemote', 'PSDscResource_GitConfigUserName', 'PSDscResource_GitConfigUserEmail', 'PSDscResource_GitConfigFile') + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('PSDscResource_GitClone', 'PSDscResource_GitRemote', 'PSDscResource_GitConfigUserName', 'PSDscResource_GitConfigUserEmail', 'PSDscResource_GitConfigFile') - # A URL to the license for this module. - # LicenseUri = '' + # A URL to the license for this module. + # LicenseUri = '' - # A URL to the main website for this project. - # ProjectUri = '' + # A URL to the main website for this project. + # ProjectUri = '' - # A URL to an icon representing this module. - # IconUri = '' + # A URL to an icon representing this module. + # IconUri = '' - # ReleaseNotes of this module - # ReleaseNotes = '' + # ReleaseNotes of this module + # ReleaseNotes = '' - # Prerelease string of this module - Prerelease = 'alpha' + # Prerelease string of this module + Prerelease = 'alpha' - # Flag to indicate whether the module requires explicit user acceptance for install/update/save - # RequireLicenseAcceptance = $false + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false - # External dependent modules of this module - # ExternalModuleDependencies = @() + # External dependent modules of this module + # ExternalModuleDependencies = @() - } # End of PSData hashtable + } # End of PSData hashtable -} # End of PrivateData hashtable + } # End of PrivateData hashtable -# HelpInfo URI of this module -# HelpInfoURI = '' + # HelpInfo URI of this module + # HelpInfoURI = '' -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' + # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. + # DefaultCommandPrefix = '' } diff --git a/resources/GitDsc/GitDsc.psm1 b/resources/GitDsc/GitDsc.psm1 index ff5a5acd..e4ede96c 100644 --- a/resources/GitDsc/GitDsc.psm1 +++ b/resources/GitDsc/GitDsc.psm1 @@ -58,7 +58,7 @@ class GitClone if (Test-Path $expectedDirectory) { Set-Location -Path $expectedDirectory - try + try { $gitRemoteValue = Invoke-GitRemote("get-url $($currentState.RemoteName)") if ($gitRemoteValue -like $this.HttpsUrl) @@ -124,7 +124,7 @@ class GitRemote if (-not(Test-Path -Path $this.ProjectDirectory)) { throw "Project directory does not exist." - } + } Set-Location $this.ProjectDirectory try @@ -339,7 +339,7 @@ class GitConfigUserEmail function Assert-Git { # Refresh session $path value before invoking 'git' - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") + $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") try { Invoke-Git -Command 'help' @@ -355,7 +355,7 @@ function GetGitProjectName { param( [Parameter()] - [string]$HttpsUrl + [string]$HttpsUrl ) $projectName = ($HttpsUrl.split('/')[-1]).split('.')[0] @@ -379,20 +379,20 @@ function Invoke-GitRemote { param( [Parameter()] - [string]$Arguments + [string]$Arguments ) $command = [List[string]]::new() $command.Add("remote") $command.Add($Arguments) - return Invoke-Git -Command $command + return Invoke-Git -Command $command } function Invoke-GitClone { param( [Parameter()] - [string]$Arguments + [string]$Arguments ) $command = [List[string]]::new() @@ -443,4 +443,4 @@ function Assert-IsAdministrator } } -#endregion Functions \ No newline at end of file +#endregion Functions diff --git a/resources/Help/Microsoft.Dotnet.Dsc/DotNetToolPackage.md b/resources/Help/Microsoft.Dotnet.Dsc/DotNetToolPackage.md index 10cf4af0..65a39961 100644 --- a/resources/Help/Microsoft.Dotnet.Dsc/DotNetToolPackage.md +++ b/resources/Help/Microsoft.Dotnet.Dsc/DotNetToolPackage.md @@ -41,9 +41,9 @@ Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Met ### EXAMPLE 2 ```powershell -Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Method Set -Property @{ - PackageId = 'GitVersion.Tool'; - Version = '5.6.8'; +Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Method Set -Property @{ + PackageId = 'GitVersion.Tool'; + Version = '5.6.8'; } # This example installs the .NET tool package 'GitVersion.Tool' version 5.6.8 in the default directory. @@ -52,10 +52,10 @@ Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Met ### EXAMPLE 3 ```powershell -Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Method Set -Property @{ - PackageId = 'PowerShell'; - Prerelease = $true; - ToolPathDirectory = 'C:\tools'; +Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Method Set -Property @{ + PackageId = 'PowerShell'; + Prerelease = $true; + ToolPathDirectory = 'C:\tools'; } # This example installs the prerelease version of the .NET tool package 'PowerShell' in the 'C:\tools' directory. diff --git a/resources/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.psm1 b/resources/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.psm1 index 5027ccec..d6bb7175 100644 --- a/resources/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.psm1 +++ b/resources/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.psm1 @@ -89,9 +89,9 @@ function Get-DotNetToolArguments ToolPathDirectory = "--tool-path {0}" Downgrade = '--allow-downgrade' } - + $PSBoundParameters.GetEnumerator() | ForEach-Object { - if ($mappingTable.ContainsKey($_.Key)) + if ($mappingTable.ContainsKey($_.Key)) { if ($_.Value -ne $false -and -not (([string]::IsNullOrEmpty($_.Value)))) { @@ -153,7 +153,7 @@ function Get-InstalledDotNetToolPackages [ValidateScript({ if (-Not ($_ | Test-Path -PathType Container) ) { - throw "Directory does not exist" + throw "Directory does not exist" } return $true })] @@ -210,7 +210,7 @@ function Get-SemVer($version) $major = [int]$matches['major'] $minor = [int]$matches['minor'] $patch = [int]$matches['patch'] - + if ($null -eq $matches['pre']) { $pre = @() } else { $pre = $matches['pre'].Split(".") } @@ -220,7 +220,7 @@ function Get-SemVer($version) $revision = Get-HighestRevision -InputArray $pre } - return [version]$version = "$major.$minor.$patch.$revision" + return [version]$version = "$major.$minor.$patch.$revision" } function Get-HighestRevision @@ -306,9 +306,9 @@ function Uninstall-DotNetToolPackage ) $installArgument = Get-DotNetToolArguments @PSBoundParameters - $arguments = "tool uninstall $installArgument" + $arguments = "tool uninstall $installArgument" Write-Verbose -Message "Uninstalling dotnet tool package with arguments: $arguments" - + Invoke-DotNet -Command $arguments } @@ -365,18 +365,18 @@ $DotNetCliPath = Get-DotNetPath This example gets the current state of the .NET tool package 'GitVersion.Tool' in the default directory. .EXAMPLE - PS C:\> Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Method Set -Property @{ - PackageId = 'GitVersion.Tool'; - Version = '5.6.8'; + PS C:\> Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Method Set -Property @{ + PackageId = 'GitVersion.Tool'; + Version = '5.6.8'; } - + This example installs the .NET tool package 'GitVersion.Tool' version 5.6.8 in the default directory. .EXAMPLE - PS C:\> Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Method Set -Property @{ - PackageId = 'PowerShell'; - Prerelease = $true; - ToolPathDirectory = 'C:\tools'; + PS C:\> Invoke-DscResource -ModuleName Microsoft.DotNet.Dsc -Name DotNetToolPackage -Method Set -Property @{ + PackageId = 'PowerShell'; + Prerelease = $true; + ToolPathDirectory = 'C:\tools'; } This example installs the prerelease version of the .NET tool package 'PowerShell' in the 'C:\tools' directory. @@ -446,7 +446,7 @@ class DotNetToolPackage return $currentState } - + return [DotNetToolPackage]@{ PackageId = $this.PackageId Version = $this.Version @@ -515,7 +515,7 @@ class DotNetToolPackage #region DotNetToolPackage helper functions static [void] GetInstalledPackages() - { + { [DotNetToolPackage]::InstalledPackages = @{} foreach ($extension in [DotNetToolPackage]::Export()) @@ -525,7 +525,7 @@ class DotNetToolPackage } static [void] GetInstalledPackages([hashtable] $filterProperties) - { + { [DotNetToolPackage]::InstalledPackages = @{} foreach ($extension in [DotNetToolPackage]::Export($filterProperties)) @@ -541,7 +541,7 @@ class DotNetToolPackage return } - $params = $this.ToHashTable() + $params = $this.ToHashTable() Update-DotNetToolpackage @params [DotNetToolPackage]::GetInstalledPackages() @@ -553,7 +553,7 @@ class DotNetToolPackage { return } - + $this.Uninstall($false) $this.Install($false) [DotNetToolPackage]::GetInstalledPackages() @@ -566,7 +566,7 @@ class DotNetToolPackage return } - $params = $this.ToHashTable() + $params = $this.ToHashTable() Install-DotNetToolpackage @params [DotNetToolPackage]::GetInstalledPackages() @@ -614,4 +614,4 @@ class DotNetToolPackage } #endregion DotNetToolPackage helper functions } -#endregion Classes \ No newline at end of file +#endregion Classes diff --git a/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psd1 b/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psd1 index b04d7a3f..0df7d574 100644 --- a/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psd1 +++ b/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psd1 @@ -1,21 +1,21 @@ @{ - RootModule = 'Microsoft.VSCode.Dsc.psm1' - ModuleVersion = '0.1.0' - GUID = 'baf2c585-d931-4089-8500-93a5b8de1741' - Author = 'Microsoft Corporation' - CompanyName = 'Microsoft Corporation' - Copyright = '(c) Microsoft Corporation. All rights reserved.' - Description = 'DSC Resource for Visual Studio Code' - PowerShellVersion = '7.2' + RootModule = 'Microsoft.VSCode.Dsc.psm1' + ModuleVersion = '0.1.0' + GUID = 'baf2c585-d931-4089-8500-93a5b8de1741' + Author = 'Microsoft Corporation' + CompanyName = 'Microsoft Corporation' + Copyright = '(c) Microsoft Corporation. All rights reserved.' + Description = 'DSC Resource for Visual Studio Code' + PowerShellVersion = '7.2' DscResourcesToExport = @( 'VSCodeExtension' ) - PrivateData = @{ + PrivateData = @{ PSData = @{ # Tags applied to this module. These help with module discovery in online galleries. - Tags = @( + Tags = @( 'PSDscResource_VSCodeExtension' - ) + ) # Prerelease string of this module Prerelease = 'alpha' diff --git a/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psm1 b/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psm1 index cf70bd41..a12b587c 100644 --- a/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psm1 +++ b/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psm1 @@ -5,7 +5,8 @@ $ErrorActionPreference = "Stop" Set-StrictMode -Version Latest #region Functions -function Get-VSCodeCLIPath { +function Get-VSCodeCLIPath +{ param ( [switch]$Insiders ) @@ -56,7 +57,8 @@ function Get-VSCodeCLIPath { throw "VSCode is not installed." } -function Install-VSCodeExtension { +function Install-VSCodeExtension +{ [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipelineByPropertyName)] @@ -64,12 +66,15 @@ function Install-VSCodeExtension { [Parameter(ValueFromPipelineByPropertyName)] [string]$Version ) - - begin { - function Get-VSCodeExtensionInstallArgument { + + begin + { + function Get-VSCodeExtensionInstallArgument + { param([string]$Name, [string]$Version) - - if ([string]::IsNullOrEmpty($Version)) { + + if ([string]::IsNullOrEmpty($Version)) + { return $Name } @@ -79,51 +84,57 @@ function Install-VSCodeExtension { ) -join '@' } } - - process { + + process + { $installArgument = Get-VSCodeExtensionInstallArgument @PSBoundParameters Invoke-VSCode -Command "--install-extension $installArgument" } } -function Uninstall-VSCodeExtension { +function Uninstall-VSCodeExtension +{ [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string]$Name ) - + Invoke-VSCode -Command "--uninstall-extension $($this.Name)" } -function Invoke-VSCode { +function Invoke-VSCode +{ param ( [Parameter(Mandatory = $true)] [string]$Command ) - try { + try + { Invoke-Expression "& `"$VSCodeCLIPath`" $Command" } - catch { + catch + { throw ("Executing {0} with {$Command} failed." -f $VSCodeCLIPath) } } -function TryGetRegistryValue{ +function TryGetRegistryValue +{ param ( [Parameter(Mandatory = $true)] [string]$Key, [Parameter(Mandatory = $true)] [string]$Property - ) + ) if (Test-Path -Path $Key) { try { - return (Get-ItemProperty -Path $Key | Select-Object -ExpandProperty $Property) + return (Get-ItemProperty -Path $Key | Select-Object -ExpandProperty $Property) } catch { @@ -187,11 +198,12 @@ function TryGetRegistryValue{ Insiders = $true } PS C:\> Invoke-DscResource -Name VSCodeExtension -Method Set -Property $params -ModuleName Microsoft.VSCode.Dsc - + This installs the latest version of the Visual Studio Code extension 'ms-python.python' for the Insiders version of Visual Studio Code #> [DSCResource()] -class VSCodeExtension { +class VSCodeExtension +{ [DscProperty(Key)] [string] $Name @@ -206,27 +218,31 @@ class VSCodeExtension { static [hashtable] $InstalledExtensions - VSCodeExtension() { + VSCodeExtension() + { } - VSCodeExtension([string]$Name, [string]$Version) { + VSCodeExtension([string]$Name, [string]$Version) + { $this.Name = $Name $this.Version = $Version } [VSCodeExtension[]] Export([bool]$Insiders) { - if ($Insiders) { + if ($Insiders) + { $script:VSCodeCLIPath = Get-VSCodeCLIPath -Insiders } - else { + else + { $script:VSCodeCLIPath = Get-VSCodeCLIPath } $extensionList = (Invoke-VSCode -Command "--list-extensions --show-versions") -Split [Environment]::NewLine $results = [VSCodeExtension[]]::new($extensionList.length) - + for ($i = 0; $i -lt $extensionList.length; $i++) { $extensionName, $extensionVersion = $extensionList[$i] -Split '@' @@ -236,61 +252,74 @@ class VSCodeExtension { return $results } - [VSCodeExtension] Get() { + [VSCodeExtension] Get() + { [VSCodeExtension]::GetInstalledExtensions($this.Insiders) $currentState = [VSCodeExtension]::InstalledExtensions[$this.Name] - if ($null -ne $currentState) { + if ($null -ne $currentState) + { return [VSCodeExtension]::InstalledExtensions[$this.Name] } - + return [VSCodeExtension]@{ - Name = $this.Name - Version = $this.Version - Exist = $false + Name = $this.Name + Version = $this.Version + Exist = $false Insiders = $this.Insiders } } - [bool] Test() { + [bool] Test() + { $currentState = $this.Get() - if ($currentState.Exist -ne $this.Exist) { + if ($currentState.Exist -ne $this.Exist) + { return $false } - if ($null -ne $this.Version -and $this.Version -ne $currentState.Version) { + if ($null -ne $this.Version -and $this.Version -ne $currentState.Version) + { return $false } return $true } - [void] Set() { - if ($this.Test()) { + [void] Set() + { + if ($this.Test()) + { return } - if ($this.Exist) { + if ($this.Exist) + { $this.Install($false) } - else { + else + { $this.Uninstall($false) } } -#region VSCodeExtension helper functions - static [void] GetInstalledExtensions([bool]$Insiders) { + #region VSCodeExtension helper functions + static [void] GetInstalledExtensions([bool]$Insiders) + { [VSCodeExtension]::InstalledExtensions = @{} $extension = [VSCodeExtension]::new() - foreach ($extension in $extension.Export($Insiders)) { + foreach ($extension in $extension.Export($Insiders)) + { [VSCodeExtension]::InstalledExtensions[$extension.Name] = $extension } } - [void] Install([bool] $preTest) { - if ($preTest -and $this.Test()) { + [void] Install([bool] $preTest) + { + if ($preTest -and $this.Test()) + { return } @@ -298,18 +327,21 @@ class VSCodeExtension { [VSCodeExtension]::GetInstalledExtensions($this.Insiders) } - [void] Install() { + [void] Install() + { $this.Install($true) } - [void] Uninstall([bool] $preTest) { + [void] Uninstall([bool] $preTest) + { Uninstall-VSCodeExtension -Name $this.Name [VSCodeExtension]::GetInstalledExtensions($this.Insiders) } - [void] Uninstall() { + [void] Uninstall() + { $this.Uninstall($true) } -#endregion VSCodeExtension helper functions + #endregion VSCodeExtension helper functions } #endregion DSCResources diff --git a/resources/Microsoft.Windows.Developer/Microsoft.Windows.Developer.psm1 b/resources/Microsoft.Windows.Developer/Microsoft.Windows.Developer.psm1 index 7eedeacb..a53bdcd5 100644 --- a/resources/Microsoft.Windows.Developer/Microsoft.Windows.Developer.psm1 +++ b/resources/Microsoft.Windows.Developer/Microsoft.Windows.Developer.psm1 @@ -95,7 +95,7 @@ class DeveloperMode { $windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $windowsPrincipal = New-Object -TypeName 'System.Security.Principal.WindowsPrincipal' -ArgumentList @( $windowsIdentity ) - + if (-not $windowsPrincipal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) { throw "Toggling Developer Mode requires this resource to be run as an Administrator." @@ -259,7 +259,7 @@ class Taskbar [bool] Test() { $currentState = $this.Get() - + if ($this.Alignment -ne [Alignment]::KeepCurrentValue -and $currentState.Alignment -ne $this.Alignment) { return $false @@ -317,7 +317,7 @@ class Taskbar SearchBox { 2 } ShowIconAndLabel { 3 } } - + Set-ItemProperty -Path $global:SearchRegistryPath -Name $this.SearchboxTaskbarMode -Value $desiredSearchboxMode } @@ -401,7 +401,7 @@ class WindowsExplorer [bool] Test() { $currentState = $this.Get() - + if ($this.FileExtensions -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.FileExtensions -ne $this.FileExtensions) { return $false @@ -549,7 +549,7 @@ class EnableDarkMode $systemUsesLightModeValue = Get-ItemPropertyValue -Path $global:PersonalizeRegistryPath -Name $this.SystemUsesLightTheme $isDarkModeEnabled = if ($appsUseLightModeValue -eq 0 -and $systemUsesLightModeValue -eq 0) { [Ensure]::Present } else { [Ensure]::Absent } - + return @{ Ensure = $isDarkModeEnabled } @@ -598,7 +598,7 @@ class ShowSecondsInClock } $registryValue = Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.ShowSecondsInSystemClock - + return @{ Ensure = $registryValue ? [Ensure]::Present : [Ensure]::Absent } @@ -640,7 +640,7 @@ class EnableRemoteDesktop } $registryValue = Get-ItemPropertyValue -Path $global:RemoteDesktopRegistryPath -Name $this.RemoteDesktopKey - + # Since the key is a 'deny' type key, 0 == enabled == Present // 1 == disabled == Absent return @{ Ensure = $registryValue ? [Ensure]::Absent : [Ensure]::Present @@ -711,4 +711,4 @@ function DoesRegistryKeyPropertyExist return $null -ne $itemProperty } -#endregion Functions \ No newline at end of file +#endregion Functions diff --git a/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psd1 b/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psd1 index d22dda14..b7c18fa1 100644 --- a/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psd1 +++ b/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psd1 @@ -10,7 +10,7 @@ Description = 'DSC Module for Windows Accessibility' PowerShellVersion = '7.2' DscResourcesToExport = @( - 'Text', + 'Text', 'Magnifier', 'MousePointer', 'VisualEffect', @@ -24,7 +24,7 @@ PSData = @{ # Tags applied to this module. These help with module discovery in online galleries. Tags = @( - 'PSDscResource_Text', + 'PSDscResource_Text', 'PSDscResource_Magnifier', 'PSDscResource_MousePointer', 'PSDscResource_VisualEffect', @@ -34,7 +34,7 @@ 'PSDscResource_ToggleKeys', 'PSDscResource_FilterKeys' ) - + # Prerelease string of this module Prerelease = 'alpha' } diff --git a/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psm1 b/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psm1 index 1ee78493..e1fe78f2 100644 --- a/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psm1 +++ b/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psm1 @@ -91,7 +91,7 @@ else $global:AccessibilityRegistryPath = $global:MagnifierRegistryPath = $global:PointerRegistryPath = $global:ControlPanelAccessibilityRegistryPath = $global:AudioRegistryPath = $global:PersonalizationRegistryPath = $global:NTAccessibilityRegistryPath = $global:CursorIndicatorAccessibilityRegistryPath = $global:ControlPanelDesktopRegistryPath = $global:StickyKeysRegistryPath = $global:ToggleKeysRegistryPath = $global:FilterKeysRegistryPath = $env:TestRegistryPath } -[DSCResource()] +[DSCResource()] class Text { [DscProperty(Key)] [TextSize] $Size = [TextSize]::KeepCurrentValue @@ -152,7 +152,7 @@ class Text } Set-ItemProperty -Path $global:AccessibilityRegistryPath -Name $this.TextScaleFactor -Value $desiredSize -Type DWORD - } + } } } @@ -175,7 +175,7 @@ class Magnifier if (-not(DoesRegistryKeyPropertyExist -Path $global:MagnifierRegistryPath -Name $this.MagnificationProperty)) { $currentState.Magnification = [MagnificationValue]::None - $currentState.MagnificationLevel = 0 + $currentState.MagnificationLevel = 0 } else { @@ -188,8 +188,8 @@ class Magnifier 300 { [MagnificationValue]::High } default { [MagnificationValue]::KeepCurrentValue } } - - $currentState.Magnification = $currentMagnification + + $currentState.Magnification = $currentMagnification } if (-not(DoesRegistryKeyPropertyExist -Path $global:MagnifierRegistryPath -Name $this.ZoomIncrementProperty)) @@ -198,7 +198,7 @@ class Magnifier $currentState.ZoomIncrementLevel = 25 } else - { + { $currentState.ZoomIncrementLevel = (Get-ItemProperty -Path $global:MagnifierRegistryPath -Name $this.ZoomIncrementProperty).ZoomIncrement $currentState.ZoomIncrement = $currentState.ZoomIncrementLevel } @@ -271,7 +271,7 @@ class MousePointer [MousePointer] Get() { $currentState = [MousePointer]::new() - + if (-not(DoesRegistryKeyPropertyExist -Path $global:PointerRegistryPath -Name $this.PointerSizeProperty)) { $currentState.PointerSize = [PointerSize]::Normal @@ -282,14 +282,14 @@ class MousePointer $currentState.PointerSizeValue = (Get-ItemProperty -Path $global:PointerRegistryPath -Name $this.PointerSizeProperty).CursorBaseSize $currentSize = switch ($currentState.PointerSizeValue) { - '32' { [PointerSize]::Normal } + '32' { [PointerSize]::Normal } '96' { [PointerSize]::Medium } '144' { [PointerSize]::Large } '256' { [PointerSize]::ExtraLarge } default { [PointerSize]::KeepCurrentValue } } - - $currentState.PointerSize = $currentSize + + $currentState.PointerSize = $currentSize } return $currentState @@ -351,7 +351,7 @@ class VisualEffect { $dynamicScrollbarsValue = (Get-ItemProperty -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::DynamicScrollbarsProperty)).DynamicScrollbars return ($dynamicScrollbarsValue -eq 0) - } + } } static [bool] GetTransparencyStatus() @@ -386,7 +386,7 @@ class VisualEffect $currentState.AlwaysShowScrollbars = [VisualEffect]::GetShowDynamicScrollbarsStatus() $currentState.TransparencyEffects = [VisualEffect]::GetTransparencyStatus() $currentState.MessageDurationInSeconds = [VisualEffect]::GetMessageDuration() - + return $currentState } @@ -417,30 +417,30 @@ class VisualEffect { New-Item -Path $global:ControlPanelAccessibilityRegistryPath -Force | Out-Null } - if ($null -ne $this.AlwaysShowScrollbars) + if ($null -ne $this.AlwaysShowScrollbars) { $dynamicScrollbarValue = if ($this.AlwaysShowScrollbars) { 0 } else { 1 } Set-ItemProperty -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::DynamicScrollbarsProperty) -Value $dynamicScrollbarValue } - if ($null -ne $this.TransparencyEffects) + if ($null -ne $this.TransparencyEffects) { $transparencyValue = if ($this.TransparencyEffects) { 0 } else { 1 } - + if (-not (DoesRegistryKeyPropertyExist -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty))) { New-ItemProperty -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty) -Value $transparencyValue -PropertyType DWord } - Set-ItemProperty -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty) -Value $transparencyValue + Set-ItemProperty -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty) -Value $transparencyValue } - if (0 -ne $this.MessageDurationInSeconds) + if (0 -ne $this.MessageDurationInSeconds) { $min = 5 $max = 300 - if ($this.MessageDurationInSeconds -notin $min..$max) - { - throw "MessageDurationInSeconds must be between $min and $max. Value $($this.MessageDurationInSeconds) was provided." + if ($this.MessageDurationInSeconds -notin $min..$max) + { + throw "MessageDurationInSeconds must be between $min and $max. Value $($this.MessageDurationInSeconds) was provided." } - Set-ItemProperty -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::MessageDurationProperty) -Value $this.MessageDurationInSeconds + Set-ItemProperty -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::MessageDurationProperty) -Value $this.MessageDurationInSeconds } } } @@ -465,14 +465,14 @@ class Audio { $AudioMonoSetting = (Get-ItemProperty -Path $global:AudioRegistryPath -Name ([Audio]::EnableMonoAudioProperty)).AccessibilityMonoMixState return ($AudioMonoSetting -eq 0) - } + } } [Audio] Get() { $currentState = [Audio]::new() $currentState.EnableMonoAudio = [Audio]::GetEnableMonoAudioStatus() - + return $currentState } @@ -498,7 +498,7 @@ class Audio $monoAudioValue = if ($this.EnableMonoAudio) { 0 } else { 1 } - Set-ItemProperty -Path $global:AudioRegistryPath -Name ([Audio]::EnableMonoAudioProperty) -Value $monoAudioValue + Set-ItemProperty -Path $global:AudioRegistryPath -Name ([Audio]::EnableMonoAudioProperty) -Value $monoAudioValue } } } @@ -531,7 +531,7 @@ class TextCursor { $textCursorSetting = (Get-ItemProperty @indicatorStatusArgs).Configuration return ($textCursorSetting -eq ([TextCursor]::IndicatorStatusValue)) - } + } } static [int] GetIndicatorSize() @@ -545,7 +545,7 @@ class TextCursor { $textCursorSetting = (Get-ItemProperty @indicatorSizeArgs).IndicatorType return $textCursorSetting - } + } } static [int] GetIndicatorColor() @@ -559,7 +559,7 @@ class TextCursor { $textCursorSetting = (Get-ItemProperty @indicatorColorArgs).IndicatorColor return $textCursorSetting - } + } } static [int] GetThickness() @@ -573,7 +573,7 @@ class TextCursor { $textCursorSetting = (Get-ItemProperty @thicknessArgs).CaretWidth return $textCursorSetting - } + } } [TextCursor] Get() @@ -583,7 +583,7 @@ class TextCursor $currentState.IndicatorSize = [TextCursor]::GetIndicatorSize() $currentState.IndicatorColor = [TextCursor]::GetIndicatorColor() $currentState.Thickness = [TextCursor]::GetThickness() - + return $currentState } @@ -614,55 +614,55 @@ class TextCursor { if (-not $this.Test()) { - if ($null -ne $this.IndicatorStatus) + if ($null -ne $this.IndicatorStatus) { $indicatorStatusArgs = @{ Path = $global:NTAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorStatusProperty); } $textCursorValue = if ($this.IndicatorStatus) { ([TextCursor]::IndicatorStatusValue) } else { "" } Set-ItemProperty @indicatorStatusArgs -Value $textCursorValue } - - if (0 -ne $this.IndicatorSize) + + if (0 -ne $this.IndicatorSize) { $indicatorSizeArgs = @{ Path = $global:CursorIndicatorAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorSizeProperty) } $min = 1 $max = 20 - if ($this.IndicatorSize -notin $min..$max) - { - throw "IndicatorSize must be between $min and $max. Value $($this.IndicatorSize) was provided." + if ($this.IndicatorSize -notin $min..$max) + { + throw "IndicatorSize must be between $min and $max. Value $($this.IndicatorSize) was provided." } if (-not (DoesRegistryKeyPropertyExist @indicatorSizeArgs)) { New-ItemProperty @indicatorSizeArgs -Value $this.IndicatorSize -PropertyType DWord } - Set-ItemProperty @indicatorSizeArgs -Value $this.IndicatorSize + Set-ItemProperty @indicatorSizeArgs -Value $this.IndicatorSize } - - if (0 -ne $this.IndicatorColor) + + if (0 -ne $this.IndicatorColor) { $indicatorColorArgs = @{ Path = $global:CursorIndicatorAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorColorProperty) } $min = 1 $max = 99999999 - if ($this.IndicatorColor -notin $min..$max) - { - throw "IndicatorColor must be between $min and $max. Value $($this.IndicatorColor) was provided." + if ($this.IndicatorColor -notin $min..$max) + { + throw "IndicatorColor must be between $min and $max. Value $($this.IndicatorColor) was provided." } if (-not (DoesRegistryKeyPropertyExist @indicatorColorArgs)) { New-ItemProperty @indicatorColorArgs -Value $this.IndicatorColor -PropertyType DWord } - Set-ItemProperty @indicatorColorArgs -Value $this.IndicatorColor + Set-ItemProperty @indicatorColorArgs -Value $this.IndicatorColor } - - if (0 -ne $this.Thickness) + + if (0 -ne $this.Thickness) { $thicknessArgs = @{ Path = $global:ControlPanelDesktopRegistryPath; Name = ([TextCursor]::ThicknessProperty); } $min = 1 $max = 20 - if ($this.Thickness -notin $min..$max) - { - throw "Thickness must be between $min and $max. Value $($this.Thickness) was provided." + if ($this.Thickness -notin $min..$max) + { + throw "Thickness must be between $min and $max. Value $($this.Thickness) was provided." } - Set-ItemProperty @thicknessArgs -Value $this.Thickness + Set-ItemProperty @thicknessArgs -Value $this.Thickness } } } @@ -701,7 +701,7 @@ class StickyKeys [StickyKeys] Get() { $currentFlags = [StickyKeys]::GetCurrentFlags() - + $currentState = [StickyKeys]::new() $currentState.Active = $currentFlags.HasFlag([StickyKeysOptions]::Active) $currentState.Available = $currentFlags.HasFlag([StickyKeysOptions]::Available) @@ -712,7 +712,7 @@ class StickyKeys $currentState.AudibleFeedback = $currentFlags.HasFlag([StickyKeysOptions]::AudibleFeedback) $currentState.TriState = $currentFlags.HasFlag([StickyKeysOptions]::TriState) $currentState.TwoKeysOff = $currentFlags.HasFlag([StickyKeysOptions]::TwoKeysOff) - + return $currentState } @@ -857,7 +857,7 @@ class ToggleKeys [ToggleKeys] Get() { $currentFlags = [ToggleKeys]::GetCurrentFlags() - + $currentState = [ToggleKeys]::new() $currentState.Active = $currentFlags.HasFlag([ToggleKeysOptions]::Active) $currentState.Available = $currentFlags.HasFlag([ToggleKeysOptions]::Available) @@ -865,7 +865,7 @@ class ToggleKeys $currentState.ConfirmOnHotkeyActivation = $currentFlags.HasFlag([ToggleKeysOptions]::ConfirmHotkey) $currentState.HotkeySound = $currentFlags.HasFlag([ToggleKeysOptions]::HotkeySound) $currentState.VisualIndicator = $currentFlags.HasFlag([ToggleKeysOptions]::VisualIndicator) - + return $currentState } @@ -981,7 +981,7 @@ class FilterKeys [FilterKeys] Get() { $currentFlags = [FilterKeys]::GetCurrentFlags() - + $currentState = [FilterKeys]::new() $currentState.Active = $currentFlags.HasFlag([FilterKeysOptions]::Active) $currentState.Available = $currentFlags.HasFlag([FilterKeysOptions]::Available) @@ -990,7 +990,7 @@ class FilterKeys $currentState.HotkeySound = $currentFlags.HasFlag([FilterKeysOptions]::HotkeySound) $currentState.VisualIndicator = $currentFlags.HasFlag([FilterKeysOptions]::VisualIndicator) $currentState.AudibleFeedback = $currentFlags.HasFlag([FilterKeysOptions]::AudibleFeedback) - + return $currentState } @@ -1100,4 +1100,4 @@ function DoesRegistryKeyPropertyExist $itemProperty = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue return $null -ne $itemProperty } -#endregion Functions \ No newline at end of file +#endregion Functions diff --git a/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psd1 b/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psd1 index f4ee5a25..b0540f92 100644 --- a/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psd1 +++ b/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psd1 @@ -8,126 +8,126 @@ @{ -# Script module or binary module file associated with this manifest. -RootModule = 'Microsoft.WindowsSandbox.DSC.psm1' + # Script module or binary module file associated with this manifest. + RootModule = 'Microsoft.WindowsSandbox.DSC.psm1' -# Version number of this module. -ModuleVersion = '0.1.0' + # Version number of this module. + ModuleVersion = '0.1.0' -# Supported PSEditions -# CompatiblePSEditions = @() + # Supported PSEditions + # CompatiblePSEditions = @() -# ID used to uniquely identify this module -GUID = 'd5c78779-2fa7-4356-87cb-13bb41102e7e' + # ID used to uniquely identify this module + GUID = 'd5c78779-2fa7-4356-87cb-13bb41102e7e' -# Author of this module -Author = 'DscSamples' + # Author of this module + Author = 'DscSamples' -# Company or vendor of this module -# CompanyName = '' + # Company or vendor of this module + # CompanyName = '' -# Copyright statement for this module -# Copyright = '' + # Copyright statement for this module + # Copyright = '' -# Description of the functionality provided by this module -Description = 'DSC Resource for Windows Sandbox' + # Description of the functionality provided by this module + Description = 'DSC Resource for Windows Sandbox' -# Minimum version of the PowerShell engine required by this module -# PowerShellVersion = '' + # Minimum version of the PowerShell engine required by this module + # PowerShellVersion = '' -# Name of the PowerShell host required by this module -# PowerShellHostName = '' + # Name of the PowerShell host required by this module + # PowerShellHostName = '' -# Minimum version of the PowerShell host required by this module -# PowerShellHostVersion = '' + # Minimum version of the PowerShell host required by this module + # PowerShellHostVersion = '' -# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# DotNetFrameworkVersion = '' + # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # DotNetFrameworkVersion = '' -# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# ClrVersion = '' + # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # ClrVersion = '' -# Processor architecture (None, X86, Amd64) required by this module -# ProcessorArchitecture = '' + # Processor architecture (None, X86, Amd64) required by this module + # ProcessorArchitecture = '' -# Modules that must be imported into the global environment prior to importing this module -# RequiredModules = @() + # Modules that must be imported into the global environment prior to importing this module + # RequiredModules = @() -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() + # Assemblies that must be loaded prior to importing this module + # RequiredAssemblies = @() -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -# ScriptsToProcess = @() + # Script files (.ps1) that are run in the caller's environment prior to importing this module. + # ScriptsToProcess = @() -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() + # Type files (.ps1xml) to be loaded when importing this module + # TypesToProcess = @() -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() + # Format files (.ps1xml) to be loaded when importing this module + # FormatsToProcess = @() -# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -# NestedModules = @() + # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess + # NestedModules = @() -# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -# FunctionsToExport = @() + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + # FunctionsToExport = @() -# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. -# CmdletsToExport = @() + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + # CmdletsToExport = @() -# Variables to export from this module -# VariablesToExport = '*' + # Variables to export from this module + # VariablesToExport = '*' -# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -# AliasesToExport = @() + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + # AliasesToExport = @() -# DSC resources to export from this module -DscResourcesToExport = @( - 'WindowsSandbox' -) + # DSC resources to export from this module + DscResourcesToExport = @( + 'WindowsSandbox' + ) -# List of all modules packaged with this module -# ModuleList = @() + # List of all modules packaged with this module + # ModuleList = @() -# List of all files packaged with this module -# FileList = @() + # List of all files packaged with this module + # FileList = @() -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ - PSData = @{ + PSData = @{ - # Tags applied to this module. These help with module discovery in online galleries. - Tags = @('PSDscResource_WindowsSandbox') + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('PSDscResource_WindowsSandbox') - # A URL to the license for this module. - # LicenseUri = '' + # A URL to the license for this module. + # LicenseUri = '' - # A URL to the main website for this project. - # ProjectUri = '' + # A URL to the main website for this project. + # ProjectUri = '' - # A URL to an icon representing this module. - # IconUri = '' + # A URL to an icon representing this module. + # IconUri = '' - # ReleaseNotes of this module - # ReleaseNotes = '' + # ReleaseNotes of this module + # ReleaseNotes = '' - # Prerelease string of this module - Prerelease = 'alpha' + # Prerelease string of this module + Prerelease = 'alpha' - # Flag to indicate whether the module requires explicit user acceptance for install/update/save - # RequireLicenseAcceptance = $false + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false - # External dependent modules of this module - # ExternalModuleDependencies = @() + # External dependent modules of this module + # ExternalModuleDependencies = @() - } # End of PSData hashtable + } # End of PSData hashtable -} # End of PrivateData hashtable + } # End of PrivateData hashtable -# HelpInfo URI of this module -# HelpInfoURI = '' + # HelpInfo URI of this module + # HelpInfoURI = '' -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' + # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. + # DefaultCommandPrefix = '' } diff --git a/resources/NpmDsc/NpmDsc.psd1 b/resources/NpmDsc/NpmDsc.psd1 index 82f73dba..ad578a96 100644 --- a/resources/NpmDsc/NpmDsc.psd1 +++ b/resources/NpmDsc/NpmDsc.psd1 @@ -8,128 +8,128 @@ @{ -# Script module or binary module file associated with this manifest. -RootModule = 'NpmDsc.psm1' + # Script module or binary module file associated with this manifest. + RootModule = 'NpmDsc.psm1' -# Version number of this module. -ModuleVersion = '0.1.0' + # Version number of this module. + ModuleVersion = '0.1.0' -# Supported PSEditions -# CompatiblePSEditions = @() + # Supported PSEditions + # CompatiblePSEditions = @() -# ID used to uniquely identify this module -GUID = '83174a20-df73-4d9f-8ddf-b4bf51da5089' + # ID used to uniquely identify this module + GUID = '83174a20-df73-4d9f-8ddf-b4bf51da5089' -# Author of this module -Author = 'DscSamples' + # Author of this module + Author = 'DscSamples' -# Company or vendor of this module -# CompanyName = '' + # Company or vendor of this module + # CompanyName = '' -# Copyright statement for this module -# Copyright = '' + # Copyright statement for this module + # Copyright = '' -# Description of the functionality provided by this module -Description = 'DSC Resource for Npm' + # Description of the functionality provided by this module + Description = 'DSC Resource for Npm' -# Minimum version of the PowerShell engine required by this module -# PowerShellVersion = '' + # Minimum version of the PowerShell engine required by this module + # PowerShellVersion = '' -# Name of the PowerShell host required by this module -# PowerShellHostName = '' + # Name of the PowerShell host required by this module + # PowerShellHostName = '' -# Minimum version of the PowerShell host required by this module -# PowerShellHostVersion = '' + # Minimum version of the PowerShell host required by this module + # PowerShellHostVersion = '' -# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# DotNetFrameworkVersion = '' + # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # DotNetFrameworkVersion = '' -# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# ClrVersion = '' + # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # ClrVersion = '' -# Processor architecture (None, X86, Amd64) required by this module -# ProcessorArchitecture = '' + # Processor architecture (None, X86, Amd64) required by this module + # ProcessorArchitecture = '' -# Modules that must be imported into the global environment prior to importing this module -# RequiredModules = @() + # Modules that must be imported into the global environment prior to importing this module + # RequiredModules = @() -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() + # Assemblies that must be loaded prior to importing this module + # RequiredAssemblies = @() -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -# ScriptsToProcess = @() + # Script files (.ps1) that are run in the caller's environment prior to importing this module. + # ScriptsToProcess = @() -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() + # Type files (.ps1xml) to be loaded when importing this module + # TypesToProcess = @() -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() + # Format files (.ps1xml) to be loaded when importing this module + # FormatsToProcess = @() -# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -# NestedModules = @() + # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess + # NestedModules = @() -# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -# FunctionsToExport = @() + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + # FunctionsToExport = @() -# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. -# CmdletsToExport = @() + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + # CmdletsToExport = @() -# Variables to export from this module -# VariablesToExport = '*' + # Variables to export from this module + # VariablesToExport = '*' -# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -# AliasesToExport = @() + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + # AliasesToExport = @() -# DSC resources to export from this module -DscResourcesToExport = @( - 'NpmPackage', - 'NpmInstall' -) + # DSC resources to export from this module + DscResourcesToExport = @( + 'NpmPackage', + 'NpmInstall' + ) -# List of all modules packaged with this module -# ModuleList = @() + # List of all modules packaged with this module + # ModuleList = @() -# List of all files packaged with this module -# FileList = @() + # List of all files packaged with this module + # FileList = @() -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ - PSData = @{ + PSData = @{ - # Tags applied to this module. These help with module discovery in online galleries. - Tags = @('PSDscResource_DSC_NpmPackage', 'PSDscResource_DSC_NpmInstall') + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('PSDscResource_DSC_NpmPackage', 'PSDscResource_DSC_NpmInstall') - # A URL to the license for this module. - # LicenseUri = '' + # A URL to the license for this module. + # LicenseUri = '' - # A URL to the main website for this project. - # ProjectUri = '' + # A URL to the main website for this project. + # ProjectUri = '' - # A URL to an icon representing this module. - # IconUri = '' + # A URL to an icon representing this module. + # IconUri = '' - # ReleaseNotes of this module - # ReleaseNotes = '' + # ReleaseNotes of this module + # ReleaseNotes = '' - # Prerelease string of this module - Prerelease = 'alpha' + # Prerelease string of this module + Prerelease = 'alpha' - # Flag to indicate whether the module requires explicit user acceptance for install/update/save - # RequireLicenseAcceptance = $false + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false - # External dependent modules of this module - # ExternalModuleDependencies = @() + # External dependent modules of this module + # ExternalModuleDependencies = @() - } # End of PSData hashtable + } # End of PSData hashtable -} # End of PrivateData hashtable + } # End of PrivateData hashtable -# HelpInfo URI of this module -# HelpInfoURI = '' + # HelpInfo URI of this module + # HelpInfoURI = '' -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' + # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. + # DefaultCommandPrefix = '' } diff --git a/resources/PythonPip3Dsc/PythonPip3Dsc.psd1 b/resources/PythonPip3Dsc/PythonPip3Dsc.psd1 index cebf75ed..642af568 100644 --- a/resources/PythonPip3Dsc/PythonPip3Dsc.psd1 +++ b/resources/PythonPip3Dsc/PythonPip3Dsc.psd1 @@ -8,127 +8,127 @@ @{ -# Script module or binary module file associated with this manifest. -RootModule = 'PythonPip3Dsc.psm1' + # Script module or binary module file associated with this manifest. + RootModule = 'PythonPip3Dsc.psm1' -# Version number of this module. -ModuleVersion = '0.1.0' + # Version number of this module. + ModuleVersion = '0.1.0' -# Supported PSEditions -# CompatiblePSEditions = @() + # Supported PSEditions + # CompatiblePSEditions = @() -# ID used to uniquely identify this module -GUID = 'bc1cab01-7e6f-4bba-a6ec-d77d0ffe91c7' + # ID used to uniquely identify this module + GUID = 'bc1cab01-7e6f-4bba-a6ec-d77d0ffe91c7' -# Author of this module -Author = 'DscSamples' + # Author of this module + Author = 'DscSamples' -# Company or vendor of this module -# CompanyName = '' + # Company or vendor of this module + # CompanyName = '' -# Copyright statement for this module -# Copyright = '' + # Copyright statement for this module + # Copyright = '' -# Description of the functionality provided by this module -Description = 'DSC Resource for Python pip3' + # Description of the functionality provided by this module + Description = 'DSC Resource for Python pip3' -# Minimum version of the PowerShell engine required by this module -# PowerShellVersion = '' + # Minimum version of the PowerShell engine required by this module + # PowerShellVersion = '' -# Name of the PowerShell host required by this module -# PowerShellHostName = '' + # Name of the PowerShell host required by this module + # PowerShellHostName = '' -# Minimum version of the PowerShell host required by this module -# PowerShellHostVersion = '' + # Minimum version of the PowerShell host required by this module + # PowerShellHostVersion = '' -# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# DotNetFrameworkVersion = '' + # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # DotNetFrameworkVersion = '' -# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# ClrVersion = '' + # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # ClrVersion = '' -# Processor architecture (None, X86, Amd64) required by this module -# ProcessorArchitecture = '' + # Processor architecture (None, X86, Amd64) required by this module + # ProcessorArchitecture = '' -# Modules that must be imported into the global environment prior to importing this module -# RequiredModules = @() + # Modules that must be imported into the global environment prior to importing this module + # RequiredModules = @() -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() + # Assemblies that must be loaded prior to importing this module + # RequiredAssemblies = @() -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -# ScriptsToProcess = @() + # Script files (.ps1) that are run in the caller's environment prior to importing this module. + # ScriptsToProcess = @() -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() + # Type files (.ps1xml) to be loaded when importing this module + # TypesToProcess = @() -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() + # Format files (.ps1xml) to be loaded when importing this module + # FormatsToProcess = @() -# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -# NestedModules = @() + # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess + # NestedModules = @() -# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -# FunctionsToExport = @() + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + # FunctionsToExport = @() -# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. -# CmdletsToExport = @() + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + # CmdletsToExport = @() -# Variables to export from this module -# VariablesToExport = '*' + # Variables to export from this module + # VariablesToExport = '*' -# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -# AliasesToExport = @() + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + # AliasesToExport = @() -# DSC resources to export from this module -DscResourcesToExport = @( - 'Pip3Package' -) + # DSC resources to export from this module + DscResourcesToExport = @( + 'Pip3Package' + ) -# List of all modules packaged with this module -# ModuleList = @() + # List of all modules packaged with this module + # ModuleList = @() -# List of all files packaged with this module -# FileList = @() + # List of all files packaged with this module + # FileList = @() -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ - PSData = @{ + PSData = @{ - # Tags applied to this module. These help with module discovery in online galleries. - Tags = @('PSDscResource_Pip3Package') + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('PSDscResource_Pip3Package') - # A URL to the license for this module. - LicenseUri = 'https://github.com/microsoft/winget-dsc/blob/main/LICENSE' + # A URL to the license for this module. + LicenseUri = 'https://github.com/microsoft/winget-dsc/blob/main/LICENSE' - # A URL to the main website for this project. - ProjectUri = 'https://github.com/microsoft/winget-dsc' + # A URL to the main website for this project. + ProjectUri = 'https://github.com/microsoft/winget-dsc' - # A URL to an icon representing this module. - # IconUri = '' + # A URL to an icon representing this module. + # IconUri = '' - # ReleaseNotes of this module - # ReleaseNotes = '' + # ReleaseNotes of this module + # ReleaseNotes = '' - # Prerelease string of this module - Prerelease = 'alpha' + # Prerelease string of this module + Prerelease = 'alpha' - # Flag to indicate whether the module requires explicit user acceptance for install/update/save - # RequireLicenseAcceptance = $false + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false - # External dependent modules of this module - # ExternalModuleDependencies = @() + # External dependent modules of this module + # ExternalModuleDependencies = @() - } # End of PSData hashtable + } # End of PSData hashtable -} # End of PrivateData hashtable + } # End of PrivateData hashtable -# HelpInfo URI of this module -# HelpInfoURI = '' + # HelpInfo URI of this module + # HelpInfoURI = '' -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' + # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. + # DefaultCommandPrefix = '' } diff --git a/resources/README.md b/resources/README.md index 0ad02d36..60ea66a1 100644 --- a/resources/README.md +++ b/resources/README.md @@ -1,55 +1,55 @@ -# DSC Resources - -This folder contains the initial prototypes for various DSC resources that could be utilized in a configuration yaml. - -## Requirements - -Before you get started, install the [PSDesiredStateConfiguration v2.0.7](https://www.powershellgallery.com/packages/PSDesiredStateConfiguration/2.0.7) PowerShell package: - -```powerShell -Install-Module -Name PSDesiredStateConfiguration -RequiredVersion 2.0.7 -``` - -> To verify that the package is installed, run `Get-InstalledModule` and check that the version is exactly 2.0.7. - -## Executing a DSC Resource - -PowerShell recursively searches for the module in any of the paths specified in `$env:PSModulePath`. This means you can either copy the DSC Resource module into one of those paths or you can [modify the environment variable](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_psmodulepath?view=powershell-7.3#modifying-psmodulepath) to point to the location of your module. - -Once the above step is complete, you should be able to see your loaded DSC resource by running `Get-DSCResource`. - -You should now be able to execute the loaded DSC resource by running `Invoke-DSCResource`. Here is a usage example for the Visual Studio DSC Resource to use as a reference for structuring your command: - -```powershell -# Define the properties in a hashtable from Get-DscResource -$properties = @{ - HttpsUrl = 'https://github.com/microsoft/winget-dsc.git' - RootDirectory = 'C:\Source' - Ensure = 'Present' -} - -# Define the parameters for Invoke-DscResource -$params = @{ - Name = 'GitClone' - Method = 'Set' - ModuleName = 'GitDsc' - Property = $properties -} - -# Invoke the DSC resource -Invoke-DscResource @params -``` - -## Troubleshooting - -If you don't see your DSC Resource loaded, try the following: - -1. Try importing the module using `Import-Module`. If the module cannot be imported, then it cannot load the DSC resource. - - ```powershell - Import-Module - ``` - -2. Restarting your shell. -3. Verifying that your syntax in the module is correct. No warning is shown to the user if your PowerShell module file is invalid. -4. Verifying the `$env:PSModulePath` contains the folder path where your module is located. +# DSC Resources + +This folder contains the initial prototypes for various DSC resources that could be utilized in a configuration yaml. + +## Requirements + +Before you get started, install the [PSDesiredStateConfiguration v2.0.7](https://www.powershellgallery.com/packages/PSDesiredStateConfiguration/2.0.7) PowerShell package: + +```powerShell +Install-Module -Name PSDesiredStateConfiguration -RequiredVersion 2.0.7 +``` + +> To verify that the package is installed, run `Get-InstalledModule` and check that the version is exactly 2.0.7. + +## Executing a DSC Resource + +PowerShell recursively searches for the module in any of the paths specified in `$env:PSModulePath`. This means you can either copy the DSC Resource module into one of those paths or you can [modify the environment variable](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_psmodulepath?view=powershell-7.3#modifying-psmodulepath) to point to the location of your module. + +Once the above step is complete, you should be able to see your loaded DSC resource by running `Get-DSCResource`. + +You should now be able to execute the loaded DSC resource by running `Invoke-DSCResource`. Here is a usage example for the Visual Studio DSC Resource to use as a reference for structuring your command: + +```powershell +# Define the properties in a hashtable from Get-DscResource +$properties = @{ + HttpsUrl = 'https://github.com/microsoft/winget-dsc.git' + RootDirectory = 'C:\Source' + Ensure = 'Present' +} + +# Define the parameters for Invoke-DscResource +$params = @{ + Name = 'GitClone' + Method = 'Set' + ModuleName = 'GitDsc' + Property = $properties +} + +# Invoke the DSC resource +Invoke-DscResource @params +``` + +## Troubleshooting + +If you don't see your DSC Resource loaded, try the following: + +1. Try importing the module using `Import-Module`. If the module cannot be imported, then it cannot load the DSC resource. + + ```powershell + Import-Module + ``` + +2. Restarting your shell. +3. Verifying that your syntax in the module is correct. No warning is shown to the user if your PowerShell module file is invalid. +4. Verifying the `$env:PSModulePath` contains the folder path where your module is located. diff --git a/resources/YarnDsc/YarnDsc.psd1 b/resources/YarnDsc/YarnDsc.psd1 index 3a97bfec..9489d856 100644 --- a/resources/YarnDsc/YarnDsc.psd1 +++ b/resources/YarnDsc/YarnDsc.psd1 @@ -8,127 +8,127 @@ @{ -# Script module or binary module file associated with this manifest. -RootModule = 'YarnDsc.psm1' + # Script module or binary module file associated with this manifest. + RootModule = 'YarnDsc.psm1' -# Version number of this module. -ModuleVersion = '0.1.0' + # Version number of this module. + ModuleVersion = '0.1.0' -# Supported PSEditions -# CompatiblePSEditions = @() + # Supported PSEditions + # CompatiblePSEditions = @() -# ID used to uniquely identify this module -GUID = '6aaf009e-013a-4e41-9edf-619c601e02ef' + # ID used to uniquely identify this module + GUID = '6aaf009e-013a-4e41-9edf-619c601e02ef' -# Author of this module -Author = 'DscSamples' + # Author of this module + Author = 'DscSamples' -# Company or vendor of this module -# CompanyName = '' + # Company or vendor of this module + # CompanyName = '' -# Copyright statement for this module -# Copyright = '' + # Copyright statement for this module + # Copyright = '' -# Description of the functionality provided by this module -Description = 'DSC Resource for Yarn' + # Description of the functionality provided by this module + Description = 'DSC Resource for Yarn' -# Minimum version of the PowerShell engine required by this module -# PowerShellVersion = '' + # Minimum version of the PowerShell engine required by this module + # PowerShellVersion = '' -# Name of the PowerShell host required by this module -# PowerShellHostName = '' + # Name of the PowerShell host required by this module + # PowerShellHostName = '' -# Minimum version of the PowerShell host required by this module -# PowerShellHostVersion = '' + # Minimum version of the PowerShell host required by this module + # PowerShellHostVersion = '' -# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# DotNetFrameworkVersion = '' + # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # DotNetFrameworkVersion = '' -# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. -# ClrVersion = '' + # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. + # ClrVersion = '' -# Processor architecture (None, X86, Amd64) required by this module -# ProcessorArchitecture = '' + # Processor architecture (None, X86, Amd64) required by this module + # ProcessorArchitecture = '' -# Modules that must be imported into the global environment prior to importing this module -# RequiredModules = @() + # Modules that must be imported into the global environment prior to importing this module + # RequiredModules = @() -# Assemblies that must be loaded prior to importing this module -# RequiredAssemblies = @() + # Assemblies that must be loaded prior to importing this module + # RequiredAssemblies = @() -# Script files (.ps1) that are run in the caller's environment prior to importing this module. -# ScriptsToProcess = @() + # Script files (.ps1) that are run in the caller's environment prior to importing this module. + # ScriptsToProcess = @() -# Type files (.ps1xml) to be loaded when importing this module -# TypesToProcess = @() + # Type files (.ps1xml) to be loaded when importing this module + # TypesToProcess = @() -# Format files (.ps1xml) to be loaded when importing this module -# FormatsToProcess = @() + # Format files (.ps1xml) to be loaded when importing this module + # FormatsToProcess = @() -# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess -# NestedModules = @() + # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess + # NestedModules = @() -# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. -# FunctionsToExport = @() + # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. + # FunctionsToExport = @() -# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. -# CmdletsToExport = @() + # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. + # CmdletsToExport = @() -# Variables to export from this module -# VariablesToExport = '*' + # Variables to export from this module + # VariablesToExport = '*' -# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. -# AliasesToExport = @() + # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. + # AliasesToExport = @() -# DSC resources to export from this module -DscResourcesToExport = @( - 'YarnInstall' -) + # DSC resources to export from this module + DscResourcesToExport = @( + 'YarnInstall' + ) -# List of all modules packaged with this module -# ModuleList = @() + # List of all modules packaged with this module + # ModuleList = @() -# List of all files packaged with this module -# FileList = @() + # List of all files packaged with this module + # FileList = @() -# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. -PrivateData = @{ + # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. + PrivateData = @{ - PSData = @{ + PSData = @{ - # Tags applied to this module. These help with module discovery in online galleries. - Tags = @('PSDscResource_YarnInstall') + # Tags applied to this module. These help with module discovery in online galleries. + Tags = @('PSDscResource_YarnInstall') - # A URL to the license for this module. - # LicenseUri = '' + # A URL to the license for this module. + # LicenseUri = '' - # A URL to the main website for this project. - # ProjectUri = '' + # A URL to the main website for this project. + # ProjectUri = '' - # A URL to an icon representing this module. - # IconUri = '' + # A URL to an icon representing this module. + # IconUri = '' - # ReleaseNotes of this module - # ReleaseNotes = '' + # ReleaseNotes of this module + # ReleaseNotes = '' - # Prerelease string of this module - Prerelease = 'alpha' + # Prerelease string of this module + Prerelease = 'alpha' - # Flag to indicate whether the module requires explicit user acceptance for install/update/save - # RequireLicenseAcceptance = $false + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false - # External dependent modules of this module - # ExternalModuleDependencies = @() + # External dependent modules of this module + # ExternalModuleDependencies = @() - } # End of PSData hashtable + } # End of PSData hashtable -} # End of PrivateData hashtable + } # End of PrivateData hashtable -# HelpInfo URI of this module -# HelpInfoURI = '' + # HelpInfo URI of this module + # HelpInfoURI = '' -# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. -# DefaultCommandPrefix = '' + # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. + # DefaultCommandPrefix = '' } diff --git a/resources/YarnDsc/YarnDsc.psm1 b/resources/YarnDsc/YarnDsc.psm1 index 6bab1318..b811b755 100644 --- a/resources/YarnDsc/YarnDsc.psm1 +++ b/resources/YarnDsc/YarnDsc.psm1 @@ -63,7 +63,7 @@ class YarnInstall function Assert-Yarn { # Refresh session $path value before invoking 'npm' - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") + $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") try { Invoke-Yarn -Command 'help' @@ -79,7 +79,7 @@ function Invoke-YarnInfo { param( [Parameter()] - [string]$Arguments + [string]$Arguments ) $command = [List[string]]::new() @@ -111,4 +111,4 @@ function Invoke-Yarn return Invoke-Expression -Command "yarn $Command" } -#endregion Functions \ No newline at end of file +#endregion Functions diff --git a/tests/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.Tests.ps1 b/tests/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.Tests.ps1 index 1b9efd82..06a8224a 100644 --- a/tests/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.Tests.ps1 +++ b/tests/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.Tests.ps1 @@ -36,9 +36,9 @@ Describe 'DSC operation capabilities' { $parameters = @{ PackageId = 'gitversion.tool' } - + Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Set -Property $parameters - + $finalState = Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Get -Property $parameters $finalState.Exist | Should -BeTrue $finalState.Version | Should -Not -BeNullOrEmpty @@ -49,9 +49,9 @@ Describe 'DSC operation capabilities' { PackageId = 'dotnet-ef' PreRelease = $true } - + Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Set -Property $parameters - + $finalState = Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Get -Property $parameters $finalState.PackageId | Should -Be $parameters.PackageId $finalState.PreRelease | Should -BeTrue @@ -62,9 +62,9 @@ Describe 'DSC operation capabilities' { PackageId = 'dotnet-reportgenerator-globaltool' Version = '5.3.9' } - + Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Set -Property $parameters - + $finalState = Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Get -Property $parameters $finalState.PackageId | Should -Be $parameters.PackageId $finalState.Version | Should -Be $parameters.Version @@ -75,9 +75,9 @@ Describe 'DSC operation capabilities' { PackageId = 'dotnet-reportgenerator-globaltool' Version = '5.3.10' } - + Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Set -Property $parameters - + $finalState = Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Get -Property $parameters $finalState.PackageId | Should -Be $parameters.PackageId $finalState.Version | Should -Be $parameters.Version @@ -88,9 +88,9 @@ Describe 'DSC operation capabilities' { PackageId = 'PowerShell' Version = '7.2.0-preview.5' } - + Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Set -Property $parameters - + $finalState = Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Get -Property $parameters $finalState.PackageId | Should -Be $parameters.PackageId $finalState.Version | Should -Be $parameters.Version @@ -99,7 +99,7 @@ Describe 'DSC operation capabilities' { It 'Exports resources' -Skip:(!$IsWindows) { $obj = [DotNetToolPackage]::Export() - + $obj.PackageId.Contains('dotnet-ef') | Should -Be $true $obj.PackageId.Contains('dotnet-reportgenerator-globaltool') | Should -Be $true } @@ -108,7 +108,7 @@ Describe 'DSC operation capabilities' { $parameters = @{ PackageId = 'Azure-Core' # not a tool } - + { Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Set -Property $parameters } | Should -Throw -ExpectedMessage "Executing dotnet.exe with {tool install Azure-Core --global --ignore-failed-sources} failed." } @@ -236,4 +236,4 @@ Describe 'DSC helper functions' { AfterAll { Remove-Item -Path $toolsDir -Recurse -Force -ErrorAction SilentlyContinue -} \ No newline at end of file +} diff --git a/tests/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.Tests.ps1 b/tests/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.Tests.ps1 index 7291d432..d8f34766 100644 --- a/tests/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.Tests.ps1 +++ b/tests/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.Tests.ps1 @@ -14,7 +14,7 @@ BeforeAll { Install-Module -Name PSDesiredStateConfiguration -Force -SkipPublisherCheck Import-Module Microsoft.VSCode.Dsc - # Install VSCode + # Install VSCode Invoke-WebRequest https://raw.githubusercontent.com/PowerShell/vscode-powershell/main/scripts/Install-VSCode.ps1 -UseBasicParsing -OutFile Install-VSCode.ps1 .\Install-VSCode.ps1 -BuildEdition Stable-User -Confirm:$false @@ -37,10 +37,10 @@ Describe 'VSCodeExtension' { Name = 'ms-vscode.powershell' } $initialState = Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Get -Property $parameters - + $testResult = Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Test -Property $parameters $testResult.InDesiredState | Should -Be $true - + # Invoking set should not change these values. Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Set -Property $parameters $finalState = Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Get -Property $parameters @@ -53,27 +53,27 @@ Describe 'VSCodeExtension' { $desiredState = @{ Name = 'ms-azure-devops.azure-pipelines' } - + Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Set -Property $desiredState - + $finalState = Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Get -Property $desiredState $finalState.Name | Should -Be $desiredState.Name $finalState.Exist | Should -BeTrue - } + } } Describe 'VSCodeExtension-Insiders' { It 'Keeps current extension in Insiders edition.' -Skip:(!$IsWindows) { $parameters = @{ - Name = 'ms-vscode.powershell' + Name = 'ms-vscode.powershell' Insiders = $true } $initialState = Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Get -Property $parameters - + $testResult = Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Test -Property $parameters $testResult.InDesiredState | Should -Be $true - + # Invoking set should not change these values. Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Set -Property $parameters $finalState = Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Get -Property $parameters @@ -84,18 +84,18 @@ Describe 'VSCodeExtension-Insiders' { It 'Sets desired extension in Insiders edition' -Skip:(!$IsWindows) { $desiredState = @{ - Name = 'ms-azure-devops.azure-pipelines' + Name = 'ms-azure-devops.azure-pipelines' Insiders = $true } - + Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Set -Property $desiredState - + $finalState = Invoke-DscResource -Name VSCodeExtension -ModuleName Microsoft.VSCode.Dsc -Method Get -Property $desiredState $finalState.Name | Should -Be $desiredState.Name $finalState.Exist | Should -BeTrue - } + } } AfterAll { # Uninstall VSCode? -} \ No newline at end of file +} diff --git a/tests/Microsoft.Windows.Developer/Microsoft.Windows.Developer.Tests.ps1 b/tests/Microsoft.Windows.Developer/Microsoft.Windows.Developer.Tests.ps1 index 0ca64a78..c72b4253 100644 --- a/tests/Microsoft.Windows.Developer/Microsoft.Windows.Developer.Tests.ps1 +++ b/tests/Microsoft.Windows.Developer/Microsoft.Windows.Developer.Tests.ps1 @@ -1,176 +1,176 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. -using module Microsoft.Windows.Developer - -$ErrorActionPreference = "Stop" -Set-StrictMode -Version Latest - -<# -.Synopsis - Pester tests related to the Microsoft.WinGet.Developer PowerShell module. -#> - -BeforeAll { - Install-Module -Name PSDesiredStateConfiguration -Force -SkipPublisherCheck - Import-Module Microsoft.Windows.Developer - - # Create test registry path. - New-Item -Path TestRegistry:\ -Name TestKey - # Set-ItemProperty requires the PSDrive to be in the format 'HKCU:'. - $env:TestRegistryPath = ((Get-Item -Path TestRegistry:\).Name).replace("HKEY_CURRENT_USER", "HKCU:") -} - -Describe 'List available DSC resources' { - It 'Shows DSC Resources' { - $expectedDSCResources = "DeveloperMode", "OsVersion", "ShowSecondsInClock", "EnableDarkMode", "Taskbar", "UserAccessControl", "WindowsExplorer", "EnableRemoteDesktop" - $availableDSCResources = (Get-DscResource -Module Microsoft.Windows.Developer).Name - $availableDSCResources.length | Should -Be 8 - $availableDSCResources | Where-Object { $expectedDSCResources -notcontains $_ } | Should -BeNullOrEmpty -ErrorAction Stop - } -} - -Describe 'Taskbar' { - It 'Keeps current value.' { - $initialState = Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - - $parameters = @{ - Alignment = 'KeepCurrentValue'; - HideLabelsMode = 'KeepCurrentValue'; - SearchboxMode = 'KeepCurrentValue'; - TaskViewButton = 'KeepCurrentValue'; - WidgetsButton = 'KeepCurrentValue' - } - - $testResult = Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Test -Property $parameters - $testResult.InDesiredState | Should -Be $true - - # Invoking set should not change these values. - Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Set -Property $parameters - $finalState = Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - $finalState.Alignment | Should -Be $initialState.Alignment - $finalState.HideLabelsMode | Should -Be $initialState.HideLabelsMode - $finalState.SearchboxMode | Should -Be $initialState.SearchboxMode - $finalState.TaskViewButton | Should -Be $initialState.WidgetsButton - } - - It 'Sets desired value' { - # Randomly generate desired state. Minimum is set to 1 to avoid KeepCurrentValue - $desiredAlignment = [Alignment](Get-Random -Maximum 3 -Minimum 1) - $desiredHideLabelsMode = [HideTaskBarLabelsBehavior](Get-Random -Maximum 4 -Minimum 1) - $desiredSearchboxMode = [SearchBoxMode](Get-Random -Maximum 5 -Minimum 1) - $desiredTaskViewButton = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) - $desiredWidgetsButton = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) - - $desiredState = @{ Alignment = $desiredAlignment; - HideLabelsMode = $desiredHideLabelsMode; - SearchboxMode = $desiredSearchboxMode; - TaskViewButton = $desiredTaskViewButton; - WidgetsButton = $desiredWidgetsButton - } - - Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState - - $finalState = Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - $finalState.Alignment | Should -Be $desiredAlignment - $finalState.HideLabelsMode | Should -Be $desiredHideLabelsMode - $finalState.SearchboxMode | Should -Be $desiredSearchboxMode - $finalState.TaskViewButton | Should -Be $desiredTaskViewButton - $finalState.WidgetsButton | Should -Be $desiredWidgetsButton - } -} - -Describe 'WindowsExplorer' { - It 'Keeps current value.' { - $initialState = Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - - $parameters = @{ - FileExtensions = 'KeepCurrentValue'; - HiddenFiles = 'KeepCurrentValue'; - ItemCheckBoxes = 'KeepCurrentValue' - } - - $testResult = Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Test -Property $parameters - $testResult.InDesiredState | Should -Be $true - - # Invoking set should not change these values. - Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Set -Property $parameters - $finalState = Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - $finalState.FileExtensions | Should -Be $initialState.FileExtensions - $finalState.HiddenFiles | Should -Be $initialState.HiddenFiles - $finalState.ItemCheckBoxes | Should -Be $initialState.ItemCheckBoxes - } - - It 'Sets desired value' { - # Randomly generate desired state. Minimum is set to 1 to avoid using KeepCurrentValue - $desiredFileExtensions = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) - $desiredHiddenFiles = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) - $desiredItemCheckBoxes = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) - - $desiredState = @{ - FileExtensions = $desiredFileExtensions; - HiddenFiles = $desiredHiddenFiles; - ItemCheckBoxes = $desiredItemCheckBoxes - } - - Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState - - $finalState = Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - $finalState.FileExtensions | Should -Be $desiredFileExtensions - $finalState.HiddenFiles | Should -Be $desiredHiddenFiles - $finalState.ItemCheckBoxes | Should -Be $desiredItemCheckBoxes - } -} - -Describe 'UserAccessControl' { - It 'Keeps current value.' { - $initialState = Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - - $parameters = @{ AdminConsentPromptBehavior = 'KeepCurrentValue' } - - $testResult = Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Test -Property $parameters - $testResult.InDesiredState | Should -Be $true - - # Invoking set should not change these values. - Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Set -Property $parameters - $finalState = Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - $finalState.AdminConsentPromptBehavior | Should -Be $initialState.AdminConsentPromptBehavior - } - - It 'Sets desired value.' { - # Randomly generate desired state. Minimum is set to 1 to avoid using KeepCurrentValue - $desiredAdminConsentPromptBehavior = [AdminConsentPromptBehavior](Get-Random -Maximum 6 -Minimum 1) - - $desiredState = @{ AdminConsentPromptBehavior = $desiredAdminConsentPromptBehavior } - - Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState - - $finalState = Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - $finalState.AdminConsentPromptBehavior | Should -Be $desiredAdminConsentPromptBehavior - } -} - -Describe 'EnableRemoteDesktop' { - It 'Sets Enabled' { - $desiredRemoteDesktopBehavior = [Ensure]::Present - $desiredState = @{ Ensure = $desiredRemoteDesktopBehavior } - - Invoke-DscResource -Name EnableRemoteDesktop -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState - - $finalState = Invoke-DscResource -Name EnableRemoteDesktop -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - $finalState.Ensure | Should -Be $desiredRemoteDesktopBehavior - } - - It 'Sets Disabled' { - $desiredRemoteDesktopBehavior = [Ensure]::Absent - $desiredState = @{ Ensure = $desiredRemoteDesktopBehavior } - - Invoke-DscResource -Name EnableRemoteDesktop -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState - - $finalState = Invoke-DscResource -Name EnableRemoteDesktop -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} - $finalState.Ensure | Should -Be $desiredRemoteDesktopBehavior - } -} - -AfterAll { - $env:TestRegistryPath = "" -} \ No newline at end of file +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +using module Microsoft.Windows.Developer + +$ErrorActionPreference = "Stop" +Set-StrictMode -Version Latest + +<# +.Synopsis + Pester tests related to the Microsoft.WinGet.Developer PowerShell module. +#> + +BeforeAll { + Install-Module -Name PSDesiredStateConfiguration -Force -SkipPublisherCheck + Import-Module Microsoft.Windows.Developer + + # Create test registry path. + New-Item -Path TestRegistry:\ -Name TestKey + # Set-ItemProperty requires the PSDrive to be in the format 'HKCU:'. + $env:TestRegistryPath = ((Get-Item -Path TestRegistry:\).Name).replace("HKEY_CURRENT_USER", "HKCU:") +} + +Describe 'List available DSC resources' { + It 'Shows DSC Resources' { + $expectedDSCResources = "DeveloperMode", "OsVersion", "ShowSecondsInClock", "EnableDarkMode", "Taskbar", "UserAccessControl", "WindowsExplorer", "EnableRemoteDesktop" + $availableDSCResources = (Get-DscResource -Module Microsoft.Windows.Developer).Name + $availableDSCResources.length | Should -Be 8 + $availableDSCResources | Where-Object { $expectedDSCResources -notcontains $_ } | Should -BeNullOrEmpty -ErrorAction Stop + } +} + +Describe 'Taskbar' { + It 'Keeps current value.' { + $initialState = Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + + $parameters = @{ + Alignment = 'KeepCurrentValue'; + HideLabelsMode = 'KeepCurrentValue'; + SearchboxMode = 'KeepCurrentValue'; + TaskViewButton = 'KeepCurrentValue'; + WidgetsButton = 'KeepCurrentValue' + } + + $testResult = Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Test -Property $parameters + $testResult.InDesiredState | Should -Be $true + + # Invoking set should not change these values. + Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Set -Property $parameters + $finalState = Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + $finalState.Alignment | Should -Be $initialState.Alignment + $finalState.HideLabelsMode | Should -Be $initialState.HideLabelsMode + $finalState.SearchboxMode | Should -Be $initialState.SearchboxMode + $finalState.TaskViewButton | Should -Be $initialState.WidgetsButton + } + + It 'Sets desired value' { + # Randomly generate desired state. Minimum is set to 1 to avoid KeepCurrentValue + $desiredAlignment = [Alignment](Get-Random -Maximum 3 -Minimum 1) + $desiredHideLabelsMode = [HideTaskBarLabelsBehavior](Get-Random -Maximum 4 -Minimum 1) + $desiredSearchboxMode = [SearchBoxMode](Get-Random -Maximum 5 -Minimum 1) + $desiredTaskViewButton = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) + $desiredWidgetsButton = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) + + $desiredState = @{ Alignment = $desiredAlignment; + HideLabelsMode = $desiredHideLabelsMode; + SearchboxMode = $desiredSearchboxMode; + TaskViewButton = $desiredTaskViewButton; + WidgetsButton = $desiredWidgetsButton + } + + Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState + + $finalState = Invoke-DscResource -Name Taskbar -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + $finalState.Alignment | Should -Be $desiredAlignment + $finalState.HideLabelsMode | Should -Be $desiredHideLabelsMode + $finalState.SearchboxMode | Should -Be $desiredSearchboxMode + $finalState.TaskViewButton | Should -Be $desiredTaskViewButton + $finalState.WidgetsButton | Should -Be $desiredWidgetsButton + } +} + +Describe 'WindowsExplorer' { + It 'Keeps current value.' { + $initialState = Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + + $parameters = @{ + FileExtensions = 'KeepCurrentValue'; + HiddenFiles = 'KeepCurrentValue'; + ItemCheckBoxes = 'KeepCurrentValue' + } + + $testResult = Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Test -Property $parameters + $testResult.InDesiredState | Should -Be $true + + # Invoking set should not change these values. + Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Set -Property $parameters + $finalState = Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + $finalState.FileExtensions | Should -Be $initialState.FileExtensions + $finalState.HiddenFiles | Should -Be $initialState.HiddenFiles + $finalState.ItemCheckBoxes | Should -Be $initialState.ItemCheckBoxes + } + + It 'Sets desired value' { + # Randomly generate desired state. Minimum is set to 1 to avoid using KeepCurrentValue + $desiredFileExtensions = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) + $desiredHiddenFiles = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) + $desiredItemCheckBoxes = [ShowHideFeature](Get-Random -Maximum 3 -Minimum 1) + + $desiredState = @{ + FileExtensions = $desiredFileExtensions; + HiddenFiles = $desiredHiddenFiles; + ItemCheckBoxes = $desiredItemCheckBoxes + } + + Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState + + $finalState = Invoke-DscResource -Name WindowsExplorer -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + $finalState.FileExtensions | Should -Be $desiredFileExtensions + $finalState.HiddenFiles | Should -Be $desiredHiddenFiles + $finalState.ItemCheckBoxes | Should -Be $desiredItemCheckBoxes + } +} + +Describe 'UserAccessControl' { + It 'Keeps current value.' { + $initialState = Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + + $parameters = @{ AdminConsentPromptBehavior = 'KeepCurrentValue' } + + $testResult = Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Test -Property $parameters + $testResult.InDesiredState | Should -Be $true + + # Invoking set should not change these values. + Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Set -Property $parameters + $finalState = Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + $finalState.AdminConsentPromptBehavior | Should -Be $initialState.AdminConsentPromptBehavior + } + + It 'Sets desired value.' { + # Randomly generate desired state. Minimum is set to 1 to avoid using KeepCurrentValue + $desiredAdminConsentPromptBehavior = [AdminConsentPromptBehavior](Get-Random -Maximum 6 -Minimum 1) + + $desiredState = @{ AdminConsentPromptBehavior = $desiredAdminConsentPromptBehavior } + + Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState + + $finalState = Invoke-DscResource -Name UserAccessControl -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + $finalState.AdminConsentPromptBehavior | Should -Be $desiredAdminConsentPromptBehavior + } +} + +Describe 'EnableRemoteDesktop' { + It 'Sets Enabled' { + $desiredRemoteDesktopBehavior = [Ensure]::Present + $desiredState = @{ Ensure = $desiredRemoteDesktopBehavior } + + Invoke-DscResource -Name EnableRemoteDesktop -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState + + $finalState = Invoke-DscResource -Name EnableRemoteDesktop -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + $finalState.Ensure | Should -Be $desiredRemoteDesktopBehavior + } + + It 'Sets Disabled' { + $desiredRemoteDesktopBehavior = [Ensure]::Absent + $desiredState = @{ Ensure = $desiredRemoteDesktopBehavior } + + Invoke-DscResource -Name EnableRemoteDesktop -ModuleName Microsoft.Windows.Developer -Method Set -Property $desiredState + + $finalState = Invoke-DscResource -Name EnableRemoteDesktop -ModuleName Microsoft.Windows.Developer -Method Get -Property @{} + $finalState.Ensure | Should -Be $desiredRemoteDesktopBehavior + } +} + +AfterAll { + $env:TestRegistryPath = "" +} diff --git a/tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1 b/tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1 index 339e6221..3e1b3dbb 100644 --- a/tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1 +++ b/tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1 @@ -34,9 +34,9 @@ Describe 'Pip3Package' { $desiredState = @{ PackageName = 'django' } - + Invoke-DscResource -Name Pip3Package -ModuleName PythonPip3Dsc -Method Set -Property $desiredState - + $finalState = Invoke-DscResource -Name Pip3Package -ModuleName PythonPip3Dsc -Method Get -Property $desiredState $finalState.PackageName | Should -Be $desiredState.PackageName $finalState.Exist | Should -BeTrue @@ -47,13 +47,13 @@ Describe 'Pip3Package' { PackageName = 'flask' Version = '3.0.3' } - + Invoke-DscResource -Name Pip3Package -ModuleName PythonPip3Dsc -Method Set -Property $desiredState - + $finalState = Invoke-DscResource -Name Pip3Package -ModuleName PythonPip3Dsc -Method Get -Property $desiredState $finalState.PackageName | Should -Be $desiredState.PackageName $finalState.Exist | Should -BeTrue - $finalState.Version | Should -Be $desiredState.Version + $finalState.Version | Should -Be $desiredState.Version } It 'Updates with specific version' -Skip:(!$IsWindows) { @@ -61,7 +61,7 @@ Describe 'Pip3Package' { PackageName = 'requests' Version = '2.32.2' } - + Invoke-DscResource -Name Pip3Package -ModuleName PythonPip3Dsc -Method Set -Property $desiredState # Now update the package to a newer version @@ -71,7 +71,7 @@ Describe 'Pip3Package' { $finalState = Invoke-DscResource -Name Pip3Package -ModuleName PythonPip3Dsc -Method Get -Property $desiredState $finalState.PackageName | Should -Be $desiredState.PackageName $finalState.Exist | Should -BeTrue - $finalState.Version | Should -Be $desiredState.Version + $finalState.Version | Should -Be $desiredState.Version } It 'Handles non-existent package gracefully' -Skip:(!$IsWindows) { From aae465254e037572bda1e845e963106f90026f0d Mon Sep 17 00:00:00 2001 From: Kaleb Luedtke Date: Tue, 5 Nov 2024 13:21:23 -0600 Subject: [PATCH 6/6] Use settings from PowerShellPracticeAndStyle/Style-Guide (#116) * https://github.com/PoshCode/PowerShellPracticeAndStyle/blob/master/Style-Guide/Code-Layout-and-Formatting.md#one-true-brace-style --- .vscode/settings.json | 18 +- resources/GitDsc/GitDsc.psm1 | 232 +++----- .../Microsoft.DotNet.Dsc.psm1 | 285 ++++----- .../Microsoft.VSCode.Dsc.psm1 | 164 ++--- .../Microsoft.Windows.Developer.psm1 | 325 ++++------ ...crosoft.Windows.Setting.Accessibility.psm1 | 561 ++++++------------ .../Microsoft.WindowsSandbox.DSC.psm1 | 146 ++--- resources/NpmDsc/NpmDsc.psm1 | 138 ++--- resources/PythonPip3Dsc/PythonPip3Dsc.psm1 | 209 +++---- resources/YarnDsc/YarnDsc.psm1 | 51 +- .../Microsoft.DotNet.Dsc.Tests.ps1 | 21 +- .../Microsoft.VSCode.Dsc.Tests.ps1 | 4 +- ...ft.Windows.Setting.Accessibility.Tests.ps1 | 11 +- tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1 | 9 +- 14 files changed, 761 insertions(+), 1413 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 2d799776..4be48be1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,22 @@ { - "powershell.codeFormatting.preset": "Allman", "editor.formatOnSave": true, "[powershell]": { "files.encoding": "utf8bom", "files.autoGuessEncoding": true - } + }, + "powershell.codeFormatting.preset": "OTBS", + "powershell.codeFormatting.useConstantStrings": true, + "powershell.codeFormatting.trimWhitespaceAroundPipe": true, + "powershell.codeFormatting.useCorrectCasing": true, + "powershell.codeFormatting.whitespaceBeforeOpenParen": true, + "powershell.codeFormatting.whitespaceBetweenParameters": true, + "powershell.codeFormatting.addWhitespaceAroundPipe": true, + "powershell.codeFormatting.alignPropertyValuePairs": true, + "powershell.codeFormatting.autoCorrectAliases": true, + "powershell.codeFormatting.avoidSemicolonsAsLineTerminators": true, + "powershell.codeFormatting.ignoreOneLineBlock": true, + "powershell.codeFormatting.whitespaceBeforeOpenBrace": true, + "powershell.codeFormatting.whitespaceAroundOperator": true, + "powershell.codeFormatting.whitespaceAfterSeparator": true, + "powershell.codeFormatting.whitespaceInsideBrace": true } diff --git a/resources/GitDsc/GitDsc.psm1 b/resources/GitDsc/GitDsc.psm1 index e4ede96c..e64d816b 100644 --- a/resources/GitDsc/GitDsc.psm1 +++ b/resources/GitDsc/GitDsc.psm1 @@ -3,14 +3,12 @@ using namespace System.Collections.Generic -enum Ensure -{ +enum Ensure { Absent Present } -enum ConfigLocation -{ +enum ConfigLocation { none global system @@ -23,8 +21,7 @@ Assert-Git #region DSCResources [DSCResource()] -class GitClone -{ +class GitClone { [DscProperty()] [Ensure]$Ensure = [Ensure]::Present @@ -38,16 +35,14 @@ class GitClone [DscProperty(Mandatory)] [string]$RootDirectory - [GitClone] Get() - { + [GitClone] Get() { $currentState = [GitClone]::new() $currentState.HttpsUrl = $this.HttpsUrl $currentState.RootDirectory = $this.RootDirectory $currentState.Ensure = [Ensure]::Absent - $currentState.RemoteName = ($null -eq $this.RemoteName) ? "origin" : $this.RemoteName + $currentState.RemoteName = ($null -eq $this.RemoteName) ? 'origin' : $this.RemoteName - if (-not(Test-Path -Path $this.RootDirectory)) - { + if (-not(Test-Path -Path $this.RootDirectory)) { return $currentState } @@ -55,41 +50,33 @@ class GitClone $projectName = GetGitProjectName($this.HttpsUrl) $expectedDirectory = Join-Path -Path $this.RootDirectory -ChildPath $projectName - if (Test-Path $expectedDirectory) - { + if (Test-Path $expectedDirectory) { Set-Location -Path $expectedDirectory - try - { + try { $gitRemoteValue = Invoke-GitRemote("get-url $($currentState.RemoteName)") - if ($gitRemoteValue -like $this.HttpsUrl) - { + if ($gitRemoteValue -like $this.HttpsUrl) { $currentState.Ensure = [Ensure]::Present } } - catch - { + catch { # Failed to execute `git remote`. Ensure state is `absent` } } - return $currentState; + return $currentState } - [bool] Test() - { + [bool] Test() { $currentState = $this.Get() return $currentState.Ensure -eq $this.Ensure } - [void] Set() - { - if ($this.Ensure -eq [Ensure]::Absent) - { - throw "This resource does not support removing a cloned repository." + [void] Set() { + if ($this.Ensure -eq [Ensure]::Absent) { + throw 'This resource does not support removing a cloned repository.' } - if (-not(Test-Path $this.RootDirectory)) - { + if (-not(Test-Path $this.RootDirectory)) { New-Item -ItemType Directory -Path $this.RootDirectory } @@ -99,8 +86,7 @@ class GitClone } [DSCResource()] -class GitRemote -{ +class GitRemote { [DscProperty()] [Ensure]$Ensure = [Ensure]::Present @@ -114,70 +100,57 @@ class GitRemote [DscProperty(Mandatory)] [string]$ProjectDirectory - [GitRemote] Get() - { + [GitRemote] Get() { $currentState = [GitRemote]::new() $currentState.RemoteName = $this.RemoteName $currentState.RemoteUrl = $this.RemoteUrl $currentState.ProjectDirectory = $this.ProjectDirectory - if (-not(Test-Path -Path $this.ProjectDirectory)) - { - throw "Project directory does not exist." + if (-not(Test-Path -Path $this.ProjectDirectory)) { + throw 'Project directory does not exist.' } Set-Location $this.ProjectDirectory - try - { + try { $gitRemoteValue = Invoke-GitRemote("get-url $($this.RemoteName)") $currentState.Ensure = ($gitRemoteValue -like $this.RemoteUrl) ? [Ensure]::Present : [Ensure]::Absent } - catch - { + catch { $currentState.Ensure = [Ensure]::Absent } return $currentState } - [bool] Test() - { + [bool] Test() { $currentState = $this.Get() return $currentState.Ensure -eq $this.Ensure } - [void] Set() - { + [void] Set() { Set-Location $this.ProjectDirectory - if ($this.Ensure -eq [Ensure]::Present) - { - try - { + if ($this.Ensure -eq [Ensure]::Present) { + try { Invoke-GitRemote("add $($this.RemoteName) $($this.RemoteUrl)") } - catch - { - throw "Failed to add remote repository." + catch { + throw 'Failed to add remote repository.' } } - else - { - try - { + else { + try { Invoke-GitRemote("remove $($this.RemoteName)") } - catch - { - throw "Failed to remove remote repository." + catch { + throw 'Failed to remove remote repository.' } } } } [DSCResource()] -class GitConfigUserName -{ +class GitConfigUserName { [DscProperty()] [Ensure]$Ensure = [Ensure]::Present @@ -190,64 +163,52 @@ class GitConfigUserName [DscProperty()] [string]$ProjectDirectory - [GitConfigUserName] Get() - { + [GitConfigUserName] Get() { $currentState = [GitConfigUserName]::new() $currentState.UserName = $this.UserName $currentState.ConfigLocation = $this.ConfigLocation $currentState.ProjectDirectory = $this.ProjectDirectory - if ($this.ConfigLocation -ne [ConfigLocation]::global -and $this.ConfigLocation -ne [ConfigLocation]::system) - { + if ($this.ConfigLocation -ne [ConfigLocation]::global -and $this.ConfigLocation -ne [ConfigLocation]::system) { # Project directory is not required for --global or --system configurations - if ($this.ProjectDirectory) - { - if (Test-Path -Path $this.ProjectDirectory) - { + if ($this.ProjectDirectory) { + if (Test-Path -Path $this.ProjectDirectory) { Set-Location $this.ProjectDirectory } - else - { - throw "Project directory does not exist." + else { + throw 'Project directory does not exist.' } } - else - { - throw "Project directory parameter must be specified for non-system and non-global configurations." + else { + throw 'Project directory parameter must be specified for non-system and non-global configurations.' } } - $configArgs = ConstructGitConfigUserArguments -Arguments "user.name" -ConfigLocation $this.ConfigLocation + $configArgs = ConstructGitConfigUserArguments -Arguments 'user.name' -ConfigLocation $this.ConfigLocation $result = Invoke-GitConfig($configArgs) $currentState.Ensure = ($currentState.UserName -eq $result) ? [Ensure]::Present : [Ensure]::Absent return $currentState } - [bool] Test() - { + [bool] Test() { $currentState = $this.Get() return $currentState.Ensure -eq $this.Ensure } - [void] Set() - { - if ($this.ConfigLocation -eq [ConfigLocation]::system) - { + [void] Set() { + if ($this.ConfigLocation -eq [ConfigLocation]::system) { Assert-IsAdministrator } - if ($this.ConfigLocation -ne [ConfigLocation]::global -and $this.ConfigLocation -ne [ConfigLocation]::system) - { + if ($this.ConfigLocation -ne [ConfigLocation]::global -and $this.ConfigLocation -ne [ConfigLocation]::system) { Set-Location $this.ProjectDirectory } - if ($this.Ensure -eq [Ensure]::Present) - { + if ($this.Ensure -eq [Ensure]::Present) { $configArgs = ConstructGitConfigUserArguments -Arguments "user.name '$($this.UserName)'" -ConfigLocation $this.ConfigLocation } - else - { - $configArgs = ConstructGitConfigUserArguments -Arguments "--unset user.name" -ConfigLocation $this.ConfigLocation + else { + $configArgs = ConstructGitConfigUserArguments -Arguments '--unset user.name' -ConfigLocation $this.ConfigLocation } Invoke-GitConfig($configArgs) @@ -255,8 +216,7 @@ class GitConfigUserName } [DSCResource()] -class GitConfigUserEmail -{ +class GitConfigUserEmail { [DscProperty()] [Ensure]$Ensure = [Ensure]::Present @@ -269,64 +229,52 @@ class GitConfigUserEmail [DscProperty()] [string]$ProjectDirectory - [GitConfigUserEmail] Get() - { + [GitConfigUserEmail] Get() { $currentState = [GitConfigUserEmail]::new() $currentState.UserEmail = $this.UserEmail $currentState.ConfigLocation = $this.ConfigLocation $currentState.ProjectDirectory = $this.ProjectDirectory - if ($this.ConfigLocation -ne [ConfigLocation]::global -and $this.ConfigLocation -ne [ConfigLocation]::system) - { + if ($this.ConfigLocation -ne [ConfigLocation]::global -and $this.ConfigLocation -ne [ConfigLocation]::system) { # Project directory is not required for --global or --system configurations - if ($this.ProjectDirectory) - { - if (Test-Path -Path $this.ProjectDirectory) - { + if ($this.ProjectDirectory) { + if (Test-Path -Path $this.ProjectDirectory) { Set-Location $this.ProjectDirectory } - else - { - throw "Project directory does not exist." + else { + throw 'Project directory does not exist.' } } - else - { - throw "Project directory parameter must be specified for non-system and non-global configurations." + else { + throw 'Project directory parameter must be specified for non-system and non-global configurations.' } } - $configArgs = ConstructGitConfigUserArguments -Arguments "user.email" -ConfigLocation $this.ConfigLocation + $configArgs = ConstructGitConfigUserArguments -Arguments 'user.email' -ConfigLocation $this.ConfigLocation $result = Invoke-GitConfig($configArgs) $currentState.Ensure = ($currentState.UserEmail -eq $result) ? [Ensure]::Present : [Ensure]::Absent return $currentState } - [bool] Test() - { + [bool] Test() { $currentState = $this.Get() return $currentState.Ensure -eq $this.Ensure } - [void] Set() - { - if ($this.ConfigLocation -eq [ConfigLocation]::system) - { + [void] Set() { + if ($this.ConfigLocation -eq [ConfigLocation]::system) { Assert-IsAdministrator } - if ($this.ConfigLocation -ne [ConfigLocation]::global -and $this.ConfigLocation -ne [ConfigLocation]::system) - { + if ($this.ConfigLocation -ne [ConfigLocation]::global -and $this.ConfigLocation -ne [ConfigLocation]::system) { Set-Location $this.ProjectDirectory } - if ($this.Ensure -eq [Ensure]::Present) - { + if ($this.Ensure -eq [Ensure]::Present) { $configArgs = ConstructGitConfigUserArguments -Arguments "user.email $($this.UserEmail)" -ConfigLocation $this.ConfigLocation } - else - { - $configArgs = ConstructGitConfigUserArguments -Arguments "--unset user.email" -ConfigLocation $this.ConfigLocation + else { + $configArgs = ConstructGitConfigUserArguments -Arguments '--unset user.email' -ConfigLocation $this.ConfigLocation } Invoke-GitConfig($configArgs) @@ -336,23 +284,19 @@ class GitConfigUserEmail #endregion DSCResources #region Functions -function Assert-Git -{ +function Assert-Git { # Refresh session $path value before invoking 'git' - $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") - try - { + $env:Path = [System.Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [System.Environment]::GetEnvironmentVariable('Path', 'User') + try { Invoke-Git -Command 'help' return } - catch - { - throw "Git is not installed" + catch { + throw 'Git is not installed' } } -function GetGitProjectName -{ +function GetGitProjectName { param( [Parameter()] [string]$HttpsUrl @@ -362,47 +306,43 @@ function GetGitProjectName return $projectName } -function Invoke-GitConfig -{ +function Invoke-GitConfig { param( [Parameter()] [string]$Arguments ) $command = [List[string]]::new() - $command.Add("config") + $command.Add('config') $command.Add($Arguments) return Invoke-Git -Command $command } -function Invoke-GitRemote -{ +function Invoke-GitRemote { param( [Parameter()] [string]$Arguments ) $command = [List[string]]::new() - $command.Add("remote") + $command.Add('remote') $command.Add($Arguments) return Invoke-Git -Command $command } -function Invoke-GitClone -{ +function Invoke-GitClone { param( [Parameter()] [string]$Arguments ) $command = [List[string]]::new() - $command.Add("clone") + $command.Add('clone') $command.Add($Arguments) return Invoke-Git -Command $command } -function Invoke-Git -{ +function Invoke-Git { param ( [Parameter(Mandatory = $true)] [string]$Command @@ -411,8 +351,7 @@ function Invoke-Git return Invoke-Expression -Command "git $Command" } -function ConstructGitConfigUserArguments -{ +function ConstructGitConfigUserArguments { param( [Parameter(Mandatory)] [string]$Arguments, @@ -422,24 +361,21 @@ function ConstructGitConfigUserArguments ) $ConfigArguments = $Arguments - if ([ConfigLocation]::None -ne $this.ConfigLocation) - { + if ([ConfigLocation]::None -ne $this.ConfigLocation) { $ConfigArguments = "--$($this.ConfigLocation) $($ConfigArguments)" } return $ConfigArguments } -function Assert-IsAdministrator -{ +function Assert-IsAdministrator { $windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $windowsPrincipal = New-Object -TypeName 'System.Security.Principal.WindowsPrincipal' -ArgumentList @( $windowsIdentity ) $adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator - if (-not $windowsPrincipal.IsInRole($adminRole)) - { - throw "This resource must be run as an Administrator to modify system settings." + if (-not $windowsPrincipal.IsInRole($adminRole)) { + throw 'This resource must be run as an Administrator to modify system settings.' } } diff --git a/resources/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.psm1 b/resources/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.psm1 index d6bb7175..e79c6642 100644 --- a/resources/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.psm1 +++ b/resources/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.psm1 @@ -1,60 +1,45 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -$ErrorActionPreference = "Stop" +$ErrorActionPreference = 'Stop' $PSNativeCommandUseErrorActionPreference = $true Set-StrictMode -Version Latest #region Functions -function Get-DotNetPath -{ - if ($IsWindows) - { +function Get-DotNetPath { + if ($IsWindows) { $dotNetPath = "$env:ProgramFiles\dotnet\dotnet.exe" - if (-not (Test-Path $dotNetPath)) - { + if (-not (Test-Path $dotNetPath)) { $dotNetPath = "${env:ProgramFiles(x86)}\dotnet\dotnet.exe" - if (-not (Test-Path $dotNetPath)) - { - throw "dotnet.exe not found in Program Files or Program Files (x86)" + if (-not (Test-Path $dotNetPath)) { + throw 'dotnet.exe not found in Program Files or Program Files (x86)' } } - } - elseif ($IsMacOS) - { - $dotNetPath = "/usr/local/share/dotnet/dotnet" - if (-not (Test-Path $dotNetPath)) - { - $dotNetPath = "/usr/local/bin/dotnet" - if (-not (Test-Path $dotNetPath)) - { - throw "dotnet not found in /usr/local/share/dotnet or /usr/local/bin" + } elseif ($IsMacOS) { + $dotNetPath = '/usr/local/share/dotnet/dotnet' + if (-not (Test-Path $dotNetPath)) { + $dotNetPath = '/usr/local/bin/dotnet' + if (-not (Test-Path $dotNetPath)) { + throw 'dotnet not found in /usr/local/share/dotnet or /usr/local/bin' } } - } - elseif ($IsLinux) - { - $dotNetPath = "/usr/share/dotnet/dotnet" - if (-not (Test-Path $dotNetPath)) - { - $dotNetPath = "/usr/bin/dotnet" - if (-not (Test-Path $dotNetPath)) - { - throw "dotnet not found in /usr/share/dotnet or /usr/bin" + } elseif ($IsLinux) { + $dotNetPath = '/usr/share/dotnet/dotnet' + if (-not (Test-Path $dotNetPath)) { + $dotNetPath = '/usr/bin/dotnet' + if (-not (Test-Path $dotNetPath)) { + throw 'dotnet not found in /usr/share/dotnet or /usr/bin' } } - } - else - { - throw "Unsupported operating system" + } else { + throw 'Unsupported operating system' } Write-Verbose -Message "'dotnet' found at $dotNetPath" return $dotNetPath } -function Get-DotNetToolArguments -{ +function Get-DotNetToolArguments { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] @@ -71,50 +56,44 @@ function Get-DotNetToolArguments $arguments = @($PackageId) - if (-not ($PSBoundParameters.ContainsKey("ToolPathDirectory"))) - { - $arguments += "--global" + if (-not ($PSBoundParameters.ContainsKey('ToolPathDirectory'))) { + $arguments += '--global' } - if ($PSBoundParameters.ContainsKey("Prerelease") -and $PSBoundParameters.ContainsKey("Version")) - { + if ($PSBoundParameters.ContainsKey('Prerelease') -and $PSBoundParameters.ContainsKey('Version')) { # do it with version instead of pre - $null = $PSBoundParameters.Remove("Prerelease") + $null = $PSBoundParameters.Remove('Prerelease') } # mapping table of command line arguments $mappingTable = @{ - Version = "--version {0}" - PreRelease = "--prerelease" - ToolPathDirectory = "--tool-path {0}" + Version = '--version {0}' + PreRelease = '--prerelease' + ToolPathDirectory = '--tool-path {0}' Downgrade = '--allow-downgrade' } $PSBoundParameters.GetEnumerator() | ForEach-Object { - if ($mappingTable.ContainsKey($_.Key)) - { - if ($_.Value -ne $false -and -not (([string]::IsNullOrEmpty($_.Value)))) - { + if ($mappingTable.ContainsKey($_.Key)) { + if ($_.Value -ne $false -and -not (([string]::IsNullOrEmpty($_.Value)))) { $arguments += ($mappingTable[$_.Key] -f $_.Value) } } } - return ($arguments -join " ") + return ($arguments -join ' ') } # TODO: when https://github.com/dotnet/sdk/pull/37394 is documented and version is released with option simple use --format=JSON -function Convert-DotNetToolOutput -{ +function Convert-DotNetToolOutput { [CmdletBinding()] [OutputType([PSCustomObject[]])] param ( [string[]] $Output ) - process - { + process { # Split the output into lines $lines = $Output | Select-Object -Skip 2 @@ -122,8 +101,7 @@ function Convert-DotNetToolOutput $inputObject = @() # Skip the header lines and process each line - foreach ($line in $lines) - { + foreach ($line in $lines) { # Split the line into columns $columns = $line -split '\s{2,}' @@ -142,8 +120,7 @@ function Convert-DotNetToolOutput } } -function Get-InstalledDotNetToolPackages -{ +function Get-InstalledDotNetToolPackages { [CmdletBinding()] param ( [string] $PackageId, @@ -151,9 +128,8 @@ function Get-InstalledDotNetToolPackages [bool] $PreRelease, [Parameter(Mandatory = $false)] [ValidateScript({ - if (-Not ($_ | Test-Path -PathType Container) ) - { - throw "Directory does not exist" + if (-Not ($_ | Test-Path -PathType Container) ) { + throw 'Directory does not exist' } return $true })] @@ -162,11 +138,10 @@ function Get-InstalledDotNetToolPackages ) $resultSet = [System.Collections.Generic.List[DotNetToolPackage]]::new() - $listCommand = "tool list --global" + $listCommand = 'tool list --global' $installDir = Join-Path -Path $env:USERPROFILE '.dotnet' 'tools' - if ($PSBoundParameters.ContainsKey('ToolPathDirectory')) - { + if ($PSBoundParameters.ContainsKey('ToolPathDirectory')) { $listCommand = "tool list --tool-path $ToolPathDirectory" $installDir = $ToolPathDirectory } @@ -174,24 +149,20 @@ function Get-InstalledDotNetToolPackages $result = Invoke-DotNet -Command $listCommand $packages = Convert-DotNetToolOutput -Output $result - if ($null -eq $packages) - { - Write-Debug -Message "No packages found." + if ($null -eq $packages) { + Write-Debug -Message 'No packages found.' return } - if (-not [string]::IsNullOrEmpty($PackageId)) - { + if (-not [string]::IsNullOrEmpty($PackageId)) { $packages = $packages | Where-Object { $_.PackageId -eq $PackageId } } - foreach ($package in $packages) - { + foreach ($package in $packages) { # flags to determine the existence of the package $isPrerelease = $false - $preReleasePackage = $package.Version -Split "-" - if ($preReleasePackage.Count -gt 1) - { + $preReleasePackage = $package.Version -Split '-' + if ($preReleasePackage.Count -gt 1) { # set the pre-release flag to true to build the object $isPrerelease = $true } @@ -204,27 +175,24 @@ function Get-InstalledDotNetToolPackages return $resultSet } -function Get-SemVer($version) -{ - $version -match "^(?\d+)(\.(?\d+))?(\.(?\d+))?(\-(?
[0-9A-Za-z\-\.]+))?(\+(?[0-9A-Za-z\-\.]+))?$" | Out-Null
+function Get-SemVer($version) {
+    $version -match '^(?\d+)(\.(?\d+))?(\.(?\d+))?(\-(?
[0-9A-Za-z\-\.]+))?(\+(?[0-9A-Za-z\-\.]+))?$' | Out-Null
     $major = [int]$matches['major']
     $minor = [int]$matches['minor']
     $patch = [int]$matches['patch']
 
     if ($null -eq $matches['pre']) { $pre = @() }
-    else { $pre = $matches['pre'].Split(".") }
+    else { $pre = $matches['pre'].Split('.') }
 
     $revision = 0
-    if ($pre.Length -gt 1)
-    {
+    if ($pre.Length -gt 1) {
         $revision = Get-HighestRevision -InputArray $pre
     }
 
     return [version]$version = "$major.$minor.$patch.$revision"
 }
 
-function Get-HighestRevision
-{
+function Get-HighestRevision {
     param (
         [Parameter(Mandatory = $true)]
         [array]$InputArray
@@ -236,18 +204,14 @@ function Get-HighestRevision
     }
 
     # Return the highest integer
-    if ($integers.Count -gt 0)
-    {
+    if ($integers.Count -gt 0) {
         return ($integers | Measure-Object -Maximum).Maximum
-    }
-    else
-    {
+    } else {
         return $null
     }
 }
 
-function Install-DotNetToolPackage
-{
+function Install-DotNetToolPackage {
     [CmdletBinding()]
     param (
         [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
@@ -265,8 +229,7 @@ function Install-DotNetToolPackage
     Invoke-DotNet -Command $arguments
 }
 
-function Update-DotNetToolPackage
-{
+function Update-DotNetToolPackage {
     [CmdletBinding()]
     param (
         [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
@@ -284,20 +247,17 @@ function Update-DotNetToolPackage
     Invoke-DotNet -Command $arguments
 }
 
-function Assert-DotNetToolDowngrade
-{
+function Assert-DotNetToolDowngrade {
     [version]$version = Invoke-DotNet -Command '--version'
 
-    if ($version.Build -lt 200)
-    {
+    if ($version.Build -lt 200) {
         return $false
     }
 
     return $true
 }
 
-function Uninstall-DotNetToolPackage
-{
+function Uninstall-DotNetToolPackage {
     [CmdletBinding()]
     param (
         [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
@@ -312,19 +272,15 @@ function Uninstall-DotNetToolPackage
     Invoke-DotNet -Command $arguments
 }
 
-function Invoke-DotNet
-{
+function Invoke-DotNet {
     param (
         [Parameter(Mandatory = $true)]
         [string] $Command
     )
 
-    try
-    {
+    try {
         Invoke-Expression "& `"$DotNetCliPath`" $Command"
-    }
-    catch
-    {
+    } catch {
         throw "Executing dotnet.exe with {$Command} failed."
     }
 }
@@ -382,8 +338,7 @@ $DotNetCliPath = Get-DotNetPath
     This example installs the prerelease version of the .NET tool package 'PowerShell' in the 'C:\tools' directory.
 #>
 [DSCResource()]
-class DotNetToolPackage
-{
+class DotNetToolPackage {
     [DscProperty(Key)]
     [string] $PackageId
 
@@ -404,13 +359,11 @@ class DotNetToolPackage
 
     static [hashtable] $InstalledPackages
 
-    DotNetToolPackage()
-    {
+    DotNetToolPackage() {
         [DotNetToolPackage]::GetInstalledPackages()
     }
 
-    DotNetToolPackage([string] $PackageId, [string] $Version, [string[]] $Commands, [bool] $PreRelease, [string] $ToolPathDirectory, [bool] $Exist)
-    {
+    DotNetToolPackage([string] $PackageId, [string] $Version, [string[]] $Commands, [bool] $PreRelease, [string] $ToolPathDirectory, [bool] $Exist) {
         $this.PackageId = $PackageId
         $this.Version = $Version
         $this.Commands = $Commands
@@ -419,8 +372,7 @@ class DotNetToolPackage
         $this.Exist = $Exist
     }
 
-    [DotNetToolPackage] Get()
-    {
+    [DotNetToolPackage] Get() {
         # get the properties of the object currently set
         $properties = $this.ToHashTable()
 
@@ -430,16 +382,13 @@ class DotNetToolPackage
         # current state
         $currentState = [DotNetToolPackage]::InstalledPackages[$this.PackageId]
 
-        if ($null -ne $currentState)
-        {
-            if ($this.Version -and ($this.Version -ne $currentState.Version))
-            {
+        if ($null -ne $currentState) {
+            if ($this.Version -and ($this.Version -ne $currentState.Version)) {
                 # See treatment: https://learn.microsoft.com/en-us/nuget/concepts/package-versioning?tabs=semver20sort#normalized-version-numbers
                 # in this case, we misuse revision if beta,alpha, rc are present and grab the highest revision
-                $installedVersion = Get-Semver -Version $currentState.Version
-                $currentVersion = Get-Semver -Version $this.Version
-                if ($currentVersion -ne $installedVersion)
-                {
+                $installedVersion = Get-SemVer -version $currentState.Version
+                $currentVersion = Get-SemVer -version $this.Version
+                if ($currentVersion -ne $installedVersion) {
                     $currentState.Exist = $false
                 }
             }
@@ -457,100 +406,77 @@ class DotNetToolPackage
         }
     }
 
-    Set()
-    {
-        if ($this.Test())
-        {
+    Set() {
+        if ($this.Test()) {
             return
         }
 
         $currentPackage = [DotNetToolPackage]::InstalledPackages[$this.PackageId]
-        if ($currentPackage -and $this.Exist)
-        {
-            if ($this.Version -lt $currentPackage.Version)
-            {
+        if ($currentPackage -and $this.Exist) {
+            if ($this.Version -lt $currentPackage.Version) {
                 $this.ReInstall($false)
-            }
-            else
-            {
+            } else {
                 $this.Upgrade($false)
             }
-        }
-        elseif ($this.Exist)
-        {
+        } elseif ($this.Exist) {
             $this.Install($false)
-        }
-        else
-        {
+        } else {
             $this.Uninstall($false)
         }
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if ($currentState.Exist -ne $this.Exist)
-        {
+        if ($currentState.Exist -ne $this.Exist) {
             return $false
         }
 
-        if ($null -ne $this.Version -or $this.Version -ne $currentState.Version -and $this.PreRelease -ne $currentState.PreRelease)
-        {
+        if ($null -ne $this.Version -or $this.Version -ne $currentState.Version -and $this.PreRelease -ne $currentState.PreRelease) {
             return $false
         }
         return $true
     }
 
-    static [DotNetToolPackage[]] Export()
-    {
+    static [DotNetToolPackage[]] Export() {
         return [DotNetToolPackage]::Export(@{})
     }
 
-    static [DotNetToolPackage[]] Export([hashtable] $filterProperties)
-    {
+    static [DotNetToolPackage[]] Export([hashtable] $filterProperties) {
         $packages = Get-InstalledDotNetToolPackages @filterProperties
 
         return $packages
     }
 
     #region DotNetToolPackage helper functions
-    static [void] GetInstalledPackages()
-    {
+    static [void] GetInstalledPackages() {
         [DotNetToolPackage]::InstalledPackages = @{}
 
-        foreach ($extension in [DotNetToolPackage]::Export())
-        {
+        foreach ($extension in [DotNetToolPackage]::Export()) {
             [DotNetToolPackage]::InstalledPackages[$extension.PackageId] = $extension
         }
     }
 
-    static [void] GetInstalledPackages([hashtable] $filterProperties)
-    {
+    static [void] GetInstalledPackages([hashtable] $filterProperties) {
         [DotNetToolPackage]::InstalledPackages = @{}
 
-        foreach ($extension in [DotNetToolPackage]::Export($filterProperties))
-        {
+        foreach ($extension in [DotNetToolPackage]::Export($filterProperties)) {
             [DotNetToolPackage]::InstalledPackages[$extension.PackageId] = $extension
         }
     }
 
-    [void] Upgrade([bool] $preTest)
-    {
-        if ($preTest -and $this.Test())
-        {
+    [void] Upgrade([bool] $preTest) {
+        if ($preTest -and $this.Test()) {
             return
         }
 
         $params = $this.ToHashTable()
 
-        Update-DotNetToolpackage @params
+        Update-DotNetToolPackage @params
         [DotNetToolPackage]::GetInstalledPackages()
     }
 
-    [void] ReInstall([bool] $preTest)
-    {
-        if ($preTest -and $this.Test())
-        {
+    [void] ReInstall([bool] $preTest) {
+        if ($preTest -and $this.Test()) {
             return
         }
 
@@ -559,53 +485,44 @@ class DotNetToolPackage
         [DotNetToolPackage]::GetInstalledPackages()
     }
 
-    [void] Install([bool] $preTest)
-    {
-        if ($preTest -and $this.Test())
-        {
+    [void] Install([bool] $preTest) {
+        if ($preTest -and $this.Test()) {
             return
         }
 
         $params = $this.ToHashTable()
 
-        Install-DotNetToolpackage @params
+        Install-DotNetToolPackage @params
         [DotNetToolPackage]::GetInstalledPackages()
     }
 
-    [void] Install()
-    {
+    [void] Install() {
         $this.Install($true)
     }
 
-    [void] Uninstall([bool] $preTest)
-    {
+    [void] Uninstall([bool] $preTest) {
         $params = $this.ToHashTable()
 
         $uninstallParams = @{
             PackageId = $this.PackageId
         }
 
-        if ($params.ContainsKey('ToolPathDirectory'))
-        {
+        if ($params.ContainsKey('ToolPathDirectory')) {
             $uninstallParams.Add('ToolPathDirectory', $params['ToolPathDirectory'])
         }
 
-        Uninstall-DotNetToolpackage @uninstallParams
+        Uninstall-DotNetToolPackage @uninstallParams
         [DotNetToolPackage]::GetInstalledPackages()
     }
 
-    [void] Uninstall()
-    {
+    [void] Uninstall() {
         $this.Uninstall($true)
     }
 
-    [hashtable] ToHashTable()
-    {
+    [hashtable] ToHashTable() {
         $parameters = @{}
-        foreach ($property in $this.PSObject.Properties)
-        {
-            if (-not ([string]::IsNullOrEmpty($property.Value)))
-            {
+        foreach ($property in $this.PSObject.Properties) {
+            if (-not ([string]::IsNullOrEmpty($property.Value))) {
                 $parameters[$property.Name] = $property.Value
             }
         }
diff --git a/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psm1 b/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psm1
index a12b587c..ea43f49d 100644
--- a/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psm1
+++ b/resources/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.psm1
@@ -1,64 +1,55 @@
 # Copyright (c) Microsoft Corporation. All rights reserved.
 # Licensed under the MIT License.
 
-$ErrorActionPreference = "Stop"
+$ErrorActionPreference = 'Stop'
 Set-StrictMode -Version Latest
 
 #region Functions
-function Get-VSCodeCLIPath
-{
+function Get-VSCodeCLIPath {
     param (
         [switch]$Insiders
     )
 
     # Product Codes for VSCode and VSCode Insider:
-    $vsCodeUserProductCode = "{771FD6B0-FA20-440A-A002-3B3BAC16DC50}_is1"
-    $vsCodeMachineProductCode = "{EA457B21-F73E-494C-ACAB-524FDE069978}_is1"
+    $vsCodeUserProductCode = '{771FD6B0-FA20-440A-A002-3B3BAC16DC50}_is1'
+    $vsCodeMachineProductCode = '{EA457B21-F73E-494C-ACAB-524FDE069978}_is1'
 
-    $vsCodeInsidersUserProductCode = "{217B4C08-948D-4276-BFBB-BEE930AE5A2C}_is1"
-    $vsCodeInsidersMachineProductCode = "{1287CAD5-7C8D-410D-88B9-0D1EE4A83FF2}_is1"
+    $vsCodeInsidersUserProductCode = '{217B4C08-948D-4276-BFBB-BEE930AE5A2C}_is1'
+    $vsCodeInsidersMachineProductCode = '{1287CAD5-7C8D-410D-88B9-0D1EE4A83FF2}_is1'
 
     # Note: WOW6432 registry not checked as no uninstall entry was found.
-    $userUninstallRegistry = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall"
-    $machineUninstallRegistry = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall"
-    $installLocationProperty = "InstallLocation"
+    $userUninstallRegistry = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
+    $machineUninstallRegistry = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
+    $installLocationProperty = 'InstallLocation'
 
-    if ($Insiders)
-    {
-        $cmdPath = "bin\code-insiders.cmd"
+    if ($Insiders) {
+        $cmdPath = 'bin\code-insiders.cmd'
         $insidersUserInstallLocation = TryGetRegistryValue -Key "$($userUninstallRegistry)\$($vsCodeInsidersUserProductCode)" -Property $installLocationProperty
-        if ($insidersUserInstallLocation)
-        {
+        if ($insidersUserInstallLocation) {
             return $insidersUserInstallLocation + $cmdPath
         }
 
         $insidersMachineInstallLocation = TryGetRegistryValue -Key "$($machineUninstallRegistry)\$($vsCodeInsidersMachineProductCode)" -Property $installLocationProperty
-        if ($insidersMachineInstallLocation)
-        {
+        if ($insidersMachineInstallLocation) {
             return $insidersMachineInstallLocation + $cmdPath
         }
-    }
-    else
-    {
-        $cmdPath = "bin\code.cmd"
+    } else {
+        $cmdPath = 'bin\code.cmd'
         $codeUserInstallLocation = TryGetRegistryValue -Key "$($userUninstallRegistry)\$($vsCodeUserProductCode)" -Property $installLocationProperty
-        if ($codeUserInstallLocation)
-        {
+        if ($codeUserInstallLocation) {
             return $codeUserInstallLocation + $cmdPath
         }
 
         $codeMachineInstallLocation = TryGetRegistryValue -Key "$($machineUninstallRegistry)\$($vsCodeMachineProductCode)" -Property $installLocationProperty
-        if ($codeMachineInstallLocation)
-        {
+        if ($codeMachineInstallLocation) {
             return $codeMachineInstallLocation + $cmdPath
         }
     }
 
-    throw "VSCode is not installed."
+    throw 'VSCode is not installed.'
 }
 
-function Install-VSCodeExtension
-{
+function Install-VSCodeExtension {
     [CmdletBinding()]
     param (
         [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
@@ -67,14 +58,11 @@ function Install-VSCodeExtension
         [string]$Version
     )
 
-    begin
-    {
-        function Get-VSCodeExtensionInstallArgument
-        {
+    begin {
+        function Get-VSCodeExtensionInstallArgument {
             param([string]$Name, [string]$Version)
 
-            if ([string]::IsNullOrEmpty($Version))
-            {
+            if ([string]::IsNullOrEmpty($Version)) {
                 return $Name
             }
 
@@ -85,15 +73,13 @@ function Install-VSCodeExtension
         }
     }
 
-    process
-    {
+    process {
         $installArgument = Get-VSCodeExtensionInstallArgument @PSBoundParameters
         Invoke-VSCode -Command "--install-extension $installArgument"
     }
 }
 
-function Uninstall-VSCodeExtension
-{
+function Uninstall-VSCodeExtension {
     [CmdletBinding()]
     param (
         [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
@@ -103,25 +89,20 @@ function Uninstall-VSCodeExtension
     Invoke-VSCode -Command "--uninstall-extension $($this.Name)"
 }
 
-function Invoke-VSCode
-{
+function Invoke-VSCode {
     param (
         [Parameter(Mandatory = $true)]
         [string]$Command
     )
 
-    try
-    {
+    try {
         Invoke-Expression "& `"$VSCodeCLIPath`" $Command"
-    }
-    catch
-    {
+    } catch {
         throw ("Executing {0} with {$Command} failed." -f $VSCodeCLIPath)
     }
 }
 
-function TryGetRegistryValue
-{
+function TryGetRegistryValue {
     param (
         [Parameter(Mandatory = $true)]
         [string]$Key,
@@ -130,20 +111,14 @@ function TryGetRegistryValue
         [string]$Property
     )
 
-    if (Test-Path -Path $Key)
-    {
-        try
-        {
+    if (Test-Path -Path $Key) {
+        try {
             return (Get-ItemProperty -Path $Key | Select-Object -ExpandProperty $Property)
-        }
-        catch
-        {
+        } catch {
             Write-Verbose "Property `"$($Property)`" could not be found."
         }
-    }
-    else
-    {
-        Write-Verbose "Registry key does not exist."
+    } else {
+        Write-Verbose 'Registry key does not exist.'
     }
 }
 #endregion Functions
@@ -202,8 +177,7 @@ function TryGetRegistryValue
     This installs the latest version of the Visual Studio Code extension 'ms-python.python' for the Insiders version of Visual Studio Code
 #>
 [DSCResource()]
-class VSCodeExtension
-{
+class VSCodeExtension {
     [DscProperty(Key)]
     [string] $Name
 
@@ -218,33 +192,26 @@ class VSCodeExtension
 
     static [hashtable] $InstalledExtensions
 
-    VSCodeExtension()
-    {
+    VSCodeExtension() {
     }
 
-    VSCodeExtension([string]$Name, [string]$Version)
-    {
+    VSCodeExtension([string]$Name, [string]$Version) {
         $this.Name = $Name
         $this.Version = $Version
     }
 
-    [VSCodeExtension[]] Export([bool]$Insiders)
-    {
-        if ($Insiders)
-        {
+    [VSCodeExtension[]] Export([bool]$Insiders) {
+        if ($Insiders) {
             $script:VSCodeCLIPath = Get-VSCodeCLIPath -Insiders
-        }
-        else
-        {
+        } else {
             $script:VSCodeCLIPath = Get-VSCodeCLIPath
         }
 
-        $extensionList = (Invoke-VSCode -Command "--list-extensions --show-versions") -Split [Environment]::NewLine
+        $extensionList = (Invoke-VSCode -Command '--list-extensions --show-versions') -Split [Environment]::NewLine
 
         $results = [VSCodeExtension[]]::new($extensionList.length)
 
-        for ($i = 0; $i -lt $extensionList.length; $i++)
-        {
+        for ($i = 0; $i -lt $extensionList.length; $i++) {
             $extensionName, $extensionVersion = $extensionList[$i] -Split '@'
             $results[$i] = [VSCodeExtension]::new($extensionName, $extensionVersion)
         }
@@ -252,13 +219,11 @@ class VSCodeExtension
         return $results
     }
 
-    [VSCodeExtension] Get()
-    {
+    [VSCodeExtension] Get() {
         [VSCodeExtension]::GetInstalledExtensions($this.Insiders)
 
         $currentState = [VSCodeExtension]::InstalledExtensions[$this.Name]
-        if ($null -ne $currentState)
-        {
+        if ($null -ne $currentState) {
             return [VSCodeExtension]::InstalledExtensions[$this.Name]
         }
 
@@ -270,56 +235,44 @@ class VSCodeExtension
         }
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if ($currentState.Exist -ne $this.Exist)
-        {
+        if ($currentState.Exist -ne $this.Exist) {
             return $false
         }
 
-        if ($null -ne $this.Version -and $this.Version -ne $currentState.Version)
-        {
+        if ($null -ne $this.Version -and $this.Version -ne $currentState.Version) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if ($this.Test())
-        {
+    [void] Set() {
+        if ($this.Test()) {
             return
         }
 
-        if ($this.Exist)
-        {
+        if ($this.Exist) {
             $this.Install($false)
-        }
-        else
-        {
+        } else {
             $this.Uninstall($false)
         }
     }
 
     #region VSCodeExtension helper functions
-    static [void] GetInstalledExtensions([bool]$Insiders)
-    {
+    static [void] GetInstalledExtensions([bool]$Insiders) {
         [VSCodeExtension]::InstalledExtensions = @{}
 
         $extension = [VSCodeExtension]::new()
 
-        foreach ($extension in $extension.Export($Insiders))
-        {
+        foreach ($extension in $extension.Export($Insiders)) {
             [VSCodeExtension]::InstalledExtensions[$extension.Name] = $extension
         }
     }
 
-    [void] Install([bool] $preTest)
-    {
-        if ($preTest -and $this.Test())
-        {
+    [void] Install([bool] $preTest) {
+        if ($preTest -and $this.Test()) {
             return
         }
 
@@ -327,19 +280,16 @@ class VSCodeExtension
         [VSCodeExtension]::GetInstalledExtensions($this.Insiders)
     }
 
-    [void] Install()
-    {
+    [void] Install() {
         $this.Install($true)
     }
 
-    [void] Uninstall([bool] $preTest)
-    {
+    [void] Uninstall([bool] $preTest) {
         Uninstall-VSCodeExtension -Name $this.Name
         [VSCodeExtension]::GetInstalledExtensions($this.Insiders)
     }
 
-    [void] Uninstall()
-    {
+    [void] Uninstall() {
         $this.Uninstall($true)
     }
     #endregion VSCodeExtension helper functions
diff --git a/resources/Microsoft.Windows.Developer/Microsoft.Windows.Developer.psm1 b/resources/Microsoft.Windows.Developer/Microsoft.Windows.Developer.psm1
index a53bdcd5..40fd1ecd 100644
--- a/resources/Microsoft.Windows.Developer/Microsoft.Windows.Developer.psm1
+++ b/resources/Microsoft.Windows.Developer/Microsoft.Windows.Developer.psm1
@@ -1,39 +1,34 @@
 # Copyright (c) Microsoft Corporation. All rights reserved.
 # Licensed under the MIT License.
 
-$ErrorActionPreference = "Stop"
+$ErrorActionPreference = 'Stop'
 Set-StrictMode -Version Latest
 
-enum Ensure
-{
+enum Ensure {
     Absent
     Present
 }
 
-enum Alignment
-{
+enum Alignment {
     KeepCurrentValue
     Left
     Middle
 }
 
-enum ShowHideFeature
-{
+enum ShowHideFeature {
     KeepCurrentValue
     Hide
     Show
 }
 
-enum HideTaskBarLabelsBehavior
-{
+enum HideTaskBarLabelsBehavior {
     KeepCurrentValue
     Always
     WhenFull
     Never
 }
 
-enum SearchBoxMode
-{
+enum SearchBoxMode {
     KeepCurrentValue
     Hide
     ShowIconOnly
@@ -41,8 +36,7 @@ enum SearchBoxMode
     ShowIconAndLabel
 }
 
-enum AdminConsentPromptBehavior
-{
+enum AdminConsentPromptBehavior {
     KeepCurrentValue
     NoCredOrConsentRequired
     RequireCredOnSecureDesktop
@@ -54,8 +48,7 @@ enum AdminConsentPromptBehavior
 
 #region DSCResources
 [DSCResource()]
-class DeveloperMode
-{
+class DeveloperMode {
     # Key required. Do not set.
     [DscProperty(Key)]
     [string]$SID
@@ -66,8 +59,7 @@ class DeveloperMode
     [DscProperty(NotConfigurable)]
     [bool] $IsEnabled
 
-    [DeveloperMode] Get()
-    {
+    [DeveloperMode] Get() {
         $this.IsEnabled = IsDeveloperModeEnabled
 
         return @{
@@ -76,29 +68,22 @@ class DeveloperMode
         }
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if ($currentState.Ensure -eq [Ensure]::Present)
-        {
+        if ($currentState.Ensure -eq [Ensure]::Present) {
             return $currentState.IsEnabled
-        }
-        else
-        {
+        } else {
             return $currentState.IsEnabled -eq $false
         }
     }
 
-    [void] Set()
-    {
-        if (!$this.Test())
-        {
+    [void] Set() {
+        if (!$this.Test()) {
             $windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
             $windowsPrincipal = New-Object -TypeName 'System.Security.Principal.WindowsPrincipal' -ArgumentList @( $windowsIdentity )
 
-            if (-not $windowsPrincipal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
-            {
-                throw "Toggling Developer Mode requires this resource to be run as an Administrator."
+            if (-not $windowsPrincipal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) {
+                throw 'Toggling Developer Mode requires this resource to be run as an Administrator.'
             }
 
             $shouldEnable = $this.Ensure -eq [Ensure]::Present
@@ -109,8 +94,7 @@ class DeveloperMode
 }
 
 [DSCResource()]
-class OsVersion
-{
+class OsVersion {
     # Key required. Do not set.
     [DscProperty(Key)]
     [string]$SID
@@ -121,11 +105,9 @@ class OsVersion
     [DscProperty(NotConfigurable)]
     [string] $OsVersion
 
-    [OsVersion] Get()
-    {
+    [OsVersion] Get() {
         $parsedVersion = $null
-        if (![System.Version]::TryParse($this.MinVersion, [ref]$parsedVersion))
-        {
+        if (![System.Version]::TryParse($this.MinVersion, [ref]$parsedVersion)) {
             throw "'$($this.MinVersion)' is not a valid Version string."
         }
 
@@ -137,34 +119,28 @@ class OsVersion
         }
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
         return [System.Version]$currentState.OsVersion -ge [System.Version]$currentState.MinVersion
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         # This resource is only for asserting the os version requirement.
     }
 }
 
-if ([string]::IsNullOrEmpty($env:TestRegistryPath))
-{
+if ([string]::IsNullOrEmpty($env:TestRegistryPath)) {
     $global:ExplorerRegistryPath = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\'
     $global:PersonalizeRegistryPath = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize\'
     $global:SearchRegistryPath = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Search\'
     $global:UACRegistryPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Policies\System\'
     $global:RemoteDesktopRegistryPath = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server'
-}
-else
-{
+} else {
     $global:ExplorerRegistryPath = $global:PersonalizeRegistryPath = $global:SearchRegistryPath = $global:UACRegistryPath = $global:RemoteDesktopRegistryPath = $env:TestRegistryPath
 }
 
 [DSCResource()]
-class Taskbar
-{
+class Taskbar {
     [DscProperty()] [Alignment] $Alignment = [Alignment]::KeepCurrentValue
     [DscProperty()] [HideTaskBarLabelsBehavior] $HideLabelsMode = [HideTaskBarLabelsBehavior]::KeepCurrentValue
     [DscProperty()] [SearchBoxMode] $SearchboxMode = [SearchBoxMode]::KeepCurrentValue
@@ -181,31 +157,23 @@ class Taskbar
     hidden [string] $ShowTaskViewButton = 'ShowTaskViewButton'
     hidden [string] $TaskbarDa = 'TaskbarDa'
 
-    [Taskbar] Get()
-    {
+    [Taskbar] Get() {
         $currentState = [Taskbar]::new()
 
         # Alignment
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.TaskbarAl))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.TaskbarAl)) {
             $currentState.Alignment = [Alignment]::Middle
-        }
-        else
-        {
+        } else {
             $value = [int](Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.TaskbarAl)
             $currentState.Alignment = $value -eq 0 ? [Alignment]::Left : [Alignment]::Middle
         }
 
         # HideTaskBarLabels
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.TaskbarGlomLevel))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.TaskbarGlomLevel)) {
             $currentState.HideLabelsMode = [HideTaskBarLabelsBehavior]::Always
-        }
-        else
-        {
+        } else {
             $value = [int](Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.TaskbarGlomLevel)
-            $currentState.HideLabelsMode = switch ($value)
-            {
+            $currentState.HideLabelsMode = switch ($value) {
                 0 { [HideTaskBarLabelsBehavior]::Always }
                 1 { [HideTaskBarLabelsBehavior]::WhenFull }
                 2 { [HideTaskBarLabelsBehavior]::Never }
@@ -213,15 +181,11 @@ class Taskbar
         }
 
         # TaskbarSearchboxMode
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:SearchRegistryPath -Name $this.SearchboxTaskbarMode))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:SearchRegistryPath -Name $this.SearchboxTaskbarMode)) {
             $currentState.SearchboxMode = [SearchBoxMode]::SearchBox
-        }
-        else
-        {
+        } else {
             $value = [int](Get-ItemPropertyValue -Path $global:SearchRegistryPath -Name $this.SearchboxTaskbarMode)
-            $currentState.SearchboxMode = switch ($value)
-            {
+            $currentState.SearchboxMode = switch ($value) {
                 0 { [SearchBoxMode]::Hide }
                 1 { [SearchBoxMode]::ShowIconOnly }
                 2 { [SearchBoxMode]::SearchBox }
@@ -230,25 +194,19 @@ class Taskbar
         }
 
         # TaskViewButton
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.ShowTaskViewButton))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.ShowTaskViewButton)) {
             # Default behavior if registry key not found.
             $currentState.TaskViewButton = [ShowHideFeature]::Show
-        }
-        else
-        {
+        } else {
             $value = [int](Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.ShowTaskViewButton)
             $currentState.TaskViewButton = $value -eq 0 ? [ShowHideFeature]::Hide : [ShowHideFeature]::Show
         }
 
         # WidgetsButton
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.TaskbarDa))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.TaskbarDa)) {
             # Default behavior if registry key not found.
             $currentState.WidgetsButton = [ShowHideFeature]::Show
-        }
-        else
-        {
+        } else {
             $value = [int](Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.TaskbarDa)
             $currentState.WidgetsButton = $value -eq 0 ? [ShowHideFeature]::Hide : [ShowHideFeature]::Show
         }
@@ -256,50 +214,40 @@ class Taskbar
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
 
-        if ($this.Alignment -ne [Alignment]::KeepCurrentValue -and $currentState.Alignment -ne $this.Alignment)
-        {
+        if ($this.Alignment -ne [Alignment]::KeepCurrentValue -and $currentState.Alignment -ne $this.Alignment) {
             return $false
         }
 
-        if ($this.HideLabelsMode -ne [HideTaskBarLabelsBehavior]::KeepCurrentValue -and $currentState.HideLabelsMode -ne $this.HideLabelsMode)
-        {
+        if ($this.HideLabelsMode -ne [HideTaskBarLabelsBehavior]::KeepCurrentValue -and $currentState.HideLabelsMode -ne $this.HideLabelsMode) {
             return $false
         }
 
-        if ($this.SearchboxMode -ne [SearchBoxMode]::KeepCurrentValue -and $currentState.SearchboxMode -ne $this.SearchboxMode)
-        {
+        if ($this.SearchboxMode -ne [SearchBoxMode]::KeepCurrentValue -and $currentState.SearchboxMode -ne $this.SearchboxMode) {
             return $false
         }
 
-        if ($this.TaskViewButton -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.TaskViewButton -ne $this.TaskViewButton)
-        {
+        if ($this.TaskViewButton -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.TaskViewButton -ne $this.TaskViewButton) {
             return $false
         }
 
-        if ($this.WidgetsButton -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.WidgetsButton -ne $this.WidgetsButton)
-        {
+        if ($this.WidgetsButton -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.WidgetsButton -ne $this.WidgetsButton) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if ($this.Alignment -ne [Alignment]::KeepCurrentValue)
-        {
+    [void] Set() {
+        if ($this.Alignment -ne [Alignment]::KeepCurrentValue) {
             $desiredAlignment = $this.Alignment -eq [Alignment]::Left ? 0 : 1
             Set-ItemProperty -Path $global:ExplorerRegistryPath -Name $this.TaskbarAl -Value $desiredAlignment
         }
 
-        if ($this.HideLabelsMode -ne [HideTaskBarLabelsBehavior]::KeepCurrentValue)
-        {
-            $desiredHideLabelsBehavior = switch ($this.HideLabelsMode)
-            {
+        if ($this.HideLabelsMode -ne [HideTaskBarLabelsBehavior]::KeepCurrentValue) {
+            $desiredHideLabelsBehavior = switch ($this.HideLabelsMode) {
                 Always { 0 }
                 WhenFull { 1 }
                 Never { 2 }
@@ -308,10 +256,8 @@ class Taskbar
             Set-ItemProperty -Path $global:ExplorerRegistryPath -Name $this.TaskbarGlomLevel -Value $desiredHideLabelsBehavior
         }
 
-        if ($this.SearchboxMode -ne [SearchBoxMode]::KeepCurrentValue)
-        {
-            $desiredSearchboxMode = switch ([SearchBoxMode]($this.SearchboxMode))
-            {
+        if ($this.SearchboxMode -ne [SearchBoxMode]::KeepCurrentValue) {
+            $desiredSearchboxMode = switch ([SearchBoxMode]($this.SearchboxMode)) {
                 Hide { 0 }
                 ShowIconOnly { 1 }
                 SearchBox { 2 }
@@ -321,20 +267,17 @@ class Taskbar
             Set-ItemProperty -Path $global:SearchRegistryPath -Name $this.SearchboxTaskbarMode -Value $desiredSearchboxMode
         }
 
-        if ($this.TaskViewButton -ne [ShowHideFeature]::KeepCurrentValue)
-        {
+        if ($this.TaskViewButton -ne [ShowHideFeature]::KeepCurrentValue) {
             $desiredTaskViewButtonState = $this.TaskViewButton -eq [ShowHideFeature]::Show ? 1 : 0
             Set-ItemProperty -Path $global:ExplorerRegistryPath -Name $this.ShowTaskViewButton -Value $desiredTaskViewButtonState
         }
 
-        if ($this.WidgetsButton -ne [ShowHideFeature]::KeepCurrentValue)
-        {
+        if ($this.WidgetsButton -ne [ShowHideFeature]::KeepCurrentValue) {
             $desiredWidgetsButtonState = $this.WidgetsButton -eq [ShowHideFeature]::Show ? 1 : 0
             Set-ItemProperty -Path $global:ExplorerRegistryPath -Name $this.TaskBarDa -Value $desiredWidgetsButtonState
         }
 
-        if ($this.RestartExplorer)
-        {
+        if ($this.RestartExplorer) {
             # Explorer needs to be restarted to enact the changes for HideLabelsMode.
             taskkill /F /IM explorer.exe
             Start-Process explorer.exe
@@ -343,8 +286,7 @@ class Taskbar
 }
 
 [DSCResource()]
-class WindowsExplorer
-{
+class WindowsExplorer {
     [DscProperty()] [ShowHideFeature] $FileExtensions = [ShowHideFeature]::KeepCurrentValue
     [DscProperty()] [ShowHideFeature] $HiddenFiles = [ShowHideFeature]::KeepCurrentValue
     [DscProperty()] [ShowHideFeature] $ItemCheckBoxes = [ShowHideFeature]::KeepCurrentValue
@@ -357,39 +299,29 @@ class WindowsExplorer
     hidden [string] $Hidden = 'Hidden'
     hidden [string] $AutoCheckSelect = 'AutoCheckSelect'
 
-    [WindowsExplorer] Get()
-    {
+    [WindowsExplorer] Get() {
         $currentState = [WindowsExplorer]::new()
 
         # FileExtensions
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.HideFileExt))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.HideFileExt)) {
             $currentState.FileExtensions = [ShowHideFeature]::Show
-        }
-        else
-        {
+        } else {
             $value = Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.HideFileExt
             $currentState.FileExtensions = $value -eq 1 ? [ShowHideFeature]::Hide : [ShowHideFeature]::Show
         }
 
         # HiddenFiles
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.Hidden))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.Hidden)) {
             $currentState.HiddenFiles = [ShowHideFeature]::Show
-        }
-        else
-        {
+        } else {
             $value = Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.Hidden
             $currentState.HiddenFiles = $value -eq 1 ? [ShowHideFeature]::Show : [ShowHideFeature]::Hide
         }
 
         # ItemCheckboxes
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.AutoCheckSelect))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.AutoCheckSelect)) {
             $currentState.ItemCheckBoxes = [ShowHideFeature]::Show
-        }
-        else
-        {
+        } else {
             $value = Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.AutoCheckSelect
             $currentState.ItemCheckBoxes = $value -eq 1 ? [ShowHideFeature]::Show : [ShowHideFeature]::Hide
         }
@@ -398,50 +330,41 @@ class WindowsExplorer
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
 
-        if ($this.FileExtensions -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.FileExtensions -ne $this.FileExtensions)
-        {
+        if ($this.FileExtensions -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.FileExtensions -ne $this.FileExtensions) {
             return $false
         }
 
-        if ($this.HiddenFiles -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.HiddenFiles -ne $this.HiddenFiles)
-        {
+        if ($this.HiddenFiles -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.HiddenFiles -ne $this.HiddenFiles) {
             return $false
         }
 
-        if ($this.ItemCheckBoxes -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.ItemCheckBoxes -ne $this.ItemCheckBoxes)
-        {
+        if ($this.ItemCheckBoxes -ne [ShowHideFeature]::KeepCurrentValue -and $currentState.ItemCheckBoxes -ne $this.ItemCheckBoxes) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if ($this.FileExtensions -ne [ShowHideFeature]::KeepCurrentValue)
-        {
+    [void] Set() {
+        if ($this.FileExtensions -ne [ShowHideFeature]::KeepCurrentValue) {
             $desiredFileExtensions = $this.FileExtensions -eq [ShowHideFeature]::Show ? 0 : 1
             Set-ItemProperty -Path $global:ExplorerRegistryPath -Name $this.HideFileExt -Value $desiredFileExtensions
         }
 
-        if ($this.HiddenFiles -ne [ShowHideFeature]::KeepCurrentValue)
-        {
+        if ($this.HiddenFiles -ne [ShowHideFeature]::KeepCurrentValue) {
             $desiredHiddenFiles = $this.HiddenFiles -eq [ShowHideFeature]::Show ? 1 : 0
             Set-ItemProperty -Path $global:ExplorerRegistryPath -Name $this.Hidden -Value $desiredHiddenFiles
         }
 
-        if ($this.ItemCheckBoxes -ne [ShowHideFeature]::KeepCurrentValue)
-        {
+        if ($this.ItemCheckBoxes -ne [ShowHideFeature]::KeepCurrentValue) {
             $desiredItemCheckBoxes = $this.ItemCheckBoxes -eq [ShowHideFeature]::Show ? 1 : 0
             Set-ItemProperty -Path $global:ExplorerRegistryPath -Name $this.AutoCheckSelect -Value $desiredItemCheckBoxes
         }
 
-        if ($this.RestartExplorer)
-        {
+        if ($this.RestartExplorer) {
             # Explorer needs to be restarted to enact the changes.
             taskkill /F /IM explorer.exe
             Start-Process explorer.exe
@@ -450,8 +373,7 @@ class WindowsExplorer
 }
 
 [DSCResource()]
-class UserAccessControl
-{
+class UserAccessControl {
     # Key required. Do not set.
     [DscProperty(Key)]
     [string]$SID
@@ -463,19 +385,14 @@ class UserAccessControl
 
     # NOTE: 'EnableLUA' is another registry key that disables UAC prompts, but requires a reboot and opens everything in admin mode.
 
-    [UserAccessControl] Get()
-    {
+    [UserAccessControl] Get() {
         $currentState = [UserAccessControl]::new()
 
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:UACRegistryPath -Name $this.ConsentPromptBehaviorAdmin))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:UACRegistryPath -Name $this.ConsentPromptBehaviorAdmin)) {
             $currentState.AdminConsentPromptBehavior = [AdminConsentPromptBehavior]::RequireConsentForNonWindowsBinaries
-        }
-        else
-        {
+        } else {
             $value = [int](Get-ItemPropertyValue -Path $global:UACRegistryPath -Name $this.ConsentPromptBehaviorAdmin)
-            $currentState.AdminConsentPromptBehavior = switch ($value)
-            {
+            $currentState.AdminConsentPromptBehavior = switch ($value) {
                 0 { [AdminConsentPromptBehavior]::NoCredOrConsentRequired }
                 1 { [AdminConsentPromptBehavior]::RequireCredOnSecureDesktop }
                 2 { [AdminConsentPromptBehavior]::RequireConsentOnSecureDesktop }
@@ -488,24 +405,19 @@ class UserAccessControl
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
 
-        if ($this.AdminConsentPromptBehavior -ne [AdminConsentPromptBehavior]::KeepCurrentValue -and $currentState.AdminConsentPromptBehavior -ne $this.AdminConsentPromptBehavior)
-        {
+        if ($this.AdminConsentPromptBehavior -ne [AdminConsentPromptBehavior]::KeepCurrentValue -and $currentState.AdminConsentPromptBehavior -ne $this.AdminConsentPromptBehavior) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if ($this.AdminConsentPromptBehavior -ne [AdminConsentPromptBehavior]::KeepCurrentValue)
-        {
-            $desiredState = switch ([AdminConsentPromptBehavior]($this.AdminConsentPromptBehavior))
-            {
+    [void] Set() {
+        if ($this.AdminConsentPromptBehavior -ne [AdminConsentPromptBehavior]::KeepCurrentValue) {
+            $desiredState = switch ([AdminConsentPromptBehavior]($this.AdminConsentPromptBehavior)) {
                 NoCredOrConsentRequired { 0 }
                 RequireCredOnSecureDesktop { 1 }
                 RequireConsentOnSecureDesktop { 2 }
@@ -520,8 +432,7 @@ class UserAccessControl
 }
 
 [DSCResource()]
-class EnableDarkMode
-{
+class EnableDarkMode {
     # Key required. Do not set.
     [DscProperty(Key)]
     [string]$SID
@@ -535,18 +446,16 @@ class EnableDarkMode
     hidden [string] $AppsUseLightTheme = 'AppsUseLightTheme'
     hidden [string] $SystemUsesLightTheme = 'SystemUsesLightTheme'
 
-    [EnableDarkMode] Get()
-    {
+    [EnableDarkMode] Get() {
         $exists = (DoesRegistryKeyPropertyExist -Path $global:PersonalizeRegistryPath -Name $this.AppsUseLightTheme) -and (DoesRegistryKeyPropertyExist -Path $global:PersonalizeRegistryPath -Name $this.SystemUsesLightTheme)
-        if (-not($exists))
-        {
+        if (-not($exists)) {
             return @{
                 Ensure = [Ensure]::Absent
             }
         }
 
-        $appsUseLightModeValue = Get-ItemPropertyValue -Path $global:PersonalizeRegistryPath  -Name $this.AppsUseLightTheme
-        $systemUsesLightModeValue = Get-ItemPropertyValue -Path $global:PersonalizeRegistryPath  -Name $this.SystemUsesLightTheme
+        $appsUseLightModeValue = Get-ItemPropertyValue -Path $global:PersonalizeRegistryPath -Name $this.AppsUseLightTheme
+        $systemUsesLightModeValue = Get-ItemPropertyValue -Path $global:PersonalizeRegistryPath -Name $this.SystemUsesLightTheme
 
         $isDarkModeEnabled = if ($appsUseLightModeValue -eq 0 -and $systemUsesLightModeValue -eq 0) { [Ensure]::Present } else { [Ensure]::Absent }
 
@@ -555,20 +464,17 @@ class EnableDarkMode
         }
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
         return $currentState.Ensure -eq $this.Ensure
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         $value = if ($this.Ensure -eq [Ensure]::Present) { 0 } else { 1 }
         Set-ItemProperty -Path $global:PersonalizeRegistryPath -Name $this.AppsUseLightTheme -Value $value
         Set-ItemProperty -Path $global:PersonalizeRegistryPath -Name $this.SystemUsesLightTheme -Value $value
 
-        if ($this.RestartExplorer)
-        {
+        if ($this.RestartExplorer) {
             # Explorer needs to be restarted to enact the changes.
             Stop-Process -ProcessName Explorer
         }
@@ -576,8 +482,7 @@ class EnableDarkMode
 }
 
 [DSCResource()]
-class ShowSecondsInClock
-{
+class ShowSecondsInClock {
     # Key required. Do not set.
     [DscProperty(Key)]
     [string]$SID
@@ -587,39 +492,34 @@ class ShowSecondsInClock
 
     hidden [string] $ShowSecondsInSystemClock = 'ShowSecondsInSystemClock'
 
-    [ShowSecondsInClock] Get()
-    {
+    [ShowSecondsInClock] Get() {
         $exists = DoesRegistryKeyPropertyExist -Path $global:ExplorerRegistryPath -Name $this.ShowSecondsInSystemClock
-        if (-not($exists))
-        {
+        if (-not($exists)) {
             return @{
                 Ensure = [Ensure]::Absent
             }
         }
 
-        $registryValue = Get-ItemPropertyValue -Path $global:ExplorerRegistryPath  -Name $this.ShowSecondsInSystemClock
+        $registryValue = Get-ItemPropertyValue -Path $global:ExplorerRegistryPath -Name $this.ShowSecondsInSystemClock
 
         return @{
             Ensure = $registryValue ? [Ensure]::Present : [Ensure]::Absent
         }
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
         return $currentState.Ensure -eq $this.Ensure
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         $value = ($this.Ensure -eq [Ensure]::Present) ? 1 : 0
         Set-ItemProperty -Path $global:ExplorerRegistryPath -Name $this.ShowSecondsInSystemClock -Value $value
     }
 }
 
 [DSCResource()]
-class EnableRemoteDesktop
-{
+class EnableRemoteDesktop {
     # Key required. Do not set.
     [DscProperty(Key)]
     [string]$SID
@@ -629,17 +529,15 @@ class EnableRemoteDesktop
 
     hidden [string] $RemoteDesktopKey = 'fDenyTSConnections'
 
-    [EnableRemoteDesktop] Get()
-    {
+    [EnableRemoteDesktop] Get() {
         $exists = DoesRegistryKeyPropertyExist -Path $global:RemoteDesktopRegistryPath -Name $this.RemoteDesktopKey
-        if (-not($exists))
-        {
+        if (-not($exists)) {
             return @{
                 Ensure = [Ensure]::Absent
             }
         }
 
-        $registryValue = Get-ItemPropertyValue -Path $global:RemoteDesktopRegistryPath  -Name $this.RemoteDesktopKey
+        $registryValue = Get-ItemPropertyValue -Path $global:RemoteDesktopRegistryPath -Name $this.RemoteDesktopKey
 
         # Since the key is a 'deny' type key, 0 == enabled == Present // 1 == disabled == Absent
         return @{
@@ -647,14 +545,12 @@ class EnableRemoteDesktop
         }
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
         return $currentState.Ensure -eq $this.Ensure
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         # Since the key is a 'deny' type key, 0 == enabled == Present // 1 == disabled == Absent
         $value = ($this.Ensure -eq [Ensure]::Present) ? 0 : 1
         Set-ItemProperty -Path $global:RemoteDesktopRegistryPath -Name $this.RemoteDesktopKey -Value $value
@@ -666,29 +562,23 @@ class EnableRemoteDesktop
 $AppModelUnlockRegistryKeyPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock\'
 $DeveloperModePropertyName = 'AllowDevelopmentWithoutDevLicense'
 
-function IsDeveloperModeEnabled
-{
-    try
-    {
+function IsDeveloperModeEnabled {
+    try {
         $property = Get-ItemProperty -Path $AppModelUnlockRegistryKeyPath -Name $DeveloperModePropertyName
         return $property.AllowDevelopmentWithoutDevLicense -eq 1
-    }
-    catch
-    {
+    } catch {
         # This will throw an exception if the registry path or property does not exist.
-        return $false;
+        return $false
     }
 }
 
-function SetDeveloperMode
-{
+function SetDeveloperMode {
     param (
         [Parameter(Mandatory)]
         [bool]$Enable
     )
 
-    if (-not (Test-Path -Path $AppModelUnlockRegistryKeyPath))
-    {
+    if (-not (Test-Path -Path $AppModelUnlockRegistryKeyPath)) {
         New-Item -Path $AppModelUnlockRegistryKeyPath -Force | Out-Null
     }
 
@@ -696,8 +586,7 @@ function SetDeveloperMode
     New-ItemProperty -Path $AppModelUnlockRegistryKeyPath -Name $DeveloperModePropertyName -Value $developerModeValue -PropertyType DWORD -Force | Out-Null
 }
 
-function DoesRegistryKeyPropertyExist
-{
+function DoesRegistryKeyPropertyExist {
     param (
         [Parameter(Mandatory)]
         [string]$Path,
@@ -707,7 +596,7 @@ function DoesRegistryKeyPropertyExist
     )
 
     # Get-ItemProperty will return $null if the registry key property does not exist.
-    $itemProperty = Get-ItemProperty -Path $Path  -Name $Name -ErrorAction SilentlyContinue
+    $itemProperty = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue
     return $null -ne $itemProperty
 }
 
diff --git a/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psm1 b/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psm1
index e1fe78f2..1e98a833 100644
--- a/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psm1
+++ b/resources/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.psm1
@@ -1,11 +1,10 @@
 # Copyright (c) Microsoft Corporation. All rights reserved.
 # Licensed under the MIT License.
 
-$ErrorActionPreference = "Stop"
+$ErrorActionPreference = 'Stop'
 Set-StrictMode -Version Latest
 
-enum TextSize
-{
+enum TextSize {
     KeepCurrentValue
     Small
     Medium
@@ -13,8 +12,7 @@ enum TextSize
     ExtraLarge
 }
 
-enum MagnificationValue
-{
+enum MagnificationValue {
     KeepCurrentValue
     None
     Low
@@ -22,8 +20,7 @@ enum MagnificationValue
     High
 }
 
-enum PointerSize
-{
+enum PointerSize {
     KeepCurrentValue
     Normal
     Medium
@@ -31,8 +28,7 @@ enum PointerSize
     ExtraLarge
 }
 
-[Flags()] enum StickyKeysOptions
-{
+[Flags()] enum StickyKeysOptions {
     # https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-stickykeys
     None = 0x00000000 # 0
     Active = 0x00000001 # 1
@@ -46,8 +42,7 @@ enum PointerSize
     TwoKeysOff = 0x00000100 # 256
 }
 
-[Flags()] enum ToggleKeysOptions
-{
+[Flags()] enum ToggleKeysOptions {
     # https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-togglekeys
     None = 0x00000000 # 0
     Active = 0x00000001 # 1
@@ -58,8 +53,7 @@ enum PointerSize
     VisualIndicator = 0x00000020 # 32
 }
 
-[Flags()] enum FilterKeysOptions
-{
+[Flags()] enum FilterKeysOptions {
     # https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-filterkeys
     None = 0x00000000 # 0
     Active = 0x00000001 # 1
@@ -71,8 +65,7 @@ enum PointerSize
     AudibleFeedback = 0x00000040 # 64
 }
 
-if ([string]::IsNullOrEmpty($env:TestRegistryPath))
-{
+if ([string]::IsNullOrEmpty($env:TestRegistryPath)) {
     $global:AccessibilityRegistryPath = 'HKCU:\Software\Microsoft\Accessibility\'
     $global:MagnifierRegistryPath = 'HKCU:\Software\Microsoft\ScreenMagnifier\'
     $global:PointerRegistryPath = 'HKCU:\Control Panel\Cursors\'
@@ -85,42 +78,33 @@ if ([string]::IsNullOrEmpty($env:TestRegistryPath))
     $global:StickyKeysRegistryPath = 'HKCU:\Control Panel\Accessibility\StickyKeys'
     $global:ToggleKeysRegistryPath = 'HKCU:\Control Panel\Accessibility\ToggleKeys'
     $global:FilterKeysRegistryPath = 'HKCU:\Control Panel\Accessibility\Keyboard Response'
-}
-else
-{
+} else {
     $global:AccessibilityRegistryPath = $global:MagnifierRegistryPath = $global:PointerRegistryPath = $global:ControlPanelAccessibilityRegistryPath = $global:AudioRegistryPath = $global:PersonalizationRegistryPath = $global:NTAccessibilityRegistryPath = $global:CursorIndicatorAccessibilityRegistryPath = $global:ControlPanelDesktopRegistryPath = $global:StickyKeysRegistryPath = $global:ToggleKeysRegistryPath = $global:FilterKeysRegistryPath = $env:TestRegistryPath
 }
 
 [DSCResource()]
-class Text
-{
+class Text {
     [DscProperty(Key)] [TextSize] $Size = [TextSize]::KeepCurrentValue
     [DscProperty(NotConfigurable)] [int] $SizeValue
 
     hidden [string] $TextScaleFactor = 'TextScaleFactor'
 
-    [Text] Get()
-    {
+    [Text] Get() {
         $currentState = [Text]::new()
 
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:AccessibilityRegistryPath -Name $this.TextScaleFactor))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:AccessibilityRegistryPath -Name $this.TextScaleFactor)) {
             $currentState.Size = [TextSize]::Small
             $currentState.SizeValue = 96
-        }
-        else
-        {
+        } else {
             $currentState.SizeValue = [int](Get-ItemPropertyValue -Path $global:AccessibilityRegistryPath -Name $this.TextScaleFactor)
-            $currentSize = switch ($currentState.sizeValue)
-            {
+            $currentSize = switch ($currentState.sizeValue) {
                 96 { [TextSize]::Small }
                 120 { [TextSize]::Medium }
                 144 { [TextSize]::Large }
                 256 { [TextSize]::ExtraLarge }
             }
 
-            if ($null -ne $currentSize)
-            {
+            if ($null -ne $currentSize) {
                 $currentState.Size = $currentSize
             }
         }
@@ -128,23 +112,18 @@ class Text
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if ($this.Size -ne [TextSize]::KeepCurrentValue -and $this.Size -ne $currentState.Size)
-        {
+        if ($this.Size -ne [TextSize]::KeepCurrentValue -and $this.Size -ne $currentState.Size) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if ($this.Size -ne [TextSize]::KeepCurrentValue)
-        {
-            $desiredSize = switch ([TextSize]($this.Size))
-            {
+    [void] Set() {
+        if ($this.Size -ne [TextSize]::KeepCurrentValue) {
+            $desiredSize = switch ([TextSize]($this.Size)) {
                 Small { 96 }
                 Medium { 120 }
                 Large { 144 }
@@ -157,8 +136,7 @@ class Text
 }
 
 [DSCResource()]
-class Magnifier
-{
+class Magnifier {
     [DscProperty(Key)] [MagnificationValue] $Magnification = [MagnificationValue]::KeepCurrentValue
     [DscProperty(Mandatory)] [int] $ZoomIncrement = 25
     [DscProperty()] [bool] $StartMagnify = $false
@@ -168,20 +146,15 @@ class Magnifier
     hidden [string] $MagnificationProperty = 'Magnification'
     hidden [string] $ZoomIncrementProperty = 'ZoomIncrement'
 
-    [Magnifier] Get()
-    {
+    [Magnifier] Get() {
         $currentState = [Magnifier]::new()
 
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:MagnifierRegistryPath -Name $this.MagnificationProperty))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:MagnifierRegistryPath -Name $this.MagnificationProperty)) {
             $currentState.Magnification = [MagnificationValue]::None
             $currentState.MagnificationLevel = 0
-        }
-        else
-        {
+        } else {
             $currentState.MagnificationLevel = (Get-ItemProperty -Path $global:MagnifierRegistryPath -Name $this.MagnificationProperty).Magnification
-            $currentMagnification = switch ($currentState.MagnificationLevel)
-            {
+            $currentMagnification = switch ($currentState.MagnificationLevel) {
                 0 { [MagnificationValue]::None }
                 100 { [MagnificationValue]::Low }
                 200 { [MagnificationValue]::Medium }
@@ -192,13 +165,10 @@ class Magnifier
             $currentState.Magnification = $currentMagnification
         }
 
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:MagnifierRegistryPath -Name $this.ZoomIncrementProperty))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:MagnifierRegistryPath -Name $this.ZoomIncrementProperty)) {
             $currentState.ZoomIncrement = 25
             $currentState.ZoomIncrementLevel = 25
-        }
-        else
-        {
+        } else {
             $currentState.ZoomIncrementLevel = (Get-ItemProperty -Path $global:MagnifierRegistryPath -Name $this.ZoomIncrementProperty).ZoomIncrement
             $currentState.ZoomIncrement = $currentState.ZoomIncrementLevel
         }
@@ -206,37 +176,29 @@ class Magnifier
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if ($this.Magnification -ne [MagnificationValue]::KeepCurrentValue -and $this.Magnification -ne $currentState.Magnification)
-        {
+        if ($this.Magnification -ne [MagnificationValue]::KeepCurrentValue -and $this.Magnification -ne $currentState.Magnification) {
             return $false
         }
-        if ($this.ZoomIncrement -ne $currentState.ZoomIncrement)
-        {
+        if ($this.ZoomIncrement -ne $currentState.ZoomIncrement) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if ($this.Test())
-        {
+    [void] Set() {
+        if ($this.Test()) {
             return
         }
 
-        if (-not (Test-Path -Path $global:MagnifierRegistryPath))
-        {
+        if (-not (Test-Path -Path $global:MagnifierRegistryPath)) {
             New-Item -Path $global:MagnifierRegistryPath -Force | Out-Null
         }
 
-        if ($this.Magnification -ne [MagnificationValue]::KeepCurrentValue)
-        {
-            $desiredMagnification = switch ([MagnificationValue]($this.Magnification))
-            {
+        if ($this.Magnification -ne [MagnificationValue]::KeepCurrentValue) {
+            $desiredMagnification = switch ([MagnificationValue]($this.Magnification)) {
                 None { 0 }
                 Low { 100 }
                 Medium { 200 }
@@ -248,40 +210,32 @@ class Magnifier
 
         $currentState = $this.Get()
 
-        if ($this.ZoomIncrement -ne $currentState.ZoomIncrement)
-        {
+        if ($this.ZoomIncrement -ne $currentState.ZoomIncrement) {
             Set-ItemProperty -Path $global:MagnifierRegistryPath -Name $this.ZoomIncrementProperty -Value $this.ZoomIncrement -Type DWORD
         }
 
-        if (($this.StartMagnify) -and (($null -eq (Get-Process -Name 'Magnify' -ErrorAction SilentlyContinue))))
-        {
-            Start-Process "C:\Windows\System32\Magnify.exe"
+        if (($this.StartMagnify) -and (($null -eq (Get-Process -Name 'Magnify' -ErrorAction SilentlyContinue)))) {
+            Start-Process 'C:\Windows\System32\Magnify.exe'
         }
     }
 }
 
 [DSCResource()]
-class MousePointer
-{
+class MousePointer {
     [DscProperty(Key)] [PointerSize] $PointerSize = [PointerSize]::KeepCurrentValue
     [DscProperty(NotConfigurable)] [string] $PointerSizeValue
 
     hidden [string] $PointerSizeProperty = 'CursorBaseSize'
 
-    [MousePointer] Get()
-    {
+    [MousePointer] Get() {
         $currentState = [MousePointer]::new()
 
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:PointerRegistryPath -Name $this.PointerSizeProperty))
-        {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:PointerRegistryPath -Name $this.PointerSizeProperty)) {
             $currentState.PointerSize = [PointerSize]::Normal
             $currentState.PointerSizeValue = '32'
-        }
-        else
-        {
+        } else {
             $currentState.PointerSizeValue = (Get-ItemProperty -Path $global:PointerRegistryPath -Name $this.PointerSizeProperty).CursorBaseSize
-            $currentSize = switch ($currentState.PointerSizeValue)
-            {
+            $currentSize = switch ($currentState.PointerSizeValue) {
                 '32' { [PointerSize]::Normal }
                 '96' { [PointerSize]::Medium }
                 '144' { [PointerSize]::Large }
@@ -295,31 +249,25 @@ class MousePointer
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if ($this.PointerSize -ne [PointerSize]::KeepCurrentValue -and $this.PointerSize -ne $currentState.PointerSize)
-        {
+        if ($this.PointerSize -ne [PointerSize]::KeepCurrentValue -and $this.PointerSize -ne $currentState.PointerSize) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if ($this.PointerSize -ne [PointerSize]::KeepCurrentValue)
-        {
-            $desiredSize = switch ([PointerSize]($this.PointerSize))
-            {
+    [void] Set() {
+        if ($this.PointerSize -ne [PointerSize]::KeepCurrentValue) {
+            $desiredSize = switch ([PointerSize]($this.PointerSize)) {
                 Normal { '32' }
                 Medium { '96' }
                 Large { '144' }
                 ExtraLarge { '256' }
             }
 
-            if (-not (Test-Path -Path $global:PointerRegistryPath))
-            {
+            if (-not (Test-Path -Path $global:PointerRegistryPath)) {
                 New-Item -Path $global:PointerRegistryPath -Force | Out-Null
             }
 
@@ -329,8 +277,7 @@ class MousePointer
 }
 
 [DSCResource()]
-class VisualEffect
-{
+class VisualEffect {
     # Key required. Do not set.
     [DscProperty(Key)] [string] $SID
     [DscProperty()] [nullable[bool]] $AlwaysShowScrollbars
@@ -341,47 +288,34 @@ class VisualEffect
     static hidden [string] $TransparencySettingProperty = 'EnableTransparency'
     static hidden [string] $MessageDurationProperty = 'MessageDuration'
 
-    static [bool] GetShowDynamicScrollbarsStatus()
-    {
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::DynamicScrollbarsProperty)))
-        {
+    static [bool] GetShowDynamicScrollbarsStatus() {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::DynamicScrollbarsProperty))) {
             return $false
-        }
-        else
-        {
+        } else {
             $dynamicScrollbarsValue = (Get-ItemProperty -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::DynamicScrollbarsProperty)).DynamicScrollbars
             return ($dynamicScrollbarsValue -eq 0)
         }
     }
 
-    static [bool] GetTransparencyStatus()
-    {
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty)))
-        {
+    static [bool] GetTransparencyStatus() {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty))) {
             return $false
-        }
-        else
-        {
+        } else {
             $TransparencySetting = (Get-ItemProperty -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty)).EnableTransparency
             return ($TransparencySetting -eq 0)
         }
     }
 
-    static [int] GetMessageDuration()
-    {
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::MessageDurationProperty)))
-        {
+    static [int] GetMessageDuration() {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::MessageDurationProperty))) {
             return 5
-        }
-        else
-        {
+        } else {
             $MessageDurationSetting = (Get-ItemProperty -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::MessageDurationProperty)).MessageDuration
             return $MessageDurationSetting
         }
     }
 
-    [VisualEffect] Get()
-    {
+    [VisualEffect] Get() {
         $currentState = [VisualEffect]::new()
         $currentState.AlwaysShowScrollbars = [VisualEffect]::GetShowDynamicScrollbarsStatus()
         $currentState.TransparencyEffects = [VisualEffect]::GetTransparencyStatus()
@@ -390,54 +324,42 @@ class VisualEffect
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if (($null -ne $this.AlwaysShowScrollbars) -and ($this.AlwaysShowScrollbars -ne $currentState.AlwaysShowScrollbars))
-        {
+        if (($null -ne $this.AlwaysShowScrollbars) -and ($this.AlwaysShowScrollbars -ne $currentState.AlwaysShowScrollbars)) {
             return $false
         }
-        if (($null -ne $this.TransparencyEffects) -and ($this.TransparencyEffects -ne $currentState.TransparencyEffects))
-        {
+        if (($null -ne $this.TransparencyEffects) -and ($this.TransparencyEffects -ne $currentState.TransparencyEffects)) {
             return $false
         }
-        if ((0 -ne $this.MessageDurationInSeconds) -and ($this.MessageDurationInSeconds -ne $currentState.MessageDurationInSeconds))
-        {
+        if ((0 -ne $this.MessageDurationInSeconds) -and ($this.MessageDurationInSeconds -ne $currentState.MessageDurationInSeconds)) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if (-not $this.Test())
-        {
-            if (-not (Test-Path -Path $global:ControlPanelAccessibilityRegistryPath))
-            {
+    [void] Set() {
+        if (-not $this.Test()) {
+            if (-not (Test-Path -Path $global:ControlPanelAccessibilityRegistryPath)) {
                 New-Item -Path $global:ControlPanelAccessibilityRegistryPath -Force | Out-Null
             }
-            if ($null -ne $this.AlwaysShowScrollbars)
-            {
+            if ($null -ne $this.AlwaysShowScrollbars) {
                 $dynamicScrollbarValue = if ($this.AlwaysShowScrollbars) { 0 } else { 1 }
                 Set-ItemProperty -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::DynamicScrollbarsProperty) -Value $dynamicScrollbarValue
             }
-            if ($null -ne $this.TransparencyEffects)
-            {
+            if ($null -ne $this.TransparencyEffects) {
                 $transparencyValue = if ($this.TransparencyEffects) { 0 } else { 1 }
 
-                if (-not (DoesRegistryKeyPropertyExist -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty)))
-                {
+                if (-not (DoesRegistryKeyPropertyExist -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty))) {
                     New-ItemProperty -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty) -Value $transparencyValue -PropertyType DWord
                 }
                 Set-ItemProperty -Path $global:PersonalizationRegistryPath -Name ([VisualEffect]::TransparencySettingProperty) -Value $transparencyValue
             }
-            if (0 -ne $this.MessageDurationInSeconds)
-            {
+            if (0 -ne $this.MessageDurationInSeconds) {
                 $min = 5
                 $max = 300
-                if ($this.MessageDurationInSeconds -notin $min..$max)
-                {
+                if ($this.MessageDurationInSeconds -notin $min..$max) {
                     throw "MessageDurationInSeconds must be between $min and $max. Value $($this.MessageDurationInSeconds) was provided."
                 }
                 Set-ItemProperty -Path $global:ControlPanelAccessibilityRegistryPath -Name ([VisualEffect]::MessageDurationProperty) -Value $this.MessageDurationInSeconds
@@ -447,52 +369,41 @@ class VisualEffect
 }
 
 [DSCResource()]
-class Audio
-{
+class Audio {
     # Key required. Do not set.
     [DscProperty(Key)] [string] $SID
     [DscProperty()] [bool] $EnableMonoAudio = $false
 
     static hidden [string] $EnableMonoAudioProperty = 'AccessibilityMonoMixState'
 
-    static [bool] GetEnableMonoAudioStatus()
-    {
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:AudioRegistryPath -Name ([Audio]::EnableMonoAudioProperty)))
-        {
+    static [bool] GetEnableMonoAudioStatus() {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:AudioRegistryPath -Name ([Audio]::EnableMonoAudioProperty))) {
             return $false
-        }
-        else
-        {
+        } else {
             $AudioMonoSetting = (Get-ItemProperty -Path $global:AudioRegistryPath -Name ([Audio]::EnableMonoAudioProperty)).AccessibilityMonoMixState
             return ($AudioMonoSetting -eq 0)
         }
     }
 
-    [Audio] Get()
-    {
+    [Audio] Get() {
         $currentState = [Audio]::new()
         $currentState.EnableMonoAudio = [Audio]::GetEnableMonoAudioStatus()
 
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if ($this.EnableMonoAudio -ne $currentState.EnableMonoAudio)
-        {
+        if ($this.EnableMonoAudio -ne $currentState.EnableMonoAudio) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if (-not $this.Test())
-        {
-            if (-not (Test-Path -Path $global:AudioRegistryPath))
-            {
+    [void] Set() {
+        if (-not $this.Test()) {
+            if (-not (Test-Path -Path $global:AudioRegistryPath)) {
                 New-Item -Path $global:AudioRegistryPath -Force | Out-Null
             }
 
@@ -504,8 +415,7 @@ class Audio
 }
 
 [DSCResource()]
-class TextCursor
-{
+class TextCursor {
     # Key required. Do not set.
     [DscProperty(Key)] [string] $SID
     [DscProperty()] [nullable[bool]] $IndicatorStatus
@@ -520,64 +430,47 @@ class TextCursor
     static hidden [string] $ThicknessProperty = 'CaretWidth'
 
 
-    static [bool] GetIndicatorStatus()
-    {
+    static [bool] GetIndicatorStatus() {
         $indicatorStatusArgs = @{  Path = $global:NTAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorStatusProperty) }
-        if (-not(DoesRegistryKeyPropertyExist @indicatorStatusArgs))
-        {
+        if (-not(DoesRegistryKeyPropertyExist @indicatorStatusArgs)) {
             return $false
-        }
-        else
-        {
+        } else {
             $textCursorSetting = (Get-ItemProperty @indicatorStatusArgs).Configuration
             return ($textCursorSetting -eq ([TextCursor]::IndicatorStatusValue))
         }
     }
 
-    static [int] GetIndicatorSize()
-    {
+    static [int] GetIndicatorSize() {
         $indicatorSizeArgs = @{  Path = $global:CursorIndicatorAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorSizeProperty) }
-        if (-not(DoesRegistryKeyPropertyExist @indicatorSizeArgs))
-        {
+        if (-not(DoesRegistryKeyPropertyExist @indicatorSizeArgs)) {
             return 1
-        }
-        else
-        {
+        } else {
             $textCursorSetting = (Get-ItemProperty @indicatorSizeArgs).IndicatorType
             return $textCursorSetting
         }
     }
 
-    static [int] GetIndicatorColor()
-    {
+    static [int] GetIndicatorColor() {
         $indicatorColorArgs = @{  Path = $global:CursorIndicatorAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorColorProperty) }
-        if (-not(DoesRegistryKeyPropertyExist @indicatorColorArgs))
-        {
+        if (-not(DoesRegistryKeyPropertyExist @indicatorColorArgs)) {
             return $false
-        }
-        else
-        {
+        } else {
             $textCursorSetting = (Get-ItemProperty @indicatorColorArgs).IndicatorColor
             return $textCursorSetting
         }
     }
 
-    static [int] GetThickness()
-    {
+    static [int] GetThickness() {
         $thicknessArgs = @{ Path = $global:ControlPanelDesktopRegistryPath; Name = ([TextCursor]::ThicknessProperty); }
-        if (-not(DoesRegistryKeyPropertyExist @thicknessArgs))
-        {
+        if (-not(DoesRegistryKeyPropertyExist @thicknessArgs)) {
             return 1
-        }
-        else
-        {
+        } else {
             $textCursorSetting = (Get-ItemProperty @thicknessArgs).CaretWidth
             return $textCursorSetting
         }
     }
 
-    [TextCursor] Get()
-    {
+    [TextCursor] Get() {
         $currentState = [TextCursor]::new()
         $currentState.IndicatorStatus = [TextCursor]::GetIndicatorStatus()
         $currentState.IndicatorSize = [TextCursor]::GetIndicatorSize()
@@ -587,79 +480,63 @@ class TextCursor
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if (($null -ne $this.IndicatorStatus) -and ($this.IndicatorStatus -ne $currentState.IndicatorStatus))
-        {
+        if (($null -ne $this.IndicatorStatus) -and ($this.IndicatorStatus -ne $currentState.IndicatorStatus)) {
             return $false
         }
-        if ((0 -ne $this.IndicatorSize) -and ($this.IndicatorSize -ne $currentState.IndicatorSize))
-        {
+        if ((0 -ne $this.IndicatorSize) -and ($this.IndicatorSize -ne $currentState.IndicatorSize)) {
             return $false
         }
-        if ((0 -ne $this.IndicatorColor) -and ($this.IndicatorColor -ne $currentState.IndicatorColor))
-        {
+        if ((0 -ne $this.IndicatorColor) -and ($this.IndicatorColor -ne $currentState.IndicatorColor)) {
             return $false
         }
-        if ((0 -ne $this.Thickness) -and ($this.Thickness -ne $currentState.Thickness))
-        {
+        if ((0 -ne $this.Thickness) -and ($this.Thickness -ne $currentState.Thickness)) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
-        if (-not $this.Test())
-        {
-            if ($null -ne $this.IndicatorStatus)
-            {
+    [void] Set() {
+        if (-not $this.Test()) {
+            if ($null -ne $this.IndicatorStatus) {
                 $indicatorStatusArgs = @{ Path = $global:NTAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorStatusProperty); }
-                $textCursorValue = if ($this.IndicatorStatus) { ([TextCursor]::IndicatorStatusValue) } else { "" }
+                $textCursorValue = if ($this.IndicatorStatus) { ([TextCursor]::IndicatorStatusValue) } else { '' }
                 Set-ItemProperty @indicatorStatusArgs -Value $textCursorValue
             }
 
-            if (0 -ne $this.IndicatorSize)
-            {
+            if (0 -ne $this.IndicatorSize) {
                 $indicatorSizeArgs = @{  Path = $global:CursorIndicatorAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorSizeProperty) }
                 $min = 1
                 $max = 20
-                if ($this.IndicatorSize -notin $min..$max)
-                {
+                if ($this.IndicatorSize -notin $min..$max) {
                     throw "IndicatorSize must be between $min and $max. Value $($this.IndicatorSize) was provided."
                 }
-                if (-not (DoesRegistryKeyPropertyExist @indicatorSizeArgs))
-                {
+                if (-not (DoesRegistryKeyPropertyExist @indicatorSizeArgs)) {
                     New-ItemProperty @indicatorSizeArgs -Value $this.IndicatorSize -PropertyType DWord
                 }
                 Set-ItemProperty @indicatorSizeArgs -Value $this.IndicatorSize
             }
 
-            if (0 -ne $this.IndicatorColor)
-            {
+            if (0 -ne $this.IndicatorColor) {
                 $indicatorColorArgs = @{  Path = $global:CursorIndicatorAccessibilityRegistryPath; Name = ([TextCursor]::IndicatorColorProperty) }
                 $min = 1
                 $max = 99999999
-                if ($this.IndicatorColor -notin $min..$max)
-                {
+                if ($this.IndicatorColor -notin $min..$max) {
                     throw "IndicatorColor must be between $min and $max. Value $($this.IndicatorColor) was provided."
                 }
-                if (-not (DoesRegistryKeyPropertyExist @indicatorColorArgs))
-                {
+                if (-not (DoesRegistryKeyPropertyExist @indicatorColorArgs)) {
                     New-ItemProperty @indicatorColorArgs -Value $this.IndicatorColor -PropertyType DWord
                 }
                 Set-ItemProperty @indicatorColorArgs -Value $this.IndicatorColor
             }
 
-            if (0 -ne $this.Thickness)
-            {
+            if (0 -ne $this.Thickness) {
                 $thicknessArgs = @{ Path = $global:ControlPanelDesktopRegistryPath; Name = ([TextCursor]::ThicknessProperty); }
                 $min = 1
                 $max = 20
-                if ($this.Thickness -notin $min..$max)
-                {
+                if ($this.Thickness -notin $min..$max) {
                     throw "Thickness must be between $min and $max. Value $($this.Thickness) was provided."
                 }
                 Set-ItemProperty @thicknessArgs -Value $this.Thickness
@@ -669,8 +546,7 @@ class TextCursor
 }
 
 [DSCResource()]
-class StickyKeys
-{
+class StickyKeys {
     # Key required. Do not set.
     [DscProperty(Key)] [string] $SID
     [DscProperty()] [nullable[bool]] $Active
@@ -685,21 +561,16 @@ class StickyKeys
 
     static hidden [string] $SettingsProperty = 'Flags'
 
-    static [System.Enum] GetCurrentFlags()
-    {
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:StickyKeysRegistryPath -Name ([StickyKeys]::SettingsProperty)))
-        {
+    static [System.Enum] GetCurrentFlags() {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:StickyKeysRegistryPath -Name ([StickyKeys]::SettingsProperty))) {
             return [StickyKeysOptions]::None
-        }
-        else
-        {
+        } else {
             $StickyKeysFlags = [System.Enum]::Parse('StickyKeysOptions', (Get-ItemPropertyValue -Path $global:StickyKeysRegistryPath -Name ([StickyKeys]::SettingsProperty)))
             return $StickyKeysFlags
         }
     }
 
-    [StickyKeys] Get()
-    {
+    [StickyKeys] Get() {
         $currentFlags = [StickyKeys]::GetCurrentFlags()
 
         $currentState = [StickyKeys]::new()
@@ -716,108 +587,87 @@ class StickyKeys
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
 
-        if (($null -ne $this.Active) -and ($this.Active -ne $currentState.Active))
-        {
+        if (($null -ne $this.Active) -and ($this.Active -ne $currentState.Active)) {
             return $false
         }
 
-        if (($null -ne $this.Available) -and ($this.Available -ne $currentState.Available))
-        {
+        if (($null -ne $this.Available) -and ($this.Available -ne $currentState.Available)) {
             return $false
         }
 
-        if (($null -ne $this.HotkeyActive) -and ($this.HotkeyActive -ne $currentState.HotkeyActive))
-        {
+        if (($null -ne $this.HotkeyActive) -and ($this.HotkeyActive -ne $currentState.HotkeyActive)) {
             return $false
         }
 
-        if (($null -ne $this.ConfirmOnHotkeyActivation) -and ($this.ConfirmOnHotkeyActivation -ne $currentState.ConfirmOnHotkeyActivation))
-        {
+        if (($null -ne $this.ConfirmOnHotkeyActivation) -and ($this.ConfirmOnHotkeyActivation -ne $currentState.ConfirmOnHotkeyActivation)) {
             return $false
         }
 
-        if (($null -ne $this.HotkeySound) -and ($this.HotkeySound -ne $currentState.HotkeySound))
-        {
+        if (($null -ne $this.HotkeySound) -and ($this.HotkeySound -ne $currentState.HotkeySound)) {
             return $false
         }
 
-        if (($null -ne $this.VisualIndicator) -and ($this.VisualIndicator -ne $currentState.VisualIndicator))
-        {
+        if (($null -ne $this.VisualIndicator) -and ($this.VisualIndicator -ne $currentState.VisualIndicator)) {
             return $false
         }
 
-        if (($null -ne $this.AudibleFeedback) -and ($this.AudibleFeedback -ne $currentState.AudibleFeedback))
-        {
+        if (($null -ne $this.AudibleFeedback) -and ($this.AudibleFeedback -ne $currentState.AudibleFeedback)) {
             return $false
         }
 
-        if (($null -ne $this.TriState) -and ($this.TriState -ne $currentState.TriState))
-        {
+        if (($null -ne $this.TriState) -and ($this.TriState -ne $currentState.TriState)) {
             return $false
         }
 
-        if (($null -ne $this.TwoKeysOff) -and ($this.TwoKeysOff -ne $currentState.TwoKeysOff))
-        {
+        if (($null -ne $this.TwoKeysOff) -and ($this.TwoKeysOff -ne $currentState.TwoKeysOff)) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         # Only make changes if changes are needed
-        if (-not $this.Test())
-        {
+        if (-not $this.Test()) {
             # If a value isn't set in the DSC, it should remain unchanged, to do this we need the current flags
             $flags = [StickyKeys]::GetCurrentFlags()
 
-            if ($null -ne $this.Active)
-            {
+            if ($null -ne $this.Active) {
                 $flags = $this.Active ? $flags -bor [StickyKeysOptions]::Active : $flags -band (-bnot [StickyKeysOptions]::Active)
             }
 
-            if ($null -ne $this.Available)
-            {
+            if ($null -ne $this.Available) {
                 $flags = $this.Available ? $flags -bor [StickyKeysOptions]::Available : $flags -band (-bnot [StickyKeysOptions]::Available)
             }
 
-            if ($null -ne $this.HotkeyActive)
-            {
+            if ($null -ne $this.HotkeyActive) {
                 $flags = $this.HotkeyActive ? $flags -bor [StickyKeysOptions]::HotkeyActive : $flags -band (-bnot [StickyKeysOptions]::HotkeyActive)
             }
 
-            if ($null -ne $this.ConfirmOnHotkeyActivation)
-            {
+            if ($null -ne $this.ConfirmOnHotkeyActivation) {
                 $flags = $this.ConfirmOnHotkeyActivation ? $flags -bor [StickyKeysOptions]::ConfirmHotkey : $flags -band (-bnot [StickyKeysOptions]::ConfirmHotkey)
             }
 
-            if ($null -ne $this.HotkeySound)
-            {
+            if ($null -ne $this.HotkeySound) {
                 $flags = $this.HotkeySound ? $flags -bor [StickyKeysOptions]::HotkeySound : $flags -band (-bnot [StickyKeysOptions]::HotkeySound)
             }
 
-            if ($null -ne $this.VisualIndicator)
-            {
+            if ($null -ne $this.VisualIndicator) {
                 $flags = $this.VisualIndicator ? $flags -bor [StickyKeysOptions]::VisualIndicator : $flags -band (-bnot [StickyKeysOptions]::VisualIndicator)
             }
 
-            if ($null -ne $this.AudibleFeedback)
-            {
+            if ($null -ne $this.AudibleFeedback) {
                 $flags = $this.AudibleFeedback ? $flags -bor [StickyKeysOptions]::AudibleFeedback : $flags -band (-bnot [StickyKeysOptions]::AudibleFeedback)
             }
 
-            if ($null -ne $this.TriState)
-            {
+            if ($null -ne $this.TriState) {
                 $flags = $this.TriState ? $flags -bor [StickyKeysOptions]::TriState : $flags -band (-bnot [StickyKeysOptions]::TriState)
             }
 
-            if ($null -ne $this.TwoKeysOff)
-            {
+            if ($null -ne $this.TwoKeysOff) {
                 $flags = $this.TwoKeysOff ? $flags -bor [StickyKeysOptions]::TwoKeysOff : $flags -band (-bnot [StickyKeysOptions]::TwoKeysOff)
             }
 
@@ -828,8 +678,7 @@ class StickyKeys
 }
 
 [DSCResource()]
-class ToggleKeys
-{
+class ToggleKeys {
     # Key required. Do not set.
     [DscProperty(Key)] [string] $SID
     [DscProperty()] [nullable[bool]] $Active
@@ -841,21 +690,16 @@ class ToggleKeys
 
     static hidden [string] $SettingsProperty = 'Flags'
 
-    static [System.Enum] GetCurrentFlags()
-    {
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:ToggleKeysRegistryPath -Name ([ToggleKeys]::SettingsProperty)))
-        {
+    static [System.Enum] GetCurrentFlags() {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:ToggleKeysRegistryPath -Name ([ToggleKeys]::SettingsProperty))) {
             return [ToggleKeysOptions]::None
-        }
-        else
-        {
+        } else {
             $ToggleKeysFlags = [System.Enum]::Parse('ToggleKeysOptions', (Get-ItemPropertyValue -Path $global:StickyKeysRegistryPath -Name ([StickyKeys]::SettingsProperty)))
             return $ToggleKeysFlags
         }
     }
 
-    [ToggleKeys] Get()
-    {
+    [ToggleKeys] Get() {
         $currentFlags = [ToggleKeys]::GetCurrentFlags()
 
         $currentState = [ToggleKeys]::new()
@@ -869,78 +713,63 @@ class ToggleKeys
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
 
-        if (($null -ne $this.Active) -and ($this.Active -ne $currentState.Active))
-        {
+        if (($null -ne $this.Active) -and ($this.Active -ne $currentState.Active)) {
             return $false
         }
 
-        if (($null -ne $this.Available) -and ($this.Available -ne $currentState.Available))
-        {
+        if (($null -ne $this.Available) -and ($this.Available -ne $currentState.Available)) {
             return $false
         }
 
-        if (($null -ne $this.HotkeyActive) -and ($this.HotkeyActive -ne $currentState.HotkeyActive))
-        {
+        if (($null -ne $this.HotkeyActive) -and ($this.HotkeyActive -ne $currentState.HotkeyActive)) {
             return $false
         }
 
-        if (($null -ne $this.ConfirmOnHotkeyActivation) -and ($this.ConfirmOnHotkeyActivation -ne $currentState.ConfirmOnHotkeyActivation))
-        {
+        if (($null -ne $this.ConfirmOnHotkeyActivation) -and ($this.ConfirmOnHotkeyActivation -ne $currentState.ConfirmOnHotkeyActivation)) {
             return $false
         }
 
-        if (($null -ne $this.HotkeySound) -and ($this.HotkeySound -ne $currentState.HotkeySound))
-        {
+        if (($null -ne $this.HotkeySound) -and ($this.HotkeySound -ne $currentState.HotkeySound)) {
             return $false
         }
 
-        if (($null -ne $this.VisualIndicator) -and ($this.VisualIndicator -ne $currentState.VisualIndicator))
-        {
+        if (($null -ne $this.VisualIndicator) -and ($this.VisualIndicator -ne $currentState.VisualIndicator)) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         # Only make changes if changes are needed
-        if (-not $this.Test())
-        {
+        if (-not $this.Test()) {
             # If a value isn't set in the DSC, it should remain unchanged, to do this we need the current flags
             $flags = [ToggleKeys]::GetCurrentFlags()
 
-            if ($null -ne $this.Active)
-            {
+            if ($null -ne $this.Active) {
                 $flags = $this.Active ? $flags -bor [ToggleKeysOptions]::Active : $flags -band (-bnot [ToggleKeysOptions]::Active)
             }
 
-            if ($null -ne $this.Available)
-            {
+            if ($null -ne $this.Available) {
                 $flags = $this.Available ? $flags -bor [ToggleKeysOptions]::Available : $flags -band (-bnot [ToggleKeysOptions]::Available)
             }
 
-            if ($null -ne $this.HotkeyActive)
-            {
+            if ($null -ne $this.HotkeyActive) {
                 $flags = $this.HotkeyActive ? $flags -bor [ToggleKeysOptions]::HotkeyActive : $flags -band (-bnot [ToggleKeysOptions]::HotkeyActive)
             }
 
-            if ($null -ne $this.ConfirmOnHotkeyActivation)
-            {
+            if ($null -ne $this.ConfirmOnHotkeyActivation) {
                 $flags = $this.ConfirmOnHotkeyActivation ? $flags -bor [ToggleKeysOptions]::ConfirmHotkey : $flags -band (-bnot [ToggleKeysOptions]::ConfirmHotkey)
             }
 
-            if ($null -ne $this.HotkeySound)
-            {
+            if ($null -ne $this.HotkeySound) {
                 $flags = $this.HotkeySound ? $flags -bor [ToggleKeysOptions]::HotkeySound : $flags -band (-bnot [ToggleKeysOptions]::HotkeySound)
             }
 
-            if ($null -ne $this.VisualIndicator)
-            {
+            if ($null -ne $this.VisualIndicator) {
                 $flags = $this.VisualIndicator ? $flags -bor [ToggleKeysOptions]::VisualIndicator : $flags -band (-bnot [ToggleKeysOptions]::VisualIndicator)
             }
 
@@ -951,8 +780,7 @@ class ToggleKeys
 }
 
 [DSCResource()]
-class FilterKeys
-{
+class FilterKeys {
     # Key required. Do not set.
     [DscProperty(Key)] [string] $SID
     [DscProperty()] [nullable[bool]] $Active
@@ -965,21 +793,16 @@ class FilterKeys
 
     static hidden [string] $SettingsProperty = 'Flags'
 
-    static [System.Enum] GetCurrentFlags()
-    {
-        if (-not(DoesRegistryKeyPropertyExist -Path $global:FilterKeysRegistryPath -Name ([FilterKeys]::SettingsProperty)))
-        {
+    static [System.Enum] GetCurrentFlags() {
+        if (-not(DoesRegistryKeyPropertyExist -Path $global:FilterKeysRegistryPath -Name ([FilterKeys]::SettingsProperty))) {
             return [FilterKeysOptions]::None
-        }
-        else
-        {
+        } else {
             $FilterKeysFlags = [System.Enum]::Parse('FilterKeysOptions', (Get-ItemPropertyValue -Path $global:FilterKeysRegistryPath -Name ([FilterKeys]::SettingsProperty)))
             return $FilterKeysFlags
         }
     }
 
-    [FilterKeys] Get()
-    {
+    [FilterKeys] Get() {
         $currentFlags = [FilterKeys]::GetCurrentFlags()
 
         $currentState = [FilterKeys]::new()
@@ -994,88 +817,71 @@ class FilterKeys
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
 
-        if (($null -ne $this.Active) -and ($this.Active -ne $currentState.Active))
-        {
+        if (($null -ne $this.Active) -and ($this.Active -ne $currentState.Active)) {
             return $false
         }
 
-        if (($null -ne $this.Available) -and ($this.Available -ne $currentState.Available))
-        {
+        if (($null -ne $this.Available) -and ($this.Available -ne $currentState.Available)) {
             return $false
         }
 
-        if (($null -ne $this.HotkeyActive) -and ($this.HotkeyActive -ne $currentState.HotkeyActive))
-        {
+        if (($null -ne $this.HotkeyActive) -and ($this.HotkeyActive -ne $currentState.HotkeyActive)) {
             return $false
         }
 
-        if (($null -ne $this.ConfirmOnHotkeyActivation) -and ($this.ConfirmOnHotkeyActivation -ne $currentState.ConfirmOnHotkeyActivation))
-        {
+        if (($null -ne $this.ConfirmOnHotkeyActivation) -and ($this.ConfirmOnHotkeyActivation -ne $currentState.ConfirmOnHotkeyActivation)) {
             return $false
         }
 
-        if (($null -ne $this.HotkeySound) -and ($this.HotkeySound -ne $currentState.HotkeySound))
-        {
+        if (($null -ne $this.HotkeySound) -and ($this.HotkeySound -ne $currentState.HotkeySound)) {
             return $false
         }
 
-        if (($null -ne $this.VisualIndicator) -and ($this.VisualIndicator -ne $currentState.VisualIndicator))
-        {
+        if (($null -ne $this.VisualIndicator) -and ($this.VisualIndicator -ne $currentState.VisualIndicator)) {
             return $false
         }
 
-        if (($null -ne $this.AudibleFeedback) -and ($this.AudibleFeedback -ne $currentState.AudibleFeedback))
-        {
+        if (($null -ne $this.AudibleFeedback) -and ($this.AudibleFeedback -ne $currentState.AudibleFeedback)) {
             return $false
         }
 
         return $true
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         # Only make changes if changes are needed
-        if (-not $this.Test())
-        {
+        if (-not $this.Test()) {
             # If a value isn't set in the DSC, it should remain unchanged, to do this we need the current flags
             $flags = [FilterKeys]::GetCurrentFlags()
 
-            if ($null -ne $this.Active)
-            {
+            if ($null -ne $this.Active) {
                 $flags = $this.Active ? $flags -bor [FilterKeysOptions]::Active : $flags -band (-bnot [FilterKeysOptions]::Active)
             }
 
-            if ($null -ne $this.Available)
-            {
+            if ($null -ne $this.Available) {
                 $flags = $this.Available ? $flags -bor [FilterKeysOptions]::Available : $flags -band (-bnot [FilterKeysOptions]::Available)
             }
 
-            if ($null -ne $this.HotkeyActive)
-            {
+            if ($null -ne $this.HotkeyActive) {
                 $flags = $this.HotkeyActive ? $flags -bor [FilterKeysOptions]::HotkeyActive : $flags -band (-bnot [FilterKeysOptions]::HotkeyActive)
             }
 
-            if ($null -ne $this.ConfirmOnHotkeyActivation)
-            {
+            if ($null -ne $this.ConfirmOnHotkeyActivation) {
                 $flags = $this.ConfirmOnHotkeyActivation ? $flags -bor [FilterKeysOptions]::ConfirmHotkey : $flags -band (-bnot [FilterKeysOptions]::ConfirmHotkey)
             }
 
-            if ($null -ne $this.HotkeySound)
-            {
+            if ($null -ne $this.HotkeySound) {
                 $flags = $this.HotkeySound ? $flags -bor [FilterKeysOptions]::HotkeySound : $flags -band (-bnot [FilterKeysOptions]::HotkeySound)
             }
 
-            if ($null -ne $this.VisualIndicator)
-            {
+            if ($null -ne $this.VisualIndicator) {
                 $flags = $this.VisualIndicator ? $flags -bor [FilterKeysOptions]::VisualIndicator : $flags -band (-bnot [FilterKeysOptions]::VisualIndicator)
             }
 
-            if ($null -ne $this.AudibleFeedback)
-            {
+            if ($null -ne $this.AudibleFeedback) {
                 $flags = $this.AudibleFeedback ? $flags -bor [FilterKeysOptions]::AudibleFeedback : $flags -band (-bnot [FilterKeysOptions]::AudibleFeedback)
             }
 
@@ -1086,8 +892,7 @@ class FilterKeys
 }
 
 #region Functions
-function DoesRegistryKeyPropertyExist
-{
+function DoesRegistryKeyPropertyExist {
     param (
         [Parameter(Mandatory)]
         [string]$Path,
@@ -1097,7 +902,7 @@ function DoesRegistryKeyPropertyExist
     )
 
     # Get-ItemProperty will return $null if the registry key property does not exist.
-    $itemProperty = Get-ItemProperty -Path $Path  -Name $Name -ErrorAction SilentlyContinue
+    $itemProperty = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue
     return $null -ne $itemProperty
 }
 #endregion Functions
diff --git a/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psm1 b/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psm1
index 81ba3178..b5902d7d 100644
--- a/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psm1
+++ b/resources/Microsoft.WindowsSandbox.DSC/Microsoft.WindowsSandbox.DSC.psm1
@@ -1,22 +1,19 @@
 # Copyright (c) Microsoft Corporation. All rights reserved.
 # Licensed under the MIT License.
-enum Ensure
-{
+enum Ensure {
     Absent
     Present
 }
 
-$global:WindowsSandboxExePath = "C:\Windows\System32\WindowsSandbox.exe"
+$global:WindowsSandboxExePath = 'C:\Windows\System32\WindowsSandbox.exe'
 
-if (-not(Test-Path -Path $global:WindowsSandboxExePath))
-{
-    throw "Windows Sandbox feature is not enabled."
+if (-not(Test-Path -Path $global:WindowsSandboxExePath)) {
+    throw 'Windows Sandbox feature is not enabled.'
 }
 
 #region DSCResources
 [DSCResource()]
-class WindowsSandbox
-{
+class WindowsSandbox {
     [DscProperty(Key)]
     [Ensure]$Ensure = [Ensure]::Present
 
@@ -59,8 +56,7 @@ class WindowsSandbox
     [DscProperty()]
     [nullable[bool]]$VideoInput
 
-    [WindowsSandbox] Get()
-    {
+    [WindowsSandbox] Get() {
         $currentState = [WindowsSandbox]::new()
         $currentState.WsbFilePath = $this.WsbFilePath
         $windowsSandboxProcess = Get-Process WindowsSandbox -ErrorAction SilentlyContinue
@@ -69,36 +65,29 @@ class WindowsSandbox
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
         return $currentState.Ensure -eq $this.Ensure
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         # If ensure absent, stop the current Windows Sandbox process.
-        if ($this.Ensure -eq [Ensure]::Absent)
-        {
+        if ($this.Ensure -eq [Ensure]::Absent) {
             Stop-Process -Name 'WindowsSandboxClient' -Force
             return
         }
 
         # Load the existing WSB file if it exists or create a new one.
-        if ($this.WsbFilePath)
-        {
-            if (-not(Test-Path -Path $this.WsbFilePath))
-            {
-                throw "The provided WSB file does not exist."
+        if ($this.WsbFilePath) {
+            if (-not(Test-Path -Path $this.WsbFilePath)) {
+                throw 'The provided WSB file does not exist.'
             }
 
             $xml = [xml](Get-Content -Path $this.WsbFilePath)
             $root = $xml.Configuration
-        }
-        else
-        {
+        } else {
             $xml = New-Object -TypeName System.Xml.XmlDocument
-            $root = $xml.CreateElement("Configuration")
+            $root = $xml.CreateElement('Configuration')
             $xml.AppendChild($root)
         }
 
@@ -126,141 +115,118 @@ class WindowsSandbox
         #>
 
         # Override existing configurations if exists.
-        if ($this.HostFolder)
-        {
-            if (-not(Test-Path -Path $this.HostFolder))
-            {
-                throw "Specified host folder path does not exist."
+        if ($this.HostFolder) {
+            if (-not(Test-Path -Path $this.HostFolder)) {
+                throw 'Specified host folder path does not exist.'
             }
 
             # Remove existing mapped folder
-            if ($root.MappedFolders)
-            {
-                $existingMappedFolders = $root.SelectSingleNode("MappedFolders")
+            if ($root.MappedFolders) {
+                $existingMappedFolders = $root.SelectSingleNode('MappedFolders')
                 $root.RemoveChild($existingMappedFolders)
             }
 
             # Create Mapped Folders element
-            $mappedFoldersElement = $xml.CreateElement("MappedFolders")
-            $mappedFolderElement = $xml.CreateElement("MappedFolder")
-            $hostFolderElement = $xml.CreateElement("HostFolder")
+            $mappedFoldersElement = $xml.CreateElement('MappedFolders')
+            $mappedFolderElement = $xml.CreateElement('MappedFolder')
+            $hostFolderElement = $xml.CreateElement('HostFolder')
             $mappedFolderElement.AppendChild($hostFolderElement)
             $mappedFoldersElement.AppendChild($mappedFolderElement)
             $root.AppendChild($mappedFoldersElement)
             $root.MappedFolders.MappedFolder.HostFolder = $this.HostFolder
 
-            if ($this.SandboxFolder)
-            {
-                $sandboxFolderElement = $xml.CreateElement("SandboxFolder")
+            if ($this.SandboxFolder) {
+                $sandboxFolderElement = $xml.CreateElement('SandboxFolder')
                 $mappedFolderElement.AppendChild($sandboxFolderElement)
                 $root.MappedFolders.MappedFolder.SandboxFolder = $this.SandboxFolder
             }
 
-            if ($this.ReadOnly)
-            {
-                $readOnlyElement = $xml.CreateElement("ReadOnly")
+            if ($this.ReadOnly) {
+                $readOnlyElement = $xml.CreateElement('ReadOnly')
                 $mappedFolderElement.AppendChild($readOnlyElement)
                 $root.MappedFolders.MappedFolder.ReadOnly = 'true'
             }
         }
 
-        if ($this.LogonCommand)
-        {
-            if ($root.LogonCommand)
-            {
+        if ($this.LogonCommand) {
+            if ($root.LogonCommand) {
                 $existingLogonCommand = $root.SelectSingleNode('LogonCommand')
                 $root.RemoveChild($existingLogonCommand)
             }
 
             $logonCommandElement = $xml.CreateElement('LogonCommand')
-            $commandElement = $xml.CreateElement("Command")
+            $commandElement = $xml.CreateElement('Command')
             $logonCommandElement.AppendChild($commandElement)
             $root.AppendChild($logonCommandElement)
             $root.LogonCommand.Command = $this.LogonCommand
         }
 
-        if ($this.MemoryInMB)
-        {
-            if ($null -eq $root.MemoryInMB)
-            {
-                $memoryElement = $xml.CreateElement("MemoryInMB")
+        if ($this.MemoryInMB) {
+            if ($null -eq $root.MemoryInMB) {
+                $memoryElement = $xml.CreateElement('MemoryInMB')
                 $root.AppendChild($memoryElement)
             }
 
             $root.MemoryInMB = $this.MemoryInMB
         }
 
-        if ($null -ne $this.vGPU)
-        {
-            if ($null -eq $root.vGPU)
-            {
-                $vGPUElement = $xml.CreateElement("vGPU")
+        if ($null -ne $this.vGPU) {
+            if ($null -eq $root.vGPU) {
+                $vGPUElement = $xml.CreateElement('vGPU')
                 $root.AppendChild($vGPUElement)
             }
 
             $root.vGPU = ConvertBoolToEnableDisable($this.vGPU)
         }
 
-        if ($null -ne $this.AudioInput)
-        {
-            if ($null -eq $root.AudioInput)
-            {
-                $audioInputElement = $xml.CreateElement("AudioInput")
+        if ($null -ne $this.AudioInput) {
+            if ($null -eq $root.AudioInput) {
+                $audioInputElement = $xml.CreateElement('AudioInput')
                 $root.AppendChild($audioInputElement)
             }
 
             $root.AudioInput = ConvertBoolToEnableDisable($this.AudioInput)
         }
 
-        if ($null -ne $this.ClipboardRedirection)
-        {
-            if ($null -eq $root.ClipboardRedirection)
-            {
-                $clipboardRedirectionElement = $xml.CreateElement("ClipboardRedirection")
+        if ($null -ne $this.ClipboardRedirection) {
+            if ($null -eq $root.ClipboardRedirection) {
+                $clipboardRedirectionElement = $xml.CreateElement('ClipboardRedirection')
                 $root.AppendChild($clipboardRedirectionElement)
             }
 
             $root.ClipboardRedirection = ConvertBoolToEnableDisable($this.ClipboardRedirection)
         }
 
-        if ($null -ne $this.Networking)
-        {
-            if ($null -eq $root.Networking)
-            {
-                $networkingElement = $xml.CreateElement("Networking")
+        if ($null -ne $this.Networking) {
+            if ($null -eq $root.Networking) {
+                $networkingElement = $xml.CreateElement('Networking')
                 $root.AppendChild($networkingElement)
             }
 
             $root.Networking = ConvertBoolToEnableDisable($this.Networking)
         }
 
-        if ($null -ne $this.PrinterRedirection)
-        {
-            if ($null -eq $root.PrinterRedirection)
-            {
-                $printerRedirectionElement = $xml.CreateElement("PrinterRedirection")
+        if ($null -ne $this.PrinterRedirection) {
+            if ($null -eq $root.PrinterRedirection) {
+                $printerRedirectionElement = $xml.CreateElement('PrinterRedirection')
                 $root.AppendChild($printerRedirectionElement)
             }
 
             $root.PrinterRedirection = ConvertBoolToEnableDisable($this.PrinterRedirection)
         }
 
-        if ($null -ne $this.ProtectedClient)
-        {
-            if ($null -eq $root.ProtectedClient)
-            {
-                $protectedClientElement = $xml.CreateElement("ProtectedClient")
+        if ($null -ne $this.ProtectedClient) {
+            if ($null -eq $root.ProtectedClient) {
+                $protectedClientElement = $xml.CreateElement('ProtectedClient')
                 $root.AppendChild($protectedClientElement)
             }
 
             $root.ProtectedClient = ConvertBoolToEnableDisable($this.ProtectedClient)
         }
 
-        if ($null -ne $this.VideoInput)
-        {
-            if ($null -eq $root.VideoInput)
-            {
-                $videoInputElement = $xml.CreateElement("VideoInput")
+        if ($null -ne $this.VideoInput) {
+            if ($null -eq $root.VideoInput) {
+                $videoInputElement = $xml.CreateElement('VideoInput')
                 $root.AppendChild($videoInputElement)
             }
 
@@ -269,8 +235,7 @@ class WindowsSandbox
 
         # Export WSB file and run.
         $windowsSandboxDscTempDir = "$($env:Temp)\WindowsSandboxDsc"
-        if (-not (Test-Path -Path $windowsSandboxDscTempDir))
-        {
+        if (-not (Test-Path -Path $windowsSandboxDscTempDir)) {
             New-Item -ItemType Directory -Path $windowsSandboxDscTempDir
         }
 
@@ -285,8 +250,7 @@ class WindowsSandbox
 
 #region Functions
 
-function ConvertBoolToEnableDisable()
-{
+function ConvertBoolToEnableDisable() {
     param (
         [Parameter()]
         [bool]$value
diff --git a/resources/NpmDsc/NpmDsc.psm1 b/resources/NpmDsc/NpmDsc.psm1
index 0f6858d7..291da606 100644
--- a/resources/NpmDsc/NpmDsc.psm1
+++ b/resources/NpmDsc/NpmDsc.psm1
@@ -1,7 +1,6 @@
 using namespace System.Collections.Generic
 #Region '.\Enum\Ensure.ps1' 0
-enum Ensure
-{
+enum Ensure {
     Absent
     Present
 }
@@ -9,8 +8,7 @@ enum Ensure
 #Region '.\Classes\DSCResources\NpmInstall.ps1' 0
 #using namespace System.Collections.Generic
 [DSCResource()]
-class NpmInstall
-{
+class NpmInstall {
     [DscProperty()]
     [Ensure]$Ensure = [Ensure]::Present
 
@@ -26,12 +24,10 @@ class NpmInstall
     [DscProperty()]
     [string]$Arguments
 
-    [NpmInstall] Get()
-    {
+    [NpmInstall] Get() {
         Assert-Npm
 
-        if (-not([string]::IsNullOrEmpty($this.PackageDirectory)))
-        {
+        if (-not([string]::IsNullOrEmpty($this.PackageDirectory))) {
             Set-PackageDirectory -PackageDirectory $this.PackageDirectory
         }
 
@@ -39,11 +35,9 @@ class NpmInstall
         $currentState.Ensure = [Ensure]::Present
 
         $errorResult = Get-InstalledNpmPackages -Global $this.Global | ConvertFrom-Json | Select-Object -ExpandProperty error
-        if ($errorResult.PSobject.Properties.Name -contains 'code')
-        {
+        if ($errorResult.PSobject.Properties.Name -contains 'code') {
             $errorCode = $errorResult | Select-Object -ExpandProperty code
-            if ($errorCode -eq 'ELSPROBLEMS')
-            {
+            if ($errorCode -eq 'ELSPROBLEMS') {
                 $currentState.Ensure = [Ensure]::Absent
             }
         }
@@ -54,29 +48,21 @@ class NpmInstall
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
         return $this.Ensure -eq $currentState.Ensure
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         $inDesiredState = $this.Test()
-        if ($this.Ensure -eq [Ensure]::Present)
-        {
-            if (-not $inDesiredState)
-            {
+        if ($this.Ensure -eq [Ensure]::Present) {
+            if (-not $inDesiredState) {
                 Install-NpmPackage -Arguments $this.Arguments -Global $this.Global
             }
-        }
-        else
-        {
-            if (-not $inDesiredState)
-            {
+        } else {
+            if (-not $inDesiredState) {
                 $nodeModulesFolder = 'node_modules'
-                if (Test-Path -Path $nodeModulesFolder)
-                {
+                if (Test-Path -Path $nodeModulesFolder) {
                     Remove-Item $nodeModulesFolder -Recurse
                 }
             }
@@ -86,8 +72,7 @@ class NpmInstall
 #EndRegion '.\Classes\DSCResources\NpmInstall.ps1' 77
 #Region '.\Classes\DSCResources\NpmPackage.ps1' 0
 [DSCResource()]
-class NpmPackage
-{
+class NpmPackage {
     [DscProperty()]
     [Ensure]$Ensure = [Ensure]::Present
 
@@ -106,12 +91,10 @@ class NpmPackage
     [DscProperty()]
     [string]$Arguments
 
-    [NpmPackage] Get()
-    {
+    [NpmPackage] Get() {
         Assert-Npm
 
-        if (-not([string]::IsNullOrEmpty($this.PackageDirectory)))
-        {
+        if (-not([string]::IsNullOrEmpty($this.PackageDirectory))) {
             Set-PackageDirectory -PackageDirectory $this.PackageDirectory
         }
 
@@ -119,21 +102,16 @@ class NpmPackage
         $currentState.Ensure = [Ensure]::Absent
 
         $installedPackages = Get-InstalledNpmPackages -Global $this.Global | ConvertFrom-Json | Select-Object -ExpandProperty dependencies
-        if ($installedPackages.PSobject.Properties.Name -contains $this.Name)
-        {
+        if ($installedPackages.PSobject.Properties.Name -contains $this.Name) {
             $installedPackage = $installedPackages | Select-Object -ExpandProperty $this.Name
 
             # Check if version matches if specified.
-            if (-not([string]::IsNullOrEmpty($this.Version)))
-            {
+            if (-not([string]::IsNullOrEmpty($this.Version))) {
                 $installedVersion = $installedPackage.Version
-                if ([System.Version]$installedVersion -eq [System.Version]$this.Version)
-                {
+                if ([System.Version]$installedVersion -eq [System.Version]$this.Version) {
                     $currentState.Ensure = [Ensure]::Present
                 }
-            }
-            else
-            {
+            } else {
                 $currentState.Ensure = [Ensure]::Present
             }
         }
@@ -146,26 +124,19 @@ class NpmPackage
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
         return $this.Ensure -eq $currentState.Ensure
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         $inDesiredState = $this.Test()
-        if ($this.Ensure -eq [Ensure]::Present)
-        {
-            if (-not $inDesiredState)
-            {
+        if ($this.Ensure -eq [Ensure]::Present) {
+            if (-not $inDesiredState) {
                 Install-NpmPackage -PackageName $this.Name -Arguments $this.Arguments -Global $this.Global
             }
-        }
-        else
-        {
-            if (-not $inDesiredState)
-            {
+        } else {
+            if (-not $inDesiredState) {
                 Uninstall-NpmPackage -PackageName $this.Name -Arguments $this.Arguments -Global $this.Global
             }
         }
@@ -173,24 +144,19 @@ class NpmPackage
 }
 #EndRegion '.\Classes\DSCResources\NpmPackage.ps1' 87
 #Region '.\Private\Assert-Npm.ps1' 0
-function Assert-Npm
-{
+function Assert-Npm {
     # Refresh session $path value before invoking 'npm'
-    $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
-    try
-    {
+    $env:Path = [System.Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [System.Environment]::GetEnvironmentVariable('Path', 'User')
+    try {
         Invoke-Npm -Command 'help'
         return
-    }
-    catch
-    {
-        throw "NodeJS is not installed"
+    } catch {
+        throw 'NodeJS is not installed'
     }
 }
 #EndRegion '.\Private\Assert-Npm.ps1' 15
 #Region '.\Private\Invoke-Npm.ps1' 0
-function Invoke-Npm
-{
+function Invoke-Npm {
     param (
         [Parameter(Mandatory = $true)]
         [string]$Command
@@ -200,26 +166,21 @@ function Invoke-Npm
 }
 #EndRegion '.\Private\Invoke-Npm.ps1' 10
 #Region '.\Private\Set-PackageDirectory.ps1' 0
-function Set-PackageDirectory
-{
+function Set-PackageDirectory {
     param (
         [Parameter(Mandatory = $true)]
         [string]$PackageDirectory
     )
 
-    if (Test-Path -Path $PackageDirectory -PathType Container)
-    {
+    if (Test-Path -Path $PackageDirectory -PathType Container) {
         Set-Location -Path $PackageDirectory
-    }
-    else
-    {
+    } else {
         throw "$($PackageDirectory) does not point to a valid directory."
     }
 }
 #EndRegion '.\Private\Set-PackageDirectory.ps1' 17
 #Region '.\Public\Get-InstalledNpmPackages.ps1' 0
-function Get-InstalledNpmPackages
-{
+function Get-InstalledNpmPackages {
     param (
         [Parameter()]
         [bool]$Global
@@ -229,17 +190,15 @@ function Get-InstalledNpmPackages
     $command.Add('list')
     $command.Add('--json')
 
-    if ($Global)
-    {
+    if ($Global) {
         $command.Add('-g')
     }
 
-    return Invoke-Npm -command $command
+    return Invoke-Npm -Command $command
 }
 #EndRegion '.\Public\Get-InstalledNpmPackages.ps1' 19
 #Region '.\Public\Install-NpmPackage.ps1' 0
-function Install-NpmPackage
-{
+function Install-NpmPackage {
     param (
         [Parameter()]
         [string]$PackageName,
@@ -252,22 +211,20 @@ function Install-NpmPackage
     )
 
     $command = [List[string]]::new()
-    $command.Add("install")
+    $command.Add('install')
     $command.Add($PackageName)
 
-    if ($Global)
-    {
-        $command.Add("-g")
+    if ($Global) {
+        $command.Add('-g')
     }
 
     $command.Add($Arguments)
 
-    return Invoke-Npm -command $command
+    return Invoke-Npm -Command $command
 }
 #EndRegion '.\Public\Install-NpmPackage.ps1' 27
 #Region '.\Public\Uninstall-NpmPackage.ps1' 0
-function Uninstall-NpmPackage
-{
+function Uninstall-NpmPackage {
     param (
         [Parameter(Mandatory = $true)]
         [string]$PackageName,
@@ -280,16 +237,15 @@ function Uninstall-NpmPackage
     )
 
     $command = [List[string]]::new()
-    $command.Add("uninstall")
+    $command.Add('uninstall')
     $command.Add($PackageName)
 
-    if ($Global)
-    {
+    if ($Global) {
         $command.Add('-g')
     }
 
     $command.Add($Arguments)
 
-    return Invoke-Npm -command $command
+    return Invoke-Npm -Command $command
 }
 #EndRegion '.\Public\Uninstall-NpmPackage.ps1' 27
diff --git a/resources/PythonPip3Dsc/PythonPip3Dsc.psm1 b/resources/PythonPip3Dsc/PythonPip3Dsc.psm1
index 9f9f6bf4..428fe494 100644
--- a/resources/PythonPip3Dsc/PythonPip3Dsc.psm1
+++ b/resources/PythonPip3Dsc/PythonPip3Dsc.psm1
@@ -4,97 +4,74 @@
 using namespace System.Collections.Generic
 
 #region Functions
-function Get-Pip3Path
-{
-    if ($IsWindows)
-    {
+function Get-Pip3Path {
+    if ($IsWindows) {
         # Note: When installing 64-bit version, the registry key: HKLM:\SOFTWARE\Wow6432Node\Python\PythonCore\*\InstallPath was empty.
-        $userUninstallRegistry = "HKCU:\SOFTWARE\Python\PythonCore\*\InstallPath"
-        $machineUninstallRegistry = "HKLM:\SOFTWARE\Python\PythonCore\*\InstallPath"
-        $installLocationProperty = "ExecutablePath"
+        $userUninstallRegistry = 'HKCU:\SOFTWARE\Python\PythonCore\*\InstallPath'
+        $machineUninstallRegistry = 'HKLM:\SOFTWARE\Python\PythonCore\*\InstallPath'
+        $installLocationProperty = 'ExecutablePath'
 
         $pipExe = TryGetRegistryValue -Key $userUninstallRegistry -Property $installLocationProperty
-        if ($null -ne $pipExe)
-        {
-            $userInstallLocation = Join-Path (Split-Path $pipExe -Parent) "Scripts\pip3.exe"
-            if ($userInstallLocation)
-            {
+        if ($null -ne $pipExe) {
+            $userInstallLocation = Join-Path (Split-Path $pipExe -Parent) 'Scripts\pip3.exe'
+            if ($userInstallLocation) {
                 return $userInstallLocation
             }
         }
 
         $pipExe = TryGetRegistryValue -Key $machineUninstallRegistry -Property $installLocationProperty
-        if ($null -ne $pipExe)
-        {
-            $machineInstallLocation = Join-Path (Split-Path $pipExe -Parent) "Scripts\pip3.exe"
-            if ($machineInstallLocation)
-            {
+        if ($null -ne $pipExe) {
+            $machineInstallLocation = Join-Path (Split-Path $pipExe -Parent) 'Scripts\pip3.exe'
+            if ($machineInstallLocation) {
                 return $machineInstallLocation
             }
         }
-    }
-    elseif ($IsMacOS)
-    {
+    } elseif ($IsMacOS) {
         $pipExe = Join-Path '/Library' 'Frameworks' 'Python.framework' 'Versions' 'Current' 'bin' 'python'
 
-        if (Test-Path -Path $pipExe)
-        {
+        if (Test-Path -Path $pipExe) {
             return $pipExe
         }
 
         $pipExe = (Get-Command -Name 'pip3' -ErrorAction SilentlyContinue).Source
 
-        if ($pipExe)
-        {
+        if ($pipExe) {
             return $pipExe
         }
-    }
-    elseif ($IsLinux)
-    {
+    } elseif ($IsLinux) {
         $pipExe = Join-Path '/usr/bin' 'pip3'
 
-        if (Test-Path $pipExe)
-        {
+        if (Test-Path $pipExe) {
             return $pipExe
         }
 
         $pipExe = (Get-Command -Name 'pip3' -ErrorAction SilentlyContinue).Source
 
-        if ($pipExe)
-        {
+        if ($pipExe) {
             return $pipExe
         }
-    }
-    else
-    {
-        throw "Operating system not supported."
+    } else {
+        throw 'Operating system not supported.'
     }
 }
 
-function Assert-Pip3
-{
+function Assert-Pip3 {
     # Try invoking pip3 help with the alias. If it fails, switch to calling npm.cmd directly.
     # This may occur if npm is installed in the same shell window and the alias is not updated until the shell window is restarted.
-    try
-    {
+    try {
         Invoke-Pip3 -command 'help'
         return
-    }
-    catch {}
+    } catch {}
 
-    if (Test-Path -Path $global:pip3ExePath)
-    {
-        $global:usePip3Exe = $true;
+    if (Test-Path -Path $global:pip3ExePath) {
+        $global:usePip3Exe = $true
         Write-Verbose "Calling pip3.exe from install location: $global:usePip3Exe"
-    }
-    else
-    {
-        throw "Python is not installed"
+    } else {
+        throw 'Python is not installed'
     }
 }
 
-function Get-PackageNameWithVersion
-{
+function Get-PackageNameWithVersion {
     param (
         [Parameter(Mandatory = $true)]
         [string]$PackageName,
@@ -109,16 +86,14 @@ function Get-PackageNameWithVersion
         [switch]$IsUpdate
     )
 
-    if ($PSBoundParameters.ContainsKey('Version') -and -not ([string]::IsNullOrEmpty($Version)))
-    {
-        $packageName = $PackageName + "==" + $Version
+    if ($PSBoundParameters.ContainsKey('Version') -and -not ([string]::IsNullOrEmpty($Version))) {
+        $packageName = $PackageName + '==' + $Version
     }
 
     return $packageName
 }
 
-function Invoke-Pip3Install
-{
+function Invoke-Pip3Install {
     param (
         [Parameter()]
         [string]$PackageName,
@@ -134,18 +109,16 @@ function Invoke-Pip3Install
     )
 
     $command = [List[string]]::new()
-    $command.Add("install")
+    $command.Add('install')
     $command.Add((Get-PackageNameWithVersion @PSBoundParameters))
-    if ($IsUpdate.IsPresent)
-    {
-        $command.Add("--force-reinstall")
+    if ($IsUpdate.IsPresent) {
+        $command.Add('--force-reinstall')
     }
     $command.Add($Arguments)
     return Invoke-Pip3 -command $command
 }
 
-function Invoke-Pip3Uninstall
-{
+function Invoke-Pip3Uninstall {
     param (
         [Parameter()]
         [string]$PackageName,
@@ -158,17 +131,16 @@ function Invoke-Pip3Uninstall
     )
 
     $command = [List[string]]::new()
-    $command.Add("uninstall")
+    $command.Add('uninstall')
     $command.Add((Get-PackageNameWithVersion @PSBoundParameters))
     $command.Add($Arguments)
 
     # '--yes' is needed to ignore confirmation required for uninstalls
-    $command.Add("--yes")
+    $command.Add('--yes')
     return Invoke-Pip3 -command $command
 }
 
-function GetPip3CurrentState
-{
+function GetPip3CurrentState {
     [CmdletBinding()]
     param (
         [Parameter(Mandatory = $false)]
@@ -181,8 +153,7 @@ function GetPip3CurrentState
     )
 
     # Filter out the installed packages from the parameters because it is not a valid parameter when calling .ToHashTable() in the class for comparison
-    if ($Parameters.ContainsKey('InstalledPackages'))
-    {
+    if ($Parameters.ContainsKey('InstalledPackages')) {
         $Parameters.Remove('InstalledPackages')
     }
 
@@ -194,16 +165,13 @@ function GetPip3CurrentState
         InstalledPackages = $Package
     }
 
-    foreach ($entry in $Package)
-    {
-        if ($entry.PackageName -eq $Parameters.PackageName)
-        {
+    foreach ($entry in $Package) {
+        if ($entry.PackageName -eq $Parameters.PackageName) {
             Write-Verbose -Message "Package exist: $($entry.name)"
             $out.Exist = $true
             $out.Version = $entry.version
 
-            if ($Parameters.ContainsKey('version') -and $entry.version -ne $Parameters.version)
-            {
+            if ($Parameters.ContainsKey('version') -and $entry.version -ne $Parameters.version) {
                 Write-Verbose -Message "Package exist, but version is different: $($entry.version)"
                 $out.Exist = $false
             }
@@ -213,19 +181,15 @@ function GetPip3CurrentState
     return $out
 }
 
-function GetInstalledPip3Packages
-{
+function GetInstalledPip3Packages {
     $Arguments = [List[string]]::new()
-    $Arguments.Add("list")
-    $Arguments.Add("--format=json")
+    $Arguments.Add('list')
+    $Arguments.Add('--format=json')
 
-    if ($global:usePip3Exe)
-    {
+    if ($global:usePip3Exe) {
         $command = "& '$global:pip3ExePath' " + $Arguments
-    }
-    else
-    {
-        $command = "& pip3 " + $Arguments
+    } else {
+        $command = '& pip3 ' + $Arguments
     }
 
     $res = Invoke-Expression -Command $command | ConvertFrom-Json
@@ -240,25 +204,20 @@ function GetInstalledPip3Packages
     return $result
 }
 
-function Invoke-Pip3
-{
+function Invoke-Pip3 {
     param (
         [Parameter(Mandatory)]
         [string]$command
     )
 
-    if ($global:usePip3Exe)
-    {
+    if ($global:usePip3Exe) {
         return Start-Process -FilePath $global:pip3ExePath -ArgumentList $command -Wait -PassThru -WindowStyle Hidden
-    }
-    else
-    {
+    } else {
         return Start-Process -FilePath pip3 -ArgumentList $command -Wait -PassThru -WindowStyle hidden
     }
 }
 
-function TryGetRegistryValue
-{
+function TryGetRegistryValue {
     param (
         [Parameter(Mandatory = $true)]
         [string]$Key,
@@ -267,20 +226,14 @@ function TryGetRegistryValue
         [string]$Property
     )
 
-    if (Test-Path -Path $Key)
-    {
-        try
-        {
+    if (Test-Path -Path $Key) {
+        try {
             return (Get-ItemProperty -Path $Key | Select-Object -ExpandProperty $Property)
-        }
-        catch
-        {
+        } catch {
             Write-Verbose "Property `"$($Property)`" could not be found."
         }
-    }
-    else
-    {
-        Write-Verbose "Registry key does not exist."
+    } else {
+        Write-Verbose 'Registry key does not exist.'
     }
 }
 
@@ -333,8 +286,7 @@ Assert-Pip3
     This example shows how Django can be removed from the system.
 #>
 [DSCResource()]
-class Pip3Package
-{
+class Pip3Package {
     [DscProperty(Key, Mandatory)]
     [string]$PackageName
 
@@ -350,26 +302,21 @@ class Pip3Package
     [DscProperty(NotConfigurable)]
     [hashtable[]]$InstalledPackages
 
-    [Pip3Package] Get()
-    {
+    [Pip3Package] Get() {
         $this.InstalledPackages = GetInstalledPip3Packages
         $currentState = GetPip3CurrentState -Package $this.InstalledPackages -Parameters $this.ToHashTable()
 
         return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         $currentState = $this.Get()
-        if ($currentState.Exist -ne $this.Exist)
-        {
+        if ($currentState.Exist -ne $this.Exist) {
             return $false
         }
 
-        if (-not ([string]::IsNullOrEmpty($this.Version)))
-        {
-            if ($this.Version -ne $currentState.Version)
-            {
+        if (-not ([string]::IsNullOrEmpty($this.Version))) {
+            if ($this.Version -ne $currentState.Version) {
                 return $false
             }
         }
@@ -377,34 +324,25 @@ class Pip3Package
         return $true
     }
 
-    [void] Set()
-    {
-        if ($this.Test())
-        {
+    [void] Set() {
+        if ($this.Test()) {
             return
         }
 
         $currentPackage = $this.InstalledPackages | Where-Object { $_.PackageName -eq $this.PackageName }
-        if ($currentPackage -and $currentPackage.Version -ne $this.Version -and $this.Exist)
-        {
+        if ($currentPackage -and $currentPackage.Version -ne $this.Version -and $this.Exist) {
             Invoke-Pip3Install -PackageName $this.PackageName -Version $this.Version -Arguments $this.Arguments -IsUpdate
-        }
-        elseif ($this.Exist)
-        {
+        } elseif ($this.Exist) {
             Invoke-Pip3Install -PackageName $this.PackageName -Version $this.Version -Arguments $this.Arguments
-        }
-        else
-        {
+        } else {
             Invoke-Pip3Uninstall -PackageName $this.PackageName -Version $this.Version -Arguments $this.Arguments
         }
     }
 
-    static [Pip3Package[]] Export()
-    {
+    static [Pip3Package[]] Export() {
         $packages = GetInstalledPip3Packages
         $out = [List[Pip3Package]]::new()
-        foreach ($package in $packages)
-        {
+        foreach ($package in $packages) {
             $in = [Pip3Package]@{
                 PackageName       = $package.PackageName
                 Version           = $package.version
@@ -420,13 +358,10 @@ class Pip3Package
     }
 
     #region Pip3Package Helper functions
-    [hashtable] ToHashTable()
-    {
+    [hashtable] ToHashTable() {
         $parameters = @{}
-        foreach ($property in $this.PSObject.Properties)
-        {
-            if (-not ([string]::IsNullOrEmpty($property.Value)))
-            {
+        foreach ($property in $this.PSObject.Properties) {
+            if (-not ([string]::IsNullOrEmpty($property.Value))) {
                 $parameters[$property.Name] = $property.Value
             }
         }
diff --git a/resources/YarnDsc/YarnDsc.psm1 b/resources/YarnDsc/YarnDsc.psm1
index b811b755..b5c35797 100644
--- a/resources/YarnDsc/YarnDsc.psm1
+++ b/resources/YarnDsc/YarnDsc.psm1
@@ -8,8 +8,7 @@ Assert-Yarn
 
 #region DSCResources
 [DSCResource()]
-class YarnInstall
-{
+class YarnInstall {
     # DSCResource requires a key. Do not set.
     [DscProperty(Key)]
     [string]$SID
@@ -23,16 +22,11 @@ class YarnInstall
     [DscProperty(NotConfigurable)]
     [string[]]$Dependencies
 
-    [YarnInstall] Get()
-    {
-        if (-not([string]::IsNullOrEmpty($this.PackageDirectory)))
-        {
-            if (Test-Path -Path $this.PackageDirectory -PathType Container)
-            {
+    [YarnInstall] Get() {
+        if (-not([string]::IsNullOrEmpty($this.PackageDirectory))) {
+            if (Test-Path -Path $this.PackageDirectory -PathType Container) {
                 Set-Location -Path $this.PackageDirectory
-            }
-            else
-            {
+            } else {
                 throw "$($this.PackageDirectory) does not point to a valid directory."
             }
         }
@@ -41,17 +35,15 @@ class YarnInstall
         $currentState.Dependencies = Invoke-YarnInfo -Arguments '--name-only --json' | ConvertFrom-Json
         $currentState.Arguments = $this.Arguments
         $currentState.PackageDirectory = $this.PackageDirectory
-        return $currentState;
+        return $currentState
     }
 
-    [bool] Test()
-    {
+    [bool] Test() {
         # Yarn install is inherently idempotent as it will also resolve package dependencies. Set to $false
         return $false
     }
 
-    [void] Set()
-    {
+    [void] Set() {
         $currentState = $this.Get()
         Invoke-YarnInstall -Arguments $currentState.Arguments
     }
@@ -60,49 +52,42 @@ class YarnInstall
 #endregion DSCResources
 
 #region Functions
-function Assert-Yarn
-{
+function Assert-Yarn {
     # Refresh session $path value before invoking 'npm'
-    $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
-    try
-    {
+    $env:Path = [System.Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [System.Environment]::GetEnvironmentVariable('Path', 'User')
+    try {
         Invoke-Yarn -Command 'help'
         return
-    }
-    catch
-    {
-        throw "Yarn is not installed"
+    } catch {
+        throw 'Yarn is not installed'
     }
 }
 
-function Invoke-YarnInfo
-{
+function Invoke-YarnInfo {
     param(
         [Parameter()]
         [string]$Arguments
     )
 
     $command = [List[string]]::new()
-    $command.Add("info")
+    $command.Add('info')
     $command.Add($Arguments)
     return Invoke-Yarn -Command $command
 }
 
-function Invoke-YarnInstall
-{
+function Invoke-YarnInstall {
     param (
         [Parameter()]
         [string]$Arguments
     )
 
     $command = [List[string]]::new()
-    $command.Add("install")
+    $command.Add('install')
     $command.Add($Arguments)
     return Invoke-Yarn -Command $command
 }
 
-function Invoke-Yarn
-{
+function Invoke-Yarn {
     param (
         [Parameter(Mandatory = $true)]
         [string]$Command
diff --git a/tests/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.Tests.ps1 b/tests/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.Tests.ps1
index 06a8224a..620dea67 100644
--- a/tests/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.Tests.ps1
+++ b/tests/Microsoft.DotNet.Dsc/Microsoft.DotNet.Dsc.Tests.ps1
@@ -2,7 +2,7 @@
 # Licensed under the MIT License.
 using module Microsoft.DotNet.Dsc
 
-$ErrorActionPreference = "Stop"
+$ErrorActionPreference = 'Stop'
 Set-StrictMode -Version Latest
 
 <#
@@ -16,15 +16,14 @@ BeforeAll {
 
     $script:toolsDir = Join-Path $env:USERPROFILE 'tools'
 
-    if (-not (Test-Path $toolsDir))
-    {
+    if (-not (Test-Path $toolsDir)) {
         $null = New-Item -ItemType Directory -Path $toolsDir -Force -ErrorAction SilentlyContinue
     }
 }
 
 Describe 'List available DSC resources' {
     It 'Shows DSC Resources' {
-        $expectedDSCResources = "DotNetToolPackage"
+        $expectedDSCResources = 'DotNetToolPackage'
         $availableDSCResources = (Get-DscResource -Module Microsoft.DotNet.Dsc).Name
         $availableDSCResources.count | Should -Be 1
         $availableDSCResources | Where-Object { $expectedDSCResources -notcontains $_ } | Should -BeNullOrEmpty -ErrorAction Stop
@@ -109,7 +108,7 @@ Describe 'DSC operation capabilities' {
             PackageId = 'Azure-Core' # not a tool
         }
 
-        { Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Set -Property $parameters } | Should -Throw -ExpectedMessage "Executing dotnet.exe with {tool install Azure-Core --global --ignore-failed-sources} failed."
+        { Invoke-DscResource -Name DotNetToolPackage -ModuleName Microsoft.DotNet.Dsc -Method Set -Property $parameters } | Should -Throw -ExpectedMessage 'Executing dotnet.exe with {tool install Azure-Core --global --ignore-failed-sources} failed.'
     }
 
     It 'Installs in tool path location with version' -Skip:(!$IsWindows) {
@@ -187,10 +186,10 @@ Describe 'DSC operation capabilities' {
 }
 
 Describe 'DSC helper functions' {
-    Context "Semantic Versioning" {
+    Context 'Semantic Versioning' {
         It 'Parses valid semantic version' {
             $version = '1.2.3'
-            $result = Get-Semver -version $version
+            $result = Get-SemVer -version $version
             $result.Major | Should -Be 1
             $result.Minor | Should -Be 2
             $result.Build | Should -Be 3
@@ -198,7 +197,7 @@ Describe 'DSC helper functions' {
 
         It 'Parses semantic version with alpha' {
             $version = '1.2.3-alpha'
-            $result = Get-Semver -version $version
+            $result = Get-SemVer -version $version
             $result.Major | Should -Be 1
             $result.Minor | Should -Be 2
             $result.Build | Should -Be 3
@@ -207,7 +206,7 @@ Describe 'DSC helper functions' {
 
         It 'Parses semantic version with alpha tag and version' {
             $version = '1.2.3-alpha.123'
-            $result = Get-Semver -version $version
+            $result = Get-SemVer -version $version
             $result.Major | Should -Be 1
             $result.Minor | Should -Be 2
             $result.Build | Should -Be 3
@@ -216,7 +215,7 @@ Describe 'DSC helper functions' {
 
         It 'Parses semantic version with beta tag and version' {
             $version = '1.2.3-beta.11'
-            $result = Get-Semver -version $version
+            $result = Get-SemVer -version $version
             $result.Major | Should -Be 1
             $result.Minor | Should -Be 2
             $result.Build | Should -Be 3
@@ -225,7 +224,7 @@ Describe 'DSC helper functions' {
 
         It 'Parses semantic version with rc and version' {
             $version = '1.2.3-rc.1'
-            $result = Get-Semver -version $version
+            $result = Get-SemVer -version $version
             $result.Major | Should -Be 1
             $result.Minor | Should -Be 2
             $result.Build | Should -Be 3
diff --git a/tests/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.Tests.ps1 b/tests/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.Tests.ps1
index d8f34766..118cbe5a 100644
--- a/tests/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.Tests.ps1
+++ b/tests/Microsoft.VSCode.Dsc/Microsoft.VSCode.Dsc.Tests.ps1
@@ -2,7 +2,7 @@
 # Licensed under the MIT License.
 using module Microsoft.VSCode.Dsc
 
-$ErrorActionPreference = "Stop"
+$ErrorActionPreference = 'Stop'
 Set-StrictMode -Version Latest
 
 <#
@@ -24,7 +24,7 @@ BeforeAll {
 
 Describe 'List available DSC resources' {
     It 'Shows DSC Resources' {
-        $expectedDSCResources = "VSCodeExtension"
+        $expectedDSCResources = 'VSCodeExtension'
         $availableDSCResources = (Get-DscResource -Module Microsoft.VSCode.Dsc).Name
         $availableDSCResources.count | Should -Be 1
         $availableDSCResources | Where-Object { $expectedDSCResources -notcontains $_ } | Should -BeNullOrEmpty -ErrorAction Stop
diff --git a/tests/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.Tests.ps1 b/tests/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.Tests.ps1
index d29ca94b..dd22de6d 100644
--- a/tests/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.Tests.ps1
+++ b/tests/Microsoft.Windows.Setting.Accessibility/Microsoft.Windows.Setting.Accessibility.Tests.ps1
@@ -3,7 +3,7 @@
 # Licensed under the MIT License.
 using module Microsoft.Windows.Setting.Accessibility
 
-$ErrorActionPreference = "Stop"
+$ErrorActionPreference = 'Stop'
 Set-StrictMode -Version Latest
 
 <#
@@ -12,8 +12,7 @@ Set-StrictMode -Version Latest
 #>
 
 BeforeAll {
-    if ($null -eq (Get-Module -ListAvailable -Name PSDesiredStateConfiguration))
-    {
+    if ($null -eq (Get-Module -ListAvailable -Name PSDesiredStateConfiguration)) {
         Install-Module -Name PSDesiredStateConfiguration -Force -SkipPublisherCheck
     }
 
@@ -22,12 +21,12 @@ BeforeAll {
     # Create test registry path.
     New-Item -Path TestRegistry:\ -Name TestKey
     # Set-ItemProperty requires the PSDrive to be in the format 'HKCU:'.
-    $env:TestRegistryPath = ((Get-Item -Path TestRegistry:\).Name).replace("HKEY_CURRENT_USER", "HKCU:")
+    $env:TestRegistryPath = ((Get-Item -Path TestRegistry:\).Name).replace('HKEY_CURRENT_USER', 'HKCU:')
 }
 
 Describe 'List available DSC resources' {
     It 'Shows DSC Resources' {
-        $expectedDSCResources = "Text", "Magnifier", "MousePointer", "VisualEffect", "Audio", "TextCursor", "StickyKeys", "ToggleKeys", "FilterKeys"
+        $expectedDSCResources = 'Text', 'Magnifier', 'MousePointer', 'VisualEffect', 'Audio', 'TextCursor', 'StickyKeys', 'ToggleKeys', 'FilterKeys'
         $availableDSCResources = (Get-DscResource -Module Microsoft.Windows.Setting.Accessibility).Name
         $availableDSCResources.length | Should -Be 9
         $availableDSCResources | Where-Object { $expectedDSCResources -notcontains $_ } | Should -BeNullOrEmpty -ErrorAction Stop
@@ -403,5 +402,5 @@ Describe 'FilterKeys' {
 }
 
 AfterAll {
-    $env:TestRegistryPath = ""
+    $env:TestRegistryPath = ''
 }
diff --git a/tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1 b/tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1
index 3e1b3dbb..9d1d33ee 100644
--- a/tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1
+++ b/tests/PythonPip3Dsc/PythonPip3Dsc.Tests.ps1
@@ -1,6 +1,6 @@
 using module PythonPip3Dsc
 
-$ErrorActionPreference = "Stop"
+$ErrorActionPreference = 'Stop'
 Set-StrictMode -Version Latest
 
 <#
@@ -10,10 +10,9 @@ Set-StrictMode -Version Latest
 
 BeforeAll {
     # Before import module make sure Python is installed
-    if ($env:TF_BUILD)
-    {
+    if ($env:TF_BUILD) {
         $outFile = Join-Path $env:TEMP 'python.exe'
-        Invoke-WebRequest -Uri "https://www.python.org/ftp/python/3.14.0/python-3.14.0a1-amd64.exe" -UseBasicParsing -OutFile $outFile
+        Invoke-WebRequest -Uri 'https://www.python.org/ftp/python/3.14.0/python-3.14.0a1-amd64.exe' -UseBasicParsing -OutFile $outFile
         & $outFile /quiet InstallAllUsers=1 PrependPath=1 Include_test=0
     }
 
@@ -22,7 +21,7 @@ BeforeAll {
 
 Describe 'List available DSC resources' {
     It 'Shows DSC Resources' {
-        $expectedDSCResources = "Pip3Package"
+        $expectedDSCResources = 'Pip3Package'
         $availableDSCResources = (Get-DscResource -Module PythonPip3Dsc).Name
         $availableDSCResources.count | Should -Be 1
         $availableDSCResources | Where-Object { $expectedDSCResources -notcontains $_ } | Should -BeNullOrEmpty -ErrorAction Stop