<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>eslint-plugin-typefest Blog</title>
        <link>https://nick2bad4u.github.io/eslint-plugin-typefest/blog</link>
        <description>eslint-plugin-typefest Blog</description>
        <lastBuildDate>Wed, 11 Mar 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Keeping Rule Docs and Presets in Sync]]></title>
            <link>https://nick2bad4u.github.io/eslint-plugin-typefest/blog/keeping-rule-docs-and-presets-in-sync</link>
            <guid>https://nick2bad4u.github.io/eslint-plugin-typefest/blog/keeping-rule-docs-and-presets-in-sync</guid>
            <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How eslint-plugin-typefest keeps docs tables, preset matrices, and rule metadata aligned through canonical generators.]]></description>
            <content:encoded><![CDATA[<p>Documentation drift is one of the easiest ways to lose trust in a lint plugin.</p>
<p>This repository treats metadata-to-doc synchronization as a first-class quality gate, not a best-effort cleanup task.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-core-principle">The core principle<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/keeping-rule-docs-and-presets-in-sync#The-core-principle" class="hash-link" aria-label="Direct link to The core principle" title="Direct link to The core principle" translate="no">​</a></h2>
<p>Human-written explanation should stay human.</p>
<p>Mechanically derivable data should be generated and tested.</p>
<p>For us, that includes:</p>
<ul>
<li class="">README rules matrix</li>
<li class="">presets rules matrix</li>
<li class="">rule metadata snapshots and integrity contracts</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="What-this-prevents">What this prevents<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/keeping-rule-docs-and-presets-in-sync#What-this-prevents" class="hash-link" aria-label="Direct link to What this prevents" title="Direct link to What this prevents" translate="no">​</a></h2>
<p>Without canonical generation, drift appears quickly:</p>
<ul>
<li class="">rule added to a preset but matrix unchanged</li>
<li class="">fix/suggestion capability changes but docs lag</li>
<li class="">links and IDs diverge between source and docs</li>
</ul>
<p>That leads to wrong migration guidance and unnecessary issue churn.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="How-we-enforce-it">How we enforce it<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/keeping-rule-docs-and-presets-in-sync#How-we-enforce-it" class="hash-link" aria-label="Direct link to How we enforce it" title="Direct link to How we enforce it" translate="no">​</a></h2>
<ul>
<li class="">sync scripts produce canonical matrix sections</li>
<li class="">CI checks fail when docs and generated sections diverge</li>
<li class="">docs integrity tests enforce stable heading/catalog conventions</li>
</ul>
<p>The result is less manual bookkeeping and fewer review-time surprises.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Practical-maintenance-advice">Practical maintenance advice<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/keeping-rule-docs-and-presets-in-sync#Practical-maintenance-advice" class="hash-link" aria-label="Direct link to Practical maintenance advice" title="Direct link to Practical maintenance advice" translate="no">​</a></h2>
<p>When changing rules or preset composition:</p>
<ol>
<li class="">update rule source and metadata</li>
<li class="">run matrix sync scripts</li>
<li class="">run docs integrity and snapshot suites</li>
<li class="">only then review prose-level docs edits</li>
</ol>
<p>This ordering keeps intent and generated truth aligned.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Related-docs">Related docs<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/keeping-rule-docs-and-presets-in-sync#Related-docs" class="hash-link" aria-label="Direct link to Related docs" title="Direct link to Related docs" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/rule-catalog-and-doc-sync" target="_blank" rel="noopener noreferrer" class="">Rule catalog and docs synchronization chart</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/preset-composition-and-rule-matrix" target="_blank" rel="noopener noreferrer" class="">Preset composition and rule matrix chart</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/presets" target="_blank" rel="noopener noreferrer" class="">Presets page</a></li>
</ul>]]></content:encoded>
            <category>eslint</category>
            <category>documentation</category>
            <category>automation</category>
            <category>adr</category>
            <category>quality</category>
        </item>
        <item>
            <title><![CDATA[Type-Aware Linting Without Surprises]]></title>
            <link>https://nick2bad4u.github.io/eslint-plugin-typefest/blog/type-aware-linting-without-surprises</link>
            <guid>https://nick2bad4u.github.io/eslint-plugin-typefest/blog/type-aware-linting-without-surprises</guid>
            <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Practical adoption strategy for typed ESLint rules using guard-first execution and predictable fallbacks.]]></description>
            <content:encoded><![CDATA[<p>Type-aware rules are powerful, but they become noisy fast when parser-service assumptions are unclear.</p>
<p>The goal is not “run typed rules everywhere immediately.” The goal is predictable behavior under real project conditions.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-contract-we-want">The contract we want<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/type-aware-linting-without-surprises#The-contract-we-want" class="hash-link" aria-label="Direct link to The contract we want" title="Direct link to The contract we want" translate="no">​</a></h2>
<p>A healthy typed-rule setup has three explicit outcomes:</p>
<ol>
<li class=""><strong>Typed path available</strong>: semantic checks run with parser services + checker.</li>
<li class=""><strong>Optional typed path unavailable</strong>: semantic branch is skipped safely.</li>
<li class=""><strong>Required typed path unavailable</strong>: fail fast with a clear configuration signal.</li>
</ol>
<p>That split keeps failures actionable and prevents silent drift.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Why-guard-first-design-matters">Why guard-first design matters<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/type-aware-linting-without-surprises#Why-guard-first-design-matters" class="hash-link" aria-label="Direct link to Why guard-first design matters" title="Direct link to Why guard-first design matters" translate="no">​</a></h2>
<p>In large codebases, parser-service availability is not uniform:</p>
<ul>
<li class="">different <code>tsconfig</code> scopes</li>
<li class="">mixed package boundaries</li>
<li class="">generated or excluded files</li>
</ul>
<p>Guard-first execution avoids brittle behavior by making typed entry conditions explicit.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Rollout-pattern-that-works">Rollout pattern that works<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/type-aware-linting-without-surprises#Rollout-pattern-that-works" class="hash-link" aria-label="Direct link to Rollout pattern that works" title="Direct link to Rollout pattern that works" translate="no">​</a></h2>
<ul>
<li class="">Start in one folder/package.</li>
<li class="">Measure with <code>--stats</code> before and after enabling typed checks.</li>
<li class="">Promote from <code>warn</code> to <code>error</code> once baseline noise is gone.</li>
<li class="">Expand scope only when performance and diagnostics stay stable.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="What-to-track">What to track<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/type-aware-linting-without-surprises#What-to-track" class="hash-link" aria-label="Direct link to What to track" title="Direct link to What to track" translate="no">​</a></h2>
<ul>
<li class="">typed-rule error rate tied to config gaps</li>
<li class="">lint runtime deltas after enabling typed presets</li>
<li class="">rule-level hotspots that call checker APIs most often</li>
</ul>
<p>If those stay stable, typed linting remains a quality upgrade instead of a workflow tax.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Related-docs">Related docs<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/type-aware-linting-without-surprises#Related-docs" class="hash-link" aria-label="Direct link to Related docs" title="Direct link to Related docs" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/typed-paths" target="_blank" rel="noopener noreferrer" class="">Typed service path inventory</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/developer/charts/typed-rule-semantic-analysis-flow" target="_blank" rel="noopener noreferrer" class="">Typed rule semantic analysis flow</a></li>
<li class=""><a href="https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/guides/type-aware-linting-readiness" target="_blank" rel="noopener noreferrer" class="">Type-aware linting readiness guide</a></li>
</ul>]]></content:encoded>
            <category>eslint</category>
            <category>typescript</category>
            <category>parser-services</category>
            <category>architecture</category>
            <category>performance</category>
        </item>
        <item>
            <title><![CDATA[Designing Safe Autofixes for eslint-plugin-typefest]]></title>
            <link>https://nick2bad4u.github.io/eslint-plugin-typefest/blog/designing-safe-autofixes-for-eslint-plugin-typefest</link>
            <guid>https://nick2bad4u.github.io/eslint-plugin-typefest/blog/designing-safe-autofixes-for-eslint-plugin-typefest</guid>
            <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How eslint-plugin-typefest decides between automatic fixes and suggestions to protect runtime behavior.]]></description>
            <content:encoded><![CDATA[<p>Autofix is one of the biggest quality-of-life features in ESLint, but it is also one of the fastest ways to damage trust if a rule gets it wrong.</p>
<p>In this plugin, a fix is not accepted just because it is convenient. A fix must be safe.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-safety-bar">The safety bar<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/designing-safe-autofixes-for-eslint-plugin-typefest#The-safety-bar" class="hash-link" aria-label="Direct link to The safety bar" title="Direct link to The safety bar" translate="no">​</a></h2>
<p>Before a fixer is enabled, the rule needs confidence in three areas:</p>
<ol>
<li class=""><strong>Semantic stability:</strong> The rewritten code must keep the same runtime meaning.</li>
<li class=""><strong>Syntactic stability:</strong> The output must stay valid TypeScript in real files.</li>
<li class=""><strong>Formatting stability:</strong> The change should cooperate with normal formatter and linter workflows.</li>
</ol>
<p>If any of those checks are uncertain, we downgrade to a suggestion.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Fix-versus-suggestion">Fix versus suggestion<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/designing-safe-autofixes-for-eslint-plugin-typefest#Fix-versus-suggestion" class="hash-link" aria-label="Direct link to Fix versus suggestion" title="Direct link to Fix versus suggestion" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Use-fix-when">Use <code>fix</code> when<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/designing-safe-autofixes-for-eslint-plugin-typefest#Use-fix-when" class="hash-link" aria-label="Direct link to Use-fix-when" title="Direct link to Use-fix-when" translate="no">​</a></h3>
<ul>
<li class="">the transformation is deterministic,</li>
<li class="">there are no ambiguous symbols or scope collisions,</li>
<li class="">and the replacement can be generated from source text without structural guesswork.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Use-suggest-when">Use <code>suggest</code> when<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/designing-safe-autofixes-for-eslint-plugin-typefest#Use-suggest-when" class="hash-link" aria-label="Direct link to Use-suggest-when" title="Direct link to Use-suggest-when" translate="no">​</a></h3>
<ul>
<li class="">there is a meaningful chance of behavior change,</li>
<li class="">user intent cannot be derived from syntax alone,</li>
<li class="">or code style constraints vary across teams.</li>
</ul>
<p>This keeps automation helpful without becoming risky.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Why-this-matters-in-TypeScript-heavy-codebases">Why this matters in TypeScript-heavy codebases<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/designing-safe-autofixes-for-eslint-plugin-typefest#Why-this-matters-in-TypeScript-heavy-codebases" class="hash-link" aria-label="Direct link to Why this matters in TypeScript-heavy codebases" title="Direct link to Why this matters in TypeScript-heavy codebases" translate="no">​</a></h2>
<p>TypeScript projects frequently rely on utility types, narrowings, and overloaded APIs. Small rewrites can accidentally change constraints or type inference behavior.</p>
<p>A conservative strategy means developers still get guidance and one-click migrations, but only in places where the rule can prove safety.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Practical-rollout-advice">Practical rollout advice<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/designing-safe-autofixes-for-eslint-plugin-typefest#Practical-rollout-advice" class="hash-link" aria-label="Direct link to Practical rollout advice" title="Direct link to Practical rollout advice" translate="no">​</a></h2>
<p>If your team is adopting this plugin:</p>
<ol>
<li class="">Start with a baseline preset.</li>
<li class="">Enable autofix in CI only after reviewing suggestion quality.</li>
<li class="">Move stricter rules from suggestion-first to fix-first once confidence is high.</li>
</ol>
<p>That progression gives teams predictable upgrades instead of disruptive churn.</p>]]></content:encoded>
            <category>eslint</category>
            <category>autofix</category>
            <category>typescript</category>
            <category>static-analysis</category>
            <category>developer-experience</category>
        </item>
        <item>
            <title><![CDATA[The Thinking Behind eslint-plugin-typefest]]></title>
            <link>https://nick2bad4u.github.io/eslint-plugin-typefest/blog/thinking-behind-eslint-plugin-typefest</link>
            <guid>https://nick2bad4u.github.io/eslint-plugin-typefest/blog/thinking-behind-eslint-plugin-typefest</guid>
            <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Why this plugin exists, what constraints shaped it, and how we balance strictness with developer experience.]]></description>
            <content:encoded><![CDATA[<p><code>eslint-plugin-typefest</code> was built around a simple goal: make safer TypeScript patterns easier to adopt at scale without turning linting into noise.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="The-core-motivation">The core motivation<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/thinking-behind-eslint-plugin-typefest#The-core-motivation" class="hash-link" aria-label="Direct link to The core motivation" title="Direct link to The core motivation" translate="no">​</a></h2>
<p>Most teams using TypeScript still carry legacy utility patterns that were reasonable at the time but are now harder to maintain than modern <code>type-fest</code> and <code>ts-extras</code> alternatives.</p>
<p>This plugin tries to close that gap by doing three things:</p>
<ol>
<li class="">Detect outdated or unsafe patterns reliably.</li>
<li class="">Offer clear, actionable diagnostics instead of vague “bad style” warnings.</li>
<li class="">Autofix only when semantics are preserved.</li>
</ol>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Design-constraints-we-intentionally-accepted">Design constraints we intentionally accepted<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/thinking-behind-eslint-plugin-typefest#Design-constraints-we-intentionally-accepted" class="hash-link" aria-label="Direct link to Design constraints we intentionally accepted" title="Direct link to Design constraints we intentionally accepted" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="1-Performance-over-cleverness">1) Performance over cleverness<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/thinking-behind-eslint-plugin-typefest#1-Performance-over-cleverness" class="hash-link" aria-label="Direct link to 1) Performance over cleverness" title="Direct link to 1) Performance over cleverness" translate="no">​</a></h3>
<p>Rules run on every save. If a rule needs expensive type-checker calls in hot paths, it can become a drag on the whole developer workflow.</p>
<p>So we bias toward:</p>
<ul>
<li class="">syntax-first detection where possible,</li>
<li class="">narrow AST selectors,</li>
<li class="">type-aware fallbacks only where they materially improve correctness.</li>
</ul>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="2-Correctness-over-aggressive-autofixes">2) Correctness over aggressive autofixes<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/thinking-behind-eslint-plugin-typefest#2-Correctness-over-aggressive-autofixes" class="hash-link" aria-label="Direct link to 2) Correctness over aggressive autofixes" title="Direct link to 2) Correctness over aggressive autofixes" translate="no">​</a></h3>
<p>A fast autofix that changes runtime behavior is a bug.</p>
<p>When we can guarantee safety, we emit <code>fix</code>.
When a transformation is likely correct but not universally safe, we emit <code>suggest</code>.</p>
<p>This keeps trust high: developers know auto-applied changes are meant to be safe-by-default.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="3-Documentation-as-part-of-the-rule-contract">3) Documentation as part of the rule contract<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/thinking-behind-eslint-plugin-typefest#3-Documentation-as-part-of-the-rule-contract" class="hash-link" aria-label="Direct link to 3) Documentation as part of the rule contract" title="Direct link to 3) Documentation as part of the rule contract" translate="no">​</a></h3>
<p>A rule without clear documentation creates churn.</p>
<p>Every rule is expected to explain:</p>
<ul>
<li class="">the specific anti-pattern it flags,</li>
<li class="">the safer alternative,</li>
<li class="">concrete incorrect/correct examples,</li>
<li class="">whether type information is required.</li>
</ul>
<h2 class="anchor anchorTargetHideOnScrollNavbar_Iwt7" id="Long-term-direction">Long-term direction<a href="https://nick2bad4u.github.io/eslint-plugin-typefest/blog/thinking-behind-eslint-plugin-typefest#Long-term-direction" class="hash-link" aria-label="Direct link to Long-term direction" title="Direct link to Long-term direction" translate="no">​</a></h2>
<p>The roadmap is to keep tightening alignment with modern TypeScript utility ecosystems while preserving practical adoption paths:</p>
<ul>
<li class="">low-friction presets for gradual rollout,</li>
<li class="">stricter presets for mature codebases,</li>
<li class="">focused migration guidance in docs and examples.</li>
</ul>
<p>If a rule cannot be explained explicitly, implemented performantly, and fixed safely, it does not belong in this plugin.</p>]]></content:encoded>
            <category>eslint</category>
            <category>typescript</category>
            <category>type-fest</category>
            <category>ts-extras</category>
            <category>architecture</category>
        </item>
    </channel>
</rss>