agentleFS
ai-enhanced-engineerai-enhanced-engineer/aiee-skills/skills/nestjs-patterns/SKILL.md

nestjs-patterns

Skill4 starsChanged 5 months agoMITView on GitHub

NestJS 11 production patterns for module organization, dependency injection scopes, DTO validation pipeline, guards/interceptors/middleware/pipes, exception filters, and typed configuration. Use when building or reviewing NestJS APIs.

10 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

1 rule. 0 are common, 0 are distinctive, and 1 is very specific to this project.

  • 0

    Common

    Most of the 10 edited versions we read keep these.

  • 0

    Distinctive

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Default to singleton (@Injectable()).

    line 31

“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

NestJS 11 Modern Patterns

NestJS 11 (Jan 2026) defaults to the SWC compiler and ESM modules; the DI/module API is unchanged from v10. This skill covers the runtime patterns that decide whether a NestJS service stays maintainable past 20+ modules.

When to use

  • Designing or reviewing a NestJS feature module
  • Wiring forRoot / forFeature for shared infrastructure (TypeORM, JWT, mailer)
  • Choosing between guard / interceptor / middleware / pipe for a cross-cutting concern
  • Configuring the global ValidationPipe and exception filter
  • Resolving circular module dependencies or DI scope mistakes

Core patterns

ConcernToolExample
Authn / authzGuardJwtAuthGuard, RolesGuard
Request timing / response envelopeInterceptorLoggingInterceptor
DTO validation, param coercionPipeglobal ValidationPipe
CORS, rate limit, cookie parseMiddlewareapp.use(cors(...))
Error normalizationException filterAllExceptionsFilter

DI scopes

Default to singleton (@Injectable()). Use Scope.REQUEST only when a service truly needs the raw Request object — request scope bubbles up the entire DI subtree and costs ~20–30% throughput. Prefer the @CurrentUser() param decorator pattern at the controller boundary.

Validation pipeline

app.useGlobalPipes(new ValidationPipe({
  whitelist: true,
  forbidNonWhitelisted: true,
  transform: true,
  transformOptions: { enableImplicitConversion: true },
}));

whitelist strips unknown fields (mass-assignment defense). forbidNonWhitelisted rejects requests with extras. enableImplicitConversion removes the need for @Type(() => Number) on every numeric query param.

Module boundaries

forRoot(options) — once at app level (TypeORM, JWT). forFeature([entities]) — per feature module. Export only the service the consumer needs; do not re-export TypeOrmModule from a feature module — it leaks every repository registered for that feature.

For broader DDD module-boundary guidance, see the arch-ddd skill.

Anti-patterns

  • Business logic in controllers → untestable, violates SRP
  • Circular module deps → providers undefined at runtime; refactor over forwardRef()
  • Throwing raw Error instead of HttpException → 500 instead of 400/422
  • Overusing Scope.REQUEST → measurable throughput drop from scope bubble-up
  • Missing config validation schema → runtime failure under load instead of startup failure

See reference.md for the full guard/interceptor/pipe decision tree, exception filter template, and @nestjs/config typed-config patterns. See examples.md for project-specific feature-module skeletons.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.