# Estrutura do projeto de um aplicativo Total.js 5

> As pastas de um projeto Total.js 5, o conteúdo de cada uma e o carregamento automático.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: pt
Content-SHA256: 3ea72f87626e29ae038f18dabb5a6d32b510e6d5f3792ef2822b2452b1ea7981
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

Uma aplicação Total.js é uma pasta com um script de arranque (`index.js`) e um conjunto de pastas com nomes fixos. **Não importa os seus ficheiros**: quando a aplicação arranca, o Total.js lê as pastas abaixo e carrega cada ficheiro `.js` que contêm (numa pasta chamada `plugins/` carrega o `index.js` de cada subpasta). Um ficheiro é um módulo Node.js normal; se exportar uma função `install`, o Total.js chama-a depois de carregar o ficheiro.

| Pasta | O que contém |
|---|---|
| `controllers/` | Rotas: `exports.install = function() { ROUTE(...) }`. |
| `definitions/` | Código que corre no arranque e declara coisas globais: ações com `NEWACTION()`, middleware, `AUTH()`, helpers, os seus próprios globais. |
| `actions/` | Ações (`NEWACTION()`), quando prefere tê-las separadas das outras definições. |
| `schemas/` | Esquemas (`NEWSCHEMA()`) com as suas ações. |
| `models/` | Carregada no arranque como as outras; o Total.js apenas carrega os ficheiros, o que contêm fica ao seu critério. |
| `middleware/` | Middleware (`MIDDLEWARE()`), carregado depois das outras pastas. |
| `modules/` | Módulos reutilizáveis; a exportação pode ter um `id` (guardado em `MODS`) e uma função `install`. |
| `extensions/` | Carregada no arranque como as outras; o Total.js apenas carrega os ficheiros, o que contêm fica ao seu critério. |
| `plugins/` | Plugins: uma pasta por plugin com um `index.js`. |
| `views/` | Vistas HTML e o `layout.html`. |
| `public/` | Ficheiros estáticos servidos tal como estão, sem qualquer rota. |
| `resources/` | Ficheiros de tradução (`.resource`), veja a receita de localização. |
| `jsonschemas/` | Definições de entrada reutilizáveis (`.txt` ou `.json`), veja a receita de esquemas. |
| `databases/` | Ficheiros da base de dados NoSQL integrada e de `MEMORIZE()`. |
| `tmp/` | Ficheiros temporários e caches (`PATH.tmp()`). |
| `logs/` | Ficheiros de registo. |
| `private/` | Ficheiros que não devem ser públicos; envie-os com `$.file()` depois de uma verificação. |
| `workers/` | Ficheiros de `NEWTHREAD()` e `NEWFORK()`. |
| `config` | O ficheiro de configuração (um ficheiro, não uma pasta). |

Os helpers de `PATH` constroem o caminho absoluto de cada pasta: `PATH.root()`, `PATH.public()`, `PATH.private()`, `PATH.tmp()`, `PATH.logs()`, `PATH.databases()`. Devolvem o caminho sem barra final, e a pasta das vistas não tem helper. O exemplo coloca um ficheiro em cada uma das pastas que o Total.js carrega e lê de volta o que foi carregado.

```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()
		}
	});
}
```
