Refactor high-complexity React components in Dify frontend. Use when `pnpm analyze-component...
npx skills add erichowens/some_claude_skills --skill "mdx-sanitizer"
Install specific skill from multi-skill repository
# Description
Comprehensive MDX content sanitizer that escapes angle brackets, generics, and other JSX-conflicting patterns to prevent build failures
# SKILL.md
name: mdx-sanitizer
description: Comprehensive MDX content sanitizer that escapes angle brackets, generics, and other JSX-conflicting patterns to prevent build failures
version: "1.0.0"
category: DevOps & Automation
tags:
- mdx
- docusaurus
- markdown
- build-tools
- sanitization
allowed-tools:
- Read
- Write
- Edit
- Bash
- Glob
- Grep
triggers:
- "mdx error"
- "angle bracket"
- "jsx parsing"
- "build failure mdx"
- "escape angle brackets"
- "sanitize markdown"
MDX Sanitizer
Comprehensive MDX content sanitizer that prevents JSX parsing errors caused by angle brackets, generics, and other conflicting patterns.
The Problem
MDX 2.x treats unescaped < and { as JSX syntax. This causes build failures when content contains:
- TypeScript generics:
Promise<T>,Array<string>,Map<K, V> - Comparisons:
<100ms,<=,>= - Arrows:
-->,<--,-> - Invalid tags:
<link>in prose,<tag>placeholders - Empty brackets:
<>
Solution Architecture
This skill implements a three-layer defense:
1. Sync-Time Sanitization (Proactive)
Content is sanitized when syncing from .claude/skills/ to website/docs/:
- syncSkillDocs.ts - Main skill files
- syncSkillSubpages.ts - Reference files
- doc-generator.ts - Generated docs
2. Pre-Commit Validation (Reactive)
The git pre-commit hook validates files before commit using validate-brackets.js.
3. Build-Time Validation (Final Check)
npm run validate:all runs as part of prebuild to catch any issues.
Usage
Check for Issues (Dry Run)
cd website
npm run sanitize:mdx
# or with verbose output
npm run sanitize:mdx -- --verbose
Fix All Issues
cd website
npm run sanitize:mdx -- --fix
# or shorthand
npm run fix:mdx
Programmatic API
import { sanitizeForMdx, validateMdxSafety, isMdxSafe } from './lib/mdx-sanitizer';
// Sanitize content
const result = sanitizeForMdx(content, { useHtmlEntities: true });
if (result.modified) {
console.log(`Fixed ${result.issues.length} issues`);
fs.writeFileSync(path, result.content);
}
// Validate without modifying
const issues = validateMdxSafety(content, 'path/to/file.md');
// Quick check
if (!isMdxSafe(content)) {
// Handle issues
}
Escaping Strategies
The sanitizer uses HTML entities for maximum compatibility:
| Pattern | Original | Escaped |
|---|---|---|
| Less-than | < |
< |
| Greater-than | > |
> |
| Generics | <T> |
&lt;T&gt; |
| Comparison | <= |
&lt;= |
Content inside code blocks (``` or `) is automatically protected and never escaped.
Files Modified
website/scripts/lib/mdx-sanitizer.ts- Core sanitizer modulewebsite/scripts/sanitize-mdx.ts- CLI wrapperwebsite/scripts/syncSkillDocs.ts- Integrationwebsite/scripts/syncSkillSubpages.ts- Integrationwebsite/scripts/lib/doc-generator.ts- Integrationwebsite/package.json- npm scripts
Patterns Detected
- Less-than before digit:
<100,<0.5ms - Comparison operators:
<=,>= - Empty brackets:
<> - Arrows:
<--,--> - Generic types:
Promise<T>,Array<string> - Space after less-than:
< value - Invalid pseudo-tags:
<link>,<tag>(not valid HTML)
Troubleshooting
Build Still Fails After Running Sanitizer
- Clear Docusaurus cache:
npm run clear - Re-run sanitizer:
npm run sanitize:mdx -- --fix - Rebuild:
npm run build
False Positives
If valid JSX components are being escaped:
- Ensure they use PascalCase (e.g., <MyComponent>)
- Check they're valid HTML5 elements
Manual Escaping
For edge cases, manually escape in source:
- Use backticks for inline code: `<T>`
- Use fenced code blocks for multi-line
- Use HTML entities: < and >
Sources
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.