[{"data":1,"prerenderedAt":918},["ShallowReactive",2],{"docs-nav:fr":3,"docs:\u002Ffr\u002Fdocs\u002Fbusiness\u002Fpresenters":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":92,"body":191,"description":913,"extension":914,"meta":915,"navigation":307,"path":93,"seo":916,"stem":94,"__hash__":917},"docs_fr\u002Ffr\u002Fdocs\u002F4.business\u002F2.presenters.md",{"type":192,"value":193,"toc":907},"minimark",[194,198,207,663,674,679,692,699,703,716,782,790,794,797,830,838,842,897,903],[195,196,92],"h1",{"id":197},"presenters",[199,200,201,202,206],"p",{},"Un presenter ajoute des ",[203,204,205],"strong",{},"champs calculés"," à la sortie d'une entité. Chaque méthode définit\nun champ. Elle reçoit toutes les lignes de la réponse et renvoie une valeur par ligne.",[208,209,214],"pre",{"className":210,"code":211,"language":212,"meta":213,"style":213},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import { Presenter, type RepositoryOf } from '@fougere\u002Fcore';\nimport Post from '..\u002Fentities\u002FPost.js';\nimport Author from '..\u002Fentities\u002FAuthor.js';\n\nexport default class PostPresenter extends Presenter(Post) {\n  constructor(private authors: RepositoryOf\u003CAuthor>) { super(); }\n\n  excerpt(posts: Post[]): string[] {\n    return posts.map((post) => post.body.slice(0, 200));\n  }\n\n  \u002F** Une lecture pour la page, pas une par ligne — c'est pourquoi la page est l'argument. *\u002F\n  async authorName(posts: Post[]): Promise\u003Cstring[]> {\n    const authors = await this.authors.findByKeys(posts.map((post) => post.authorId));\n    return posts.map((post) => authors.get(post.authorId)?.name ?? 'Anonymous');\n  }\n}\n","ts","",[215,216,217,263,283,302,309,338,385,390,424,480,486,491,498,537,594,652,657],"code",{"__ignoreMap":213},[218,219,222,226,230,234,237,240,243,246,249,253,257,260],"span",{"class":220,"line":221},"line",1,[218,223,225],{"class":224},"sVHd0","import",[218,227,229],{"class":228},"sP7_E"," {",[218,231,233],{"class":232},"su5hD"," Presenter",[218,235,236],{"class":228},",",[218,238,239],{"class":224}," type",[218,241,242],{"class":232}," RepositoryOf",[218,244,245],{"class":228}," }",[218,247,248],{"class":224}," from",[218,250,252],{"class":251},"sjJ54"," '",[218,254,256],{"class":255},"s_sjI","@fougere\u002Fcore",[218,258,259],{"class":251},"'",[218,261,262],{"class":228},";\n",[218,264,266,268,271,274,276,279,281],{"class":220,"line":265},2,[218,267,225],{"class":224},[218,269,270],{"class":232}," Post ",[218,272,273],{"class":224},"from",[218,275,252],{"class":251},[218,277,278],{"class":255},"..\u002Fentities\u002FPost.js",[218,280,259],{"class":251},[218,282,262],{"class":228},[218,284,286,288,291,293,295,298,300],{"class":220,"line":285},3,[218,287,225],{"class":224},[218,289,290],{"class":232}," Author ",[218,292,273],{"class":224},[218,294,252],{"class":251},[218,296,297],{"class":255},"..\u002Fentities\u002FAuthor.js",[218,299,259],{"class":251},[218,301,262],{"class":228},[218,303,305],{"class":220,"line":304},4,[218,306,308],{"emptyLinePlaceholder":307},true,"\n",[218,310,312,315,318,322,326,329,332,335],{"class":220,"line":311},5,[218,313,314],{"class":224},"export",[218,316,317],{"class":224}," default",[218,319,321],{"class":320},"sbsja"," class",[218,323,325],{"class":324},"sbgvK"," PostPresenter",[218,327,328],{"class":320}," extends",[218,330,233],{"class":331},"sGLFI",[218,333,334],{"class":232},"(Post) ",[218,336,337],{"class":228},"{\n",[218,339,341,344,347,350,354,358,360,363,366,369,371,375,379,382],{"class":220,"line":340},6,[218,342,343],{"class":320},"  constructor",[218,345,346],{"class":228},"(",[218,348,349],{"class":320},"private",[218,351,353],{"class":352},"s99_P"," authors",[218,355,357],{"class":356},"smGrS",":",[218,359,242],{"class":324},[218,361,362],{"class":228},"\u003C",[218,364,365],{"class":324},"Author",[218,367,368],{"class":228},">)",[218,370,229],{"class":228},[218,372,374],{"class":373},"s_hVV"," super",[218,376,378],{"class":377},"skxfh","()",[218,380,381],{"class":228},";",[218,383,384],{"class":228}," }\n",[218,386,388],{"class":220,"line":387},7,[218,389,308],{"emptyLinePlaceholder":307},[218,391,393,397,399,402,404,407,410,413,415,419,422],{"class":220,"line":392},8,[218,394,396],{"class":395},"sVXei","  excerpt",[218,398,346],{"class":228},[218,400,401],{"class":352},"posts",[218,403,357],{"class":356},[218,405,406],{"class":324}," Post",[218,408,409],{"class":232},"[]",[218,411,412],{"class":228},")",[218,414,357],{"class":356},[218,416,418],{"class":417},"sZMiF"," string",[218,420,421],{"class":232},"[] ",[218,423,337],{"class":228},[218,425,427,430,433,436,439,441,443,446,448,451,454,456,459,461,464,466,470,472,475,478],{"class":220,"line":426},9,[218,428,429],{"class":224},"    return",[218,431,432],{"class":232}," posts",[218,434,435],{"class":228},".",[218,437,438],{"class":331},"map",[218,440,346],{"class":377},[218,442,346],{"class":228},[218,444,445],{"class":352},"post",[218,447,412],{"class":228},[218,449,450],{"class":320}," =>",[218,452,453],{"class":232}," post",[218,455,435],{"class":228},[218,457,458],{"class":232},"body",[218,460,435],{"class":228},[218,462,463],{"class":331},"slice",[218,465,346],{"class":377},[218,467,469],{"class":468},"srdBf","0",[218,471,236],{"class":228},[218,473,474],{"class":468}," 200",[218,476,477],{"class":377},"))",[218,479,262],{"class":228},[218,481,483],{"class":220,"line":482},10,[218,484,485],{"class":228},"  }\n",[218,487,489],{"class":220,"line":488},11,[218,490,308],{"emptyLinePlaceholder":307},[218,492,494],{"class":220,"line":493},12,[218,495,497],{"class":496},"sutJx","  \u002F** Une lecture pour la page, pas une par ligne — c'est pourquoi la page est l'argument. *\u002F\n",[218,499,501,504,507,509,511,513,515,517,519,521,524,526,529,531,534],{"class":220,"line":500},13,[218,502,503],{"class":320},"  async",[218,505,506],{"class":395}," authorName",[218,508,346],{"class":228},[218,510,401],{"class":352},[218,512,357],{"class":356},[218,514,406],{"class":324},[218,516,409],{"class":232},[218,518,412],{"class":228},[218,520,357],{"class":356},[218,522,523],{"class":324}," Promise",[218,525,362],{"class":228},[218,527,528],{"class":417},"string",[218,530,409],{"class":232},[218,532,533],{"class":228},">",[218,535,536],{"class":228}," {\n",[218,538,540,543,545,548,551,555,557,560,562,565,567,569,571,573,575,577,579,581,583,585,587,590,592],{"class":220,"line":539},14,[218,541,542],{"class":320},"    const",[218,544,353],{"class":373},[218,546,547],{"class":356}," =",[218,549,550],{"class":224}," await",[218,552,554],{"class":553},"s39Yj"," this",[218,556,435],{"class":228},[218,558,559],{"class":232},"authors",[218,561,435],{"class":228},[218,563,564],{"class":331},"findByKeys",[218,566,346],{"class":377},[218,568,401],{"class":232},[218,570,435],{"class":228},[218,572,438],{"class":331},[218,574,346],{"class":377},[218,576,346],{"class":228},[218,578,445],{"class":352},[218,580,412],{"class":228},[218,582,450],{"class":320},[218,584,453],{"class":232},[218,586,435],{"class":228},[218,588,589],{"class":232},"authorId",[218,591,477],{"class":377},[218,593,262],{"class":228},[218,595,597,599,601,603,605,607,609,611,613,615,617,619,622,624,626,628,630,632,635,638,641,643,646,648,650],{"class":220,"line":596},15,[218,598,429],{"class":224},[218,600,432],{"class":232},[218,602,435],{"class":228},[218,604,438],{"class":331},[218,606,346],{"class":377},[218,608,346],{"class":228},[218,610,445],{"class":352},[218,612,412],{"class":228},[218,614,450],{"class":320},[218,616,353],{"class":232},[218,618,435],{"class":228},[218,620,621],{"class":331},"get",[218,623,346],{"class":377},[218,625,445],{"class":232},[218,627,435],{"class":228},[218,629,589],{"class":232},[218,631,412],{"class":377},[218,633,634],{"class":228},"?.",[218,636,637],{"class":232},"name",[218,639,640],{"class":356}," ??",[218,642,252],{"class":251},[218,644,645],{"class":255},"Anonymous",[218,647,259],{"class":251},[218,649,412],{"class":377},[218,651,262],{"class":228},[218,653,655],{"class":220,"line":654},16,[218,656,485],{"class":228},[218,658,660],{"class":220,"line":659},17,[218,661,662],{"class":228},"}\n",[199,664,665,666,669,670,673],{},"Placez la classe dans le dossier ",[215,667,668],{},"presenters\u002F"," de la Frond. Le scan l'enregistre sous le\nnom ",[215,671,672],{},"PostPresenter",". Les méthodes peuvent être synchrones ou asynchrones, et les\ndépendances du constructeur sont résolues par type.",[675,676,678],"h2",{"id":677},"pourquoi-ce-nest-pas-un-champ-de-lentité","Pourquoi ce n'est pas un champ de l'entité",[199,680,681,684,685,687,688,691],{},[215,682,683],{},"excerpt"," est calculé depuis ",[215,686,458],{}," et n'a pas besoin d'être stocké. ",[215,689,690],{},"authorName"," vient\nd'une autre entité ; le calculer à la lecture évite de dupliquer cette valeur lors d'un\nrenommage d'auteur.",[199,693,694,695,698],{},"Utilisez un presenter lorsque le calcul demande des I\u002FO, une autre entité ou les deux. Il\ns'agit d'une classe afin que ses dépendances, notamment un repository, puissent être\ninjectées. L'injection directe d'",[215,696,697],{},"Storage"," est refusée au boot, comme pour les handlers et\nles collectors.",[675,700,702],{"id":701},"application-aux-différentes-surfaces","Application aux différentes surfaces",[199,704,705,706,709,710,709,713,715],{},"Un champ calculé est ajouté à la sortie de l'entité sur chaque porte : l'enveloppe\n(",[215,707,708],{},"useQuery",", ",[215,711,712],{},"useCommand",[215,714,141],{},"), REST — monté en catch-all ou en hôte standalone — et\nGraphQL. Aucune configuration supplémentaire n'est nécessaire.",[208,717,719],{"className":210,"code":718,"language":212,"meta":213,"style":213},"const { items } = await useQuery\u003CPost>(Post, 'list');\nitems[0].excerpt;      \u002F\u002F ← présent, exactement comme dans une requête GraphQL\n",[215,720,721,763],{"__ignoreMap":213},[218,722,723,726,728,731,733,735,737,740,742,745,747,750,752,754,757,759,761],{"class":220,"line":221},[218,724,725],{"class":320},"const",[218,727,229],{"class":228},[218,729,730],{"class":373}," items",[218,732,245],{"class":228},[218,734,547],{"class":356},[218,736,550],{"class":224},[218,738,739],{"class":331}," useQuery",[218,741,362],{"class":228},[218,743,744],{"class":324},"Post",[218,746,533],{"class":228},[218,748,749],{"class":232},"(Post",[218,751,236],{"class":228},[218,753,252],{"class":251},[218,755,756],{"class":255},"list",[218,758,259],{"class":251},[218,760,412],{"class":232},[218,762,262],{"class":228},[218,764,765,768,770,773,775,777,779],{"class":220,"line":265},[218,766,767],{"class":232},"items[",[218,769,469],{"class":468},[218,771,772],{"class":232},"]",[218,774,435],{"class":228},[218,776,683],{"class":232},[218,778,381],{"class":228},[218,780,781],{"class":496},"      \u002F\u002F ← présent, exactement comme dans une requête GraphQL\n",[783,784,785],"blockquote",{},[199,786,787,788,435],{},"L'enrichissement est maintenant appliqué dans la façade commune. Les versions\nprécédentes l'appliquaient séparément dans les projections REST et GraphQL, et pas dans\n",[215,789,708],{},[675,791,793],{"id":792},"où-ça-sarrête-une-vue-nommée","Où ça s'arrête : une vue nommée",[199,795,796],{},"Lorsqu'une opération nomme une vue de sortie, seuls les champs de cette vue sont renvoyés.\nUn champ calculé qui n'y figure pas est exclu :",[208,798,800],{"className":210,"code":799,"language":212,"meta":213,"style":213},"Crud(Post, { list: PostCard })   \u002F\u002F list émet PostCard, et rien que PostCard\n",[215,801,802],{"__ignoreMap":213},[218,803,804,807,809,811,813,816,818,821,824,827],{"class":220,"line":221},[218,805,806],{"class":331},"Crud",[218,808,749],{"class":232},[218,810,236],{"class":228},[218,812,229],{"class":228},[218,814,815],{"class":377}," list",[218,817,357],{"class":228},[218,819,820],{"class":232}," PostCard ",[218,822,823],{"class":228},"}",[218,825,826],{"class":232},")   ",[218,828,829],{"class":496},"\u002F\u002F list émet PostCard, et rien que PostCard\n",[199,831,832,833,837],{},"Sans vue nommée, les champs calculés s'ajoutent à la sortie de l'entité. L'",[834,835,836],"a",{"href":60},"axe\nboundary"," continue de s'appliquer aux champs de l'entité.",[675,839,841],{"id":840},"ce-que-ce-nest-pas","Ce que ce n'est pas",[843,844,845,863,877,887],"ul",{},[846,847,848,851,852,855,856,859,860,435],"li",{},[203,849,850],{},"Pas un sérialiseur."," Ce qui peut sortir du tout est l'axe ",[215,853,854],{},"boundary"," ; ce qu'une\naudience donnée voit est une ",[834,857,858],{"href":64},"vue",". Un presenter ne fait\nqu'",[203,861,862],{},"ajouter",[846,864,865,868,869,872,873,435],{},[203,866,867],{},"Pas un endroit pour les règles métier."," Un champ calculé est une lecture. Une\ntransition (",[215,870,871],{},"publish",") est ",[834,874,876],{"href":875},"\u002Ffr\u002Fdocs\u002Fbusiness\u002Fhandlers#un-%C3%A9tat-change-par-une-op%C3%A9ration-jamais-par-une-%C3%A9criture-de-champ","une opération, pas une écriture de\nchamp",[846,878,879,882,883,886],{},[203,880,881],{},"Pas automatiquement optimisé."," Une méthode reçoit toute la page, ce qui permet de\nregrouper les lectures. Un ",[215,884,885],{},"findById"," dans chaque itération produira toujours N lectures.",[846,888,889,892,893,896],{},[203,890,891],{},"Pas d'échec silencieux."," Une erreur dans un champ calculé produit ",[215,894,895],{},"INTERNAL_ERROR"," en\nindiquant le champ concerné.",[199,898,899,900,902],{},"Suite : ",[834,901,96],{"href":97}," — résoudre les paramètres par type.",[904,905,906],"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 .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .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 .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 .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sVXei, html code.shiki .sVXei{--shiki-light:#E53935;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .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 .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--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);}",{"title":213,"searchDepth":265,"depth":265,"links":908},[909,910,911,912],{"id":677,"depth":265,"text":678},{"id":701,"depth":265,"text":702},{"id":792,"depth":265,"text":793},{"id":840,"depth":265,"text":841},"Ajouter des champs calculés aux sorties d'une entité, avec injection de dépendances et traitement par lot.","md",{},{"title":92,"description":913},"mMuQJJt1FLDTEeF2ZXAbqXqSsE85zWPzLrY2L8HIsUs",1788598419074]