coding conventions
General Coding Conventions
- Language: Use TypeScript with ES modules (
import ... from ...), always including.jsfor local imports. - Error Handling:
- Do not use
process.envdirectly. Always useapp.lookup(ENV_KEYS.KEY)for configuration and secrets. - In
catchblocks, useunknownas the error type. Only access.messageiferror instanceof Error. - Use custom error classes from
src/middleware/error.tsfor HTTP errors.
- Do not use
- Logging:
- Use
app.logfor all logging. Never useconsole.log.
- Use
- Dependency Injection:
- Register services and controllers in the DI container in
src/index.ts. - Use
asClassfor classes andasFunctionfor factories. - Controllers and services should receive dependencies via constructor injection.
- Register services and controllers in the DI container in
- Validation:
- Use validation constants/types from
src/constants/validation.tsandsrc/types/validation.ts. - Report validation errors using problem types from
src/constants/problemTypes.ts.
- Use validation constants/types from
- Messaging & Pub/Sub:
- Use
SubscriptionHandlerandSubscriptionMessageHandlerspatterns for Service Bus subscriptions. - Use
app.lookup(ENV_KEYS.KEY)for all topic and subscription names. - Use the utility in
src/utils/serviceBusMessageUtils.tsfor sending messages.
- Use
- File/Blob Utilities:
- Use
src/utils/blobUtils.tsandsrc/utils/fileUtils.tsfor blob/file operations. - Use
BlobStorageServicefor Azure Blob Storage operations.
- Use
- Controllers:
- Extend
BaseControllerand use itsauthenticateandauthorizemethods. - Do not access the DI container directly in controllers; use constructor injection.
- Extend
- Formatting & Linting:
- Follow the ESLint rules in
eslint.config.ts. - Do not use
console.logorprocess.env. - Use single quotes, 4-space indentation, and trailing commas for multiline objects/arrays.
- Follow the ESLint rules in
- Testing:
- Use Vitest for tests. Place unit tests in
test/unit/, service tests intest/service/, and contract tests intest/contract/.
- Use Vitest for tests. Place unit tests in
- Documentation:
- Add JSDoc comments for all public functions and classes.
File/Folder Structure
- Place all source code in
src/. - Place configuration constants in
src/constants/. - Place type definitions in
src/types/. - Place utility functions in
src/utils/. - Place controllers in
src/controllers/. - Place services in
src/services/. - Place middleware in
src/middleware/. - Place subscriptions in
src/subscriptions/.
Example Patterns
- Getting a config value:
- Error handling in async functions:
- Registering a service in DI:
applyTo
applyTo: [ ”/*.ts”, ”/*.js” ]
For more details, see Copilot custom instructions documentation.