[{"data":1,"prerenderedAt":928},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces":137},[4],{"title":5,"path":6,"stem":7,"children":8,"page":44},"Fr","\u002Ffr","fr",[9],{"title":10,"path":11,"stem":12,"children":13},"Qu'est-ce que Fougere","\u002Ffr\u002Fdocs","fr\u002Fdocs\u002Findex",[14,15,19,23,27,45,66,95,116],{"title":10,"path":11,"stem":12},{"title":16,"path":17,"stem":18},"Démarrer","\u002Ffr\u002Fdocs\u002Fgetting-started","fr\u002Fdocs\u002F01.getting-started",{"title":20,"path":21,"stem":22},"App Nuxt existante","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F03.cli",{"title":28,"path":29,"stem":30,"children":31,"page":44},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[32,36,40],{"title":33,"path":34,"stem":35},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":37,"path":38,"stem":39},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":41,"path":42,"stem":43},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",false,{"title":46,"path":47,"stem":48,"children":49,"page":44},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[50,54,58,62],{"title":51,"path":52,"stem":53},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":55,"path":56,"stem":57},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":59,"path":60,"stem":61},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":63,"path":64,"stem":65},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":67,"path":68,"stem":69,"children":70,"page":44},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[71,75,79,83,87,91],{"title":72,"path":73,"stem":74},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":76,"path":77,"stem":78},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":80,"path":81,"stem":82},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":84,"path":85,"stem":86},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":88,"path":89,"stem":90},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":92,"path":93,"stem":94},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":96,"path":97,"stem":98,"children":99,"page":44},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[100,104,108,112],{"title":101,"path":102,"stem":103},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":105,"path":106,"stem":107},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":109,"path":110,"stem":111},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":113,"path":114,"stem":115},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":117,"path":118,"stem":119,"children":120,"page":44},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[121,125,129,133],{"title":122,"path":123,"stem":124},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":126,"path":127,"stem":128},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":130,"path":131,"stem":132},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":134,"path":135,"stem":136},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"id":138,"title":126,"body":139,"description":923,"extension":924,"meta":925,"navigation":624,"path":127,"seo":926,"stem":128,"__hash__":927},"docs_fr\u002Ffr\u002Fdocs\u002F6.infra\u002F2.surfaces.md",{"type":140,"value":141,"toc":912},"minimark",[142,147,163,168,176,206,287,290,295,310,321,329,333,348,438,479,482,523,527,541,548,752,769,779,782,880,889,892,896,902,908],[143,144,146],"h1",{"id":145},"surfaces","Surfaces",[148,149,150,151,155,156,162],"p",{},"Une ",[152,153,154],"strong",{},"surface"," adapte un protocole aux opérations d'une Frond en trois étapes : parser la\nrequête, appeler ",[157,158,159],"em",{},[160,161,113],"a",{"href":114},", puis formater la réponse. La logique\nmétier reste dans les handlers.",[164,165,167],"h2",{"id":166},"le-framework-nest-pas-le-process","Le framework n'est pas le process",[148,169,170,171,175],{},"Fougere n'ouvre aucun socket. ",[172,173,174],"code",{},"@fougere\u002Fcore"," dépend du container, du schéma et de\nTypeScript — d'aucun serveur. Une opération est une fonction ; HTTP est une projection\nparmi d'autres, pas le lieu où elle vit.",[148,177,178,181,182,185,186,189,190,193,194,197,198,201,202,205],{},[172,179,180],{},"@fougere\u002Fhttp"," déclare une interface, ",[172,183,184],{},"HttpRouter",", et n'a ",[152,187,188],{},"aucune dépendance",", pas même\nen peer. Vous construisez votre Hono ou votre Fastify, vous le passez à\n",[172,191,192],{},"createHonoRouter(app)"," ou ",[172,195,196],{},"createFastifyRouter(app)",", et les surfaces programment contre\nl'interface. ",[172,199,200],{},"RequestContext.request"," est un ",[172,203,204],{},"Request"," du standard Web.",[207,208,209,222],"table",{},[210,211,212],"thead",{},[213,214,215,219],"tr",{},[216,217,218],"th",{},"Ce que vous amenez",[216,220,221],{},"Ce que Fougere y branche",[223,224,225,241,252,260,275],"tbody",{},[213,226,227,231],{},[228,229,230],"td",{},"Hono, Fastify",[228,232,233,236,237,240],{},[172,234,235],{},"createHonoRouter"," \u002F ",[172,238,239],{},"createFastifyRouter",", puis REST",[213,242,243,246],{},[228,244,245],{},"votre serveur GraphQL (Apollo, Yoga…)",[228,247,248,251],{},[172,249,250],{},"registerAll(builder, app)"," rend un schéma Pothos",[213,253,254,257],{},[228,255,256],{},"Nuxt \u002F Nitro",[228,258,259],{},"le module monte l'enveloppe et le catch-all REST",[213,261,262,265],{},[228,263,264],{},"rien du tout",[228,266,267,270,271,274],{},[172,268,269],{},"fougere serve"," expose la Frond en JSON-RPC, ",[172,272,273],{},"fougere call"," l'appelle depuis un shell",[213,276,277,280],{},[228,278,279],{},"votre propre boucle",[228,281,282,286],{},[160,283,284],{"href":114},[172,285,113],{}," — un appel est une valeur, pas une requête",[148,288,289],{},"Deux conséquences pratiques. Changer de serveur HTTP déplace vos routes, pas vos handlers.\nEt un test appelle l'opération directement, sans lever de port.",[291,292,294],"h3",{"id":293},"et-le-juge-va-là-où-va-javascript","Et le juge va là où va JavaScript",[148,296,297,298,301,302,305,306,309],{},"La même déclaration s'exécute des deux côtés du réseau. Le moteur de validation\n(",[172,299,300],{},"@cfworker\u002Fjson-schema",") a été choisi pour tourner en environnement edge, et\n",[172,303,304],{},"@fougere\u002Fcore\u002Fcontract"," est publié comme sous-chemin sans aucun builtin Node dans son\ngraphe d'import. Le juge qui refuse un formulaire dans le navigateur est donc ",[157,307,308],{},"le même\nobjet"," que celui qui refuse le corps à la façade — pas une règle recopiée à l'identique,\nla classe elle-même.",[148,311,312,313,316,317,320],{},"Une réserve, parce que la nuance compte : c'est le ",[152,314,315],{},"contrat"," qui est ubiquitaire, pas\nl'app. Le boot lit les sources d'une Frond avec l'API du compilateur TypeScript et jiti,\ndepuis ",[172,318,319],{},"process.cwd()"," — cela demande Node. Ce qui voyage jusqu'au navigateur ou jusqu'à\nun worker, c'est la déclaration, sa validation et le format d'appel.",[148,322,323,324,328],{},"L'",[160,325,327],{"href":326},"\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands#le-fil-et-le-ssr","enveloppe"," transmet directement la\nvaleur d'appel. REST traduit des verbes et des chemins ; GraphQL traduit une requête. Ces\nsurfaces appellent ensuite la même façade.",[164,330,332],{"id":331},"rest-montée","REST — montée",[148,334,335,336,339,340,343,344,347],{},"Le module Nuxt monte un catch-all REST sous ",[172,337,338],{},"\u002Fapi\u002F{frond}\u002F{pluriel}"," — le pluriel dérive\ndu nom de l'entité (",[172,341,342],{},"post → posts",", ",[172,345,346],{},"category → categories",") :",[207,349,350,360],{},[210,351,352],{},[213,353,354,357],{},[216,355,356],{},"Route",[216,358,359],{},"Opération",[223,361,362,374,386,398,410,422],{},[213,363,364,369],{},[228,365,366],{},[172,367,368],{},"GET \u002Fapi\u002Fblog\u002Fposts",[228,370,371],{},[172,372,373],{},"post.list",[213,375,376,381],{},[228,377,378],{},[172,379,380],{},"POST \u002Fapi\u002Fblog\u002Fposts",[228,382,383],{},[172,384,385],{},"post.create",[213,387,388,393],{},[228,389,390],{},[172,391,392],{},"GET \u002Fapi\u002Fblog\u002Fposts\u002F{id}",[228,394,395],{},[172,396,397],{},"post.findById",[213,399,400,405],{},[228,401,402],{},[172,403,404],{},"PUT · PATCH \u002Fapi\u002Fblog\u002Fposts\u002F{id}",[228,406,407],{},[172,408,409],{},"post.update",[213,411,412,417],{},[228,413,414],{},[172,415,416],{},"DELETE \u002Fapi\u002Fblog\u002Fposts\u002F{id}",[228,418,419],{},[172,420,421],{},"post.delete",[213,423,424,429],{},[228,425,426],{},[172,427,428],{},"POST \u002Fapi\u002Fblog\u002Fposts\u002Fby-slug",[228,430,431,434,435],{},[172,432,433],{},"post.bySlug"," — kebab-case → camelCase ; une opération nommée gagne sur ",[172,436,437],{},"{id}",[148,439,440,441,444,445,448,449,452,453,343,456,343,459,462,463,466,467,470,471,474,475,478],{},"Le verbe n'est pas décoratif : les routes ci-dessus sont la table canonique que dérive\n",[172,442,443],{},"@fougere\u002Fadapter-rest",", et cette porte s'y confronte au lieu d'en dériver une seconde. Un\nchemin servi sous un autre verbe répond ",[172,446,447],{},"405"," avec la liste ",[172,450,451],{},"Allow"," — jamais en basculant\nsur une autre opération. Le verbe d'une opération suit son nom (",[172,454,455],{},"list…",[172,457,458],{},"find…",[172,460,461],{},"get…"," et\nles autres préfixes de lecture sont en ",[172,464,465],{},"GET",", le reste en ",[172,468,469],{},"POST","), et ",[172,472,473],{},"operations: { bySlug: { kind: 'query' } }"," dans ",[172,476,477],{},"frond.config.ts"," l'énonce explicitement.",[148,480,481],{},"Trois propriétés à connaître :",[483,484,485,492,510],"ul",{},[486,487,488,491],"li",{},[152,489,490],{},"Même façade."," Un body REST utilise la même validation, le même refus des clés inconnues\net les mêmes collectors que l'enveloppe.",[486,493,494,497,498,501,502,505,506,509],{},[152,495,496],{},"Mêmes erreurs."," Les échecs se projettent par ",[172,499,500],{},"toHttpError"," : le vrai statut HTTP de\nla ",[160,503,504],{"href":85},"table des codes",", la valeur typée entière dans ",[172,507,508],{},"data",".",[486,511,512,515,516,519,520,509],{},[152,513,514],{},"Forme des listes."," Les résultats de ",[172,517,518],{},"list"," se sérialisent en\n",[172,521,522],{},"{ items, total, hasMore, endCursor }",[164,524,526],{"id":525},"graphql-une-projection-standalone","GraphQL — une projection standalone",[148,528,529,532,533,536,537,540],{},[172,530,531],{},"@fougere\u002Fadapter-graphql"," dérive les types, inputs et opérations CRUD Pothos depuis la\nmême metadata ",[172,534,535],{},"getFields()"," que lisent tous les autres adapters. Il n'est ",[152,538,539],{},"pas monté par\nle module Nuxt"," — il se livre comme une projection que vous tendez au serveur GraphQL de\nvotre choix :",[291,542,544,547],{"id":543},"registerall-tout-le-schéma-en-un-appel",[172,545,546],{},"registerAll"," — tout le schéma, en un appel",[549,550,555],"pre",{"className":551,"code":552,"language":553,"meta":554,"style":554},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import SchemaBuilder from '@pothos\u002Fcore';\nimport { registerAll, registerGraphQL } from '@fougere\u002Fadapter-graphql';\n\nconst builder = new SchemaBuilder({});\nbuilder.queryType({});\nbuilder.mutationType({});\n\nregisterAll(builder, app);          \u002F\u002F ← chaque entité, chaque op, chaque relation\n\nregisterGraphQL(router, builder.toSchema());   \u002F\u002F et on le monte sur \u002Fgraphql\n","ts","",[172,556,557,588,619,626,659,678,696,701,721,726],{"__ignoreMap":554},[558,559,562,566,570,573,577,581,584],"span",{"class":560,"line":561},"line",1,[558,563,565],{"class":564},"sVHd0","import",[558,567,569],{"class":568},"su5hD"," SchemaBuilder ",[558,571,572],{"class":564},"from",[558,574,576],{"class":575},"sjJ54"," '",[558,578,580],{"class":579},"s_sjI","@pothos\u002Fcore",[558,582,583],{"class":575},"'",[558,585,587],{"class":586},"sP7_E",";\n",[558,589,591,593,596,599,602,605,608,611,613,615,617],{"class":560,"line":590},2,[558,592,565],{"class":564},[558,594,595],{"class":586}," {",[558,597,598],{"class":568}," registerAll",[558,600,601],{"class":586},",",[558,603,604],{"class":568}," registerGraphQL",[558,606,607],{"class":586}," }",[558,609,610],{"class":564}," from",[558,612,576],{"class":575},[558,614,531],{"class":579},[558,616,583],{"class":575},[558,618,587],{"class":586},[558,620,622],{"class":560,"line":621},3,[558,623,625],{"emptyLinePlaceholder":624},true,"\n",[558,627,629,633,637,641,644,648,651,654,657],{"class":560,"line":628},4,[558,630,632],{"class":631},"sbsja","const",[558,634,636],{"class":635},"s_hVV"," builder",[558,638,640],{"class":639},"smGrS"," =",[558,642,643],{"class":639}," new",[558,645,647],{"class":646},"sGLFI"," SchemaBuilder",[558,649,650],{"class":568},"(",[558,652,653],{"class":586},"{}",[558,655,656],{"class":568},")",[558,658,587],{"class":586},[558,660,662,665,667,670,672,674,676],{"class":560,"line":661},5,[558,663,664],{"class":568},"builder",[558,666,509],{"class":586},[558,668,669],{"class":646},"queryType",[558,671,650],{"class":568},[558,673,653],{"class":586},[558,675,656],{"class":568},[558,677,587],{"class":586},[558,679,681,683,685,688,690,692,694],{"class":560,"line":680},6,[558,682,664],{"class":568},[558,684,509],{"class":586},[558,686,687],{"class":646},"mutationType",[558,689,650],{"class":568},[558,691,653],{"class":586},[558,693,656],{"class":568},[558,695,587],{"class":586},[558,697,699],{"class":560,"line":698},7,[558,700,625],{"emptyLinePlaceholder":624},[558,702,704,706,709,711,714,717],{"class":560,"line":703},8,[558,705,546],{"class":646},[558,707,708],{"class":568},"(builder",[558,710,601],{"class":586},[558,712,713],{"class":568}," app)",[558,715,716],{"class":586},";",[558,718,720],{"class":719},"sutJx","          \u002F\u002F ← chaque entité, chaque op, chaque relation\n",[558,722,724],{"class":560,"line":723},9,[558,725,625],{"emptyLinePlaceholder":624},[558,727,729,732,735,737,739,741,744,747,749],{"class":560,"line":728},10,[558,730,731],{"class":646},"registerGraphQL",[558,733,734],{"class":568},"(router",[558,736,601],{"class":586},[558,738,636],{"class":568},[558,740,509],{"class":586},[558,742,743],{"class":646},"toSchema",[558,745,746],{"class":568},"())",[558,748,716],{"class":586},[558,750,751],{"class":719},"   \u002F\u002F et on le monte sur \u002Fgraphql\n",[148,753,754,756,757,760,761,764,765,768],{},[172,755,546],{}," parcourt les Fronds scannées. Pour chaque entité dotée d'un handler, il\nenregistre son type, ses inputs et un champ par opération exposée. Les relations ",[172,758,759],{},"ref"," et\n",[172,762,763],{},"many"," relient les types enregistrés ; les champs calculés d'un\n",[160,766,767],{"href":77},"Presenter"," deviennent des resolvers.",[148,770,771,772,760,775,778],{},"Chaque resolver généré appelle la façade du handler et conserve donc la validation, le\nrefus des clés inconnues et les collectors. Un resolver personnalisé qui appelle l'ORM\ndirectement doit appliquer ces règles lui-même. Utilisez ",[172,773,774],{},"registerType",[172,776,777],{},"registerOperations"," pour les champs que la projection ne peut pas dériver.",[148,780,781],{},"Deux options, rarement nécessaires :",[549,783,785],{"className":551,"code":784,"language":553,"meta":554,"style":554},"registerAll(builder, app, { surface: 'graphql' });   \u002F\u002F respecte les surfaces de frond.config.ts\nregisterAll(builder, app, { filter: (entity) => entity.name !== 'auditLog' });\n",[172,786,787,825],{"__ignoreMap":554},[558,788,789,791,793,795,798,800,802,806,809,811,814,816,818,820,822],{"class":560,"line":561},[558,790,546],{"class":646},[558,792,708],{"class":568},[558,794,601],{"class":586},[558,796,797],{"class":568}," app",[558,799,601],{"class":586},[558,801,595],{"class":586},[558,803,805],{"class":804},"skxfh"," surface",[558,807,808],{"class":586},":",[558,810,576],{"class":575},[558,812,813],{"class":579},"graphql",[558,815,583],{"class":575},[558,817,607],{"class":586},[558,819,656],{"class":568},[558,821,716],{"class":586},[558,823,824],{"class":719},"   \u002F\u002F respecte les surfaces de frond.config.ts\n",[558,826,827,829,831,833,835,837,839,842,844,847,851,853,856,859,861,864,867,869,872,874,876,878],{"class":560,"line":590},[558,828,546],{"class":646},[558,830,708],{"class":568},[558,832,601],{"class":586},[558,834,797],{"class":568},[558,836,601],{"class":586},[558,838,595],{"class":586},[558,840,841],{"class":646}," filter",[558,843,808],{"class":586},[558,845,846],{"class":586}," (",[558,848,850],{"class":849},"s99_P","entity",[558,852,656],{"class":586},[558,854,855],{"class":631}," =>",[558,857,858],{"class":568}," entity",[558,860,509],{"class":586},[558,862,863],{"class":568},"name ",[558,865,866],{"class":639},"!==",[558,868,576],{"class":575},[558,870,871],{"class":579},"auditLog",[558,873,583],{"class":575},[558,875,607],{"class":586},[558,877,656],{"class":568},[558,879,587],{"class":586},[148,881,882,885,886,509],{},[172,883,884],{},"demos\u002Fschema-ecommerce"," fait exactement ça sous Apollo Server sur ",[172,887,888],{},":4000",[148,890,891],{},"La projection GraphQL et sa démo sont disponibles. Le module Nuxt ne monte pas encore\nautomatiquement un endpoint GraphQL comme il le fait pour REST.",[164,893,895],{"id":894},"écrire-la-vôtre","Écrire la vôtre",[148,897,898,899,901],{},"Une surface personnalisée, par exemple RSS, webhook ou CLI, suit le même enchaînement. La\npage ",[160,900,113],{"href":114}," contient un exemple RSS complet.",[148,903,904,905,907],{},"Suite : ",[160,906,130],{"href":131}," — ce qu'une app Fougere demande au runtime.",[909,910,911],"style",{},"html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}",{"title":554,"searchDepth":590,"depth":590,"links":913},[914,917,918,922],{"id":166,"depth":590,"text":167,"children":915},[916],{"id":293,"depth":621,"text":294},{"id":331,"depth":590,"text":332},{"id":525,"depth":590,"text":526,"children":919},[920],{"id":543,"depth":621,"text":921},"registerAll — tout le schéma, en un appel",{"id":894,"depth":590,"text":895},"Exposer les opérations Fougere avec REST, GraphQL ou un adapter personnalisé.","md",{},{"title":126,"description":923},"ylbTqryaWlmuW3aaz7fk9BLHnpy6UCjxanH2Bm-hfhE",1786637820053]