@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/LICENSE +201 -543
- package/README.md +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.148.0 → _@oxc-project_runtime@0.149.0}/helpers/esm/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.148.0 → _@oxc-project_runtime@0.149.0}/helpers/esm/decorateMetadata.js +1 -1
- package/dist/index.js +5 -5
- package/dist/nodefony/controller/OAuth2Controller.js +13 -4
- package/dist/nodefony/service/AdminBroker.js +2 -2
- package/dist/nodefony/service/IdempotencyStore.js +2 -2
- package/dist/nodefony/service/router.js +2 -2
- package/dist/nodefony/src/KernelAdminApi.js +58 -1
- package/dist/nodefony/src/Resolver.js +20 -3
- package/dist/types/index.d.ts +4 -4
- package/dist/types/nodefony/config/config.d.ts +2 -2
- package/dist/types/nodefony/config/defineModuleConfig.d.ts +2 -2
- package/dist/types/nodefony/controller/OAuth2Controller.d.ts +18 -3
- package/dist/types/nodefony/src/KernelAdminApi.d.ts +32 -0
- package/dist/types/nodefony/src/Resolver.d.ts +14 -0
- package/dist/types/nodefony/src/idempotencyStoreRegistry.d.ts +2 -2
- package/docs/controller.md +25 -25
- package/docs/decorateurs.md +5 -5
- package/docs/idempotence.md +1 -1
- package/docs/routing.md +2 -2
- package/docs/templates.md +9 -9
- package/package.json +10 -10
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:
|
|
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
|
`<`) 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:
|
|
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:
|
|
222
|
-
| 2 | Ouverture de la phase mesurée `render` | `phaseStart("render")` (`Controller.ts:
|
|
223
|
-
| 3 | Injection des aides frontend dans les locals | `withFrontendLocals()` (`Controller.ts:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
+
"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.
|
|
47
|
-
"@graphql-tools/schema": "10.1.
|
|
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.
|
|
54
|
+
"@nodefony/http": "^10.0.0-alpha.5",
|
|
55
55
|
"@types/chai": "5.2.3",
|
|
56
|
-
"@types/node": "26.
|
|
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.
|
|
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": "
|
|
64
|
+
"license": "Apache-2.0",
|
|
65
65
|
"readmeFilename": "README.md",
|
|
66
66
|
"contributors": [],
|
|
67
67
|
"peerDependencies": {
|
|
68
|
-
"@nodefony/http": "^10.0.0-alpha.
|
|
69
|
-
"nodefony": "^10.0.0-alpha.
|
|
70
|
-
"zod": "^4.
|
|
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",
|