[{"data":1,"prerenderedAt":811},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands":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":101,"body":139,"description":806,"extension":807,"meta":808,"navigation":205,"path":102,"seo":809,"stem":103,"__hash__":810},"docs_fr\u002Ffr\u002Fdocs\u002F5.client\u002F1.queries-commands.md",{"type":140,"value":141,"toc":800},"minimark",[142,146,159,366,371,423,426,560,567,670,674,701,713,717,720,724,737,762,765,784,790,796],[143,144,101],"h1",{"id":145},"queries-commands",[147,148,149,150,154,155,158],"p",{},"Une page appelle une Frond avec une ",[151,152,153],"strong",{},"query"," pour lire ou une ",[151,156,157],{},"command"," pour écrire.\nL'appel est identifié par la classe de l'entité et le nom de l'opération. La classe porte\nles métadonnées et son nom sert de clé d'enregistrement.",[160,161,166],"pre",{"className":162,"code":163,"language":164,"meta":165,"style":165},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import Post from '@frond\u002Fblog\u002Fentities\u002FPost';\n\nconst { items, total, hasMore, loading, error } = await useQuery\u003CPostCard>(Post, 'list');\nconst publish = useCommand\u003CPost>(Post, 'publish');\nawait publish.execute({ params: { id } });\n\u002F\u002F → toutes les queries montées sur Post se revalident, automatiquement\n","ts","",[167,168,169,200,207,283,318,359],"code",{"__ignoreMap":165},[170,171,174,178,182,185,189,193,196],"span",{"class":172,"line":173},"line",1,[170,175,177],{"class":176},"sVHd0","import",[170,179,181],{"class":180},"su5hD"," Post ",[170,183,184],{"class":176},"from",[170,186,188],{"class":187},"sjJ54"," '",[170,190,192],{"class":191},"s_sjI","@frond\u002Fblog\u002Fentities\u002FPost",[170,194,195],{"class":187},"'",[170,197,199],{"class":198},"sP7_E",";\n",[170,201,203],{"class":172,"line":202},2,[170,204,206],{"emptyLinePlaceholder":205},true,"\n",[170,208,210,214,217,221,224,227,229,232,234,237,239,242,245,249,252,256,259,263,266,269,271,273,276,278,281],{"class":172,"line":209},3,[170,211,213],{"class":212},"sbsja","const",[170,215,216],{"class":198}," {",[170,218,220],{"class":219},"s_hVV"," items",[170,222,223],{"class":198},",",[170,225,226],{"class":219}," total",[170,228,223],{"class":198},[170,230,231],{"class":219}," hasMore",[170,233,223],{"class":198},[170,235,236],{"class":219}," loading",[170,238,223],{"class":198},[170,240,241],{"class":219}," error",[170,243,244],{"class":198}," }",[170,246,248],{"class":247},"smGrS"," =",[170,250,251],{"class":176}," await",[170,253,255],{"class":254},"sGLFI"," useQuery",[170,257,258],{"class":198},"\u003C",[170,260,262],{"class":261},"sbgvK","PostCard",[170,264,265],{"class":198},">",[170,267,268],{"class":180},"(Post",[170,270,223],{"class":198},[170,272,188],{"class":187},[170,274,275],{"class":191},"list",[170,277,195],{"class":187},[170,279,280],{"class":180},")",[170,282,199],{"class":198},[170,284,286,288,291,293,296,298,301,303,305,307,309,312,314,316],{"class":172,"line":285},4,[170,287,213],{"class":212},[170,289,290],{"class":219}," publish",[170,292,248],{"class":247},[170,294,295],{"class":254}," useCommand",[170,297,258],{"class":198},[170,299,300],{"class":261},"Post",[170,302,265],{"class":198},[170,304,268],{"class":180},[170,306,223],{"class":198},[170,308,188],{"class":187},[170,310,311],{"class":191},"publish",[170,313,195],{"class":187},[170,315,280],{"class":180},[170,317,199],{"class":198},[170,319,321,324,326,329,332,335,338,342,345,347,350,353,355,357],{"class":172,"line":320},5,[170,322,323],{"class":176},"await",[170,325,290],{"class":180},[170,327,328],{"class":198},".",[170,330,331],{"class":254},"execute",[170,333,334],{"class":180},"(",[170,336,337],{"class":198},"{",[170,339,341],{"class":340},"skxfh"," params",[170,343,344],{"class":198},":",[170,346,216],{"class":198},[170,348,349],{"class":180}," id ",[170,351,352],{"class":198},"}",[170,354,244],{"class":198},[170,356,280],{"class":180},[170,358,199],{"class":198},[170,360,362],{"class":172,"line":361},6,[170,363,365],{"class":364},"sutJx","\u002F\u002F → toutes les queries montées sur Post se revalident, automatiquement\n",[367,368,370],"h2",{"id":369},"usequery","useQuery",[160,372,374],{"className":162,"code":373,"language":164,"meta":165,"style":165},"useQuery\u003CT>(Entity, op, input?, opts?)\n\u002F\u002F input: CallInput | () => CallInput      CallInput = { params?, query?, body? }\n\u002F\u002F opts:  { immediate?: boolean }          immediate: false → ne pas tirer au montage\n",[167,375,376,413,418],{"__ignoreMap":165},[170,377,378,380,382,385,387,390,392,395,397,400,403,405,408,410],{"class":172,"line":173},[170,379,370],{"class":254},[170,381,258],{"class":198},[170,383,384],{"class":261},"T",[170,386,265],{"class":198},[170,388,389],{"class":180},"(Entity",[170,391,223],{"class":198},[170,393,394],{"class":180}," op",[170,396,223],{"class":198},[170,398,399],{"class":180}," input",[170,401,402],{"class":247},"?",[170,404,223],{"class":198},[170,406,407],{"class":180}," opts",[170,409,402],{"class":247},[170,411,412],{"class":180},")\n",[170,414,415],{"class":172,"line":202},[170,416,417],{"class":364},"\u002F\u002F input: CallInput | () => CallInput      CallInput = { params?, query?, body? }\n",[170,419,420],{"class":172,"line":209},[170,421,422],{"class":364},"\u002F\u002F opts:  { immediate?: boolean }          immediate: false → ne pas tirer au montage\n",[147,424,425],{},"Retour (tout est réactif) :",[427,428,429,445],"table",{},[430,431,432],"thead",{},[433,434,435,439,442],"tr",{},[436,437,438],"th",{},"Clé",[436,440,441],{},"Type",[436,443,444],{},"Notes",[446,447,448,472,495,513,527,545],"tbody",{},[433,449,450,456,461],{},[451,452,453],"td",{},[167,454,455],{},"data",[451,457,458],{},[167,459,460],{},"Ref\u003CT | null>",[451,462,463,464,467,468,471],{},"le résultat brut (ops à objet unique : ",[167,465,466],{},"findById",", ",[167,469,470],{},"bySlug","…)",[433,473,474,479,484],{},[451,475,476],{},[167,477,478],{},"items",[451,480,481],{},[167,482,483],{},"ComputedRef\u003CT[]>",[451,485,486,487,490,491,494],{},"normalisation de liste : un tableau nu ",[151,488,489],{},"ou"," un ",[167,492,493],{},"ListResult"," se lisent pareil",[433,496,497,505,510],{},[451,498,499,467,502],{},[167,500,501],{},"total",[167,503,504],{},"hasMore",[451,506,507,508],{},"du ",[167,509,493],{},[451,511,512],{},"présents quand l'op en rend un",[433,514,515,520,525],{},[451,516,517],{},[167,518,519],{},"loading",[451,521,522],{},[167,523,524],{},"Ref\u003Cboolean>",[451,526],{},[433,528,529,534,539],{},[451,530,531],{},[167,532,533],{},"error",[451,535,536],{},[167,537,538],{},"Ref\u003CFougereError | null>",[451,540,541,542,280],{},"l'erreur typée ravivée (",[543,544,84],"a",{"href":85},[433,546,547,552,557],{},[451,548,549],{},[167,550,551],{},"refresh",[451,553,554],{},[167,555,556],{},"() => Promise\u003Cvoid>",[451,558,559],{},"revalidation manuelle — rarement utile, voir le lien",[147,561,562,563,566],{},"Un ",[151,564,565],{},"input getter"," rend la query réactive à ses arguments :",[160,568,570],{"className":162,"code":569,"language":164,"meta":165,"style":165},"const { items } = await useQuery\u003CHit>(Post, 'searchByTitle',\n  () => ({ body: { title: submitted.value } }),\n  { immediate: false });\n",[167,571,572,609,650],{"__ignoreMap":165},[170,573,574,576,578,580,582,584,586,588,590,593,595,597,599,601,604,606],{"class":172,"line":173},[170,575,213],{"class":212},[170,577,216],{"class":198},[170,579,220],{"class":219},[170,581,244],{"class":198},[170,583,248],{"class":247},[170,585,251],{"class":176},[170,587,255],{"class":254},[170,589,258],{"class":198},[170,591,592],{"class":261},"Hit",[170,594,265],{"class":198},[170,596,268],{"class":180},[170,598,223],{"class":198},[170,600,188],{"class":187},[170,602,603],{"class":191},"searchByTitle",[170,605,195],{"class":187},[170,607,608],{"class":198},",\n",[170,610,611,614,617,620,622,625,627,629,632,634,637,639,642,644,646,648],{"class":172,"line":202},[170,612,613],{"class":198},"  ()",[170,615,616],{"class":212}," =>",[170,618,619],{"class":180}," (",[170,621,337],{"class":198},[170,623,624],{"class":340}," body",[170,626,344],{"class":198},[170,628,216],{"class":198},[170,630,631],{"class":340}," title",[170,633,344],{"class":198},[170,635,636],{"class":180}," submitted",[170,638,328],{"class":198},[170,640,641],{"class":180},"value ",[170,643,352],{"class":198},[170,645,244],{"class":198},[170,647,280],{"class":180},[170,649,608],{"class":198},[170,651,652,655,658,660,664,666,668],{"class":172,"line":209},[170,653,654],{"class":198},"  {",[170,656,657],{"class":340}," immediate",[170,659,344],{"class":198},[170,661,663],{"class":662},"syTEX"," false",[170,665,244],{"class":198},[170,667,280],{"class":180},[170,669,199],{"class":198},[367,671,673],{"id":672},"usecommand","useCommand",[160,675,677],{"className":162,"code":676,"language":164,"meta":165,"style":165},"useCommand\u003CT>(Entity, op)\n\u002F\u002F → { execute(input?): Promise\u003CT>, loading: Ref\u003Cboolean>, error: Ref\u003CFougereError | null> }\n",[167,678,679,696],{"__ignoreMap":165},[170,680,681,683,685,687,689,691,693],{"class":172,"line":173},[170,682,673],{"class":254},[170,684,258],{"class":198},[170,686,384],{"class":261},[170,688,265],{"class":198},[170,690,389],{"class":180},[170,692,223],{"class":198},[170,694,695],{"class":180}," op)\n",[170,697,698],{"class":172,"line":202},[170,699,700],{"class":364},"\u002F\u002F → { execute(input?): Promise\u003CT>, loading: Ref\u003Cboolean>, error: Ref\u003CFougereError | null> }\n",[147,702,703,705,706,709,710,712],{},[167,704,331],{}," rejette avec la même ",[167,707,708],{},"FougereError"," qu'il range dans ",[167,711,533],{}," — attrapez-la en\ntry\u002Fcatch ou lisez la ref, les deux styles marchent.",[367,714,716],{"id":715},"le-lien","Le lien",[147,718,719],{},"Une command réussie sur une entité revalide les queries actives de cette entité. Après la\npublication d'un post, les listes de posts sont donc actualisées. Supprimer ce cache ne\nchange pas le résultat des opérations, mais déclenche de nouvelles lectures.",[367,721,723],{"id":722},"le-fil-et-le-ssr","Le fil — et le SSR",[147,725,726,727,467,730,467,733,736],{},"Le navigateur POSTe la même trame JSON-RPC que le transport process-à-process\n(",[167,728,729],{},"POST \u002F_fougere\u002Fcall",[167,731,732],{},"method: \"post.list\"",[167,734,735],{},"params"," = l'invocation).",[738,739,740],"blockquote",{},[147,741,742,743,746,747,749,750,467,752,754,755,757,758,761],{},"La documentation appelle ",[151,744,745],{},"enveloppe"," le point d'entrée ",[167,748,729],{}," utilisé\npar ",[167,751,370],{},[167,753,673],{}," et ",[167,756,113],{},". Les ",[543,759,760],{"href":127},"surfaces"," REST et\nGraphQL traduisent leurs protocoles vers les mêmes opérations.",[147,763,764],{},"Deux propriétés :",[766,767,768,775],"ul",{},[769,770,771,774],"li",{},[151,772,773],{},"En SSR",", le même appel se replie en exécution in-process — pas de réseau, pas de port.",[769,776,777,783],{},[151,778,779,780],{},"Le navigateur ne fournit pas le ",[167,781,782],{},"state"," : le serveur le construit depuis le contexte\nde requête, notamment pour y placer la session.",[147,785,786,787,789],{},"Le transport client ne relance pas automatiquement une command et conserve les erreurs\ntypées (",[543,788,84],{"href":85},").",[147,791,792,793,795],{},"Suite : ",[543,794,105],{"href":106}," — état, validation et soumission.",[797,798,799],"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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":165,"searchDepth":202,"depth":202,"links":801},[802,803,804,805],{"id":369,"depth":202,"text":370},{"id":672,"depth":202,"text":673},{"id":715,"depth":202,"text":716},{"id":722,"depth":202,"text":723},"useQuery et useCommand — signatures exactes, le lien par entité, le comportement SSR.","md",{},{"title":101,"description":806},"LeQYIm2wKyeAYe8QYRRJvZN6Zf2W1RDjfihl2qn5u1w",1786637819926]