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(`
`);
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'));