[{"data":1,"prerenderedAt":1025},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts":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":92,"body":139,"description":1020,"extension":1021,"meta":1022,"navigation":331,"path":93,"seo":1023,"stem":94,"__hash__":1024},"docs_fr\u002Ffr\u002Fdocs\u002F4.business\u002F6.facts.md",{"type":140,"value":141,"toc":1010},"minimark",[142,146,176,181,184,294,407,451,465,479,487,494,552,563,567,579,644,648,654,666,670,676,686,848,865,871,875,886,893,901,904,910,913,923,974,981,1000,1006],[143,144,92],"h1",{"id":145},"les-faits",[147,148,149,150,154,155,159,160,167,168,171,172,175],"p",{},"Tout autre appel nomme ",[151,152,153],"strong",{},"un"," destinataire : ",[156,157,158],"code",{},"remotes"," une adresse par Frond,\n",[161,162,164],"a",{"href":163},"\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers#atteindre-une-autre-frond",[156,165,166],{},"Facade\u003CT>"," une porte. ",[156,169,170],{},"Emit\u003CT>","\nnomme un ",[151,173,174],{},"sujet",", et le nombre de lecteurs ne regarde pas l'émetteur.",[177,178,180],"h2",{"id":179},"annoncer-un-fait","Annoncer un fait",[147,182,183],{},"Un fait est une entité, le plus souvent dérivée de celle dont il parle :",[185,186,191],"pre",{"className":187,"code":188,"language":189,"meta":190,"style":190},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F fronds\u002Fblog\u002Fentities\u002FPostPublished.ts\nexport default class PostPublished extends Post.pick('id', 'title').extend({ at: created() }) {}\n","ts","",[156,192,193,202],{"__ignoreMap":190},[194,195,198],"span",{"class":196,"line":197},"line",1,[194,199,201],{"class":200},"sutJx","\u002F\u002F fronds\u002Fblog\u002Fentities\u002FPostPublished.ts\n",[194,203,205,209,212,216,220,223,227,231,235,238,242,246,248,251,254,257,259,262,264,267,269,272,276,279,282,285,288,291],{"class":196,"line":204},2,[194,206,208],{"class":207},"sVHd0","export",[194,210,211],{"class":207}," default",[194,213,215],{"class":214},"sbsja"," class",[194,217,219],{"class":218},"sbgvK"," PostPublished",[194,221,222],{"class":214}," extends",[194,224,226],{"class":225},"su5hD"," Post",[194,228,230],{"class":229},"sP7_E",".",[194,232,234],{"class":233},"sGLFI","pick",[194,236,237],{"class":225},"(",[194,239,241],{"class":240},"sjJ54","'",[194,243,245],{"class":244},"s_sjI","id",[194,247,241],{"class":240},[194,249,250],{"class":229},",",[194,252,253],{"class":240}," '",[194,255,256],{"class":244},"title",[194,258,241],{"class":240},[194,260,261],{"class":225},")",[194,263,230],{"class":229},[194,265,266],{"class":233},"extend",[194,268,237],{"class":225},[194,270,271],{"class":229},"{",[194,273,275],{"class":274},"skxfh"," at",[194,277,278],{"class":229},":",[194,280,281],{"class":233}," created",[194,283,284],{"class":225},"() ",[194,286,287],{"class":229},"}",[194,289,290],{"class":225},") ",[194,292,293],{"class":229},"{}\n",[185,295,297],{"className":187,"code":296,"language":189,"meta":190,"style":190},"\u002F\u002F fronds\u002Fblog\u002Fhandlers\u002FPostHandler.ts — l'émetteur\nconstructor(private published: Emit\u003CPostPublished>) {}\n\nasync publish(id: string, title: string) {\n  await this.published({ id, title, at: new Date() });\n}\n",[156,298,299,304,326,333,353,401],{"__ignoreMap":190},[194,300,301],{"class":196,"line":197},[194,302,303],{"class":200},"\u002F\u002F fronds\u002Fblog\u002Fhandlers\u002FPostHandler.ts — l'émetteur\n",[194,305,306,309,312,316,319,322,324],{"class":196,"line":204},[194,307,308],{"class":233},"constructor",[194,310,311],{"class":225},"(private published: Emit",[194,313,315],{"class":314},"smGrS","\u003C",[194,317,318],{"class":225},"PostPublished",[194,320,321],{"class":314},">",[194,323,290],{"class":225},[194,325,293],{"class":229},[194,327,329],{"class":196,"line":328},3,[194,330,332],{"emptyLinePlaceholder":331},true,"\n",[194,334,336,339,342,345,347,350],{"class":196,"line":335},4,[194,337,338],{"class":225},"async ",[194,340,341],{"class":233},"publish",[194,343,344],{"class":225},"(id: string",[194,346,250],{"class":229},[194,348,349],{"class":225}," title: string) ",[194,351,352],{"class":229},"{\n",[194,354,356,359,363,365,368,370,372,375,377,380,382,384,386,389,392,394,396,398],{"class":196,"line":355},5,[194,357,358],{"class":207},"  await",[194,360,362],{"class":361},"s39Yj"," this",[194,364,230],{"class":229},[194,366,367],{"class":233},"published",[194,369,237],{"class":274},[194,371,271],{"class":229},[194,373,374],{"class":225}," id",[194,376,250],{"class":229},[194,378,379],{"class":225}," title",[194,381,250],{"class":229},[194,383,275],{"class":274},[194,385,278],{"class":229},[194,387,388],{"class":314}," new",[194,390,391],{"class":233}," Date",[194,393,284],{"class":274},[194,395,287],{"class":229},[194,397,261],{"class":274},[194,399,400],{"class":229},";\n",[194,402,404],{"class":196,"line":403},6,[194,405,406],{"class":229},"}\n",[185,408,410],{"className":187,"code":409,"language":189,"meta":190,"style":190},"\u002F\u002F fronds\u002Fsearch\u002Fhandlers\u002FIndexHandler.ts — une tout autre Frond\nasync reindex(fact: Fact\u003CPostPublished>): Promise\u003Cvoid> { … }\n",[156,411,412,417],{"__ignoreMap":190},[194,413,414],{"class":196,"line":197},[194,415,416],{"class":200},"\u002F\u002F fronds\u002Fsearch\u002Fhandlers\u002FIndexHandler.ts — une tout autre Frond\n",[194,418,419,421,424,427,429,431,433,436,440,443,446,449],{"class":196,"line":204},[194,420,338],{"class":225},[194,422,423],{"class":233},"reindex",[194,425,426],{"class":225},"(fact: Fact",[194,428,315],{"class":314},[194,430,318],{"class":225},[194,432,321],{"class":314},[194,434,435],{"class":225},"): ",[194,437,439],{"class":438},"sZMiF","Promise",[194,441,442],{"class":314},"\u003Cvoid>",[194,444,445],{"class":229}," {",[194,447,448],{"class":225}," … ",[194,450,406],{"class":229},[147,452,453,454,461,462,230],{},"Pas de topic, pas d'appel d'abonnement, pas de liste d'auditeurs. ",[151,455,456,457,460],{},"Accepter un ",[156,458,459],{},"Fact\u003CT>","\nEST l'abonnement"," — le scan lit la signature, et c'est tout le mécanisme. Un quatrième\nauditeur ne rouvre pas ",[156,463,464],{},"PostHandler",[147,466,467,468,470,471,474,475,478],{},"Rien ne marque non plus ",[156,469,318],{}," comme un fait : il le devient parce que quelqu'un\nécrit ",[156,472,473],{},"Emit\u003CPostPublished>"," ou ",[156,476,477],{},"Fact\u003CPostPublished>"," à son sujet. Un seul des deux bouts\nsuffit, donc supprimer l'émetteur ne désabonne personne en douce.",[480,481,483,484,486],"h3",{"id":482},"ce-que-factt-promet","Ce que ",[156,485,459],{}," promet",[147,488,489,490,493],{},"Pas seulement « je m'abonne ». Le push est le mode ",[151,491,492],{},"strict"," et le pull en est un cas\nparticulier : une op écrite pour le push est correcte quand on l'appelle directement,\nl'inverse est faux. L'enveloppe engage donc l'opération sur trois choses qu'aucun type ne\nvérifie :",[495,496,497,512],"table",{},[498,499,500],"thead",{},[501,502,503,506,509],"tr",{},[504,505],"th",{},[504,507,508],{},"pull",[504,510,511],{},"push",[513,514,515,527,538],"tbody",{},[501,516,517,521,524],{},[518,519,520],"td",{},"son retour",[518,522,523],{},"quelqu'un le lit",[518,525,526],{},"personne",[501,528,529,532,535],{},[518,530,531],{},"une exception",[518,533,534],{},"remonte au client",[518,536,537],{},"part dans un log",[501,539,540,543,546],{},[518,541,542],{},"combien de fois",[518,544,545],{},"une par requête",[518,547,548,549],{},"au moins une — ",[151,550,551],{},"rejouable",[147,553,554,555,558,559,562],{},"Un abonné est une opération ordinaire. Il garde sa porte, son juge et ses middlewares, parce\nqu'une émission et un appel direct ",[151,556,557],{},"sont le même appel"," — c'est aussi pourquoi il apparaît\ndans votre surface publique. Placez-le sous ",[156,560,561],{},"handlers\u002F\u003Caudience>\u002F"," pour le tenir hors d'une\naudience cliente.",[480,564,566],{"id":565},"cest-un-résolveur-pas-un-canal","C'est un résolveur, pas un canal",[147,568,569,570,574,575,578],{},"Un bus déplace des messages : une file, une enveloppe, une sémantique de livraison. Ici,\nrien de tout ça. Il répond à ",[571,572,573],"em",{},"qui",", puis rend la main à la porte qui existe déjà — un\n",[156,576,577],{},"resolve"," qui rend N choses au lieu d'une. Conséquences, énoncées plutôt que découvertes :",[580,581,582,593,611],"ul",{},[583,584,585,588,589,592],"li",{},[151,586,587],{},"Dispatcher n'est pas livrer."," ",[156,590,591],{},"await this.published(...)"," rend la main quand chaque\nabonné a reçu le fait, jamais quand l'un d'eux a fini. L'échec d'un abonné part dans un\nlog ; une publication n'est jamais otage de son indexeur.",[583,594,595,598,599,602,603,606,607,610],{},[151,596,597],{},"Un fait ne peut pas se causer lui-même."," Un anneau (",[156,600,601],{},"A → B → A",") est refusé et le\nmessage le nomme ; un losange (",[156,604,605],{},"A → B → D",", ",[156,608,609],{},"A → C → D",") reste légal.",[583,612,613,616,617,620,621,624,625,628,629,632,633,636,637,643],{},[151,614,615],{},"Rien n'est durable, et rien ici ne le sera."," Tuez le process de l'auditeur et le fait\nest perdu. L'at-least-once se paie en glissant un vrai canal ",[571,618,619],{},"sous"," le dispatch — un\njournal, un curseur par abonné, un acquittement — et rien de tout ça n'appartient à un\nrésolveur.",[622,623],"br",{},"Ce que Fougere doit à un tel canal, c'est de pouvoir répondre ",[571,626,627],{},"est-ce que c'est\narrivé ?",", et c'est ",[156,630,631],{},"app.deliver()"," : il attend chaque auditeur local et ",[151,634,635],{},"rejette"," si\nl'un a refusé, pour qu'un porteur puisse acquitter, réessayer ou mettre de côté. C'est\nl'exact inverse d'annoncer, exprès — « dispatcher n'est pas délivrer » protège\nl'émetteur, et un porteur n'est pas l'émetteur. Voir\n",[161,638,642],{"href":639,"rel":640},"https:\u002F\u002Fgithub.com\u002Fchok\u002Ffougere\u002Ftree\u002Fmain\u002Fdemos\u002Femit-multirepo",[641],"nofollow","emit-multirepo",", où le\nbroker de quatre-vingts lignes tient la file et la Frond n'en tient rien.",[480,645,647],{"id":646},"entre-process","Entre process",[147,649,650,653],{},[156,651,652],{},"remotes:"," est la seule ligne qui change. La Frond de l'auditeur reste sur le disque dans les\ndeux cas : elle est scannée, donc l'émetteur connaît sa signature ; la déclarer distante dit\nseulement qu'elle n'est pas hébergée ici, et sa porte résout vers une doublure qui envoie\nl'appel.",[147,655,656,657,662,663,665],{},"Voir ",[161,658,661],{"href":659,"rel":660},"https:\u002F\u002Fgithub.com\u002Fchok\u002Ffougere\u002Ftree\u002Fmain\u002Fdemos\u002Femit-split",[641],"emit-split"," — le même\n",[156,664,464],{},", publié deux fois, et le pid dans la sortie dit quel process a indexé.",[480,667,669],{"id":668},"entre-dépôts","Entre dépôts",[147,671,672,673,675],{},"Deux choses s'arrêtent à la frontière d'un dépôt, et ",[156,674,652],{}," n'en couvre qu'une.",[147,677,678,681,682,685],{},[151,679,680],{},"Trouver les auditeurs."," Le dispatch lit leur code, et la Frond d'une autre équipe n'est\npas sur ce disque. Un porteur se glisse alors sous l'émission — ",[156,683,684],{},"onEmit"," confie le fait à un\nnom, et l'autre côté s'abonne à ce même nom depuis son propre code. Aucun des deux ne lit\nl'autre ; ils se rejoignent sur une chaîne dérivée des deux côtés.",[185,687,689],{"className":187,"code":688,"language":189,"meta":190,"style":190},"const app = await createApp({\n  root: import.meta.dirname,\n  createContainer,\n  onEmit: (fact, payload) => publierVersVotreBroker(fact, payload),   \u002F\u002F sortie\n});\n\n\u002F\u002F entrée — le même dispatch local, juge et middlewares compris\nawait app.deliver(fact, payload);\n\u002F\u002F et ce à quoi s'abonner, lu sur ses propres signatures\napp.listensTo();                                                     \u002F\u002F ['postPublished']\n",[156,690,691,713,736,743,783,791,795,801,822,828],{"__ignoreMap":190},[194,692,693,696,700,703,706,709,711],{"class":196,"line":197},[194,694,695],{"class":214},"const",[194,697,699],{"class":698},"s_hVV"," app",[194,701,702],{"class":314}," =",[194,704,705],{"class":207}," await",[194,707,708],{"class":233}," createApp",[194,710,237],{"class":225},[194,712,352],{"class":229},[194,714,715,718,720,723,725,728,730,733],{"class":196,"line":204},[194,716,717],{"class":274},"  root",[194,719,278],{"class":229},[194,721,722],{"class":207}," import",[194,724,230],{"class":229},[194,726,727],{"class":698},"meta",[194,729,230],{"class":229},[194,731,732],{"class":225},"dirname",[194,734,735],{"class":229},",\n",[194,737,738,741],{"class":196,"line":328},[194,739,740],{"class":225},"  createContainer",[194,742,735],{"class":229},[194,744,745,748,750,753,757,759,762,764,767,770,773,775,778,780],{"class":196,"line":335},[194,746,747],{"class":233},"  onEmit",[194,749,278],{"class":229},[194,751,752],{"class":229}," (",[194,754,756],{"class":755},"s99_P","fact",[194,758,250],{"class":229},[194,760,761],{"class":755}," payload",[194,763,261],{"class":229},[194,765,766],{"class":214}," =>",[194,768,769],{"class":233}," publierVersVotreBroker",[194,771,772],{"class":225},"(fact",[194,774,250],{"class":229},[194,776,777],{"class":225}," payload)",[194,779,250],{"class":229},[194,781,782],{"class":200},"   \u002F\u002F sortie\n",[194,784,785,787,789],{"class":196,"line":355},[194,786,287],{"class":229},[194,788,261],{"class":225},[194,790,400],{"class":229},[194,792,793],{"class":196,"line":403},[194,794,332],{"emptyLinePlaceholder":331},[194,796,798],{"class":196,"line":797},7,[194,799,800],{"class":200},"\u002F\u002F entrée — le même dispatch local, juge et middlewares compris\n",[194,802,804,807,809,811,814,816,818,820],{"class":196,"line":803},8,[194,805,806],{"class":207},"await",[194,808,699],{"class":225},[194,810,230],{"class":229},[194,812,813],{"class":233},"deliver",[194,815,772],{"class":225},[194,817,250],{"class":229},[194,819,777],{"class":225},[194,821,400],{"class":229},[194,823,825],{"class":196,"line":824},9,[194,826,827],{"class":200},"\u002F\u002F et ce à quoi s'abonner, lu sur ses propres signatures\n",[194,829,831,834,836,839,842,845],{"class":196,"line":830},10,[194,832,833],{"class":225},"app",[194,835,230],{"class":229},[194,837,838],{"class":233},"listensTo",[194,840,841],{"class":225},"()",[194,843,844],{"class":229},";",[194,846,847],{"class":200},"                                                     \u002F\u002F ['postPublished']\n",[147,849,850,853,854,857,858,860,861,864],{},[151,851,852],{},"Connaître la forme."," La carte la publie : la liste ",[156,855,856],{},"facts"," d'une frond porte chaque\n",[156,859,170],{}," que ses handlers injectent, donc ",[156,862,863],{},"fougere sync"," écrit la classe au lieu qu'un\nabonné recopie les champs à la main. Réexportez-la dans une de vos fronds et un fait qui\narrive est jugé contre la déclaration de l'émetteur lui-même.",[147,866,656,867,870],{},[161,868,642],{"href":639,"rel":869},[641]," — deux\nprojets, un fait, et la première publication perdue exprès pour montrer ce qu'apporte un\nporteur.",[480,872,874],{"id":873},"faire-évoluer-un-fait","Faire évoluer un fait",[147,876,877,878,881,882,885],{},"Un fait rencontre le ",[151,879,880],{},"même juge"," que n'importe quelle entrée : une clé hors du contrat\nvaut ",[156,883,884],{},"Unknown field",", et c'est voulu. La tolérer signifierait qu'un lecteur ignore en\nsilence un champ qu'il devait traiter — la panne qu'on découvre six mois plus tard.",[147,887,888,889,892],{},"Donc ",[151,890,891],{},"ajouter un champ à un fait casse tous les lecteurs restés sur l'ancienne copie",". Le\nrefus atteint le log du lecteur et jamais l'émetteur, puisque dispatcher n'est pas délivrer\n— cette ligne est donc toute la trace disponible, et elle dit quoi faire :",[185,894,899],{"className":895,"code":897,"language":898},[896],"language-text","ERR [blog] postPublished → indexHandler.reindex refused the shape — author: Unknown field.\n    If 'postPublished' gained a field, this copy is older than the sender's:\n    re-run `fougere sync`.\n","text",[156,900,897],{"__ignoreMap":190},[147,902,903],{},"L'ordre fait donc partie du changement :",[185,905,908],{"className":906,"code":907,"language":898},[896],"1. l'émetteur déclare le nouveau champ\n2. chaque lecteur : `fougere sync`, puis déploie      ← d'abord\n3. l'émetteur déploie                                 ← en dernier\n",[156,909,907],{"__ignoreMap":190},[147,911,912],{},"Retirer un champ casse de la même façon, et aucune tolérance n'y aurait rien changé : la\ndonnée dont le lecteur a besoin n'est simplement pas là.",[147,914,915,916,919,920,922],{},"Quand l'étape 2 ne vous appartient pas — une autre équipe, une flotte, tout ce que vous ne\ndéployez pas dans l'ordre —, ",[151,917,918],{},"annoncez un second fait plutôt que de modifier le premier",".\nÇa coûte une classe et un ",[156,921,170],{},", les deux faits cohabitent, et les lecteurs migrent\nquand ils migrent :",[185,924,926],{"className":187,"code":925,"language":189,"meta":190,"style":190},"constructor(\n  private published: Emit\u003CPostPublished>,        \u002F\u002F les anciens lecteurs, intacts\n  private publishedV2: Emit\u003CPostPublishedFull>,  \u002F\u002F la nouvelle forme\n) {}\n",[156,927,928,935,951,968],{"__ignoreMap":190},[194,929,930,932],{"class":196,"line":197},[194,931,308],{"class":233},[194,933,934],{"class":225},"(\n",[194,936,937,940,942,944,946,948],{"class":196,"line":204},[194,938,939],{"class":225},"  private published: Emit",[194,941,315],{"class":314},[194,943,318],{"class":225},[194,945,321],{"class":314},[194,947,250],{"class":229},[194,949,950],{"class":200},"        \u002F\u002F les anciens lecteurs, intacts\n",[194,952,953,956,958,961,963,965],{"class":196,"line":328},[194,954,955],{"class":225},"  private publishedV2: Emit",[194,957,315],{"class":314},[194,959,960],{"class":225},"PostPublishedFull",[194,962,321],{"class":314},[194,964,250],{"class":229},[194,966,967],{"class":200},"  \u002F\u002F la nouvelle forme\n",[194,969,970,972],{"class":196,"line":335},[194,971,290],{"class":225},[194,973,293],{"class":229},[147,975,976,977,980],{},"Rien n'enregistre un fait : un second n'ajoute donc rien à désenregistrer plus tard.\nSupprimez le premier ",[156,978,979],{},"Emit"," quand son dernier lecteur a disparu.",[982,983,985],"alert",{"type":984},"info",[147,986,987,988,991,992,995,996,999],{},"Un ",[156,989,990],{},"EventBus"," occupait cette place et a été retiré plutôt que publié. Il résolvait par\n",[151,993,994],{},"chaîne de caractères"," — seul endroit qui ne résolvait pas par type, si bien qu'un nom mal\northographié ne produisait aucune erreur —, portait une charge ",[156,997,998],{},"unknown",", et attendait chaque\nauditeur en lui renvoyant ses échecs.",[147,1001,1002,1003,1005],{},"Suite : ",[161,1004,76],{"href":77}," — les champs calculés ajoutés à la sortie d'une entité.",[1007,1008,1009],"style",{},"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 .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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--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 .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 .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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":190,"searchDepth":204,"depth":204,"links":1011},[1012],{"id":179,"depth":204,"text":180,"children":1013},[1014,1016,1017,1018,1019],{"id":482,"depth":328,"text":1015},"Ce que Fact\u003CT> promet",{"id":565,"depth":328,"text":566},{"id":646,"depth":328,"text":647},{"id":668,"depth":328,"text":669},{"id":873,"depth":328,"text":874},"Emit\u003CT> nomme un sujet plutôt qu'un destinataire, et accepter un Fact\u003CT> EST l'abonnement.","md",{},{"title":92,"description":1020},"PSTVWxMrv2DzbYH7IdrwuV2evl8AXlNODk9otg0mxdk",1786637819922]