[{"data":1,"prerenderedAt":914},["ShallowReactive",2],{"docs-nav:en":3,"docs:\u002Fdocs\u002Fbusiness\u002Fpresenters":186},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,50,75,120,145],{"title":10,"path":6,"stem":11},"What is Fougere","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":17,"path":18,"stem":19},"An app you already have","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":21,"path":22,"stem":23},"Bring your schema","\u002Fdocs\u002Fbring-your-schema","docs\u002F03.bring-your-schema",{"title":25,"path":26,"stem":27},"The CLI","\u002Fdocs\u002Fcli","docs\u002F04.cli",{"title":29,"path":30,"stem":31,"children":32,"page":49},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[33,37,41,45],{"title":34,"path":35,"stem":36},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":38,"path":39,"stem":40},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":42,"path":43,"stem":44},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",{"title":46,"path":47,"stem":48},"The base","\u002Fdocs\u002Fconcepts\u002Fthe-base","docs\u002F2.concepts\u002F4.the-base",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[55,59,63,67,71],{"title":56,"path":57,"stem":58},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":60,"path":61,"stem":62},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":64,"path":65,"stem":66},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":68,"path":69,"stem":70},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":72,"path":73,"stem":74},"How a schema moves","\u002Fdocs\u002Fschema\u002Fevolution","docs\u002F3.schema\u002F5.evolution",{"title":76,"path":77,"stem":78,"children":79,"page":49},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[80,84,88,92,96,100,104,108,112,116],{"title":81,"path":82,"stem":83},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":85,"path":86,"stem":87},"Ports","\u002Fdocs\u002Fbusiness\u002Fports","docs\u002F4.business\u002F10.ports",{"title":89,"path":90,"stem":91},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":93,"path":94,"stem":95},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":97,"path":98,"stem":99},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":101,"path":102,"stem":103},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":105,"path":106,"stem":107},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":109,"path":110,"stem":111},"Storage","\u002Fdocs\u002Fbusiness\u002Fstorage","docs\u002F4.business\u002F7.storage",{"title":113,"path":114,"stem":115},"Writes that stand or fall as one","\u002Fdocs\u002Fbusiness\u002Ftogether","docs\u002F4.business\u002F8.together",{"title":117,"path":118,"stem":119},"Repositories","\u002Fdocs\u002Fbusiness\u002Frepositories","docs\u002F4.business\u002F9.repositories",{"title":121,"path":122,"stem":123,"children":124,"page":49},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[125,129,133,137,141],{"title":126,"path":127,"stem":128},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":130,"path":131,"stem":132},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":134,"path":135,"stem":136},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":138,"path":139,"stem":140},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":142,"path":143,"stem":144},"Back-office","\u002Fdocs\u002Fclient\u002Fadmin","docs\u002F5.client\u002F5.admin",{"title":146,"path":147,"stem":148,"children":149,"page":49},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":155,"path":156,"stem":157},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":159,"path":160,"stem":161},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":163,"path":164,"stem":165},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"title":167,"path":168,"stem":169},"Sources","\u002Fdocs\u002Finfra\u002Fsources","docs\u002F6.infra\u002F5.sources",{"title":171,"path":172,"stem":173},"Lifecycle","\u002Fdocs\u002Finfra\u002Flifecycle","docs\u002F6.infra\u002F6.lifecycle",{"title":175,"path":176,"stem":177},"Identity across Fronds","\u002Fdocs\u002Finfra\u002Fidentity","docs\u002F6.infra\u002F7.identity",{"title":179,"path":180,"stem":181},"Observability","\u002Fdocs\u002Finfra\u002Fobservability","docs\u002F6.infra\u002F8.observability",{"title":183,"path":184,"stem":185},"Testing","\u002Fdocs\u002Finfra\u002Ftesting","docs\u002F6.infra\u002F9.testing",{"id":187,"title":89,"body":188,"description":909,"extension":910,"meta":911,"navigation":304,"path":90,"seo":912,"stem":91,"__hash__":913},"docs_en\u002Fdocs\u002F4.business\u002F2.presenters.md",{"type":189,"value":190,"toc":903},"minimark",[191,195,204,660,671,676,689,695,699,712,778,786,790,793,826,834,838,893,899],[192,193,89],"h1",{"id":194},"presenters",[196,197,198,199,203],"p",{},"A presenter adds ",[200,201,202],"strong",{},"computed fields"," to an entity's output. Each method defines one field.\nIt receives every row in the response and returns one value per row.",[205,206,211],"pre",{"className":207,"code":208,"language":209,"meta":210,"style":210},"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** One read for the page, not one per row — which is why the page is the 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","",[212,213,214,260,280,299,306,335,382,387,421,477,483,488,495,534,591,649,654],"code",{"__ignoreMap":210},[215,216,219,223,227,231,234,237,240,243,246,250,254,257],"span",{"class":217,"line":218},"line",1,[215,220,222],{"class":221},"sVHd0","import",[215,224,226],{"class":225},"sP7_E"," {",[215,228,230],{"class":229},"su5hD"," Presenter",[215,232,233],{"class":225},",",[215,235,236],{"class":221}," type",[215,238,239],{"class":229}," RepositoryOf",[215,241,242],{"class":225}," }",[215,244,245],{"class":221}," from",[215,247,249],{"class":248},"sjJ54"," '",[215,251,253],{"class":252},"s_sjI","@fougere\u002Fcore",[215,255,256],{"class":248},"'",[215,258,259],{"class":225},";\n",[215,261,263,265,268,271,273,276,278],{"class":217,"line":262},2,[215,264,222],{"class":221},[215,266,267],{"class":229}," Post ",[215,269,270],{"class":221},"from",[215,272,249],{"class":248},[215,274,275],{"class":252},"..\u002Fentities\u002FPost.js",[215,277,256],{"class":248},[215,279,259],{"class":225},[215,281,283,285,288,290,292,295,297],{"class":217,"line":282},3,[215,284,222],{"class":221},[215,286,287],{"class":229}," Author ",[215,289,270],{"class":221},[215,291,249],{"class":248},[215,293,294],{"class":252},"..\u002Fentities\u002FAuthor.js",[215,296,256],{"class":248},[215,298,259],{"class":225},[215,300,302],{"class":217,"line":301},4,[215,303,305],{"emptyLinePlaceholder":304},true,"\n",[215,307,309,312,315,319,323,326,329,332],{"class":217,"line":308},5,[215,310,311],{"class":221},"export",[215,313,314],{"class":221}," default",[215,316,318],{"class":317},"sbsja"," class",[215,320,322],{"class":321},"sbgvK"," PostPresenter",[215,324,325],{"class":317}," extends",[215,327,230],{"class":328},"sGLFI",[215,330,331],{"class":229},"(Post) ",[215,333,334],{"class":225},"{\n",[215,336,338,341,344,347,351,355,357,360,363,366,368,372,376,379],{"class":217,"line":337},6,[215,339,340],{"class":317},"  constructor",[215,342,343],{"class":225},"(",[215,345,346],{"class":317},"private",[215,348,350],{"class":349},"s99_P"," authors",[215,352,354],{"class":353},"smGrS",":",[215,356,239],{"class":321},[215,358,359],{"class":225},"\u003C",[215,361,362],{"class":321},"Author",[215,364,365],{"class":225},">)",[215,367,226],{"class":225},[215,369,371],{"class":370},"s_hVV"," super",[215,373,375],{"class":374},"skxfh","()",[215,377,378],{"class":225},";",[215,380,381],{"class":225}," }\n",[215,383,385],{"class":217,"line":384},7,[215,386,305],{"emptyLinePlaceholder":304},[215,388,390,394,396,399,401,404,407,410,412,416,419],{"class":217,"line":389},8,[215,391,393],{"class":392},"sVXei","  excerpt",[215,395,343],{"class":225},[215,397,398],{"class":349},"posts",[215,400,354],{"class":353},[215,402,403],{"class":321}," Post",[215,405,406],{"class":229},"[]",[215,408,409],{"class":225},")",[215,411,354],{"class":353},[215,413,415],{"class":414},"sZMiF"," string",[215,417,418],{"class":229},"[] ",[215,420,334],{"class":225},[215,422,424,427,430,433,436,438,440,443,445,448,451,453,456,458,461,463,467,469,472,475],{"class":217,"line":423},9,[215,425,426],{"class":221},"    return",[215,428,429],{"class":229}," posts",[215,431,432],{"class":225},".",[215,434,435],{"class":328},"map",[215,437,343],{"class":374},[215,439,343],{"class":225},[215,441,442],{"class":349},"post",[215,444,409],{"class":225},[215,446,447],{"class":317}," =>",[215,449,450],{"class":229}," post",[215,452,432],{"class":225},[215,454,455],{"class":229},"body",[215,457,432],{"class":225},[215,459,460],{"class":328},"slice",[215,462,343],{"class":374},[215,464,466],{"class":465},"srdBf","0",[215,468,233],{"class":225},[215,470,471],{"class":465}," 200",[215,473,474],{"class":374},"))",[215,476,259],{"class":225},[215,478,480],{"class":217,"line":479},10,[215,481,482],{"class":225},"  }\n",[215,484,486],{"class":217,"line":485},11,[215,487,305],{"emptyLinePlaceholder":304},[215,489,491],{"class":217,"line":490},12,[215,492,494],{"class":493},"sutJx","  \u002F** One read for the page, not one per row — which is why the page is the argument. *\u002F\n",[215,496,498,501,504,506,508,510,512,514,516,518,521,523,526,528,531],{"class":217,"line":497},13,[215,499,500],{"class":317},"  async",[215,502,503],{"class":392}," authorName",[215,505,343],{"class":225},[215,507,398],{"class":349},[215,509,354],{"class":353},[215,511,403],{"class":321},[215,513,406],{"class":229},[215,515,409],{"class":225},[215,517,354],{"class":353},[215,519,520],{"class":321}," Promise",[215,522,359],{"class":225},[215,524,525],{"class":414},"string",[215,527,406],{"class":229},[215,529,530],{"class":225},">",[215,532,533],{"class":225}," {\n",[215,535,537,540,542,545,548,552,554,557,559,562,564,566,568,570,572,574,576,578,580,582,584,587,589],{"class":217,"line":536},14,[215,538,539],{"class":317},"    const",[215,541,350],{"class":370},[215,543,544],{"class":353}," =",[215,546,547],{"class":221}," await",[215,549,551],{"class":550},"s39Yj"," this",[215,553,432],{"class":225},[215,555,556],{"class":229},"authors",[215,558,432],{"class":225},[215,560,561],{"class":328},"findByKeys",[215,563,343],{"class":374},[215,565,398],{"class":229},[215,567,432],{"class":225},[215,569,435],{"class":328},[215,571,343],{"class":374},[215,573,343],{"class":225},[215,575,442],{"class":349},[215,577,409],{"class":225},[215,579,447],{"class":317},[215,581,450],{"class":229},[215,583,432],{"class":225},[215,585,586],{"class":229},"authorId",[215,588,474],{"class":374},[215,590,259],{"class":225},[215,592,594,596,598,600,602,604,606,608,610,612,614,616,619,621,623,625,627,629,632,635,638,640,643,645,647],{"class":217,"line":593},15,[215,595,426],{"class":221},[215,597,429],{"class":229},[215,599,432],{"class":225},[215,601,435],{"class":328},[215,603,343],{"class":374},[215,605,343],{"class":225},[215,607,442],{"class":349},[215,609,409],{"class":225},[215,611,447],{"class":317},[215,613,350],{"class":229},[215,615,432],{"class":225},[215,617,618],{"class":328},"get",[215,620,343],{"class":374},[215,622,442],{"class":229},[215,624,432],{"class":225},[215,626,586],{"class":229},[215,628,409],{"class":374},[215,630,631],{"class":225},"?.",[215,633,634],{"class":229},"name",[215,636,637],{"class":353}," ??",[215,639,249],{"class":248},[215,641,642],{"class":252},"Anonymous",[215,644,256],{"class":248},[215,646,409],{"class":374},[215,648,259],{"class":225},[215,650,652],{"class":217,"line":651},16,[215,653,482],{"class":225},[215,655,657],{"class":217,"line":656},17,[215,658,659],{"class":225},"}\n",[196,661,662,663,666,667,670],{},"Place the class in the Frond's ",[212,664,665],{},"presenters\u002F"," directory. The scan registers it as\n",[212,668,669],{},"PostPresenter",". Methods may be synchronous or asynchronous, and constructor dependencies\nare resolved by type.",[672,673,675],"h2",{"id":674},"why-it-is-not-a-field-on-the-entity","Why it is not a field on the entity",[196,677,678,681,682,684,685,688],{},[212,679,680],{},"excerpt"," is computed from ",[212,683,455],{}," and does not need to be stored. ",[212,686,687],{},"authorName"," comes from\nanother entity; computing it at read time avoids duplicating the value when an author is\nrenamed.",[196,690,691,692,694],{},"Use a presenter when the calculation needs I\u002FO, another entity, or both. It is a class so\nthat dependencies such as a repository can be injected. Direct ",[212,693,109],{}," injection is\nrefused at boot, just as it is for handlers and collectors.",[672,696,698],{"id":697},"application-across-surfaces","Application across surfaces",[196,700,701,702,705,706,705,709,711],{},"A computed field is added to the entity's output on every door: the envelope\n(",[212,703,704],{},"useQuery",", ",[212,707,708],{},"useCommand",[212,710,138],{},"), REST — mounted as the catch-all or as a standalone\nhost — and GraphQL. No additional configuration is required.",[205,713,715],{"className":207,"code":714,"language":209,"meta":210,"style":210},"const { items } = await useQuery\u003CPost>(Post, 'list');\nitems[0].excerpt;      \u002F\u002F ← present, exactly as in a GraphQL query\n",[212,716,717,759],{"__ignoreMap":210},[215,718,719,722,724,727,729,731,733,736,738,741,743,746,748,750,753,755,757],{"class":217,"line":218},[215,720,721],{"class":317},"const",[215,723,226],{"class":225},[215,725,726],{"class":370}," items",[215,728,242],{"class":225},[215,730,544],{"class":353},[215,732,547],{"class":221},[215,734,735],{"class":328}," useQuery",[215,737,359],{"class":225},[215,739,740],{"class":321},"Post",[215,742,530],{"class":225},[215,744,745],{"class":229},"(Post",[215,747,233],{"class":225},[215,749,249],{"class":248},[215,751,752],{"class":252},"list",[215,754,256],{"class":248},[215,756,409],{"class":229},[215,758,259],{"class":225},[215,760,761,764,766,769,771,773,775],{"class":217,"line":262},[215,762,763],{"class":229},"items[",[215,765,466],{"class":465},[215,767,768],{"class":229},"]",[215,770,432],{"class":225},[215,772,680],{"class":229},[215,774,378],{"class":225},[215,776,777],{"class":493},"      \u002F\u002F ← present, exactly as in a GraphQL query\n",[779,780,781],"blockquote",{},[196,782,783,784,432],{},"Enrichment is now applied in the shared façade. Earlier versions applied it separately\nin the REST and GraphQL projections, and not in ",[212,785,704],{},[672,787,789],{"id":788},"where-it-stops-a-named-view","Where it stops: a named view",[196,791,792],{},"When an operation names an output view, only fields in that view are returned. A computed\nfield not listed there is excluded:",[205,794,796],{"className":207,"code":795,"language":209,"meta":210,"style":210},"Crud(Post, { list: PostCard })   \u002F\u002F list emits PostCard, and only PostCard\n",[212,797,798],{"__ignoreMap":210},[215,799,800,803,805,807,809,812,814,817,820,823],{"class":217,"line":218},[215,801,802],{"class":328},"Crud",[215,804,745],{"class":229},[215,806,233],{"class":225},[215,808,226],{"class":225},[215,810,811],{"class":374}," list",[215,813,354],{"class":225},[215,815,816],{"class":229}," PostCard ",[215,818,819],{"class":225},"}",[215,821,822],{"class":229},")   ",[215,824,825],{"class":493},"\u002F\u002F list emits PostCard, and only PostCard\n",[196,827,828,829,833],{},"Without a named view, computed fields are added to the entity's output. The ",[830,831,832],"a",{"href":57},"boundary\naxis"," still applies to the entity's own fields.",[672,835,837],{"id":836},"what-it-is-not","What it is not",[839,840,841,859,873,883],"ul",{},[842,843,844,847,848,851,852,855,856,432],"li",{},[200,845,846],{},"Not a serializer."," What may leave at all is the ",[212,849,850],{},"boundary"," axis; what a given\naudience sees is a ",[830,853,854],{"href":61},"view",". A presenter only ",[200,857,858],{},"adds",[842,860,861,864,865,868,869,432],{},[200,862,863],{},"Not a place for business rules."," A computed field is a read. A transition\n(",[212,866,867],{},"publish",") is ",[830,870,872],{"href":871},"\u002Fdocs\u002Fbusiness\u002Fhandlers#a-state-changes-through-an-operation-never-through-a-field-write","an operation, not a field\nwrite",[842,874,875,878,879,882],{},[200,876,877],{},"Not automatically optimized."," A method receives the whole page, which allows reads\nto be batched. Calling ",[212,880,881],{},"findById"," in each iteration still produces N reads.",[842,884,885,888,889,892],{},[200,886,887],{},"No silent failures."," An error in a computed field produces ",[212,890,891],{},"INTERNAL_ERROR"," and names\nthe affected field.",[196,894,895,896,898],{},"Next: ",[830,897,93],{"href":94}," — resolving parameters by type.",[900,901,902],"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":210,"searchDepth":262,"depth":262,"links":904},[905,906,907,908],{"id":674,"depth":262,"text":675},{"id":697,"depth":262,"text":698},{"id":788,"depth":262,"text":789},{"id":836,"depth":262,"text":837},"Add computed fields to entity outputs with dependency injection and batch processing.","md",{},{"title":89,"description":909},"CQN38PNnfweoqBIVWPAUtmTJk3N4VXThgdHVPbfkE_w",1788560230292]