--- name: aidd-javascript description: JavaScript and TypeScript best practices and guidance. Use when writing, reviewing, or refactoring JavaScript or TypeScript code. --- # JavaScript/TypeScript guide Act as a top-tier software engineer with serious JavaScript/TypeScript discipline to carefully implement high quality software. ## Before Writing Code - Read the lint and formatting rules. - Observe the project's relevant existing code. - Conform to existing code style, patterns, and conventions unless directed otherwise. Note: these instructions count as "directed otherwise" unless the user explicitly overrides them. ## Principles - DOT - YAGNI - KISS - DRY - SDA - Self Describing APIs - Simplicity - "Simplicity is removing the obvious, and adding the meaningful." - Obvious stuff gets hidden in the abstraction. - Meaningful stuff is what needs to be customized and passed in as parameters. - Functions should have default parameters whenever it makes sense so that callers can supply only what is different from the default. Constraints { Be concise. Favor functional programming; keep functions short, pure, and composable. Favor map, filter, reduce over manual loops. Prefer immutability; use const, spread, and rest operators instead of mutation. One job per function; separate mapping from IO. Obey the projects lint and formatting rules. Omit needless code and variables; prefer composition with partial application and point-free style. Chain operations rather than introducing intermediate variables, e.g. `[x].filter(p).map(f)` Avoid loose procedural sequences; compose clear pipelines instead. Avoid `class` and `extends` as much as possible. Prefer composition of functions and data structures over inheritance. Keep related code together; group by feature, not by technical type. Put statements and expressions in positive form. Use parallel code for parallel concepts. Avoid null/undefined arguments; use options objects instead. Use concise syntax: arrow functions, object destructuring, array destructuring, template literals. Avoid verbose property assignments. bad: `const a = obj.a;` good: `const { a } = obj;` Assign reasonable defaults directly in function signatures. `const createExpectedUser = ({ id = createId(), name = '', description = '' } = {}) => ({ id, name, description });` Principle: SDA. This means: Parameter values should be explicitly named and expressed in function signatures: Bad: `const createUser = (payload = {}) => ({` Good: `const createUser = ({ id = createId(), name = '', description = ''} = {}) =>` Notice how default values also provide hints for type inference. Avoid IIFEs. Use block scopes, modules, or normal arrow functions instead. Principle: KISS Avoid using || for defaults. Use parameter defaults instead. See above. Prefer async/await or asyncPipe over raw promise chains. Use strict equality (===). Modularize by feature; one concern per file or function; prefer named exports. } NamingConstraints { Use active voice. Use clear, consistent naming. Functions should be verbs. e.g. `increment()`, `filter()`. Predicates and booleans should read like yes/no questions. e.g. `isActive`, `hasPermission`. Prefer standalone verbs over noun.method. e.g. `createUser()` not `User.create()`. Avoid noun-heavy and redundant names. e.g. `filter(fn, array)` not `matchingItemsFromArray(fn, array)`. Avoid "doSomething" style. e.g. `notify()` not `Notifier.doNotification()`. Lifecycle methods: prefer `beforeX` / `afterX` over `willX` / `didX`. e.g. `beforeUpdate()`. Use strong negatives over weak ones: `isEmpty(thing)` not `!isDefined(thing)`. Mixins and function decorators use `with${Thing}`. e.g. `withUser`, `withFeatures`, `withAuth`. Avoid ALL_CAPS for constants. Since we use functional programming, there's no need for a hard distinction between constants and variables. } Comments { Favor docblocks for public APIs - but keep them minimal. Ensure that any comments are necessary and add value. Never reiterate the style guides. Avoid obvious redundancy with the code, but short one-line comments that aid scannability are okay. Comments should stand-alone months or years later. Assume that the reader is not familiar with the task plan or epic. }