@jonahsnider/xo-config
Version:
[](https://www.npmjs.com/package/@jonahsnider/xo-config) [](https://github.com/jonahsnider/xo-config/actions) [![XO
100 lines • 6.89 kB
JavaScript
import jsdoc from 'eslint-plugin-jsdoc';
import tsdoc from 'eslint-plugin-tsdoc';
const config = [
{
prettier: 'compat',
rules: {
quotes: ['error', 'single', { avoidEscape: true, allowTemplateLiterals: true }],
// Bad rule, it's also often prone to breaking TypeScript compilation
'unicorn/prefer-json-parse-buffer': 'off',
},
},
{
files: '**/*.{js,cjs,mjs}',
plugins: {
jsdoc,
},
},
{
files: '**/*.{ts,tsx}',
plugins: {
tsdoc,
},
rules: {
'default-case': 'off',
// eslint-disable-next-line @typescript-eslint/naming-convention
'tsdoc/syntax': 'error',
// Modern TypeScript versions check for this
'@typescript-eslint/no-implicit-any-catch': 'off',
// Enum members should be StrictPascalCase, variables can be UPPER_CASE, variables & functions can be StrictPascalCase for React components
// Everything else is the same - https://github.com/xojs/eslint-config-xo-typescript/blob/7c1e7d23437d975f7031324ec12250985eb4ae7a/index.js#L281
'@typescript-eslint/naming-convention': [
'error',
{
selector: 'variable',
format: ['strictCamelCase', 'UPPER_CASE', 'StrictPascalCase'],
leadingUnderscore: 'allow',
},
{
// `selector: ['variableLike', 'memberLike', 'property', 'method'],`
// Note: Leaving out `parameter` and `typeProperty` because of the mentioned known issues.
// Leaving out `variable` in favor of custom rule below
// Leaving out `enumMember` in favor of custom rule below
// Allowing StrictPascalCase for React components - see https://github.com/xojs/eslint-config-xo-typescript/issues/48
selector: ['function', 'classProperty', 'objectLiteralProperty', 'parameterProperty', 'classMethod', 'objectLiteralMethod', 'typeMethod', 'accessor'],
format: ['strictCamelCase', 'StrictPascalCase'],
// We allow double underscope because of GraphQL type names and some React names.
leadingUnderscore: 'allowSingleOrDouble',
trailingUnderscore: 'allow',
// Ignore `{'Retry-After': retryAfter}` type properties.
filter: {
regex: '[- ]',
match: false,
},
},
{
selector: ['typeLike', 'enumMember'],
format: ['StrictPascalCase'],
},
{
selector: 'variable',
types: ['boolean'],
format: ['StrictPascalCase'],
prefix: ['is', 'was', 'has', 'can', 'should', 'will', 'did'],
},
{
// Interface name should not be prefixed with `I`.
selector: 'interface',
filter: /^(?!I)[A-Z]/.source,
format: ['StrictPascalCase'],
},
{
// Type parameter name should either be `T` or a descriptive name.
selector: 'typeParameter',
filter: /^T$|^[A-Z][a-zA-Z]+$/.source,
format: ['StrictPascalCase'],
},
// Allow these in non-camel-case when quoted.
{
selector: ['classProperty', 'objectLiteralProperty'],
format: null,
modifiers: ['requiresQuotes'],
},
],
},
},
{
files: '**/*.{jsx,tsx}',
rules: {
'react/function-component-definition': [
'error',
{
namedComponents: 'arrow-function',
unnamedComponents: 'arrow-function',
},
],
},
},
];
export default config;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFDeEMsT0FBTyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQWlCO0lBQzVCO1FBQ0MsUUFBUSxFQUFFLFFBQVE7UUFDbEIsS0FBSyxFQUFFO1lBQ04sTUFBTSxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFDLENBQUM7WUFDN0UscUVBQXFFO1lBQ3JFLGtDQUFrQyxFQUFFLEtBQUs7U0FDekM7S0FDRDtJQUNEO1FBQ0MsS0FBSyxFQUFFLG1CQUFtQjtRQUMxQixPQUFPLEVBQUU7WUFDUixLQUFLO1NBQ0w7S0FDRDtJQUNEO1FBQ0MsS0FBSyxFQUFFLGVBQWU7UUFDdEIsT0FBTyxFQUFFO1lBQ1IsS0FBSztTQUNMO1FBQ0QsS0FBSyxFQUFFO1lBQ04sY0FBYyxFQUFFLEtBQUs7WUFDckIsZ0VBQWdFO1lBQ2hFLGNBQWMsRUFBRSxPQUFPO1lBQ3ZCLDRDQUE0QztZQUM1QywwQ0FBMEMsRUFBRSxLQUFLO1lBQ2pELDJJQUEySTtZQUMzSSxnSkFBZ0o7WUFDaEosc0NBQXNDLEVBQUU7Z0JBQ3ZDLE9BQU87Z0JBQ1A7b0JBQ0MsUUFBUSxFQUFFLFVBQVU7b0JBQ3BCLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQztvQkFDN0QsaUJBQWlCLEVBQUUsT0FBTztpQkFDMUI7Z0JBQ0Q7b0JBQ0Msb0VBQW9FO29CQUNwRSwwRkFBMEY7b0JBQzFGLHVEQUF1RDtvQkFDdkQseURBQXlEO29CQUN6RCxxSEFBcUg7b0JBQ3JILFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxVQUFVLENBQUM7b0JBQ3JKLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFDO29CQUMvQyxpRkFBaUY7b0JBQ2pGLGlCQUFpQixFQUFFLHFCQUFxQjtvQkFDeEMsa0JBQWtCLEVBQUUsT0FBTztvQkFDM0Isd0RBQXdEO29CQUN4RCxNQUFNLEVBQUU7d0JBQ1AsS0FBSyxFQUFFLE1BQU07d0JBQ2IsS0FBSyxFQUFFLEtBQUs7cUJBQ1o7aUJBQ0Q7Z0JBQ0Q7b0JBQ0MsUUFBUSxFQUFFLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQztvQkFDcEMsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7aUJBQzVCO2dCQUNEO29CQUNDLFFBQVEsRUFBRSxVQUFVO29CQUNwQixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7b0JBQ2xCLE1BQU0sRUFBRSxDQUFDLGtCQUFrQixDQUFDO29CQUM1QixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUM7aUJBQzVEO2dCQUNEO29CQUNDLGtEQUFrRDtvQkFDbEQsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTTtvQkFDNUIsTUFBTSxFQUFFLENBQUMsa0JBQWtCLENBQUM7aUJBQzVCO2dCQUNEO29CQUNDLGtFQUFrRTtvQkFDbEUsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxNQUFNO29CQUNyQyxNQUFNLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztpQkFDNUI7Z0JBQ0QsNkNBQTZDO2dCQUM3QztvQkFDQyxRQUFRLEVBQUUsQ0FBQyxlQUFlLEVBQUUsdUJBQXVCLENBQUM7b0JBQ3BELE1BQU0sRUFBRSxJQUFJO29CQUNaLFNBQVMsRUFBRSxDQUFDLGdCQUFnQixDQUFDO2lCQUM3QjthQUNEO1NBQ0Q7S0FDRDtJQUNEO1FBQ0MsS0FBSyxFQUFFLGdCQUFnQjtRQUN2QixLQUFLLEVBQUU7WUFDTixxQ0FBcUMsRUFBRTtnQkFDdEMsT0FBTztnQkFDUDtvQkFDQyxlQUFlLEVBQUUsZ0JBQWdCO29CQUNqQyxpQkFBaUIsRUFBRSxnQkFBZ0I7aUJBQ25DO2FBQ0Q7U0FDRDtLQUNEO0NBQ0QsQ0FBQztBQUVGLGVBQWUsTUFBTSxDQUFDIn0=