@nodefony/http 10.0.0-beta.4 → 10.0.0-beta.6
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/README.md +24 -0
- package/dist/_virtual/{_@oxc-project_runtime@0.155.0 → _@oxc-project_runtime@0.157.0}/helpers/esm/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.155.0 → _@oxc-project_runtime@0.157.0}/helpers/esm/decorateParam.js +1 -1
- package/dist/index.js +29 -25
- package/dist/nodefony/command/proxyGenerateCommand.js +2 -2
- package/dist/nodefony/config/config.js +6 -3
- package/dist/nodefony/interfaces/IRequestTrace.js +1 -0
- package/dist/nodefony/service/ProfilerAdminApi.js +17 -3
- package/dist/nodefony/service/audit-logger.js +3 -17
- package/dist/nodefony/service/error-renderer.js +6 -4
- package/dist/nodefony/service/http-kernel.js +191 -40
- package/dist/nodefony/service/pretty-request-logger.js +11 -10
- package/dist/nodefony/service/request-logger.js +1 -1
- package/dist/nodefony/service/reverse-proxy.js +7 -2
- package/dist/nodefony/service/servers/clientError.js +28 -4
- package/dist/nodefony/service/servers/server-h2c.js +5 -5
- package/dist/nodefony/service/servers/server-http.js +5 -3
- package/dist/nodefony/service/servers/server-https.js +12 -5
- package/dist/nodefony/service/servers/server-static.js +1 -6
- package/dist/nodefony/service/servers/server-websocket-secure.js +6 -10
- package/dist/nodefony/service/servers/server-websocket.js +6 -10
- package/dist/nodefony/service/servers/serverShutdown.js +63 -4
- package/dist/nodefony/service/sessions/sessions-service.js +3 -3
- package/dist/nodefony/service/upload/upload-service.js +2 -2
- package/dist/nodefony/src/assets/prebuiltUi.js +23 -5
- package/dist/nodefony/src/context/Context.js +56 -13
- package/dist/nodefony/src/context/http/ByteStream.js +359 -0
- package/dist/nodefony/src/context/http/HttpContext.js +75 -25
- package/dist/nodefony/src/context/http/Request.js +15 -6
- package/dist/nodefony/src/context/http/Response.js +354 -35
- package/dist/nodefony/src/context/http/SseStream.js +81 -146
- package/dist/nodefony/src/context/http/StreamLifecycle.js +273 -0
- package/dist/nodefony/src/context/http/urlFastPath.js +80 -1
- package/dist/nodefony/src/context/http2/Request.js +1 -1
- package/dist/nodefony/src/context/http2/Response.js +28 -5
- package/dist/nodefony/src/context/requestTrace.js +104 -0
- package/dist/nodefony/src/context/timingMode.js +21 -0
- package/dist/nodefony/src/context/transport.js +20 -1
- package/dist/nodefony/src/context/unsentResponse.js +30 -0
- package/dist/nodefony/src/context/websocket/Response.js +4 -2
- package/dist/nodefony/src/context/websocket/WebsocketContext.js +81 -20
- package/dist/nodefony/src/context/websocket/websocketUrl.js +7 -0
- package/dist/nodefony/src/context/websocket/wsBackpressure.js +15 -15
- package/dist/nodefony/src/context/websocket/wsFrameRate.js +71 -0
- package/dist/nodefony/src/context/websocket/wsLogContent.js +55 -17
- package/dist/nodefony/src/cookies/cookie.js +54 -13
- package/dist/nodefony/src/profiler/FrameProfile.js +22 -0
- package/dist/nodefony/src/profiler/Profiler.js +25 -22
- package/dist/nodefony/src/profiler/aggregate.js +26 -6
- package/dist/nodefony/src/proxy/forward.js +109 -9
- package/dist/nodefony/src/proxy/generateProxyConfig.js +6 -2
- package/dist/nodefony/src/proxy/rules.js +29 -14
- package/dist/nodefony/src/servers/upgradeDispatch.js +62 -4
- package/dist/types/index.d.ts +8 -0
- package/dist/types/nodefony/config/config.d.ts +8 -0
- package/dist/types/nodefony/interfaces/IContext.d.ts +9 -0
- package/dist/types/nodefony/interfaces/IRequestTrace.d.ts +56 -0
- package/dist/types/nodefony/interfaces/IReverseProxy.d.ts +8 -0
- package/dist/types/nodefony/interfaces/IRouting.d.ts +16 -0
- package/dist/types/nodefony/interfaces/ISecurity.d.ts +27 -2
- package/dist/types/nodefony/interfaces/index.d.ts +1 -0
- package/dist/types/nodefony/service/ProfilerAdminApi.d.ts +5 -1
- package/dist/types/nodefony/service/audit-logger.d.ts +3 -11
- package/dist/types/nodefony/service/error-renderer.d.ts +5 -4
- package/dist/types/nodefony/service/http-kernel.d.ts +65 -2
- package/dist/types/nodefony/service/servers/clientError.d.ts +3 -2
- package/dist/types/nodefony/service/servers/serverShutdown.d.ts +5 -3
- package/dist/types/nodefony/src/assets/prebuiltUi.d.ts +9 -4
- package/dist/types/nodefony/src/context/Context.d.ts +25 -1
- package/dist/types/nodefony/src/context/http/ByteStream.d.ts +109 -0
- package/dist/types/nodefony/src/context/http/HttpContext.d.ts +60 -4
- package/dist/types/nodefony/src/context/http/Request.d.ts +8 -1
- package/dist/types/nodefony/src/context/http/Response.d.ts +134 -8
- package/dist/types/nodefony/src/context/http/SseStream.d.ts +32 -7
- package/dist/types/nodefony/src/context/http/StreamLifecycle.d.ts +53 -0
- package/dist/types/nodefony/src/context/http/urlFastPath.d.ts +40 -0
- package/dist/types/nodefony/src/context/http2/Response.d.ts +17 -3
- package/dist/types/nodefony/src/context/requestTrace.d.ts +64 -0
- package/dist/types/nodefony/src/context/timingMode.d.ts +23 -0
- package/dist/types/nodefony/src/context/transport.d.ts +17 -0
- package/dist/types/nodefony/src/context/unsentResponse.d.ts +16 -0
- package/dist/types/nodefony/src/context/websocket/WebsocketContext.d.ts +41 -1
- package/dist/types/nodefony/src/context/websocket/websocketUrl.d.ts +4 -0
- package/dist/types/nodefony/src/context/websocket/wsBackpressure.d.ts +12 -2
- package/dist/types/nodefony/src/context/websocket/wsFrameRate.d.ts +69 -0
- package/dist/types/nodefony/src/context/websocket/wsLogContent.d.ts +16 -8
- package/dist/types/nodefony/src/cookies/cookie.d.ts +20 -2
- package/dist/types/nodefony/src/profiler/FrameProfile.d.ts +15 -0
- package/dist/types/nodefony/src/profiler/Profiler.d.ts +27 -102
- package/dist/types/nodefony/src/profiler/aggregate.d.ts +23 -106
- package/dist/types/nodefony/src/proxy/forward.d.ts +30 -2
- package/dist/types/nodefony/src/proxy/rules.d.ts +20 -0
- package/dist/types/nodefony/src/servers/upgradeDispatch.d.ts +41 -1
- package/docs/byte-stream.md +371 -0
- package/docs/cookies.md +13 -3
- package/docs/diagnostics-channel.md +303 -0
- package/docs/index.md +14 -1
- package/docs/observabilite.md +94 -16
- package/docs/reverse-proxy.md +33 -19
- package/docs/servers.md +26 -15
- package/docs/session.md +3 -3
- package/docs/sse.md +27 -20
- package/package.json +16 -16
package/docs/servers.md
CHANGED
|
@@ -22,7 +22,7 @@ tags:
|
|
|
22
22
|
]
|
|
23
23
|
version: "doc"
|
|
24
24
|
status: stable
|
|
25
|
-
updated: 2026-
|
|
25
|
+
updated: 2026-10-30
|
|
26
26
|
source: "src/packages/@nodefony/http/docs/servers.md"
|
|
27
27
|
coverageModule: http
|
|
28
28
|
coverageFiles: servers/server-http.ts,servers/server-https.ts,servers/server-websocket.ts,certificates.ts
|
|
@@ -552,22 +552,26 @@ Depuis `http2Schema` (`config.ts#http2Schema`), appliqué seulement si défini
|
|
|
552
552
|
Depuis `websocketSchema` (`config.ts#websocketSchema`). Les deux sections partagent la forme et les défauts ; le WSS
|
|
553
553
|
lit `websocketSecure` (`config.ts#httpConfigSchema`).
|
|
554
554
|
|
|
555
|
-
| Option
|
|
556
|
-
|
|
|
557
|
-
| `keepaliveInterval`
|
|
558
|
-
| `keepaliveGracePeriod`
|
|
559
|
-
| `closeTimeout`
|
|
560
|
-
| `maxPayload`
|
|
561
|
-
| `allowedOrigins`
|
|
562
|
-
| `perMessageDeflate`
|
|
563
|
-
| `skipUTF8Validation`
|
|
564
|
-
| `autoPong`
|
|
565
|
-
| `allowSynchronousEvents`
|
|
566
|
-
| `maxBackpressure`
|
|
567
|
-
| `backpressurePolicy`
|
|
555
|
+
| Option | Type | Défaut | Effet |
|
|
556
|
+
| ----------------------------- | ------------------- | ------- | ---------------------------------------------------------------------------------------- |
|
|
557
|
+
| `keepaliveInterval` | ms | `20000` | Intervalle des pings — détecte les connexions zombies. |
|
|
558
|
+
| `keepaliveGracePeriod` | ms | `10000` | Délai de grâce après un ping sans réponse avant fermeture. |
|
|
559
|
+
| `closeTimeout` | ms | `5000` | Délai de fermeture propre avant destruction de la socket. |
|
|
560
|
+
| `maxPayload` | octets | `1 MiB` | Taille max d'un message entrant → au-delà, **close 1009** (`config.ts#websocketSchema`). |
|
|
561
|
+
| `allowedOrigins` | bool \| str \| list | `false` | Allowlist d'`Origin` au handshake — **anti-CSWSH** (`config.ts#websocketSchema`). |
|
|
562
|
+
| `perMessageDeflate` | bool \| objet | `false` | Compression RFC 7692. Désactivée par défaut : coût CPU/RAM + risque de _zip bomb_. |
|
|
563
|
+
| `skipUTF8Validation` | bool | `false` | Désactive la validation UTF-8 des frames texte (RFC 6455 §8.1). À laisser `false`. |
|
|
564
|
+
| `autoPong` | bool | `true` | Répond automatiquement aux pings entrants (RFC 6455 §5.5.2-3). À laisser `true`. |
|
|
565
|
+
| `allowSynchronousEvents` | bool | `true` | Émet plusieurs frames d'un même chunk réseau de façon synchrone (débit vs équité). |
|
|
566
|
+
| `maxBackpressure` | octets | `4 MiB` | Seuil du tampon d'envoi par connexion (client lent à recevoir) — anti-OOM. |
|
|
567
|
+
| `backpressurePolicy` | `drop` \| `close` | `drop` | Au-delà du seuil : sauter la frame, ou fermer le client (close 1013). |
|
|
568
|
+
| `backpressureCloseAfterDrops` | frames | `1000` | Solde de frames refusées (+1 refus, −1 envoi) qui ferme en 1013 ; `0` = jamais. |
|
|
569
|
+
| `maxFramesPerSecond` | trames / s | `0` | Trames REÇUES admises par connexion ; au-delà, écartées avant décodage. `0` = coupé. |
|
|
570
|
+
| `frameRateCloseAfterRejects` | trames | `1000` | Solde de trames écartées (+1 écartée, −1 admise) qui ferme en 1008 ; `0` = jamais. |
|
|
568
571
|
|
|
569
572
|
> [!WARNING]
|
|
570
|
-
> `keepalive*`, `closeTimeout`, `maxBackpressure
|
|
573
|
+
> `keepalive*`, `closeTimeout`, `maxBackpressure`, `backpressurePolicy`,
|
|
574
|
+
> `backpressureCloseAfterDrops`, `maxFramesPerSecond` et `frameRateCloseAfterRejects` sont des **réglages
|
|
571
575
|
> Nodefony**, pas des options de `ws` : la bibliothèque les ignore, c'est le framework qui les
|
|
572
576
|
> implémente. À l'inverse, `server`, `noServer`, `clientTracking`, `host`, `port` et `backlog` sont
|
|
573
577
|
> **gérés par Nodefony** et non exposés — les forcer n'aurait pas d'effet.
|
|
@@ -952,6 +956,13 @@ descripteur et du TLS, et couvre tous les pods. Ne l'activer que sur une machine
|
|
|
952
956
|
l'OOM — un seul lent peut plomber une diffusion générale. La politique par défaut, `drop`, saute la
|
|
953
957
|
frame et garde le client connecté.
|
|
954
958
|
|
|
959
|
+
Dans l'autre sens, `maxFramesPerSecond` borne le **nombre** de trames qu'une connexion envoie
|
|
960
|
+
(désactivé par défaut). Le compte se fait à l'arrivée de la trame brute
|
|
961
|
+
(`wsFrameRate.ts#admitFrame`) : une trame écartée ne paie ni décodage ni routage, elle est
|
|
962
|
+
comptée (`frameRateRejectedTotal()`, relayé par la sonde du hub temps réel) et la connexion reste
|
|
963
|
+
ouverte — jusqu'à ce que le solde de refus atteigne `frameRateCloseAfterRejects`, qui ferme en
|
|
964
|
+
**1008**. Seul un flux au-delà du double de la borne fait monter ce solde ; un pic passager non.
|
|
965
|
+
|
|
955
966
|
## ⚡ Performance & mémoire
|
|
956
967
|
|
|
957
968
|
Le transport est du **chemin chaud absolu** : ce qui coûte ici est multiplié par le nombre de requêtes
|
package/docs/session.md
CHANGED
|
@@ -469,8 +469,8 @@ timer (`gcIntervalS: 0`).
|
|
|
469
469
|
|
|
470
470
|
## Entités de persistance
|
|
471
471
|
|
|
472
|
-
**Drizzle (SQL).** La table est décrite une seule fois en spec logique (`
|
|
473
|
-
`sessionEntity.ts#
|
|
472
|
+
**Drizzle (SQL).** La table est décrite une seule fois en spec logique (`SESSION_TABLE`,
|
|
473
|
+
`sessionEntity.ts#SESSION_TABLE`) et déclinée par dialecte par `defineTable()` (`colKit.ts#defineTable`) — mêmes **noms** de
|
|
474
474
|
colonnes partout, donc un store dialect-agnostique.
|
|
475
475
|
|
|
476
476
|
| Colonne | Type logique | SQLite | PostgreSQL | MySQL / MariaDB | Rôle |
|
|
@@ -485,7 +485,7 @@ colonnes partout, donc un store dialect-agnostique.
|
|
|
485
485
|
|
|
486
486
|
En MySQL/MariaDB, une colonne texte indexée devient `varchar` (un `TEXT` InnoDB n'est pas indexable
|
|
487
487
|
sans préfixe) et le type JSON passe par un type compatible qui tolère MariaDB, laquelle stocke le JSON
|
|
488
|
-
en `LONGTEXT` (`colKit.ts#
|
|
488
|
+
en `LONGTEXT` (`colKit.mysql.ts#buildMySqlTable`).
|
|
489
489
|
|
|
490
490
|
**Mongoose (MongoDB).** Schéma équivalent (`@nodefony/mongoose/nodefony/entity/sessionEntity.ts#schema`) :
|
|
491
491
|
`session_id` (String, index **unique**), `Attributes`/`flashBag`/`metaBag` (Object, défaut `{}`), `user`
|
package/docs/sse.md
CHANGED
|
@@ -23,7 +23,7 @@ status: stable
|
|
|
23
23
|
updated: 2026-10-08
|
|
24
24
|
source: "src/packages/@nodefony/http/docs/sse.md"
|
|
25
25
|
coverageModule: http
|
|
26
|
-
coverageFiles: context/http/SseStream.ts
|
|
26
|
+
coverageFiles: context/http/SseStream.ts,context/http/StreamLifecycle.ts
|
|
27
27
|
---
|
|
28
28
|
|
|
29
29
|
📍 [Documentation](../../../../../docs/index.md) › [@nodefony/http](index.md) › **Flux SSE**
|
|
@@ -153,16 +153,16 @@ data: {"step":"écriture"}
|
|
|
153
153
|
|
|
154
154
|
### Côté serveur — `this.renderSse()` et l'objet `SseStream`
|
|
155
155
|
|
|
156
|
-
| Membre | Rôle
|
|
157
|
-
| ------------------------------- |
|
|
158
|
-
| `this.renderSse(options?)` | ouvre le flux (`Controller.renderSse()`, `Controller.ts#Controller.renderSse`) ; lève sur WebSocket
|
|
159
|
-
| `this.acceptsSse()` | le client a-t-il demandé `text/event-stream` ? (`Controller.acceptsSse()`, `Controller.ts#Controller.acceptsSse`)
|
|
160
|
-
| `sse.send(data, { event, id })` | un événement ; texte tel quel, objet en JSON (`SseStream.send()`, `SseStream.ts#SseStream.send`)
|
|
161
|
-
| `sse.comment(text)` | un commentaire, ignoré par le client
|
|
162
|
-
| `sse.retry(ms)` | impose le délai de reconnexion du client
|
|
163
|
-
| `sse.onClose(fn)` | appelé à la fermeture, quel que soit le bout qui ferme (`SseStream.onClose()`, `SseStream.ts#SseStream.onClose`)
|
|
164
|
-
| `sse.close()` | termine la requête, idempotent (`SseStream.close()`, `SseStream.ts#SseStream.close`)
|
|
165
|
-
| `sse.closed` | le flux est-il fermé — à tester dans une boucle longue
|
|
156
|
+
| Membre | Rôle |
|
|
157
|
+
| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
158
|
+
| `this.renderSse(options?)` | ouvre le flux (`Controller.renderSse()`, `Controller.ts#Controller.renderSse`) ; lève sur WebSocket |
|
|
159
|
+
| `this.acceptsSse()` | le client a-t-il demandé `text/event-stream` ? (`Controller.acceptsSse()`, `Controller.ts#Controller.acceptsSse`) |
|
|
160
|
+
| `sse.send(data, { event, id })` | un événement ; texte tel quel, objet en JSON ; des octets (`Uint8Array`, `Buffer`) lèvent un `TypeError` : les encoder soi-même (base64) (`SseStream.send()`, `SseStream.ts#SseStream.send`) |
|
|
161
|
+
| `sse.comment(text)` | un commentaire, ignoré par le client |
|
|
162
|
+
| `sse.retry(ms)` | impose le délai de reconnexion du client |
|
|
163
|
+
| `sse.onClose(fn)` | appelé à la fermeture, quel que soit le bout qui ferme (`SseStream.onClose()`, `SseStream.ts#SseStream.onClose`) |
|
|
164
|
+
| `sse.close()` | termine la requête, idempotent (`SseStream.close()`, `SseStream.ts#SseStream.close`) |
|
|
165
|
+
| `sse.closed` | le flux est-il fermé — à tester dans une boucle longue |
|
|
166
166
|
|
|
167
167
|
Options de `renderSse()` :
|
|
168
168
|
|
|
@@ -214,18 +214,25 @@ le même qui relit le flux dans les tests du serveur.
|
|
|
214
214
|
|
|
215
215
|
## 🏗️ Architecture interne — ce que fait l'ouverture
|
|
216
216
|
|
|
217
|
+
L'ouverture repose sur le **cycle de vie commun aux réponses en flux**
|
|
218
|
+
(`StreamLifecycle.ts#openStreamLifecycle`, non exporté) — la même brique sert le [flux d'octets](byte-stream.md) :
|
|
219
|
+
|
|
217
220
|
1. **La réponse est prise** (`context.sended`) : plus rien ne peut répondre à la place du flux.
|
|
218
|
-
2. **
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
221
|
+
2. **Le transport se constate** : flux HTTP/2, ou réponse HTTP/1.1 ; ni l'un ni l'autre → 500,
|
|
222
|
+
avant d'avoir rien écrit.
|
|
223
|
+
3. **La fermeture de la réponse est écoutée AVANT toute attente** : un client parti pendant la
|
|
224
|
+
sauvegarde de la session est vu, et le flux naît fermé (`closed`) sans rien écrire. Un client
|
|
225
|
+
déjà parti ne prend pas de place dans le plafond par IP.
|
|
226
|
+
4. **La session est sauvée** s'il y en a une — ses cookies partent avec les en-têtes.
|
|
227
|
+
5. **Les en-têtes partent** — `respond()` en HTTP/2, `flushHeaders()` en HTTP/1.1 — et le délai
|
|
222
228
|
d'inactivité de la requête est **désarmé** : sans cela, le flux vivant prendrait un 408 au bout
|
|
223
|
-
de 30 s.
|
|
224
|
-
|
|
229
|
+
de 30 s (`SseStream.ts#startSseStream`).
|
|
230
|
+
6. **Le battement démarre** sur un minuteur `unref()`.
|
|
225
231
|
|
|
226
|
-
La fin, quel que soit le bout qui ferme, passe par **un seul** nettoyage
|
|
227
|
-
|
|
228
|
-
|
|
232
|
+
La fin, quel que soit le bout qui ferme, passe par **un seul** nettoyage
|
|
233
|
+
(`StreamLifecycle.ts#StreamLifecycle.finish`) : écouteur `close` retiré, minuteurs de durée de vie et
|
|
234
|
+
de blocage arrêtés, sortie du registre de révocation, puis le nettoyage propre au SSE (battement,
|
|
235
|
+
écouteur `drain`, attente libérée), puis les écouteurs `onClose`.
|
|
229
236
|
|
|
230
237
|
## 🔐 Sécurité
|
|
231
238
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nodefony/http",
|
|
3
|
-
"version": "10.0.0-beta.
|
|
3
|
+
"version": "10.0.0-beta.6",
|
|
4
4
|
"description": "Serveurs HTTP, HTTPS, HTTP/2 et WebSocket natifs pour Nodefony : sessions, contextes de requête, certificats TLS",
|
|
5
5
|
"author": "Christophe CAMENSULI <ccamensuli@gmail.com>",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -51,36 +51,36 @@
|
|
|
51
51
|
"test": "./nodefony/tests"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@fastify/busboy": "3.2.
|
|
55
|
-
"
|
|
54
|
+
"@fastify/busboy": "3.2.5",
|
|
55
|
+
"@types/ms": "2.1.0",
|
|
56
|
+
"@types/qs": "6.15.1",
|
|
57
|
+
"@types/serve-static": "2.2.0",
|
|
58
|
+
"@types/ws": "8.18.2",
|
|
59
|
+
"@types/xml2js": "0.4.14",
|
|
60
|
+
"cookie": "2.0.2",
|
|
56
61
|
"mime-types": "3.0.2",
|
|
57
62
|
"ms": "^2.1.3",
|
|
58
|
-
"qs": "^6.
|
|
63
|
+
"qs": "^6.17.1",
|
|
59
64
|
"serve-static": "2.2.1",
|
|
60
|
-
"tslib": "2.
|
|
61
|
-
"ws": "8.22.
|
|
65
|
+
"tslib": "2.9.1",
|
|
66
|
+
"ws": "8.22.1",
|
|
62
67
|
"xml2js": "0.6.2"
|
|
63
68
|
},
|
|
64
69
|
"devDependencies": {
|
|
65
70
|
"@types/chai": "5.2.3",
|
|
66
71
|
"@types/mime-types": "3.0.1",
|
|
67
|
-
"@types/
|
|
68
|
-
"@types/node": "26.6.5",
|
|
69
|
-
"@types/qs": "6.15.1",
|
|
70
|
-
"@types/serve-static": "2.2.0",
|
|
72
|
+
"@types/node": "26.6.6",
|
|
71
73
|
"@types/websocket": "1.0.10",
|
|
72
|
-
"@
|
|
73
|
-
"
|
|
74
|
-
"@vitest/coverage-v8": "5.0.5",
|
|
75
|
-
"nodefony": "^10.0.0-beta.4",
|
|
74
|
+
"@vitest/coverage-v8": "5.1.0",
|
|
75
|
+
"nodefony": "^10.0.0-beta.6",
|
|
76
76
|
"tsx": "4.23.15",
|
|
77
|
-
"vitest": "5.0
|
|
77
|
+
"vitest": "5.1.0"
|
|
78
78
|
},
|
|
79
79
|
"license": "Apache-2.0",
|
|
80
80
|
"readmeFilename": "README.md",
|
|
81
81
|
"contributors": [],
|
|
82
82
|
"peerDependencies": {
|
|
83
|
-
"nodefony": "^10.0.0-beta.
|
|
83
|
+
"nodefony": "^10.0.0-beta.6",
|
|
84
84
|
"zod": "^4.6.7"
|
|
85
85
|
},
|
|
86
86
|
"files": [
|