Aller au contenu

Des API REST TypeScript orientées contrat et sûres par défaut, pensées pour les équipes qui développent avec l’IA

DaloyJS fournit des réglages sûrs par défaut, refuse de démarrer en production face aux erreurs de configuration qu’il connaît et fonctionne sans aucune dépendance d’exécution, avec une chaîne de publication renforcée et signée avec provenance. Aucun framework ne rend une application totalement sûre ni n’arrête toutes les attaques sur la chaîne d’approvisionnement : la documentation indique donc ce qui est activé par défaut, ce que vous activez vous-même et les risques qui subsistent.

Les premiers pas, l’installation, le tutoriel et les guides essentiels (routage, validation, erreurs, OpenAPI, client typé, sécurité) existent en français ; le reste de la documentation et le blog sont en anglais.

$ pnpm create daloy@latest my-api
  • Plus de 3000 tests du framework au vert
  • Seuils de couverture : ≥90 % lignes et fonctions, ≥92 % branches
  • 0 dépendance d’exécution
  • Node 24 LTS, Node 26+, Bun, Deno, Cloudflare
  • Licence MIT
ᜇᜎᜓᜌ᜔ Daloy signifie flux en tagalog (se prononce da-loy).À proposLe nomTutoriel : l’API d’une librairie

Sécurité et chaîne d’approvisionnement

Sûr par défaut : la couche de défense pour le code généré par l’IA

Quand un modèle d’IA écrit le code, la vitesse de frappe du développeur n’est plus le goulot d’étranglement : ce qui compte, c’est la sécurité à l’exécution et l’intégrité de la chaîne d’approvisionnement. DaloyJS applique des garde-fous au niveau de l’exécution : limites de taille du corps des requêtes, délais d’expiration, protection contre la pollution de prototype, masquage des détails des erreurs 5xx et refus de démarrer sur une configuration erronée, sans aucune dépendance transitive à exploiter.

Réglages d’exécution sûrs par défaut

Contrairement aux frameworks qui laissent les protections de base aux plugins ou à un routage des erreurs fait main, le cœur de DaloyJS démarre avec les garde-fous activés : limites de taille du corps, délais d’expiration des requêtes, JSON protégé contre la pollution de prototype, véritables réponses 405 Method Not Allowed et masquage des détails des erreurs 5xx qui échoue en position sûre (actif partout sauf dans un environnement de développement ou de test déclaré explicitement). En production, il refuse de démarrer face aux erreurs de configuration qu’il connaît, comme des secrets de session faibles ou des cookies de session sans CSRF.
Limites du corps (1 Mio par défaut)Délais d’expirationDéfense contre la pollution de prototypeRFC 9457 problem+jsonValidation stricte des schémasContrôles de configuration au démarrage

Zéro dépendance d’exécution

Installer @daloyjs/core n’ajoute exactement aucun paquet transitif. Aucun script postinstall à auditer, aucune CVE surprise venue de dépendances que vous n’avez jamais choisies. Le framework n’ajoute aucun arbre de dépendances qui lui soit propre ; les autres dépendances de votre application restent à vérifier par vos soins.
0paquet transitif dans @daloyjs/core

Modèles renforcés pour la chaîne d’approvisionnement

Choisissez pnpm dans create-daloy et pnpm-workspace.yaml est déjà renforcé : ignoreScripts bloque les charges malveillantes des scripts d’installation (pas le code exécuté à l’import), un minimumReleaseAge de 24 heures laisse passer les versions malveillantes fraîchement publiées qui sont repérées à temps, et verifyStoreIntegrity garantit l’honnêteté des installations. Le paquet de sécurité optionnel ajoute des GitHub Actions renforcées, Dependabot, CODEOWNERS, SECURITY.md, la vérification de l’origine du lockfile, des modèles de conteneur sans root avec tini et daloy doctor, un validateur de configuration de production.
ignoreScriptsminimumReleaseAge de 24 hverifyStoreIntegrityActions épinglées par SHAAudit daloy doctor

Des modèles conçus pour l’IA

Chaque projet créé avec create-daloy inclut un AGENTS.md et des skills de contexte, et cette documentation est lisible via MCP. Les agents de code qui lisent AGENTS.md adoptent les conventions de votre framework, ses règles de routage et ses primitives de sécurité sans rituel de prompt engineering.
AGENTS.md inclusSkills de contexteLisible via MCP

Streaming et observabilité

Des utilitaires SSE et NDJSON qui respectent la contre-pression, plus un hook de traces OpenTelemetry qui émet des spans de serveur HTTP avec les attributs des conventions sémantiques.
SSE avec contre-pressionStreaming NDJSONSpans HTTP OTel

Portable entre les runtimes

Le cœur ne voit que Request → Response. Les adaptateurs vivent en bordure : Node, Bun, Deno, Cloudflare Workers, Vercel, Fastly Compute et AWS Lambda. Même application, mêmes tests.
Node 24+BunDenoCloudflare WorkersVercelAWS Lambda

Orienté contrat dès la conception

Une seule définition de route fait foi pour la validation, les types, OpenAPI 3.1, le client typé et les tests de contrat intégrés : les divergences ont moins d’endroits où se cacher.
Validation à l’exécutionSpécification OpenAPI 3.1Client typé Hey APITests de contrat intégrés

Clients typés avec Hey API

Lancez pnpm gen et obtenez un SDK fetch entièrement typé, pour n’importe quel consommateur et dans n’importe quel projet TS, généré à partir de votre vraie spécification. Ou passez-vous de la génération de code grâce au client typé en processus.
pnpm genZéro configurationSDK fetch typé de bout en bout

Tout est fourni

Des sessions adaptées à l’edge, des WebSockets qui puisent dans les mêmes quotas de limitation de débit que HTTP, des logs structurés et un arrêt propre : la tuyauterie de production que vous assemblez d’habitude à coups de plugins, toujours sans aucune dépendance d’exécution.
Sessions edgeLimites de débit WebSocketLogs structurésArrêt propre

Benchmarks et performances

Les chiffres, avec les astérisques

Quand des agents d’IA enchaînent les outils et envoient des requêtes à forte concurrence, le débit et la latence de démarrage à froid deviennent critiques. DaloyJS active les contrôles de sécurité par défaut, et ces benchmarks mesurent les performances avec toutes les protections en place.

Comment DaloyJS se compare

Des chiffres réels issus de la suite de benchmarks du dépôt. Choisissez une métrique, mais gardez à l’esprit les réserves ci-dessous : aucune de ces comparaisons n’est parfaitement équitable.

Dépendances transitives installées

Chaque paquet tiré par l’installation est une surface d’attaque à laquelle quelqu’un doit faire confiance. DaloyJS et Hono sont les deux seuls à n’en ajouter aucune.

Ce que cela signifie pour vous : Moins de paquets à qui faire confiance, c’est moins de CVE et aucun script postinstall inattendu. Zéro dépendance signifie que le framework n’ouvre aucune porte de son côté dans la chaîne d’approvisionnement ; le reste de votre arbre de dépendances reste à vérifier par vos soins.

À retenir : DaloyJS installe 0 dépendance transitive, à égalité avec Hono pour la plus petite surface d’exposition de la chaîne d’approvisionnement, alors qu’une application NestJS sécurisée en embarque 86.

Apple M3 Max · 16 cores · Node v26.4.0 · octobre 2026 · @daloyjs/core 1.5.4 · code dans bench/cross-framework

Pourquoi on compare des pommes et des oranges

Ces frameworks ne sont pas le même outil : un graphique face à face ressemble donc plus à une comparaison entre pommes et oranges qu’à une course équitable. Voici, simplement, ce que ces chiffres prouvent et ce qu’ils ne prouvent pas.
  • Des pommes et des oranges, pas une comparaison à armes égales. Ce sont des outils différents qui font des quantités de travail différentes. À chaque requête, DaloyJS valide le corps contre votre schéma Zod ou Valibot et applique des en-têtes sécurisés, un identifiant de requête, des limites de taille du corps et des délais d’expiration, le tout par défaut. Les applications « minimales » des autres frameworks n’en font presque rien, et même la « parité de sécurité » l’égale rarement point par point. Une partie de chaque chiffre de DaloyJS correspond donc à de la sécurité et de la validation que vous devriez sinon construire vous-même.
  • La méthode de mesure de la taille diffère : DaloyJS est un paquet unique sans dépendances, tandis que les autres résolvent des arbres transitifs dont la taille exacte dépend de la date de génération du lockfile.
  • Le débit dépend de la charge : avec une pile de middlewares comparable des deux côtés, DaloyJS devance Hono d’environ 27 % sur ces routes GET et d’environ 58 % sur la route POST avec corps, et DaloyJS valide en plus ce corps avec Zod. Les services réels sont généralement limités par la base de données et les entrées/sorties, pas par le dispatch du framework : ces micro-chiffres prédisent donc rarement la production.
  • Des environnements d’exécution cibles différents : certains frameworks (par exemple Elysia) sont optimisés pour Bun, mais sont mesurés ici avec leurs adaptateurs Node pour disposer d’une base équitable sur un seul runtime.
  • Une seule machine, un seul moment : un Apple M3 Max, Node v26.4.0, octobre 2026, avec @daloyjs/core 1.5.4 et une autre charge en arrière-plan sur la machine (les deux frameworks ont été mesurés l’un après l’autre, la comparaison tient donc mieux que les chiffres absolus). Votre matériel, votre runtime et vos versions feront bouger ces chiffres.

Pensé pour les machines : agents et outils d’IA

DaloyJS est prêt pour MCP

Le Model Context Protocol (MCP) est le standard ouvert qu’utilisent des agents d’IA comme Claude, Cursor et VS Code pour appeler des outils et lire de la documentation. DaloyJS le prend en charge des deux côtés : votre application peut devenir un serveur MCP, et cette documentation (en anglais) en est déjà un.

Transformez votre API en serveur MCP

DaloyJS construit des serveurs MCP avec @daloyjs/core seul, sans SDK : transport Streamable HTTP, validation des schémas d’entrée et une protection au démarrage en production qui refuse de se lancer si un endpoint MCP n’a aucun hook d’authentification dans sa chaîne. Elle vérifie que le hook est présent et, en production, qu’il s’est exécuté à chaque requête, pas qu’il refuse qui que ce soit : testez donc aussi votre authentification.

Créer un serveur MCP →
ts
import { App, bearerAuth, createMcpHandler, mcpRoutes } from "@daloyjs/core";

const mcp = createMcpHandler({
  serverInfo: { name: "inventory-mcp", version: "1.0.0" },
  tools: [/* vos outils, avec des schémas d’entrée validés */],
});

const app = new App();
app.use(bearerAuth({ validate: checkToken })); // sans hook d’authentification, la production refuse de démarrer
for (const route of mcpRoutes("/mcp", mcp)) {
  app.route(route); // votre API est désormais aussi un serveur MCP
}

Lisez cette documentation via MCP

Un endpoint public en lecture seule, dans lequel votre agent de code peut chercher et lire sans copier-coller. Aucune clé d’API nécessaire.

Endpoint

Pointez n’importe quel client compatible MCP vers cette URL :
https://daloyjs.dev/mcp
  • search_docsRecherche par mots-clés dans toutes les pages de la documentation, triée par pertinence.
  • get_docLit le texte complet d’une page à partir de sa route ou de son slug.
  • list_docsParcourt toutes les pages de documentation disponibles en un seul appel.

Ajoutez-le à la configuration de votre client MCP

json
{
  "mcpServers": {
    "daloyjs-docs": {
      "url": "https://daloyjs.dev/mcp"
    }
  }
}

Vous utilisez un client qui ne gère que stdio ? Faites le pont avec npx -y mcp-remote https://daloyjs.dev/mcp.

Limiter le rayon d’impact

Des contrats comme enceintes de sécurité, pas comme syntaxe décorative

Dans un flux de travail centré sur l’IA, les contrats ne sont pas un luxe esthétique pour humains : ce sont des frontières que la machine fait respecter et qui empêchent des structures de données hallucinées de fuir d’un composant à l’autre. Un seul contrat de route valide strictement les requêtes, borne les réponses et produit en direct la spécification OpenAPI 3.1 et le client typé.

flux du contratdéfinir une fois -> générer le reste
01contratGET /books/:id + z.object(...)
02validationà l’exécution, dans les deux sens
03OpenAPI 3.1spécification en direct + /docs
04client typépnpm gen -> SDK fetch
ts
import { z } from "zod";
import { App, secureHeaders, rateLimit, requestId } from "@daloyjs/core";
import { serve } from "@daloyjs/core/node";

const app = new App({ bodyLimitBytes: 1 << 20, requestTimeoutMs: 5_000 });

// new App() applique déjà requestId() et secureHeaders() automatiquement ;
// ces appels explicites ne font que personnaliser (et remplacer) les valeurs par défaut.
app.use(requestId());
app.use(secureHeaders());
app.use(rateLimit({ windowMs: 60_000, max: 120 })); // par IP client par défaut ; derrière un proxy, configurez behindProxy ou keyGenerator

app.get(
  "/books/:id",
  {
    request: { params: z.object({ id: z.string() }) },
    responses: {
      200: { description: "Trouvé", body: z.object({ id: z.string(), title: z.string() }) },
      404: { description: "Introuvable" },
    },
  },
  async ({ params }) => ({
    status: 200,
    body: { id: params.id, title: `Livre ${params.id}` },
  }),
);

serve(app, { port: 3000 });

Référence d’API Scalar, en une ligne

Scalar est le successeur moderne de Swagger UI : rapide, épuré, avec un mode sombre natif et des requêtes d’essai intégrées. Dans DaloyJS, c’est l’interface de documentation par défaut, pas un plugin : docs: true sur le constructeur App monte automatiquement cette page sur /docs et la spécification OpenAPI 3.1 en direct sur /openapi.json.

Générée à partir des contrats de vos routes, sans code supplémentaire. Vous préférez Swagger UI ou Redoc ? Les deux sont à un champ de configuration près. Guide OpenAPI et interface de documentation →

Compromis de l’écosystème

Le meilleur de chaque concurrent, avec moins de compromis

DaloyJS ne cherche pas à gagner sur une seule case. Il cherche à supprimer le travail de colle entre les meilleures idées que les développeurs apprécient déjà.

Vous voulezAujourd’hui : réglages par défaut de pnpm + cœur sans dépendance

Un renforcement portable de la chaîne d’approvisionnement pour vos applications

Ce que DaloyJS vous apporte

Réglages d’installation pnpm renforcés, lockfiles à l’origine vérifiée, SBOM + provenance npm

Vous voulezAujourd’hui : Hono

S’adapter au serverless / à l’edge

Ce que DaloyJS vous apporte

Cœur basé sur les standards du web, adaptateurs multi-runtime

Vous voulezAujourd’hui : Fastify

Des opérations et une documentation Node matures

Ce que DaloyJS vous apporte

Plugins encapsulés, logs structurés, arrêt propre

Vous voulezAujourd’hui : Elysia

Une DX moderne centrée sur TS, compatible Bun

Ce que DaloyJS vous apporte

Handlers, contexte et client typés de bout en bout

Vous voulezAujourd’hui : FastAPI

La meilleure ergonomie OpenAPI

Ce que DaloyJS vous apporte

OpenAPI 3.1 intégré à partir d’une seule définition de route

Vous voulezAujourd’hui : Hey API

La meilleure génération de clients typés

Ce que DaloyJS vous apporte

pnpm gen → SDK fetch entièrement typé

Envie de livrer avec des réglages sûrs par défaut ?

Créez un projet en quelques secondes avec une installation renforcée pour votre gestionnaire de paquets, une CI générée qui bloque les scripts d’installation, des GitHub Actions épinglées, Dependabot, CODEOWNERS et la vérification de l’origine du lockfile. Gardez ensuite le contrat à mesure que l’application grandit : la même application tourne sur Node, Bun, Deno et Cloudflare Workers.

Soutenir le projet

Si DaloyJS vous fait gagner du temps, vous pouvez m’offrir un café

DaloyJS est gratuit et sous licence MIT. Si la documentation, les articles ou le framework lui-même vous ont aidé à livrer quelque chose avec un peu moins de drame, un café est une façon parfaitement raisonnable de faire vivre le projet.