@nodefony/framework 10.0.0-alpha.3 → 10.0.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/templates.md CHANGED
@@ -44,7 +44,7 @@ flowchart LR
44
44
  Deux idées à retenir :
45
45
 
46
46
  1. **Le contrôleur lit le fichier, le moteur ne fait que rendre une chaîne.** `renderView()` résout le
47
- chemin, lit l'octet, puis passe la **source** à Eta (`Controller.renderView()`, `Controller.ts:308`).
47
+ chemin, lit l'octet, puis passe la **source** à Eta (`Controller.renderView()`, `Controller.ts:410`).
48
48
  Il n'y a **pas** de dossier `views/` magique connu du moteur.
49
49
  2. **L'échappement est automatique.** Une donnée interpolée par `<%= %>` est neutralisée (`<` devient
50
50
  `&lt;`) avant d'entrer dans le HTML — c'est la protection XSS, active par défaut
@@ -187,7 +187,7 @@ curl -s 'http://localhost:5151/hello/%3Cb%3Ex%3C%2Fb%3E'
187
187
  > [!TIP]
188
188
  > Tu n'as écrit **aucun** appel d'envoi (`send`, `res.end`). `renderView()` produit le corps **et**
189
189
  > l'envoie. Pour piloter l'envoi toi-même, retourne plutôt une chaîne via `render()`
190
- > (`Controller.render()`, `Controller.ts:290`).
190
+ > (`Controller.render()`, `Controller.ts:377`).
191
191
 
192
192
  ## 🏗️ Architecture interne — le parcours d'un `renderView()`
193
193
 
@@ -218,9 +218,9 @@ sequenceDiagram
218
218
 
219
219
  | # | Étape | Où |
220
220
  | --- | -------------------------------------------- | ------------------------------------------------------------- |
221
- | 1 | Résolution + lecture async du fichier | `FileClass` dans `renderView()` (`Controller.ts:316`) |
222
- | 2 | Ouverture de la phase mesurée `render` | `phaseStart("render")` (`Controller.ts:322`) |
223
- | 3 | Injection des aides frontend dans les locals | `withFrontendLocals()` (`Controller.ts:345`) |
221
+ | 1 | Résolution + lecture async du fichier | `FileClass` dans `renderView()` (`Controller.ts:410`) |
222
+ | 2 | Ouverture de la phase mesurée `render` | `phaseStart("render")` (`Controller.ts:377`) |
223
+ | 3 | Injection des aides frontend dans les locals | `withFrontendLocals()` (`Controller.ts:448`) |
224
224
  | 4 | Rendu de la source par le moteur | `Eta.render()` → `renderStringAsync` (`Eta.ts:51`) |
225
225
  | 5 | `Content-Type: text/html` puis envoi | `setContextHtml()` + `renderResponse()` (`Controller.ts:331`) |
226
226
 
@@ -269,7 +269,7 @@ scaffold). Les deux sont **asynchrones** (I/O non bloquante).
269
269
  | Helper | Pour… | Ancre |
270
270
  | ----------------------------------- | ------------------------------------------------------- | ------------------- |
271
271
  | `renderView(path, locals, status?)` | Rendre une vue `.eta` (lit le fichier + aides frontend) | `Controller.ts:308` |
272
- | `render(data, encoding?, status?)` | Envoyer un corps quelconque (ex. HTML déjà prêt) | `Controller.ts:273` |
272
+ | `render(data, encoding?, status?)` | Envoyer un corps quelconque (ex. HTML déjà prêt) | `Controller.ts:377` |
273
273
  | `renderJson(obj, status?)` | Réponse JSON explicite (pas un template) | `Controller.ts:392` |
274
274
 
275
275
  Les signatures exactes vivent dans le graphe symbolique `.ai/symbols.json` — jamais recopiées ici.
@@ -318,13 +318,13 @@ Le rendu de vue est la partie **réellement coûteuse** d'une réponse (lecture
318
318
  template), et le framework l'isole pour ça :
319
319
 
320
320
  - **Phase dédiée** : `renderView()` chronomètre le rendu sous la phase `render`
321
- (`phaseStart("render")`, `Controller.ts:322`) — distincte de `action` et de `send`. On voit ainsi si
321
+ (`phaseStart("render")`, `Controller.ts:410`) — distincte de `action` et de `send`. On voit ainsi si
322
322
  le temps part dans le moteur ou dans l'écriture réseau.
323
323
  - **Cache en prod** : les templates sont compilés une fois (`cache` vrai en production,
324
324
  `Template.ts:20`) ; le coût de parsing n'est payé qu'au premier rendu.
325
325
  - **Lecture non bloquante** : le fichier est lu en async (`FileClass.readAsync()` côté `renderView`,
326
326
  `readFile` côté `renderFile`, `Eta.ts:71`) — l'event loop n'est jamais gelé par un `readFileSync`.
327
- - **Aides frontend paresseuses** : `withFrontendLocals()` (`Controller.ts:345`) ne construit les
327
+ - **Aides frontend paresseuses** : `withFrontendLocals()` (`Controller.ts:448`) ne construit les
328
328
  fonctions `frontendTags`/`asset` que si le service `frontend` répond — sinon il rend les locals tels
329
329
  quels, zéro allocation superflue.
330
330
 
@@ -344,7 +344,7 @@ template), et le framework l'isole pour ça :
344
344
  | `<%= it.name %>` requis alors qu'on attend `<%= name %>` | `useWith` mal compris — Nodefony l'active (`Eta.ts:17`), les locals sont nus | Écrire `<%= name %>` directement |
345
345
  | Modif de template ignorée en prod | `cache: true` en production (`Template.ts:20`) | Redémarrer le pod ; en dev le cache est off, recompile à chaud |
346
346
  | La réponse d'erreur n'est pas ma vue Eta | Les erreurs rendent du JSON, pas un template (`error-renderer.ts:109`) | Pour une page d'erreur HTML, rendre explicitement une vue dans un handler |
347
- | `renderView()` rejette et logge une ERROR | Fichier introuvable ou template invalide (le `catch` re-lève, `Controller.ts:333`) | Vérifier le chemin résolu (`resolve(module.path, …)`) |
347
+ | `renderView()` rejette et logge une ERROR | Fichier introuvable ou template invalide (le `catch` re-lève, `Controller.ts:410`) | Vérifier le chemin résolu (`resolve(module.path, …)`) |
348
348
 
349
349
  ## 🧪 Tests et couverture
350
350
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodefony/framework",
3
- "version": "10.0.0-alpha.3",
3
+ "version": "10.0.0-alpha.5",
4
4
  "description": "Le modèle de programmation Nodefony : routeur, contrôleurs, décorateurs et vues — HTTP et WebSocket dans le même contexte",
5
5
  "author": "Christophe CAMENSULI <ccamensuli@gmail.com>",
6
6
  "main": "./dist/index.js",
@@ -43,31 +43,31 @@
43
43
  "directory": "src/packages/@nodefony/framework"
44
44
  },
45
45
  "dependencies": {
46
- "@graphql-tools/merge": "9.2.3",
47
- "@graphql-tools/schema": "10.1.0",
46
+ "@graphql-tools/merge": "9.2.4",
47
+ "@graphql-tools/schema": "10.1.1",
48
48
  "eta": "4.6.0",
49
49
  "graphql": "17.0.2",
50
50
  "reflect-metadata": "0.2.2",
51
51
  "tslib": "2.8.1"
52
52
  },
53
53
  "devDependencies": {
54
- "@nodefony/http": "^10.0.0-alpha.3",
54
+ "@nodefony/http": "^10.0.0-alpha.5",
55
55
  "@types/chai": "5.2.3",
56
- "@types/node": "26.4.1",
56
+ "@types/node": "26.5.1",
57
57
  "@vitest/coverage-v8": "5.0.0",
58
58
  "chai": "6.2.2",
59
- "nodefony": "^10.0.0-alpha.3",
59
+ "nodefony": "^10.0.0-alpha.5",
60
60
  "rimraf": "6.1.3",
61
61
  "tsx": "4.23.13",
62
62
  "vitest": "5.0.0"
63
63
  },
64
- "license": "CECILL-B",
64
+ "license": "Apache-2.0",
65
65
  "readmeFilename": "README.md",
66
66
  "contributors": [],
67
67
  "peerDependencies": {
68
- "@nodefony/http": "^10.0.0-alpha.3",
69
- "nodefony": "^10.0.0-alpha.3",
70
- "zod": "^4.4.3"
68
+ "@nodefony/http": "^10.0.0-alpha.5",
69
+ "nodefony": "^10.0.0-alpha.5",
70
+ "zod": "^4.6.1"
71
71
  },
72
72
  "files": [
73
73
  "dist",