2.0 KiB
2.0 KiB
Dependency Flow
Package Dependencies (one direction only)
apps/web-next → @repo/api-client, @repo/ui
Startup: @repo/cms-core (config) + @repo/cms-client (init local)
apps/web-tanstack → @repo/api-client, @repo/ui
Startup: @repo/cms-core (config) + @repo/cms-client (init local)
apps/cms → @repo/cms-core, payload, next
apps/storybook → @repo/ui
@repo/api-client → @repo/api (router types only)
@repo/api → @repo/core/interface-adapters (controllers)
@repo/cms-core → @repo/core/application (use cases for hooks), payload (types)
@repo/cms-client → (standalone — receives Payload instance, doesn't import it)
@repo/ui → (standalone — tailwind, shadcn)
Core Internal Dependencies
core/entities → (standalone — zero deps)
core/application → core/entities only
core/interface-adapters → core/application, core/entities
core/infrastructure → core/application, core/entities, @repo/cms-client, external libs
core/di → all internal layers
Circular Dependency Prevention — HARD RULES
- NEVER: packages/core → apps/*
- NEVER: apps/cms → packages/core/infrastructure
- NEVER: packages/cms-client → apps/cms or packages/core or packages/cms-core
- NEVER: packages/cms-core → packages/cms-client
- NEVER: core/entities → anything
- NEVER: core/application → core/infrastructure
Why These Rules Exist
The Payload CMS integration creates a potential circular dependency:
apps/cms hooks → @repo/core/application (use cases)
@repo/core/infrastructure → @repo/cms-client → Payload API
This is resolved by:
cms-clientis standalone — receives Payload instance via injection, never imports itcms-corehooks only import fromcore/application, nevercore/infrastructure- App startup code (not a shared package) wires Payload instance into cms-client