# Projectstructuur van een Total.js 5 applicatie

> De mappen van een Total.js 5-project, hun inhoud en hun automatische laadgedrag.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: nl
Content-SHA256: 4c18d6a2449c6348f1b77ccd01b807eeb4f6dfa023989bf533adbe8cddd0c62e
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Een Total.js-applicatie is een map met een startscript (`index.js`) en een aantal mappen met vaste namen. **Je importeert je bestanden niet**: bij het starten leest Total.js de onderstaande mappen en laadt elk `.js`-bestand daarin (in een map met de naam `plugins/` laadt het de `index.js` van elke submap). Een bestand is een gewone Node.js-module; als het een `install`-functie exporteert, roept Total.js die aan na het laden van het bestand.

| Map | Wat erin hoort |
|---|---|
| `controllers/` | Routes: `exports.install = function() { ROUTE(...) }`. |
| `definitions/` | Code die bij het starten draait en globale zaken declareert: acties met `NEWACTION()`, middleware, `AUTH()`, helpers, je eigen globals. |
| `actions/` | Acties (`NEWACTION()`), als je ze liever apart houdt van de andere definities. |
| `schemas/` | Schema's (`NEWSCHEMA()`) met hun acties. |
| `models/` | Wordt bij het starten geladen zoals de andere; Total.js laadt alleen de bestanden, wat erin staat is aan jou. |
| `middleware/` | Middleware (`MIDDLEWARE()`), geladen na de andere mappen. |
| `modules/` | Herbruikbare modules; de export kan een `id` hebben (wordt bewaard in `MODS`) en een `install`-functie. |
| `extensions/` | Wordt bij het starten geladen zoals de andere; Total.js laadt alleen de bestanden, wat erin staat is aan jou. |
| `plugins/` | Plugins: een map per plugin met een `index.js`. |
| `views/` | HTML-views en de `layout.html`. |
| `public/` | Statische bestanden die ongewijzigd worden geserveerd, zonder enige route. |
| `resources/` | Vertaalbestanden (`.resource`), zie het recept over lokalisatie. |
| `jsonschemas/` | Herbruikbare invoerdefinities (`.txt` of `.json`), zie het recept over schema's. |
| `databases/` | Bestanden van de ingebouwde NoSQL-database en van `MEMORIZE()`. |
| `tmp/` | Tijdelijke bestanden en caches (`PATH.tmp()`). |
| `logs/` | Logbestanden. |
| `private/` | Bestanden die niet openbaar mogen zijn; verstuur ze met `$.file()` na een controle. |
| `workers/` | Bestanden van `NEWTHREAD()` en `NEWFORK()`. |
| `config` | Het configuratiebestand (een bestand, geen map). |

De helpers van `PATH` bouwen het absolute pad van elke map: `PATH.root()`, `PATH.public()`, `PATH.private()`, `PATH.tmp()`, `PATH.logs()`, `PATH.databases()`. Ze geven het pad zonder slash aan het einde terug, en de map van de views heeft geen helper. Het voorbeeld plaatst een bestand in elk van de mappen die Total.js laadt en leest terug wat er is geladen.

```js extensions/marker.js
(MAIN.loaded = MAIN.loaded || []).push('extensions');
```

```js modules/marker.js
(MAIN.loaded = MAIN.loaded || []).push('modules');
module.exports.id = 'modules-file';
```

```js actions/marker.js
(MAIN.loaded = MAIN.loaded || []).push('actions');
```

```js schemas/marker.js
(MAIN.loaded = MAIN.loaded || []).push('schemas');
```

```js models/marker.js
(MAIN.loaded = MAIN.loaded || []).push('models');
```

```js definitions/marker.js
(MAIN.loaded = MAIN.loaded || []).push('definitions');
```

```js controllers/marker.js
(MAIN.loaded = MAIN.loaded || []).push('controllers');
```

```js middleware/marker.js
(MAIN.loaded = MAIN.loaded || []).push('middleware');
```

```js controllers/structure.js
exports.install = function() {
	ROUTE('GET /structure/', structure);
};

function structure($) {
	$.json({
		loaded: MAIN.loaded || [],
		modules: Object.keys(MODS),
		paths: {
			root: PATH.root(),
			public: PATH.public(),
			private: PATH.private(),
			tmp: PATH.tmp(),
			logs: PATH.logs(),
			databases: PATH.databases()
		}
	});
}
```
