Skip to content

Naming Conventions

File Naming — PascalCase (STRICTLY ENFORCED)

All TypeScript files use PascalCase — no kebab-case, no type suffixes like .entity.ts, .vo.ts, or .service.ts.

TypePatternExamples
Entities[Entity].tsCexAccount.ts, CoinBlockchain.ts, Pair.ts
Value Objects[ValueObject].tsCexAccountId.ts, CexAccountAuth.ts, CoinId.ts
App Services[Action][Target].tsCoinBlockchainCreator.ts, CexCoinBlockchainStatusUpdater.ts
Domain Services[Domain][Concept].tsPairsBuilder.ts, CoinPairMarketPathCalculator.ts
Repo Interface[Entity]Repository.tsCexAccountRepository.ts, PairRepository.ts
Prisma Repo[Entity]PrismaRepository.tsCexAccountPrismaRepository.ts
InMemory Repo[Entity]InMemoryRepository.tsPairInMemoryRepository.ts
Domain Events[Subject][Action]DomainEvent.tsCoinBlockchainCreatedDomainEvent.ts
Event Subscribers[Action]On[Event].tsUpdateCexCoinsBlockchainsOnCoinBlockchainCreated.ts
Factories[Entity]Factory.tsCexAccountFactory.ts, CexCoinBlockchainFactory.ts
Test Builders[Entity]Mother.tsCexAccountMother.ts, CexCoinBlockchainMother.ts
Adapters[Tech][Port]Adapter.tsCctxCexSpotAccountAdapter.ts
Ports[Subject]Port.tsCexSpotAccountPort.ts
Controllers[Entity][Action]Controller.tsCexAccountFinderController.ts

Class Naming

Always PascalCase matching the filename:

typescript
// CexAccountPrismaRepository.ts
export class CexAccountPrismaRepository { ... }

// CoinBlockchainCreator.ts
export class CoinBlockchainCreator { ... }

// UpdateCexCoinsBlockchainsOnCoinBlockchainCreated.ts
export class UpdateCexCoinsBlockchainsOnCoinBlockchainCreated { ... }

Method Naming

Always camelCase. Services MUST have a public run() method as the main entry point:

typescript
class CoinBlockchainCreator {
  async run({ coinId, blockchain }: CreateParams): Promise<CoinBlockchain> { ... }
  private validate(params: CreateParams): void { ... }
}

class CexAccountRepository {
  findById(id: string): Promise<CexAccount | null>
  findAll(): Promise<CexAccount[]>
  save(account: CexAccount): Promise<void>
  delete(id: string): Promise<void>
}

Package Naming

Always @sws/package-name:

typescript
import { LoggerFactory } from '@sws/common/logger'
import type { DomainEventSubscriber } from '@sws/common/domain'
import { CexAccountFactory } from '@sws/cex-wallets'
import { client as prisma } from '@sws/database'

Directory Naming

Directories use camelCase:

  • domain/entities/
  • domain/valueObjects/ (not value-objects/)
  • domain/repositories/
  • domain/services/
  • domain/events/
  • domain/ports/
  • application/services/
  • application/eventSubscribers/ (not event-subscribers/)
  • infrastructure/repositories/
  • infrastructure/adapters/
  • infrastructure/factories/
  • infrastructure/controllers/

Event Naming Convention

Event names (the string eventName) use kebab-case dot-separated:

typescript
static eventName = 'cex-wallets.coinBlockchainCreated'
static eventName = 'rates.pairsRegenerated'
static eventName = 'shifts.tradesCompleted'

Format: <bounded-context>.<subjectAction>