-
Notifications
You must be signed in to change notification settings - Fork 22
New website layout #248
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
New website layout #248
Conversation
WalkthroughLarge site redesign: new CSS design system, site-wide JS (theme, mobile menu, search modal, animations), updated Hugo configuration and navigation, and many new/rewritten Hugo layout templates and content adjustments across blog, community, help, guidelines, resources, and homepage. Changes
Sequence Diagram(s)mermaid User->>Browser: open page / interact (click search, theme toggle) Estimated code review effort🎯 4 (Complex) | ⏱️ ~60–75 minutes Areas requiring extra attention:
Pre-merge checks❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 13
🧹 Nitpick comments (35)
layouts/help/list.html (3)
39-104: Consider extracting repeated inline styles to CSS classes.The Quick Links section has significant inline styling that duplicates similar patterns across other templates in this PR. Consider extracting common patterns like the link styling (lines 61-69, 76-84, 91-98) into reusable CSS classes in
futuristic.css.
162-177: Substring matching for icon selection may be fragile.Using
in .Titleperforms substring matching, so a page titled "What is DSC Configuration" would match "What is DSC" but also any title containing "Future" anywhere. Consider usingeqfor exact matches or more specific substrings.🔎 Suggested improvement
-{{ if in .Title "What is DSC" }} +{{ if eq .Title "What is DSC" }} <i class="ri-lightbulb-line" style="color: white; font-size: 1.5rem" ></i> -{{ else if in .Title "Future" }} +{{ else if eq .Title "The Future of DSC" }}Alternatively, consider using frontmatter to specify icons directly in content files for more flexibility.
259-276: Addnoreferrerto external links for privacy.External links have
rel="noopener"which is good for security, but consider addingnoreferreras well to prevent leaking referrer information to external sites.🔎 Suggested fix
<a href="https://aka.ms/psslack" class="btn btn-primary" target="_blank" - rel="noopener" + rel="noopener noreferrer" >content/blog/updating-sampler-github-tasks.md (1)
30-30: Line exceeds 80 character limit.Per coding guidelines, Markdown lines should wrap at word boundaries when over 80 characters (except for tables/code blocks). This line and several others (e.g., lines 16, 19-21) exceed this limit.
🔎 Example fix for line 30
-In short, the GitHub tasks are now packaged in the `Sampler.GitHubTasks` module which depends upon the [PowerShellForGitHub](https://github.com/microsoft/PowerShellForGitHub/) module. +In short, the GitHub tasks are now packaged in the `Sampler.GitHubTasks` +module which depends upon the +[PowerShellForGitHub](https://github.com/microsoft/PowerShellForGitHub/) module.layouts/resources/list.html (3)
54-63: Hardcoded statistics may become stale.The stats "1M+ Total Downloads" and "100+ Contributors" are hardcoded and will require manual updates to stay accurate. Consider either:
- Removing these stats if they can't be dynamically generated
- Adding a comment noting when they were last updated
- Fetching from an API or data file if available
226-250: Consider adding debounce to search for performance.The
filterResourcesfunction is called on every keystroke. With a large number of resources, this could cause performance issues. Consider adding a debounce.🔎 Example with debounce
<script> + let searchTimeout; function filterResources(query) { + clearTimeout(searchTimeout); + searchTimeout = setTimeout(() => { + performFilter(query); + }, 150); + } + + function performFilter(query) { const grid = document.getElementById("resourceGrid"); const cards = grid.querySelectorAll(".resource-card"); // ... rest of the function + } </script>
148-167: Addnoreferrerto external links.The GitHub and PowerShell Gallery links have
target="_blank"andrel="noopener noreferrer"on line 152, which is correct. However, ensure consistency with the CTA section links (lines 205-217) which are missingnoreferrer.🔎 Fix for CTA GitHub link
<a href="https://github.com/dsccommunity" class="btn btn-secondary btn-lg" target="_blank" - rel="noopener noreferrer" + rel="noopener noreferrer" >Note: Line 209 already has the correct
relattribute. The resource card links at lines 151-152 are also correct.layouts/configmgt/list.html (1)
39-108: Consider extracting repeated inline styles to CSS classes.The Quick Links section uses extensive inline styles that repeat patterns already defined in
futuristic.css. While this works, extracting these to reusable classes would improve maintainability and reduce template verbosity.For example, the link styling pattern (lines 61-69, 76-84, 95-101) could use a shared class.
config.toml (1)
136-138: Consider updating Twitter social link to X.com.Twitter has rebranded to X. While the current URL still works via redirect, you may want to update it for consistency with current branding.
🔎 Proposed update
[[Languages.en.params.socialIcon]] icon = "ti-twitter-alt" -URL = "https://twitter.com/dsccommunity" +URL = "https://x.com/dsccommunity"layouts/community/single.html (1)
45-55: Remove or implement commented-out and empty sections.The commented-out "Table of Contents" block (lines 45-51) and the empty "Quick Links" section (lines 53-55) appear to be incomplete artifacts. Consider either implementing these features or removing them to keep the template clean.
layouts/community_calls/list.html (2)
17-17: Hardcoded Teams meeting link with embedded tenant/user GUIDs.The Teams meeting URL contains embedded GUIDs (
Tid,Oid). If these identifiers change (e.g., meeting recreation, user changes), the link will break. Consider whether this URL should be externalized toconfig.tomlor a data file for easier maintenance.
46-46: Hardcoded phone dial-in details.The phone number and conference ID are hardcoded. If these change, they'll need template edits. Consider moving these to site params or a data file for centralized management.
layouts/guidelines/list.html (1)
110-124: Consider using CSS variables for icon colors.The inline hex colors (
#a855f7,#ec4899,#f97316) and the gradient color (#059669on line 85) could be defined as CSS custom properties for consistency with the design system. This would make theme updates easier.<!-- Example: define in futuristic.css and use here --> <i class="ri-palette-line" style="color: var(--color-purple); font-size: 1.25rem;"></i>layouts/code_of_conduct/single.html (1)
126-128: Minor: Template tags formatting.Line 128 concatenates
{{ end }}and{{ with .NextInSection }}on the same line. While functional, separating them improves readability.{{ else }} <div></div> - {{ end }} {{ with .NextInSection }} + {{ end }} + {{ with .NextInSection }} <alayouts/configmgt/single.html (1)
99-101: Minor: Same template tag formatting as other files.Same pattern as other single templates - consider separating
{{ end }}and{{ with .NextInSection }}onto separate lines for consistency and readability.layouts/_default/single.html (2)
10-17: Hardcoded RGBA colors in breadcrumb.The breadcrumb uses hardcoded
rgba(255,255,255,...)values. For consistency with the design system and dark mode support, consider using CSS custom properties or existing text color variables.- <li><a href="{{ .Site.BaseURL }}" style="color: rgba(255,255,255,0.7);">Home</a></li> - <li style="color: rgba(255,255,255,0.5);">/</li> + <li><a href="{{ .Site.BaseURL }}" style="color: var(--text-secondary);">Home</a></li> + <li style="color: var(--text-tertiary);">/</li>
114-148: Consider moving TOC script to main.js.The inline TOC generation script could be moved to
assets/js/main.jsfor better maintainability and to follow the separation of concerns established elsewhere in the PR (where main.js handles theme management, search, etc.).The script itself is well-written with proper null checks and handles the case where headings lack IDs.
layouts/help/single.html (1)
60-130: Consider extracting the article navigation into a partial.The prev/next navigation block (lines 60-130) with its extensive inline styles is duplicated across multiple templates (
help/single.html,guidelines/single.html,configmgt/single.html). Extracting this into a reusable partial likepartials/article-nav.htmlwould reduce duplication and ease future styling changes.🔎 Example partial extraction
Create
layouts/partials/article-nav.html:<nav class="article-nav" style="margin-top: var(--space-12); padding-top: var(--space-6); border-top: 1px solid var(--border-primary); display: flex; justify-content: space-between; gap: var(--space-4); flex-wrap: wrap;"> {{ with .PrevInSection }} <a href="{{ .Permalink }}" class="article-nav-link prev" style="text-decoration: none; display: flex; align-items: center; gap: var(--space-2); color: var(--text-secondary);"> <i class="ri-arrow-left-line"></i> <span> <span style="display: block; font-size: var(--text-xs); color: var(--text-tertiary);">Previous</span> <span style="color: var(--text-primary); font-weight: 500;">{{ .Title }}</span> </span> </a> {{ else }} <div></div> {{ end }} {{ with .NextInSection }} <a href="{{ .Permalink }}" class="article-nav-link next" style="text-decoration: none; display: flex; align-items: center; gap: var(--space-2); color: var(--text-secondary); text-align: right;"> <span> <span style="display: block; font-size: var(--text-xs); color: var(--text-tertiary);">Next</span> <span style="color: var(--text-primary); font-weight: 500;">{{ .Title }}</span> </span> <i class="ri-arrow-right-line"></i> </a> {{ end }} </nav>Then use it with:
{{ partial "article-nav.html" . }}layouts/blog/list.html (1)
69-76: Empty state may be unreachable due to placement.The empty state block (lines 70-76) checks
if eq (len .Data.Pages) 0, but since the grid range (lines 43-66) would simply produce no cards when empty, this works correctly. However, consider moving the empty state check to wrap the entire grid section for clearer intent.layouts/community/list.html (2)
17-27: Prefer CSS:hoverover inline JavaScript for hover effects.Lines 18-26 use
onmouseover/onmouseouthandlers for hover styling. This approach is fragile (styles are hardcoded strings), harder to maintain, and doesn't work well with keyboard focus states.🔎 Proposed fix using CSS
Add a class and use CSS instead:
- <a href="{{ .Permalink }}" style="display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: var(--radius-full); color: var(--text-secondary); font-size: var(--text-sm); font-weight: 500; text-decoration: none; transition: all 0.2s ease;" onmouseover="this.style.background='var(--color-primary)'; this.style.color='white'; this.style.borderColor='var(--color-primary)';" onmouseout="this.style.background='var(--bg-secondary)'; this.style.color='var(--text-secondary)'; this.style.borderColor='var(--border-primary)';"> + <a href="{{ .Permalink }}" class="nav-pill">Then in your CSS (e.g.,
futuristic.css):.nav-pill { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: var(--radius-full); color: var(--text-secondary); font-size: var(--text-sm); font-weight: 500; text-decoration: none; transition: all 0.2s ease; } .nav-pill:hover, .nav-pill:focus { background: var(--color-primary); color: white; border-color: var(--color-primary); }This also adds keyboard accessibility via
:focus.
19-24: Icon mapping is duplicated across templates.The title-to-icon mapping (Maintainers →
ri-user-star-line, Committee →ri-group-line, etc.) appears in multiple templates. Consider extracting this into a partial likepartials/community-icon.htmlthat accepts a title parameter.layouts/guidelines/single.html (1)
53-106: Hardcoded "See Also" links may become stale.The quick links section (lines 76-104) contains hardcoded URLs (
/styleguidelines,/resources). If these paths change, this template won't update automatically.Consider using Hugo's
reffunction or site configuration to make these links more maintainable:🔎 Example using site data or ref
<a href="{{ ref . "/styleguidelines" }}" ...>Or define related links in frontmatter/config and iterate over them.
layouts/partials/header-new.html (2)
137-149: Moon icon visibility managed via inline style.Line 139 uses
style="display: none"to hide the moon icon. This tightly couples the initial state to the HTML. ThetoggleTheme()function in JS will need to toggle this inline style, which is less maintainable than using CSS classes.🔎 Proposed approach
Use a class-based approach:
<svg class="moon-icon" - style="display: none" + class="moon-icon hidden" ...Then toggle the
hiddenclass in JavaScript.
152-169: GitHub link reusestheme-toggleclass.Line 155 applies
class="theme-toggle"to the GitHub link. While this may provide consistent styling, it's semantically misleading. Consider using a more generic class likeheader-action-btnoricon-btn.layouts/index.html (3)
39-43: Search input accessibility could be improved.The hero search input (lines 40-43) is
readonlyand opens a modal on click. Consider addingrole="button"and keyboard handling for better accessibility, so users can activate it with Enter/Space.🔎 Proposed fix
- <input type="text" placeholder="Search documentation, resources, and more..." onclick="openSearchModal()" readonly> + <input type="text" placeholder="Search documentation, resources, and more..." onclick="openSearchModal()" onkeydown="if(event.key==='Enter'||event.key===' ')openSearchModal()" readonly role="button" tabindex="0" aria-label="Open search">Alternatively, use a
<button>styled to look like an input for proper semantics.
66-84: Icon mapping is duplicated across multiple templates.The
.Params.Iconto Remix Icon mapping (lines 66-84) is duplicated inlayouts/index.html,layouts/_default/list.html, and elsewhere. Consider extracting this into a partial.🔎 Example partial
Create
layouts/partials/icon-map.html:{{- $icon := . -}} {{- if eq $icon "ti-user" -}}<i class="ri-team-line"></i> {{- else if eq $icon "ti-package" -}}<i class="ri-apps-2-line"></i> {{- else if eq $icon "ti-book" -}}<i class="ri-book-open-line"></i> {{- else if eq $icon "ti-rss-alt" -}}<i class="ri-article-line"></i> {{- else if eq $icon "ti-settings" -}}<i class="ri-settings-3-line"></i> {{- else if eq $icon "ti-headphone-alt" -}}<i class="ri-headphone-line"></i> {{- else if eq $icon "ti-help-alt" -}}<i class="ri-question-line"></i> {{- else if eq $icon "ti-shield" -}}<i class="ri-shield-check-line"></i> {{- else -}}<i class="ri-folder-line"></i> {{- end -}}Usage:
{{ partial "icon-map.html" .Params.Icon }}
208-219: Filter assumes specific title string "Community Calls".Line 210 filters out pages with title exactly matching "Community Calls". This is fragile if the title changes. Consider using a frontmatter flag or checking the page's
.IsSectionproperty instead.🔎 Proposed fix
- {{ if ne .Title "Community Calls" }} + {{ if not .IsSection }}Or add a frontmatter field like
exclude_from_list: trueto the section page.layouts/blog/single.html (2)
27-37: Author avatar handles edge case gracefully.The author initial extraction
{{ substr . 0 1 }}(line 30) is wrapped in{{ with .Params.author }}, so it won't render for missing authors. However, ifauthoris an empty string,substr "" 0 1returns empty, resulting in a blank avatar circle.🔎 Defensive check
{{ with .Params.author }} +{{ if . }} <div style="display: flex; align-items: center; gap: var(--space-2);"> ... </div> +{{ end }} {{ end }}Or provide a default initial:
{{ substr (default "?" .) 0 1 }}
95-116: Navigation uses grid layout instead of flex.This blog navigation (line 96) uses
grid-template-columns: 1fr 1frwhile other templates use flexbox for prev/next navigation. This creates visual inconsistency and may behave differently on mobile (grid maintains columns, flex wraps).Consider aligning with the flex-based pattern used in
help/single.htmlandguidelines/single.htmlfor consistency, or extract a shared navigation partial.layouts/_default/list.html (1)
8-30: Icon mapping duplicated once more.Lines 10-28 repeat the same icon mapping logic found in
layouts/index.html(lines 66-84). This is the third occurrence. Strongly recommend extracting into a partial to follow DRY principles.See the partial suggestion in the
layouts/index.htmlreview.assets/js/main.js (3)
19-41: Minor:updateThemeToggleis called twice during initialization.
initTheme()calls bothsetTheme(theme)(line 25) andupdateThemeToggle(theme)(line 26), butsetTheme()already callsupdateThemeToggle()on line 40. Consider removing the redundant call.Proposed fix
function initTheme() { const theme = localStorage.getItem("theme") || (window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"); setTheme(theme); - updateThemeToggle(theme); // Listen for system theme changes
71-92: Unused variablelastScroll.The variable
lastScrollis assigned but never read. It appears to be leftover from removed hide-on-scroll functionality.Proposed fix
function initHeader() { const header = document.getElementById("siteHeader"); if (!header) return; - let lastScroll = 0; - window.addEventListener( "scroll", () => { const currentScroll = window.pageYOffset; if (currentScroll > 50) { header.classList.add("scrolled"); } else { header.classList.remove("scrolled"); } - - lastScroll = currentScroll; }, { passive: true } ); }
361-367: Consider: Elements may remain invisible if animation fails.Setting
opacity: "0"via JavaScript means elements are initially visible, then hidden by JS, then revealed by the observer. If the observer fails or the class doesn't trigger correctly, elements stay invisible. Consider using a CSS class for the initial hidden state that's more robust.Alternatively, define
.animate-target { opacity: 0; }in CSS and add that class here instead of inline styles, with.animate-fade-in-up { opacity: 1; }overriding it.layouts/_default/baseof.html (2)
29-39: Add Subresource Integrity (SRI) hashes to CDN resources and update library versions.The external CDN resources lack
integrityattributes. Additionally, remixicon is using version 4.0.0 (latest: 4.7.0) and highlight.js is using version 11.9.0 (latest: 11.11.1). Consider updating to the latest versions and adding SRI hashes for enhanced security.
133-139: Add SRI hashes and crossorigin attributes for highlight.js CDN scripts.These external scripts should include
integrityandcrossoriginattributes for security. See DIGESTS.md for hash values.
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (46)
.prettierignore(1 hunks)assets/css/futuristic.css(1 hunks)assets/js/main.js(1 hunks)config.toml(2 hunks)content/blog/DSC-is-dead-long-live-dsc.en.md(2 hunks)content/blog/add-codecov-support-to-repository.md(1 hunks)content/blog/class-based-dsc-resources.md(9 hunks)content/blog/convert-a-module-for-continuous-delivery.en.md(1 hunks)content/blog/convert-master-to-main.en.md(1 hunks)content/blog/convert-tests-to-pester5-for-dsc-community-repository.md(1 hunks)content/blog/converting-tests-to-pester5.md(1 hunks)content/blog/create-an-article.en.md(1 hunks)content/blog/updating-sampler-github-tasks.md(4 hunks)content/blog/use-dscresource-common-functions-in-module.en.md(1 hunks)content/community/committee.en.md(1 hunks)content/community/contact.en.md(1 hunks)content/community/maintainers.en.md(1 hunks)content/community/ownership.en.md(1 hunks)content/help/_index.en.md(1 hunks)layouts/404.html(1 hunks)layouts/_default/baseof.html(1 hunks)layouts/_default/list.html(1 hunks)layouts/_default/single.html(1 hunks)layouts/blog/list.html(1 hunks)layouts/blog/single.html(1 hunks)layouts/code_of_conduct/list.html(1 hunks)layouts/code_of_conduct/single.html(1 hunks)layouts/community/list.html(1 hunks)layouts/community/maintainers.html(1 hunks)layouts/community/single.html(1 hunks)layouts/community_calls/list.html(1 hunks)layouts/community_calls/single.html(1 hunks)layouts/configmgt/list.html(1 hunks)layouts/configmgt/single.html(1 hunks)layouts/faq/list.html(1 hunks)layouts/guidelines/list.html(1 hunks)layouts/guidelines/single.html(1 hunks)layouts/help/list.html(1 hunks)layouts/help/single.html(1 hunks)layouts/index.html(1 hunks)layouts/partials/footer-new.html(1 hunks)layouts/partials/header-new.html(1 hunks)layouts/resources/list.html(1 hunks)layouts/resources/single.html(1 hunks)layouts/styleguidelines/list.html(1 hunks)layouts/styleguidelines/single.html(1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**
⚙️ CodeRabbit configuration file
**: # DSC Community GuidelinesTerminology
- Command: Public command
- Function: Private function
- Resource: DSC class-based resource
Build & Test Workflow Requirements
- Run PowerShell script files from repository root
- Setup build and test environment (once per
pwshsession):./build.ps1 -Tasks noop- Build project before running tests:
./build.ps1 -Tasks build- Always run tests in new
pwshsession:Invoke-Pester -Path @({test paths}) -Output DetailedFile Organization
- Public commands:
source/Public/{CommandName}.ps1- Private functions:
source/Private/{FunctionName}.ps1- Classes:
source/Classes/{DependencyGroupNumber}.{ClassName}.ps1- Enums:
source/Enum/{DependencyGroupNumber}.{EnumName}.ps1- Unit tests:
tests/Unit/{Classes|Public|Private}/{Name}.Tests.ps1- Integration tests:
tests/Integration/Commands/{CommandName}.Integration.Tests.ps1Requirements
- Follow instructions over existing code patterns
- Follow PowerShell style and test guideline instructions strictly
- Always update CHANGELOG.md Unreleased section
- Localize all strings using string keys; remove any orphaned string keys
- Check DscResource.Common before creating private functions
- Separate reusable logic into private functions
- DSC resources should always be created as class-based resources
- Add unit tests for all commands/functions/resources
- Add integration tests for all public commands and resources
Files:
layouts/community_calls/single.htmlcontent/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/use-dscresource-common-functions-in-module.en.mdlayouts/code_of_conduct/list.htmlcontent/community/maintainers.en.mdcontent/blog/convert-a-module-for-continuous-delivery.en.mdlayouts/faq/list.htmlcontent/community/contact.en.mdlayouts/_default/list.htmlcontent/blog/class-based-dsc-resources.mdcontent/help/_index.en.mdlayouts/_default/single.htmlcontent/blog/converting-tests-to-pester5.mdlayouts/index.htmlcontent/community/ownership.en.mdlayouts/resources/list.htmllayouts/blog/list.htmllayouts/community/single.htmllayouts/code_of_conduct/single.htmllayouts/community/list.htmlassets/css/futuristic.cssassets/js/main.jscontent/blog/convert-master-to-main.en.mdlayouts/community_calls/list.htmllayouts/styleguidelines/list.htmllayouts/help/single.htmllayouts/community/maintainers.htmllayouts/_default/baseof.htmllayouts/partials/footer-new.htmllayouts/configmgt/list.htmllayouts/resources/single.htmllayouts/styleguidelines/single.htmllayouts/help/list.htmllayouts/partials/header-new.htmllayouts/blog/single.htmllayouts/404.htmllayouts/guidelines/list.htmlcontent/blog/add-codecov-support-to-repository.mdlayouts/configmgt/single.htmlcontent/blog/create-an-article.en.mdlayouts/guidelines/single.htmlconfig.tomlcontent/community/committee.en.mdcontent/blog/DSC-is-dead-long-live-dsc.en.mdcontent/blog/updating-sampler-github-tasks.md
**/*.md
⚙️ CodeRabbit configuration file
**/*.md: # Markdown Style Guidelines
- Wrap lines at word boundaries when over 80 characters (except tables/code blocks)
- Use 2 spaces for indentation
- Use '1.' for all items in ordered lists (1/1/1 numbering style)
- Disable
MD013rule by adding a comment for tables/code blocks exceeding 80 characters- Empty lines required before/after code blocks and headings (except before line 1)
- Escape backslashes in file paths only (not in code blocks)
- Code blocks must specify language identifiers
Text Formatting
- Parameters: bold
- Values/literals:
inline code- Resource/module/product names: italic
- Commands/files/paths:
inline code
Files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/use-dscresource-common-functions-in-module.en.mdcontent/community/maintainers.en.mdcontent/blog/convert-a-module-for-continuous-delivery.en.mdcontent/community/contact.en.mdcontent/blog/class-based-dsc-resources.mdcontent/help/_index.en.mdcontent/blog/converting-tests-to-pester5.mdcontent/community/ownership.en.mdcontent/blog/convert-master-to-main.en.mdcontent/blog/add-codecov-support-to-repository.mdcontent/blog/create-an-article.en.mdcontent/community/committee.en.mdcontent/blog/DSC-is-dead-long-live-dsc.en.mdcontent/blog/updating-sampler-github-tasks.md
🧠 Learnings (58)
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Use Pester v5 syntax only
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/converting-tests-to-pester5.md
📚 Learning: 2025-08-10T15:11:52.897Z
Learnt from: dan-hughes
Repo: dsccommunity/ActiveDirectoryDsc PR: 741
File: azure-pipelines.yml:104-104
Timestamp: 2025-08-10T15:11:52.897Z
Learning: In the ActiveDirectoryDsc project, HQRM (High Quality Resource Module) tests must run in PowerShell 5 (Windows PowerShell) using `pwsh: false` in the Azure Pipelines configuration, while unit tests can run in PowerShell 7 (PowerShell Core) with `pwsh: true`. This differentiation is intentional due to HQRM's specific requirements and dependencies on Windows PowerShell.
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/class-based-dsc-resources.mdcontent/blog/converting-tests-to-pester5.md
📚 Learning: 2025-08-28T15:44:12.628Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 2150
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:35-35
Timestamp: 2025-08-28T15:44:12.628Z
Learning: The repository uses RequiredModules.psd1 to specify Pester version requirements with RequiredVersion = 'latest', which ensures compatibility with Should -Invoke syntax (requires Pester 5.4+).
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/class-based-dsc-resources.mdcontent/blog/converting-tests-to-pester5.md
📚 Learning: 2025-11-27T18:00:35.078Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T18:00:35.078Z
Learning: Follow PowerShell style and test guideline instructions strictly
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/converting-tests-to-pester5.md
📚 Learning: 2025-08-28T15:44:12.628Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 2150
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:35-35
Timestamp: 2025-08-28T15:44:12.628Z
Learning: The SqlServerDsc repository uses RequiredModules.psd1 to specify Pester with Version = 'latest' and AllowPrerelease = $true, ensuring the latest Pester version (well beyond 5.4) is available, which supports Should -Invoke syntax and other modern Pester features.
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/class-based-dsc-resources.mdcontent/blog/converting-tests-to-pester5.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Use nested `Context` blocks for complex scenarios
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : PascalCase: `Describe`, `Context`, `It`, `Should`, `BeforeAll`, `BeforeEach`, `AfterAll`, `AfterEach`
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.mdcontent/blog/converting-tests-to-pester5.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Avoid unnecessary remove/recreate cycles
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Use `$PSDefaultParameterValues` only for Pester commands (`Describe`, `Context`, `It`, `Mock`, `Should`, `InModuleScope`)
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : All public commands, private functions and classes must have unit tests
Applied to files:
content/blog/convert-tests-to-pester5-for-dsc-community-repository.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Import localized strings using `Get-LocalizedData` at the module top level
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T18:00:35.078Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T18:00:35.078Z
Learning: Check DscResource.Common before creating private functions
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-10-04T21:33:23.022Z
Learnt from: dan-hughes
Repo: dsccommunity/UpdateServicesDsc PR: 85
File: source/en-US/UpdateServicesDsc.strings.psd1:1-2
Timestamp: 2025-10-04T21:33:23.022Z
Learning: In UpdateServicesDsc (and similar DSC modules), the module-level localization file (source/en-US/<ModuleName>.strings.psd1) can be empty when DSC resources have their own localization files in source/DSCResources/<ResourceName>/en-US/DSC_<ResourceName>.strings.psd1. Automated tests verify localization completeness for resources. Don't flag empty module-level localization files as issues when resources have separate localization.
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.mdcontent/blog/convert-a-module-for-continuous-delivery.en.md
📚 Learning: 2025-10-03T15:27:24.417Z
Learnt from: Borgquite
Repo: dsccommunity/UpdateServicesDsc PR: 78
File: source/DSCResources/MSFT_UpdateServicesComputerTargetGroup/MSFT_UpdateServicesComputerTargetGroup.psm1:9-22
Timestamp: 2025-10-03T15:27:24.417Z
Learning: In the UpdateServicesDsc repository, MOF-based DSC resources follow a minimal comment-based help convention that includes only .SYNOPSIS and .PARAMETER sections. The .DESCRIPTION, .INPUTS, and .OUTPUTS sections are intentionally omitted, even though functions have [OutputType()] attributes. This is consistent across all existing DSC resources: MSFT_UpdateServicesServer, MSFT_UpdateServicesCleanup, and MSFT_UpdateServicesApprovalRule.
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.mdcontent/blog/convert-a-module-for-continuous-delivery.en.mdcontent/blog/class-based-dsc-resources.mdcontent/help/_index.en.mdcontent/community/ownership.en.mdcontent/blog/DSC-is-dead-long-live-dsc.en.mdcontent/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-22T17:36:09.703Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 2343
File: source/Classes/004.DatabaseFileGroupSpec.ps1:5-34
Timestamp: 2025-11-22T17:36:09.703Z
Learning: The comment-based help requirements for ## Requirements and ## Known issues sections only apply to class-based DSC resources (classes decorated with [DscResource(...)]) in source/Classes/**/*.ps1, not to regular helper classes, DTO classes, or specification classes in the same directory.
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.mdcontent/blog/class-based-dsc-resources.mdcontent/help/_index.en.mdcontent/blog/DSC-is-dead-long-live-dsc.en.mdcontent/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Export functions using the `*-TargetResource` pattern
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.mdcontent/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use localized strings for all messages including Write-Verbose, Write-Error, and other messaging commands
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Unused mandatory parameters in `Set-TargetResource` and `Test-TargetResource` should include "Not used in <function_name>" in the help comment
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use names returned from `Get-UICulture` for additional language folder names in DSC resources
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Create an `en-US` folder in each DSC resource directory for localized strings
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-09-28T13:51:07.000Z
Learnt from: dan-hughes
Repo: dsccommunity/DhcpServerDsc PR: 96
File: source/Modules/DhcpServerDsc.Common/Public/New-TerminatingError.ps1:33-36
Timestamp: 2025-09-28T13:51:07.000Z
Learning: In DhcpServerDsc repository, the user dan-hughes prefers to use error functions from DscResource.Common instead of creating custom error handling functions like New-TerminatingError.
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use `try/catch` blocks to handle exceptions in MOF-based DSC resources
Applied to files:
content/blog/use-dscresource-common-functions-in-module.en.md
📚 Learning: 2025-10-11T08:35:56.141Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 2300
File: tests/Unit/DSC_SqlAGDatabase.Tests.ps1:22-22
Timestamp: 2025-10-11T08:35:56.141Z
Learning: In DSC Community projects, when writing error messages for missing DscResource.Test module dependency in unit test files (tests/[Uu]nit/**/*.[Tt]ests.ps1), the policy is: new code should instruct users to run ".\build.ps1 -Tasks noop" for quick test environment setup; existing code using ".\build.ps1 -Tasks build" is acceptable but slower since it also builds the project. The `noop` task is preferred as it assumes the module is already built before running tests, especially when tests run in a separate process.
Applied to files:
content/blog/convert-a-module-for-continuous-delivery.en.md
📚 Learning: 2025-11-27T17:58:08.884Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-changelog.instructions.md:0-0
Timestamp: 2025-11-27T17:58:08.884Z
Learning: Applies to CHANGELOG.md : Describe notable changes briefly in CHANGELOG.md, ≤2 items per change type
Applied to files:
content/community/contact.en.mdlayouts/_default/list.htmllayouts/_default/single.htmllayouts/index.htmlcontent/community/ownership.en.mdcontent/blog/convert-master-to-main.en.mdlayouts/community/maintainers.htmlconfig.tomlcontent/community/committee.en.mdcontent/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-09-28T13:22:40.783Z
Learnt from: dan-hughes
Repo: dsccommunity/DscResource.Base PR: 48
File: source/Classes/010.ResourceBase.ps1:150-156
Timestamp: 2025-09-28T13:22:40.783Z
Learning: Class-based DSC resources (source/[cC]lasses/**/*.ps1) do not require verbose banners in Set() method like MOF-based resources do. The focus should be on relevant state information only.
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must include comment-based help with .DESCRIPTION section containing Requirements and Known issues sections with a link to all open issues on GitHub
Applied to files:
content/blog/class-based-dsc-resources.mdcontent/help/_index.en.mdcontent/blog/DSC-is-dead-long-live-dsc.en.mdcontent/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must use `[Nullable[{FullTypeName}]]` syntax for value-type properties (e.g., `[Nullable[System.Int32]]`)
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : For state-changing functions, use `SupportsShouldProcess` attribute with `ConfirmImpact` set to 'Low', 'Medium', or 'High' depending on risk
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : Include .NOTES section in comment-based help only if it conveys critical info (constraints, side effects, security, version compatibility, breaking behavior). Keep to ≤2 short sentences
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : Avoid global variables except for `$global:DSCMachineStatus`
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T18:00:35.078Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T18:00:35.078Z
Learning: Applies to source/Classes/*.ps1 : DSC resources should always be created as class-based resources
Applied to files:
content/blog/class-based-dsc-resources.mdcontent/community/ownership.en.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : Use CIM commands instead of WMI commands
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-08-10T15:13:46.414Z
Learnt from: dan-hughes
Repo: dsccommunity/ActiveDirectoryDsc PR: 741
File: RequiredModules.psd1:12-12
Timestamp: 2025-08-10T15:13:46.414Z
Learning: The ActiveDirectoryDsc project is planning to migrate from PSDepend to ModuleFast for module management. Version pinning will be implemented after this migration is complete, as ModuleFast provides better support for version control through lockfiles and declarative specifications.
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-10-03T15:27:39.511Z
Learnt from: Borgquite
Repo: dsccommunity/UpdateServicesDsc PR: 78
File: source/DSCResources/MSFT_UpdateServicesComputerTargetGroup/MSFT_UpdateServicesComputerTargetGroup.psm1:91-109
Timestamp: 2025-10-03T15:27:39.511Z
Learning: For MOF-based DSC resources in DSC Community repositories (files matching `source/DSCResources/MSFT_*/MSFT_*.psm1`), the comment-based help for `Get-TargetResource`, `Set-TargetResource`, and `Test-TargetResource` functions should NOT include `.OUTPUTS` sections, even though the general PowerShell guidelines require them. This is an established pattern in the DSC Community.
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/020.*.ps1 : DSC class-based resources must use the file naming pattern `source/Classes/020.{ResourceName}.ps1`
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must inherit from `ResourceBase` class from the DscResource.Base module
Applied to files:
content/blog/class-based-dsc-resources.mdcontent/community/ownership.en.md
📚 Learning: 2025-08-09T19:29:36.323Z
Learnt from: johlju
Repo: dsccommunity/DscResource.Test PR: 167
File: source/Private/Test-FileContainsClassResource.ps1:44-56
Timestamp: 2025-08-09T19:29:36.323Z
Learning: In the DscResource.Test repository, DSC resource attributes are consistently written as `[DscResource(...)]` rather than using variations like `[DscResourceAttribute()]` or fully qualified names like `[Microsoft.PowerShell.DesiredStateConfiguration.DscResource()]`. The Test-FileContainsClassResource function should focus on detecting the standard `[DscResource(...)]` pattern that is actually used in the codebase.
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use `New-ObjectNotFoundException` for object not found errors instead of `throw` in MOF-based DSC resources
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-12-04T17:07:00.186Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-powershell.instructions.md:0-0
Timestamp: 2025-12-04T17:07:00.186Z
Learning: Applies to **/*.{ps1,psm1,psd1} : Use full type names when type casting
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must implement a required constructor with signature `ResourceName () : base ($PSScriptRoot)` and populate `$this.ExcludeDscProperties` array
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must implement required methods: `Get()`, `Test()`, `Set()`, `GetCurrentState()`, and `Modify()` following the specified pattern
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:01.508Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-mof-resources.instructions.md:0-0
Timestamp: 2025-11-27T17:59:01.508Z
Learning: Applies to source/DSCResources/**/*.psm1 : Use `New-NotImplementedException` for not implemented errors instead of `throw` in MOF-based DSC resources
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources may optionally implement methods: `AssertProperties()` and `NormalizeProperties()` following the specified pattern
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:20.404Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-class-resource.instructions.md:0-0
Timestamp: 2025-11-27T17:58:20.404Z
Learning: Applies to source/[cC]lasses/**/*.ps1 : DSC class-based resources must use `New-*Exception` commands (such as `New-InvalidDataException`, `New-ArgumentException`, `New-InvalidOperationException`, `New-ObjectNotFoundException`, `New-InvalidResultException`, `New-NotImplementedException`) instead of `throw` for terminating errors in classes
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to tests/Unit/Classes/*.[Tt]ests.ps1 : Class resources: `tests/Unit/Classes/{Name}.Tests.ps1`
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Never use `Mock` inside `InModuleScope`-block
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Mocking in `BeforeAll` (`BeforeEach` only when required)
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Applies to **/tests/**/*.tests.ps1 : In unit tests: use SMO stub types from SMO.cs, never mock SMO types
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-10-10T14:01:42.703Z
Learnt from: dan-hughes
Repo: dsccommunity/UpdateServicesDsc PR: 86
File: tests/Unit/MSFT_UpdateServicesServer.Tests.ps1:6-45
Timestamp: 2025-10-10T14:01:42.703Z
Learning: For script-based (MOF) DSC resources in UpdateServicesDsc, unit tests should use Initialize-TestEnvironment with variables $script:dscModuleName and $script:dscResourceName, and set -ResourceType 'Mof'. This differs from class-based resource tests which use the simpler $script:moduleName template without Initialize-TestEnvironment.
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Applies to **/tests/**/*.tests.ps1 : When unit tests test classes or commands containing SMO types like `[Microsoft.SqlServer.Management.Smo.*]`, ensure they are properly stubbed in SMO.cs
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:58:31.910Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-integration-tests.instructions.md:0-0
Timestamp: 2025-11-27T17:58:31.910Z
Learning: Applies to tests/Integration/**/*.Integration.Tests.ps1 : Integration tests must not use mocking - use real environment only
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T18:56:46.759Z
Learnt from: johlju
Repo: dsccommunity/SqlServerDsc PR: 1622
File: tests/Integration/DSC_SqlDatabase.Integration.Tests.ps1:1-30
Timestamp: 2025-11-27T18:56:46.759Z
Learning: Integration tests for MOF-based DSC resources (located in source/DSCResources/**) should use the Initialize-TestEnvironment pattern with -ResourceType 'Mof', not the BeforeDiscovery/BeforeAll pattern. The BeforeDiscovery/BeforeAll pattern is for class-based resources only.
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Omit `-MockWith` when returning `$null`
Applied to files:
content/blog/class-based-dsc-resources.md
📚 Learning: 2025-11-27T17:59:27.205Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines-pester.instructions.md:0-0
Timestamp: 2025-11-27T17:59:27.205Z
Learning: Applies to **/*.[Tt]ests.ps1 : Spacing between blocks, arrange, act, and assert for readability
Applied to files:
content/blog/converting-tests-to-pester5.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Run tests with coverage using `Invoke-PesterJob -Path '{tests filepath}' -EnableSourceLineMapping -FilterCodeCoverageResult '{pattern}'`
Applied to files:
content/blog/add-codecov-support-to-repository.md
📚 Learning: 2025-11-27T18:00:35.078Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/dsc-community-style-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T18:00:35.078Z
Learning: Build project before running tests using `./build.ps1 -Tasks build`
Applied to files:
content/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Build project before running tests: execute `./build.ps1 -Tasks build`
Applied to files:
content/blog/updating-sampler-github-tasks.md
📚 Learning: 2025-11-27T17:58:02.422Z
Learnt from: CR
Repo: dsccommunity/SqlServerDsc PR: 0
File: .github/instructions/SqlServerDsc-guidelines.instructions.md:0-0
Timestamp: 2025-11-27T17:58:02.422Z
Learning: Applies to **/tests/Integration/**/*.ps1 : Integration tests: use `Connect-SqlDscDatabaseEngine` for SQL Server DB session with correct CI credentials, and always follow with `Disconnect-SqlDscDatabaseEngine`
Applied to files:
content/blog/updating-sampler-github-tasks.md
🪛 Biome (2.1.2)
assets/css/futuristic.css
[error] 1186-1187: Expected a selector but instead found '@'.
Expected a selector here.
(parse)
[error] 1187-1187: expected , but instead found media
Remove media
(parse)
[error] 1187-1187: Expected a compound selector but instead found '('.
Expected a compound selector here.
(parse)
[error] 1187-1187: expected , but instead found prefers-color-scheme
Remove prefers-color-scheme
(parse)
[error] 1187-1187: expected , but instead found )
Remove )
(parse)
[error] 1187-1187: Unknown type selector is not allowed.
See MDN web docs for more details.
Consider replacing the unknown type selector with valid one.
(lint/correctness/noUnknownTypeSelector)
[error] 1187-1187: Unexpected unknown pseudo-class dark
See MDN web docs for more details.
(lint/correctness/noUnknownPseudoClass)
🪛 LanguageTool
content/blog/convert-a-module-for-continuous-delivery.en.md
[grammar] ~10-~10: Use a hyphen to join words.
Context: ...parallel jobs on a free account for open source projects. You are welcome to sha...
(QB_NEW_EN_HYPHEN)
content/blog/class-based-dsc-resources.md
[style] ~116-~116: Consider a different adverb to strengthen your wording.
Context: ... (aka sub-type, nested type), you can't always change the code invoking it (say the LC...
(ALWAYS_CONSTANTLY)
[style] ~127-~127: Consider using a synonym to be more concise.
Context: ...ty scenarios. Obviously, there's still a lot of differences between PS5.1 and PS7 which...
(A_LOT_OF)
[style] ~256-~256: As an alternative to the over-used intensifier ‘really’, consider replacing this phrase.
Context: ...ng new contributors. # Conclusion I'm really happy with the current plan, and how the cons...
(EN_WEAK_ADJECTIVE)
[grammar] ~257-~257: Ensure spelling is correct
Context: ...uration team, and I'm grateful for that priviledge. In the GitHub issue Steve Lee clarifi...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
content/blog/DSC-is-dead-long-live-dsc.en.md
[uncategorized] ~12-~12: The official name of this popular video platform is spelled with a capital “T”.
Context: ...Guest Configuration and Azure Arc. {{< youtube id="hXS-rzs3Hak" >}} Here's a quick ta...
(YOUTUBE)
content/blog/updating-sampler-github-tasks.md
[style] ~8-~8: Consider using a synonym to be more concise.
Context: ...st" draft: false author: gaelcolas --- A lot of improvements have been made to the Samp...
(A_LOT_OF)
🪛 markdownlint-cli2 (0.18.1)
content/blog/DSC-is-dead-long-live-dsc.en.md
17-17: Ordered list item prefix
Expected: 1; Actual: 2; Style: 1/1/1
(MD029, ol-prefix)
18-18: Ordered list item prefix
Expected: 1; Actual: 3; Style: 1/1/1
(MD029, ol-prefix)
19-19: Ordered list item prefix
Expected: 1; Actual: 4; Style: 1/1/1
(MD029, ol-prefix)
20-20: Ordered list item prefix
Expected: 1; Actual: 5; Style: 1/1/1
(MD029, ol-prefix)
21-21: Ordered list item prefix
Expected: 1; Actual: 6; Style: 1/1/1
(MD029, ol-prefix)
25-25: Ordered list item prefix
Expected: 1; Actual: 7; Style: 1/1/1
(MD029, ol-prefix)
26-26: Ordered list item prefix
Expected: 1; Actual: 8; Style: 1/1/1
(MD029, ol-prefix)
27-27: Ordered list item prefix
Expected: 1; Actual: 9; Style: 1/1/1
(MD029, ol-prefix)
| [data-theme="dark"] .timeline-year-header, | ||
| @media (prefers-color-scheme: dark) { | ||
| :root:not([data-theme="light"]) .timeline-year-header { | ||
| background: var(--bg-primary); | ||
| } | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Critical: Invalid CSS syntax causing parse errors.
The static analysis correctly identified that lines 1186-1191 contain invalid CSS syntax. You cannot nest a @media query inside a selector block in standard CSS. This will cause parsing to fail and potentially break subsequent styles.
🔎 Proposed fix
[data-theme="dark"] .timeline-year-header,
-@media (prefers-color-scheme: dark) {
- :root:not([data-theme="light"]) .timeline-year-header {
- background: var(--bg-primary);
- }
+[data-theme="dark"] .timeline-year-header {
+ background: var(--bg-primary);
+}
+
+@media (prefers-color-scheme: dark) {
+ :root:not([data-theme="light"]) .timeline-year-header {
+ background: var(--bg-primary);
+ }
}🧰 Tools
🪛 Biome (2.1.2)
[error] 1186-1187: Expected a selector but instead found '@'.
Expected a selector here.
(parse)
[error] 1187-1187: expected , but instead found media
Remove media
(parse)
[error] 1187-1187: Expected a compound selector but instead found '('.
Expected a compound selector here.
(parse)
[error] 1187-1187: expected , but instead found prefers-color-scheme
Remove prefers-color-scheme
(parse)
[error] 1187-1187: expected , but instead found )
Remove )
(parse)
[error] 1187-1187: Unknown type selector is not allowed.
See MDN web docs for more details.
Consider replacing the unknown type selector with valid one.
(lint/correctness/noUnknownTypeSelector)
[error] 1187-1187: Unexpected unknown pseudo-class dark
See MDN web docs for more details.
(lint/correctness/noUnknownPseudoClass)
🤖 Prompt for AI Agents
In assets/css/futuristic.css around lines 1186 to 1191, the CSS incorrectly
nests a @media rule inside a selector which is invalid; split the nested
structure into two separate, valid rules: one rule targeting [data-theme="dark"]
.timeline-year-header and a separate @media (prefers-color-scheme: dark) block
that contains the :root:not([data-theme="light"]) .timeline-year-header
selector, each setting background: var(--bg-primary), so the media query is not
placed inside a selector block.
| const matches = searchIndex | ||
| .filter((item) => item.title.toLowerCase().includes(query)) | ||
| .slice(0, 10); | ||
|
|
||
| if (matches.length === 0) { | ||
| results.innerHTML = ` | ||
| <div style="padding: var(--space-6); text-align: center; color: var(--text-tertiary);"> | ||
| No results found for "${query}" | ||
| </div> | ||
| `; | ||
| return; | ||
| } | ||
|
|
||
| results.innerHTML = matches | ||
| .map( | ||
| (item, index) => ` | ||
| <a href="${item.url}" class="search-result-item${ | ||
| index === 0 ? " focused" : "" | ||
| }" data-index="${index}"> | ||
| <div class="search-result-icon"> | ||
| <i class="ri-file-text-line"></i> | ||
| </div> | ||
| <div class="search-result-content"> | ||
| <div class="search-result-title">${highlightMatch( | ||
| item.title, | ||
| query | ||
| )}</div> | ||
| <div class="search-result-path">${item.section}</div> | ||
| </div> | ||
| </a> | ||
| ` | ||
| ) | ||
| .join(""); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
XSS vulnerability: User input and link text are rendered without HTML escaping.
- Line 236: The
queryvariable (user input) is directly interpolated into innerHTML without escaping HTML entities. - Lines 245-256:
item.titleanditem.urlfrom DOM elements are rendered without sanitization. Malicious content orjavascript:URIs in page links would be executed.
Proposed fix - add HTML escaping
Add an escapeHtml utility:
+function escapeHtml(text) {
+ const div = document.createElement("div");
+ div.textContent = text;
+ return div.innerHTML;
+}Then use it in handleSearch:
if (matches.length === 0) {
results.innerHTML = `
<div style="padding: var(--space-6); text-align: center; color: var(--text-tertiary);">
- No results found for "${query}"
+ No results found for "${escapeHtml(query)}"
</div>
`;
return;
}
results.innerHTML = matches
.map(
(item, index) => `
- <a href="${item.url}" class="search-result-item${
+ <a href="${escapeHtml(item.url)}" class="search-result-item${
index === 0 ? " focused" : ""
}" data-index="${index}">
<div class="search-result-icon">
<i class="ri-file-text-line"></i>
</div>
<div class="search-result-content">
<div class="search-result-title">${highlightMatch(
- item.title,
+ escapeHtml(item.title),
query
)}</div>
- <div class="search-result-path">${item.section}</div>
+ <div class="search-result-path">${escapeHtml(item.section)}</div>
</div>
</a>
`
)
.join("");Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In assets/js/main.js around lines 229 to 261, user input and item fields are
directly interpolated into innerHTML causing an XSS risk: escape and sanitize
the values before inserting into the DOM. Add an escapeHtml utility and use it
for the query shown in the "No results" message and for item.title when
rendering results (or render text via textContent instead of raw HTML). For
item.url, validate/sanitize the href to disallow dangerous schemes like
"javascript:" (whitelist only http(s) and safe relative paths) before assigning
to the anchor; alternatively set the link via element.href programmatically
after validation and add rel="noopener noreferrer". Ensure highlightMatch uses
escaped HTML or returns safe HTML fragments derived from escaped text.
| function initSmoothScroll() { | ||
| document.querySelectorAll('a[href^="#"]').forEach((anchor) => { | ||
| anchor.addEventListener("click", function (e) { | ||
| const targetId = this.getAttribute("href"); | ||
| if (targetId === "#") return; | ||
|
|
||
| const target = document.querySelector(targetId); | ||
| if (target) { | ||
| e.preventDefault(); | ||
| target.scrollIntoView({ behavior: "smooth" }); | ||
|
|
||
| // Update URL | ||
| history.pushState(null, null, targetId); | ||
| } | ||
| }); | ||
| }); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add error handling for querySelector with invalid selectors.
If targetId contains characters invalid in CSS selectors (e.g., #foo:bar), document.querySelector(targetId) throws a SyntaxError. Consider wrapping in try-catch.
Proposed fix
function initSmoothScroll() {
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener("click", function (e) {
const targetId = this.getAttribute("href");
if (targetId === "#") return;
- const target = document.querySelector(targetId);
- if (target) {
- e.preventDefault();
- target.scrollIntoView({ behavior: "smooth" });
-
- // Update URL
- history.pushState(null, null, targetId);
+ try {
+ const target = document.querySelector(targetId);
+ if (target) {
+ e.preventDefault();
+ target.scrollIntoView({ behavior: "smooth" });
+ history.pushState(null, null, targetId);
+ }
+ } catch {
+ // Invalid selector - let browser handle navigation
}
});
});
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| function initSmoothScroll() { | |
| document.querySelectorAll('a[href^="#"]').forEach((anchor) => { | |
| anchor.addEventListener("click", function (e) { | |
| const targetId = this.getAttribute("href"); | |
| if (targetId === "#") return; | |
| const target = document.querySelector(targetId); | |
| if (target) { | |
| e.preventDefault(); | |
| target.scrollIntoView({ behavior: "smooth" }); | |
| // Update URL | |
| history.pushState(null, null, targetId); | |
| } | |
| }); | |
| }); | |
| } | |
| function initSmoothScroll() { | |
| document.querySelectorAll('a[href^="#"]').forEach((anchor) => { | |
| anchor.addEventListener("click", function (e) { | |
| const targetId = this.getAttribute("href"); | |
| if (targetId === "#") return; | |
| try { | |
| const target = document.querySelector(targetId); | |
| if (target) { | |
| e.preventDefault(); | |
| target.scrollIntoView({ behavior: "smooth" }); | |
| history.pushState(null, null, targetId); | |
| } | |
| } catch { | |
| // Invalid selector - let browser handle navigation | |
| } | |
| }); | |
| }); | |
| } |
🤖 Prompt for AI Agents
In assets/js/main.js around lines 324 to 340, querySelector(targetId) can throw
a SyntaxError for invalid CSS selector strings; change the logic to avoid
calling querySelector with raw targetId: if targetId starts with "#" use
document.getElementById(targetId.slice(1)) to retrieve the element (this avoids
selector parsing), otherwise wrap document.querySelector(targetId) in a
try-catch and handle SyntaxError gracefully (skip scrolling and do not call
history.pushState if no valid target), ensuring existing behavior only runs when
a valid element is found.
|
|
||
| I'm really happy with the current plan, and how the consultation was executed by the PowerShell team. | ||
| I'm really happy with the current plan, and how the consultation was executed by the PowerShell team. | ||
| I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that priviledge. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix spelling error: "priviledge" → "privilege".
Line 257 contains a misspelling. "Priviledge" should be "privilege".
🔎 Proposed fix
- I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that priviledge.
+ I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that privilege.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that priviledge. | |
| I'm lucky to be working closely with them through my work with the Guest Configuration team, and I'm grateful for that privilege. |
🧰 Tools
🪛 LanguageTool
[grammar] ~257-~257: Ensure spelling is correct
Context: ...uration team, and I'm grateful for that priviledge. In the GitHub issue Steve Lee clarifi...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🤖 Prompt for AI Agents
In content/blog/class-based-dsc-resources.md around line 257, the word
"priviledge" is misspelled; replace it with the correct spelling "privilege" so
the sentence reads "...and I'm grateful for that privilege."
|
|
||
| If you have any questions or suggestions around this blog post then please | ||
| reach out to `@johlju` in the Virtual PowerShell User Group [#DSC channel](https://dsccommunity.org/community/contact/). | ||
| Pester 5 introduces significant improvements along with breaking changes from version 4. This guide covers migrating your Pester tests to the new syntax, understanding the breaking changes, and applying best practices for the updated testing framework. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wrap lines at word boundaries per Markdown style guidelines.
Line 9 significantly exceeds the 80-character limit and should be wrapped at word boundaries. Per coding guidelines, markdown lines must wrap at word boundaries when over 80 characters (except tables/code blocks).
🔎 Proposed fix for line wrapping
-Pester 5 introduces significant improvements along with breaking changes from version 4. This guide covers migrating your Pester tests to the new syntax, understanding the breaking changes, and applying best practices for the updated testing framework.
+Pester 5 introduces significant improvements along with breaking changes from
+version 4. This guide covers migrating your Pester tests to the new syntax,
+understanding the breaking changes, and applying best practices for the
+updated testing framework.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| Pester 5 introduces significant improvements along with breaking changes from version 4. This guide covers migrating your Pester tests to the new syntax, understanding the breaking changes, and applying best practices for the updated testing framework. | |
| Pester 5 introduces significant improvements along with breaking changes from | |
| version 4. This guide covers migrating your Pester tests to the new syntax, | |
| understanding the breaking changes, and applying best practices for the | |
| updated testing framework. |
🤖 Prompt for AI Agents
In content/blog/converting-tests-to-pester5.md around line 9, the sentence
exceeds the 80-character limit and must be wrapped at word boundaries; split the
long sentence into two (or more) lines so no line is longer than 80 characters,
ensuring breaks occur between words (not mid-word) and preserving the original
punctuation and meaning.
| {{ range sort $.Site.Data.maintainers "accountName" }} {{ $data := | ||
| dict }} {{ $path := printf "https://api.github.com/users/%s" | ||
| .accountName }} {{ with resources.GetRemote $path }} {{ with | ||
| .Content | transform.Unmarshal }} {{ $data = . }} {{ end }} {{ else | ||
| }} {{ errorf "Unable to get global resource %q" $path }} {{ end }} | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Build reliability: errorf will fail builds on GitHub API issues.
Using errorf means your build will fail if GitHub's API is rate-limited, temporarily unavailable, or if a maintainer account is renamed/deleted. This could block deployments.
Consider using warnf with a graceful fallback to show the card with limited info instead.
🔎 Proposed fix with graceful degradation
{{ range sort $.Site.Data.maintainers "accountName" }} {{ $data :=
dict }} {{ $path := printf "https://api.github.com/users/%s"
- .accountName }} {{ with resources.GetRemote $path }} {{ with
- .Content | transform.Unmarshal }} {{ $data = . }} {{ end }} {{ else
- }} {{ errorf "Unable to get global resource %q" $path }} {{ end }}
+ .accountName }}
+ {{ with resources.GetRemote $path }}
+ {{ with .Content | transform.Unmarshal }}
+ {{ $data = . }}
+ {{ end }}
+ {{ else }}
+ {{ warnf "Unable to get GitHub user data for %s" .accountName }}
+ {{ $data = dict "login" .accountName "avatar_url" "" "name" .accountName }}
+ {{ end }}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| {{ range sort $.Site.Data.maintainers "accountName" }} {{ $data := | |
| dict }} {{ $path := printf "https://api.github.com/users/%s" | |
| .accountName }} {{ with resources.GetRemote $path }} {{ with | |
| .Content | transform.Unmarshal }} {{ $data = . }} {{ end }} {{ else | |
| }} {{ errorf "Unable to get global resource %q" $path }} {{ end }} | |
| {{ range sort $.Site.Data.maintainers "accountName" }} {{ $data := | |
| dict }} {{ $path := printf "https://api.github.com/users/%s" | |
| .accountName }} | |
| {{ with resources.GetRemote $path }} | |
| {{ with .Content | transform.Unmarshal }} | |
| {{ $data = . }} | |
| {{ end }} | |
| {{ else }} | |
| {{ warnf "Unable to get GitHub user data for %s" .accountName }} | |
| {{ $data = dict "login" .accountName "avatar_url" "" "name" .accountName }} | |
| {{ end }} |
🤖 Prompt for AI Agents
In layouts/community/maintainers.html around lines 63 to 68, the template
currently calls errorf when resources.GetRemote fails which will abort the Hugo
build on transient GitHub API errors; change the flow to log a warning instead
and provide a graceful fallback: replace errorf with warnf, set $data to a
minimal dict containing at least the accountName (and any other static fallback
fields you need), and continue rendering the maintainer card with the limited
data so builds do not fail when the GitHub API is rate-limited or the remote
resource is unavailable.
| <a | ||
| href="https://github.com/{{ .accountName }}" | ||
| target="_blank" | ||
| style=" | ||
| text-decoration: none; | ||
| color: var(--text-primary); | ||
| font-weight: 600; | ||
| " | ||
| > | ||
| {{ with $data.name }} {{ $data.name }} {{ else }} {{ | ||
| $data.login }} {{ end }} | ||
| </a> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Add rel="noopener" to external links with target="_blank".
The GitHub profile link is missing rel="noopener" which is a security and performance best practice for links that open in new tabs.
🔎 Proposed fix
<a
href="https://github.com/{{ .accountName }}"
target="_blank"
+ rel="noopener"
style="
text-decoration: none;
color: var(--text-primary);
font-weight: 600;
"
>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <a | |
| href="https://github.com/{{ .accountName }}" | |
| target="_blank" | |
| style=" | |
| text-decoration: none; | |
| color: var(--text-primary); | |
| font-weight: 600; | |
| " | |
| > | |
| {{ with $data.name }} {{ $data.name }} {{ else }} {{ | |
| $data.login }} {{ end }} | |
| </a> | |
| <a | |
| href="https://github.com/{{ .accountName }}" | |
| target="_blank" | |
| rel="noopener" | |
| style=" | |
| text-decoration: none; | |
| color: var(--text-primary); | |
| font-weight: 600; | |
| " | |
| > | |
| {{ with $data.name }} {{ $data.name }} {{ else }} {{ | |
| $data.login }} {{ end }} | |
| </a> |
🤖 Prompt for AI Agents
In layouts/community/maintainers.html around lines 87 to 98, the anchor that
opens the GitHub profile in a new tab (target="_blank") lacks the rel attribute;
update the <a> tag to include rel="noopener" (or rel="noopener noreferrer" if
you want broader protection) while keeping the existing href, target, style and
template expressions unchanged so the link preserves behavior and template
interpolation.
| " | ||
| > | ||
| {{ $data.bio | safeHTML }} | ||
| </p> | ||
| {{ end }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Security: Potential XSS vulnerability with safeHTML on GitHub bio.
Using | safeHTML on $data.bio allows any HTML/JavaScript in GitHub user bios to be rendered unescaped. While GitHub does sanitize bios in their UI, the API returns the raw content. If a maintainer's bio contains malicious content, it would be injected into your site.
Consider using | markdownify instead, or remove safeHTML entirely to let Hugo escape the content.
🔎 Proposed fix
<p
style="
font-size: var(--text-sm);
color: var(--text-secondary);
margin-top: var(--space-2);
"
>
- {{ $data.bio | safeHTML }}
+ {{ $data.bio }}
</p>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| " | |
| > | |
| {{ $data.bio | safeHTML }} | |
| </p> | |
| {{ end }} | |
| " | |
| > | |
| {{ $data.bio }} | |
| </p> | |
| {{ end }} |
🤖 Prompt for AI Agents
In layouts/community/maintainers.html around lines 154 to 158, the template uses
"{{ $data.bio | safeHTML }}" which can introduce XSS by rendering raw HTML from
GitHub bios; replace the use of safeHTML with a safe renderer such as "{{
$data.bio | markdownify }}" or remove the filter entirely so Hugo escapes the
content by default; if you must allow limited HTML, pass the bio through a
proper sanitizer before marking it safe, otherwise use markdownify or plain
output to prevent injection.
| {{ else }} | ||
| <li class="nav-item"> | ||
| <a | ||
| href="{{ .URL }}" | ||
| class="nav-link{{ if eq $.RelPermalink .URL }} active{{ end }}" | ||
| > | ||
| {{ .Name }} | ||
| </a> | ||
| </li> | ||
| {{ end }} {{ end }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Active state not applied when viewing dropdown child pages.
Line 82 applies the active class only for nav items without children: {{ if eq $.RelPermalink .URL }}. When a user is on a child page (e.g., /community/maintainers), the parent dropdown item "Categories" won't show an active state, which may confuse users about their location.
🔎 Proposed fix
For items with children, check if the current URL is a prefix of the parent URL:
{{ if .HasChildren }}
<li class="nav-item">
<a
href="{{ .URL }}"
- class="nav-link"
+ class="nav-link{{ if hasPrefix $.RelPermalink .URL }} active{{ end }}"
aria-haspopup="true"
aria-expanded="false"
>Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In layouts/partials/header-new.html around lines 78 to 87, the nav-item "active"
class is only applied for exact matches so parent dropdowns stay inactive when a
child page is open; update the condition that builds the nav-link class to also
treat the parent as active when the current page URL is a child (e.g., use a
logical OR: exact match OR current page permalink has the parent URL as a
prefix), and normalize trailing slashes (or ensure both values end with a slash)
before the prefix check so parent items get the active state when visiting any
of their child pages.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (4)
assets/css/futuristic.css (1)
1202-1207: Critical: Invalid CSS syntax causing parse errors.The static analysis correctly identified that lines 1202-1207 contain invalid CSS syntax. You cannot nest a
@mediaquery inside a selector block in standard CSS. This will cause parsing to fail and potentially break subsequent styles.🔎 Proposed fix
-[data-theme="dark"] .timeline-year-header, -@media (prefers-color-scheme: dark) { - :root:not([data-theme="light"]) .timeline-year-header { - background: var(--bg-primary); - } -} +[data-theme="dark"] .timeline-year-header { + background: var(--bg-primary); +} + +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) .timeline-year-header { + background: var(--bg-primary); + } +}layouts/partials/header-new.html (1)
34-77: Active state not applied when viewing dropdown child pages.For items with children, the
activeclass is never applied to the parent nav-link. When a user navigates to a child page (e.g.,/community/maintainers), the parent dropdown won't show an active state, which may confuse users about their current location in the site hierarchy.🔎 Proposed fix
<li class="nav-item"> <a href="{{ .URL }}" - class="nav-link" + class="nav-link{{ if hasPrefix $.RelPermalink .URL }} active{{ end }}" aria-haspopup="true" aria-expanded="false" >assets/js/main.js (2)
243-276: XSS vulnerability: User input and search data rendered without HTML escaping.The
queryvariable (user input) anditem.title,item.url,item.sectionare directly interpolated into innerHTML without escaping. Whileitem.*values currently come from internal DOM links, this pattern is unsafe:
- Line 250:
"${query}"- direct user input- Lines 259-270:
item.url,item.title,item.section- could contain HTML🔎 Proposed fix: Add HTML escaping
function escapeHtml(text) { const div = document.createElement("div"); div.textContent = text; return div.innerHTML; }Then use it:
- No results found for "${query}" + No results found for "${escapeHtml(query)}"- <a href="${item.url}" class="search-result-item${ + <a href="${escapeHtml(item.url)}" class="search-result-item${For
highlightMatch, escape before highlighting:function highlightMatch(text, query) { const escaped = escapeHtml(text); const escapedQuery = escapeHtml(query); const regex = new RegExp(`(${escapeRegex(escapedQuery)})`, "gi"); return escaped.replace(regex, '<mark>$1</mark>'); }
338-354: Add error handling forquerySelectorwith invalid selectors.If
targetIdcontains characters invalid in CSS selectors (e.g.,#foo:bar),document.querySelector(targetId)throws aSyntaxError.🔎 Proposed fix: Use getElementById or try-catch
function initSmoothScroll() { document.querySelectorAll('a[href^="#"]').forEach((anchor) => { anchor.addEventListener("click", function (e) { const targetId = this.getAttribute("href"); if (targetId === "#") return; - const target = document.querySelector(targetId); - if (target) { + // Use getElementById to avoid selector parsing issues + const target = document.getElementById(targetId.slice(1)); + if (target) { e.preventDefault(); target.scrollIntoView({ behavior: "smooth" }); - - // Update URL history.pushState(null, null, targetId); } }); }); }
🧹 Nitpick comments (7)
assets/css/futuristic.css (2)
847-848: Consider addingprefers-reduced-motionsupport for animations.The grid and orb animations (
gridFloat,orbFloat) run continuously. Users who prefer reduced motion may find this distracting or triggering.🔎 Proposed addition
Add this after the animation keyframes:
@media (prefers-reduced-motion: reduce) { .hero-grid, .hero-orb { animation: none; } .animate-fade-in-up, .animate-fade-in, .animate-slide-in-left { animation: none; opacity: 1; } .stagger > * { animation: none; opacity: 1; } }
1967-1990: Stagger animation has limited child support.The stagger animation only defines delays for children 1-6. If a container has more than 6 children, they'll all animate together after the 6th.
🔎 Optional: Extend stagger delays or use CSS custom properties
Consider using a CSS variable approach for more flexibility:
.stagger > * { --stagger-index: 0; opacity: 0; animation: fadeInUp 0.5s ease-out forwards; animation-delay: calc(var(--stagger-index) * 0.1s); }Then set
--stagger-indexvia JavaScript or Hugo templating on each child.layouts/partials/header-new.html (2)
6-29: Potential SVG gradient ID collision.The inline SVG uses
id="logo-gradient"for the linear gradient. If this header partial is included multiple times on a page or if another SVG uses the same ID, it could cause rendering issues.🔎 Proposed fix: Use a more unique ID
- <linearGradient id="logo-gradient" x1="0" y1="0" x2="32" y2="32"> + <linearGradient id="dsc-logo-gradient" x1="0" y1="0" x2="32" y2="32">And update the reference:
- <rect width="32" height="32" rx="8" fill="url(#logo-gradient)" /> + <rect width="32" height="32" rx="8" fill="url(#dsc-logo-gradient)" />
154-170: Semantic class mismatch: GitHub link uses.theme-toggleclass.The GitHub link reuses the
.theme-toggleclass for styling, but this is semantically misleading. Consider creating a dedicated class or a more generic one like.header-icon-button.🔎 Proposed fix
In the CSS, add a shared base class:
.header-icon-btn { display: flex; align-items: center; justify-content: center; width: 40px; height: 40px; background: none; border: none; border-radius: var(--radius-md); cursor: pointer; color: var(--text-secondary); transition: all var(--transition-fast); } .header-icon-btn:hover { background-color: var(--bg-tertiary); color: var(--text-primary); }Then update the HTML:
- class="theme-toggle" + class="header-icon-btn"assets/js/main.js (3)
85-106: Unused variable:lastScrollis assigned but never read.The
lastScrollvariable is updated on each scroll event but its value is never used for any logic (like hide-on-scroll-down behavior).🔎 Proposed fix: Remove unused variable or implement hide-on-scroll
If you don't plan to use it:
function initHeader() { const header = document.getElementById("siteHeader"); if (!header) return; - let lastScroll = 0; - window.addEventListener( "scroll", () => { const currentScroll = window.pageYOffset; if (currentScroll > 50) { header.classList.add("scrolled"); } else { header.classList.remove("scrolled"); } - - lastScroll = currentScroll; }, { passive: true } ); }
164-183: Search index built from all DOM links may include unintended entries.
buildSearchIndexcollects every<a href>starting with/, which may include duplicate entries, navigation links, footer links, or other non-content links. This could clutter search results.🔎 Consider filtering by content area or using Hugo-generated JSON
Option 1: Filter by content area:
function buildSearchIndex() { const contentArea = document.querySelector('.main-content, .article-content, main'); const links = contentArea ? contentArea.querySelectorAll("a[href]") : document.querySelectorAll("a[href]"); // ... rest of logic }Option 2: Generate a search index via Hugo (more robust):
Create alayouts/_default/index.jsonthat outputs structured page data, then fetch it in JS.
359-381: Animation initialization sets inline opacity, which may flash content.Setting
el.style.opacity = "0"via JavaScript after DOM load may cause a brief flash of content before it's hidden. Consider using a CSS class instead.🔎 Proposed approach
Add CSS:
.animate-on-scroll { opacity: 0; }Then in JS:
document .querySelectorAll(".card, .feature-card, .timeline-card") .forEach((el) => { - el.style.opacity = "0"; + el.classList.add("animate-on-scroll"); observer.observe(el); });And update the animation:
.animate-on-scroll.animate-fade-in-up { opacity: 1; }
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
assets/css/futuristic.css(1 hunks)assets/js/main.js(1 hunks)layouts/partials/header-new.html(1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**
⚙️ CodeRabbit configuration file
**: # DSC Community GuidelinesTerminology
- Command: Public command
- Function: Private function
- Resource: DSC class-based resource
Build & Test Workflow Requirements
- Run PowerShell script files from repository root
- Setup build and test environment (once per
pwshsession):./build.ps1 -Tasks noop- Build project before running tests:
./build.ps1 -Tasks build- Always run tests in new
pwshsession:Invoke-Pester -Path @({test paths}) -Output DetailedFile Organization
- Public commands:
source/Public/{CommandName}.ps1- Private functions:
source/Private/{FunctionName}.ps1- Classes:
source/Classes/{DependencyGroupNumber}.{ClassName}.ps1- Enums:
source/Enum/{DependencyGroupNumber}.{EnumName}.ps1- Unit tests:
tests/Unit/{Classes|Public|Private}/{Name}.Tests.ps1- Integration tests:
tests/Integration/Commands/{CommandName}.Integration.Tests.ps1Requirements
- Follow instructions over existing code patterns
- Follow PowerShell style and test guideline instructions strictly
- Always update CHANGELOG.md Unreleased section
- Localize all strings using string keys; remove any orphaned string keys
- Check DscResource.Common before creating private functions
- Separate reusable logic into private functions
- DSC resources should always be created as class-based resources
- Add unit tests for all commands/functions/resources
- Add integration tests for all public commands and resources
Files:
layouts/partials/header-new.htmlassets/js/main.jsassets/css/futuristic.css
🪛 Biome (2.1.2)
assets/css/futuristic.css
[error] 1202-1203: Expected a selector but instead found '@'.
Expected a selector here.
(parse)
[error] 1203-1203: expected , but instead found media
Remove media
(parse)
[error] 1203-1203: Expected a compound selector but instead found '('.
Expected a compound selector here.
(parse)
[error] 1203-1203: expected , but instead found prefers-color-scheme
Remove prefers-color-scheme
(parse)
[error] 1203-1203: expected , but instead found )
Remove )
(parse)
[error] 1203-1203: Unknown type selector is not allowed.
See MDN web docs for more details.
Consider replacing the unknown type selector with valid one.
(lint/correctness/noUnknownTypeSelector)
[error] 1203-1203: Unexpected unknown pseudo-class dark
See MDN web docs for more details.
(lint/correctness/noUnknownPseudoClass)
🔇 Additional comments (6)
assets/css/futuristic.css (2)
1-149: Well-structured design token system.The CSS custom properties provide a comprehensive foundation with color palette, semantic colors, gradients, shadows, typography scale, spacing, border radii, transitions, z-index scale, and container sizes. The token naming convention is consistent and intuitive.
151-207: Dark mode implementation looks solid.The dual approach—explicit
[data-theme="dark"]attribute andprefers-color-schememedia query fallback with:root:not([data-theme="light"])—provides good coverage for both manual toggle and system preference.layouts/partials/header-new.html (2)
112-113: Keyboard shortcut handling looks good.The implementation now includes both
shortcut-macandshortcut-otherelements, with CSS controlling visibility based on theis-macclass (set by JavaScript platform detection). This addresses cross-platform keyboard hint display.
59-71: No action needed. The Remix Icon font is already properly loaded inlayouts/_default/baseof.html(line 32) via CDN athttps://cdn.jsdelivr.net/npm/[email protected]/fonts/remixicon.css, making it available to all partials includingheader-new.html.assets/js/main.js (2)
7-15: Clean initialization pattern.The DOMContentLoaded listener with separate initialization functions provides good separation of concerns and makes the code maintainable.
33-50: Theme initialization handles edge cases well.The logic correctly prioritizes localStorage, falls back to system preference, and listens for system theme changes only when no explicit preference is set.
Website redesign
This PR introduces a redesign of the DSC Community website with a modern, futuristic theme and improved user experience.
New Features
futuristic.cssstylesheet with CSS custom properties for consistent spacing, typography, and colorsFiles Changed
New Layouts:
header-new.html,footer-new.html)Updated Content:
type: "post"from community pages to use correct templatesConfiguration:
config.tomlwith corrected menu items.prettierignoreto prevent auto-formatter from breaking Hugo templatesHere's a screenshot when running locally:
This change is