Quick Reference
Running Linters
ESLint Configuration
The project uses ESLint 9 with the new flat config format (eslint.config.mjs).
Base Configuration
Plugins
The following ESLint plugins are configured:- @typescript-eslint - TypeScript-specific rules
- angular-eslint - Angular best practices
- eslint-plugin-import - Import/export validation
- eslint-plugin-rxjs - RxJS best practices
- eslint-plugin-rxjs-angular - Angular + RxJS patterns
- eslint-plugin-tailwindcss - TailwindCSS class validation
- eslint-plugin-storybook - Storybook configuration
- @bitwarden/platform - Custom platform rules
- @bitwarden/components - Custom component rules
eslint.config.mjs:14-38 for plugin configuration.
Code Quality Rules
General Rules
Always Use Curly Braces
curly: ["error", "all"] (line 95)
No Console Statements
no-console: "error" (line 96)
Exception: Console is allowed in libs/nx-plugin (line 329-333)
TypeScript Rules
No Floating Promises
All promises must be awaited or explicitly handled:@typescript-eslint/no-floating-promises: "error" (line 89)
Promise Return Values
Don’t misuse promises in conditionals:@typescript-eslint/no-misused-promises (line 90)
Member Accessibility
Omitpublic keyword, be explicit about private and protected:
@typescript-eslint/explicit-member-accessibility (line 87)
Unused Variables
Unused function arguments are allowed (useful for interfaces):@typescript-eslint/no-unused-vars: ["error", { args: "none" }] (line 93)
Import Rules
Import Ordering
Imports must be alphabetically sorted with newlines between groups:import/order (line 98-119)
Order:
- External packages (alphabetically)
@bitwarden/*packages (alphabetically)src/**relative imports (alphabetically)- Blank lines required between groups
Restricted Imports
The project enforces strict import boundaries to prevent circular dependencies.Architecture Layers
Libs cannot import from apps:eslint.config.mjs:121-171 for path restrictions.
Library Dependencies
Each library has specific allowed dependencies: Common library - Base layer, cannot import from other libs:eslint.config.mjs:363-605 for complete dependency graph.
Example violations:
Forbidden Patterns
Do not import fromsrc/** across package boundaries:
no-restricted-imports (line 246-248, 696-711)
Custom Bitwarden Rules
Platform Rules
Required Using Statement
Must useusing for disposable resources:
@bitwarden/platform/required-using: "error" (line 82)
No Enums
Prefer unions or const objects over enums:@bitwarden/platform/no-enums: "error" (line 83)
No Page Script URL Leakage
Prevents URL leakage in browser extension context. Rule:@bitwarden/platform/no-page-script-url-leakage: "error" (line 84)
Component Rules
Theme Colors in SVG
SVGs must use theme color variables:@bitwarden/components/require-theme-colors-in-svg: "error" (line 85)
See Angular Patterns for more component rules.
Browser Extension Rules
Memory Leak Prevention
Don’t useaddListener directly in popup context (Safari memory leak):
no-restricted-syntax (line 224-240)
See eslint.config.mjs:216-242 for full configuration.
Background Script Globals
Background scripts cannot usewindow (service worker context):
no-restricted-globals (line 260-267)
Template Linting
TailwindCSS Validation
Alltw-* classes must be valid TailwindCSS classes:
tailwindcss/no-custom-classname (line 195-202, 343-358)
Whitelisted non-Tailwind classes:
bwi-*- Font iconslogo,logo-themedfile-selectormfaType*filter*(temporary)tw-app-region*
Enforced Tailwind Patterns
tailwindcss/enforces-negative-arbitrary-values: "error"(line 203)tailwindcss/enforces-shorthand: "error"(line 204)tailwindcss/no-contradicting-classname: "error"(line 205)
eslint.config.mjs:175-213 for template configuration.
Prettier Configuration
Prettier is configured in.prettierrc.json:
- Print width: 100 characters
- MDX files: Always wrap prose
Integration with ESLint
eslint-config-prettier disables ESLint formatting rules that conflict with Prettier:
State Migration Rules
State migrations have special import restrictions to prevent breakage:eslint.config.mjs:633-652.
Ignored Files
The following paths are excluded from linting:eslint.config.mjs:655-688 for the complete list.
Cache Strategy
ESLint uses content-based caching for better performance:.eslintcache (gitignored)
Linter Options
Unused Disable Directives
Unusedeslint-disable comments are treated as errors:
Parser Configuration
TypeScript Files
HTML Templates
Next Steps
- Review TypeScript Style Guide for TypeScript patterns
- See Angular Patterns for Angular-specific rules
- Check Architecture for import boundary rationale