SpaceNode
SpaceNode uses a convention-based structure. Your project looks like this:
my-app/
├── app.js ← entry point (2 lines)
├── package.json
└── modules/
├── auth/
│ ├── module.js ← config: routes, prefix, pipes
│ ├── auth.controller.js ← handler functions
│ ├── auth.service.js ← business logic (auto-injected via DI)
│ └── auth.dto.js ← validation schemas
├── users/
│ ├── module.js
│ ├── users.controller.js
│ └── users.service.js
└── products/
├── module.js
├── products.controller.js
├── products.service.js
└── products.dto.js
| File Pattern | Purpose | Auto-Discovery |
|---|---|---|
module.js | Module configuration (routes, prefix, pipes, events) | Yes — loaded first |
*.controller.js | Route handler functions (exported as named functions) | Yes |
*.service.js | Business logic objects (registered in DI container) | Yes |
*.dto.js | Validation schemas (referenced by name in routes) | Yes |
createApp() scans the modules/ directory.module.js is loaded to read config (routes, prefix, pipes).*.controller.js files are imported — exported functions become handlers.*.service.js files are imported — exported objects become DI services.*.dto.js files are imported — exported schemas become validation DTOs.. or _ are ignored. So _utils/ or .temp/ won't be loaded as modules.