[{"data":1,"prerenderedAt":636},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors":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":84,"body":139,"description":630,"extension":631,"meta":632,"navigation":633,"path":85,"seo":634,"stem":86,"__hash__":635},"docs_fr\u002Ffr\u002Fdocs\u002F4.business\u002F4.errors.md",{"type":140,"value":141,"toc":622},"minimark",[142,146,154,304,309,436,443,449,460,464,542,547,551,554,612,618],[143,144,84],"h1",{"id":145},"erreurs",[147,148,149,153],"p",{},[150,151,152],"code",{},"FougereError"," représente une erreur métier avec un code typé. Les handlers la lèvent et\nles couches suivantes conservent son code, son message et ses détails.",[155,156,161],"pre",{"className":157,"code":158,"language":159,"meta":160,"style":160},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","throw new FougereError({\n  code: ErrorCode.CONFLICT,\n  message: `Le slug '${slug}' est déjà pris`,\n  entity: 'post',\n  operation: 'create',\n  \u002F\u002F details?: [{ path, message }]   — par champ, utilisé par VALIDATION_FAILED\n  \u002F\u002F cause?: unknown\n});\n","ts","",[150,162,163,188,211,244,263,280,287,293],{"__ignoreMap":160},[164,165,168,172,176,180,184],"span",{"class":166,"line":167},"line",1,[164,169,171],{"class":170},"sVHd0","throw",[164,173,175],{"class":174},"smGrS"," new",[164,177,179],{"class":178},"sGLFI"," FougereError",[164,181,183],{"class":182},"su5hD","(",[164,185,187],{"class":186},"sP7_E","{\n",[164,189,191,195,198,201,204,208],{"class":166,"line":190},2,[164,192,194],{"class":193},"skxfh","  code",[164,196,197],{"class":186},":",[164,199,200],{"class":182}," ErrorCode",[164,202,203],{"class":186},".",[164,205,207],{"class":206},"s_hVV","CONFLICT",[164,209,210],{"class":186},",\n",[164,212,214,217,219,223,227,230,233,236,239,242],{"class":166,"line":213},3,[164,215,216],{"class":193},"  message",[164,218,197],{"class":186},[164,220,222],{"class":221},"sjJ54"," `",[164,224,226],{"class":225},"s_sjI","Le slug '",[164,228,229],{"class":221},"${",[164,231,232],{"class":182},"slug",[164,234,235],{"class":221},"}",[164,237,238],{"class":225},"' est déjà pris",[164,240,241],{"class":221},"`",[164,243,210],{"class":186},[164,245,247,250,252,255,258,261],{"class":166,"line":246},4,[164,248,249],{"class":193},"  entity",[164,251,197],{"class":186},[164,253,254],{"class":221}," '",[164,256,257],{"class":225},"post",[164,259,260],{"class":221},"'",[164,262,210],{"class":186},[164,264,266,269,271,273,276,278],{"class":166,"line":265},5,[164,267,268],{"class":193},"  operation",[164,270,197],{"class":186},[164,272,254],{"class":221},[164,274,275],{"class":225},"create",[164,277,260],{"class":221},[164,279,210],{"class":186},[164,281,283],{"class":166,"line":282},6,[164,284,286],{"class":285},"sutJx","  \u002F\u002F details?: [{ path, message }]   — par champ, utilisé par VALIDATION_FAILED\n",[164,288,290],{"class":166,"line":289},7,[164,291,292],{"class":285},"  \u002F\u002F cause?: unknown\n",[164,294,296,298,301],{"class":166,"line":295},8,[164,297,235],{"class":186},[164,299,300],{"class":182},")",[164,302,303],{"class":186},";\n",[305,306,308],"h2",{"id":307},"les-codes","Les codes",[310,311,312,328],"table",{},[313,314,315],"thead",{},[316,317,318,322,325],"tr",{},[319,320,321],"th",{},"Code",[319,323,324],{},"Sens",[319,326,327],{},"Projection HTTP",[329,330,331,353,366,379,392,410,423],"tbody",{},[316,332,333,339,350],{},[334,335,336],"td",{},[150,337,338],{},"VALIDATION_FAILED",[334,340,341,342,345,346,349],{},"entrée invalide — ",[150,343,344],{},"details"," contient les ",[150,347,348],{},"{ path, message }"," par champ",[334,351,352],{},"400",[316,354,355,360,363],{},[334,356,357],{},[150,358,359],{},"UNAUTHORIZED",[334,361,362],{},"pas d'identité",[334,364,365],{},"401",[316,367,368,373,376],{},[334,369,370],{},[150,371,372],{},"FORBIDDEN",[334,374,375],{},"identité présente, droit absent",[334,377,378],{},"403",[316,380,381,386,389],{},[334,382,383],{},[150,384,385],{},"NOT_FOUND",[334,387,388],{},"la chose désignée n'existe pas",[334,390,391],{},"404",[316,393,394,398,407],{},[334,395,396],{},[150,397,207],{},[334,399,400,401,406],{},"l'état refuse la transition (",[402,403,405],"a",{"href":404},"\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers#un-%C3%A9tat-change-par-une-op%C3%A9ration-jamais-par-une-%C3%A9criture-de-champ","déjà publié",", slug pris)",[334,408,409],{},"409",[316,411,412,417,420],{},[334,413,414],{},[150,415,416],{},"SERVICE_UNAVAILABLE",[334,418,419],{},"une Frond distante est injoignable",[334,421,422],{},"503",[316,424,425,430,433],{},[334,426,427],{},[150,428,429],{},"INTERNAL_ERROR",[334,431,432],{},"tout l'inattendu",[334,434,435],{},"500",[437,438,440,442],"h3",{"id":439},"internal_error-est-le-seul-dont-le-message-ne-sort-pas",[150,441,429],{}," est le seul dont le message ne sort pas",[147,444,445,446,448],{},"Les six autres codes ont été écrits pour l'appelant et voyagent entiers. Un\n",[150,447,429],{},", non : il peut citer un chemin, une requête ou une ligne, donc il est\nremplacé par une constante avant de quitter le process.",[147,450,451,452,456,457,459],{},"Il est ",[453,454,455],"strong",{},"journalisé au même endroit"," — masquer et enregistrer vivent dans la même\nfonction, pour que la phrase existe exactement une fois, sur le serveur. Un opérateur qui\ncherche « pourquoi ce 500 » la trouve dans les logs avec sa cause, son entité et son\nopération ; un attaquant ne la voit jamais. Si votre message doit atteindre l'appelant,\nc'est qu'il ne s'agit pas d'un ",[150,458,429],{}," : donnez-lui son code.",[305,461,463],{"id":462},"propagation-dune-erreur","Propagation d'une erreur",[465,466,467,477,483,501,530],"ol",{},[468,469,470,473,474,476],"li",{},[453,471,472],{},"Le handler lève"," une ",[150,475,152],{}," — le même objet que la Frond soit locale ou distante.",[468,478,479,482],{},[453,480,481],{},"Appel local"," — l'erreur se propage en mémoire, intouchée.",[468,484,485,488,489,210,492,495,496,498,499,203],{},[453,486,487],{},"Appel distant"," — le transport la met en trame JSON-RPC (",[150,490,491],{},"code: -32000",[150,493,494],{},"data: { code, message, entity, operation, details? }",") et le côté appelant la\nreconstruit une ",[150,497,152],{},", avec ses ",[150,500,344],{},[468,502,503,506,507,510,511,514,515,518,519,521,522,525,526,529],{},[453,504,505],{},"Dans une page"," — ",[150,508,509],{},"useQuery","\u002F",[150,512,513],{},"useCommand"," l'exposent comme ",[150,516,517],{},"error"," (une vraie\n",[150,520,152],{},") ; ",[150,523,524],{},"useFormFor"," mappe automatiquement ",[150,527,528],{},"VALIDATION_FAILED.details"," sur\nles erreurs par champ.",[468,531,532,506,535,538,539,203],{},[453,533,534],{},"Sur la surface REST",[150,536,537],{},"toHttpError"," projette le code vers le vrai statut HTTP\n(table ci-dessus), la valeur typée entière dans ",[150,540,541],{},"data",[147,543,544,545,203],{},"Le navigateur reçoit le même code, le même message et les mêmes erreurs par champ, que la\nFrond soit locale ou distante. Un hôte inaccessible produit une erreur typée\n",[150,546,416],{},[305,548,550],{"id":549},"ordre-des-vérifications","Ordre des vérifications",[147,552,553],{},"Le blog de ce site effectue les vérifications dans cet ordre :",[155,555,557],{"className":157,"code":556,"language":159,"meta":160,"style":160},"requireUser(user)        \u002F\u002F UNAUTHORIZED\n→ requireOwn(id, user)   \u002F\u002F NOT_FOUND, puis FORBIDDEN\n→ vérifs d'état          \u002F\u002F CONFLICT (déjà publié, brouillon vide)\n→ réaliser               \u002F\u002F orm.update(…)\n",[150,558,559,570,590,604],{"__ignoreMap":160},[164,560,561,564,567],{"class":166,"line":167},[164,562,563],{"class":178},"requireUser",[164,565,566],{"class":182},"(user)        ",[164,568,569],{"class":285},"\u002F\u002F UNAUTHORIZED\n",[164,571,572,575,578,581,584,587],{"class":166,"line":190},[164,573,574],{"class":182},"→ ",[164,576,577],{"class":178},"requireOwn",[164,579,580],{"class":182},"(id",[164,582,583],{"class":186},",",[164,585,586],{"class":182}," user)   ",[164,588,589],{"class":285},"\u002F\u002F NOT_FOUND, puis FORBIDDEN\n",[164,591,592,595,597,600],{"class":166,"line":213},[164,593,594],{"class":182},"→ vérifs d",[164,596,260],{"class":221},[164,598,599],{"class":225},"état          \u002F\u002F CONFLICT (déjà publié, brouillon vide",[164,601,603],{"class":602},"syegG",")\n",[164,605,606,609],{"class":166,"line":246},[164,607,608],{"class":182},"→ réaliser               ",[164,610,611],{"class":285},"\u002F\u002F orm.update(…)\n",[147,613,614,615,617],{},"Suite : ",[402,616,88],{"href":89}," — initialiser les données par les opérations.",[619,620,621],"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 .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 .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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 .syegG, html code.shiki .syegG{--shiki-light:#91B859;--shiki-light-font-style:inherit;--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":160,"searchDepth":190,"depth":190,"links":623},[624,628,629],{"id":307,"depth":190,"text":308,"children":625},[626],{"id":439,"depth":213,"text":627},"INTERNAL_ERROR est le seul dont le message ne sort pas",{"id":462,"depth":190,"text":463},{"id":549,"depth":190,"text":550},"FougereError, les codes disponibles et leur transport entre les surfaces.","md",{},true,{"title":84,"description":630},"TGCseEY1jatoJb3JkQsQYJSQt0P9pn4QpPwxKE-Cq9g",1786637819914]