The monorepo for the @neoma/* family — a pack of NestJS building blocks, each published independently to npm.
| Package | Description |
|---|---|
@neoma/fixtures |
Test fixtures for @neoma/* packages — Express/NestJS mocks, Jest matchers, and a mock logger. |
@neoma/docker |
Docker test-container helpers — HTTP/TCP health polling and container teardown; the shared base for the service fixtures. |
@neoma/mockserver |
MockServer test fixture — a reusable client plus Docker container lifecycle and Jest setup/teardown drop-ins. |
@neoma/mailpit |
Mailpit test fixture for email testing — a reusable client plus Docker container lifecycle and Jest setup/teardown drop-ins. |
@neoma/minio |
MinIO test fixture — an S3-compatible object-storage container with a bucket created on start and Jest setup/teardown drop-ins. |
@neoma/cerberus |
NestJS-idiomatic file storage for S3-compatible backends — upload, persist, presigned download. |
@neoma/garmr |
Authentication & authorization for NestJS — magic links, Google OAuth, cookie/bearer sessions, and wildcard permissions. |
@neoma/features |
Feature flagging for NestJS controllers — gate routes behind binary on/off flags. |
@neoma/route-model-binding |
Laravel-inspired route model binding for NestJS — resolve database models from route parameters automatically. |
@neoma/argos |
NestJS-idiomatic audit trails for TypeORM — @CreatedBy / @UpdatedBy decorators that record who changed your entities. |
@neoma/config |
Simple, type-safe environment configuration for NestJS — typed access to env vars with camelCase↔SCREAMING_SNAKE mapping and .env precedence loading. |
@neoma/logging |
Great logging for NestJS — Pino-backed application + request-scoped loggers, with per-request trace IDs and field redaction. |
@neoma/exception-handling |
Automatic, Laravel-inspired exception handling for NestJS — consistent error responses, status-aware logging, and HTML content negotiation. |
@neoma/request-context |
Per-request context (AsyncLocalStorage) for NestJS — read the current request anywhere, no request scope. |
@neoma/managed-app |
Boots a NestJS app from a module path — an e2e harness for the @neoma/* packages. |
@neoma/managed-database |
In-memory SQLite datasource fixture for tests. |
Each package is versioned, changelogged, and published on its own cadence.
- Node ≥ 22
- pnpm 11.1.3 — pinned via
packageManager; install via Corepack so you get the right version. - Docker — required for test fixtures (
@neoma/minio,@neoma/mailpit,@neoma/mockserver) that boot containers. Docker Desktop or any equivalent works. Without Docker running, tests that depend on these fixtures will fail.
corepack enable # one-time — makes `pnpm` resolve to the pinned version
pnpm installUsing a different pnpm major (e.g. 9.x) can resolve a lockfile that fails CI's supply-chain checks. Corepack avoids that.
Run a task across the workspace, or scope it to one package:
pnpm -r build # build all (topological order)
pnpm -r lint
pnpm -r test # unit tests — Docker required (MinIO, etc.)
pnpm --filter @neoma/cerberus test # a single package
pnpm --filter @neoma/cerberus test -- --watch # watch mode
pnpm --filter @neoma/cerberus test:e2e # e2e — boots a Nest app against MinIOEditing a package and its consumer together? The consumer resolves the dependency from its built dist/, so keep a build-watch running alongside:
pnpm --filter @neoma/fixtures exec tsc -p tsconfig.lib.json --watchScaffold a new @neoma/* package in the canonical flattened layout:
pnpm new-package <name> ["description"] # e.g. pnpm new-package minioThis writes packages/<name>/ — lib in src/, a per-package jest.config.js and tsconfigs that extend the root configs, a publishable package.json, plus README.md and LICENSE — with a passing placeholder spec so the workspace stays green. Then:
corepack pnpm install # register it in the workspace + update the lockfile
pnpm changeset # record the new package for its first releaseReplace src/index.ts with the real API and add specs alongside it. e2e (a packages/<name>/e2e/ suite + test:e2e script) is added per package when needed — see packages/cerberus for the pattern.
Releases are driven by Changesets, per package:
- With your change, record the intent:
Commit the generated
pnpm changeset # choose package(s) + bump (patch/minor/major) + a summary.changeset/*.mdfile alongside your change. - Merge to
main→ CI opens a "Version Packages" PR that bumps versions and writes each package'sCHANGELOG.md. - Merge the Version PR → CI publishes the changed packages to npm and tags them (
@neoma/<pkg>@<version>).
A change merged without a changeset ships nothing — it waits on main until one is added.
minimumReleaseAge: 10080— dependencies published within the last 7 days are refused (protection against compromised/typosquatted releases).allowBuilds— only allowlisted dependencies may run install/build scripts; everything else is blocked.
MIT