Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
49d96b5
feature: version 8 wip
MrMaz Feb 17, 2026
f493eb4
feature: version 8 (port cache module)
MrMaz Feb 21, 2026
6b8fd2d
feature: version 8 (port otp module) plus refinements
MrMaz Feb 23, 2026
b2329ca
feature: version 8 (READMEs)
MrMaz Feb 23, 2026
51f31f6
feature: version 8 (crud restructure)
MrMaz Feb 23, 2026
c5066fb
feature: version 8 (crud restructure 2)
MrMaz Feb 24, 2026
25a036e
feature: version 8 (crud locals response transformer)
MrMaz Feb 24, 2026
ab92fe1
feature: version 8 (repo hook simplification)
MrMaz Feb 27, 2026
be61d10
feature: version 8 (intitial native join support)
MrMaz Mar 3, 2026
a244c02
feature: version 8 (move federated query to repo)
MrMaz Mar 4, 2026
4e3a3cf
feature: version 8 (move repo hook calls to base repo class via tpl m…
MrMaz Mar 4, 2026
26f4414
feature: version 8 (improve custom query api)
MrMaz Mar 4, 2026
68b8809
feature: version 8 (draft crud readme)
MrMaz Mar 4, 2026
9aacd76
chore: version 8 (clean up dep)
MrMaz Mar 4, 2026
8621ea0
chore: bump v8.0.0-alpha.0 for crud, cache, otp and deps
MrMaz Mar 4, 2026
80c1d27
chore: bump v8.0.0-alpha.1 for crud, cache, otp and deps
MrMaz Mar 5, 2026
e5df07e
chore: v8.0.0-alpha.1 fix package file globs
MrMaz Mar 5, 2026
8119fd3
chore: version 8 (port role module)
MrMaz Mar 6, 2026
1fe49d0
chore: version 8 (otp missing agg commit)
MrMaz Mar 6, 2026
55bca78
chore: version 8 (otp linting)
MrMaz Mar 6, 2026
613a443
fix: version 8 (repos should not throw not found exceptions)
MrMaz Mar 6, 2026
f9c8d8e
feat: version 8 (add deleteMany to repo interface)
MrMaz Mar 6, 2026
8249454
chore: version 8 (READMEs)
MrMaz Mar 6, 2026
b8b85d1
chore: version 8 (dist cruft)
MrMaz Mar 6, 2026
13ca2b9
chore: version 8 (user module port)
MrMaz Mar 15, 2026
a456d11
chore: version 8 (finalize aggregate pattern)
MrMaz Mar 18, 2026
3e23266
chore: version 8 (cruft)
MrMaz Mar 18, 2026
0349a86
chore: version 8 (user cruft)
MrMaz Mar 18, 2026
560731c
feature: version 8 (move repository interfaces and functionality out …
MrMaz Mar 19, 2026
5df7cda
chore: version 8 (bump to alpha.2)
MrMaz Mar 19, 2026
d9cfa1f
feat: version 8 (port invitation)
MrMaz Mar 23, 2026
3c4b3fb
feat: version 8 (drop wide dep on rep context)
MrMaz Mar 25, 2026
f90799b
feat: version 8 (drop event context builder)
MrMaz Mar 25, 2026
cd5d05a
feat: version 8 (app context overhaul)
MrMaz Mar 29, 2026
8d68890
feat: version 8 (app context fully pluggable)
MrMaz Apr 2, 2026
d4cfd77
feat: version 8 (app context interception simplified)
MrMaz Apr 3, 2026
7e29609
fix: version 8 (user creds svc now calls create, not hash)
MrMaz Apr 3, 2026
5247e91
chore: version 8 (role module linting)
MrMaz Apr 3, 2026
580151a
chore: version 8 (alpha 3 with invitation)
MrMaz Apr 3, 2026
90afea1
feat: version 8 (password module)
MrMaz Apr 4, 2026
36ff21e
chore: version 8 (password module linting)
MrMaz Apr 5, 2026
659b6f6
feat: version 8 (federated module port)
MrMaz Apr 5, 2026
e7fb519
fix: version 8 (invitation repo overrides)
MrMaz Apr 5, 2026
f040bf9
fix: version 8 (missing trx wraps)
MrMaz Apr 5, 2026
363eb35
fix: version 8 (password file structure)
MrMaz Apr 5, 2026
2030bd1
feat: version 8 (move v8 interfaces/entities into modules)
MrMaz Apr 5, 2026
448b888
chore: version 8 (alpha 4)
MrMaz Apr 6, 2026
6d38a9d
chore: version 8 (remove typeorm-common module)
MrMaz Apr 6, 2026
359daa7
chore: version 8 (update docs)
MrMaz Apr 6, 2026
0822e93
feat: version 8 (move otp interfaces and entities to module)
MrMaz Apr 6, 2026
5418035
feat: version 8 (finish invitation notification agnostic changes)
MrMaz Apr 17, 2026
6a0ef11
feat: version 8 (combine core authentication modules)
MrMaz Apr 24, 2026
48fcef1
chore: version 8 (alpha 5)
MrMaz Apr 24, 2026
78c3eb0
fix: version 8 (ensure bus exec)
MrMaz Apr 27, 2026
5249672
fix: version 8 (crud context overlay should not attach to non-crud co…
MrMaz Apr 27, 2026
1b012c3
feat: version 8 (crud swagger fixes and comprehensive test)
MrMaz Apr 28, 2026
0684003
feat: version 8 (some commands and queries were not extending Command…
MrMaz Apr 28, 2026
aa11851
feat: version 8 (reduce casting in tests/mocks)
MrMaz Apr 29, 2026
02173c2
feat: version 8 (improve hook module docs)
MrMaz Apr 29, 2026
84d4f3e
chore: version 8 (alpha 6)
MrMaz Apr 29, 2026
9d3f5e1
chore: version 8 (move password domain from common to password module)
MrMaz Apr 30, 2026
486beb2
feat: version 8 (merge common and hook into new app module)
MrMaz May 14, 2026
522a1a3
feat: rockets ZERO (rename all v8 modules to rockets-* and reset vers…
MrMaz May 15, 2026
047b040
feat: version 8 (access control to DDD pattern)
MrMaz Jun 18, 2026
006cb1e
feat: version 8 (revert naming to nestjs-*)
MrMaz Jun 20, 2026
76f03ad
feat: version 8 (revert symbol names to version 8 style)
MrMaz Jun 20, 2026
e504061
feat: version 8 (revert final clean up)
MrMaz Jun 20, 2026
cadd840
feat: version 8 (typescript 5, dual esm support)
MrMaz Jun 27, 2026
95b68fd
feat: version 8 (nest 12 alpha support with shims)
MrMaz Jul 1, 2026
56f4fd4
Merge branch 'feature/dual-esm-build' into feature/version-8
MrMaz Jul 1, 2026
c7c37e8
feat(nestjs-crud): export request config types and base CQRS handlers
tnramalho Jul 17, 2026
a6a0a8a
feat: version 8 (switch from jest to vitest)
MrMaz Jul 18, 2026
612e0d9
feat: version 8 (drop CJS, ESM clean up)
MrMaz Jul 18, 2026
cfe8fda
feat: version 8 (improve crud exports)
MrMaz Jul 18, 2026
3b752ac
fix: wire ports config so AuthenticationModule no longer discards use…
MrMaz Jul 18, 2026
0ef74bc
feat: version (alpha 8)
MrMaz Jul 19, 2026
a79bcd7
feat: migrate to pure schema implementation
MrMaz Aug 24, 2026
63d5ae7
chore: bump nest v12 packages
MrMaz Aug 24, 2026
d374a8e
chore: bump to version alpha.9
MrMaz Aug 24, 2026
e72dcb9
chore: remove schema validation exception shim
MrMaz Aug 26, 2026
e302e67
fix(crud): allow schema-validated empty create bodies and apply route…
MrMaz Aug 26, 2026
f249cd1
fix(crud): route CRUD request bodies through the document schema conv…
MrMaz Aug 27, 2026
5a7822d
test(crud): validate generated petstore OpenAPI JSON against the real…
MrMaz Aug 27, 2026
5826fec
fix(repository): release the transaction scope when the outermost run…
MrMaz Aug 28, 2026
eddd113
fix(repository): commit every active transaction instead of rolling b…
MrMaz Aug 28, 2026
97cc6f5
fix(repository): memoise the in-flight transaction so concurrent getO…
MrMaz Aug 28, 2026
de4410f
fix(repository): stop pinning the entity-routing context to the first…
MrMaz Aug 28, 2026
c65118f
fix(repository): don't abandon remaining transactions on the first co…
MrMaz Aug 28, 2026
599a422
fix(repository): flush onRollback callbacks for a successful readOnly…
MrMaz Aug 28, 2026
bf8c654
feat(repository): abort the transaction scope's signal when a run is …
MrMaz Aug 28, 2026
b08fb3b
refactor(repository)!: remove the propagation option
MrMaz Aug 28, 2026
3525957
fix(repository): guard unhandled-rejection .stack reads in callback f…
MrMaz Aug 28, 2026
cee32d9
fix(repository): make settle() incapable of throwing before it releases
MrMaz Aug 28, 2026
b2cedec
fix(repository): settle a scope against the host that created it
MrMaz Aug 28, 2026
76ff06d
fix(repository): close the scope before settling, not after, and make…
MrMaz Aug 28, 2026
fa8f56b
feat(repository)!: throw when a joining run() conflicts with its scop…
MrMaz Aug 28, 2026
2833987
feat(repository)!: reject a participant whose shared scope already fa…
MrMaz Aug 29, 2026
d32a241
fix(repository)!: classify the heuristic commit on committedCount, no…
MrMaz Aug 29, 2026
e5225b9
fix(repository): flush onCommit/onRollback callbacks sequentially, in…
MrMaz Aug 29, 2026
5e14878
fix(repository-typeorm): release the QueryRunner when start() fails
MrMaz Aug 29, 2026
cc29678
docs(repository): reconcile transaction docs with the C1-C8 audit fixes
MrMaz Aug 29, 2026
f377000
fix(repository)!: settle a doomed scope immediately when a participan…
MrMaz Aug 29, 2026
50af810
test(repository): make the double-settle regression tests discriminate
MrMaz Aug 29, 2026
266e2d0
refactor(repository): drop the unused TransactionFactoryRegistry acce…
MrMaz Aug 29, 2026
fcc6063
docs(repository): correct the transaction examples, settle ordering a…
MrMaz Aug 29, 2026
1c71359
docs(repository): trim internal mechanism detail from the Transaction…
MrMaz Aug 29, 2026
2ae239f
fix(repository): keep RELATION_FIRST discovery pagination relative to…
MrMaz Aug 29, 2026
cab9aff
fix(repository)!: reject federated relation filters/sorts that silent…
MrMaz Aug 29, 2026
68bb119
ci: run CI on Node 22.x to match the declared engines requirement
MrMaz Aug 29, 2026
e6223e1
docs: fix README claims that drifted from the code since e302e671
MrMaz Aug 29, 2026
4dd9d82
chore(deps): upgrade rockets v8 packages to nestjs 12 GA
MrMaz Aug 30, 2026
a58f0f3
feat(repository,authentication): expose metadata predicates instead o…
MrMaz Aug 30, 2026
225dd6a
feat(crud): add CrudQueryParams/CrudQueryParamsApi for hand-written c…
MrMaz Aug 30, 2026
f712bde
docs: drop stale "NestJS 12 (currently alpha)" phrasing across v8 REA…
MrMaz Aug 30, 2026
3d5b377
chore: bump to version alpha.10
MrMaz Aug 30, 2026
84e88ad
docs: reconcile and rank TODOs.md after NestJS 12 GA upgrade
MrMaz Aug 30, 2026
cc9ea72
chore(deps): move @nestjs framework deps and cqrs to peerDependencies
MrMaz Aug 30, 2026
4703bdc
fix(crud): remove phantom join query parameter from generated OpenAPI…
MrMaz Aug 30, 2026
08414f0
feat(repository)!: add optimistic locking to TypeOrmRepository update…
MrMaz Aug 30, 2026
10523e5
refactor(core,crud,repository): drop undocumented @nestjs/common/util…
MrMaz Aug 31, 2026
e5de5cc
docs(todos): stop narrating shipped work in TODOs.md and code comments
MrMaz Aug 31, 2026
eb25eef
refactor(otp): narrow settings access behind an OtpPolicy
MrMaz Aug 31, 2026
995c0f7
fix: stop swallowing exceptions at catch-and-wrap boundaries
MrMaz Aug 31, 2026
25f6e4b
feat(core): classify RuntimeException fault to make the exception lay…
MrMaz Aug 31, 2026
bf4ef98
fix: give client-fault exceptions stuck at 500 their correct httpStatus
MrMaz Aug 31, 2026
4da0e60
chore: remove stale misconfiguration-vs-client-error TODO item
MrMaz Aug 31, 2026
2638fff
fix(crud): fail at forFeature build time when @CrudEntity is missing
MrMaz Aug 31, 2026
d200ba5
feat(authentication): publish an event when a notification send fails
MrMaz Aug 31, 2026
527369e
fix: remediate the fault/httpStatus classification and notification-e…
MrMaz Sep 1, 2026
0cd00ce
fix(role)!: stop PATCH /role from silently blanking name/description
MrMaz Sep 1, 2026
9232aba
chore: remove completed role-schema TODO item
MrMaz Sep 1, 2026
637e9f9
fix(crud)!: preserve api.body ApiBodyOptions for schema-based request…
MrMaz Sep 1, 2026
f3ef70e
chore: remove completed api.body TODO item
MrMaz Sep 1, 2026
46250a5
docs: bring the v8 package READMEs back in sync with 84e88ad3..HEAD
MrMaz Sep 2, 2026
14a1189
feat(core)!: derive correlation/causation for every domain event
MrMaz Sep 4, 2026
a2e4e6a
fix(user)!: validate and hash the password before persisting the user
MrMaz Sep 4, 2026
53190dd
feat(repository): warn when no transaction factory is registered
MrMaz Sep 4, 2026
8513fe3
chore: remove completed event-context TODO item
MrMaz Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions .github/workflows/ci-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x]
node-version: [22.x]
steps:
- uses: actions/checkout@v2
- name: Enable Corepack
Expand All @@ -33,9 +33,9 @@ jobs:
- name: Process Test Results
uses: dorny/test-reporter@v1
with:
name: Jest Tests
name: Unit Tests
path: "junit.xml"
reporter: jest-junit
reporter: java-junit
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v2
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci-pr-report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ jobs:
uses: dorny/test-reporter@v1
with:
artifact: test-results
name: Jest Tests
name: Unit Tests
path: 'junit.xml'
reporter: jest-junit
reporter: java-junit
coverage-report:
runs-on: ubuntu-latest
steps:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci-pr-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:

strategy:
matrix:
node-version: [20.x]
node-version: [22.x]

steps:
- uses: actions/checkout@v2
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ lib-cov
coverage
*.lcov

# Vitest junit reporter output (yarn test:ci)
junit.xml

# nyc test coverage
.nyc_output

Expand Down Expand Up @@ -111,4 +114,5 @@ dist
/docs

# .yarn meta
.yarn
.yarn
.claude/settings.local.json
36 changes: 18 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ Rapid Enterprise Development Toolkit
A collection of NestJS modules
that were created for the rapid development of enterpise level APIs.

The v8 line is schema-first — native Zod v4 / Standard Schema validation,
serialization, and OpenAPI — on NestJS 12, ESM-only, Node >= 22.

All reasonable efforts have been made to provide loosely coupled interfaces,
overridable services, and sane default implementations.

Expand All @@ -33,21 +36,18 @@ once we have finalized our Contributor License Agreement.

## Modules

| Module | Summary |
| -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| [nestjs-access-control](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-access-control 'nestjs-access-control') | Advanced access control guard for NestJS with optional per-request filtering. |
| [nestjs-auth-github](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-auth-github 'nestjs-auth-github') | Authenticate requests using GitHub oAuth2 sign-on. |
| [nestjs-auth-jwt](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-auth-jwt 'nestjs-auth-jwt') | Authenticate requests using JWT tokens passed via the request (headers, cookies, body, query, etc). |
| [nestjs-auth-local](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-auth-local 'nestjs-auth-local') | Authenticate requests using username/email and password against a local or remote data source. |
| [nestjs-auth-refresh](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-auth-refresh 'nestjs-auth-refresh') | Authenticate requests using JWT refresh tokens passed via the request (headers, cookies, body, query, etc). |
| [nestjs-authentication](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-authentication 'nestjs-authentication') | Authenticate requests using one or more strategies (local, jwt, etc). |
| [nestjs-common](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-common 'nestjs-common') | The common module is a dependency of all Rockets modules. |
| [nestjs-crud](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-crud 'nestjs-crud') | Extremely powerful CRUD module that is an extension/wrapper of the popular @nestjsx/crud module. |
| [nestjs-email](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-email 'nestjs-email') | Email deliver module that supports most popular transports, as well as template based email bodies using handlebars syntax. |
| [nestjs-event](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-event 'nestjs-event') | Advanced class based event dispatch/listener module. |
| [nestjs-jwt](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-jwt 'nestjs-jwt') | A flexible JWT utilities module for signing and validating tokens. |
| [nestjs-logger](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-logger 'nestjs-logger') | Drop-in replacement for the core NestJS logger that provides additonal support for pushing log data to external log providers. |
| [nestjs-password](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-password 'nestjs-password') | A flexible Password utilities module that provides services for password strength, creation and storage. |
| [nestjs-swagger-ui](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-swagger-ui 'nestjs-swagger-ui') | Expose your OpenApi spec on your API using the powerful Swagger UI interface. |
| [nestjs-typeorm-ext](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-typeorm-ext 'nestjs-typeorm-ext') | Extension of the NestJS TypeOrm module that allows your dynamic modules to accept drop-in replacements of custom entities and repositories. |
| [nestjs-user](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-user 'nestjs-user') | A module for managing a basic User entity, including controller with full CRUD, DTOs, sample data factory and seeder. |
| Module | Summary |
| ------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- |
| [nestjs-core](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-core 'nestjs-core') | Core framework module providing the app context system, DDD base classes, and shared utilities for Rockets modules. |
| [nestjs-repository](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-repository 'nestjs-repository') | Abstract repository adapter layer with transaction management, federation, and repository hook support. |
| [nestjs-repository-typeorm](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-repository-typeorm 'nestjs-repository-typeorm') | TypeORM driver for nestjs-repository with entity base classes and where-clause translation. |
| [nestjs-crud](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-crud 'nestjs-crud') | Powerful CRUD module with full DDD/CQRS integration, configurable operations, and optional OpenAPI documentation. |
| [nestjs-cache](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-cache 'nestjs-cache') | Cache management module using DDD/CQRS patterns with pluggable storage and HTTP CRUD gateway. |
| [nestjs-otp](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-otp 'nestjs-otp') | One-time password module supporting multiple OTP categories with rate limiting and expiry management. |
| [nestjs-role](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-role 'nestjs-role') | Role and role-assignment management module with DDD/CQRS and HTTP CRUD gateway. |
| [nestjs-password](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-password 'nestjs-password') | Password utilities module providing strength validation, hashing, and storage via configurable policy services. |
| [nestjs-user](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-user 'nestjs-user') | User entity management module with DDD/CQRS, password integration, and optional HTTP CRUD gateway. |
| [nestjs-invitation](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-invitation 'nestjs-invitation') | Invitation workflow module handling token generation, delivery, acceptance, and revocation via DDD/CQRS. |
| [nestjs-federated](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-federated 'nestjs-federated') | Federated (OAuth) identity linking module that maps external provider identities to local user accounts. |
| [nestjs-authentication](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-authentication 'nestjs-authentication') | Full-featured authentication module (JWT, local, refresh, recovery, verify, OAuth router) using DDD and CQRS. |
| [nestjs-access-control](https://github.com/conceptadev/rockets/tree/main/packages/nestjs-access-control 'nestjs-access-control') | Advanced access control guard with role-based grants and optional per-request response attribute filtering. |
37 changes: 37 additions & 0 deletions TODOs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Current scope
* `@concepta/nestjs-common` is deprecated — reverted to v7 line (`7.0.0-alpha.10`) and excluded from the v8 workspace. Its remaining v8-only symbols were merged into nestjs-core. Run `npm deprecate @concepta/nestjs-common@8.0.0-alpha.6` at publish time.
* Non-v8 packages are excluded from the Yarn workspace (see `workspaces` in root `package.json`) until they are migrated to the DDD pattern and NestJS 12: nestjs-email, nestjs-event, nestjs-logger, nestjs-auth-github, nestjs-org, nestjs-swagger-ui, nestjs-auth-google, nestjs-logger-coralogix, nestjs-logger-sentry, nestjs-file, nestjs-auth-apple, nestjs-report, nestjs-samples. Also removed `@concepta/nestjs-email` from devDependencies in nestjs-invitation and nestjs-authentication (only used in e2e tests — restore when nestjs-email is migrated).

# Ranked backlog

Single priority order across everything below (Fable review, 2026-08-30), ranked by
(impact of leaving it undone) vs (effort × blast radius) — not grouped by the old
Critical/High/Nice-To-Have labels, which were rough guesses and sometimes wrong. Effort
tags: S/M/L. Completed items are removed from this list rather than marked done — see
git history for what shipped.

1. **[S] Add an ESLint `import/extensions` rule** — belt-and-suspenders guard for the
`nodenext` `.js`-extension requirement on relative imports (`eslint-plugin-import`
is already a configured dependency, no conflicting rule exists). Not essential —
`tsc` itself already makes a missing extension a hard `TS2835` compile error. Do
opportunistically.

2. **[needs research first] Optional exports patterns are different across the
modules** — user confirmed no canonical pattern has been chosen yet; needs research
into the existing per-module variations before a target shape can even be proposed.
Not a quick win.

3. **Tutorial Topics** — Support of the minimum interface; Provider Overrides. Docs
work; sequence after the API stabilizes.

4. **When non-v8 packages are migrated to NestJS 12** — not actionable until triggered.
Full restore checklist per package:
1. Root `package.json` `workspaces` array — add dir (or revert to glob `packages/*`
when all are migrated)
2. Root `tsconfig.json` `references` — add `{ "path": "packages/<pkg>" }` (this
alone drives both the `tsc -b` ESM build and the type-check gate — the build is
solution-file-driven)
3. `vitest.config.ts` `test.include` — add `"packages/<pkg>/**/*.spec.ts"`
4. `vitest.config-e2e.ts` `test.include` — add `"packages/<pkg>/**/*.e2e-spec.ts"`
5. Restore `@concepta/nestjs-email` to nestjs-authentication and nestjs-invitation
devDependencies once nestjs-email is migrated.
74 changes: 60 additions & 14 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,28 @@ import importPlugin from 'eslint-plugin-import';
import tsdocPlugin from 'eslint-plugin-tsdoc';
import jsdocPlugin from 'eslint-plugin-jsdoc';

// The 13 packages migrated to v8 (nodenext, DDD) — same set as root
// tsconfig.json's `references` and tsconfig.eslint.json's `include`. Only
// these get type-aware linting; older packages predate the migration and
// aren't part of the tsconfig project-reference graph the parser resolves
// against, so linting them with a `project` would fail to find the file.
const v8Packages = [
'nestjs-core',
'nestjs-repository',
'nestjs-repository-typeorm',
'nestjs-crud',
'nestjs-cache',
'nestjs-otp',
'nestjs-role',
'nestjs-password',
'nestjs-user',
'nestjs-invitation',
'nestjs-federated',
'nestjs-authentication',
'nestjs-access-control',
];
const v8Files = v8Packages.map((name) => `packages/${name}/src/**/*.ts`);

export default tseslint.config(
// Ignore patterns
{
Expand All @@ -19,14 +41,13 @@ export default tseslint.config(
],
},

// Extend @concepta/eslint-config/nest (filter out undefined configs)
...conceptaConfig.filter(config => config !== undefined),

// JSDoc recommended config
jsdocPlugin.configs['flat/recommended-typescript'],

// Project-specific overrides
// Type-aware rules, scoped to the migrated v8 packages
{
files: v8Files,
extends: [
...conceptaConfig.filter((config) => config !== undefined),
jsdocPlugin.configs['flat/recommended-typescript'],
],
languageOptions: {
parserOptions: {
project: './tsconfig.eslint.json',
Expand Down Expand Up @@ -82,14 +103,16 @@ export default tseslint.config(

// JSDoc/TSDoc rules
'jsdoc/tag-lines': ['error', 'any', { startLines: 1 }],
// Disable nested param checking since TSDoc doesn't support dot notation
'jsdoc/check-param-names': ['warn', { checkDestructured: false }],
'tsdoc/syntax': 'error',
},
},

// TypeScript files override
{
files: ['**/*.ts'],
rules: {
// ESM tree-shaking: enforce `import type` for type-only imports
'@typescript-eslint/consistent-type-imports': [
'error',
{ prefer: 'type-imports', fixStyle: 'inline-type-imports' },
],

'jsdoc/require-jsdoc': 'off',
'jsdoc/require-param': 'off',
'jsdoc/require-returns': 'off',
Expand All @@ -98,12 +121,35 @@ export default tseslint.config(

// Spec and fixture files override
{
files: ['**/*.spec.ts', '**/*.fixture.ts'],
files: v8Packages.flatMap((name) => [
`packages/${name}/src/**/*.spec.ts`,
`packages/${name}/src/**/*.fixture.ts`,
]),
rules: {
'@darraghor/nestjs-typed/controllers-should-supply-api-tags': 'off',
'@darraghor/nestjs-typed/api-method-should-specify-api-response': 'off',
'jsdoc/tag-lines': 'off',
'tsdoc/syntax': 'off',
},
},

// `causal-context` is framework-agnostic by design — forbid framework
// imports here so the boundary can't silently erode.
{
files: ['packages/nestjs-core/src/domain/events/causal-context/**/*.ts'],
rules: {
'no-restricted-imports': [
'error',
{
patterns: [
{
group: ['@nestjs/*', '@nestjs/**', '@concepta/*', '@concepta/**'],
message:
'causal-context is framework-agnostic — framework imports belong in the adapter layer (domain/events/*.ts, infrastructure/context/*.ts), not here.',
},
],
},
],
},
},
);
21 changes: 0 additions & 21 deletions jest.config-e2e.json

This file was deleted.

45 changes: 0 additions & 45 deletions jest.config.json

This file was deleted.

3 changes: 0 additions & 3 deletions jest.setup.js

This file was deleted.

Loading
Loading