@bgarciamoura/eslint-plugin-sentence-case
v1.0.0
Published
ESLint plugin to enforce sentence case in string literals — ideal for i18n locale files
Maintainers
Readme
eslint-plugin-sentence-case
ESLint plugin to enforce sentence case in string literals. Ideal for i18n/locale files, UI text, and any project where consistent text casing matters.
What it does
- Flags strings that don't start with an uppercase letter
- Detects title case ("Show More Items" → "Show more items")
- Auto-fixes violations
- Smart exceptions: acronyms (CSV, URLs, IDs), punctuation, parentheses, allowed words
Installation
npm install -D eslint-plugin-sentence-caseUsage
Flat config (ESLint 9+)
import sentenceCase from 'eslint-plugin-sentence-case';
export default [
{
files: ['src/i18n/locales/*.ts'],
plugins: {
'sentence-case': sentenceCase,
},
rules: {
'sentence-case/enforce': 'error',
},
},
];With options
'sentence-case/enforce': ['error', {
// Disable title case detection (only check first letter)
titleCaseDetection: true,
// Words that are always allowed to be capitalized
allowedWords: ['GitHub', 'Obsidian', 'TypeScript'],
// File path patterns to ignore (regex)
ignorePaths: ['__tests__', '__mocks__'],
}]Options
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| titleCaseDetection | boolean | true | Flag words that are capitalized mid-sentence |
| allowedWords | string[] | [] | Words always allowed to be capitalized (brand names, proper nouns) |
| ignorePaths | string[] | [] | Regex patterns for file paths to skip |
Smart exceptions
The rule automatically allows capitalization in these cases:
- Acronyms — all-caps words like
CSV,URL,AND,OR - Acronyms with suffixes —
URLs,IDs,APIs - After punctuation —
Done. Next step(capital after.,!,?,:) - Inside parentheses —
Click here (See More) - Single characters —
Column A(single letters are skipped)
Examples
Caught by the rule
// ❌ Lowercase first letter
label: "show more items" // → "Show more items"
// ❌ Title case
label: "Show More Items" // → "Show more items"
// ❌ Mixed
label: "export All Data" // → "Export all data"Passes the rule
// ✅ Sentence case
label: "Show more items"
// ✅ Acronyms
label: "Export CSV file"
label: "Copy all URLs"
// ✅ After punctuation
label: "Done. Click here"
// ✅ Parentheses
label: "Learn more (See Docs)"
// ✅ Allowed words
label: "Open in GitHub" // with allowedWords: ["GitHub"]