JavaScript Code Style
Use following conventions for JavaScript and TypeScript code.
Preparations
- Add to dev dependencies in package.json if not added:
- eslint-config-metarhia
- eslint, prettier
- Add scripts in package.json if not added:
- "lint": "eslint . && prettier --check "/*.js" "/.json" "**/.md" "*/.ts""
- "fix": "eslint . --fix && prettier --write "/*.js" "/.json" "**/.md" "*/.ts""
- Before and after code analysis with AI run
npm run lintandnpm t - Use
npm run fixif errors/warnings detected to auto-fix when possible
Formatting
- Use single quotes and semicolons
- Keep max line length 80 (ignore URLs)
- Use trailing commas in multiline arrays, objects, and params
- Keep one empty line between semantic blocks
- Follow Prettier and eslint-config-metarhia for spacing, braces, and indentation
Naming
- Use
camelCasefor variables and parameters - Use
UpperCamelCasefor classes and types - Use
UPPER_SNAKE_CASEfor constants - Use
newwith capitalized constructor names - Use
errorin catch blocks, noterr - Use short names (
e,i) only in short one-line callbacks - Use descriptive names in multiline callbacks (
event,index,item) - Use boolean prefixes:
is,has,can,should - Use singular names for entities and plural names for collections
- Use verb names for functions and handlers (
parse,create,handle,on) - Include units in numeric names (
timeoutMs,sizeBytes) except options
Best practices
- Prefer
const, minimizelet, never usevar - Prefer arrow functions (except prototype/class methods)
- Do not mutate input parameters; avoid
arguments - Keep functions small and single-purpose
- Decompose long expressions into intermediate variables
- Prefer explicit loops (
for,for..of) in hot paths - Use array methods when they improve readability
- Use
===and!==only - Keep return types consistent
- Avoid nested ternaries and deep callback nesting
- Self-documented and self-descriptive code: do not add obvious comments, code should be clear without comments
- Use iteration methods like
.map,.filter,.reduceif it is good for code semantic - Try to avoid
.forEachif callback operates with outer context
Optimizations
- Keep object shapes stable: same keys, types, and key order
- Change shape only in constructors and creational patterns; avoid mix-ins
- Use shape mutations only for metaprogramming
- Use
nullfor empty reference types; useundefinedfor empty primitives - Avoid array destructuring in assignments and loops; object destructuring is ok
- Keep hot functions monomorphic: stable arg count, types, and return types
- Avoid reading the same property from many unrelated object shapes
- Prefer string or number literals for status/codes; avoid mixing primitives with objects in one variable
- Keep objects that share a property to the same shape; avoid polymorphic hotspots
- Prefer fixed property access (
obj.x) over dynamic keys (obj[key]) - Keep arrays dense, avoid holes and mixed element kinds
- Initialize object fields in constructor/factory once and in one order
- Set field to
nullorundefined; avoiddelete - Move reusable callbacks outside loops
- Keep
try/catch, spread/rest away from hot loops - Use
Mapfor dynamic key dictionaries, plain objects for fixed schemas - Use
Setfor big and dynamic collections, prefer arrays for short and stable - Use
Object.create(null)for pure dictionaries - Use typed arrays for numeric and binary workloads
- Reduce GC pressure: reuse arrays, objects, and buffers when safe