import * as fs from 'fs'; import { resolve } from 'path'; import { rules, configs } from '../packages/eslint-plugin-qwik/index'; import { examples, type QwikEslintExample } from '../packages/eslint-plugin-qwik/examples'; const mdx = []; const outputPathMdx = resolve( process.cwd(), 'packages/docs/src/routes/docs/(qwik)/advanced/eslint/index.mdx' ); function escapeHtml(htmlStr: string) { return htmlStr .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function kebabToCamel(str: string) { return str .toLowerCase() .replace(/([-_][a-z])/g, (group) => group.toUpperCase().replace('-', '').replace('_', '')); } function renderExample(example: QwikEslintExample, state: 'good' | 'bad' = 'good') { mdx.push('
'); if (state === 'good') { mdx.push(''); } else { mdx.push(''); } mdx.push( '```tsx' + ((example.codeHighlight && ` ${example.codeHighlight}`) || '') + ((example.codeTitle && ` title="${example.codeTitle}"`) || '') ); mdx.push(example.code); mdx.push('```'); if (example.description) { mdx.push(`

${example.description}

`); } mdx.push('
'); } const rulesMap = Object.keys(rules).map((ruleName) => { const rule = ruleName as keyof typeof rules; return { name: rule, description: escapeHtml(rules[rule]?.meta?.docs?.description || ''), recommended: configs?.recommended?.rules[`qwik/${rule}`] || false, strict: configs.strict.rules[`qwik/${rule}`] || false, messages: rules[rule]?.meta?.messages || '', examples: examples[rule], }; }); mdx.push(` [//]: <> (--------------------------------------) [//]: <> (......THIS FILE IS AUTOGENERATED......) [//]: <> (--------------------------------------) [//]: <> ( to update run: pnpm eslint.update ) [//]: <> ( after changing the rule metadata on ) [//]: <> ( packages/eslint-plugin-qwik/index.ts ) [//]: <> (--------------------------------------) `); mdx.push(`import './styles.css';\n\n`); mdx.push('
'); mdx.push('

ESLint-Rules

'); mdx.push( '

Qwik comes with its own set of ESLint rules to help developers write better code.

' ); mdx.push(`
Warn in 'recommended' ruleset
Error in 'recommended' ruleset
🔔 Warn in 'strict' ruleset
🔔 Error in 'strict' ruleset
`); mdx.push(`

Possible Problems

`); mdx.push(`

These rules are available.

`); mdx.push(`
`); rulesMap.forEach((rule) => { mdx.push(`
${rule.name} ${rule.description}
🔔
`); }); mdx.push(`
`); mdx.push(`

Details

`); mdx.push(`
`); rulesMap.forEach((rule) => { mdx.push(`

${rule.name}

${rule.description} `); Object.keys(rule.messages).map((messageKey) => { mdx.push(`

${messageKey}

`); const goodExamples: QwikEslintExample[] = rule?.examples?.[messageKey]?.good || []; const badExamples: QwikEslintExample[] = rule?.examples?.[messageKey]?.bad || []; if (goodExamples.length > 0) { mdx.push('

Examples of correct code for this rule:

'); goodExamples.map((example) => { renderExample(example); }); } if (badExamples.length > 0) { mdx.push('

Examples of incorrect code for this rule:

'); badExamples.map((example) => { renderExample(example, 'bad'); }); } mdx.push( `` ); }); mdx.push(`
`); }); mdx.push(`
`); mdx.push(`
`); // TODO: format mdx breaks every odd code block // fs.writeFileSync(outputPathMdx, format(mdx.join('\n'), { parser: 'mdx' })); fs.writeFileSync(outputPathMdx, mdx.join('\n'));