[{"data":1,"prerenderedAt":1149},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fconcepts\u002Fthe-base":189},[4],{"title":5,"path":6,"stem":7,"children":8,"page":52},"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,31,53,78,123,148],{"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},"Une app que vous avez déjà","\u002Ffr\u002Fdocs\u002Fexisting-app","fr\u002Fdocs\u002F02.existing-app",{"title":24,"path":25,"stem":26},"Apportez votre schéma","\u002Ffr\u002Fdocs\u002Fbring-your-schema","fr\u002Fdocs\u002F03.bring-your-schema",{"title":28,"path":29,"stem":30},"La CLI","\u002Ffr\u002Fdocs\u002Fcli","fr\u002Fdocs\u002F04.cli",{"title":32,"path":33,"stem":34,"children":35,"page":52},"Concepts","\u002Ffr\u002Fdocs\u002Fconcepts","fr\u002Fdocs\u002F2.concepts",[36,40,44,48],{"title":37,"path":38,"stem":39},"Philosophie","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fphilosophy","fr\u002Fdocs\u002F2.concepts\u002F1.philosophy",{"title":41,"path":42,"stem":43},"La Frond","\u002Ffr\u002Fdocs\u002Fconcepts\u002Ffrond","fr\u002Fdocs\u002F2.concepts\u002F2.frond",{"title":45,"path":46,"stem":47},"Le chemin le plus court","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fshortest-path","fr\u002Fdocs\u002F2.concepts\u002F3.shortest-path",{"title":49,"path":50,"stem":51},"Le socle","\u002Ffr\u002Fdocs\u002Fconcepts\u002Fthe-base","fr\u002Fdocs\u002F2.concepts\u002F4.the-base",false,{"title":54,"path":55,"stem":56,"children":57,"page":52},"Schéma","\u002Ffr\u002Fdocs\u002Fschema","fr\u002Fdocs\u002F3.schema",[58,62,66,70,74],{"title":59,"path":60,"stem":61},"Entités","\u002Ffr\u002Fdocs\u002Fschema\u002Fentities","fr\u002Fdocs\u002F3.schema\u002F1.entities",{"title":63,"path":64,"stem":65},"Vues","\u002Ffr\u002Fdocs\u002Fschema\u002Fviews","fr\u002Fdocs\u002F3.schema\u002F2.views",{"title":67,"path":68,"stem":69},"La carte d'identité","\u002Ffr\u002Fdocs\u002Fschema\u002Fcard","fr\u002Fdocs\u002F3.schema\u002F3.card",{"title":71,"path":72,"stem":73},"Standard Schema","\u002Ffr\u002Fdocs\u002Fschema\u002Fstandard-schema","fr\u002Fdocs\u002F3.schema\u002F4.standard-schema",{"title":75,"path":76,"stem":77},"Comment un schéma bouge","\u002Ffr\u002Fdocs\u002Fschema\u002Fevolution","fr\u002Fdocs\u002F3.schema\u002F5.evolution",{"title":79,"path":80,"stem":81,"children":82,"page":52},"Métier","\u002Ffr\u002Fdocs\u002Fbusiness","fr\u002Fdocs\u002F4.business",[83,87,91,95,99,103,107,111,115,119],{"title":84,"path":85,"stem":86},"Handlers","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers","fr\u002Fdocs\u002F4.business\u002F1.handlers",{"title":88,"path":89,"stem":90},"Les ports","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fports","fr\u002Fdocs\u002F4.business\u002F10.ports",{"title":92,"path":93,"stem":94},"Presenters","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters","fr\u002Fdocs\u002F4.business\u002F2.presenters",{"title":96,"path":97,"stem":98},"Collectors","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fcollectors","fr\u002Fdocs\u002F4.business\u002F3.collectors",{"title":100,"path":101,"stem":102},"Erreurs","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ferrors","fr\u002Fdocs\u002F4.business\u002F4.errors",{"title":104,"path":105,"stem":106},"Seeds","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fseeds","fr\u002Fdocs\u002F4.business\u002F5.seeds",{"title":108,"path":109,"stem":110},"Les faits","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ffacts","fr\u002Fdocs\u002F4.business\u002F6.facts",{"title":112,"path":113,"stem":114},"Le port Storage","\u002Ffr\u002Fdocs\u002Fbusiness\u002Fstorage","fr\u002Fdocs\u002F4.business\u002F7.storage",{"title":116,"path":117,"stem":118},"Des écritures qui tiennent ou tombent ensemble","\u002Ffr\u002Fdocs\u002Fbusiness\u002Ftogether","fr\u002Fdocs\u002F4.business\u002F8.together",{"title":120,"path":121,"stem":122},"Les repositories","\u002Ffr\u002Fdocs\u002Fbusiness\u002Frepositories","fr\u002Fdocs\u002F4.business\u002F9.repositories",{"title":124,"path":125,"stem":126,"children":127,"page":52},"Client","\u002Ffr\u002Fdocs\u002Fclient","fr\u002Fdocs\u002F5.client",[128,132,136,140,144],{"title":129,"path":130,"stem":131},"Queries & commands","\u002Ffr\u002Fdocs\u002Fclient\u002Fqueries-commands","fr\u002Fdocs\u002F5.client\u002F1.queries-commands",{"title":133,"path":134,"stem":135},"Formulaires","\u002Ffr\u002Fdocs\u002Fclient\u002Fforms","fr\u002Fdocs\u002F5.client\u002F2.forms",{"title":137,"path":138,"stem":139},"Session","\u002Ffr\u002Fdocs\u002Fclient\u002Fsession","fr\u002Fdocs\u002F5.client\u002F3.session",{"title":141,"path":142,"stem":143},"invoke","\u002Ffr\u002Fdocs\u002Fclient\u002Finvoke","fr\u002Fdocs\u002F5.client\u002F4.invoke",{"title":145,"path":146,"stem":147},"Back-office","\u002Ffr\u002Fdocs\u002Fclient\u002Fadmin","fr\u002Fdocs\u002F5.client\u002F5.admin",{"title":149,"path":150,"stem":151,"children":152,"page":52},"Infrastructure","\u002Ffr\u002Fdocs\u002Finfra","fr\u002Fdocs\u002F6.infra",[153,157,161,165,169,173,177,181,185],{"title":154,"path":155,"stem":156},"Le gradient","\u002Ffr\u002Fdocs\u002Finfra\u002Fgradient","fr\u002Fdocs\u002F6.infra\u002F1.gradient",{"title":158,"path":159,"stem":160},"Surfaces — REST & GraphQL","\u002Ffr\u002Fdocs\u002Finfra\u002Fsurfaces","fr\u002Fdocs\u002F6.infra\u002F2.surfaces",{"title":162,"path":163,"stem":164},"Déploiement","\u002Ffr\u002Fdocs\u002Finfra\u002Fdeployment","fr\u002Fdocs\u002F6.infra\u002F3.deployment",{"title":166,"path":167,"stem":168},"Hôtes","\u002Ffr\u002Fdocs\u002Finfra\u002Fhosts","fr\u002Fdocs\u002F6.infra\u002F4.hosts",{"title":170,"path":171,"stem":172},"Les sources","\u002Ffr\u002Fdocs\u002Finfra\u002Fsources","fr\u002Fdocs\u002F6.infra\u002F5.sources",{"title":174,"path":175,"stem":176},"Le cycle de vie","\u002Ffr\u002Fdocs\u002Finfra\u002Flifecycle","fr\u002Fdocs\u002F6.infra\u002F6.lifecycle",{"title":178,"path":179,"stem":180},"L'identité entre Fronds","\u002Ffr\u002Fdocs\u002Finfra\u002Fidentity","fr\u002Fdocs\u002F6.infra\u002F7.identity",{"title":182,"path":183,"stem":184},"Observabilité","\u002Ffr\u002Fdocs\u002Finfra\u002Fobservability","fr\u002Fdocs\u002F6.infra\u002F8.observability",{"title":186,"path":187,"stem":188},"Tests","\u002Ffr\u002Fdocs\u002Finfra\u002Ftesting","fr\u002Fdocs\u002F6.infra\u002F9.testing",{"id":190,"title":49,"body":191,"description":1143,"extension":1144,"meta":1145,"navigation":1146,"path":50,"seo":1147,"stem":51,"__hash__":1148},"docs_fr\u002Ffr\u002Fdocs\u002F2.concepts\u002F4.the-base.md",{"type":192,"value":193,"toc":1134},"minimark",[194,198,202,205,210,320,332,336,347,471,478,481,486,493,778,794,805,808,840,844,851,931,961,965,968,1086,1089,1098,1102,1118,1124,1130],[195,196,49],"h1",{"id":197},"le-socle",[199,200,201],"p",{},"Le socle d'une application Fougere n'est pas ce que le framework expédie. C'est l'entité\nque vous avez écrite.",[199,203,204],{},"Tout ce que Fougere vous rend est indexé sur cette déclaration, et cela prend trois formes.\nLes connaître suffit à prédire où va le schéma dans une API que vous n'avez jamais vue :\nentre les parenthèses d'une classe dont vous héritez, dans le type d'une valeur que vous\nrecevez, ou en premier argument d'un appel que vous écrivez.",[206,207,209],"h2",{"id":208},"trois-formes-un-seul-paramètre","Trois formes, un seul paramètre",[211,212,213,229],"table",{},[214,215,216],"thead",{},[217,218,219,223,226],"tr",{},[220,221,222],"th",{},"Forme",[220,224,225],{},"Ce que vous écrivez",[220,227,228],{},"Exemples",[230,231,232,269,296],"tbody",{},[217,233,234,242,248],{},[235,236,237,238],"td",{},"une classe dont vous ",[239,240,241],"strong",{},"héritez",[235,243,244],{},[245,246,247],"code",{},"extends Crud(Post)",[235,249,250,253,254,253,257,253,260,253,263,253,266],{},[245,251,252],{},"entity",", ",[245,255,256],{},"Crud",[245,258,259],{},"Presenter",[245,261,262],{},"Collector",[245,264,265],{},"Repository",[245,267,268],{},"Mirror",[217,270,271,277,282],{},[235,272,273,274],{},"une valeur que vous ",[239,275,276],{},"recevez",[235,278,279],{},[245,280,281],{},"constructor(posts: RepositoryOf\u003CPost>)",[235,283,284,253,287,253,290,253,293],{},[245,285,286],{},"RepositoryOf\u003CE>",[245,288,289],{},"Emit\u003CF>",[245,291,292],{},"Fact\u003CF>",[245,294,295],{},"Facade\u003CH>",[217,297,298,304,309],{},[235,299,300,301],{},"un appel que vous ",[239,302,303],{},"écrivez",[235,305,306],{},[245,307,308],{},"useQuery(Post, 'list')",[235,310,311,253,314,253,317],{},[245,312,313],{},"useQuery",[245,315,316],{},"useCommand",[245,318,319],{},"useFormFor",[199,321,322,323,327,328,331],{},"Le paramètre est toujours quelque chose que vous avez déclaré vous-même — le plus souvent\nune entité, parfois un ",[324,325,326],"a",{"href":109},"fait"," ou un\n",[324,329,330],{"href":85},"handler",". Rien dans cette colonne n'est une chaîne, un nom ou\nune clé enregistrée ailleurs : renommez la classe et le compilateur suit chacun de ses\nlecteurs.",[206,333,335],{"id":334},"une-classe-dont-vous-héritez","Une classe dont vous héritez",[199,337,338,339,342,343,346],{},"Elles sont six. Ce qui varie n'est pas leur nature mais la quantité que votre déclaration\ndétermine — ",[245,340,341],{},"Collector(User)"," ne peut presque rien dériver de « je résous un User », là où\n",[245,344,345],{},"Crud(Post)"," dérive cinq opérations entières de la table de Post.",[211,348,349,363],{},[214,350,351],{},[217,352,353,355,358,361],{},[220,354],{},[220,356,357],{},"Les parenthèses tiennent",[220,359,360],{},"Ce dont vous héritez",[220,362,225],{},[230,364,365,383,400,417,435,453],{},[217,366,367,374,377,380],{},[235,368,369],{},[324,370,371],{"href":60},[245,372,373],{},"entity({…})",[235,375,376],{},"les champs",[235,378,379],{},"le type, le juge, les métadonnées",[235,381,382],{},"la carte des champs",[217,384,385,391,394,397],{},[235,386,387],{},[324,388,389],{"href":85},[245,390,345],{},[235,392,393],{},"une entité",[235,395,396],{},"cinq opérations",[235,398,399],{},"rien, ou celles que vous redéfinissez",[217,401,402,409,411,414],{},[235,403,404],{},[324,405,406],{"href":93},[245,407,408],{},"Presenter(Post)",[235,410,393],{},[235,412,413],{},"la cible que le scan lit",[235,415,416],{},"une méthode par champ calculé",[217,418,419,425,428,430],{},[235,420,421],{},[324,422,423],{"href":97},[245,424,341],{},[235,426,427],{},"n'importe quelle classe",[235,429,413],{},[235,431,432],{},[245,433,434],{},"collect(ctx)",[217,436,437,444,447,450],{},[235,438,439],{},[324,440,441],{"href":121},[245,442,443],{},"Repository(Reading)",[235,445,446],{},"une entité, ou les plusieurs qu'il possède",[235,448,449],{},"tous les gestes du port gardé — ou aucun, à partir de deux",[235,451,452],{},"les requêtes que vous nommez",[217,454,455,460,463,466],{},[235,456,457],{},[245,458,459],{},"Mirror(BookCard)",[235,461,462],{},"une forme",[235,464,465],{},"la boucle, l'âge, le juge, l'écriture",[235,467,468],{},[245,469,470],{},"pull()",[199,472,473,474,477],{},"Seule la première est obligatoire. Un handler qui n'étend rien est un handler ordinaire ;\nun repository que vous n'écrivez jamais se résout quand même. Là où hériter ",[239,475,476],{},"est"," la\ndéclaration — presenters, collectors — la classe de base porte une cible et aucun\ncomportement.",[199,479,480],{},"Chacune est documentée là où elle sert, et les liens ci-dessus y mènent. Une seule n'a pas\nde page à elle, parce qu'elle n'appartient à aucune étape en particulier : c'est le socle\nlui-même.",[482,483,485],"h3",{"id":484},"mirror-une-copie-locale-de-lignes-quon-ne-peut-pas-interroger","Mirror — une copie locale de lignes qu'on ne peut pas interroger",[199,487,488,489,492],{},"Une vraie base de données s'interroge là où elle est. ",[245,490,491],{},"Mirror(Shape)"," est la réponse pour\nune source sans algèbre : une API HTTP, le catalogue d'un partenaire, une Frond derrière un\nfil. La sous-classe fournit une seule chose, le tirage :",[494,495,500],"pre",{"className":496,"code":497,"language":498,"meta":499,"style":499},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F services\u002FPartnerCatalog.ts\nexport default class PartnerCatalog extends Mirror(BookCard) {\n  async *pull(since?: Date) {\n    for (let page = 0; page !== null; ) {\n      const body = await fetch(`${api}?page=${page}&since=${since?.toISOString() ?? ''}`);\n      const { items, next } = await body.json();\n      yield items.map(toCard);\n      page = next;\n    }\n  }\n}\n","ts","",[245,501,502,511,544,577,619,689,726,748,760,766,772],{"__ignoreMap":499},[503,504,507],"span",{"class":505,"line":506},"line",1,[503,508,510],{"class":509},"sutJx","\u002F\u002F services\u002FPartnerCatalog.ts\n",[503,512,514,518,521,525,529,532,536,540],{"class":505,"line":513},2,[503,515,517],{"class":516},"sVHd0","export",[503,519,520],{"class":516}," default",[503,522,524],{"class":523},"sbsja"," class",[503,526,528],{"class":527},"sbgvK"," PartnerCatalog",[503,530,531],{"class":523}," extends",[503,533,535],{"class":534},"sGLFI"," Mirror",[503,537,539],{"class":538},"su5hD","(BookCard) ",[503,541,543],{"class":542},"sP7_E","{\n",[503,545,547,550,554,558,561,565,568,571,574],{"class":505,"line":546},3,[503,548,549],{"class":523},"  async",[503,551,553],{"class":552},"smGrS"," *",[503,555,557],{"class":556},"sVXei","pull",[503,559,560],{"class":542},"(",[503,562,564],{"class":563},"s99_P","since",[503,566,567],{"class":552},"?:",[503,569,570],{"class":527}," Date",[503,572,573],{"class":542},")",[503,575,576],{"class":542}," {\n",[503,578,580,583,587,590,593,596,600,603,605,608,612,614,617],{"class":505,"line":579},4,[503,581,582],{"class":516},"    for",[503,584,586],{"class":585},"skxfh"," (",[503,588,589],{"class":523},"let",[503,591,592],{"class":538}," page",[503,594,595],{"class":552}," =",[503,597,599],{"class":598},"srdBf"," 0",[503,601,602],{"class":542},";",[503,604,592],{"class":538},[503,606,607],{"class":552}," !==",[503,609,611],{"class":610},"s39Yj"," null",[503,613,602],{"class":542},[503,615,616],{"class":585}," ) ",[503,618,543],{"class":542},[503,620,622,625,629,631,634,637,639,643,646,649,653,656,659,661,664,666,668,671,674,678,681,684,686],{"class":505,"line":621},5,[503,623,624],{"class":523},"      const",[503,626,628],{"class":627},"s_hVV"," body",[503,630,595],{"class":552},[503,632,633],{"class":516}," await",[503,635,636],{"class":534}," fetch",[503,638,560],{"class":585},[503,640,642],{"class":641},"sjJ54","`${",[503,644,645],{"class":538},"api",[503,647,648],{"class":641},"}",[503,650,652],{"class":651},"s_sjI","?page=",[503,654,655],{"class":641},"${",[503,657,658],{"class":538},"page",[503,660,648],{"class":641},[503,662,663],{"class":651},"&since=",[503,665,655],{"class":641},[503,667,564],{"class":538},[503,669,670],{"class":641},"?.",[503,672,673],{"class":534},"toISOString",[503,675,677],{"class":676},"sfo-9","() ",[503,679,680],{"class":552},"??",[503,682,683],{"class":641}," ''}`",[503,685,573],{"class":585},[503,687,688],{"class":542},";\n",[503,690,692,694,697,700,703,706,709,711,713,715,718,721,724],{"class":505,"line":691},6,[503,693,624],{"class":523},[503,695,696],{"class":542}," {",[503,698,699],{"class":627}," items",[503,701,702],{"class":542},",",[503,704,705],{"class":627}," next",[503,707,708],{"class":542}," }",[503,710,595],{"class":552},[503,712,633],{"class":516},[503,714,628],{"class":538},[503,716,717],{"class":542},".",[503,719,720],{"class":534},"json",[503,722,723],{"class":585},"()",[503,725,688],{"class":542},[503,727,729,732,734,736,739,741,744,746],{"class":505,"line":728},7,[503,730,731],{"class":516},"      yield",[503,733,699],{"class":538},[503,735,717],{"class":542},[503,737,738],{"class":534},"map",[503,740,560],{"class":585},[503,742,743],{"class":538},"toCard",[503,745,573],{"class":585},[503,747,688],{"class":542},[503,749,751,754,756,758],{"class":505,"line":750},8,[503,752,753],{"class":538},"      page",[503,755,595],{"class":552},[503,757,705],{"class":538},[503,759,688],{"class":542},[503,761,763],{"class":505,"line":762},9,[503,764,765],{"class":542},"    }\n",[503,767,769],{"class":505,"line":768},10,[503,770,771],{"class":542},"  }\n",[503,773,775],{"class":505,"line":774},11,[503,776,777],{"class":542},"}\n",[199,779,780,781,784,785,790,791,793],{},"Tout ce qu'il y a autour est identique pour tous les miroirs et vit dans la classe de\nbase : ",[245,782,783],{},"refresh()"," lit la ligne de flottaison, tire à partir de là, juge chaque page et\nl'écrit. La forme doit porter un champ ",[324,786,787],{"href":60},[245,788,789],{},"updated()"," — une copie\nincapable de dire quand elle a été tirée se lit exactement comme des lignes vivantes — et\n",[245,792,268],{}," refuse à la construction sinon.",[199,795,796,797,800,801,804],{},"Une page est une entrée client : elle rencontre le même juge que n'importe quelle autre, et\nstrictement — sans quoi un partenaire qui renomme ",[245,798,799],{},"label"," écrit des ",[245,802,803],{},"null"," en silence. Une\npage refusée arrête la passe ; ce que les pages précédentes ont écrit reste, parce qu'un\nupsert est idempotent et que la passe suivante repart de la ligne de flottaison.",[199,806,807],{},"Il ne se planifie pas lui-même. Un hook de démarrage, un cron, une opération derrière une\nporte sont tous légitimes et aucun n'est l'affaire de cette classe.",[809,810,811],"note",{},[199,812,813,815,816,819,820,823,824,827,828,831,832,835,836,839],{},[245,814,268],{}," n'a pas encore de dossier à lui dans le vocabulaire d'une Frond — contrairement à\n",[245,817,818],{},"presenters\u002F"," et ",[245,821,822],{},"collectors\u002F",", un dossier ",[245,825,826],{},"mirrors\u002F"," n'est pas scanné. Placez-le là où les\nproviders sont lus (",[245,829,830],{},"services\u002F"," ou ",[245,833,834],{},"repositories\u002F","). En tant que détenteur du stockage, il\nreçoit l'",[245,837,838],{},"Storage"," sur lequel son prefab a été construit ; handlers, presenters et\ncollectors n'ont pas cette exception.",[206,841,843],{"id":842},"une-valeur-que-vous-recevez","Une valeur que vous recevez",[199,845,846,847,850],{},"La deuxième forme est un paramètre de constructeur, résolu ",[239,848,849],{},"par type"," — jamais par nom de\nparamètre, jamais par une clé en chaîne :",[494,852,854],{"className":496,"code":853,"language":498,"meta":499,"style":499},"export default class PostHandler {\n  constructor(\n    private posts: RepositoryOf\u003CPost>,\n    private announce: Emit\u003CPostPublished>,\n  ) {}\n}\n",[245,855,856,869,877,900,919,927],{"__ignoreMap":499},[503,857,858,860,862,864,867],{"class":505,"line":506},[503,859,517],{"class":516},[503,861,520],{"class":516},[503,863,524],{"class":523},[503,865,866],{"class":527}," PostHandler",[503,868,576],{"class":542},[503,870,871,874],{"class":505,"line":513},[503,872,873],{"class":523},"  constructor",[503,875,876],{"class":542},"(\n",[503,878,879,882,885,888,891,894,897],{"class":505,"line":546},[503,880,881],{"class":523},"    private",[503,883,884],{"class":563}," posts",[503,886,887],{"class":552},":",[503,889,890],{"class":527}," RepositoryOf",[503,892,893],{"class":542},"\u003C",[503,895,896],{"class":527},"Post",[503,898,899],{"class":542},">,\n",[503,901,902,904,907,909,912,914,917],{"class":505,"line":579},[503,903,881],{"class":523},[503,905,906],{"class":563}," announce",[503,908,887],{"class":552},[503,910,911],{"class":527}," Emit",[503,913,893],{"class":542},[503,915,916],{"class":527},"PostPublished",[503,918,899],{"class":542},[503,920,921,924],{"class":505,"line":621},[503,922,923],{"class":542},"  )",[503,925,926],{"class":542}," {}\n",[503,928,929],{"class":505,"line":691},[503,930,777],{"class":542},[199,932,933,935,936,939,940,943,944,948,949,951,952,954,955,960],{},[245,934,286],{}," est la forme du repository par défaut : il transmet le port gardé et se\nrésout même sans fichier repository. Injecter directement ",[245,937,938],{},"Storage\u003CE>"," dans un handler,\nun presenter ou un collector est refusé au boot ; l'accès au stockage se nomme par un\n",[324,941,942],{"href":121},"repository",". ",[324,945,946],{"href":109},[245,947,289],{}," annonce\nun fait, et accepter un ",[245,950,292],{}," ",[239,953,476],{}," l'abonnement — pas de topic, pas d'appel\nd'enregistrement. ",[324,956,958],{"href":957},"\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers#atteindre-une-autre-frond",[245,959,295],{}," est\nla seule dont le paramètre n'est pas une entité : elle nomme le handler d'une autre Frond,\nqui reste une déclaration de vous.",[206,962,964],{"id":963},"un-appel-que-vous-écrivez","Un appel que vous écrivez",[199,966,967],{},"La troisième forme est côté client, et l'entité est le premier argument :",[494,969,971],{"className":496,"code":970,"language":498,"meta":499,"style":499},"const { items } = await useQuery(Post, 'list');\nconst publish = useCommand(Post, 'publish');\nconst form = useFormFor(Post, { op: 'update', params: { id } });\n",[245,972,973,1009,1036],{"__ignoreMap":499},[503,974,975,978,980,982,984,986,988,991,994,996,999,1002,1005,1007],{"class":505,"line":506},[503,976,977],{"class":523},"const",[503,979,696],{"class":542},[503,981,699],{"class":627},[503,983,708],{"class":542},[503,985,595],{"class":552},[503,987,633],{"class":516},[503,989,990],{"class":534}," useQuery",[503,992,993],{"class":538},"(Post",[503,995,702],{"class":542},[503,997,998],{"class":641}," '",[503,1000,1001],{"class":651},"list",[503,1003,1004],{"class":641},"'",[503,1006,573],{"class":538},[503,1008,688],{"class":542},[503,1010,1011,1013,1016,1018,1021,1023,1025,1027,1030,1032,1034],{"class":505,"line":513},[503,1012,977],{"class":523},[503,1014,1015],{"class":627}," publish",[503,1017,595],{"class":552},[503,1019,1020],{"class":534}," useCommand",[503,1022,993],{"class":538},[503,1024,702],{"class":542},[503,1026,998],{"class":641},[503,1028,1029],{"class":651},"publish",[503,1031,1004],{"class":641},[503,1033,573],{"class":538},[503,1035,688],{"class":542},[503,1037,1038,1040,1043,1045,1048,1050,1052,1054,1057,1059,1061,1064,1066,1068,1071,1073,1075,1078,1080,1082,1084],{"class":505,"line":546},[503,1039,977],{"class":523},[503,1041,1042],{"class":627}," form",[503,1044,595],{"class":552},[503,1046,1047],{"class":534}," useFormFor",[503,1049,993],{"class":538},[503,1051,702],{"class":542},[503,1053,696],{"class":542},[503,1055,1056],{"class":585}," op",[503,1058,887],{"class":542},[503,1060,998],{"class":641},[503,1062,1063],{"class":651},"update",[503,1065,1004],{"class":641},[503,1067,702],{"class":542},[503,1069,1070],{"class":585}," params",[503,1072,887],{"class":542},[503,1074,696],{"class":542},[503,1076,1077],{"class":538}," id ",[503,1079,648],{"class":542},[503,1081,708],{"class":542},[503,1083,573],{"class":538},[503,1085,688],{"class":542},[199,1087,1088],{},"Même désignation que côté serveur : le juge local est le juge distant, et un contrat de\nformulaire n'est pas une seconde déclaration de l'entité.",[199,1090,1091,1092,1097],{},"Une exception mérite d'être dite : ",[324,1093,1094],{"href":138},[245,1095,1096],{},"useCurrentUser()"," ne prend\naucun argument. Il lit son entité dans la session plutôt que sur le site d'appel.",[206,1099,1101],{"id":1100},"pourquoi-une-classe-et-jamais-un-décorateur","Pourquoi une classe, et jamais un décorateur",[199,1103,1104,1105,1109,1110,1113,1114,1117],{},"Un décorateur devrait ",[1106,1107,1108],"em",{},"modifier"," le runtime pour accrocher le storage, la cible ou les cinq\nopérations. ",[245,1111,1112],{},"extends"," énonce la même chose dans le langage : le type suit sans seconde\ndéclaration, ",[245,1115,1116],{},"getFields()"," est un statique ordinaire, et rien n'est enregistré dans votre\ndos.",[199,1119,1120,1121,1123],{},"Cela survit aussi là où un scan ne va pas. ",[245,1122,256],{}," déclare ses opérations au runtime, sur la\nclasse : une Frond installée dont aucun parseur ne peut ouvrir les sources publie quand\nmême son contrat. Des métadonnées de décorateur demanderaient un drapeau de compilation et\nune bibliothèque de réflexion pour en dire autant, et ne le diraient que là où les deux\nsont configurés.",[199,1125,1126,1127,717],{},"Suite : ",[324,1128,1129],{"href":60},"Les entités",[1131,1132,1133],"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 .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 .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--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 .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 .sfo-9, html code.shiki .sfo-9{--shiki-light:#90A4AE;--shiki-default:#032F62;--shiki-dark:#9ECBFF}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);}",{"title":499,"searchDepth":513,"depth":513,"links":1135},[1136,1137,1140,1141,1142],{"id":208,"depth":513,"text":209},{"id":334,"depth":513,"text":335,"children":1138},[1139],{"id":484,"depth":546,"text":485},{"id":842,"depth":513,"text":843},{"id":963,"depth":513,"text":964},{"id":1100,"depth":513,"text":1101},"Tout ce que Fougere vous rend est indexé sur votre propre déclaration — une classe dont vous héritez, une valeur que vous recevez, un appel que vous écrivez.","md",{},true,{"title":49,"description":1143},"O1GCgyFUN_trkSjN0_lsCJZMfJ8hPXM0OVCThzUcFtQ",1788598418924]