Project Structure

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 Naming Convention

File PatternPurposeAuto-Discovery
module.jsModule configuration (routes, prefix, pipes, events)Yes — loaded first
*.controller.jsRoute handler functions (exported as named functions)Yes
*.service.jsBusiness logic objects (registered in DI container)Yes
*.dto.jsValidation schemas (referenced by name in routes)Yes

How Auto-Discovery Works

  1. On startup, createApp() scans the modules/ directory.
  2. Each subdirectory is treated as one module.
  3. module.js is loaded to read config (routes, prefix, pipes).
  4. All *.controller.js files are imported — exported functions become handlers.
  5. All *.service.js files are imported — exported objects become DI services.
  6. All *.dto.js files are imported — exported schemas become validation DTOs.
  7. Routes are built and registered in the Trie router.
Note — Folders starting with . or _ are ignored. So _utils/ or .temp/ won't be loaded as modules.