[{"data":1,"prerenderedAt":1347},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fcli":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":24,"body":139,"description":1342,"extension":1343,"meta":1344,"navigation":474,"path":25,"seo":1345,"stem":26,"__hash__":1346},"docs_fr\u002Ffr\u002Fdocs\u002F03.cli.md",{"type":140,"value":141,"toc":1326},"minimark",[142,146,154,180,188,226,229,237,329,343,394,405,603,606,613,634,648,660,676,683,730,737,744,764,775,884,894,905,1014,1025,1044,1051,1058,1117,1128,1159,1164,1214,1228,1240,1247,1259,1262,1268,1275,1282,1297,1316,1322],[143,144,24],"h1",{"id":145},"la-cli",[147,148,149,153],"p",{},[150,151,152],"code",{},"@fougere\u002Fcli"," crée un workspace, héberge une Frond dans un processus séparé et appelle\nune opération depuis un shell. La CLI utilise elle-même des entités et des handlers ; ses\noptions sont donc validées à partir de leurs schémas.",[155,156,157],"blockquote",{},[147,158,159,163,164,167,168,171,172,175,176,179],{},[160,161,162],"strong",{},"Alpha."," Sur npm sous le tag ",[150,165,166],{},"alpha"," — ",[150,169,170],{},"npx fougere@alpha"," la lance sans installer,\n",[150,173,174],{},"npm create fougere"," l'entre directement sur ",[150,177,178],{},"new",". Les commandes et flags ci-dessous\nsont ce qui existe.",[181,182,184,187],"h2",{"id":183},"fougere-new-composer-un-workspace",[150,185,186],{},"fougere new"," — composer un workspace",[189,190,195],"pre",{"className":191,"code":192,"language":193,"meta":194,"style":194},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","fougere new shop --frond blog --app nuxt\n","bash","",[150,196,197],{"__ignoreMap":194},[198,199,202,206,210,213,217,220,223],"span",{"class":200,"line":201},"line",1,[198,203,205],{"class":204},"sbgvK","fougere",[198,207,209],{"class":208},"s_sjI"," new",[198,211,212],{"class":208}," shop",[198,214,216],{"class":215},"stzsN"," --frond",[198,218,219],{"class":208}," blog",[198,221,222],{"class":215}," --app",[198,224,225],{"class":208}," nuxt\n",[147,227,228],{},"La commande crée d'abord les Fronds, puis les apps qui les consomment. Elle produit un\nworkspace pnpm :",[189,230,235],{"className":231,"code":233,"language":234},[232],"language-text","shop\u002F\n  fougere.config.ts          ← db, auth, topologie\n  pnpm-workspace.yaml        ← packages: [fronds\u002F*, apps\u002F*]\n  fronds\u002Fblog\u002F               ← le domaine\n    entities\u002FPost.ts\n    handlers\u002FPostHandler.ts\n  apps\u002Fnuxt\u002F                 ← le consommateur\n    nuxt.config.ts\n    app\u002Fpages\u002Findex.vue\n","text",[150,236,233],{"__ignoreMap":194},[238,239,240,253],"table",{},[241,242,243],"thead",{},[244,245,246,250],"tr",{},[247,248,249],"th",{},"Flag",[247,251,252],{},"Ce qu'il fait",[254,255,256,271,281,291,305,319],"tbody",{},[244,257,258,264],{},[259,260,261],"td",{},[150,262,263],{},"--frond blog,api:catalog",[259,265,266,267,270],{},"les Fronds à ajouter — ",[150,268,269],{},"template:nom"," renomme ; le nom du template est le nom par défaut",[244,272,273,278],{},[259,274,275],{},[150,276,277],{},"--app nuxt:web",[259,279,280],{},"pareil, pour les apps",[244,282,283,288],{},[259,284,285],{},[150,286,287],{},"--bare",[259,289,290],{},"la coquille vide, rien de composé",[244,292,293,298],{},[259,294,295],{},[150,296,297],{},"--flat",[259,299,300,301,304],{},"un seul domaine : pas de ",[150,302,303],{},"fronds\u002F",", pas de workspace — la racine de l'app est la Frond",[244,306,307,312],{},[259,308,309],{},[150,310,311],{},"--local",[259,313,314,315,318],{},"lie ",[150,316,317],{},"@fougere\u002F*"," à un checkout local de Fougere (développement)",[244,320,321,326],{},[259,322,323],{},[150,324,325],{},"--force",[259,327,328],{},"écrase un dossier existant",[147,330,331,334,335,338,339,342],{},[160,332,333],{},"Arguments ou mode interactif."," Avec ",[150,336,337],{},"--frond"," et ",[150,340,341],{},"--app",", la commande n'affiche aucune\nquestion et peut être utilisée dans un script ou en CI. Sans ces options, elle demande les\ntemplates dans un TTY. Le mode interactif n'est pas disponible sans TTY.",[147,344,345,348,349,352,353,355,356,359,360,363,364,369,370,372,373,377,378,381,382,385,386,389,390,393],{},[160,346,347],{},"Structure à plat."," ",[150,350,351],{},"fougere new shop --flat --frond blog","\nécrit une app Nuxt dont la racine porte le domaine — pas de segment ",[150,354,303],{},", pas de\n",[150,357,358],{},"pnpm-workspace.yaml",", un seul ",[150,361,362],{},"pnpm install"," (",[365,366,368],"a",{"href":367},"\u002Ffr\u002Fdocs\u002Fgetting-started#un-seul-domaine-pas-de-fronds-du-tout","la forme à\nplat","). ",[150,371,341],{}," est refusé\navec lui : l'app ",[374,375,376],"em",{},"est"," la racine. Un deuxième domaine ira plus tard dans ",[150,379,380],{},"fronds\u002Fbilling\u002F","\net la Frond racine ne bouge pas. Le projet généré porte aussi un ",[150,383,384],{},"tsconfig.frond.json","\ndont le ",[150,387,388],{},"include"," nomme les dossiers de la convention. ",[150,391,392],{},"pnpm typecheck"," peut ainsi vérifier\nle domaine sans charger Nuxt.",[147,395,396,397,400,401,404],{},"La Frond générée contient une entité, deux vues dérivées (",[150,398,399],{},"NewPost"," pour l'entrée et\n",[150,402,403],{},"PostCard"," pour la liste) et une opération métier en plus du CRUD :",[189,406,410],{"className":407,"code":408,"language":409,"meta":194,"style":194},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","export class NewPost extends Post.pick('title', 'body') {}\n\nexport default class PostHandler extends Crud(Post) {\n  async create(input: NewPost): Promise\u003CPost> { … }\n\n  \u002F** La transition draft→published — une opération, pas une écriture de champ. *\u002F\n  async publish(id: string): Promise\u003CPost> { … }\n}\n","ts",[150,411,412,469,476,500,549,554,561,598],{"__ignoreMap":194},[198,413,414,418,422,425,428,432,436,440,443,447,450,452,455,458,461,463,466],{"class":200,"line":201},[198,415,417],{"class":416},"sVHd0","export",[198,419,421],{"class":420},"sbsja"," class",[198,423,424],{"class":204}," NewPost",[198,426,427],{"class":420}," extends",[198,429,431],{"class":430},"su5hD"," Post",[198,433,435],{"class":434},"sP7_E",".",[198,437,439],{"class":438},"sGLFI","pick",[198,441,442],{"class":430},"(",[198,444,446],{"class":445},"sjJ54","'",[198,448,449],{"class":208},"title",[198,451,446],{"class":445},[198,453,454],{"class":434},",",[198,456,457],{"class":445}," '",[198,459,460],{"class":208},"body",[198,462,446],{"class":445},[198,464,465],{"class":430},") ",[198,467,468],{"class":434},"{}\n",[198,470,472],{"class":200,"line":471},2,[198,473,475],{"emptyLinePlaceholder":474},true,"\n",[198,477,479,481,484,486,489,491,494,497],{"class":200,"line":478},3,[198,480,417],{"class":416},[198,482,483],{"class":416}," default",[198,485,421],{"class":420},[198,487,488],{"class":204}," PostHandler",[198,490,427],{"class":420},[198,492,493],{"class":438}," Crud",[198,495,496],{"class":430},"(Post) ",[198,498,499],{"class":434},"{\n",[198,501,503,506,510,512,516,520,522,525,527,530,533,536,539,542,546],{"class":200,"line":502},4,[198,504,505],{"class":420},"  async",[198,507,509],{"class":508},"sVXei"," create",[198,511,442],{"class":434},[198,513,515],{"class":514},"s99_P","input",[198,517,519],{"class":518},"smGrS",":",[198,521,424],{"class":204},[198,523,524],{"class":434},")",[198,526,519],{"class":518},[198,528,529],{"class":204}," Promise",[198,531,532],{"class":434},"\u003C",[198,534,535],{"class":204},"Post",[198,537,538],{"class":434},">",[198,540,541],{"class":434}," {",[198,543,545],{"class":544},"skxfh"," … ",[198,547,548],{"class":434},"}\n",[198,550,552],{"class":200,"line":551},5,[198,553,475],{"emptyLinePlaceholder":474},[198,555,557],{"class":200,"line":556},6,[198,558,560],{"class":559},"sutJx","  \u002F** La transition draft→published — une opération, pas une écriture de champ. *\u002F\n",[198,562,564,566,569,571,574,576,580,582,584,586,588,590,592,594,596],{"class":200,"line":563},7,[198,565,505],{"class":420},[198,567,568],{"class":508}," publish",[198,570,442],{"class":434},[198,572,573],{"class":514},"id",[198,575,519],{"class":518},[198,577,579],{"class":578},"sZMiF"," string",[198,581,524],{"class":434},[198,583,519],{"class":518},[198,585,529],{"class":204},[198,587,532],{"class":434},[198,589,535],{"class":204},[198,591,538],{"class":434},[198,593,541],{"class":434},[198,595,545],{"class":544},[198,597,548],{"class":434},[198,599,601],{"class":200,"line":600},8,[198,602,548],{"class":434},[147,604,605],{},"Les vues définissent les contrats d'entrée et de sortie de ces opérations.",[181,607,609,612],{"id":608},"fougere-serve-une-frond-son-propre-process",[150,610,611],{},"fougere serve"," — une Frond, son propre process",[189,614,616],{"className":191,"code":615,"language":193,"meta":194,"style":194},"fougere serve blog --port 4100\n",[150,617,618],{"__ignoreMap":194},[198,619,620,622,625,627,630],{"class":200,"line":201},[198,621,205],{"class":204},[198,623,624],{"class":208}," serve",[198,626,219],{"class":208},[198,628,629],{"class":215}," --port",[198,631,633],{"class":632},"srdBf"," 4100\n",[147,635,636,637,640,641,644,645,435],{},"Démarre cette Frond seule et l'expose en JSON-RPC sur ",[150,638,639],{},"POST \u002F_fougere\u002Fcall",". L'app qui la\nconsomme indique son adresse dans ",[150,642,643],{},"remotes:"," pour router les appels vers cet hôte. Voir\n",[365,646,647],{"href":123},"le gradient",[147,649,650,651,348,654,656,657,659],{},"Elle ne suit ",[160,652,653],{},"pas",[150,655,643],{}," elle-même : un hôte ",[374,658,376],{}," la Frond, il ne route pas vers\nl'extérieur.",[155,661,662],{},[147,663,664,667,668,671,672,675],{},[150,665,666],{},"serve()"," écoute ",[150,669,670],{},"127.0.0.1"," sauf si ",[150,673,674],{},"hosts"," dit autre chose : un récepteur lit\nl'identité sur le fil, donc le défaut le garde sur la machine et l'élargir est une\ndécision écrite.",[181,677,679,682],{"id":678},"fougere-call-appeler-une-opération",[150,680,681],{},"fougere call"," — appeler une opération",[189,684,686],{"className":191,"code":685,"language":193,"meta":194,"style":194},"fougere call post.list\nfougere call post.create --title \"Bonjour\" --body \"…\"\n",[150,687,688,698],{"__ignoreMap":194},[198,689,690,692,695],{"class":200,"line":201},[198,691,205],{"class":204},[198,693,694],{"class":208}," call",[198,696,697],{"class":208}," post.list\n",[198,699,700,702,704,707,710,713,716,719,722,724,727],{"class":200,"line":471},[198,701,205],{"class":204},[198,703,694],{"class":208},[198,705,706],{"class":208}," post.create",[198,708,709],{"class":215}," --title",[198,711,712],{"class":445}," \"",[198,714,715],{"class":208},"Bonjour",[198,717,718],{"class":445},"\"",[198,720,721],{"class":215}," --body",[198,723,712],{"class":445},[198,725,726],{"class":208},"…",[198,728,729],{"class":445},"\"\n",[147,731,732,733,736],{},"La commande utilise la même enveloppe, la même validation et les mêmes erreurs typées que\nles autres clients. Une erreur ",[150,734,735],{},"VALIDATION_FAILED"," conserve donc le format reçu par une\npage.",[181,738,740,743],{"id":739},"fougere-sync-consommer-une-frond-distante",[150,741,742],{},"fougere sync"," — consommer une Frond distante",[189,745,747],{"className":191,"code":746,"language":193,"meta":194,"style":194},"fougere sync blog --from http:\u002F\u002Fblog-service:4100\n",[150,748,749],{"__ignoreMap":194},[198,750,751,753,756,758,761],{"class":200,"line":201},[198,752,205],{"class":204},[198,754,755],{"class":208}," sync",[198,757,219],{"class":208},[198,759,760],{"class":215}," --from",[198,762,763],{"class":208}," http:\u002F\u002Fblog-service:4100\n",[147,765,766,767,770,771,774],{},"Demande ",[150,768,769],{},"rpc.discover"," à l'hôte et écrit localement les entités reconstruites depuis les\n",[365,772,773],{"href":60},"cartes"," qu'il renvoie :",[189,776,778],{"className":407,"code":777,"language":409,"meta":194,"style":194},"\u002F\u002F .fougere\u002Fremotes\u002Fblog\u002Fentities\u002FPost.ts — généré\nimport { reconstruct } from '@fougere\u002Fschema';\n\nexport class Post extends reconstruct\u003C{\n  id: string;\n  title: string;\n  createdAt: Date;\n}>({ \u002F* la carte, telle quelle *\u002F }) {}\n",[150,779,780,785,811,815,830,842,853,865],{"__ignoreMap":194},[198,781,782],{"class":200,"line":201},[198,783,784],{"class":559},"\u002F\u002F .fougere\u002Fremotes\u002Fblog\u002Fentities\u002FPost.ts — généré\n",[198,786,787,790,792,795,798,801,803,806,808],{"class":200,"line":471},[198,788,789],{"class":416},"import",[198,791,541],{"class":434},[198,793,794],{"class":430}," reconstruct",[198,796,797],{"class":434}," }",[198,799,800],{"class":416}," from",[198,802,457],{"class":445},[198,804,805],{"class":208},"@fougere\u002Fschema",[198,807,446],{"class":445},[198,809,810],{"class":434},";\n",[198,812,813],{"class":200,"line":478},[198,814,475],{"emptyLinePlaceholder":474},[198,816,817,819,821,823,825,827],{"class":200,"line":502},[198,818,417],{"class":416},[198,820,421],{"class":420},[198,822,431],{"class":204},[198,824,427],{"class":420},[198,826,794],{"class":438},[198,828,829],{"class":434},"\u003C{\n",[198,831,832,836,838,840],{"class":200,"line":551},[198,833,835],{"class":834},"sucvu","  id",[198,837,519],{"class":518},[198,839,579],{"class":578},[198,841,810],{"class":434},[198,843,844,847,849,851],{"class":200,"line":556},[198,845,846],{"class":834},"  title",[198,848,519],{"class":518},[198,850,579],{"class":578},[198,852,810],{"class":434},[198,854,855,858,860,863],{"class":200,"line":563},[198,856,857],{"class":834},"  createdAt",[198,859,519],{"class":518},[198,861,862],{"class":204}," Date",[198,864,810],{"class":434},[198,866,867,870,872,875,878,880,882],{"class":200,"line":600},[198,868,869],{"class":434},"}>",[198,871,442],{"class":430},[198,873,874],{"class":434},"{",[198,876,877],{"class":559}," \u002F* la carte, telle quelle *\u002F",[198,879,797],{"class":434},[198,881,465],{"class":430},[198,883,468],{"class":434},[147,885,886,887,889,890,893],{},"Une classe, comme celle qu'on aurait écrite à la main : ",[150,888,535],{}," est la valeur — un juge qui\nvalide localement, sans requête supplémentaire vers l'hôte — et le type d'une ligne qu'il\nrenvoie, si bien que ",[150,891,892],{},"post.titel"," ne compile pas. Les deux se lisent sur la même carte.",[147,895,896,897,900,901,904],{},"À côté, ",[150,898,899],{},"handlers\u002FPostHandler.ts"," énonce ce que la frond sert, pour qu'un consommateur\nécrive ",[150,902,903],{},"Facade\u003CPostHandler>"," sans détenir le code du handler :",[189,906,908],{"className":407,"code":907,"language":409,"meta":194,"style":194},"export interface PostHandler {\n  list(invocation?: Invocation): Promise\u003CPost[] & { total?: number; hasMore?: boolean }>;\n  findById(invocation?: Invocation): Promise\u003CPost | undefined>;\n}\n",[150,909,910,922,978,1010],{"__ignoreMap":194},[198,911,912,914,917,919],{"class":200,"line":201},[198,913,417],{"class":416},[198,915,916],{"class":420}," interface",[198,918,488],{"class":204},[198,920,921],{"class":434}," {\n",[198,923,924,927,929,932,935,938,940,942,944,946,948,951,954,956,959,961,964,967,970,972,975],{"class":200,"line":471},[198,925,926],{"class":508},"  list",[198,928,442],{"class":434},[198,930,931],{"class":514},"invocation",[198,933,934],{"class":518},"?:",[198,936,937],{"class":204}," Invocation",[198,939,524],{"class":434},[198,941,519],{"class":518},[198,943,529],{"class":204},[198,945,532],{"class":434},[198,947,535],{"class":204},[198,949,950],{"class":430},"[] ",[198,952,953],{"class":518},"&",[198,955,541],{"class":434},[198,957,958],{"class":834}," total",[198,960,934],{"class":518},[198,962,963],{"class":578}," number",[198,965,966],{"class":434},";",[198,968,969],{"class":834}," hasMore",[198,971,934],{"class":518},[198,973,974],{"class":578}," boolean",[198,976,977],{"class":434}," }>;\n",[198,979,980,983,985,987,989,991,993,995,997,999,1001,1004,1007],{"class":200,"line":478},[198,981,982],{"class":508},"  findById",[198,984,442],{"class":434},[198,986,931],{"class":514},[198,988,934],{"class":518},[198,990,937],{"class":204},[198,992,524],{"class":434},[198,994,519],{"class":518},[198,996,529],{"class":204},[198,998,532],{"class":434},[198,1000,535],{"class":204},[198,1002,1003],{"class":518}," |",[198,1005,1006],{"class":578}," undefined",[198,1008,1009],{"class":434},">;\n",[198,1011,1012],{"class":200,"line":502},[198,1013,548],{"class":434},[147,1015,1016,1017,1020,1021,1024],{},"La commande écrit aussi ",[150,1018,1019],{},".fougere\u002Fremotes.json",", que le module Nuxt lit pour aliaser\n",[150,1022,1023],{},"@frond\u002Fblog",". Les pages utilisent ainsi le même chemin d'import pour une entité locale\nou distante.",[147,1026,1027,1028,1031,1032,1035,1036,1039,1040,1043],{},"La relancer ",[160,1029,1030],{},"supprime ce que l'hôte ne sert plus",". Le barrel perd son export tout seul,\nmais le fichier restait — et ",[150,1033,1034],{},"exports"," liste ",[150,1037,1038],{},"'.\u002Fentities\u002F*'"," en joker, si bien que\n",[150,1041,1042],{},"@frond\u002Fblog\u002Fentities\u002FTicket.js"," résolvait encore vers une classe qui valide parfaitement\net dont plus rien ne répond derrière. Seuls les fichiers portant l'en-tête généré sont\nsupprimés ; ce que vous déposez vous-même dans ce dossier est laissé intact.",[147,1045,1046,1047,1050],{},"L'hôte renvoie les entités associées à une façade, et ",[160,1048,1049],{},"les faits que ses fronds\nannoncent",". Une entité qui n'est ni l'un ni l'autre n'est pas dans le résultat de\ndécouverte — une forme que personne n'expose et que personne n'a déclarée sortante reste\nchez elle.",[147,1052,1053,1054,1057],{},"Un fait n'a pas d'opération : il obtient une classe et aucune interface ",[150,1055,1056],{},"Handler"," à côté.",[189,1059,1061],{"className":407,"code":1060,"language":409,"meta":194,"style":194},"\u002F\u002F .fougere\u002Fremotes\u002Fblog\u002Fentities\u002FPostPublished.ts — généré\nexport class PostPublished extends reconstruct\u003C{ id: string; title: string; at: Date }>(…) {}\n",[150,1062,1063,1068],{"__ignoreMap":194},[198,1064,1065],{"class":200,"line":201},[198,1066,1067],{"class":559},"\u002F\u002F .fougere\u002Fremotes\u002Fblog\u002Fentities\u002FPostPublished.ts — généré\n",[198,1069,1070,1072,1074,1077,1079,1081,1084,1087,1089,1091,1093,1096,1098,1100,1102,1105,1107,1109,1112,1115],{"class":200,"line":471},[198,1071,417],{"class":416},[198,1073,421],{"class":420},[198,1075,1076],{"class":204}," PostPublished",[198,1078,427],{"class":420},[198,1080,794],{"class":438},[198,1082,1083],{"class":434},"\u003C{",[198,1085,1086],{"class":834}," id",[198,1088,519],{"class":518},[198,1090,579],{"class":578},[198,1092,966],{"class":434},[198,1094,1095],{"class":834}," title",[198,1097,519],{"class":518},[198,1099,579],{"class":578},[198,1101,966],{"class":434},[198,1103,1104],{"class":834}," at",[198,1106,519],{"class":518},[198,1108,862],{"class":204},[198,1110,1111],{"class":434}," }>",[198,1113,1114],{"class":430},"(…) ",[198,1116,468],{"class":434},[147,1118,1119,1120,1123,1124,1127],{},"Pour qu'un fait qui arrive soit jugé, réexportez cette classe dans une de vos propres\nfronds — le boot valide contre une entité d'une frond ",[160,1121,1122],{},"scannée",", et ",[150,1125,1126],{},".fougere\u002Fremotes\u002F","\nest un paquet, pas une frond :",[189,1129,1131],{"className":407,"code":1130,"language":409,"meta":194,"style":194},"\u002F\u002F fronds\u002Fsearch\u002Fentities\u002FPostPublished.ts\nexport { default } from '..\u002F..\u002F..\u002F.fougere\u002Fremotes\u002Fblog\u002Fentities\u002FPostPublished.js';\n",[150,1132,1133,1138],{"__ignoreMap":194},[198,1134,1135],{"class":200,"line":201},[198,1136,1137],{"class":559},"\u002F\u002F fronds\u002Fsearch\u002Fentities\u002FPostPublished.ts\n",[198,1139,1140,1142,1144,1146,1148,1150,1152,1155,1157],{"class":200,"line":471},[198,1141,417],{"class":416},[198,1143,541],{"class":434},[198,1145,483],{"class":416},[198,1147,797],{"class":434},[198,1149,800],{"class":416},[198,1151,457],{"class":445},[198,1153,1154],{"class":208},"..\u002F..\u002F..\u002F.fougere\u002Fremotes\u002Fblog\u002Fentities\u002FPostPublished.js",[198,1156,446],{"class":445},[198,1158,810],{"class":434},[1160,1161,1163],"h3",{"id":1162},"les-règles","Les règles",[238,1165,1166,1175],{},[241,1167,1168],{},[244,1169,1170,1172],{},[247,1171,150],{},[247,1173,1174],{},"ce que ça veut dire",[254,1176,1177,1194,1204],{},[244,1178,1179,1191],{},[259,1180,1181,1184,1185,1184,1188],{},[150,1182,1183],{},"directory-unreadable",", ",[150,1186,1187],{},"handler-parse-failed",[150,1189,1190],{},"heritage-unresolved",[259,1192,1193],{},"ce que le scan n'a pas pu faire — une règle sur une absence n'est fondée que si l'analyse atteste avoir regardé",[244,1195,1196,1201],{},[259,1197,1198],{},[150,1199,1200],{},"operation-unbound",[259,1202,1203],{},"une opération déclare des paramètres et n'a aucun plan de liaison : elle est servie, et elle n'en reçoit aucun",[244,1205,1206,1211],{},[259,1207,1208],{},[150,1209,1210],{},"cross-frond-import",[259,1212,1213],{},"un import relatif qui résout dans une autre frond",[147,1215,1216,1217,1220,1221,1224,1225,1227],{},"La dernière est un avertissement, pas un refus — ça résout aujourd'hui et l'app tourne. Ce\nqu'elle énonce, c'est qu'une ",[160,1218,1219],{},"contrainte de colocalisation tient l'application et que rien\nne la déclare"," : ",[150,1222,1223],{},"'..\u002F..\u002Fuser\u002Fentities\u002FUser.js'"," dit que ces deux dossiers sont voisins,\ndans une chaîne que le scan, la carte d'identité et ",[150,1226,643],{}," ignorent tous. Ça marche\njusqu'au jour où ce dossier n'est plus là, et ça casse alors comme un chemin de fichier,\npas comme un modèle.",[147,1229,1230,1233,1234,1239],{},[150,1231,1232],{},"'@frond\u002Fuser\u002Fentities\u002FUser.js'"," énonce la même dépendance en termes que le modèle lit, et\nc'est la forme qu'écrit ",[365,1235,1237],{"href":1236},"#fougere-sync-consommer-une-frond-distante",[150,1238,742],{}," — elle\nsurvit donc au déménagement de la frond. Le nom résout pareil, que la frond soit locale ou\nsynchronisée.",[181,1241,1243,1246],{"id":1242},"fougere-graph-lire-le-modèle",[150,1244,1245],{},"fougere graph"," — lire le modèle",[189,1248,1250],{"className":191,"code":1249,"language":193,"meta":194,"style":194},"fougere graph\n",[150,1251,1252],{"__ignoreMap":194},[198,1253,1254,1256],{"class":200,"line":201},[198,1255,205],{"class":204},[198,1257,1258],{"class":208}," graph\n",[147,1260,1261],{},"Affiche les entités, leurs références et le nombre de références entrantes. Au-delà de\nsix entités, la commande propose aussi des regroupements calculés depuis ce graphe :",[189,1263,1266],{"className":1264,"code":1265,"language":234},[232],"  Post → Author, Category (2 incoming)\n  Author\n",[150,1267,1265],{"__ignoreMap":194},[147,1269,1270,1271,1274],{},"La page ",[365,1272,1273],{"href":42},"chemin le plus court"," décrit les usages actuels\net envisagés de ce graphe.",[181,1276,1278,1281],{"id":1277},"fougere-build-frond-publier-les-entités-dune-frond",[150,1279,1280],{},"fougere build-frond"," — publier les entités d'une Frond",[189,1283,1285],{"className":191,"code":1284,"language":193,"meta":194,"style":194},"fougere build-frond blog\n",[150,1286,1287],{"__ignoreMap":194},[198,1288,1289,1291,1294],{"class":200,"line":201},[198,1290,205],{"class":204},[198,1292,1293],{"class":208}," build-frond",[198,1295,1296],{"class":208}," blog\n",[147,1298,1299,1300,1303,1304,1307,1308,1311,1312,435],{},"Compile ",[150,1301,1302],{},"fronds\u002Fblog\u002Fentities\u002F**"," vers ",[150,1305,1306],{},"dist\u002F"," avec les déclarations de types et configure\nle ",[150,1309,1310],{},"package.json"," de la Frond. Un consommateur situé dans un autre dépôt peut ensuite\ninstaller ce paquet. Voir ",[365,1313,1315],{"href":1314},"\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient#o%C3%B9-le-code-vit","où le code vit",[147,1317,1318,1319,435],{},"Suite : ",[365,1320,1321],{"href":34},"La philosophie",[1323,1324,1325],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVXei, html code.shiki .sVXei{--shiki-light:#E53935;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}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 pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":194,"searchDepth":471,"depth":471,"links":1327},[1328,1330,1332,1334,1338,1340],{"id":183,"depth":471,"text":1329},"fougere new — composer un workspace",{"id":608,"depth":471,"text":1331},"fougere serve — une Frond, son propre process",{"id":678,"depth":471,"text":1333},"fougere call — appeler une opération",{"id":739,"depth":471,"text":1335,"children":1336},"fougere sync — consommer une Frond distante",[1337],{"id":1162,"depth":478,"text":1163},{"id":1242,"depth":471,"text":1339},"fougere graph — lire le modèle",{"id":1277,"depth":471,"text":1341},"fougere build-frond — publier les entités d'une Frond","fougere new, serve, call, sync, graph — composer un workspace, héberger une Frond, appeler une opération depuis un shell.","md",{},{"title":24,"description":1342},"2ksMn68D9o-YWM6bpz3MuO8EnzdXVdPgXP60t1VZ3nw",1786637819745]