[{"data":1,"prerenderedAt":1227},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fdata\u002Fcomputed-field":6,"docs-uses":918,"docs-nav":1089},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":906,"extension":907,"forms":908,"kind":909,"meta":910,"navigation":121,"path":911,"seo":912,"stem":913,"step":914,"uses":915,"__hash__":917},"docs\u002Fdocs\u002F3.data\u002F3.computed-field.md","A computed field",{"type":10,"value":11,"toc":899},"minimark",[12,21,477,492,497,508,661,668,672,685,692,696,711,721,785,789,792,828,836,840,895],[13,14,15,16,20],"p",{},"A computed field is added to every answer without being stored: an excerpt cut from the body, an\nauthor's name read from another entity. A ",[17,18,19],"strong",{},"presenter"," computes them — one method per field. Each\nmethod receives the whole page of rows and returns one value per row, so a read can be done once for\nthe page.",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","import { Present, type Repository } from '@fougere\u002Fcore';\nimport Post from '..\u002Fentities\u002FPost.js';\nimport Author from '..\u002Fentities\u002FAuthor.js';\n\nexport default class PostPresenter extends Present\u003CPost> {\n  constructor(private authors: Repository\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","",[29,30,31,77,97,116,123,157,202,207,238,298,304,309,316,351,408,466,471],"code",{"__ignoreMap":27},[32,33,36,40,44,48,51,54,57,60,63,67,71,74],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"sK6XW","import",[32,41,43],{"class":42},"s15xx"," {",[32,45,47],{"class":46},"sPEhv"," Present",[32,49,50],{"class":42},",",[32,52,53],{"class":38}," type",[32,55,56],{"class":46}," Repository",[32,58,59],{"class":42}," }",[32,61,62],{"class":38}," from",[32,64,66],{"class":65},"sDDC1"," '",[32,68,70],{"class":69},"sN-8n","@fougere\u002Fcore",[32,72,73],{"class":65},"'",[32,75,76],{"class":42},";\n",[32,78,80,82,85,88,90,93,95],{"class":34,"line":79},2,[32,81,39],{"class":38},[32,83,84],{"class":46}," Post ",[32,86,87],{"class":38},"from",[32,89,66],{"class":65},[32,91,92],{"class":69},"..\u002Fentities\u002FPost.js",[32,94,73],{"class":65},[32,96,76],{"class":42},[32,98,100,102,105,107,109,112,114],{"class":34,"line":99},3,[32,101,39],{"class":38},[32,103,104],{"class":46}," Author ",[32,106,87],{"class":38},[32,108,66],{"class":65},[32,110,111],{"class":69},"..\u002Fentities\u002FAuthor.js",[32,113,73],{"class":65},[32,115,76],{"class":42},[32,117,119],{"class":34,"line":118},4,[32,120,122],{"emptyLinePlaceholder":121},true,"\n",[32,124,126,129,132,136,140,143,145,148,151,154],{"class":34,"line":125},5,[32,127,128],{"class":38},"export",[32,130,131],{"class":38}," default",[32,133,135],{"class":134},"s76I7"," class",[32,137,139],{"class":138},"sBZYL"," PostPresenter",[32,141,142],{"class":134}," extends",[32,144,47],{"class":138},[32,146,147],{"class":42},"\u003C",[32,149,150],{"class":138},"Post",[32,152,153],{"class":42},">",[32,155,156],{"class":42}," {\n",[32,158,160,163,166,169,173,176,178,180,183,186,188,192,196,199],{"class":34,"line":159},6,[32,161,162],{"class":134},"  constructor",[32,164,165],{"class":42},"(",[32,167,168],{"class":134},"private",[32,170,172],{"class":171},"shDUQ"," authors",[32,174,175],{"class":42},":",[32,177,56],{"class":138},[32,179,147],{"class":42},[32,181,182],{"class":138},"Author",[32,184,185],{"class":42},">)",[32,187,43],{"class":42},[32,189,191],{"class":190},"sTljH"," super",[32,193,195],{"class":194},"spAFX","()",[32,197,198],{"class":42},";",[32,200,201],{"class":42}," }\n",[32,203,205],{"class":34,"line":204},7,[32,206,122],{"emptyLinePlaceholder":121},[32,208,210,214,216,219,221,224,228,231,234,236],{"class":34,"line":209},8,[32,211,213],{"class":212},"shDkW","  excerpt",[32,215,165],{"class":42},[32,217,218],{"class":171},"posts",[32,220,175],{"class":42},[32,222,223],{"class":138}," Post",[32,225,227],{"class":226},"srlTG","[]",[32,229,230],{"class":42},"):",[32,232,233],{"class":138}," string",[32,235,227],{"class":226},[32,237,156],{"class":42},[32,239,241,244,247,250,254,256,258,261,264,268,271,273,277,279,282,284,288,290,293,296],{"class":34,"line":240},9,[32,242,243],{"class":38},"    return",[32,245,246],{"class":46}," posts",[32,248,249],{"class":42},".",[32,251,253],{"class":252},"s4mR9","map",[32,255,165],{"class":194},[32,257,165],{"class":42},[32,259,260],{"class":171},"post",[32,262,263],{"class":42},")",[32,265,267],{"class":266},"scTuO"," =>",[32,269,270],{"class":46}," post",[32,272,249],{"class":42},[32,274,276],{"class":275},"sy9f4","body",[32,278,249],{"class":42},[32,280,281],{"class":252},"slice",[32,283,165],{"class":194},[32,285,287],{"class":286},"s3dPA","0",[32,289,50],{"class":42},[32,291,292],{"class":286}," 200",[32,294,295],{"class":194},"))",[32,297,76],{"class":42},[32,299,301],{"class":34,"line":300},10,[32,302,303],{"class":42},"  }\n",[32,305,307],{"class":34,"line":306},11,[32,308,122],{"emptyLinePlaceholder":121},[32,310,312],{"class":34,"line":311},12,[32,313,315],{"class":314},"skXKP","  \u002F** One read for the page, not one per row — which is why the page is the argument. *\u002F\n",[32,317,319,322,325,327,329,331,333,335,337,340,342,345,347,349],{"class":34,"line":318},13,[32,320,321],{"class":134},"  async",[32,323,324],{"class":212}," authorName",[32,326,165],{"class":42},[32,328,218],{"class":171},[32,330,175],{"class":42},[32,332,223],{"class":138},[32,334,227],{"class":226},[32,336,230],{"class":42},[32,338,339],{"class":138}," Promise",[32,341,147],{"class":42},[32,343,344],{"class":138},"string",[32,346,227],{"class":226},[32,348,153],{"class":42},[32,350,156],{"class":42},[32,352,354,357,359,362,365,369,371,374,376,379,381,383,385,387,389,391,393,395,397,399,401,404,406],{"class":34,"line":353},14,[32,355,356],{"class":134},"    const",[32,358,172],{"class":46},[32,360,361],{"class":42}," =",[32,363,364],{"class":38}," await",[32,366,368],{"class":367},"sxG60"," this",[32,370,249],{"class":42},[32,372,373],{"class":275},"authors",[32,375,249],{"class":42},[32,377,378],{"class":252},"findByKeys",[32,380,165],{"class":194},[32,382,218],{"class":46},[32,384,249],{"class":42},[32,386,253],{"class":252},[32,388,165],{"class":194},[32,390,165],{"class":42},[32,392,260],{"class":171},[32,394,263],{"class":42},[32,396,267],{"class":266},[32,398,270],{"class":46},[32,400,249],{"class":42},[32,402,403],{"class":275},"authorId",[32,405,295],{"class":194},[32,407,76],{"class":42},[32,409,411,413,415,417,419,421,423,425,427,429,431,433,436,438,440,442,444,446,449,452,455,457,460,462,464],{"class":34,"line":410},15,[32,412,243],{"class":38},[32,414,246],{"class":46},[32,416,249],{"class":42},[32,418,253],{"class":252},[32,420,165],{"class":194},[32,422,165],{"class":42},[32,424,260],{"class":171},[32,426,263],{"class":42},[32,428,267],{"class":266},[32,430,172],{"class":46},[32,432,249],{"class":42},[32,434,435],{"class":252},"get",[32,437,165],{"class":194},[32,439,260],{"class":46},[32,441,249],{"class":42},[32,443,403],{"class":275},[32,445,263],{"class":194},[32,447,448],{"class":42},"?.",[32,450,451],{"class":275},"name",[32,453,454],{"class":42}," ??",[32,456,66],{"class":65},[32,458,459],{"class":69},"Anonymous",[32,461,73],{"class":65},[32,463,263],{"class":194},[32,465,76],{"class":42},[32,467,469],{"class":34,"line":468},16,[32,470,303],{"class":42},[32,472,474],{"class":34,"line":473},17,[32,475,476],{"class":42},"}\n",[13,478,479,480,483,484,487,488,491],{},"Place the class in the frond's ",[29,481,482],{},"services\u002F"," directory, where ",[29,485,486],{},"extends Present\u003CPost>"," says what it\nis. It answers ",[29,489,490],{},"Present\u003CPost>",". Methods may be synchronous or asynchronous, and constructor dependencies\nare resolved by type.",[493,494,496],"h2",{"id":495},"a-link-adds-fields-of-its-own","A link adds fields of its own",[13,498,499,501,502,507],{},[29,500,490],{}," is a ",[503,504,506],"a",{"href":505},"\u002Fdocs\u002Fconcepts\u002Fport","port"," too. A link in front of the presenter adds its\nmethods as fields, and the answer carries the fields of the whole chain — on REST, on GraphQL, and\nfor every audience:",[22,509,511],{"className":24,"code":510,"language":26,"meta":27,"style":27},"export default class Badges implements Partial\u003CPresent\u003CPost>> {\n  constructor(private inner: Present\u003CPost>) {}\n\n  isNew(posts: Post[]): boolean[] {\n    return posts.map((post) => Date.now() - post.publishedAt.getTime() \u003C 86_400_000);\n  }\n}\n",[29,512,513,544,568,572,596,653,657],{"__ignoreMap":27},[32,514,515,517,519,521,524,527,530,532,535,537,539,542],{"class":34,"line":35},[32,516,128],{"class":38},[32,518,131],{"class":38},[32,520,135],{"class":134},[32,522,523],{"class":138}," Badges",[32,525,526],{"class":134}," implements",[32,528,529],{"class":138}," Partial",[32,531,147],{"class":42},[32,533,534],{"class":138},"Present",[32,536,147],{"class":42},[32,538,150],{"class":138},[32,540,541],{"class":42},">>",[32,543,156],{"class":42},[32,545,546,548,550,552,555,557,559,561,563,565],{"class":34,"line":79},[32,547,162],{"class":134},[32,549,165],{"class":42},[32,551,168],{"class":134},[32,553,554],{"class":171}," inner",[32,556,175],{"class":42},[32,558,47],{"class":138},[32,560,147],{"class":42},[32,562,150],{"class":138},[32,564,185],{"class":42},[32,566,567],{"class":42}," {}\n",[32,569,570],{"class":34,"line":99},[32,571,122],{"emptyLinePlaceholder":121},[32,573,574,577,579,581,583,585,587,589,592,594],{"class":34,"line":118},[32,575,576],{"class":212},"  isNew",[32,578,165],{"class":42},[32,580,218],{"class":171},[32,582,175],{"class":42},[32,584,223],{"class":138},[32,586,227],{"class":226},[32,588,230],{"class":42},[32,590,591],{"class":138}," boolean",[32,593,227],{"class":226},[32,595,156],{"class":42},[32,597,598,600,602,604,606,608,610,612,614,616,619,621,624,626,629,631,633,636,638,641,643,646,649,651],{"class":34,"line":125},[32,599,243],{"class":38},[32,601,246],{"class":46},[32,603,249],{"class":42},[32,605,253],{"class":252},[32,607,165],{"class":194},[32,609,165],{"class":42},[32,611,260],{"class":171},[32,613,263],{"class":42},[32,615,267],{"class":266},[32,617,618],{"class":46}," Date",[32,620,249],{"class":42},[32,622,623],{"class":252},"now",[32,625,195],{"class":194},[32,627,628],{"class":42}," -",[32,630,270],{"class":46},[32,632,249],{"class":42},[32,634,635],{"class":275},"publishedAt",[32,637,249],{"class":42},[32,639,640],{"class":252},"getTime",[32,642,195],{"class":194},[32,644,645],{"class":42}," \u003C",[32,647,648],{"class":286}," 86_400_000",[32,650,263],{"class":194},[32,652,76],{"class":42},[32,654,655],{"class":34,"line":159},[32,656,303],{"class":42},[32,658,659],{"class":34,"line":204},[32,660,476],{"class":42},[13,662,663,664,667],{},"A field two classes of one chain compute refuses the boot, naming the field and both classes. Two\nlinks are ordered by ",[29,665,666],{},"ports: { 'Present\u003CPost>': ['Badges', 'Stamps'] }",", outside in.",[493,669,671],{"id":670},"why-it-is-not-a-field-on-the-entity","Why it is not a field on the entity",[13,673,674,677,678,680,681,684],{},[29,675,676],{},"excerpt"," is computed from ",[29,679,276],{}," and does not need to be stored. ",[29,682,683],{},"authorName"," comes from\nanother entity; computing it at read time avoids duplicating the value when an author is\nrenamed.",[13,686,687,688,691],{},"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 ",[29,689,690],{},"Storage"," injection is\nrefused at boot, just as it is for handlers and collectors.",[493,693,695],{"id":694},"everywhere-a-reader-goes-through-a-door","Everywhere a reader goes through a door",[13,697,698,699,702,703,706,707,710],{},"A computed field is added to the entity's output on every door: a page (",[29,700,701],{},"useQuery",", ",[29,704,705],{},"useCommand",",\n",[29,708,709],{},"invoke","), REST and GraphQL. There is nothing else to configure.",[13,712,713,714,720],{},"A handler calling another frond through ",[503,715,717],{"href":716},"\u002Fdocs\u002Fconcepts\u002Ffacade",[29,718,719],{},"Facade\u003CT>","\ndoes not get it: code receives the rows the handler returned, and a computed field is for\nwhoever reads through a door.",[22,722,724],{"className":24,"code":723,"language":26,"meta":27,"style":27},"const { items } = await useQuery(post, 'list');\nitems[0].excerpt;      \u002F\u002F ← present, exactly as in a GraphQL query\n",[29,725,726,763],{"__ignoreMap":27},[32,727,728,731,733,736,739,741,743,746,748,750,752,754,757,759,761],{"class":34,"line":35},[32,729,730],{"class":134},"const",[32,732,43],{"class":42},[32,734,735],{"class":46}," items ",[32,737,738],{"class":42},"}",[32,740,361],{"class":42},[32,742,364],{"class":38},[32,744,745],{"class":252}," useQuery",[32,747,165],{"class":226},[32,749,260],{"class":46},[32,751,50],{"class":42},[32,753,66],{"class":65},[32,755,756],{"class":69},"list",[32,758,73],{"class":65},[32,760,263],{"class":226},[32,762,76],{"class":42},[32,764,765,768,771,773,776,778,780,782],{"class":34,"line":79},[32,766,767],{"class":46},"items",[32,769,770],{"class":226},"[",[32,772,287],{"class":286},[32,774,775],{"class":226},"]",[32,777,249],{"class":42},[32,779,676],{"class":275},[32,781,198],{"class":42},[32,783,784],{"class":314},"      \u002F\u002F ← present, exactly as in a GraphQL query\n",[493,786,788],{"id":787},"where-it-stops-a-named-view","Where it stops: a named view",[13,790,791],{},"When an operation names an output view, only fields in that view are returned. A computed\nfield not listed there is excluded:",[22,793,795],{"className":24,"code":794,"language":26,"meta":27,"style":27},"async cards(): Promise\u003CPage\u003CPostCard>>   \u002F\u002F emits PostCard, and only PostCard\n",[29,796,797],{"__ignoreMap":27},[32,798,799,802,805,807,810,813,815,818,820,823,825],{"class":34,"line":35},[32,800,801],{"class":46},"async ",[32,803,804],{"class":252},"cards",[32,806,195],{"class":226},[32,808,809],{"class":46},": ",[32,811,812],{"class":138},"Promise",[32,814,147],{"class":42},[32,816,817],{"class":46},"Page",[32,819,147],{"class":42},[32,821,822],{"class":46},"PostCard",[32,824,541],{"class":42},[32,826,827],{"class":314},"   \u002F\u002F emits PostCard, and only PostCard\n",[13,829,830,831,835],{},"Without a named view, computed fields are added to the entity's output. The ",[503,832,834],{"href":833},"\u002Fdocs\u002Fconcepts\u002Fentity","boundary\naxis"," still applies to the entity's own fields.",[493,837,839],{"id":838},"what-it-is-not","What it is not",[841,842,843,861,875,885],"ul",{},[844,845,846,849,850,853,854,857,858,249],"li",{},[17,847,848],{},"Not a serializer."," What may leave at all is the ",[29,851,852],{},"boundary"," axis; what a given\naudience sees is a ",[503,855,856],{"href":833},"view",". A presenter only ",[17,859,860],{},"adds",[844,862,863,866,867,870,871,249],{},[17,864,865],{},"Not a place for business rules."," A computed field is a read. A transition\n(",[29,868,869],{},"publish",") is ",[503,872,874],{"href":873},"\u002Fdocs\u002Fconcepts\u002Fhandler#a-state-changes-through-an-operation","an operation, not a field\nwrite",[844,876,877,880,881,884],{},[17,878,879],{},"Not automatically optimized."," A method receives the whole page, which allows reads\nto be batched. Calling ",[29,882,883],{},"findById"," in each iteration still produces N reads.",[844,886,887,890,891,894],{},[17,888,889],{},"No silent failures."," An error in a computed field produces ",[29,892,893],{},"INTERNAL_ERROR"," and names\nthe affected field.",[896,897,898],"style",{},"html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .sBZYL, html code.shiki .sBZYL{--shiki-light:#E2931D;--shiki-default:#EFCD8F;--shiki-dark:#FFCB6B}html pre.shiki code .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sTljH, html code.shiki .sTljH{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#8FCF86;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:inherit}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .shDkW, html code.shiki .shDkW{--shiki-light:#E53935;--shiki-default:#C9B6EA;--shiki-dark:#F07178}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .s3dPA, html code.shiki .s3dPA{--shiki-light:#F76D47;--shiki-default:#EE9F6B;--shiki-dark:#F78C6C}html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sxG60, html code.shiki .sxG60{--shiki-light:#39ADB5;--shiki-light-font-style:inherit;--shiki-default:#8FCF86;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:inherit}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":27,"searchDepth":79,"depth":79,"links":900},[901,902,903,904,905],{"id":495,"depth":79,"text":496},{"id":670,"depth":79,"text":671},{"id":694,"depth":79,"text":695},{"id":787,"depth":79,"text":788},{"id":838,"depth":79,"text":839},"Fields computed over a page of answers, never stored.","md",[490],"task",{},"\u002Fdocs\u002Fdata\u002Fcomputed-field",{"title":8,"description":906},"docs\u002F3.data\u002F3.computed-field",null,[916,506],"entity","2UxMejQIWKc6Qpdx3ltYFUh25xyRrDvVjbETYXjmk3Q",[919,921,924,927,930,932,935,937,940,945,951,955,959,961,965,969,973,978,982,986,991,995,1000,1004,1008,1012,1016,1020,1024,1028,1032,1036,1040,1044,1048,1052,1056,1059,1062,1065,1068,1071,1074,1077,1080,1083,1086],{"path":833,"title":920,"uses":914},"Entity",{"path":922,"title":923,"uses":914},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":925,"title":926,"uses":914},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":928,"title":929,"uses":914},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":716,"title":931,"uses":914},"Facade",{"path":933,"title":934,"uses":914},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":505,"title":936,"uses":914},"Port",{"path":938,"title":939,"uses":914},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":941,"title":942,"uses":943},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[506,944],"frond",{"path":946,"title":947,"uses":948},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[949,950],"configuration","handler",{"path":952,"title":953,"uses":954},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[916,949],{"path":956,"title":957,"uses":958},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[949,916],{"path":911,"title":8,"uses":960},[916,506],{"path":962,"title":963,"uses":964},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[916],{"path":966,"title":967,"uses":968},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[916],{"path":970,"title":971,"uses":972},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[916,949],{"path":974,"title":975,"uses":976},"\u002Fdocs\u002Fdata\u002Fmirror","Mirror a source you cannot query",[977],"repository",{"path":979,"title":980,"uses":981},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[977],{"path":983,"title":984,"uses":985},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[506,944],{"path":987,"title":988,"uses":989},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[990],"fact",{"path":992,"title":993,"uses":994},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST, OpenAPI, GraphQL",[950,949],{"path":996,"title":997,"uses":998},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[950,999],"facade",{"path":1001,"title":1002,"uses":1003},"\u002Fdocs\u002Fserve\u002Fforms","A form",[916],{"path":1005,"title":1006,"uses":1007},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[950],{"path":1009,"title":1010,"uses":1011},"\u002Fdocs\u002Frun\u002Fdeploy","Deploy a split",[949,944],{"path":1013,"title":1014,"uses":1015},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[949,944],{"path":1017,"title":1018,"uses":1019},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[949],{"path":1021,"title":1022,"uses":1023},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[949,950],{"path":1025,"title":1026,"uses":1027},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[950],{"path":1029,"title":1030,"uses":1031},"\u002Fdocs\u002Frun\u002Ftest","Test",[916,506],{"path":1033,"title":1034,"uses":1035},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[944,949],{"path":1037,"title":1038,"uses":1039},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Add Fougere to an existing app",[944,949],{"path":1041,"title":1042,"uses":1043},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[916],{"path":1045,"title":1046,"uses":1047},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[949],{"path":1049,"title":1050,"uses":1051},"\u002Fdocs\u002Fadopt\u002Fanother-repository","A frond from another repository",[999,944],{"path":1053,"title":1054,"uses":1055},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":1057,"title":1058,"uses":914},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":1060,"title":1061,"uses":914},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":1063,"title":1064,"uses":914},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":1066,"title":1067,"uses":914},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","The card and the wire",{"path":1069,"title":1070,"uses":914},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":1072,"title":1073,"uses":914},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":1075,"title":1076,"uses":914},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":1078,"title":1079,"uses":914},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":1081,"title":1082,"uses":914},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":1084,"title":1085,"uses":914},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":1087,"title":1088,"uses":914},"\u002Fdocs","What is Fougere",[1090],{"title":1091,"path":1087,"stem":1092,"children":1093,"page":-1},"Docs","docs",[1094,1096,1117,1126,1146,1155,1168,1185,1202],{"title":1088,"path":1087,"stem":1095},"docs\u002Findex",{"title":1097,"path":1098,"stem":1099,"children":1100,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[1101,1103,1105,1107,1109,1111,1113,1115],{"title":920,"path":833,"stem":1102},"docs\u002F1.concepts\u002F1.entity",{"title":923,"path":922,"stem":1104},"docs\u002F1.concepts\u002F2.handler",{"title":926,"path":925,"stem":1106},"docs\u002F1.concepts\u002F3.repository",{"title":929,"path":928,"stem":1108},"docs\u002F1.concepts\u002F4.frond",{"title":931,"path":716,"stem":1110},"docs\u002F1.concepts\u002F5.facade",{"title":934,"path":933,"stem":1112},"docs\u002F1.concepts\u002F6.fact",{"title":936,"path":505,"stem":1114},"docs\u002F1.concepts\u002F7.port",{"title":939,"path":938,"stem":1116},"docs\u002F1.concepts\u002F8.configuration",{"title":1118,"path":1119,"stem":1120,"children":1121,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[1122,1124],{"title":942,"path":941,"stem":1123},"docs\u002F2.access\u002F1.authentication",{"title":947,"path":946,"stem":1125},"docs\u002F2.access\u002F2.state",{"title":1127,"path":1128,"stem":1129,"children":1130,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[1131,1133,1135,1136,1138,1140,1142,1144],{"title":953,"path":952,"stem":1132},"docs\u002F3.data\u002F1.sql",{"title":957,"path":956,"stem":1134},"docs\u002F3.data\u002F2.several-databases",{"title":8,"path":911,"stem":913},{"title":963,"path":962,"stem":1137},"docs\u002F3.data\u002F4.evolve",{"title":967,"path":966,"stem":1139},"docs\u002F3.data\u002F5.seeds",{"title":971,"path":970,"stem":1141},"docs\u002F3.data\u002F6.values",{"title":975,"path":974,"stem":1143},"docs\u002F3.data\u002F7.mirror",{"title":980,"path":979,"stem":1145},"docs\u002F3.data\u002F8.together",{"title":1147,"path":1148,"stem":1149,"children":1150,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[1151,1153],{"title":984,"path":983,"stem":1152},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":988,"path":987,"stem":1154},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":1156,"path":1157,"stem":1158,"children":1159,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[1160,1162,1164,1166],{"title":993,"path":992,"stem":1161},"docs\u002F5.serve\u002F1.rest-graphql",{"title":997,"path":996,"stem":1163},"docs\u002F5.serve\u002F2.pages",{"title":1002,"path":1001,"stem":1165},"docs\u002F5.serve\u002F3.forms",{"title":1006,"path":1005,"stem":1167},"docs\u002F5.serve\u002F4.admin",{"title":1169,"path":1170,"stem":1171,"children":1172,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[1173,1175,1177,1179,1181,1183],{"title":1010,"path":1009,"stem":1174},"docs\u002F6.run\u002F1.deploy",{"title":1014,"path":1013,"stem":1176},"docs\u002F6.run\u002F2.secure",{"title":1018,"path":1017,"stem":1178},"docs\u002F6.run\u002F3.lifecycle",{"title":1022,"path":1021,"stem":1180},"docs\u002F6.run\u002F4.observe",{"title":1026,"path":1025,"stem":1182},"docs\u002F6.run\u002F5.dev-panel",{"title":1030,"path":1029,"stem":1184},"docs\u002F6.run\u002F6.test",{"title":1186,"path":1187,"stem":1188,"children":1189,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[1190,1192,1194,1196,1198,1200],{"title":1034,"path":1033,"stem":1191},"docs\u002F7.adopt\u002F1.new-project",{"title":1038,"path":1037,"stem":1193},"docs\u002F7.adopt\u002F2.existing-app",{"title":1042,"path":1041,"stem":1195},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":1046,"path":1045,"stem":1197},"docs\u002F7.adopt\u002F4.hosts",{"title":1050,"path":1049,"stem":1199},"docs\u002F7.adopt\u002F5.another-repository",{"title":1054,"path":1053,"stem":1201},"docs\u002F7.adopt\u002F6.demos",{"title":1203,"path":1204,"stem":1205,"children":1206,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[1207,1209,1211,1213,1215,1217,1219,1221,1223,1225],{"title":1058,"path":1057,"stem":1208},"docs\u002F8.extending\u002F1.scan",{"title":1061,"path":1060,"stem":1210},"docs\u002F8.extending\u002F10.without-compiler",{"title":1064,"path":1063,"stem":1212},"docs\u002F8.extending\u002F2.boot",{"title":1067,"path":1066,"stem":1214},"docs\u002F8.extending\u002F3.card-and-wire",{"title":1070,"path":1069,"stem":1216},"docs\u002F8.extending\u002F4.extension-points",{"title":1073,"path":1072,"stem":1218},"docs\u002F8.extending\u002F5.vocabulary",{"title":1076,"path":1075,"stem":1220},"docs\u002F8.extending\u002F6.extensions",{"title":1079,"path":1078,"stem":1222},"docs\u002F8.extending\u002F7.source-adapter",{"title":1082,"path":1081,"stem":1224},"docs\u002F8.extending\u002F8.surface",{"title":1085,"path":1084,"stem":1226},"docs\u002F8.extending\u002F9.foreign-frond",1794396613807]