[{"data":1,"prerenderedAt":1055},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fextending\u002Fsurface":6,"docs-uses":742,"docs-nav":917},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":733,"extension":734,"forms":735,"kind":736,"meta":737,"navigation":89,"path":738,"seo":739,"stem":740,"step":735,"uses":735,"__hash__":741},"docs\u002Fdocs\u002F8.extending\u002F8.surface.md","Write a surface",{"type":10,"value":11,"toc":730},"minimark",[12,16,21,29,607,666,669,717,726],[13,14,15],"p",{},"REST, GraphQL, the call envelope and the terminal are four doors onto the same operations. A surface\nof your own — a webhook, a feed — is one more door, written the same way.",[17,18,20],"h2",{"id":19},"a-door","A door",[13,22,23,24,28],{},"A door says how a request becomes calls, and how their outcome becomes an answer — in its own terms.\nCore runs every door through one cycle, ",[25,26,27],"code",{},"app.answer(door, received)",":",[30,31,36],"pre",{"className":32,"code":33,"language":34,"meta":35,"style":35},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","import { createAppRunner, type Door } from '@fougere\u002Fcore';\n\n\u002F** A payment provider's webhook: one POST, one call. *\u002F\nconst webhook: Door\u003CRequest, { id: string; status: string }, Response> = {\n  name: 'webhook',\n  async decode(request) {\n    const event = await request.json();\n    return { id: event.data.id, status: event.type };\n  },\n  run: ({ id, status }) => call({ address: 'order', op: 'settle' },\n    { params: { id }, query: {}, input: { status }, state: {} }),\n  encode(outcome) {\n    return 'refused' in outcome\n      ? Response.json({ error: outcome.refused.code }, { status: 400 })\n      : new Response(null, { status: 204 });\n  },\n};\n\nconst call = createAppRunner(app);\nhono.post('\u002Fhooks\u002Fpsp', (c) => app.answer(webhook, c.req.raw));\n","ts","",[25,37,38,84,91,98,157,175,197,227,268,274,336,389,404,422,471,505,510,516,521,543],{"__ignoreMap":35},[39,40,43,47,51,55,58,61,64,67,70,74,78,81],"span",{"class":41,"line":42},"line",1,[39,44,46],{"class":45},"sK6XW","import",[39,48,50],{"class":49},"s15xx"," {",[39,52,54],{"class":53},"sPEhv"," createAppRunner",[39,56,57],{"class":49},",",[39,59,60],{"class":45}," type",[39,62,63],{"class":53}," Door",[39,65,66],{"class":49}," }",[39,68,69],{"class":45}," from",[39,71,73],{"class":72},"sDDC1"," '",[39,75,77],{"class":76},"sN-8n","@fougere\u002Fcore",[39,79,80],{"class":72},"'",[39,82,83],{"class":49},";\n",[39,85,87],{"class":41,"line":86},2,[39,88,90],{"emptyLinePlaceholder":89},true,"\n",[39,92,94],{"class":41,"line":93},3,[39,95,97],{"class":96},"skXKP","\u002F** A payment provider's webhook: one POST, one call. *\u002F\n",[39,99,101,105,108,110,113,116,119,121,123,127,129,132,135,138,140,142,145,148,151,154],{"class":41,"line":100},4,[39,102,104],{"class":103},"s76I7","const",[39,106,107],{"class":53}," webhook",[39,109,28],{"class":49},[39,111,63],{"class":112},"sBZYL",[39,114,115],{"class":49},"\u003C",[39,117,118],{"class":112},"Request",[39,120,57],{"class":49},[39,122,50],{"class":49},[39,124,126],{"class":125},"sHtqg"," id",[39,128,28],{"class":49},[39,130,131],{"class":112}," string",[39,133,134],{"class":49},";",[39,136,137],{"class":125}," status",[39,139,28],{"class":49},[39,141,131],{"class":112},[39,143,144],{"class":49}," },",[39,146,147],{"class":112}," Response",[39,149,150],{"class":49},">",[39,152,153],{"class":49}," =",[39,155,156],{"class":49}," {\n",[39,158,160,163,165,167,170,172],{"class":41,"line":159},5,[39,161,162],{"class":125},"  name",[39,164,28],{"class":49},[39,166,73],{"class":72},[39,168,169],{"class":76},"webhook",[39,171,80],{"class":72},[39,173,174],{"class":49},",\n",[39,176,178,181,185,188,192,195],{"class":41,"line":177},6,[39,179,180],{"class":103},"  async",[39,182,184],{"class":183},"shDkW"," decode",[39,186,187],{"class":49},"(",[39,189,191],{"class":190},"shDUQ","request",[39,193,194],{"class":49},")",[39,196,156],{"class":49},[39,198,200,203,206,208,211,214,217,221,225],{"class":41,"line":199},7,[39,201,202],{"class":103},"    const",[39,204,205],{"class":53}," event",[39,207,153],{"class":49},[39,209,210],{"class":45}," await",[39,212,213],{"class":53}," request",[39,215,216],{"class":49},".",[39,218,220],{"class":219},"s4mR9","json",[39,222,224],{"class":223},"spAFX","()",[39,226,83],{"class":49},[39,228,230,233,235,237,239,241,243,247,249,252,254,256,258,260,262,265],{"class":41,"line":229},8,[39,231,232],{"class":45},"    return",[39,234,50],{"class":49},[39,236,126],{"class":125},[39,238,28],{"class":49},[39,240,205],{"class":53},[39,242,216],{"class":49},[39,244,246],{"class":245},"sy9f4","data",[39,248,216],{"class":49},[39,250,251],{"class":245},"id",[39,253,57],{"class":49},[39,255,137],{"class":125},[39,257,28],{"class":49},[39,259,205],{"class":53},[39,261,216],{"class":49},[39,263,264],{"class":245},"type",[39,266,267],{"class":49}," };\n",[39,269,271],{"class":41,"line":270},9,[39,272,273],{"class":49},"  },\n",[39,275,277,280,282,285,287,289,291,294,298,301,304,307,310,312,314,317,319,321,324,326,328,331,333],{"class":41,"line":276},10,[39,278,279],{"class":219},"  run",[39,281,28],{"class":49},[39,283,284],{"class":49}," ({",[39,286,126],{"class":190},[39,288,57],{"class":49},[39,290,137],{"class":190},[39,292,293],{"class":49}," })",[39,295,297],{"class":296},"scTuO"," =>",[39,299,300],{"class":219}," call",[39,302,187],{"class":303},"srlTG",[39,305,306],{"class":49},"{",[39,308,309],{"class":125}," address",[39,311,28],{"class":49},[39,313,73],{"class":72},[39,315,316],{"class":76},"order",[39,318,80],{"class":72},[39,320,57],{"class":49},[39,322,323],{"class":125}," op",[39,325,28],{"class":49},[39,327,73],{"class":72},[39,329,330],{"class":76},"settle",[39,332,80],{"class":72},[39,334,335],{"class":49}," },\n",[39,337,339,342,345,347,349,352,355,358,360,363,366,368,370,373,375,378,380,383,385,387],{"class":41,"line":338},11,[39,340,341],{"class":49},"    {",[39,343,344],{"class":125}," params",[39,346,28],{"class":49},[39,348,50],{"class":49},[39,350,351],{"class":53}," id ",[39,353,354],{"class":49},"},",[39,356,357],{"class":125}," query",[39,359,28],{"class":49},[39,361,362],{"class":49}," {},",[39,364,365],{"class":125}," input",[39,367,28],{"class":49},[39,369,50],{"class":49},[39,371,372],{"class":53}," status ",[39,374,354],{"class":49},[39,376,377],{"class":125}," state",[39,379,28],{"class":49},[39,381,382],{"class":49}," {}",[39,384,66],{"class":49},[39,386,194],{"class":303},[39,388,174],{"class":49},[39,390,392,395,397,400,402],{"class":41,"line":391},12,[39,393,394],{"class":183},"  encode",[39,396,187],{"class":49},[39,398,399],{"class":190},"outcome",[39,401,194],{"class":49},[39,403,156],{"class":49},[39,405,407,409,411,414,416,419],{"class":41,"line":406},13,[39,408,232],{"class":45},[39,410,73],{"class":72},[39,412,413],{"class":76},"refused",[39,415,80],{"class":72},[39,417,418],{"class":49}," in",[39,420,421],{"class":53}," outcome\n",[39,423,425,428,430,432,434,436,438,441,443,446,448,450,452,454,456,458,460,462,466,468],{"class":41,"line":424},14,[39,426,427],{"class":49},"      ?",[39,429,147],{"class":53},[39,431,216],{"class":49},[39,433,220],{"class":219},[39,435,187],{"class":223},[39,437,306],{"class":49},[39,439,440],{"class":125}," error",[39,442,28],{"class":49},[39,444,445],{"class":53}," outcome",[39,447,216],{"class":49},[39,449,413],{"class":245},[39,451,216],{"class":49},[39,453,25],{"class":245},[39,455,144],{"class":49},[39,457,50],{"class":49},[39,459,137],{"class":125},[39,461,28],{"class":49},[39,463,465],{"class":464},"s3dPA"," 400",[39,467,66],{"class":49},[39,469,470],{"class":223},")\n",[39,472,474,477,480,483,485,488,490,492,494,496,499,501,503],{"class":41,"line":473},15,[39,475,476],{"class":49},"      :",[39,478,479],{"class":49}," new",[39,481,147],{"class":482},"sgjsB",[39,484,187],{"class":223},[39,486,487],{"class":72},"null",[39,489,57],{"class":49},[39,491,50],{"class":49},[39,493,137],{"class":125},[39,495,28],{"class":49},[39,497,498],{"class":464}," 204",[39,500,66],{"class":49},[39,502,194],{"class":223},[39,504,83],{"class":49},[39,506,508],{"class":41,"line":507},16,[39,509,273],{"class":49},[39,511,513],{"class":41,"line":512},17,[39,514,515],{"class":49},"};\n",[39,517,519],{"class":41,"line":518},18,[39,520,90],{"emptyLinePlaceholder":89},[39,522,524,526,529,532,534,536,539,541],{"class":41,"line":523},19,[39,525,104],{"class":103},[39,527,528],{"class":53}," call ",[39,530,531],{"class":49},"=",[39,533,54],{"class":219},[39,535,187],{"class":303},[39,537,538],{"class":53},"app",[39,540,194],{"class":303},[39,542,83],{"class":49},[39,544,546,549,551,554,556,558,561,563,565,568,571,573,575,578,580,583,585,587,589,592,594,597,599,602,605],{"class":41,"line":545},20,[39,547,548],{"class":53},"hono",[39,550,216],{"class":49},[39,552,553],{"class":219},"post",[39,555,187],{"class":303},[39,557,80],{"class":72},[39,559,560],{"class":76},"\u002Fhooks\u002Fpsp",[39,562,80],{"class":72},[39,564,57],{"class":49},[39,566,567],{"class":49}," (",[39,569,570],{"class":190},"c",[39,572,194],{"class":49},[39,574,297],{"class":296},[39,576,577],{"class":53}," app",[39,579,216],{"class":49},[39,581,582],{"class":219},"answer",[39,584,187],{"class":303},[39,586,169],{"class":53},[39,588,57],{"class":49},[39,590,591],{"class":53}," c",[39,593,216],{"class":49},[39,595,596],{"class":245},"req",[39,598,216],{"class":49},[39,600,601],{"class":245},"raw",[39,603,604],{"class":303},"))",[39,606,83],{"class":49},[608,609,610,621],"table",{},[611,612,613],"thead",{},[614,615,616,619],"tr",{},[617,618],"th",{},[617,620],{},[622,623,624,638,648],"tbody",{},[614,625,626,632],{},[627,628,629],"td",{},[25,630,631],{},"decode",[627,633,634,635],{},"turns what arrived into what the calls need — read within ",[25,636,637],{},"maxBodyBytes",[614,639,640,645],{},[627,641,642],{},[25,643,644],{},"run",[627,646,647],{},"makes the calls: one, or several for a request that asks for several things",[614,649,650,655],{},[627,651,652],{},[25,653,654],{},"encode",[627,656,657,658,661,662,665],{},"says the outcome — ",[25,659,660],{},"{ answered }"," or ",[25,663,664],{},"{ refused }"," — in the door's shape",[13,667,668],{},"What the cycle adds, the same for every door:",[670,671,672,676,693,706],"ul",{},[673,674,675],"li",{},"the request is entered, so every call it makes says which request it answers;",[673,677,678,681,682,681,685,688,689,692],{},[25,679,680],{},"received",", ",[25,683,684],{},"decoded",[25,686,687],{},"encoded"," and ",[25,690,691],{},"failed"," are announced to whoever observes the app, beside the calls;",[673,694,695,696,701,702,705],{},"the ",[697,698,700],"a",{"href":699},"\u002Fdocs\u002Faccess\u002Fstate","caller's state"," is read and written, when the door says what carries it (",[25,703,704],{},"carries",");",[673,707,708,709,712,713,716],{},"a refusal is made public by one rule before the door says it — an ",[25,710,711],{},"INTERNAL_ERROR"," never shows its\nmessage, unless the door is ",[25,714,715],{},"trusted"," (the terminal, whose caller is the operator).",[13,718,719,720,216],{},"Core names no door: the cycle is the same for one it has never heard of. A simpler bridge — parse,\ncall, format, outside any cycle — is ",[697,721,723],{"href":722},"\u002Fdocs\u002Fserve\u002Fpages#from-the-server-invoke",[25,724,725],{},"invoke",[727,728,729],"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 .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 .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 .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--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 .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 .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .scTuO, html code.shiki .scTuO{--shiki-light:#9C3EDA;--shiki-default:#A3B0A5;--shiki-dark:#C792EA}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--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 .sgjsB, html code.shiki .sgjsB{--shiki-light:#6182B8;--shiki-default:#EFCD8F;--shiki-dark:#82AAFF}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":35,"searchDepth":86,"depth":86,"links":731},[732],{"id":19,"depth":86,"text":20},"A door of your own: decode, run, encode.","md",null,"extending",{},"\u002Fdocs\u002Fextending\u002Fsurface",{"title":8,"description":733},"docs\u002F8.extending\u002F8.surface","jHQGtZUu9mHxlcmJvY9sP2Rxx3p2ZdN26TUp14KnJT8",[743,746,749,752,755,758,761,764,767,773,778,783,787,791,795,799,803,808,812,816,821,825,830,834,838,842,846,850,854,858,862,866,870,874,878,882,886,889,892,895,898,901,904,907,910,911,914],{"path":744,"title":745,"uses":735},"\u002Fdocs\u002Fconcepts\u002Fentity","Entity",{"path":747,"title":748,"uses":735},"\u002Fdocs\u002Fconcepts\u002Fhandler","Handler",{"path":750,"title":751,"uses":735},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":753,"title":754,"uses":735},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":756,"title":757,"uses":735},"\u002Fdocs\u002Fconcepts\u002Ffacade","Facade",{"path":759,"title":760,"uses":735},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":762,"title":763,"uses":735},"\u002Fdocs\u002Fconcepts\u002Fport","Port",{"path":765,"title":766,"uses":735},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":768,"title":769,"uses":770},"\u002Fdocs\u002Faccess\u002Fauthentication","Authentication",[771,772],"port","frond",{"path":699,"title":774,"uses":775},"Keep a caller's state",[776,777],"configuration","handler",{"path":779,"title":780,"uses":781},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[782,776],"entity",{"path":784,"title":785,"uses":786},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[776,782],{"path":788,"title":789,"uses":790},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[782,771],{"path":792,"title":793,"uses":794},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[782],{"path":796,"title":797,"uses":798},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[782],{"path":800,"title":801,"uses":802},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[782,776],{"path":804,"title":805,"uses":806},"\u002Fdocs\u002Fdata\u002Fmirror","Mirror a source you cannot query",[807],"repository",{"path":809,"title":810,"uses":811},"\u002Fdocs\u002Fdata\u002Ftogether","Two writes as one",[807],{"path":813,"title":814,"uses":815},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[771,772],{"path":817,"title":818,"uses":819},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[820],"fact",{"path":822,"title":823,"uses":824},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST, OpenAPI, GraphQL",[777,776],{"path":826,"title":827,"uses":828},"\u002Fdocs\u002Fserve\u002Fpages","Pages: queries and commands",[777,829],"facade",{"path":831,"title":832,"uses":833},"\u002Fdocs\u002Fserve\u002Fforms","A form",[782],{"path":835,"title":836,"uses":837},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[777],{"path":839,"title":840,"uses":841},"\u002Fdocs\u002Frun\u002Fdeploy","Deploy a split",[776,772],{"path":843,"title":844,"uses":845},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[776,772],{"path":847,"title":848,"uses":849},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[776],{"path":851,"title":852,"uses":853},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[776,777],{"path":855,"title":856,"uses":857},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[777],{"path":859,"title":860,"uses":861},"\u002Fdocs\u002Frun\u002Ftest","Test",[782,771],{"path":863,"title":864,"uses":865},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[772,776],{"path":867,"title":868,"uses":869},"\u002Fdocs\u002Fadopt\u002Fexisting-app","Add Fougere to an existing app",[772,776],{"path":871,"title":872,"uses":873},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[782],{"path":875,"title":876,"uses":877},"\u002Fdocs\u002Fadopt\u002Fhosts","Pick a host",[776],{"path":879,"title":880,"uses":881},"\u002Fdocs\u002Fadopt\u002Fanother-repository","A frond from another repository",[829,772],{"path":883,"title":884,"uses":885},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":887,"title":888,"uses":735},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":890,"title":891,"uses":735},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":893,"title":894,"uses":735},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":896,"title":897,"uses":735},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","The card and the wire",{"path":899,"title":900,"uses":735},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":902,"title":903,"uses":735},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":905,"title":906,"uses":735},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":908,"title":909,"uses":735},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":738,"title":8,"uses":735},{"path":912,"title":913,"uses":735},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":915,"title":916,"uses":735},"\u002Fdocs","What is Fougere",[918],{"title":919,"path":915,"stem":920,"children":921,"page":-1},"Docs","docs",[922,924,945,954,975,984,997,1014,1031],{"title":916,"path":915,"stem":923},"docs\u002Findex",{"title":925,"path":926,"stem":927,"children":928,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[929,931,933,935,937,939,941,943],{"title":745,"path":744,"stem":930},"docs\u002F1.concepts\u002F1.entity",{"title":748,"path":747,"stem":932},"docs\u002F1.concepts\u002F2.handler",{"title":751,"path":750,"stem":934},"docs\u002F1.concepts\u002F3.repository",{"title":754,"path":753,"stem":936},"docs\u002F1.concepts\u002F4.frond",{"title":757,"path":756,"stem":938},"docs\u002F1.concepts\u002F5.facade",{"title":760,"path":759,"stem":940},"docs\u002F1.concepts\u002F6.fact",{"title":763,"path":762,"stem":942},"docs\u002F1.concepts\u002F7.port",{"title":766,"path":765,"stem":944},"docs\u002F1.concepts\u002F8.configuration",{"title":946,"path":947,"stem":948,"children":949,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[950,952],{"title":769,"path":768,"stem":951},"docs\u002F2.access\u002F1.authentication",{"title":774,"path":699,"stem":953},"docs\u002F2.access\u002F2.state",{"title":955,"path":956,"stem":957,"children":958,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[959,961,963,965,967,969,971,973],{"title":780,"path":779,"stem":960},"docs\u002F3.data\u002F1.sql",{"title":785,"path":784,"stem":962},"docs\u002F3.data\u002F2.several-databases",{"title":789,"path":788,"stem":964},"docs\u002F3.data\u002F3.computed-field",{"title":793,"path":792,"stem":966},"docs\u002F3.data\u002F4.evolve",{"title":797,"path":796,"stem":968},"docs\u002F3.data\u002F5.seeds",{"title":801,"path":800,"stem":970},"docs\u002F3.data\u002F6.values",{"title":805,"path":804,"stem":972},"docs\u002F3.data\u002F7.mirror",{"title":810,"path":809,"stem":974},"docs\u002F3.data\u002F8.together",{"title":976,"path":977,"stem":978,"children":979,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[980,982],{"title":814,"path":813,"stem":981},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":818,"path":817,"stem":983},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":985,"path":986,"stem":987,"children":988,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[989,991,993,995],{"title":823,"path":822,"stem":990},"docs\u002F5.serve\u002F1.rest-graphql",{"title":827,"path":826,"stem":992},"docs\u002F5.serve\u002F2.pages",{"title":832,"path":831,"stem":994},"docs\u002F5.serve\u002F3.forms",{"title":836,"path":835,"stem":996},"docs\u002F5.serve\u002F4.admin",{"title":998,"path":999,"stem":1000,"children":1001,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[1002,1004,1006,1008,1010,1012],{"title":840,"path":839,"stem":1003},"docs\u002F6.run\u002F1.deploy",{"title":844,"path":843,"stem":1005},"docs\u002F6.run\u002F2.secure",{"title":848,"path":847,"stem":1007},"docs\u002F6.run\u002F3.lifecycle",{"title":852,"path":851,"stem":1009},"docs\u002F6.run\u002F4.observe",{"title":856,"path":855,"stem":1011},"docs\u002F6.run\u002F5.dev-panel",{"title":860,"path":859,"stem":1013},"docs\u002F6.run\u002F6.test",{"title":1015,"path":1016,"stem":1017,"children":1018,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[1019,1021,1023,1025,1027,1029],{"title":864,"path":863,"stem":1020},"docs\u002F7.adopt\u002F1.new-project",{"title":868,"path":867,"stem":1022},"docs\u002F7.adopt\u002F2.existing-app",{"title":872,"path":871,"stem":1024},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":876,"path":875,"stem":1026},"docs\u002F7.adopt\u002F4.hosts",{"title":880,"path":879,"stem":1028},"docs\u002F7.adopt\u002F5.another-repository",{"title":884,"path":883,"stem":1030},"docs\u002F7.adopt\u002F6.demos",{"title":1032,"path":1033,"stem":1034,"children":1035,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[1036,1038,1040,1042,1044,1046,1048,1050,1052,1053],{"title":888,"path":887,"stem":1037},"docs\u002F8.extending\u002F1.scan",{"title":891,"path":890,"stem":1039},"docs\u002F8.extending\u002F10.without-compiler",{"title":894,"path":893,"stem":1041},"docs\u002F8.extending\u002F2.boot",{"title":897,"path":896,"stem":1043},"docs\u002F8.extending\u002F3.card-and-wire",{"title":900,"path":899,"stem":1045},"docs\u002F8.extending\u002F4.extension-points",{"title":903,"path":902,"stem":1047},"docs\u002F8.extending\u002F5.vocabulary",{"title":906,"path":905,"stem":1049},"docs\u002F8.extending\u002F6.extensions",{"title":909,"path":908,"stem":1051},"docs\u002F8.extending\u002F7.source-adapter",{"title":8,"path":738,"stem":740},{"title":913,"path":912,"stem":1054},"docs\u002F8.extending\u002F9.foreign-frond",1794396615366]